/** * Creates a new class representation * * @param className the desired class name * @param interfaces the desired java interfaces this class will implement */ public JiteClass(String className, String[] interfaces) { this(className, p((Class) Object.class), interfaces); }
public Codegen(String klass) { this.klass = klass; this.jiteClass = new JiteClass(klass, new String[] { p(Value.class) }) {{ defineDefaultConstructor(); }}; }
public static boolean isBooleanValueOfZ(final String methodOwner, final String methodName, final String methodDesc) { Objects.requireNonNull(methodOwner, "methodOwner"); Objects.requireNonNull(methodName, "methodName"); Objects.requireNonNull(methodDesc, "methodDesc"); return CodegenUtils.p(Boolean.class).equals(methodOwner) && "valueOf".equals(methodName) && CodegenUtils.sig(Boolean.class, boolean.class) .equals(methodDesc); }
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 jsCompletionTarget() { return new CodeBlock() // IN completion .getfield(p(Completion.class), "target", ci(String.class)); // value }
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 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 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; }
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 }
@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); } }