44
44
import static com .oracle .graal .python .util .PythonUtils .tsLiteral ;
45
45
46
46
import com .oracle .graal .python .builtins .PythonBuiltinClassType ;
47
+ import com .oracle .graal .python .builtins .objects .dict .PDict ;
47
48
import com .oracle .graal .python .builtins .objects .module .PythonModule ;
48
49
import com .oracle .graal .python .lib .PyCallableCheckNode ;
49
50
import com .oracle .graal .python .lib .PyObjectGetAttr ;
50
51
import com .oracle .graal .python .nodes .ErrorMessages ;
51
- import com .oracle .graal .python .nodes .PGuards ;
52
52
import com .oracle .graal .python .nodes .PRaiseNode ;
53
53
import com .oracle .graal .python .runtime .PythonContext ;
54
54
import com .oracle .truffle .api .dsl .Bind ;
61
61
62
62
public class PickleState {
63
63
// copyreg.dispatch_table, {type_object: pickling_function}
64
- Object dispatchTable ;
64
+ PDict dispatchTable ;
65
65
66
66
// For the extension opcodes EXT1, EXT2 and EXT4.
67
67
// copyreg._extension_registry, {(module_name, function_name): code}
68
- Object extensionRegistry ;
68
+ PDict extensionRegistry ;
69
69
// copyreg._extension_cache, {code: object}
70
- Object extensionCache ;
70
+ PDict extensionCache ;
71
71
// copyreg._inverted_registry, {code: (module_name, function_name)}
72
- Object invertedRegistry ;
72
+ PDict invertedRegistry ;
73
73
74
74
// codecs.encode, used for saving bytes in older protocols
75
75
Object codecsEncode ;
@@ -81,12 +81,12 @@ public class PickleState {
81
81
82
82
// Import mappings for compatibility with Python 2.x
83
83
// * _compat_pickle.NAME_MAPPING, {(oldmodule, oldname): (newmodule, newname)}
84
- Object nameMapping2To3 ;
84
+ PDict nameMapping2To3 ;
85
85
// _compat_pickle.IMPORT_MAPPING, {oldmodule: newmodule}
86
- Object importMapping2To3 ;
86
+ PDict importMapping2To3 ;
87
87
// Same, but with REVERSE_NAME_MAPPING / REVERSE_IMPORT_MAPPING
88
- Object nameMapping3To2 ;
89
- Object importMapping3To2 ;
88
+ PDict nameMapping3To2 ;
89
+ PDict importMapping3To2 ;
90
90
91
91
@ GenerateUncached
92
92
@ GenerateInline (false ) // footprint reduction 36 -> 18
@@ -106,57 +106,75 @@ void init(PickleState state,
106
106
final PythonModule builtins = context .getBuiltins ();
107
107
state .getattr = getAttr .execute (null , inliningTarget , builtins , T_GETATTR );
108
108
109
- final Object copyreg = importModule (PickleUtils .T_MOD_COPYREG );
110
- state .dispatchTable = getAttr .execute (null , inliningTarget , copyreg , PickleUtils .T_ATTR_DISPATCH_TABLE );
111
- if (!PGuards .isDict (state .dispatchTable )) {
112
- throw raiseNode .get (inliningTarget ).raise (PythonBuiltinClassType .RuntimeError , ErrorMessages .S_SHOULD_BE_A_S_NOT_A_P , "copyreg.dispatch_table" , "dict" , state .dispatchTable );
109
+ var copyreg = importModule (PickleUtils .T_MOD_COPYREG );
110
+ var dispatchTable = getAttr .execute (null , inliningTarget , copyreg , PickleUtils .T_ATTR_DISPATCH_TABLE );
111
+ if (dispatchTable instanceof PDict dispatchTableDict ) {
112
+ state .dispatchTable = dispatchTableDict ;
113
+ } else {
114
+ throw raiseNode .get (inliningTarget ).raise (PythonBuiltinClassType .RuntimeError , ErrorMessages .S_SHOULD_BE_A_S_NOT_A_P , "copyreg.dispatch_table" , "dict" , dispatchTable );
113
115
}
114
116
115
- state .extensionRegistry = getAttr .execute (null , inliningTarget , copyreg , PickleUtils .T_ATTR_EXT_REGISTRY );
116
- if (!PGuards .isDict (state .extensionRegistry )) {
117
- throw raiseNode .get (inliningTarget ).raise (PythonBuiltinClassType .RuntimeError , ErrorMessages .S_SHOULD_BE_A_S_NOT_A_P , "copyreg._extension_registry" , "dict" , state .extensionRegistry );
117
+ var extensionRegistry = getAttr .execute (null , inliningTarget , copyreg , PickleUtils .T_ATTR_EXT_REGISTRY );
118
+ if (extensionRegistry instanceof PDict extensionRegistryDict ) {
119
+ state .extensionRegistry = extensionRegistryDict ;
120
+ } else {
121
+ throw raiseNode .get (inliningTarget ).raise (PythonBuiltinClassType .RuntimeError , ErrorMessages .S_SHOULD_BE_A_S_NOT_A_P , "copyreg._extension_registry" , "dict" , extensionRegistry );
118
122
}
119
123
120
- state .invertedRegistry = getAttr .execute (null , inliningTarget , copyreg , PickleUtils .T_ATTR_INV_REGISTRY );
121
- if (!PGuards .isDict (state .invertedRegistry )) {
122
- throw raiseNode .get (inliningTarget ).raise (PythonBuiltinClassType .RuntimeError , ErrorMessages .S_SHOULD_BE_A_S_NOT_A_P , "copyreg._inverted_registry" , "dict" , state .invertedRegistry );
124
+ var invertedRegistry = getAttr .execute (null , inliningTarget , copyreg , PickleUtils .T_ATTR_INV_REGISTRY );
125
+ if (invertedRegistry instanceof PDict invertedRegistryDict ) {
126
+ state .invertedRegistry = invertedRegistryDict ;
127
+ } else {
128
+ throw raiseNode .get (inliningTarget ).raise (PythonBuiltinClassType .RuntimeError , ErrorMessages .S_SHOULD_BE_A_S_NOT_A_P , "copyreg._inverted_registry" , "dict" , invertedRegistry );
123
129
}
124
130
125
- state .extensionCache = getAttr .execute (null , inliningTarget , copyreg , PickleUtils .T_ATTR_EXT_CACHE );
126
- if (!PGuards .isDict (state .extensionCache )) {
127
- throw raiseNode .get (inliningTarget ).raise (PythonBuiltinClassType .RuntimeError , ErrorMessages .S_SHOULD_BE_A_S_NOT_A_P , "copyreg._extension_cache" , "dict" , state .extensionCache );
131
+ var extensionCache = getAttr .execute (null , inliningTarget , copyreg , PickleUtils .T_ATTR_EXT_CACHE );
132
+ if (extensionCache instanceof PDict extensionCacheDict ) {
133
+ state .extensionCache = extensionCacheDict ;
134
+ } else {
135
+ throw raiseNode .get (inliningTarget ).raise (PythonBuiltinClassType .RuntimeError , ErrorMessages .S_SHOULD_BE_A_S_NOT_A_P , "copyreg._extension_cache" , "dict" , extensionCache );
128
136
}
129
137
130
138
final Object codecs = importModule (PickleUtils .T_MOD_CODECS );
131
- state .codecsEncode = getAttr .execute (null , inliningTarget , codecs , PickleUtils .T_METHOD_ENCODE );
132
- if (!callableCheck .execute (inliningTarget , state .codecsEncode )) {
133
- throw raiseNode .get (inliningTarget ).raise (PythonBuiltinClassType .RuntimeError , ErrorMessages .S_SHOULD_BE_A_S_NOT_A_P , "codecs.encode" , "callable" , state .codecsEncode );
139
+ var codecsEncode = getAttr .execute (null , inliningTarget , codecs , PickleUtils .T_METHOD_ENCODE );
140
+ if (callableCheck .execute (inliningTarget , codecsEncode )) {
141
+ state .codecsEncode = codecsEncode ;
142
+ } else {
143
+ throw raiseNode .get (inliningTarget ).raise (PythonBuiltinClassType .RuntimeError , ErrorMessages .S_SHOULD_BE_A_S_NOT_A_P , "codecs.encode" , "callable" , codecsEncode );
134
144
}
135
145
136
146
final Object functools = importModule (PickleUtils .T_MOD_FUNCTOOLS );
137
147
state .partial = getAttr .execute (null , inliningTarget , functools , PickleUtils .T_METHOD_PARTIAL );
138
148
139
149
// Load the 2.x -> 3.x stdlib module mapping tables
140
150
Object compatPickle = importModule (PickleUtils .T_MOD_COMPAT_PICKLE );
141
- state .nameMapping2To3 = getAttr .execute (null , inliningTarget , compatPickle , PickleUtils .T_ATTR_NAME_MAPPING );
142
- if (!PGuards .isDict (state .nameMapping2To3 )) {
143
- throw raiseNode .get (inliningTarget ).raise (PythonBuiltinClassType .RuntimeError , ErrorMessages .S_SHOULD_BE_A_S_NOT_A_P , PickleUtils .T_CP_NAME_MAPPING , "dict" , state .nameMapping2To3 );
151
+ var nameMapping2To3 = getAttr .execute (null , inliningTarget , compatPickle , PickleUtils .T_ATTR_NAME_MAPPING );
152
+ if (nameMapping2To3 instanceof PDict nameMapping2To3Dict ) {
153
+ state .nameMapping2To3 = nameMapping2To3Dict ;
154
+ } else {
155
+ throw raiseNode .get (inliningTarget ).raise (PythonBuiltinClassType .RuntimeError , ErrorMessages .S_SHOULD_BE_A_S_NOT_A_P , PickleUtils .T_CP_NAME_MAPPING , "dict" , nameMapping2To3 );
144
156
}
145
- state .importMapping2To3 = getAttr .execute (null , inliningTarget , compatPickle , PickleUtils .T_ATTR_IMPORT_MAPPING );
146
- if (!PGuards .isDict (state .nameMapping2To3 )) {
147
- throw raiseNode .get (inliningTarget ).raise (PythonBuiltinClassType .RuntimeError , ErrorMessages .S_SHOULD_BE_A_S_NOT_A_P , PickleUtils .T_CP_IMPORT_MAPPING , "dict" , state .importMapping2To3 );
157
+
158
+ var importMapping2To3 = getAttr .execute (null , inliningTarget , compatPickle , PickleUtils .T_ATTR_IMPORT_MAPPING );
159
+ if (importMapping2To3 instanceof PDict importMapping2To3Dict ) {
160
+ state .importMapping2To3 = importMapping2To3Dict ;
161
+ } else {
162
+ throw raiseNode .get (inliningTarget ).raise (PythonBuiltinClassType .RuntimeError , ErrorMessages .S_SHOULD_BE_A_S_NOT_A_P , PickleUtils .T_CP_IMPORT_MAPPING , "dict" , importMapping2To3 );
148
163
}
149
164
150
165
// ... and the 3.x -> 2.x mapping tables
151
- state .nameMapping3To2 = getAttr .execute (null , inliningTarget , compatPickle , PickleUtils .T_ATTR_REVERSE_NAME_MAPPING );
152
- if (!PGuards .isDict (state .nameMapping2To3 )) {
153
- throw raiseNode .get (inliningTarget ).raise (PythonBuiltinClassType .RuntimeError , ErrorMessages .S_SHOULD_BE_A_S_NOT_A_P , PickleUtils .T_CP_REVERSE_NAME_MAPPING , "dict" ,
154
- state .nameMapping3To2 );
166
+ var nameMapping3To2 = getAttr .execute (null , inliningTarget , compatPickle , PickleUtils .T_ATTR_REVERSE_NAME_MAPPING );
167
+ if (nameMapping3To2 instanceof PDict nameMapping3To2Dict ) {
168
+ state .nameMapping3To2 = nameMapping3To2Dict ;
169
+ } else {
170
+ throw raiseNode .get (inliningTarget ).raise (PythonBuiltinClassType .RuntimeError , ErrorMessages .S_SHOULD_BE_A_S_NOT_A_P , PickleUtils .T_CP_REVERSE_NAME_MAPPING , "dict" , nameMapping3To2 );
155
171
}
156
- state .importMapping3To2 = getAttr .execute (null , inliningTarget , compatPickle , PickleUtils .T_ATTR_REVERSE_IMPORT_MAPPING );
157
- if (!PGuards .isDict (state .nameMapping2To3 )) {
172
+ var importMapping3To2 = getAttr .execute (null , inliningTarget , compatPickle , PickleUtils .T_ATTR_REVERSE_IMPORT_MAPPING );
173
+ if (importMapping3To2 instanceof PDict importMapping3To2Dict ) {
174
+ state .importMapping3To2 = importMapping3To2Dict ;
175
+ } else {
158
176
throw raiseNode .get (inliningTarget ).raise (PythonBuiltinClassType .RuntimeError , ErrorMessages .S_SHOULD_BE_A_S_NOT_A_P , PickleUtils .T_CP_REVERSE_IMPORT_MAPPING , "dict" ,
159
- state . importMapping3To2 );
177
+ importMapping3To2 );
160
178
}
161
179
}
162
180
}
0 commit comments