10
10
package org .truffleruby .core ;
11
11
12
12
import java .lang .ref .ReferenceQueue ;
13
- import java .util .concurrent .locks .ReentrantLock ;
14
13
15
14
import org .truffleruby .RubyContext ;
16
15
import org .truffleruby .RubyLanguage ;
17
16
import org .truffleruby .cext .DataHolder ;
18
17
import org .truffleruby .core .MarkingService .ExtensionCallStack ;
19
- import org .truffleruby .core . mutex . MutexOperations ;
18
+ import org .truffleruby .language . Nil ;
20
19
import org .truffleruby .language .RubyBaseRootNode ;
21
20
import org .truffleruby .language .backtrace .InternalRootNode ;
22
21
23
22
import com .oracle .truffle .api .CallTarget ;
23
+ import com .oracle .truffle .api .CompilerDirectives ;
24
+ import com .oracle .truffle .api .CompilerDirectives .TruffleBoundary ;
24
25
import com .oracle .truffle .api .interop .ArityException ;
25
26
import com .oracle .truffle .api .interop .InteropLibrary ;
26
27
import com .oracle .truffle .api .interop .UnsupportedMessageException ;
27
28
import com .oracle .truffle .api .interop .UnsupportedTypeException ;
28
- import com .oracle .truffle .api .profiles .ConditionProfile ;
29
29
import com .oracle .truffle .api .frame .VirtualFrame ;
30
30
31
31
/** Finalizers are implemented with phantom references and reference queues, and are run in a dedicated Ruby thread. */
@@ -41,14 +41,13 @@ public DataObjectFinalizerRootNode(
41
41
RubyLanguage language ) {
42
42
super (language , RubyLanguage .EMPTY_FRAME_DESCRIPTOR , null );
43
43
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 );
47
46
}
48
47
49
48
@ Override
50
49
public Object execute (VirtualFrame frame ) {
51
- return null ;
50
+ return execute (( DataObjectFinalizerReference ) frame . getArguments ()[ 0 ]) ;
52
51
}
53
52
54
53
public Object execute (DataObjectFinalizerReference ref ) {
@@ -60,17 +59,17 @@ public Object execute(DataObjectFinalizerReference ref) {
60
59
}
61
60
}
62
61
} catch (UnsupportedTypeException | ArityException | UnsupportedMessageException e ) {
63
- throw new Error ( e );
62
+ throw CompilerDirectives . shouldNotReachHere ( "Data holder finalization on invalid object" );
64
63
}
65
- return null ;
64
+ return Nil . INSTANCE ;
66
65
}
67
66
}
68
67
69
- private final DataObjectFinalizerRootNode rootNode ;
68
+ private final CallTarget callTarget ;
70
69
71
70
public DataObjectFinalizationService (RubyLanguage language , ReferenceQueue <Object > processingQueue ) {
72
71
super (processingQueue );
73
- rootNode = new DataObjectFinalizerRootNode (language );
72
+ callTarget = new DataObjectFinalizerRootNode (language ). getCallTarget ( );
74
73
}
75
74
76
75
public DataObjectFinalizationService (RubyLanguage language , ReferenceProcessor referenceProcessor ) {
@@ -104,12 +103,13 @@ protected void processReference(RubyContext context, RubyLanguage language,
104
103
(DataObjectFinalizerReference ) finalizerReference );
105
104
}
106
105
106
+ @ TruffleBoundary
107
107
protected void processReferenceInternal (RubyContext context , RubyLanguage language ,
108
108
DataObjectFinalizerReference ref ) {
109
109
final ExtensionCallStack stack = language .getCurrentThread ().getCurrentFiber ().extensionCallStack ;
110
110
stack .push (false , stack .getSpecialVariables (), stack .getBlock ());
111
111
try {
112
- rootNode . execute ( ref );
112
+ callTarget . call ( new Object []{ ref } );
113
113
} finally {
114
114
stack .pop ();
115
115
}
0 commit comments