Skip to content

Commit 1c1fdfc

Browse files
committed
Refactor data holder finalization service to use a call target.
1 parent 1466e57 commit 1c1fdfc

File tree

1 file changed

+12
-12
lines changed

1 file changed

+12
-12
lines changed

src/main/java/org/truffleruby/core/DataObjectFinalizationService.java

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -10,22 +10,22 @@
1010
package org.truffleruby.core;
1111

1212
import java.lang.ref.ReferenceQueue;
13-
import java.util.concurrent.locks.ReentrantLock;
1413

1514
import org.truffleruby.RubyContext;
1615
import org.truffleruby.RubyLanguage;
1716
import org.truffleruby.cext.DataHolder;
1817
import org.truffleruby.core.MarkingService.ExtensionCallStack;
19-
import org.truffleruby.core.mutex.MutexOperations;
18+
import org.truffleruby.language.Nil;
2019
import org.truffleruby.language.RubyBaseRootNode;
2120
import org.truffleruby.language.backtrace.InternalRootNode;
2221

2322
import com.oracle.truffle.api.CallTarget;
23+
import com.oracle.truffle.api.CompilerDirectives;
24+
import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
2425
import com.oracle.truffle.api.interop.ArityException;
2526
import com.oracle.truffle.api.interop.InteropLibrary;
2627
import com.oracle.truffle.api.interop.UnsupportedMessageException;
2728
import com.oracle.truffle.api.interop.UnsupportedTypeException;
28-
import com.oracle.truffle.api.profiles.ConditionProfile;
2929
import com.oracle.truffle.api.frame.VirtualFrame;
3030

3131
/** Finalizers are implemented with phantom references and reference queues, and are run in a dedicated Ruby thread. */
@@ -41,14 +41,13 @@ public DataObjectFinalizerRootNode(
4141
RubyLanguage language) {
4242
super(language, RubyLanguage.EMPTY_FRAME_DESCRIPTOR, null);
4343

44-
nullNode = InteropLibrary.getFactory().createDispatched(2);
45-
callNode = InteropLibrary.getFactory().createDispatched(2);
46-
adoptChildren();
44+
nullNode = InteropLibrary.getFactory().createDispatched(1);
45+
callNode = InteropLibrary.getFactory().createDispatched(1);
4746
}
4847

4948
@Override
5049
public Object execute(VirtualFrame frame) {
51-
return null;
50+
return execute((DataObjectFinalizerReference) frame.getArguments()[0]);
5251
}
5352

5453
public Object execute(DataObjectFinalizerReference ref) {
@@ -60,17 +59,17 @@ public Object execute(DataObjectFinalizerReference ref) {
6059
}
6160
}
6261
} catch (UnsupportedTypeException | ArityException | UnsupportedMessageException e) {
63-
throw new Error(e);
62+
throw CompilerDirectives.shouldNotReachHere("Data holder finalization on invalid object");
6463
}
65-
return null;
64+
return Nil.INSTANCE;
6665
}
6766
}
6867

69-
private final DataObjectFinalizerRootNode rootNode;
68+
private final CallTarget callTarget;
7069

7170
public DataObjectFinalizationService(RubyLanguage language, ReferenceQueue<Object> processingQueue) {
7271
super(processingQueue);
73-
rootNode = new DataObjectFinalizerRootNode(language);
72+
callTarget = new DataObjectFinalizerRootNode(language).getCallTarget();
7473
}
7574

7675
public DataObjectFinalizationService(RubyLanguage language, ReferenceProcessor referenceProcessor) {
@@ -104,12 +103,13 @@ protected void processReference(RubyContext context, RubyLanguage language,
104103
(DataObjectFinalizerReference) finalizerReference);
105104
}
106105

106+
@TruffleBoundary
107107
protected void processReferenceInternal(RubyContext context, RubyLanguage language,
108108
DataObjectFinalizerReference ref) {
109109
final ExtensionCallStack stack = language.getCurrentThread().getCurrentFiber().extensionCallStack;
110110
stack.push(false, stack.getSpecialVariables(), stack.getBlock());
111111
try {
112-
rootNode.execute(ref);
112+
callTarget.call(new Object[]{ ref });
113113
} finally {
114114
stack.pop();
115115
}

0 commit comments

Comments
 (0)