static void box(final Type type, ListIterator<AbstractInsnNode> instructions) { if (type.getSort() == OBJECT || type.getSort() == ARRAY) { return; } if (Type.VOID_TYPE.equals(type)) { instructions.add(new InsnNode(Opcodes.ACONST_NULL)); } else { Type boxed = getBoxedType(type); instructions.add(new TypeInsnNode(Opcodes.NEW, boxed.getInternalName())); if (type.getSize() == 2) { // Pp -> Ppo -> oPpo -> ooPpo -> ooPp -> o instructions.add(new InsnNode(Opcodes.DUP_X2)); instructions.add(new InsnNode(Opcodes.DUP_X2)); instructions.add(new InsnNode(Opcodes.POP)); } else { // p -> po -> opo -> oop -> o instructions.add(new InsnNode(Opcodes.DUP_X1)); instructions.add(new InsnNode(Opcodes.SWAP)); } instructions.add(new MethodInsnNode(Opcodes.INVOKESPECIAL, boxed.getInternalName(), "<init>", "(" + type.getDescriptor() + ")V", false)); } }
public void writePushNewObject(Class clazz) { code.add(new TypeInsnNode(NEW, Type.getInternalName(clazz))); stackPush(Memory.Type.REFERENCE); writePushDup(); writeSysCall(clazz, INVOKESPECIAL, Constants.INIT_METHOD, void.class); stackPop(); }
instructions.add(new TypeInsnNode(Opcodes.ANEWARRAY, "java/lang/Object")); instructions.add(new TypeInsnNode(Opcodes.CHECKCAST, remappedType)); break; case VOID: break; case Type.LONG: instructions.add(new TypeInsnNode(Opcodes.CHECKCAST, Type.getInternalName(Long.class))); instructions.add(new MethodInsnNode(Opcodes.INVOKEVIRTUAL, Type.getInternalName(Long.class), "longValue", Type.getMethodDescriptor(Type.LONG_TYPE), false)); break; case Type.FLOAT: instructions.add(new TypeInsnNode(Opcodes.CHECKCAST, Type.getInternalName(Float.class))); instructions.add(new MethodInsnNode(Opcodes.INVOKEVIRTUAL, Type.getInternalName(Float.class), "floatValue", Type.getMethodDescriptor(Type.FLOAT_TYPE), false)); break; case Type.DOUBLE: instructions.add(new TypeInsnNode(Opcodes.CHECKCAST, Type.getInternalName(Double.class))); instructions.add(new MethodInsnNode(Opcodes.INVOKEVIRTUAL, Type.getInternalName(Double.class), "doubleValue", Type.getMethodDescriptor(Type.DOUBLE_TYPE), false)); break; case Type.BOOLEAN: instructions.add(new TypeInsnNode(Opcodes.CHECKCAST, Type.getInternalName(Boolean.class))); instructions.add(new MethodInsnNode(Opcodes.INVOKEVIRTUAL, Type.getInternalName(Boolean.class), "booleanValue", Type.getMethodDescriptor(Type.BOOLEAN_TYPE), false)); break; case Type.INT: instructions.add(new TypeInsnNode(Opcodes.CHECKCAST, Type.getInternalName(Integer.class))); instructions.add(new MethodInsnNode(Opcodes.INVOKEVIRTUAL, Type.getInternalName(Integer.class), "intValue", Type.getMethodDescriptor(Type.INT_TYPE), false)); break; case Type.SHORT: instructions.add(new TypeInsnNode(Opcodes.CHECKCAST, Type.getInternalName(Short.class)));
public void writePushNewObject(String internalName, Class... paramClasses) { code.add(new TypeInsnNode(NEW, internalName)); stackPush(Memory.Type.REFERENCE); writePushDup(); writeSysCall(internalName, INVOKESPECIAL, Constants.INIT_METHOD, void.class, paramClasses); stackPop(); }
public void writePushParameters(Collection<Memory> memories) { writePushSmallInt(memories.size()); code.add(new TypeInsnNode(ANEWARRAY, Type.getInternalName(Memory.class))); stackPop(); stackPush(Memory.Type.REFERENCE); int i = 0; for (Memory param : memories) { writePushDup(); writePushSmallInt(i); writePushMemory(param); writePopBoxing(true, false); code.add(new InsnNode(AASTORE)); stackPop(); stackPop(); stackPop(); i++; } }
code.add(new TypeInsnNode(ANEWARRAY, Type.getInternalName(Memory.class))); stackPop(); stackPush(Memory.Type.REFERENCE);
protected void writePushUses(Collection<ArgumentStmtToken> parameters){ if (parameters.isEmpty()){ add(new InsnNode(ACONST_NULL)); expr.stackPush(Memory.Type.REFERENCE); return; } expr.writePushSmallInt(parameters.size()); add(new TypeInsnNode(ANEWARRAY, Type.getInternalName(Memory.class))); expr.stackPop(); expr.stackPush(Memory.Type.REFERENCE); int i = 0; for(ArgumentStmtToken param : parameters){ expr.writePushDup(); expr.writePushSmallInt(i); LocalVariable local = method.getLocalVariable(param.getName().getName()); if (local == null) expr.writePushNull(); else expr.writeVarLoad(local); if (!param.isReference()) expr.writePopBoxing(true); add(new InsnNode(AASTORE)); expr.stackPop(); expr.stackPop(); expr.stackPop(); i++; } }
node.instructions.add(new TypeInsnNode(ANEWARRAY, Type.getInternalName(TraceInfo.class))); expressionCompiler.stackPush(Memory.Type.REFERENCE); node.instructions.add(new TypeInsnNode(ANEWARRAY, Type.getInternalName(Memory.class))); expressionCompiler.stackPush(Memory.Type.REFERENCE); node.instructions.add(new TypeInsnNode(ANEWARRAY, Type.getInternalName(Memory[].class))); expressionCompiler.stackPush(Memory.Type.REFERENCE);
); } else { add(new TypeInsnNode(NEW, entity.getInternalName())); expr.stackPush(Memory.Type.REFERENCE); expr.writePushDup();
code.add(new TypeInsnNode(ANEWARRAY, Type.getInternalName(Memory.class))); stackPop(); stackPush(Memory.Type.REFERENCE);
return; } else if (memory instanceof ReferenceMemory) { code.add(new TypeInsnNode(NEW, Type.getInternalName(ReferenceMemory.class))); code.add(new InsnNode(DUP)); code.add(new MethodInsnNode(INVOKESPECIAL, Type.getInternalName(ReferenceMemory.class), Constants.INIT_METHOD, "()V", false));
expr.makeUnknown(new TypeInsnNode(NEW, entity.getGeneratorEntity().getInternalName())); expr.stackPush(Memory.Type.REFERENCE); expr.writePushDup();
@Override public AbstractInsnNode clone(final Map<LabelNode, LabelNode> labels) { return new TypeInsnNode(opcode, desc).cloneAnnotations(this); } }
@Override public void visitTypeInsn(int arg0, String arg1) { super.visitTypeInsn(arg0, arg1); appendToBacklog(new TypeInsnNode(arg0, arg1)); }
public CodeBlock newobj(final String desc) { instructionList.add(new TypeInsnNode(NEW, desc)); return this; }
public CodeBlock checkcast(final String typeDesc) { instructionList.add(new TypeInsnNode(CHECKCAST, typeDesc)); return this; }
public CodeBlock visitTypeInsn(final int opcode, final String desc) { instructionList.add(new TypeInsnNode(opcode, desc)); return this; }
private void generateStoreNewProxyMatcher() { String proxyMatcherType = Types.PROXY_MATCHER.getInternalName(); // stack: insert(new TypeInsnNode(NEW, proxyMatcherType)); // stack: <proxyMatcher> insert(new InsnNode(DUP)); // stack: <proxyMatcher> :: <proxyMatcher> insert(new MethodInsnNode(INVOKESPECIAL, proxyMatcherType, "<init>", "()V", false)); // stack: <proxyMatcher> generateStoreInCache(); // stack: <proxyMatcher> }
public void unbox(PrimitiveType primitiveType, Object... comment) { String boxedClassIdentifier = primitiveType.getBoxedType().getClassIdentifier(); addInstruction(new TypeInsnNode(CHECKCAST, boxedClassIdentifier), addComment(comment, "unboxing", primitiveType)); addInstruction(new MethodInsnNode( INVOKEVIRTUAL, boxedClassIdentifier, primitiveType.getName()+"Value", "()"+primitiveType.getClassIdentifier()), addComment(comment, "unboxing", primitiveType)); }
private void addGetCallback(InsnList insnList) { insnList.add(new TypeInsnNode(NEW, p(Blackcat.class))); insnList.add(new InsnNode(DUP)); insnList.add(new MethodInsnNode(INVOKESPECIAL, p(Blackcat.class), "<init>", sig(void.class), false)); catVarIndex = getFistAvailablePosition(); insnList.add(new VarInsnNode(ASTORE, catVarIndex)); methodNode.maxLocals++; }