void makeSync(ClassHolder cls) { Set<MethodDescriptor> methods = new HashSet<>(); findInheritedMethods(cls, methods, new HashSet<>()); for (MethodHolder method : cls.getMethods()) { if (methods.contains(method.getDescriptor())) { makeSync(method); } } }
@Override public void transformClass(ClassHolder cls, ClassHolderTransformerContext context) { if (!cls.getName().equals("java.lang.Class")) { return; } for (MethodHolder method : cls.getMethods()) { patchProgram(method.getProgram()); } }
public void processClass(ClassHolder cls) { for (MethodHolder method : cls.getMethods()) { if (reachableMethods.contains(method.getReference()) && method.getProgram() != null) { processMethod(method); } } }
@Override public void transformClass(ClassHolder cls, ClassHolderTransformerContext context) { for (MethodHolder method : cls.getMethods()) { AnnotationReader delegateAnnot = method.getAnnotations().get(DelegateTo.class.getName()); if (delegateAnnot != null) { method.setProgram(null); method.getModifiers().add(ElementModifier.NATIVE); } } } }
@Override public void transformClass(ClassHolder cls, ClassHolderTransformerContext context) { for (MethodHolder method : cls.getMethods()) { AnnotationReader delegateAnnot = method.getAnnotations().get(DelegateTo.class.getName()); if (delegateAnnot != null) { method.setProgram(null); method.getModifiers().add(ElementModifier.NATIVE); } } } }
@Override public void transformClass(ClassHolder cls, ClassHolderTransformerContext context) { for (MethodHolder method : cls.getMethods()) { if (method.getProgram() != null) { transformProgram(method.getProgram()); } } }
@Override public void transformClass(ClassHolder cls, ClassHolderTransformerContext context) { for (MethodHolder method : cls.getMethods()) { Program program = method.getProgram(); if (program != null) { transformProgram(program, context.getHierarchy()); } } }
private void transformPropertiesTrait(ClassHolder cls, ClassHierarchy hierarchy) { for (MethodHolder method : cls.getMethods()) { if (method.getName().equals("scalaProps")) { ProgramEmitter pe = ProgramEmitter.create(method, hierarchy); pe.construct(Properties.class).returnValue(); } } }
@Override public void transformClass(ClassHolder cls, ClassHolderTransformerContext context) { for (MethodHolder method : cls.getMethods()) { if (method.getAnnotations().get(JavaScriptBody.class.getName()) != null) { AnnotationHolder genAnnot = new AnnotationHolder(GeneratedBy.class.getName()); genAnnot.getValues().put("value", new AnnotationValue(ValueType.object( JavaScriptBodyGenerator.class.getName()))); method.getAnnotations().add(genAnnot); method.setProgram(null); method.getModifiers().add(ElementModifier.NATIVE); } } } }
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); } }
@Override public void transformClass(ClassHolder cls, ClassHolderTransformerContext context) { for (MethodHolder method : cls.getMethods()) { if (method.getProgram() != null) { transformProgram(context.getHierarchy(), method.getProgram()); } } }
@Override public void transformClass(ClassHolder cls, ClassHolderTransformerContext context) { for (MethodHolder method : cls.getMethods()) { Program program = method.getProgram(); if (program != null) { new ResourceProgramTransformer(context.getHierarchy(), program).transformProgram(); } } } }
private boolean tryDelegateToMethod(ClassHolder cls, MethodHolder method) { AnnotationHolder delegateToAnnot = method.getAnnotations().get(DelegateTo.class.getName()); if (delegateToAnnot == null) { return false; } String methodName = delegateToAnnot.getValue("value").getString(); for (MethodHolder candidate : cls.getMethods()) { if (candidate.getName().equals(methodName)) { generateMethodForwardDeclaration(method); delegateToMethod(method, candidate); return true; } } return false; }
private void optimize(ListableClassHolderSource classSource) { for (String className : classSource.getClassNames()) { ClassHolder cls = classSource.get(className); for (MethodHolder method : cls.getMethods()) { optimizeMethod(method); } reportCompileProgress(++compileProgressValue); if (wasCancelled()) { break; } } }
@Override public void transformClass(ClassHolder cls, ClassHolderTransformerContext context) { if (cls.getName().equals(ResourceAccessor.class.getName())) { ResourceAccessorInjector injector = new ResourceAccessorInjector(); for (MethodHolder method : cls.getMethods()) { if (method.hasModifier(ElementModifier.NATIVE)) { if (method.getName().equals("keys")) { jsHost.add(method.getReference(), new ResourceAccessorGenerator()); } else { jsHost.add(method.getReference(), injector); } } } } } }
public void submit(ClassHolder cls) { if (innerSource.get(cls.getName()) != null || generatedClasses.containsKey(cls.getName())) { throw new IllegalArgumentException("Class " + cls.getName() + " is already defined"); } if (!transformers.isEmpty()) { for (ClassHolderTransformer transformer : transformers) { transformer.transformClass(cls, transformContext); } cls = ModelUtils.copyClass(cls); } generatedClasses.put(cls.getName(), cls); for (MethodHolder method : cls.getMethods()) { if (method.getProgram() != null && method.getProgram().basicBlockCount() > 0) { new UnreachableBasicBlockEliminator().optimize(method.getProgram()); } } cache.remove(cls.getName()); }
@Override public void transformClass(ClassHolder cls, ClassHolderTransformerContext context) { for (MethodHolder method : cls.getMethods()) { if (method.getProgram() != null) { transformProgram(method.getReference(), method.getProgram(), context.getHierarchy(), context.getDiagnostics()); } } }
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)); } } }
private void generateClassMethods(ClassHolder cls) { for (MethodHolder method : cls.getMethods()) { if (method.hasModifier(ElementModifier.ABSTRACT)) { continue; } if (method.hasModifier(ElementModifier.NATIVE)) { if (!tryDelegateToMethod(cls, method)) { tryUsingGenerator(method); } continue; } generateMethodForwardDeclaration(method); RegularMethodNode methodNode = decompiler.decompileRegular(method); codeGenerator.generateMethod(methodNode); } }
public void link(ClassHolder cls) { for (MethodHolder method : cls.getMethods().toArray(new MethodHolder[0])) { MethodReference methodRef = method.getReference(); MethodDependencyInfo methodDep = dependency.getMethod(methodRef); if (methodDep == null) { cls.removeMethod(method); } else if (!methodDep.isUsed()) { method.getModifiers().add(ElementModifier.ABSTRACT); method.setProgram(null); } else if (method.getProgram() != null) { link(method.getReference(), method.getProgram()); } } for (FieldHolder field : cls.getFields().toArray(new FieldHolder[0])) { FieldReference fieldRef = new FieldReference(cls.getName(), field.getName()); if (dependency.getField(fieldRef) == null) { cls.removeField(field); } } }