public void updateReference(ReferenceCache cache) { FieldReference reference = getReference(); if (reference != null) { this.reference = cache.getCached(reference); } } }
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; }
pe.when(pe.getField(field.getReference(), field.getType()).isNull()) .thenDo(() -> pe.setField(field.getReference(), pe.invoke(createMethod.getReference().getClassName(), createMethod.getReference().getName(), createMethod.getResultType()))); pe.getField(field.getReference(), field.getType()) .returnValue();
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; }
for (FieldHolder field : cls.getFields()) { if (field.hasModifier(ElementModifier.STATIC)) { String fieldName = context.getNames().forStaticField(field.getReference()); fieldsWriter.print("static ").printStrictType(field.getType()).print(" ").print(fieldName) .println(";"); if (isReferenceType(field.getType())) { staticFields[staticIndex++] = field.getReference(); staticFieldInitWriter.println(";"); } else { String fieldName = context.getNames().forMemberField(field.getReference()); structWriter.printStrictType(field.getType()).print(" ").print(fieldName).println(";"); if (isReferenceType(field.getType())) { instanceFields[instanceIndex++] = field.getReference();
putInsn.setField(capturedValues.get(i).field.getReference()); putInsn.setFieldType(capturedValues.get(i).field.getType()); putInsn.setValue(ctorProgram.createVariable());
pe.when(pe.getField(field.getReference(), field.getType()).isNull()) .thenDo(() -> pe.setField(field.getReference(), pe.invoke(createMethod.getReference().getClassName(), createMethod.getReference().getName(), createMethod.getResultType()))); pe.getField(field.getReference(), field.getType()) .returnValue();
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; }
putInsn.setField(capturedValues.get(i).field.getReference()); putInsn.setFieldType(capturedValues.get(i).field.getType()); putInsn.setValue(ctorProgram.createVariable());