public CodeBlock jsToBoolean() { return new CodeBlock() // IN obj .invokestatic(p(Types.class), "toBoolean", sig(Boolean.class, Object.class)); // obj }
public CodeBlock normalCompletionWithValue() { return new CodeBlock() // IN: val .invokestatic(p(Completion.class), "createNormal", sig(Completion.class, Object.class)); }
public CodeBlock jsGetBase() { return new CodeBlock() // IN: reference // reference .invokevirtual(p(Reference.class), "getBase", sig(Object.class)); // value }
public CodeBlock convertTopToDouble() { return new CodeBlock() // IN: int .invokestatic(p(Double.class), "valueOf", sig(Double.class, double.class)); }
@Override public Object visit(Object context, ThisExpression expr, boolean strict) { aload(Arities.EXECUTION_CONTEXT); invokevirtual(p(ExecutionContext.class), "getThisBinding", sig(Object.class)); return null; }
public CodeBlock throwCompletion() { return new CodeBlock() // IN value .invokestatic(p(Completion.class), "createThrow", sig(Completion.class, Object.class)); // completion }
public CodeBlock jsCreatePropertyReference() { return new CodeBlock() // IN: context obj identifier .invokevirtual(p(ExecutionContext.class), "createPropertyReference", sig(Reference.class, Object.class, String.class)); }
public CodeBlock convertTopToLong() { return new CodeBlock() // IN: int .invokestatic(p(Long.class), "valueOf", sig(Long.class, long.class)); }
@Override public void visitAfter(final ValueDefn defn) { code.invokespecial(p(defn.getTypeClass().getRefType()), "<init>", sig(void.class, defn.getTypeClass().getPrimType())); code.areturn(); jiteClass.defineMethod(defn.pattern(), ACC_PUBLIC | ACC_STATIC, sig(Object.class), code); jiteClass.defineMethod("eval", ACC_PUBLIC, sig(Object.class), new CodeBlock() {{ invokedynamic(defn.pattern(), sig(Object.class), Bootstrap.HANDLE, klass); areturn(); }}); JiteClassLoader.INSTANCE.define(jiteClass); } }
@Override public void define(JiteClass cls, CompilationContext context, boolean strict) { CodeGeneratingVisitor visitor = createVisitor( context.getBlockManager() ); block.accept(context, visitor, strict); cls.defineMethod("call", Opcodes.ACC_PUBLIC, sig(Completion.class, ExecutionContext.class), visitor.areturn()); cls.defineMethod("initializeCode", Opcodes.ACC_PRIVATE, sig(void.class), new CodeBlock().voidreturn()); }
public void continueCompletion(final String target) { // <EMPTY> if (target == null) { aconst_null(); } else { ldc(target); } // target invokestatic(p(Completion.class), "createContinue", sig(Completion.class, String.class)); // completion }
public void breakCompletion(final String target) { // <EMPTY> if (target == null) { aconst_null(); } else { ldc(target); } // target invokestatic(p(Completion.class), "createBreak", sig(Completion.class, String.class)); // completion }
private void emitReceiveFunctionParameter(CodeBlock block, ReceiveFunctionParameter instruction, HashMap<Label, LabelNode> jumpMap) { block .aload(EXECUTION_CONTEXT) .pushInt(instruction.getIndex()) .invokevirtual(p(ExecutionContext.class), "getFunctionParameter", sig(Object.class, int.class)); }
public CodeBlock jsToInt32() { return new CodeBlock() // IN obj .aload(Arities.EXECUTION_CONTEXT) // obj context .swap() // context obj .invokestatic(p(Types.class), "toInt32", sig(Long.class, ExecutionContext.class, Object.class)); // obj }
public CodeBlock jsToObject() { return new CodeBlock() // IN obj .aload(Arities.EXECUTION_CONTEXT) // obj context .swap() // context object .invokestatic(p(Types.class), "toObject", sig(JSObject.class, ExecutionContext.class, Object.class)); // obj }
public CodeBlock jsToUint32() { return new CodeBlock() // IN obj .aload(Arities.EXECUTION_CONTEXT) // obj context .swap() // context obj .invokestatic(p(Types.class), "toUint32", sig(Long.class, ExecutionContext.class, Object.class)); // obj }
@Override public Object visit(Object context, IdentifierReferenceExpression expr, boolean strict) { aload(Arities.EXECUTION_CONTEXT); // context ldc(expr.getIdentifier()); // context identifier invokevirtual(p(ExecutionContext.class), "resolve", sig(Reference.class, String.class)); // reference return null; }
public CodeBlock jsResolve(final String identifier) { return new CodeBlock() // <EMPTY> .aload(Arities.EXECUTION_CONTEXT) .ldc(identifier) .invokevirtual(p(ExecutionContext.class), "resolve", sig(Reference.class, String.class)); // reference }
public CodeBlock jsCompletionType() { return new CodeBlock() // IN completion .getfield(p(Completion.class), "type", ci(Completion.Type.class)) // type .invokevirtual(p(Completion.Type.class), "ordinal", sig(int.class)); }
public CodeBlock aprintln() { dup(); getstatic(p(System.class), "err", ci(PrintStream.class)); swap(); invokevirtual(p(PrintStream.class), "println", sig(void.class, params(Object.class))); return this; }