private void orderClasses(String className, Set<String> visited, List<String> order) { if (!visited.add(className)) { return; } ClassHolder cls = classSource.get(className); if (cls == null) { return; } if (cls.getParent() != null) { orderClasses(cls.getParent(), visited, order); } for (String iface : cls.getInterfaces()) { orderClasses(iface, visited, order); } order.add(className); }
private void writeClass(OutputStream stream, ClassHolder cls) throws IOException { DataOutput output = new DataOutputStream(stream); output.writeByte(cls.getLevel().ordinal()); output.writeInt(packModifiers(cls.getModifiers())); output.writeInt(cls.getParent() != null ? symbolTable.lookup(cls.getParent()) : -1); output.writeInt(cls.getOwnerName() != null ? symbolTable.lookup(cls.getOwnerName()) : -1); output.writeByte(cls.getInterfaces().size()); for (String iface : cls.getInterfaces()) { output.writeInt(symbolTable.lookup(iface)); } writeAnnotations(output, cls.getAnnotations()); output.writeShort(cls.getFields().size()); for (FieldHolder field : cls.getFields()) { writeField(output, field); } output.writeShort(cls.getMethods().size()); for (MethodHolder method : cls.getMethods()) { writeMethod(stream, method); } }
public ClassNode decompile(ClassHolder cls) { ClassNode clsNode = new ClassNode(cls.getName(), cls.getParent()); for (FieldHolder field : cls.getFields()) { FieldNode fieldNode = new FieldNode(field.getReference(), field.getType()); fieldNode.getModifiers().addAll(field.getModifiers()); fieldNode.setInitialValue(field.getInitialValue()); clsNode.getFields().add(fieldNode); } for (MethodHolder method : cls.getMethods()) { if (method.getModifiers().contains(ElementModifier.ABSTRACT)) { continue; } if ((!isBootstrap() && method.getAnnotations().get(InjectedBy.class.getName()) != null) || methodsToSkip.contains(method.getReference())) { continue; } MethodNode methodNode = decompile(method); clsNode.getMethods().add(methodNode); } clsNode.getInterfaces().addAll(cls.getInterfaces()); clsNode.getModifiers().addAll(cls.getModifiers()); clsNode.setAccessLevel(cls.getLevel()); return clsNode; }
renamedCls.getModifiers().addAll(cls.getModifiers()); renamedCls.setLevel(cls.getLevel()); String parent = cls.getParent(); AnnotationHolder superclassAnnot = cls.getAnnotations().get(Superclass.class.getName()); if (superclassAnnot != null) { if (renamedCls.getName().equals(renamedCls.getParent())) { renamedCls.setParent(null);
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; }
invokeSuper.setMethod(new MethodReference(proxyClass.getParent(), "<init>", ValueType.VOID)); invokeSuper.setType(InvocationType.SPECIAL); ctorBlock.add(invokeSuper);
if (processor.isFunctor(cls.getParent()) != null) { functorMethod = null;
private void orderClasses(String className, Set<String> visited, List<String> order) { if (!visited.add(className)) { return; } ClassHolder cls = classSource.get(className); if (cls == null) { return; } if (cls.getParent() != null) { orderClasses(cls.getParent(), visited, order); } for (String iface : cls.getInterfaces()) { orderClasses(iface, visited, order); } order.add(className); }
private void writeClass(OutputStream stream, ClassHolder cls) throws IOException { DataOutput output = new DataOutputStream(stream); output.writeByte(cls.getLevel().ordinal()); output.writeInt(packModifiers(cls.getModifiers())); output.writeInt(cls.getParent() != null ? symbolTable.lookup(cls.getParent()) : -1); output.writeInt(cls.getOwnerName() != null ? symbolTable.lookup(cls.getOwnerName()) : -1); output.writeByte(cls.getInterfaces().size()); for (String iface : cls.getInterfaces()) { output.writeInt(symbolTable.lookup(iface)); } writeAnnotations(output, cls.getAnnotations()); output.writeShort(cls.getFields().size()); for (FieldHolder field : cls.getFields()) { writeField(output, field); } output.writeShort(cls.getMethods().size()); for (MethodHolder method : cls.getMethods()) { writeMethod(stream, method); } }
public ClassNode decompile(ClassHolder cls) { ClassNode clsNode = new ClassNode(cls.getName(), cls.getParent()); for (FieldHolder field : cls.getFields()) { FieldNode fieldNode = new FieldNode(field.getName(), field.getType()); fieldNode.getModifiers().addAll(field.getModifiers()); fieldNode.setInitialValue(field.getInitialValue()); clsNode.getFields().add(fieldNode); } for (MethodHolder method : cls.getMethods()) { if (method.getModifiers().contains(ElementModifier.ABSTRACT)) { continue; } if (method.getAnnotations().get(InjectedBy.class.getName()) != null || methodsToSkip.contains(method.getReference())) { continue; } MethodNode methodNode = decompile(method); clsNode.getMethods().add(methodNode); } clsNode.getInterfaces().addAll(cls.getInterfaces()); clsNode.getModifiers().addAll(cls.getModifiers()); return clsNode; }
renamedCls.getModifiers().addAll(cls.getModifiers()); renamedCls.setLevel(cls.getLevel()); String parent = cls.getParent(); AnnotationHolder superclassAnnot = cls.getAnnotations().get(Superclass.class.getName()); if (superclassAnnot != null) { if (renamedCls.getName().equals(renamedCls.getParent())) { renamedCls.setParent(null);
invokeSuper.setMethod(new MethodReference(proxyClass.getParent(), "<init>", ValueType.VOID)); invokeSuper.setType(InvocationType.SPECIAL); ctorBlock.add(invokeSuper);
if (processor.isFunctor(cls.getParent()) != null) { functorMethod = null;