@Override public Instr cloneForBlockCloning(InlinerInfo ii) { return new ReceivePreReqdArgInstr(ii.getRenamedVariable(result), argIndex); }
@Override public void ReceivePreReqdArgInstr(ReceivePreReqdArgInstr instr) { int index = getJVMLocalVarIndex(instr.getResult()); jvm.method().loadLocal(3 + instr.getArgIndex()); jvm.method().storeLocal(index); }
@Override public void encode(IRWriterEncoder e) { super.encode(e); e.encode(getArgIndex()); }
case RECV_OPT_ARG: return ReceiveOptArgInstr.decode(this); case RECV_POST_REQD_ARG: return ReceivePostReqdArgInstr.decode(this); case RECV_PRE_REQD_ARG: return ReceivePreReqdArgInstr.decode(this); case RECV_REST_ARG: return ReceiveRestArgInstr.decode(this); case RECV_SELF: return ReceiveSelfInstr.decode(this);
@Override public void encode(IRWriterEncoder e) { super.encode(e); e.encode(getArgIndex()); }
case RECV_OPT_ARG: return ReceiveOptArgInstr.decode(this); case RECV_POST_REQD_ARG: return ReceivePostReqdArgInstr.decode(this); case RECV_PRE_REQD_ARG: return ReceivePreReqdArgInstr.decode(this); case RECV_REST_ARG: return ReceiveRestArgInstr.decode(this); case RECV_SELF: return ReceiveSelfInstr.decode(this);
@Override public Instr cloneForBlockCloning(InlinerInfo ii) { return new ReceivePreReqdArgInstr(ii.getRenamedVariable(result), argIndex); }
@Override public void ReceivePreReqdArgInstr(ReceivePreReqdArgInstr instr) { int index = getJVMLocalVarIndex(instr.getResult()); jvm.method().loadLocal(3 + instr.getArgIndex()); jvm.method().storeLocal(index); }
switch(operation) { case RECV_PRE_REQD_ARG: int argIndex = ((ReceivePreReqdArgInstr)instr).getArgIndex();
public static ReceivePreReqdArgInstr decode(IRReaderDecoder d) { return new ReceivePreReqdArgInstr(d.decodeVariable(), d.decodeInt()); }
@Override public void ReceivePreReqdArgInstr(ReceivePreReqdArgInstr instr) { if (jvm.methodData().specificArity >= 0 && instr.getArgIndex() < jvm.methodData().specificArity) { jvmAdapter().aload(jvm.methodData().signature.argOffset("arg" + instr.getArgIndex())); } else { jvmMethod().loadContext(); jvmMethod().loadArgs(); jvmAdapter().pushInt(instr.getArgIndex()); jvmMethod().invokeIRHelper("getPreArgSafe", sig(IRubyObject.class, ThreadContext.class, IRubyObject[].class, int.class)); } jvmStoreLocal(instr.getResult()); }
switch(operation) { case RECV_PRE_REQD_ARG: int argIndex = ((ReceivePreReqdArgInstr)instr).getArgIndex();
public static ReceivePreReqdArgInstr decode(IRReaderDecoder d) { return new ReceivePreReqdArgInstr(d.decodeVariable(), d.decodeInt()); }
@Override public void ReceivePreReqdArgInstr(ReceivePreReqdArgInstr instr) { if (jvm.methodData().specificArity >= 0 && instr.getArgIndex() < jvm.methodData().specificArity) { jvmAdapter().aload(jvm.methodData().signature.argOffset("arg" + instr.getArgIndex())); } else { jvmMethod().loadContext(); jvmMethod().loadArgs(); jvmAdapter().pushInt(instr.getArgIndex()); jvmMethod().invokeIRHelper("getPreArgSafe", sig(IRubyObject.class, ThreadContext.class, IRubyObject[].class, int.class)); } jvmStoreLocal(instr.getResult()); }
protected static void receiveArg(ThreadContext context, Instr i, Operation operation, IRubyObject[] args, boolean acceptsKeywordArgument, DynamicScope currDynScope, Object[] temp, Object exception, Block blockArg) { Object result; ResultInstr instr = (ResultInstr)i; switch(operation) { case RECV_PRE_REQD_ARG: int argIndex = ((ReceivePreReqdArgInstr)instr).getArgIndex(); result = IRRuntimeHelpers.getPreArgSafe(context, args, argIndex); setResult(temp, currDynScope, instr.getResult(), result); return; case RECV_POST_REQD_ARG: result = ((ReceivePostReqdArgInstr)instr).receivePostReqdArg(context, args, acceptsKeywordArgument); setResult(temp, currDynScope, instr.getResult(), result); return; case RECV_RUBY_EXC: setResult(temp, currDynScope, instr.getResult(), IRRuntimeHelpers.unwrapRubyException(exception)); return; case RECV_JRUBY_EXC: setResult(temp, currDynScope, instr.getResult(), exception); return; case LOAD_IMPLICIT_CLOSURE: setResult(temp, currDynScope, instr.getResult(), blockArg); return; default: result = ((ReceiveArgBase)instr).receiveArg(context, args, acceptsKeywordArgument); setResult(temp, currDynScope, instr.getResult(), result); } }
private void addArgReceiveInstr(IRScope s, Variable v, int argIndex, boolean post, int numPreReqd, int numPostRead) { if (post) s.addInstr(new ReceivePostReqdArgInstr(v, argIndex, numPreReqd, numPostRead)); else s.addInstr(new ReceivePreReqdArgInstr(v, argIndex)); }
protected static void receiveArg(ThreadContext context, Instr i, Operation operation, IRubyObject[] args, boolean acceptsKeywordArgument, DynamicScope currDynScope, Object[] temp, Object exception, Block blockArg) { Object result; ResultInstr instr = (ResultInstr)i; switch(operation) { case RECV_PRE_REQD_ARG: int argIndex = ((ReceivePreReqdArgInstr)instr).getArgIndex(); result = IRRuntimeHelpers.getPreArgSafe(context, args, argIndex); setResult(temp, currDynScope, instr.getResult(), result); return; case RECV_POST_REQD_ARG: result = ((ReceivePostReqdArgInstr)instr).receivePostReqdArg(context, args, acceptsKeywordArgument); setResult(temp, currDynScope, instr.getResult(), result); return; case RECV_RUBY_EXC: setResult(temp, currDynScope, instr.getResult(), IRRuntimeHelpers.unwrapRubyException(exception)); return; case RECV_JRUBY_EXC: setResult(temp, currDynScope, instr.getResult(), exception); return; case LOAD_IMPLICIT_CLOSURE: setResult(temp, currDynScope, instr.getResult(), blockArg); return; default: result = ((ReceiveArgBase)instr).receiveArg(context, args, acceptsKeywordArgument); setResult(temp, currDynScope, instr.getResult(), result); } }
private void addArgReceiveInstr(IRScope s, Variable v, int argIndex, boolean post, int numPreReqd, int numPostRead) { if (post) s.addInstr(new ReceivePostReqdArgInstr(v, argIndex, numPreReqd, numPostRead)); else s.addInstr(new ReceivePreReqdArgInstr(v, argIndex)); }
protected void receiveBlockArg(Variable v, Operand argsArray, int argIndex, boolean isSplat) { if (argsArray != null) { // We are in a nested receive situation -- when we are not at the root of a masgn tree // Ex: We are trying to receive (b,c) in this example: "|a, (b,c), d| = ..." if (isSplat) addInstr(new RestArgMultipleAsgnInstr(v, argsArray, argIndex)); else addInstr(new ReqdArgMultipleAsgnInstr(v, argsArray, argIndex)); } else { // argsArray can be null when the first node in the args-node-ast is a multiple-assignment // For example, for-nodes addInstr(isSplat ? new ReceiveRestArgInstr(v, argIndex, argIndex) : new ReceivePreReqdArgInstr(v, argIndex)); } }
protected void receiveBlockArg(Variable v, Operand argsArray, int argIndex, boolean isSplat) { if (argsArray != null) { // We are in a nested receive situation -- when we are not at the root of a masgn tree // Ex: We are trying to receive (b,c) in this example: "|a, (b,c), d| = ..." if (isSplat) addInstr(new RestArgMultipleAsgnInstr(v, argsArray, argIndex)); else addInstr(new ReqdArgMultipleAsgnInstr(v, argsArray, argIndex)); } else { // argsArray can be null when the first node in the args-node-ast is a multiple-assignment // For example, for-nodes addInstr(isSplat ? new ReceiveRestArgInstr(v, argIndex, argIndex) : new ReceivePreReqdArgInstr(v, argIndex)); } }