Skip to content
Permalink

Comparing changes

Choose two branches to see what’s changed or to start a new pull request. If you need to, you can also or learn more about diff comparisons.

Open a pull request

Create a new pull request by comparing changes across two branches. If you need to, you can also . Learn more about diff comparisons here.
base repository: jruby/jruby
Failed to load repositories. Confirm that selected base ref is valid, then try again.
Loading
base: 0ac35aff460a
Choose a base ref
...
head repository: jruby/jruby
Failed to load repositories. Confirm that selected head ref is valid, then try again.
Loading
compare: e8a8def50e44
Choose a head ref
  • 3 commits
  • 6 files changed
  • 1 contributor

Commits on Jan 15, 2015

  1. Copy the full SHA
    51ad740 View commit details
  2. [Truffle] Implemented Module#define_method with a passed bound method.

    Also untagged a bunch of passing specs.
    nirvdrum committed Jan 15, 2015
    Copy the full SHA
    7065457 View commit details
  3. 3
    Copy the full SHA
    e8a8def View commit details
24 changes: 21 additions & 3 deletions core/src/main/java/org/jruby/truffle/nodes/core/MethodNodes.java
Original file line number Diff line number Diff line change
@@ -14,12 +14,10 @@
import com.oracle.truffle.api.frame.VirtualFrame;
import com.oracle.truffle.api.nodes.IndirectCallNode;
import com.oracle.truffle.api.source.SourceSection;
import org.jruby.truffle.nodes.yield.YieldDispatchHeadNode;
import org.jruby.truffle.runtime.RubyArguments;
import org.jruby.truffle.runtime.RubyContext;
import org.jruby.truffle.runtime.UndefinedPlaceholder;
import org.jruby.truffle.runtime.core.RubyMethod;
import org.jruby.truffle.runtime.core.RubyProc;
import org.jruby.truffle.runtime.core.RubySymbol;
import org.jruby.truffle.runtime.methods.InternalMethod;

@CoreClass(name = "Method")
@@ -57,4 +55,24 @@ public Object call(VirtualFrame frame, RubyMethod method, Object... arguments) {

}

@CoreMethod(names = "name")
public abstract static class NameNode extends CoreMethodNode {

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

public NameNode(NameNode prev) {
super(prev);
}

@Specialization
public RubySymbol name(RubyMethod method) {
notDesignedForCompilation();

return getContext().newSymbol(method.getMethod().getName());
}

}

}
Original file line number Diff line number Diff line change
@@ -760,6 +760,15 @@ public RubySymbol defineMethod(RubyModule module, RubySymbol name, RubyProc proc
return name;
}

@Specialization
public RubySymbol defineMethod(RubyModule module, RubySymbol name, RubyMethod method, UndefinedPlaceholder block) {
notDesignedForCompilation();

module.addMethod(this, method.getMethod().withNewName(name.toString()));

return name;
}

