Skip to content

Commit 3e4afce

Browse files
committed
Refactor to remove logic duplication.
1 parent 48bcd61 commit 3e4afce

File tree

1 file changed

+7
-32
lines changed

1 file changed

+7
-32
lines changed

src/main/java/org/truffleruby/cext/CExtNodes.java

Lines changed: 7 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,9 @@
4444
import org.truffleruby.builtins.Primitive;
4545
import org.truffleruby.builtins.PrimitiveArrayArgumentsNode;
4646
import org.truffleruby.builtins.YieldingCoreMethodNode;
47+
import org.truffleruby.cext.CExtNodesFactory.CallCWithMutexNodeFactory;
4748
import org.truffleruby.cext.CExtNodesFactory.StringToNativeNodeGen;
49+
import org.truffleruby.cext.CExtNodesFactory.CallCWithMutexNodeFactory.CallCWithMutexNodeGen;
4850
import org.truffleruby.core.CoreLibrary;
4951
import org.truffleruby.core.MarkingServiceNodes;
5052
import org.truffleruby.core.MarkingService.ExtensionCallStack;
@@ -117,6 +119,8 @@ public class CExtNodes {
117119
@Primitive(name = "call_with_c_mutex")
118120
public abstract static class CallCWithMutexNode extends PrimitiveArrayArgumentsNode {
119121

122+
public abstract Object execute(TruffleObject receiverm, DynamicObject argsArray);
123+
120124
@Specialization
121125
public Object callCWithMutex(TruffleObject receiver, DynamicObject argsArray,
122126
@Cached("create()") ArrayToObjectArrayNode arrayToObjectArrayNode,
@@ -160,49 +164,20 @@ private Object execute(TruffleObject receiver, Object[] args, Node executeNode,
160164
@Primitive(name = "call_with_c_mutex_and_frame")
161165
public abstract static class CallCWithMuteAndFramexNode extends PrimitiveArrayArgumentsNode {
162166

167+
@Child protected CallCWithMutexNode callCextNode = CallCWithMutexNodeFactory.create(EMPTY_ARRAY);
168+
163169
@Specialization
164170
public Object callCWithMutex(VirtualFrame frame, TruffleObject receiver, DynamicObject argsArray, DynamicObject block,
165-
@Cached("create()") ArrayToObjectArrayNode arrayToObjectArrayNode,
166-
@Cached("EXECUTE.createNode()") Node executeNode,
167-
@Cached("create()") BranchProfile exceptionProfile,
168-
@Cached("createBinaryProfile()") ConditionProfile ownedProfile,
169171
@Cached("create()") MarkingServiceNodes.GetMarkerThreadLocalDataNode getDataNode) {
170-
final Object[] args = arrayToObjectArrayNode.executeToObjectArray(argsArray);
171172
ExtensionCallStack extensionStack = getDataNode.execute(frame).getExtensionCallStack();
172173
extensionStack.push(block);
173174

174175
try {
175-
if (getContext().getOptions().CEXT_LOCK) {
176-
final ReentrantLock lock = getContext().getCExtensionsLock();
177-
boolean owned = lock.isHeldByCurrentThread();
178-
179-
if (ownedProfile.profile(!owned)) {
180-
MutexOperations.lockInternal(getContext(), lock, this);
181-
try {
182-
return execute(receiver, args, executeNode, exceptionProfile);
183-
} finally {
184-
MutexOperations.unlockInternal(lock);
185-
}
186-
} else {
187-
return execute(receiver, args, executeNode, exceptionProfile);
188-
}
189-
} else {
190-
return execute(receiver, args, executeNode, exceptionProfile);
191-
}
176+
return callCextNode.execute(receiver, argsArray);
192177
} finally {
193178
extensionStack.pop();
194179
}
195180
}
196-
197-
private Object execute(TruffleObject receiver, Object[] args, Node executeNode, BranchProfile exceptionProfile) {
198-
try {
199-
return ForeignAccess.sendExecute(executeNode, receiver, args);
200-
} catch (UnsupportedTypeException | ArityException | UnsupportedMessageException e) {
201-
exceptionProfile.enter();
202-
throw new JavaException(e);
203-
}
204-
}
205-
206181
}
207182

208183
@ImportStatic(Message.class)

0 commit comments

Comments
 (0)