Skip to content

Commit c11a546

Browse files
committed
Throw a NoMethodError if RubyContext#send does not find the method
1 parent 9671b36 commit c11a546

File tree

1 file changed

+19
-6
lines changed

1 file changed

+19
-6
lines changed

src/main/java/org/truffleruby/RubyContext.java

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@
4545
import org.truffleruby.core.hash.ReHashable;
4646
import org.truffleruby.core.inlined.CoreMethods;
4747
import org.truffleruby.core.kernel.AtExitManager;
48+
import org.truffleruby.core.kernel.KernelNodes;
4849
import org.truffleruby.core.kernel.TraceManager;
4950
import org.truffleruby.core.module.ModuleOperations;
5051
import org.truffleruby.core.module.RubyModule;
@@ -433,24 +434,36 @@ private TruffleNFIPlatform createNativePlatform() {
433434
}
434435

435436
@TruffleBoundary
436-
public static Object send(Object object, String methodName, Object... arguments) {
437+
public static Object send(Object receiver, String methodName, Object... arguments) {
437438
final InternalMethod method = ModuleOperations
438-
.lookupMethodUncached(MetaClassNode.getUncached().execute(object), methodName, null);
439+
.lookupMethodUncached(MetaClassNode.getUncached().execute(receiver), methodName, null);
439440
if (method == null || method.isUndefined()) {
440-
return null;
441+
final RubyContext context = RubyLanguage.getCurrentContext();
442+
final String message = String.format(
443+
"undefined method `%s' for %s when using RubyContext#send() which ignores #method_missing",
444+
methodName,
445+
KernelNodes.ToSNode.uncachedBasicToS(receiver));
446+
throw new RaiseException(
447+
context,
448+
context.getCoreExceptions().noMethodError(
449+
message,
450+
receiver,
451+
methodName,
452+
arguments,
453+
EncapsulatingNodeReference.getCurrent().get()));
441454
}
442455

443456
return IndirectCallNode.getUncached().call(
444457
method.getCallTarget(),
445-
RubyArguments.pack(null, null, method, null, object, Nil.INSTANCE, arguments));
458+
RubyArguments.pack(null, null, method, null, receiver, Nil.INSTANCE, arguments));
446459
}
447460

448461
@TruffleBoundary
449-
public static Object send(Node currentNode, Object object, String methodName, Object... arguments) {
462+
public static Object send(Node currentNode, Object receiver, String methodName, Object... arguments) {
450463
final EncapsulatingNodeReference callNodeRef = EncapsulatingNodeReference.getCurrent();
451464
final Node prev = callNodeRef.set(currentNode);
452465
try {
453-
return send(object, methodName, arguments);
466+
return send(receiver, methodName, arguments);
454467
} finally {
455468
callNodeRef.set(prev);
456469
}

0 commit comments

Comments
 (0)