private ClassHolder readClass(InputStream stream, String name) throws IOException { DataInput input = new DataInputStream(stream); ClassHolder cls = new ClassHolder(name); cls.setLevel(accessLevels[input.readByte()]); cls.getModifiers().addAll(unpackModifiers(input.readInt())); int parentIndex = input.readInt(); cls.setParent(parentIndex >= 0 ? symbolTable.at(parentIndex) : null); int ownerIndex = input.readInt(); cls.setOwnerName(ownerIndex >= 0 ? symbolTable.at(ownerIndex) : null); int ifaceCount = input.readByte(); for (int i = 0; i < ifaceCount; ++i) { cls.getInterfaces().add(symbolTable.at(input.readInt())); } readAnnotations(input, cls.getAnnotations()); int fieldCount = input.readShort(); for (int i = 0; i < fieldCount; ++i) { cls.addField(readField(input)); } int methodCount = input.readShort(); for (int i = 0; i < methodCount; ++i) { cls.addMethod(readMethod(stream)); } return cls; }
private void addFunctorField(ClassHolder cls, MethodReference method) { if (cls.getAnnotations().get(FunctorImpl.class.getName()) != null) { return; } FieldHolder field = new FieldHolder("$$jso_functor$$"); field.setLevel(AccessLevel.PUBLIC); field.setType(ValueType.parse(JSObject.class)); cls.addField(field); AnnotationHolder annot = new AnnotationHolder(FunctorImpl.class.getName()); annot.getValues().put("value", new AnnotationValue(method.getDescriptor().toString())); cls.getAnnotations().add(annot); }
private void substitute(ClassHolder cls, ClassHierarchy hierarchy) { ClassReader subst = hierarchy.getClassSource().get(TeaVMLoggerFactorySubstitution.class.getName()); for (FieldHolder field : cls.getFields().toArray(new FieldHolder[0])) { cls.removeField(field); } for (MethodHolder method : cls.getMethods().toArray(new MethodHolder[0])) { cls.removeMethod(method); } for (FieldReader field : subst.getFields()) { cls.addField(ModelUtils.copyField(field)); } for (MethodReader method : subst.getMethods()) { cls.addMethod(ModelUtils.copyMethod(method)); } } }
FieldNode fieldNode = (FieldNode) obj; FieldHolder field = parseField(fieldNode); cls.addField(field); field.updateReference(referenceCache);
public static ClassHolder copyClass(ClassReader original, ClassHolder target, boolean withPrograms) { target.setLevel(original.getLevel()); target.getModifiers().addAll(original.readModifiers()); target.setParent(original.getParent()); target.getInterfaces().addAll(original.getInterfaces()); for (MethodReader method : original.getMethods()) { target.addMethod(copyMethod(method, withPrograms)); } for (FieldReader field : original.getFields()) { target.addField(copyField(field)); } target.setOwnerName(original.getOwnerName()); copyAnnotations(original.getAnnotations(), target.getAnnotations()); return target; }
renamedCls.addField(rename(field));
private Variable createVariable(ValueImpl<?> value, CallLocation location) { if (value.context == this) { return value.innerValue; } Variable outerVar = getParent().emitVariable(value, location); CapturedValue capturedValue = capturedValueMap.computeIfAbsent(outerVar, v -> { FieldHolder field = new FieldHolder("proxyCapture" + suffixGenerator++); field.setLevel(AccessLevel.PUBLIC); field.setType(value.type); proxyClass.addField(field); CapturedValue result = new CapturedValue(field, v); capturedValues.add(result); return result; }); Program program = startBlock.getProgram(); Variable var = program.createVariable(); GetFieldInstruction insn = new GetFieldInstruction(); insn.setInstance(program.variableAt(0)); insn.setField(capturedValue.field.getReference()); insn.setFieldType(capturedValue.field.getType()); insn.setReceiver(var); startBlock.add(insn); return var; }
private MethodHolder createConstructor(ClassHierarchy hierarchy, ClassHolder implementor, ValueType[] types, TextLocation location) { ValueType[] signature = Arrays.copyOf(types, types.length + 1); signature[types.length] = ValueType.VOID; MethodHolder ctor = new MethodHolder("<init>", signature); ctor.setLevel(AccessLevel.PUBLIC); ProgramEmitter pe = ProgramEmitter.create(ctor, hierarchy); pe.setCurrentLocation(location); ValueEmitter thisVar = pe.var(0, implementor); thisVar.invokeSpecial(implementor.getParent(), "<init>"); for (int i = 0; i < types.length; ++i) { FieldHolder field = new FieldHolder("_" + i); field.setLevel(AccessLevel.PRIVATE); field.setType(types[i]); implementor.addField(field); thisVar.setField(field.getName(), pe.var(i + 1, types[i])); } pe.exit(); implementor.addMethod(ctor); return ctor; }
field.setLevel(AccessLevel.PRIVATE); field.getModifiers().add(ElementModifier.STATIC); cls.addField(field);
field.setType(methodDecl.getResultType()); field.setLevel(AccessLevel.PRIVATE); implementor.addField(field);
private ClassHolder readClass(InputStream stream, String name) throws IOException { DataInput input = new DataInputStream(stream); ClassHolder cls = new ClassHolder(name); cls.setLevel(accessLevels[input.readByte()]); cls.getModifiers().addAll(unpackModifiers(input.readInt())); int parentIndex = input.readInt(); cls.setParent(parentIndex >= 0 ? symbolTable.at(parentIndex) : null); int ownerIndex = input.readInt(); cls.setOwnerName(ownerIndex >= 0 ? symbolTable.at(ownerIndex) : null); int ifaceCount = input.readByte(); for (int i = 0; i < ifaceCount; ++i) { cls.getInterfaces().add(symbolTable.at(input.readInt())); } readAnnotations(input, cls.getAnnotations()); int fieldCount = input.readShort(); for (int i = 0; i < fieldCount; ++i) { cls.addField(readField(input)); } int methodCount = input.readShort(); for (int i = 0; i < methodCount; ++i) { cls.addMethod(readMethod(stream)); } return cls; }
cls.addField(parseField(fieldNode));
private void addFunctorField(ClassHolder cls, MethodReference method) { if (cls.getAnnotations().get(FunctorImpl.class.getName()) != null) { return; } FieldHolder field = new FieldHolder("$$jso_functor$$"); field.setLevel(AccessLevel.PUBLIC); field.setType(ValueType.parse(JSObject.class)); cls.addField(field); AnnotationHolder annot = new AnnotationHolder(FunctorImpl.class.getName()); annot.getValues().put("value", new AnnotationValue(method.getDescriptor().toString())); cls.getAnnotations().add(annot); }
private void replaceClass(final ClassHolder cls, final ClassReader emuCls) { ClassRefsRenamer renamer = new ClassRefsRenamer(preimage -> preimage.equals(emuCls.getName()) ? cls.getName() : preimage); for (FieldHolder field : cls.getFields().toArray(new FieldHolder[0])) { cls.removeField(field); } for (MethodHolder method : cls.getMethods().toArray(new MethodHolder[0])) { cls.removeMethod(method); } for (FieldReader field : emuCls.getFields()) { cls.addField(ModelUtils.copyField(field)); } for (MethodReader method : emuCls.getMethods()) { cls.addMethod(renamer.rename(ModelUtils.copyMethod(method))); } } }
renamedCls.addField(ModelUtils.copyField(field));
private Variable createVariable(ValueImpl<?> value, CallLocation location) { if (value.context == this) { return value.innerValue; } Variable outerVar = getParent().emitVariable(value, location); CapturedValue capturedValue = capturedValueMap.computeIfAbsent(outerVar, v -> { FieldHolder field = new FieldHolder("proxyCapture" + suffixGenerator++); field.setLevel(AccessLevel.PUBLIC); field.setType(value.type); proxyClass.addField(field); CapturedValue result = new CapturedValue(field, v); capturedValues.add(result); return result; }); Program program = startBlock.getProgram(); Variable var = program.createVariable(); GetFieldInstruction insn = new GetFieldInstruction(); insn.setInstance(program.variableAt(0)); insn.setField(capturedValue.field.getReference()); insn.setFieldType(capturedValue.field.getType()); insn.setReceiver(var); startBlock.add(insn); return var; }
public static ClassHolder copyClass(ClassReader original) { ClassHolder copy = new ClassHolder(original.getName()); copy.setLevel(original.getLevel()); copy.getModifiers().addAll(original.readModifiers()); copy.setParent(original.getParent()); copy.getInterfaces().addAll(original.getInterfaces()); for (MethodReader method : original.getMethods()) { copy.addMethod(copyMethod(method)); } for (FieldReader field : original.getFields()) { copy.addField(copyField(field)); } copy.setOwnerName(original.getOwnerName()); copyAnnotations(original.getAnnotations(), copy.getAnnotations()); return copy; }
field.setLevel(AccessLevel.PRIVATE); field.getModifiers().add(ElementModifier.STATIC); cls.addField(field);