5454import static com .oracle .graal .python .runtime .exception .PythonErrorType .LookupError ;
5555import static com .oracle .graal .python .runtime .exception .PythonErrorType .TypeError ;
5656
57+ import com .oracle .graal .python .PythonLanguage ;
5758import com .oracle .graal .python .builtins .modules .codecs .ErrorHandlersFactory .BackslashReplaceErrorHandlerNodeFactory ;
5859import com .oracle .graal .python .builtins .modules .codecs .ErrorHandlersFactory .IgnoreErrorHandlerNodeFactory ;
5960import com .oracle .graal .python .builtins .modules .codecs .ErrorHandlersFactory .NameReplaceErrorHandlerNodeFactory ;
6768import com .oracle .graal .python .nodes .PRaiseNode ;
6869import com .oracle .graal .python .nodes .function .PythonBuiltinBaseNode ;
6970import com .oracle .graal .python .nodes .statement .AbstractImportNode ;
71+ import com .oracle .graal .python .runtime .ExecutionContext ;
72+ import com .oracle .graal .python .runtime .IndirectCallData ;
7073import com .oracle .graal .python .runtime .PythonContext ;
7174import com .oracle .graal .python .util .PythonUtils ;
72- import com .oracle .truffle .api .CompilerDirectives ;
7375import com .oracle .truffle .api .CompilerDirectives .TruffleBoundary ;
7476import com .oracle .truffle .api .dsl .Cached ;
7577import com .oracle .truffle .api .dsl .Cached .Shared ;
7678import com .oracle .truffle .api .dsl .GenerateCached ;
7779import com .oracle .truffle .api .dsl .GenerateInline ;
80+ import com .oracle .truffle .api .dsl .GenerateUncached ;
7881import com .oracle .truffle .api .dsl .NodeFactory ;
7982import com .oracle .truffle .api .dsl .Specialization ;
83+ import com .oracle .truffle .api .frame .Frame ;
84+ import com .oracle .truffle .api .frame .VirtualFrame ;
8085import com .oracle .truffle .api .nodes .Node ;
8186import com .oracle .truffle .api .profiles .InlinedConditionProfile ;
8287import com .oracle .truffle .api .strings .TruffleString ;
@@ -88,14 +93,15 @@ public final class CodecsRegistry {
8893 @ GenerateCached (false )
8994 public abstract static class PyCodecLookupErrorNode extends Node {
9095
91- public abstract Object execute (Node inliningTarget , TruffleString name );
96+ public abstract Object execute (Frame frame , Node inliningTarget , TruffleString name );
9297
9398 @ Specialization
94- static Object lookup (Node inliningTarget , TruffleString name ,
99+ static Object lookup (VirtualFrame frame , Node inliningTarget , TruffleString name ,
100+ @ Cached CodecsRegistry .EnsureRegistryInitializedNode ensureRegistryInitializedNode ,
95101 @ Cached InlinedConditionProfile resultProfile ,
96102 @ Cached PRaiseNode raiseNode ) {
97103 PythonContext context = PythonContext .get (inliningTarget );
98- ensureRegistryInitialized ( context );
104+ ensureRegistryInitializedNode . execute ( frame , inliningTarget , context );
99105 if (name == null ) {
100106 name = T_STRICT ;
101107 }
@@ -112,13 +118,14 @@ static Object lookup(Node inliningTarget, TruffleString name,
112118 @ GenerateCached (false )
113119 public abstract static class PyCodecRegisterErrorNode extends Node {
114120
115- public abstract void execute (Node inliningTarget , TruffleString name , Object handler );
121+ public abstract void execute (VirtualFrame frame , Node inliningTarget , TruffleString name , Object handler );
116122
117123 @ Specialization (guards = "callableCheckNode.execute(inliningTarget, handler)" )
118- static void register (Node inliningTarget , TruffleString name , Object handler ,
119- @ SuppressWarnings ("unused" ) @ Cached @ Shared ("callableCheck" ) PyCallableCheckNode callableCheckNode ) {
124+ static void register (VirtualFrame frame , Node inliningTarget , TruffleString name , Object handler ,
125+ @ SuppressWarnings ("unused" ) @ Cached @ Shared ("callableCheck" ) PyCallableCheckNode callableCheckNode ,
126+ @ Cached CodecsRegistry .EnsureRegistryInitializedNode ensureRegistryInitializedNode ) {
120127 PythonContext context = PythonContext .get (inliningTarget );
121- ensureRegistryInitialized ( context );
128+ ensureRegistryInitializedNode . execute ( frame , inliningTarget , context );
122129 putErrorHandler (context , name , handler );
123130 }
124131
@@ -129,9 +136,27 @@ static void registerNoCallable(@SuppressWarnings("unused") Node inliningTarget,
129136 }
130137 }
131138
132- public static void ensureRegistryInitialized (PythonContext context ) {
133- if (CompilerDirectives .injectBranchProbability (CompilerDirectives .SLOWPATH_PROBABILITY , !context .isCodecsInitialized ())) {
134- doInitialize (context );
139+ @ GenerateInline
140+ @ GenerateCached (value = false )
141+ @ GenerateUncached
142+ public abstract static class EnsureRegistryInitializedNode extends Node {
143+ public abstract void execute (Frame frame , Node inliningTarget , PythonContext context );
144+
145+ @ Specialization (guards = "context.isCodecsInitialized()" )
146+ static void ensure (@ SuppressWarnings ("unused" ) PythonContext context ) {
147+ // nothing to do
148+ }
149+
150+ @ Specialization (guards = "!context.isCodecsInitialized()" )
151+ static void ensure (VirtualFrame frame , Node inliningTarget , PythonContext context ,
152+ @ Cached ("createFor($node)" ) IndirectCallData .BoundaryCallData boundaryCallData ) {
153+ PythonLanguage language = context .getLanguage (inliningTarget );
154+ Object savedState = ExecutionContext .BoundaryCallContext .enter (frame , language , context , boundaryCallData );
155+ try {
156+ doInitialize (context );
157+ } finally {
158+ ExecutionContext .BoundaryCallContext .exit (frame , language , context , savedState );
159+ }
135160 }
136161 }
137162
0 commit comments