@Override public RubyNode visitArgumentNode(org.jruby.ast.ArgumentNode node) { final SourceSection sourceSection = translate(node.getPosition()); final RubyNode readNode; if (useArray()) { readNode = readArgument(sourceSection, index); } else { if (state == State.PRE) { readNode = readArgument(sourceSection, index); } else if (state == State.POST) { readNode = readArgument( sourceSection, (argsNode.getPreCount() + argsNode.getOptionalArgsCount() + argsNode.getPostCount()) - index - 1); } else { throw new IllegalStateException(); } } final FrameSlot slot = methodBodyTranslator.getEnvironment().getFrameDescriptor().findFrameSlot(node.getName()); return WriteLocalVariableNodeFactory.create(context, sourceSection, slot, readNode); }
@Override public RubyNode visitRestArgNode(org.jruby.ast.RestArgNode node) { final SourceSection sourceSection = translate(node.getPosition()); final RubyNode readNode; if (useArray()) { readNode = ArrayGetTailNodeFactory.create( context, sourceSection, argsNode.getPreCount(), loadArray(sourceSection)); } else { readNode = new ReadRestArgumentNode(context, sourceSection, argsNode.getPreCount()); } final FrameSlot slot = methodBodyTranslator.getEnvironment().getFrameDescriptor().findFrameSlot(node.getName()); return WriteLocalVariableNodeFactory.create(context, sourceSection, slot, readNode); }
private RubyNode readArgument(SourceSection sourceSection, int index) { if (useArray()) { return ArrayIndexNodeFactory.create(context, sourceSection, index, loadArray(sourceSection)); } else { if (state == State.PRE) { return new ReadPreArgumentNode( context, sourceSection, index, isBlock ? MissingArgumentBehaviour.NIL : MissingArgumentBehaviour.RUNTIME_ERROR); } else if (state == State.POST) { return new ReadPostArgumentNode( context, sourceSection, (argsNode.getPreCount() + argsNode.getOptionalArgsCount() + argsNode.getPostCount()) - index - 1); } else { throw new IllegalStateException(); } } }