public static String pretty(Class retval, Class... params) { return prettyParams(params) + human(retval); }
public JSFunction compileFunction(ExecutionContext context) { final String methodName = nextSyntheticMethodName(scope); final String syntheticSignature = sig(Object.class, params(Object.class, ExecutionContext.class, Object.class, scope.getParameterNames().length)); scope.setSyntheticMethodName(methodName); scope.setSyntheticSignature(syntheticSignature); final JiteClass jiteClass = new JiteClass("org/dynjs/gen/" + nextCompiledFunctionName(), p(AbstractFunction.class), new String[]{p(JSFunction.class), p(JITCompiler.CompiledFunction.class)}); jiteClass.defineMethod("<init>", Opcodes.ACC_PUBLIC, sig(void.class, GlobalContext.class, LexicalEnvironment.class, boolean.class, String[].class), new CodeBlock() .aload(THIS) .invokespecial(p(AbstractFunction.class), "<init>", sig(void.class, GlobalContext.class, LexicalEnvironment.class, boolean.class, String[].class)) .voidreturn() ); jiteClass.defineMethod("call", Opcodes.ACC_PUBLIC, sig(Object.class, ExecutionContext.class), block); final byte[] bytes = jiteClass.toBytes(); if (context.getConfig().isDebug()) {
public VisibleAnnotation(Class<?> type) { this(ci(type)); }
/** * 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 static boolean isVarRoot(final String methodOwner, final String methodName, final String methodDesc) { Objects.requireNonNull(methodOwner, "methodOwner"); Objects.requireNonNull(methodName, "methodName"); Objects.requireNonNull(methodDesc, "methodDesc"); return "<init>".equals(methodName) && CodegenUtils.sig(void.class, Object.class).equals(methodDesc) && isAssignableTo(methodOwner, Var.class); }
public MultipleClassInitializer(final String className, final int numChunks) { for (int i = 0; i < numChunks; ++i) { String chunkClassName = className + '$' + i; aload(Arities.THIS); // this newobj(chunkClassName.replace('.', '/')); // this chunk dup(); // this chunk chunk invokespecial(chunkClassName.replace('.', '/'), "<init>", sig(void.class)); // this chunk putfield(className.replace('.', '/'), "chunk" + i, ci(BasicBlock.class)); // <empty> voidreturn(); } }
private void emitFunction(JiteClass jiteClass, HashMap<Label, LabelNode> jumpMap, CodeBlock block, DefineFunction instruction) { final FunctionScope functionScope = instruction.getScope(); final String[] parameterNames = functionScope.getParameterNames(); final CodeBlock fnBlock = new CodeBlock(); final List<BasicBlock> blocks = functionScope.prepareForCompilation(); for (BasicBlock bb : blocks) { for (Instruction fnInstr : bb.getInstructions()) { emitInstruction(jiteClass, jumpMap, fnBlock, fnInstr); } } if (!fnBlock.returns()) { fnBlock.aconst_null().areturn(); } final String methodName = nextSyntheticMethodName(functionScope); final String syntheticSignature = sig(Object.class, params(Object.class, ExecutionContext.class, Object.class, parameterNames.length)); jiteClass.defineMethod(methodName, Opcodes.ACC_STATIC | Opcodes.ACC_PUBLIC, syntheticSignature, fnBlock); functionScope.setSyntheticMethodName(methodName); functionScope.setSyntheticSignature(syntheticSignature); }
public static String prettyParams(Class... params) { StringBuilder signature = new StringBuilder("("); for (int i = 0; i < params.length; i++) { signature.append(human(params[i])); if (i < params.length - 1) { signature.append(','); } } signature.append(")"); return signature.toString(); }
public static String sigParams(String descriptor, Class... params) { StringBuilder signature = new StringBuilder("("); signature.append(descriptor); for (int i = 0; i < params.length; i++) { signature.append(ci(params[i])); } signature.append(")"); return signature.toString(); }
public Codegen(String klass) { this.klass = klass; this.jiteClass = new JiteClass(klass, new String[] { p(Value.class) }) {{ defineDefaultConstructor(); }}; }
@Override protected void generateMethod(final InstructionGroup group, final ClassWriter cw) { final MethodVisitor mv = cw.visitMethod(ACC_PUBLIC, "get", CodegenUtils.sig(Object.class), null, null); convertXLoads(group); group.getInstructions().accept(mv); mv.visitInsn(ARETURN); mv.visitMaxs(0, 0); // trigger automatic computing } }
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); }