Skip to content

Commit

Permalink
Showing 3 changed files with 44 additions and 37 deletions.
37 changes: 0 additions & 37 deletions spec/truffle/tags/core/method/parameters_tags.txt
Original file line number Diff line number Diff line change
@@ -1,38 +1 @@
fails:Method#parameters returns an empty Array when the method expects no arguments
fails:Method#parameters returns [[:req,:name]] for a method expecting one required argument called 'name'
fails:Method#parameters returns [[:req,:a],[:req,:b]] for a method expecting two required arguments called 'a' and 'b''
fails:Method#parameters returns [[:block,:blk]] for a method expecting one block argument called 'a'
fails:Method#parameters returns [[:req,:a],[:block,:b] for a method expecting a required argument ('a') and a block argument ('b')
fails:Method#parameters returns [[:req,:a],[:req,:b],[:block,:c] for a method expecting two required arguments ('a','b') and a block argument ('c')
fails:Method#parameters returns [[:opt,:a]] for a method expecting one optional argument ('a')
fails:Method#parameters returns [[:req,:a],[:opt,:b]] for a method expecting one required argument ('a') and one optional argument ('b')
fails:Method#parameters returns [[:req,:a],[:opt,:b],[:opt,:c]] for a method expecting one required argument ('a') and two optional arguments ('b','c')
fails:Method#parameters returns [[:req,:a],[:req,:b],[:opt,:c]] for a method expecting two required arguments ('a','b') and one optional arguments ('c')
fails:Method#parameters returns [[:opt,:a],[:block,:b]] for a method expecting one required argument ('a') and one block argument ('b')
fails:Method#parameters returns [[:req,:a],[:opt,:b],[:block,:c]] for a method expecting one required argument ('a'), one optional argument ('b'), and a block ('c')
fails:Method#parameters returns [[:req,:a],[:opt,:b],[:opt,:c],[:block,:d]] for a method expecting one required argument ('a'), two optional arguments ('b','c'), and a block ('d')
fails:Method#parameters returns [[:rest,:a]] for a method expecting a single splat argument ('a')
fails:Method#parameters returns [[:req,:a],[:rest,:b]] for a method expecting a splat argument ('a') and a required argument ('b')
fails:Method#parameters returns [[:req,:a],[:req,:b],[:rest,:c]] for a method expecting two required arguments ('a','b') and a splat argument ('c')
fails:Method#parameters returns [[:req,:a],[:opt,:b],[:rest,:c]] for a method expecting a required argument ('a','b'), an optional argument ('b'), and a splat argument ('c')
fails:Method#parameters returns [[:req,:a],[:req,:b],[:opt,:b],[:rest,:d]] for a method expecting two required arguments ('a','b'), an optional argument ('c'), and a splat argument ('d')
fails:Method#parameters returns [[:req,:a],[:opt,:b],[:opt,:c],[:rest,:d]] for a method expecting a required argument ('a'), two optional arguments ('b','c'), and a splat argument ('d')
fails:Method#parameters returns [[:rest,:a],[:block,:b]] for a method expecting a splat argument ('a') and a block argument ('b')
fails:Method#parameters returns [[:req,:a],[:rest,:b],[:block,:c]] for a method expecting a required argument ('a'), a splat argument ('b'), and a block ('c')
fails:Method#parameters returns [[:req,:a],[:req,:b],[:rest,:c],[:block,:d]] for a method expecting two required arguments ('a','b'), a splat argument ('c'), and a block ('d')
fails:Method#parameters returns [[:req,:a],[:opt,:b],[:rest,:c],[:block,:d]] for a method expecting a required argument ('a'), a splat argument ('c'), and a block ('d')
fails:Method#parameters returns [[:req,:a],[:req,:b],[:opt,:c],[:block,:d]] for a method expecting two required arguments ('a','b'), an optional argument ('c'), a splat argument ('d'), and a block ('e')
fails:Method#parameters returns [[:rest,:a],[:req,:b]] for a method expecting a splat argument ('a') and a required argument ('b')
fails:Method#parameters returns [[:rest,:a],[:req,:b],[:req,:c]] for a method expecting a splat argument ('a') and two required arguments ('b','c')
fails:Method#parameters returns [[:rest,:a],[:req,:b],[:block,:c]] for a method expecting a splat argument ('a'), a required argument ('b'), and a block ('c')
fails:Method#parameters works with ->(){} as the value of an optional argument
fails:Method#parameters returns [] for a define_method method with explicit no-args || specification
fails:Method#parameters returns [[:rest, :x]] for a define_method method with rest arg 'x' only
fails:Method#parameters returns [[:req, :x]] for a define_method method expecting one required argument 'x'
fails:Method#parameters returns [[:req, :x], [:req, :y]] for a define_method method expecting two required arguments 'x' and 'y'
fails:Method#parameters returns [] for a define_method method with no args specification
fails:Method#parameters returns [[:req]] for a define_method method with a grouping as its only argument
fails:Method#parameters returns [[:opt, :x]] for a define_method method with an optional argument 'x'
fails:Method#parameters returns [[:rest]] for a Method generated by respond_to_missing?
fails:Method#parameters adds nameless rest arg for "star" argument
fails:Method#parameters returns the args and block for a splat and block argument
Original file line number Diff line number Diff line change
@@ -16,6 +16,8 @@
import com.oracle.truffle.api.nodes.IndirectCallNode;
import com.oracle.truffle.api.source.NullSourceSection;
import com.oracle.truffle.api.source.SourceSection;
import org.jruby.ast.ArgsNode;
import org.jruby.runtime.Helpers;
import org.jruby.truffle.nodes.core.BasicObjectNodes.ReferenceEqualNode;
import org.jruby.truffle.nodes.objects.ClassNode;
import org.jruby.truffle.nodes.objects.ClassNodeGen;
@@ -133,6 +135,26 @@ public RubyModule owner(RubyMethod method) {

}

