public static void compileToArray(Expression[] args, Compilation comp) { CodeAttr code = comp.getCode(); if (args.length == 0) { code.emitGetStatic(Compilation.noArgsField); return; } code.emitPushInt(args.length); code.emitNewArray(Type.pointer_type); for (int i = 0; i < args.length; ++i) { Expression arg = args[i]; if (comp.usingCPStyle() && !(arg instanceof QuoteExp) && !(arg instanceof ReferenceExp)) { // If the argument involves a CPStyle function call, we will // have to save and restore anything on the JVM stack into // fields in the CallFrame. This is expensive, so defer // pushing the duplicated argument array and the index // until *after* we've calculated the argument. The downside // is that we have to do some extra stack operations. // However, these are cheap (and get compiled away when // compiling to native code). arg.compileWithPosition(comp, Target.pushObject); code.emitSwap(); code.emitDup(1, 1); code.emitSwap(); code.emitPushInt(i); code.emitSwap(); } else { code.emitDup(Compilation.objArrayType); code.emitPushInt(i); arg.compileWithPosition(comp, Target.pushObject); } code.emitArrayStore(Type.pointer_type); } }
public void emitTestIf(Variable incoming, Declaration decl, Compilation comp) { CodeAttr code = comp.getCode(); if (incoming != null) code.emitLoad(incoming); if (decl != null) { code.emitDup(); decl.compileStore(comp); } comp.compileConstant(this); code.emitSwap(); code.emitInvokeVirtual(isInstanceMethod); code.emitIfIntNotZero(); }