示例#1
0
 @Override
 public void setVirtualEntry(State objectState, int index, ValueNode value) {
   ObjectState obj = (ObjectState) objectState;
   assert obj != null && obj.isVirtual() : "not virtual: " + obj;
   ObjectState valueState = state.getObjectState(value);
   ValueNode newValue = value;
   if (valueState == null) {
     newValue = getReplacedValue(value);
     assert obj.getEntry(index) == null
         || obj.getEntry(index).kind() == newValue.kind()
         || (isObjectEntry(obj.getEntry(index)) && isObjectEntry(newValue));
   } else {
     if (valueState.getState() != EscapeState.Virtual) {
       newValue = valueState.getMaterializedValue();
       assert newValue.kind() == Kind.Object;
     } else {
       newValue = valueState.getVirtualObject();
     }
     assert obj.getEntry(index) == null || isObjectEntry(obj.getEntry(index));
   }
   obj.setEntry(index, newValue);
 }
示例#2
0
 /**
  * Process a node as part of this search.
  *
  * @param node the next node encountered in the search
  * @param worklist if non-null, {@code node} will be added to this list. Otherwise, {@code node}
  *     is treated as a candidate result.
  * @return true if the search should continue, false if a definitive {@link #result} has been
  *     found
  */
 private boolean process(ValueNode node, NodeWorkList worklist) {
   if (node.isAlive()) {
     if (worklist == null) {
       if (result == null) {
         // Initial candidate result: continue search
         result = node;
       } else if (result != node) {
         // Conflicts with existing candidate: stop search with null result
         result = null;
         return false;
       }
     } else {
       worklist.add(node);
     }
   }
   return true;
 }
示例#3
0
 public OriginalValueSearch(ValueNode proxy) {
   NodeWorkList worklist = proxy.graph().createNodeWorkList();
   worklist.add(proxy);
   for (Node node : worklist) {
     if (node instanceof LimitedValueProxy) {
       ValueNode originalValue = ((LimitedValueProxy) node).getOriginalNode();
       if (!process(originalValue, worklist)) {
         return;
       }
     } else if (node instanceof PhiNode) {
       for (Node value : ((PhiNode) node).values()) {
         if (!process((ValueNode) value, worklist)) {
           return;
         }
       }
     } else {
       if (!process((ValueNode) node, null)) {
         return;
       }
     }
   }
 }
示例#4
0
 private static boolean isObjectEntry(ValueNode value) {
   return value.kind() == Kind.Object || value instanceof VirtualObjectNode;
 }