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: 1f158bf41c23
Choose a base ref
...
head repository: jruby/jruby
Failed to load repositories. Confirm that selected head ref is valid, then try again.
Loading
compare: e69a501d7aea
Choose a head ref
  • 3 commits
  • 1 file changed
  • 1 contributor

Commits on Mar 8, 2015

  1. Copy the full SHA
    ceab7a6 View commit details
  2. Copy the full SHA
    eb491a7 View commit details
  3. Copy the full SHA
    e69a501 View commit details
Showing with 27 additions and 5 deletions.
  1. +27 −5 truffle/src/main/java/org/jruby/truffle/nodes/dispatch/UnresolvedDispatchNode.java
Original file line number Diff line number Diff line change
@@ -12,9 +12,10 @@
import java.util.concurrent.Callable;

import com.oracle.truffle.api.Assumption;
import com.oracle.truffle.api.CompilerAsserts;
import com.oracle.truffle.api.CompilerDirectives;
import com.oracle.truffle.api.frame.VirtualFrame;

import com.oracle.truffle.api.interop.TruffleObject;
import org.jruby.truffle.nodes.RubyNode;
import org.jruby.truffle.nodes.core.KernelNodes;
import org.jruby.truffle.nodes.core.KernelNodesFactory;
@@ -63,7 +64,7 @@ public Object executeDispatch(
final Object receiverObject,
final Object methodName,
Object blockObject,
Object argumentsObjects) {
final Object argumentsObjects) {
CompilerDirectives.transferToInterpreterAndInvalidate();

final DispatchNode dispatch = atomic(new Callable<DispatchNode>() {
@@ -91,7 +92,10 @@ public DispatchNode call() throws Exception {
} else {
depth++;
if (isRubyBasicObject(receiverObject)) {
newDispathNode = doRubyBasicObject(frame, first, receiverObject, methodName);
newDispathNode = doRubyBasicObject(frame, first, receiverObject, methodName, argumentsObjects);
}
else if (isForeign(receiverObject)) {
return createForeign(argumentsObjects, first, methodName);
} else {
newDispathNode = doUnboxedObject(frame, first, receiverObject, methodName);
}
@@ -105,6 +109,14 @@ public DispatchNode call() throws Exception {
return dispatch.executeDispatch(frame, receiverObject, methodName, blockObject, argumentsObjects);
}

private boolean isForeign(Object receiverObject) {
return false;
}

private DispatchNode createForeign(Object argumentsObjects, DispatchNode first, Object methodName) {
throw new UnsupportedOperationException();
}

private DispatchNode doUnboxedObject(
VirtualFrame frame,
DispatchNode first,
@@ -164,7 +176,8 @@ private DispatchNode doRubyBasicObject(
VirtualFrame frame,
DispatchNode first,
Object receiverObject,
Object methodName) {
Object methodName,
Object argumentsObjects) {
final DispatchAction dispatchAction = getDispatchAction();

final RubyClass callerClass = ignoreVisibility ? null : getContext().getCoreLibrary().getMetaClass(RubyArguments.getSelf(frame.getArguments()));
@@ -173,6 +186,11 @@ private DispatchNode doRubyBasicObject(
final InternalMethod method = lookup(callerClass, receiverObject, methodName.toString(), ignoreVisibility);

if (method == null) {
final DispatchNode multilanguage = tryMultilanguage(frame, first, methodName, argumentsObjects);
if (multilanguage != null) {
return multilanguage;
}

return createMethodMissingNode(first, methodName, receiverObject);
}

@@ -200,7 +218,7 @@ private DispatchNode doRubyBasicObject(

requireNode.require((RubyString) constant.getValue());

return doRubyBasicObject(frame, first, receiverObject, methodName);
return doRubyBasicObject(frame, first, receiverObject, methodName, argumentsObjects);
}

// The module, the "receiver" is an instance of its singleton class.
@@ -213,6 +231,10 @@ private DispatchNode doRubyBasicObject(
}
}

private DispatchNode tryMultilanguage(VirtualFrame frame, DispatchNode first, Object methodName, Object argumentsObjects) {
return null;
}

private DispatchNode createConstantMissingNode(
DispatchNode first,
Object methodName,