(JiteClass jiteClass, CodeBlock block, Call instruction, HashMap<Label, LabelNode> jumpMap)
| 109 | } |
| 110 | |
| 111 | private void emitCall(JiteClass jiteClass, CodeBlock block, Call instruction, HashMap<Label, LabelNode> jumpMap) { |
| 112 | block.aload(EXECUTION_CONTEXT); |
| 113 | emitOperand(block, instruction.getIdentifier()); |
| 114 | // ref |
| 115 | block.dup(); |
| 116 | // ref ref |
| 117 | block.dup(); |
| 118 | // ref ref ref |
| 119 | block.aload(EXECUTION_CONTEXT); |
| 120 | // ref ref ref ec |
| 121 | block.swap(); |
| 122 | // ref ref ec ref |
| 123 | block.invokestatic(p(Types.class), "getValue", sig(Object.class, ExecutionContext.class, Object.class)); |
| 124 | // ref ref function |
| 125 | block.checkcast(p(JSFunction.class)); |
| 126 | // ref ref function |
| 127 | block.swap(); |
| 128 | // ref function ref |
| 129 | block.invokestatic(p(Interpreter.class), "getThis", sig(Object.class, Object.class)); |
| 130 | // ref function this |
| 131 | |
| 132 | Operand[] args = instruction.getArgs(); |
| 133 | block.bipush(args.length); |
| 134 | block.anewarray(p(Object.class)); |
| 135 | for (int i = 0; i < args.length; i++) { |
| 136 | block.dup(); |
| 137 | block.bipush(i); |
| 138 | Operand operand = args[i]; |
| 139 | emitOperand(block, operand); |
| 140 | block.arraystore(); |
| 141 | } |
| 142 | // ref function this args... |
| 143 | block.invokevirtual(p(ExecutionContext.class), "call", sig(Object.class, Object.class, JSFunction.class, Object.class, Object[].class)); |
| 144 | } |
| 145 | |
| 146 | private void emitSub(CodeBlock block, Sub instruction) { |
| 147 | emitOperand(block, instruction.getLHS()); |
no test coverage detected