private boolean isSystemClass(ClassHolder cls) { switch (cls.getName()) { case "java.lang.Object": case "java.lang.Class": case "java.lang.String": return true; default: return false; } }
@Override public String getOwnerName() { return owner != null ? owner.getName() : null; }
@Override public String getOwnerName() { return owner != null ? owner.getName() : null; }
public void putClassHolder(ClassHolder classHolder) { classes.put(classHolder.getName(), classHolder); } }
@Override public MethodReference getReference() { if (owner == null) { return null; } if (reference == null) { reference = new MethodReference(owner.getName(), descriptor); } return reference; }
@Override public void transformClass(ClassHolder cls, ClassHolderTransformerContext context) { if (cls.getName().equals("java.lang.Thread")) { installThreadMethods(cls); } }
@Override public void transformClass(ClassHolder cls, ClassHolderTransformerContext context) { if (!cls.getName().equals(LoggerFactory.class.getName())) { return; } substitute(cls, context.getHierarchy()); }
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) { if (!cls.getName().equals("java.lang.Class")) { return; } for (MethodHolder method : cls.getMethods()) { patchProgram(method.getProgram()); } }
@Override public void transformClass(ClassHolder cls, ClassHolderTransformerContext context) { switch (cls.getName()) { case "scala.util.PropertiesTrait$class": transformPropertiesTrait(cls, context.getHierarchy()); break; case "scala.util.Properties$": transformProperties(cls); break; } }
public void addMethod(MethodHolder method) { if (method.getOwner() != null) { throw new IllegalArgumentException("Method " + method.getDescriptor() + " is already in another class (" + method.getOwner().getName() + ")"); } method.setOwner(this); MethodHolder oldMethod = methods.put(method.getDescriptor(), method); if (oldMethod != null) { oldMethod.setOwner(null); } }
public void addField(FieldHolder field) { if (field.getOwner() != null) { throw new IllegalArgumentException("Field " + field.getName() + " is already " + "in another class (" + field.getOwner().getName() + ")"); } field.setOwner(this); FieldHolder oldField = fields.put(field.getName(), field); if (oldField != null) { oldField.setOwner(null); } }
@Override public void transformClass(ClassHolder cls, ClassHolderTransformerContext context) { switch (cls.getName()) { case "java.lang.Integer": transformInteger(cls); break; case "java.lang.Long": transformLong(cls); break; case "java.lang.Float": transformFloat(cls); break; case "java.lang.Double": transformDouble(cls); 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); } } } } } }
private void generateForwardClassStructure(ClassHolder cls) { if (isSystemClass(cls)) { return; } forwardDeclarationsWriter.print("struct ").print(context.getNames().forClass(cls.getName())).println(";"); }
@Override public void transformClass(ClassHolder cls, ClassHolderTransformerContext context) { if (cls.getName().equals(TestEntryPoint.class.getName())) { for (MethodHolder method : cls.getMethods()) { switch (method.getName()) { case "launchTest": method.setProgram(generateLaunchProgram(method, context.getHierarchy())); method.getModifiers().remove(ElementModifier.NATIVE); break; case "before": method.setProgram(generateBeforeProgram(method, context.getHierarchy())); method.getModifiers().remove(ElementModifier.NATIVE); break; case "after": method.setProgram(generateAfterProgram(method, context.getHierarchy())); method.getModifiers().remove(ElementModifier.NATIVE); break; } } } }
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; }
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); } } }