Refine search
public void writePushSmallInt(int value) { switch (value) { case -1: code.add(new InsnNode(ICONST_M1)); break; case 0: code.add(new InsnNode(ICONST_0)); break; case 1: code.add(new InsnNode(ICONST_1)); break; case 2: code.add(new InsnNode(ICONST_2)); break; case 3: code.add(new InsnNode(ICONST_3)); break; case 4: code.add(new InsnNode(ICONST_4)); break; case 5: code.add(new InsnNode(ICONST_5)); break; default: code.add(new LdcInsnNode(value)); } stackPush(Memory.Type.INT); }
public void writePopAll(int count) { int i = 0; while (method.getStackCount() > 0 && i < count) { i++; StackItem o = stackPop(); ValueExprToken token = o.getToken(); StackItem.Type type = o.type; if (token == null) { switch (type.size()) { case 2: code.add(new InsnNode(POP2)); break; case 1: code.add(new InsnNode(POP)); break; default: throw new IllegalArgumentException("Invalid of size StackItem: " + type.size()); } } else/* if (o.isInvalidForOperations())*/ unexpectedToken(token); } }
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++; } }
public void writePopDouble() { switch (stackPeek().type) { case DOUBLE: break; case BYTE: case SHORT: case BOOL: case CHAR: case INT: { code.add(new InsnNode(I2D)); stackPop(); stackPush(Memory.Type.DOUBLE); } break; case LONG: { code.add(new InsnNode(L2D)); stackPop(); stackPush(Memory.Type.DOUBLE); } break; case STRING: { writeSysStaticCall(StringMemory.class, "toNumeric", Memory.class, String.class); writeSysDynamicCall(Memory.class, "toDouble", Double.TYPE); } break; default: { writeSysDynamicCall(Memory.class, "toDouble", Double.TYPE); } } }
public void writePushParameters(Collection<ExprStmtToken> parameters, boolean useConstants, Memory... additional) { if (parameters.isEmpty()) { code.add(new InsnNode(ACONST_NULL)); stackPush(Memory.Type.REFERENCE); return; code.add(new TypeInsnNode(ANEWARRAY, Type.getInternalName(Memory.class))); stackPop(); stackPush(Memory.Type.REFERENCE); writePopBoxing(); code.add(new InsnNode(AASTORE)); stackPop(); stackPop(); writePopBoxing(); code.add(new InsnNode(AASTORE)); stackPop(); stackPop();
node.instructions.add(new TypeInsnNode(ANEWARRAY, Type.getInternalName(TraceInfo.class))); expressionCompiler.stackPush(Memory.Type.REFERENCE); expressionCompiler.writePushCreateTraceInfo(traceInfo.getStartLine(), traceInfo.getStartPosition()); node.instructions.add(new InsnNode(AASTORE)); expressionCompiler.stackPop(); expressionCompiler.stackPop(); node.instructions.add(new TypeInsnNode(ANEWARRAY, Type.getInternalName(Memory.class))); expressionCompiler.stackPush(Memory.Type.REFERENCE); expressionCompiler.writePopBoxing(true, false); node.instructions.add(new InsnNode(AASTORE)); expressionCompiler.stackPop(); expressionCompiler.stackPop(); node.instructions.add(new TypeInsnNode(ANEWARRAY, Type.getInternalName(Memory[].class))); expressionCompiler.stackPush(Memory.Type.REFERENCE); node.instructions.add(new InsnNode(AASTORE)); expressionCompiler.stackPop(); expressionCompiler.stackPop(); node.instructions.add(new InsnNode(RETURN)); methodCompiler.writeFooter();
protected void writeInterfaceMethod(MethodEntity method) { MethodNode node = new MethodNodeImpl(); node.access = ACC_PUBLIC; node.name = method.getName(); node.desc = Type.getMethodDescriptor( Type.getType(Memory.class), Type.getType(Environment.class), Type.getType(Memory[].class) ); MethodStmtCompiler methodCompiler = new MethodStmtCompiler(this, node); ExpressionStmtCompiler expressionCompiler = new ExpressionStmtCompiler(methodCompiler, null); methodCompiler.writeHeader(); LabelNode l0 = writeLabel(node, statement.getMeta().getStartLine()); methodCompiler.addLocalVariable("~this", l0); methodCompiler.addLocalVariable("~env", l0); methodCompiler.addLocalVariable("~args", l0); expressionCompiler.writeVarLoad("~this"); expressionCompiler.writeVarLoad("~env"); expressionCompiler.writeVarLoad("~args"); String internalName = entity.findMethod(method.getLowerName()).getInternalName(); expressionCompiler.writeSysDynamicCall(null, internalName, Memory.class, Environment.class, Memory[].class); node.instructions.add(new InsnNode(ARETURN)); methodCompiler.writeFooter(); this.node.methods.add(node); }
code.add(new FieldInsnNode( GETSTATIC, Type.getInternalName(Memory.class), "UNDEFINED", Type.getDescriptor(Memory.class) )); } else if (memory instanceof NullMemory) { code.add(new FieldInsnNode( GETSTATIC, Type.getInternalName(Memory.class), "NULL", Type.getDescriptor(Memory.class) )); 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)); } else if (memory instanceof ArrayMemory) { ArrayMemory array = (ArrayMemory) memory; switch (memory.type) { case INT: { code.add(new LdcInsnNode(memory.toLong())); type = Memory.Type.INT; code.add(new LdcInsnNode(memory.toDouble())); type = Memory.Type.DOUBLE; code.add(new LdcInsnNode(memory.toString())); type = Memory.Type.STRING;