Skip to content

Commit dfb89a3

Browse files
committed
Replace Primitive.call_with_c_mutex with Primitive.interop_execute where it is the same behavior
1 parent 08187f1 commit dfb89a3

File tree

2 files changed

+27
-12
lines changed

2 files changed

+27
-12
lines changed

lib/truffle/truffle/cext.rb

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1004,11 +1004,11 @@ def rb_jump_tag(pos)
10041004
end
10051005

10061006
def rb_yield(value)
1007-
Primitive.call_with_c_mutex(rb_block_proc, [value])
1007+
Primitive.interop_execute(rb_block_proc, [value])
10081008
end
10091009

10101010
def rb_yield_splat(values)
1011-
Primitive.call_with_c_mutex(rb_block_proc, values)
1011+
Primitive.interop_execute(rb_block_proc, values)
10121012
end
10131013

10141014
def rb_ivar_lookup(object, name, default_value)
@@ -1161,7 +1161,9 @@ def rb_enumeratorize(obj, meth, args)
11611161

11621162
def rb_enumeratorize_with_size(obj, meth, args, size_fn)
11631163
return rb_enumeratorize(obj, meth, args) if size_fn.nil?
1164-
enum = obj.to_enum(meth, *args) { Primitive.cext_unwrap(Primitive.call_with_c_mutex(size_fn, [Primitive.cext_wrap(obj), Primitive.cext_wrap(args), Primitive.cext_wrap(enum)])) }
1164+
enum = obj.to_enum(meth, *args) do
1165+
Primitive.cext_unwrap(Primitive.call_with_c_mutex(size_fn, [Primitive.cext_wrap(obj), Primitive.cext_wrap(args), Primitive.cext_wrap(enum)]))
1166+
end
11651167
enum
11661168
end
11671169

@@ -1305,7 +1307,7 @@ def rb_mutex_sleep(mutex, timeout)
13051307

13061308
def rb_mutex_synchronize(mutex, func, arg)
13071309
mutex.synchronize do
1308-
Primitive.cext_unwrap(Primitive.call_with_c_mutex(func, [Primitive.cext_wrap(arg)]))
1310+
Primitive.cext_unwrap(Primitive.interop_execute(func, [Primitive.cext_wrap(arg)]))
13091311
end
13101312
end
13111313

@@ -1461,41 +1463,41 @@ def rb_module_new
14611463

14621464
def rb_ensure(b_proc, data1, e_proc, data2)
14631465
begin
1464-
Primitive.call_with_c_mutex(b_proc, [data1])
1466+
Primitive.interop_execute(b_proc, [data1])
14651467
ensure
1466-
Primitive.call_with_c_mutex(e_proc, [data2])
1468+
Primitive.interop_execute(e_proc, [data2])
14671469
end
14681470
end
14691471

14701472
def rb_rescue(b_proc, data1, r_proc, data2)
14711473
begin
1472-
Primitive.call_with_c_mutex(b_proc, [data1])
1474+
Primitive.interop_execute(b_proc, [data1])
14731475
rescue StandardError => e
14741476
if Truffle::Interop.null?(r_proc)
14751477
Primitive.cext_wrap(nil)
14761478
else
1477-
Primitive.call_with_c_mutex(r_proc, [data2, Primitive.cext_wrap(e)])
1479+
Primitive.interop_execute(r_proc, [data2, Primitive.cext_wrap(e)])
14781480
end
14791481
end
14801482
end
14811483

14821484
def rb_rescue2(b_proc, data1, r_proc, data2, rescued)
14831485
begin
1484-
Primitive.call_with_c_mutex(b_proc, [data1])
1486+
Primitive.interop_execute(b_proc, [data1])
14851487
rescue *rescued => e
1486-
Primitive.call_with_c_mutex(r_proc, [data2, Primitive.cext_wrap(e)])
1488+
Primitive.interop_execute(r_proc, [data2, Primitive.cext_wrap(e)])
14871489
end
14881490
end
14891491

14901492
def rb_exec_recursive(func, obj, arg)
14911493
result = nil
14921494

14931495
recursive = Truffle::ThreadOperations.detect_recursion(obj) do
1494-
result = Primitive.cext_unwrap(Primitive.call_with_c_mutex(func, [Primitive.cext_wrap(obj), Primitive.cext_wrap(arg), 0]))
1496+
result = Primitive.cext_unwrap(Primitive.interop_execute(func, [Primitive.cext_wrap(obj), Primitive.cext_wrap(arg), 0]))
14951497
end
14961498

14971499
if recursive
1498-
Primitive.cext_unwrap(Primitive.call_with_c_mutex(func, [Primitive.cext_wrap(obj), Primitive.cext_wrap(arg), 1]))
1500+
Primitive.cext_unwrap(Primitive.interop_execute(func, [Primitive.cext_wrap(obj), Primitive.cext_wrap(arg), 1]))
14991501
else
15001502
result
15011503
end

src/main/java/org/truffleruby/interop/InteropNodes.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
import org.truffleruby.builtins.Primitive;
3131
import org.truffleruby.builtins.PrimitiveArrayArgumentsNode;
3232
import org.truffleruby.core.array.ArrayGuards;
33+
import org.truffleruby.core.array.ArrayToObjectArrayNode;
3334
import org.truffleruby.core.array.ArrayUtils;
3435
import org.truffleruby.core.array.RubyArray;
3536
import org.truffleruby.core.array.library.ArrayStoreLibrary;
@@ -129,6 +130,18 @@ private static String[] publicInteropLibraryMethods() {
129130

130131
}
131132

133+
@Primitive(name = "interop_execute")
134+
public abstract static class InteropExecuteNode extends InteropPrimitiveArrayArgumentsNode {
135+
@Specialization(limit = "getCacheLimit()")
136+
protected Object executeWithoutConversion(Object receiver, RubyArray argsArray,
137+
@CachedLibrary("receiver") InteropLibrary receivers,
138+
@Cached ArrayToObjectArrayNode arrayToObjectArrayNode,
139+
@Cached TranslateInteropExceptionNode translateInteropException) {
140+
final Object[] args = arrayToObjectArrayNode.executeToObjectArray(argsArray);
141+
return InteropNodes.execute(receiver, args, receivers, translateInteropException);
142+
}
143+
}
144+
132145
@Primitive(name = "dispatch_missing")
133146
public abstract static class DispatchMissingNode extends PrimitiveArrayArgumentsNode {
134147

0 commit comments

Comments
 (0)