Skip to content

Commit

Permalink
Showing 8 changed files with 42 additions and 83 deletions.
Original file line number Diff line number Diff line change
@@ -16,7 +16,7 @@
import com.oracle.truffle.api.nodes.InvalidAssumptionException;
import com.oracle.truffle.api.object.DynamicObject;
import com.oracle.truffle.api.utilities.BranchProfile;
import org.jruby.truffle.runtime.RubyArguments;

import org.jruby.truffle.runtime.RubyContext;
import org.jruby.truffle.runtime.methods.InternalMethod;

@@ -110,14 +110,7 @@ public Object executeDispatch(

switch (getDispatchAction()) {
case CALL_METHOD:
return trueCallDirect.call(
frame,
RubyArguments.pack(
trueMethod,
trueMethod.getDeclarationFrame(),
receiverObject,
(DynamicObject) blockObject,
(Object[]) argumentsObjects));
return call(trueCallDirect, frame, trueMethod, receiverObject, blockObject, argumentsObjects);
case RESPOND_TO_METHOD:
return true;

@@ -141,14 +134,7 @@ public Object executeDispatch(

switch (getDispatchAction()) {
case CALL_METHOD:
return falseCallDirect.call(
frame,
RubyArguments.pack(
falseMethod,
falseMethod.getDeclarationFrame(),
receiverObject,
(DynamicObject) blockObject,
(Object[]) argumentsObjects));
return call(falseCallDirect, frame, falseMethod, receiverObject, blockObject, argumentsObjects);

case RESPOND_TO_METHOD:
return true;
Original file line number Diff line number Diff line change
@@ -18,7 +18,6 @@
import com.oracle.truffle.api.object.Shape;

import org.jruby.truffle.nodes.RubyGuards;
import org.jruby.truffle.runtime.RubyArguments;
import org.jruby.truffle.runtime.RubyContext;
import org.jruby.truffle.runtime.layouts.Layouts;
import org.jruby.truffle.runtime.methods.InternalMethod;
@@ -99,14 +98,7 @@ public Object executeDispatch(

switch (getDispatchAction()) {
case CALL_METHOD:
return callNode.call(
frame,
RubyArguments.pack(
method,
method.getDeclarationFrame(),
receiverObject,
(DynamicObject) blockObject,
(Object[]) argumentsObjects));
return call(callNode, frame, method, receiverObject, blockObject, argumentsObjects);

case RESPOND_TO_METHOD:
return true;
Original file line number Diff line number Diff line change
@@ -18,7 +18,6 @@
import com.oracle.truffle.api.object.Shape;

import org.jruby.truffle.nodes.RubyGuards;
import org.jruby.truffle.runtime.RubyArguments;
import org.jruby.truffle.runtime.RubyContext;
import org.jruby.truffle.runtime.array.ArrayUtils;
import org.jruby.truffle.runtime.layouts.Layouts;
@@ -113,14 +112,7 @@ public Object executeDispatch(
modifiedArgumentsObjects[0] = getCachedNameAsSymbol();
ArrayUtils.arraycopy(argumentsObjectsArray, 0, modifiedArgumentsObjects, 1, argumentsObjectsArray.length);

return callNode.call(
frame,
RubyArguments.pack(
method,
method.getDeclarationFrame(),
receiverObject,
(DynamicObject) blockObject,
modifiedArgumentsObjects));
return call(callNode, frame, method, receiverObject, blockObject, modifiedArgumentsObjects);

case RESPOND_TO_METHOD:
return false;
Original file line number Diff line number Diff line change
@@ -16,7 +16,6 @@
import com.oracle.truffle.api.nodes.InvalidAssumptionException;
import com.oracle.truffle.api.object.DynamicObject;
import org.jruby.truffle.nodes.RubyGuards;
import org.jruby.truffle.runtime.RubyArguments;
import org.jruby.truffle.runtime.RubyContext;
import org.jruby.truffle.runtime.layouts.Layouts;
import org.jruby.truffle.runtime.methods.InternalMethod;
@@ -86,14 +85,7 @@ public Object executeDispatch(

switch (getDispatchAction()) {
case CALL_METHOD:
return callNode.call(
frame,
RubyArguments.pack(
method,
method.getDeclarationFrame(),
receiverObject,
(DynamicObject) blockObject,
(Object[]) argumentsObjects));
return call(callNode, frame, method, receiverObject, blockObject, argumentsObjects);

case RESPOND_TO_METHOD:
return true;
Original file line number Diff line number Diff line change
@@ -9,11 +9,16 @@
*/
package org.jruby.truffle.nodes.dispatch;

import com.oracle.truffle.api.frame.VirtualFrame;
import com.oracle.truffle.api.nodes.DirectCallNode;
import com.oracle.truffle.api.object.DynamicObject;
import com.oracle.truffle.api.utilities.BranchProfile;

import org.jruby.truffle.nodes.RubyGuards;
import org.jruby.truffle.runtime.RubyArguments;
import org.jruby.truffle.runtime.RubyContext;
import org.jruby.truffle.runtime.layouts.Layouts;
import org.jruby.truffle.runtime.methods.InternalMethod;

public abstract class CachedDispatchNode extends DispatchNode {

@@ -74,4 +79,15 @@ protected final boolean guardName(Object methodName) {
protected DynamicObject getCachedNameAsSymbol() {
return cachedNameAsSymbol;
}

protected static Object call(DirectCallNode callNode, VirtualFrame frame, InternalMethod method, Object receiver, Object block, Object arguments) {
return callNode.call(
frame,
RubyArguments.pack(
method,
method.getDeclarationFrame(),
receiver,
(DynamicObject) block,
(Object[]) arguments));
}
}
Original file line number Diff line number Diff line change
@@ -17,7 +17,6 @@
import com.oracle.truffle.api.object.DynamicObject;

import org.jruby.truffle.nodes.RubyGuards;
import org.jruby.truffle.runtime.RubyArguments;
import org.jruby.truffle.runtime.RubyContext;
import org.jruby.truffle.runtime.layouts.Layouts;
import org.jruby.truffle.runtime.methods.InternalMethod;
@@ -101,14 +100,7 @@ public Object executeDispatch(

switch (getDispatchAction()) {
case CALL_METHOD:
return callNode.call(
frame,
RubyArguments.pack(
method,
method.getDeclarationFrame(),
expectedReceiver,
(DynamicObject) blockObject,
(Object[]) argumentsObjects));
return call(callNode, frame, method, expectedReceiver, blockObject, argumentsObjects);

case RESPOND_TO_METHOD:
return true;
Original file line number Diff line number Diff line change
@@ -15,7 +15,6 @@
import com.oracle.truffle.api.nodes.DirectCallNode;
import com.oracle.truffle.api.nodes.InvalidAssumptionException;
import com.oracle.truffle.api.object.DynamicObject;
import org.jruby.truffle.runtime.RubyArguments;
import org.jruby.truffle.runtime.RubyContext;
import org.jruby.truffle.runtime.layouts.Layouts;
import org.jruby.truffle.runtime.methods.InternalMethod;
@@ -90,13 +89,7 @@ public Object executeDispatch(

switch (getDispatchAction()) {
case CALL_METHOD:
return callNode.call(
frame,
RubyArguments.pack(
method,
method.getDeclarationFrame(),
receiverObject, (DynamicObject) blockObject,
(Object[]) argumentsObjects));
return call(callNode, frame, method, receiverObject, blockObject, argumentsObjects);

case RESPOND_TO_METHOD:
return true;
Original file line number Diff line number Diff line change
@@ -15,6 +15,7 @@
import com.oracle.truffle.api.nodes.IndirectCallNode;
import com.oracle.truffle.api.object.DynamicObject;
import com.oracle.truffle.api.utilities.BranchProfile;

import org.jruby.truffle.nodes.conversion.ToJavaStringNode;
import org.jruby.truffle.nodes.conversion.ToJavaStringNodeGen;
import org.jruby.truffle.nodes.conversion.ToSymbolNode;
@@ -32,7 +33,7 @@ public class UncachedDispatchNode extends DispatchNode {
private final boolean ignoreVisibility;
private final MissingBehavior missingBehavior;

@Child private IndirectCallNode callNode;
@Child private IndirectCallNode indirectCallNode;
@Child private ToSymbolNode toSymbolNode;
@Child private ToJavaStringNode toJavaStringNode;
@Child private MetaClassNode metaClassNode;
@@ -43,7 +44,7 @@ public UncachedDispatchNode(RubyContext context, boolean ignoreVisibility, Dispa
super(context, dispatchAction);
this.ignoreVisibility = ignoreVisibility;
this.missingBehavior = missingBehavior;
callNode = Truffle.getRuntime().createIndirectCallNode();
indirectCallNode = Truffle.getRuntime().createIndirectCallNode();
toSymbolNode = ToSymbolNodeGen.create(context, null, null);
toJavaStringNode = ToJavaStringNodeGen.create(context, null, null);
metaClassNode = MetaClassNodeGen.create(context, null, null);
@@ -65,20 +66,11 @@ public Object executeDispatch(

final DynamicObject callerClass = ignoreVisibility ? null : metaClassNode.executeMetaClass(frame, RubyArguments.getSelf(frame.getArguments()));

final InternalMethod method = lookup(callerClass, receiverObject, toJavaStringNode.executeJavaString(frame, name),
ignoreVisibility);
final InternalMethod method = lookup(callerClass, receiverObject, toJavaStringNode.executeJavaString(frame, name), ignoreVisibility);

if (method != null) {
if (dispatchAction == DispatchAction.CALL_METHOD) {
return callNode.call(
frame,
method.getCallTarget(),
RubyArguments.pack(
method,
method.getDeclarationFrame(),
receiverObject,
(DynamicObject) blockObject,
(Object[]) argumentsObjects));
return call(frame, method, receiverObject, blockObject, argumentsObjects);
} else if (dispatchAction == DispatchAction.RESPOND_TO_METHOD) {
return true;
} else {
@@ -113,20 +105,24 @@ public Object executeDispatch(

ArrayUtils.arraycopy(argumentsObjectsArray, 0, modifiedArgumentsObjects, 1, argumentsObjectsArray.length);

return callNode.call(
frame,
missingMethod.getCallTarget(),
RubyArguments.pack(
missingMethod,
missingMethod.getDeclarationFrame(),
receiverObject,
(DynamicObject) blockObject,
modifiedArgumentsObjects));
return call(frame, missingMethod, receiverObject, blockObject, modifiedArgumentsObjects);
} else if (dispatchAction == DispatchAction.RESPOND_TO_METHOD) {
return false;
} else {
throw new UnsupportedOperationException();
}
}

private Object call(VirtualFrame frame, InternalMethod method, Object receiverObject, Object blockObject, Object argumentsObjects) {
return indirectCallNode.call(
frame,
method.getCallTarget(),
RubyArguments.pack(
method,
method.getDeclarationFrame(),
receiverObject,
(DynamicObject) blockObject,
(Object[]) argumentsObjects));
}

}

0 comments on commit 10dbca4

Please sign in to comment.