private static void setupClassStates(ExecutionContext context, VirtualMachine vm, Map<String, Map<String, HeapItem>> classNameToFieldDescriptorToItem) { ClassManager classManager = vm.getClassManager(); for (Entry<String, Map<String, HeapItem>> entry : classNameToFieldDescriptorToItem.entrySet()) { String className = entry.getKey(); VirtualClass virtualClass = classManager.getVirtualClass(className); Map<String, HeapItem> fieldDescriptorToItem = entry.getValue(); ClassState cState = context.peekClassState(virtualClass); for (Entry<String, HeapItem> fieldNameAndTypeToItem : fieldDescriptorToItem.entrySet()) { String fieldNameAndType = fieldNameAndTypeToItem.getKey(); String fieldName = fieldNameAndType.split(":")[0]; VirtualField field = virtualClass.getField(fieldName); HeapItem item = fieldNameAndTypeToItem.getValue(); cState.pokeField(field, item); } context.initializeClass(cState, SideEffect.Level.NONE); } }
public ClassState peekClassState(VirtualType virtualClass) { ExecutionContext ancestor = getAncestorWithClass(virtualClass); if (ancestor == null) { // VirtualClass has not been initialized; build template and cache it locally to track initialization state ClassState templateClassState = TemplateStateFactory.forClass(this, virtualClass); setClassState(templateClassState); return templateClassState; } else if (ancestor != this) { ClassState ancestorClassState = ancestor.peekClassState(virtualClass); ClassState cState = ancestorClassState.getChild(this); SideEffect.Level level = ancestor.getClassSideEffectLevel(virtualClass); // Must initialize, because the ancestor probably just has the template class state. initializeClass(cState, level); return cState; } return classToStatus.get(virtualClass).getClassState(); }
initializeClass(cState, SideEffect.Level.NONE); return; initContext.initializeClass(cState, SideEffect.Level.NONE);
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); } }
callerContext.initializeClass(cState, level);