@@ -89,7 +89,8 @@ struct RewrittenOp {
89
89
bool needs_inline_cache;
90
90
};
91
91
92
- static RewrittenOp rewriteOperation (const Function& function, BytecodeOp op,
92
+ static RewrittenOp rewriteOperation (Thread* thread, const Function& function,
93
+ BytecodeOp op,
93
94
bool use_load_fast_reverse_unchecked) {
94
95
auto cached_binop = [](Interpreter::BinaryOp bin_op) {
95
96
return RewrittenOp{BINARY_OP_ANAMORPHIC, static_cast <int32_t >(bin_op),
@@ -178,6 +179,22 @@ static RewrittenOp rewriteOperation(const Function& function, BytecodeOp op,
178
179
return cached_inplace (Interpreter::BinaryOp::XOR);
179
180
case LOAD_ATTR:
180
181
return RewrittenOp{LOAD_ATTR_ANAMORPHIC, op.arg , true };
182
+ case LOAD_GLOBAL: {
183
+ RawObject module = function.moduleObject ();
184
+ if (module.isModule () &&
185
+ Module::cast (module).id () == thread->runtime ()->builtinsModuleId ()) {
186
+ RawTuple names = Tuple::cast (Code::cast (function.code ()).names ());
187
+ RawStr name = Str::cast (names.at (op.arg ));
188
+ if (name.equalsCStr (" _Unbound" )) {
189
+ DCHECK (Unbound::object () ==
190
+ objectFromOparg (opargFromObject (Unbound::object ())),
191
+ " Expected to be able to fit _Unbound in a byte" );
192
+ return RewrittenOp{LOAD_IMMEDIATE, opargFromObject (Unbound::object ()),
193
+ false };
194
+ }
195
+ }
196
+ break ;
197
+ }
181
198
case LOAD_FAST: {
182
199
CHECK (op.arg < Code::cast (function.code ()).nlocals (),
183
200
" unexpected local number" );
@@ -305,7 +322,7 @@ void rewriteBytecode(Thread* thread, const Function& function) {
305
322
use_load_fast_reverse_unchecked = false ;
306
323
continue ;
307
324
}
308
- RewrittenOp rewritten = rewriteOperation (function, op, false );
325
+ RewrittenOp rewritten = rewriteOperation (thread, function, op, false );
309
326
if (rewritten.needs_inline_cache ) {
310
327
num_caches++;
311
328
}
@@ -326,7 +343,7 @@ void rewriteBytecode(Thread* thread, const Function& function) {
326
343
BytecodeOp op = nextBytecodeOp (bytecode, &i);
327
344
word previous_index = i - 1 ;
328
345
RewrittenOp rewritten =
329
- rewriteOperation (function, op, use_load_fast_reverse_unchecked);
346
+ rewriteOperation (thread, function, op, use_load_fast_reverse_unchecked);
330
347
if (rewritten.bc == UNUSED_BYTECODE_0) continue ;
331
348
if (rewritten.needs_inline_cache ) {
332
349
rewrittenBytecodeOpAtPut (bytecode, previous_index, rewritten.bc );
0 commit comments