@CoreMethod(names = "parameters")
public abstract static class ParametersNode extends CoreMethodArrayArgumentsNode {

public ParametersNode(RubyContext context, SourceSection sourceSection) {
super(context, sourceSection);
}

@CompilerDirectives.TruffleBoundary
@Specialization
public RubyArray parameters(RubyMethod method) {
final ArgsNode argsNode = method.getMethod().getSharedMethodInfo().getParseTree().findFirstChild(ArgsNode.class);

final String[] parameters = Helpers.encodeParameterList((ArgsNode) argsNode).split(";");

return (RubyArray) getContext().toTruffle(Helpers.parameterListToParameters(getContext().getRuntime(),
parameters, true));
}

}

@CoreMethod(names = "receiver")
public abstract static class ReceiverNode extends CoreMethodArrayArgumentsNode {

Original file line number Diff line number Diff line change
@@ -14,6 +14,8 @@
import com.oracle.truffle.api.frame.VirtualFrame;
import com.oracle.truffle.api.source.NullSourceSection;
import com.oracle.truffle.api.source.SourceSection;
import org.jruby.ast.ArgsNode;
import org.jruby.runtime.Helpers;
import org.jruby.runtime.Visibility;
import org.jruby.truffle.nodes.objects.MetaClassNode;
import org.jruby.truffle.nodes.objects.MetaClassNodeGen;
@@ -138,6 +140,26 @@ public RubyModule owner(RubyUnboundMethod unboundMethod) {

}

@CoreMethod(names = "parameters")
public abstract static class ParametersNode extends CoreMethodArrayArgumentsNode {

public ParametersNode(RubyContext context, SourceSection sourceSection) {
super(context, sourceSection);
}

@CompilerDirectives.TruffleBoundary
@Specialization
public RubyArray parameters(RubyUnboundMethod method) {
final ArgsNode argsNode = method.getMethod().getSharedMethodInfo().getParseTree().findFirstChild(ArgsNode.class);

final String[] parameters = Helpers.encodeParameterList((ArgsNode) argsNode).split(";");

return (RubyArray) getContext().toTruffle(Helpers.parameterListToParameters(getContext().getRuntime(),
parameters, true));
}

}

@CoreMethod(names = "source_location")
public abstract static class SourceLocationNode extends CoreMethodArrayArgumentsNode {

0 comments on commit 1493648

Please sign in to comment.