private void defineMethod(RubyModule module, RubySymbol name, RubyProc proc) {
notDesignedForCompilation();

Original file line number Diff line number Diff line change
@@ -69,4 +69,8 @@ def StringValue(obj)
end
module_function :StringValue

def define_singleton_method(*args, &block)
singleton_class.send(:define_method, *args, &block)
end

end
Original file line number Diff line number Diff line change
@@ -1,8 +1,2 @@
fails:Kernel#define_singleton_method defines a new method with the given name and the given block as body in self
fails:Kernel#define_singleton_method raises a TypeError when the given method is no Method/Proc
fails:Kernel#define_singleton_method defines a new singleton method for objects
fails:Kernel#define_singleton_method maintains the Proc's scope
fails:Kernel#define_singleton_method when given an UnboundMethod correctly calls the new method
fails:Kernel#define_singleton_method when given an UnboundMethod adds the new method to the methods list
fails:Kernel#define_singleton_method when given an UnboundMethod defines any Child class method from any Parent's class methods
fails:Kernel#define_singleton_method when given an UnboundMethod will raise when attempting to define an object's singleton method from another object's singleton method
1 change: 0 additions & 1 deletion spec/truffle/tags/core/method/name_tags.txt
Original file line number Diff line number Diff line change
@@ -1,3 +1,2 @@
fails:Method#name returns the name of the method
fails:Method#name returns the name even when aliased
fails:Method#name for a Method generated by respond_to_missing? returns the name passed to respond_to_missing?
35 changes: 0 additions & 35 deletions spec/truffle/tags/core/module/define_method_tags.txt
Original file line number Diff line number Diff line change
@@ -1,46 +1,11 @@
fails:passed { |a, b = 1| } creates a method that raises an ArgumentError when passed zero arguments
fails:passed { |a, b = 1| } creates a method that has a default value for b when passed one argument
fails:passed { |a, b = 1| } creates a method that overrides the default argument when passed two arguments
fails:passed { |a, b = 1| } creates a method that raises an ArgumentError when passed three arguments
fails:Module#define_method when given an UnboundMethod passes the given arguments to the new method
fails:Module#define_method when given an UnboundMethod adds the new method to the methods list
fails:Module#define_method when given an UnboundMethod defining a method on a singleton class doesn't raise TypeError when calling the method
fails:Module#define_method defines the given method as an instance method with the given name in self
fails:Module#define_method calls #method_added after the method is added to the Module
fails:Module#define_method raises a TypeError when the given method is no Method/Proc
fails:Module#define_method raises an ArgumentError when no block is given
fails:Module#define_method raises a RuntimeError if frozen
fails:Module#define_method accepts a Method (still bound)
fails:Module#define_method accepts a String method name
fails:Module#define_method is private
fails:Module#define_method method body is an UnboundMethod allows methods defined on a different object
fails:Module#define_method passed { } creates a method that returns the value computed by the block when passed zero arguments
fails:Module#define_method passed { } creates a method that raises an ArgumentError when passed one argument
fails:Module#define_method passed { } creates a method that raises an ArgumentError when passed two arguments
fails:Module#define_method passed { || } creates a method that returns the value computed by the block when passed zero arguments
fails:Module#define_method passed { || } creates a method that raises an ArgumentError when passed one argument
fails:Module#define_method passed { || } creates a method that raises an ArgumentError when passed two arguments
fails:Module#define_method passed { |a| } creates a method that raises an ArgumentError when passed zero arguments
fails:Module#define_method passed { |a| } creates a method that raises an ArgumentError when passed zero arguments and a block
fails:Module#define_method passed { |a| } creates a method that raises an ArgumentError when passed two arguments
fails:Module#define_method passed { |a| } creates a method that receives the value passed as the argument when passed one argument
fails:Module#define_method passed { |*a| } creates a method that receives an empty array as the argument when passed zero arguments
fails:Module#define_method passed { |*a| } creates a method that receives the value in an array when passed one argument
fails:Module#define_method passed { |*a| } creates a method that receives the values in an array when passed two arguments
fails:Module#define_method passed { |a, *b| } creates a method that raises an ArgumentError when passed zero arguments
fails:Module#define_method passed { |a, *b| } creates a method that returns the value computed by the block when passed one argument
fails:Module#define_method passed { |a, *b| } creates a method that returns the value computed by the block when passed two arguments
fails:Module#define_method passed { |a, *b| } creates a method that returns the value computed by the block when passed three arguments
fails:Module#define_method passed { |a, b| } creates a method that returns the value computed by the block when passed two arguments
fails:Module#define_method passed { |a, b| } creates a method that raises an ArgumentError when passed zero arguments
fails:Module#define_method passed { |a, b| } creates a method that raises an ArgumentError when passed one argument
fails:Module#define_method passed { |a, b| } creates a method that raises an ArgumentError when passed one argument and a block
fails:Module#define_method passed { |a, b| } creates a method that raises an ArgumentError when passed three arguments
fails:Module#define_method passed { |a, b, *c| } creates a method that raises an ArgumentError when passed zero arguments
fails:Module#define_method passed { |a, b, *c| } creates a method that raises an ArgumentError when passed one argument
fails:Module#define_method passed { |a, b, *c| } creates a method that raises an ArgumentError when passed one argument and a block
fails:Module#define_method passed { |a, b, *c| } creates a method that receives an empty array as the third argument when passed two arguments
fails:Module#define_method passed { |a, b, *c| } creates a method that receives the third argument in an array when passed three arguments
fails:Module#define_method when name is :initialize given an UnboundMethod sets the visibility to private when method is named :initialize
fails:Method#define_method when passed a Method object defines a method with the same #arity as the original
fails:Method#define_method when passed a Method object defines a method with the same #parameters as the original