/** * Short-hand for specifying a set of aloads * * @param args list of aloads you want */ public void aloadMany(int... args) { for (int arg: args) { aload(arg); } }
private static void invokeCCallTrace(SkinnyMethodAdapter method, int traceBoolIndex) { method.aloadMany(0, 1); // method, threadContext method.iload(traceBoolIndex); // traceEnable method.aload(4); // invokedName method.invokevirtual(p(JavaMethod.class), "callTrace", sig(void.class, ThreadContext.class, boolean.class, String.class)); }
/** * Short-hand for specifying a set of aloads * * @param args list of aloads you want */ public void aloadMany(int... args) { for (int arg: args) { aload(arg); } }
private static void invokeCReturnTrace(SkinnyMethodAdapter method, int traceBoolIndex) { method.aloadMany(0, 1); // method, threadContext method.iload(traceBoolIndex); // traceEnable method.aload(4); // invokedName method.invokevirtual(p(JavaMethod.class), "returnTrace", sig(void.class, ThreadContext.class, boolean.class, String.class)); }
private void addSimpleMethodMappings(TypeElement cls, List<ExecutableElement> simpleNames) { StringBuilder encoded = new StringBuilder(); for (ExecutableElement elt : simpleNames) { if (encoded.length() > 0) encoded.append(";"); encoded.append(elt.getSimpleName()); } if (encoded.length() == 0) return; mv.aload(RUNTIME); mv.ldc(cls.getSimpleName().toString()); mv.ldc(encoded.toString()); mv.invokevirtual("org/jruby/Ruby", "addSimpleBoundMethodsPacked", "(Ljava/lang/String;Ljava/lang/String;)V"); }
private void addSimpleMethodMappings(TypeElement cls, List<ExecutableElement> simpleNames) { StringBuilder encoded = new StringBuilder(); for (ExecutableElement elt : simpleNames) { if (encoded.length() > 0) encoded.append(";"); encoded.append(elt.getSimpleName()); } if (encoded.length() == 0) return; mv.aload(RUNTIME); mv.ldc(cls.getSimpleName().toString()); mv.ldc(encoded.toString()); mv.invokevirtual("org/jruby/Ruby", "addSimpleBoundMethodsPacked", "(Ljava/lang/String;Ljava/lang/String;)V"); }
public void loadSelfBlock() { int selfBlockOffset = signature.argOffset(JVMVisitor.SELF_BLOCK_NAME); if (selfBlockOffset == -1) { adapter.aconst_null(); } else { adapter.aload(selfBlockOffset); } }
private static void loadArgumentWithCast(SkinnyMethodAdapter mv, int argNumber, Class coerceType) { mv.aload(ARGS_INDEX + (argNumber - 1)); if (coerceType != IRubyObject.class && coerceType != IRubyObject[].class) { if (coerceType == RubyString.class) { mv.invokeinterface(p(IRubyObject.class), "convertToString", sig(RubyString.class)); } else { throw new RuntimeException("Unknown coercion target: " + coerceType); } } }
private static void loadArgumentWithCast(SkinnyMethodAdapter mv, int argNumber, Class coerceType) { mv.aload(ARGS_INDEX + (argNumber - 1)); if (coerceType != IRubyObject.class && coerceType != IRubyObject[].class) { if (coerceType == RubyString.class) { mv.invokeinterface(p(IRubyObject.class), "convertToString", sig(RubyString.class)); } else { throw new RuntimeException("Unknown coercion target: " + coerceType); } } }
private static void objectHashCode(final int line, SkinnyMethodAdapter mv) { if ( line > 0 ) mv.line(line); mv.aload(0); mv.invokespecial(p(Object.class), "hashCode", sig(Integer.TYPE)); mv.ireturn(); }
private static void objectToString(final int line, SkinnyMethodAdapter mv) { if ( line > 0 ) mv.line(line); mv.aload(0); mv.invokespecial(p(Object.class), "toString", sig(String.class)); mv.areturn(); }
private void invokeCallConfigPost(SkinnyMethodAdapter mv, String superClass, CallConfiguration callConfig) { if (callConfig.isNoop()) return; mv.aload(1); mv.invokestatic(superClass, getPostMethod(callConfig), sig(void.class, params(ThreadContext.class))); }
private void emitResultConversion(SkinnyMethodAdapter mv, AsmClassBuilder builder, JITSignature signature) { if (signature.hasResultConverter()) { mv.aload(0); // [ result, this ] mv.getfield(builder.getClassName(), builder.getResultConverterFieldName(), ci(NativeDataConverter.class)); mv.swap(); // [ converter, result ] mv.aload(1); mv.swap(); // [ converter, thread context, result ] mv.invokevirtual(p(NativeDataConverter.class), "fromNative", sig(IRubyObject.class, ThreadContext.class, IRubyObject.class)); } }
private void emitResultConversion(SkinnyMethodAdapter mv, AsmClassBuilder builder, JITSignature signature) { if (signature.hasResultConverter()) { mv.aload(0); // [ result, this ] mv.getfield(builder.getClassName(), builder.getResultConverterFieldName(), ci(NativeDataConverter.class)); mv.swap(); // [ converter, result ] mv.aload(1); mv.swap(); // [ converter, thread context, result ] mv.invokevirtual(p(NativeDataConverter.class), "fromNative", sig(IRubyObject.class, ThreadContext.class, IRubyObject.class)); } }
private void invokeCallConfigPost(SkinnyMethodAdapter mv, String superClass, CallConfiguration callConfig) { if (callConfig.isNoop()) return; mv.aload(1); mv.invokestatic(superClass, getPostMethod(callConfig), sig(void.class, params(ThreadContext.class))); }
private static void objectToString(final int line, SkinnyMethodAdapter mv) { if ( line > 0 ) mv.line(line); mv.aload(0); mv.invokespecial(p(Object.class), "toString", sig(String.class)); mv.areturn(); }
private void loadEncoding(SkinnyMethodAdapter method, int encodingIndex) { method.aload(0); if (encodingIndex < AbstractScript.NUMBERED_ENCODING_COUNT) { method.invokevirtual(scriptCompiler.getClassname(), "getEncoding" + encodingIndex, sig(Encoding.class)); } else { method.pushInt(encodingIndex); method.invokevirtual(scriptCompiler.getClassname(), "getEncoding", sig(Encoding.class, int.class)); } }
public void loadFrameName() { int superNameOffset = signature.argOffset(JVMVisitor.SUPER_NAME_NAME); if (superNameOffset == -1) { // load from self block loadSelfBlock(); adapter.invokevirtual(p(Block.class), "getBinding", sig(Binding.class)); adapter.invokevirtual(p(Binding.class), "getMethod", sig(String.class)); } else { adapter.aload(superNameOffset); } }