public HeapItem getFieldConsensus(int[] addresses, VirtualField field) { VirtualType virtualClass = field.getDefiningClass(); Set<HeapItem> items = new HashSet<>(); for (int address : addresses) { // If the class wasn't initialized in one path, it's unknown for (ExecutionNode node : getNodePile(address)) { if (!node.getContext().isClassInitialized(virtualClass)) { String type = field.getType(); return HeapItem.newUnknown(type); } } items.addAll(getFieldItems(address, field)); if (1 != items.size()) { // Since items is a set, size == 1 implies consensus if (log.isTraceEnabled()) { log.trace("No consensus for {}, returning Unknown.", field); } return HeapItem.newUnknown(field.getType()); } } return items.toArray(new HeapItem[items.size()])[0]; }
throw new ClassNotFoundException(); if (!context.isClassInitialized(virtualClass) && !className.equals("Lorg/cf/obfuscated/Reflection;")) { context.staticallyInitializeClassIfNecessary(virtualClass); level = context.getClassSideEffectLevel(virtualClass);
if (vm.isSafe(virtualClass) || isClassInitialized(virtualClass)) {
private void inheritClassStates(ExecutionContext parentContext, ExecutionContext childContext) { for (VirtualClass virtualClass : classManager.getLoadedClasses()) { if (!parentContext.isClassInitialized(virtualClass)) { continue; } ClassState fromClassState = parentContext.peekClassState(virtualClass); ClassState toClassState = fromClassState.getChild(childContext); for (VirtualField field : fromClassState.getVirtualClass().getFields()) { HeapItem item = fromClassState.peekField(field); // TODO: should update field here? toClassState.pokeField(field, item); } SideEffect.Level level = parentContext.getClassSideEffectLevel(virtualClass); childContext.initializeClass(toClassState, level); } }
boolean isInitializedInCaller = callerContext.isClassInitialized(virtualClass); hasOneInitialization: if (!isInitializedInCaller) { if (context.isClassInitialized(virtualClass)) { break hasOneInitialization;