8000 py/compile: Fix emitting unused null object. · micropython/micropython@860c694 · GitHub
[go: up one dir, main page]

Skip to content

Commit 860c694

Browse files
committed
py/compile: Fix emitting unused null object.
This removes emitting an always null object that was left over from the previous star arg encoding scheme. The old scheme used to have two objects, a sequence and a map, but now there is just one object, an int that is used as bit flags. Signed-off-by: David Lechner <david@pybricks.com>
1 parent d6aa8de commit 860c694

File tree

5 files changed

+153
-154
lines changed

5 files changed

+153
-154
lines changed

py/compile.c

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2456,8 +2456,6 @@ STATIC void compile_trailer_paren_helper(compiler_t *comp, mp_parse_node_t pn_ar
24562456
if (star_flags != 0) {
24572457
// one extra object that contains the star_args map
24582458
EMIT_ARG(load_const_small_int, star_args);
2459-
// FIXME: delete this and update interpreter
2460-
EMIT(load_null);
24612459
}
24622460

24632461
// emit the function/method call

py/emitbc.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -710,7 +710,9 @@ void mp_emit_bc_make_closure(emit_t *emit, scope_t *scope, mp_uint_t n_closed_ov
710710

711711
STATIC void emit_bc_call_function_method_helper(emit_t *emit, int stack_adj, mp_uint_t bytecode_base, mp_uint_t n_positional, mp_uint_t n_keyword, mp_uint_t star_flags) {
712712
if (star_flags) {
713-
stack_adj -= (int)n_positional + 2 * (int)n_keyword + 2;
713+
// each positional arg is one object, each kwarg is two objects, the key
714+
// and the value and one extra object for the star args bitmap.
715+
stack_adj -= (int)n_positional + 2 * (int)n_keyword + 1;
714716
emit_write_bytecode_byte_uint(emit, stack_adj, bytecode_base + 1, (n_keyword << 8) | n_positional); // TODO make it 2 separate uints?
715717
} else {
716718
stack_adj -= (int)n_positional + 2 * (int)n_keyword;

py/emitnative.c

Lines changed: 2 additions & 2 deletions
< 10000 td data-grid-cell-id="diff-a163fc5d5fd363bf3cefbe8f74bf133b25017ebeecf18a528747f33215ea4585-2744-2744-1" data-selected="false" role="gridcell" style="background-color:var(--bgColor-default);text-align:center" tabindex="-1" valign="top" class="focusable-grid-cell diff-line-number position-relative diff-line-number-neutral left-side">2744
Original file line numberDiff line numberDiff line change
@@ -2744,7 +2744,7 @@ STATIC void emit_native_call_function(emit_t *emit, mp_uint_t n_positional, mp_u
2744
} else {
27452745
assert(vtype_fun == VTYPE_PYOBJ);
27462746
if (star_flags) {
2747-
emit_get_stack_pointer_to_reg_for_pop(emit, REG_ARG_3, n_positional + 2 * n_keyword + 3); // pointer to args
2747+
emit_get_stack_pointer_to_reg_for_pop(emit, REG_ARG_3, n_positional + 2 * n_keyword + 2); // pointer to args
27482748
emit_call_with_2_imm_args(emit, MP_F_CALL_METHOD_N_KW_VAR, 0, REG_ARG_1, n_positional | (n_keyword << 8), REG_ARG_2);
27492749
emit_post_push_reg(emit, VTYPE_PYOBJ, REG_RET);
27502750
} else {
@@ -2760,7 +2760,7 @@ STATIC void emit_native_call_function(emit_t *emit, mp_uint_t n_positional, mp_u
27602760

27612761
STATIC void emit_native_call_method(emit_t *emit, mp_uint_t n_positional, mp_uint_t n_keyword, mp_uint_t star_flags) {
27622762
if (star_flags) {
2763-
emit_get_stack_pointer_to_reg_for_pop(emit, REG_ARG_3, n_positional + 2 * n_keyword + 4); // pointer to args
2763+
emit_get_stack_pointer_to_reg_for_pop(emit, REG_ARG_3, n_positional + 2 * n_keyword + 3); // pointer to args
27642764
emit_call_with_2_imm_args(emit, MP_F_CALL_METHOD_N_KW_VAR, 1, REG_ARG_1, n_positional | (n_keyword << 8), REG_ARG_2);
27652765
emit_post_push_reg(emit, VTYPE_PYOBJ, REG_RET);
27662766
} else {

py/vm.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -927,8 +927,8 @@ unwind_jump:;
927927
// unum & 0xff == n_positional
928928
// (unum >> 8) & 0xff == n_keyword
929929
// We have following stack layout here:
930-
// fun arg0 arg1 ... kw0 val0 kw1 val1 ... seq dict <- TOS
931-
sp -= (unum & 0xff) + ((unum >> 7) & 0x1fe) + 2;
930+
// fun arg0 arg1 ... kw0 val0 kw1 val1 ... bitmap <- TOS
931+
sp -= (unum & 0xff) + ((unum >> 7) & 0x1fe) + 1;
932932
#if MICROPY_STACKLESS
933933
if (mp_obj_get_type(*sp) == &mp_type_fun_bc) {
934934
code_state->ip = ip;
@@ -1012,8 +1012,8 @@ unwind_jump:;
10121012
// unum & 0xff == n_positional
10131013
// (unum >> 8) & 0xff == n_keyword
10141014
// We have following stack layout here:
1015-
// fun self arg0 arg1 ... kw0 val0 kw1 val1 ... seq dict <- TOS
1016-
sp -= (unum & 0xff) + ((unum >> 7) & 0x1fe) + 3;
1015+
// fun self arg0 arg1 ... kw0 val0 kw1 val1 ... bitmap <- TOS
1016+
sp -= (unum & 0xff) + ((unum >> 7) & 0x1fe) + 2;
10171017
#if MICROPY_STACKLESS
10181018
if (mp_obj_get_type(*sp) == &mp_type_fun_bc) {
10191019
code_state->ip = ip;

tests/cmdline/cmd_showbc.py.exp

Lines changed: 144 additions & 145 deletions
Original file line numberDiff line numberDiff line change
@@ -47,11 +47,11 @@ arg names:
4747
42 IMPORT_STAR
4848
43 LOAD_CONST_NONE
4949
44 RETURN_VALUE
50-
File cmdline/cmd_showbc.py, code block 'f' (descriptor: \.\+, bytecode @\.\+ 48\[46\] bytes)
51-
Raw bytecode (code_info_size=8\[46\], bytecode_size=400):
50+
File cmdline/cmd_showbc.py, code block 'f' (descriptor: \.\+, bytecode @\.\+ 48\[24\] bytes)
51+
Raw bytecode (code_info_size=8\[46\], bytecode_size=398):
5252
a8 12 9\[bf\] 03 02 60 60 26 22 24 64 22 26 25 25 24
5353
26 23 63 22 22 25 23 23 31 6d 25 65 25 25 69 68
54-
26 65 27 6a 62 20 23 62 2a 29 69 24 25 28 68 26
54+
26 65 27 6a 62 20 23 62 2a 29 69 24 25 28 67 26
5555
########
5656
\.\+81 63
5757
arg names:
@@ -102,42 +102,43 @@ arg names:
102102
bc=199 line=66
103103
bc=204 line=67
104104
bc=212 line=68
105-
bc=220 line=71
106-
bc=226 line=72
107-
bc=233 line=73
108-
bc=243 line=74
109-
bc=252 line=77
110-
bc=256 line=78
111-
bc=262 line=80
112-
bc=265 line=81
113-
bc=268 line=82
114-
bc=275 line=83
115-
bc=278 line=84
116-
bc=285 line=85
117-
bc=291 line=88
118-
bc=298 line=89
119-
bc=303 line=92
120-
bc=309 line=93
121-
bc=312 line=94
105+
bc=219 line=71
106+
bc=225 line=72
107+
bc=232 line=73
108+
bc=242 line=74
109+
bc=250 line=77
110+
bc=254 line=78
111+
bc=260 line=80
112+
bc=263 line=81
113+
bc=266 line=82
114+
bc=273 line=83
115+
bc=276 line=84
116+
bc=283 line=85
117+
bc=289 line=88
118+
bc=296 line=89
119+
bc=301 line=92
120+
bc=307 line=93
121+
bc=310 line=94
122122
########
123-
bc=331 line=98
124-
bc=334 line=99
125-
bc=337 line=100
126-
bc=340 line=101
123+
bc=321 line=96
124+
bc=329 line=98
125+
bc=332 line=99
126+
bc=335 line=100
127+
bc=338 line=101
127128
########
128-
bc=348 line=103
129-
bc=356 line=106
130-
bc=361 line=107
131-
bc=367 line=110
132-
bc=370 line=111
133-
bc=376 line=114
134-
bc=376 line=117
135-
bc=381 line=118
136-
bc=393 line=121
137-
bc=393 line=122
138-
bc=394 line=123
139-
bc=396 line=126
140-
bc=398 line=127
129+
bc=346 line=103
130+
bc=354 line=106
131+
bc=359 line=107
132+
bc=365 line=110
133+
bc=368 line=111
134+
bc=374 line=114
135+
bc=374 line=117
136+
bc=379 line=118
137+
bc=391 line=121
138+
bc=391 line=122
139+
bc=392 line=123
140+
bc=394 line=126
141+
bc=396 line=127
141142
00 LOAD_CONST_NONE
142143
01 LOAD_CONST_FALSE
143144
02 BINARY_OP 27 __add__
@@ -297,115 +298,113 @@ arg names:
297298
212 LOAD_FAST 0
298299
213 LOAD_DEREF 14
299300
215 LOAD_CONST_SMALL_INT 1
300-
216 LOAD_NULL
301-
217 CALL_FUNCTION_VAR_KW n=1 nkw=0
302-
219 POP_TOP
303-
220 LOAD_FAST 0
304-
221 LOAD_METHOD b
305-
223 CALL_METHOD n=0 nkw=0
306-
225 POP_TOP
307-
226 LOAD_FAST 0
308-
227 LOAD_METHOD b
309-
229 LOAD_CONST_SMALL_INT 1
310-
230 CALL_METHOD n=1 nkw=0
311-
232 POP_TOP
312-
233 LOAD_FAST 0
313-
234 LOAD_METHOD b
314-
236 LOAD_CONST_STRING 'c'
315-
238 LOAD_CONST_SMALL_INT 1
316-
239 CALL_METHOD n=0 nkw=1
317-
242 POP_TOP
318-
243 LOAD_FAST 0
319-
244 LOAD_METHOD b
320-
246 LOAD_FAST 1
321-
247 LOAD_CONST_SMALL_INT 1
322-
248 LOAD_NULL
323-
249 CALL_METHOD_VAR_KW n=1 nkw=0
324-
251 POP_TOP
325-
252 LOAD_FAST 0
326-
253 POP_JUMP_IF_FALSE 262
327-
256 LOAD_DEREF 16
328-
258 POP_TOP
329-
259 JUMP 265
330-
262 LOAD_GLOBAL y
331-
264 POP_TOP
332-
265 JUMP 271
333-
268 LOAD_DEREF 14
334-
270 POP_TOP
335-
271 LOAD_FAST 0
336-
272 POP_JUMP_IF_TRUE 268
337-
275 JUMP 281
338-
278 LOAD_DEREF 14
339-
280 POP_TOP
340-
281 LOAD_FAST 0
341-
282 POP_JUMP_IF_FALSE 278
342-
285 LOAD_FAST 0
343-
286 JUMP_IF_TRUE_OR_POP 290
344-
289 LOAD_FAST 0
345-
290 STORE_FAST 0
346-
291 LOAD_DEREF 14
347-
293 GET_ITER_STACK
348-
294 FOR_ITER 303
349-
297 STORE_FAST 0
350-
298 LOAD_FAST 1
351-
299 POP_TOP
352-
300 JUMP 294
353-
303 SETUP_FINALLY 331
354-
306 SETUP_EXCEPT 322
355-
309 JUMP 315
356-
312 JUMP 319
357-
315 LOAD_FAST 0
358-
316 POP_JUMP_IF_TRUE 312
359-
319 POP_EXCEPT_JUMP 330
360-
322 POP_TOP
361-
323 LOAD_DEREF 14
362-
325 POP_TOP
363-
326 POP_EXCEPT_JUMP 330
364-
329 END_FINALLY
365-
330 LOAD_CONST_NONE
366-
331 LOAD_FAST 1
367-
332 POP_TOP
368-
333 END_FINALLY
369-
334 JUMP 352
370-
337 SETUP_EXCEPT 347
371-
340 UNWIND_JUMP 356 1
372-
344 POP_EXCEPT_JUMP 352
373-
347 POP_TOP
374-
348 POP_EXCEPT_JUMP 352
375-
351 END_FINALLY
376-
352 LOAD_FAST 0
377-
353 POP_JUMP_IF_TRUE 337
378-
356 LOAD_FAST 0
379-
357 SETUP_WITH 365
380-
360 POP_TOP
381-
361 LOAD_DEREF 14
382-
363 POP_TOP
383-
364 LOAD_CONST_NONE
384-
365 WITH_CLEANUP
385-
366 END_FINALLY
386-
367 LOAD_CONST_SMALL_INT 1
387-
368 STORE_DEREF 16
388-
370 LOAD_FAST_N 16
389-
372 MAKE_CLOSURE \.\+ 1
390-
375 STORE_FAST 13
391-
376 LOAD_CONST_SMALL_INT 0
392-
377 LOAD_CONST_NONE
393-
378 IMPORT_NAME 'a'
394-
380 STORE_FAST 0
395-
381 LOAD_CONST_SMALL_INT 0
396-
382 LOAD_CONST_STRING 'b'
397-
384 BUILD_TUPLE 1
398-
386 IMPORT_NAME 'a'
399-
388 IMPORT_FROM 'b'
400-
390 STORE_DEREF 14
401-
392 POP_TOP
402-
393 RAISE_LAST
403-
394 LOAD_CONST_SMALL_INT 1
404-
395 RAISE_OBJ
405-
396 LOAD_CONST_NONE
301+
216 CALL_FUNCTION_VAR_KW n=1 nkw=0
302+
218 POP_TOP
303+
219 LOAD_FAST 0
304+
220 LOAD_METHOD b
305+
222 CALL_METHOD n=0 nkw=0
306+
224 POP_TOP
307+
225 LOAD_FAST 0
308+
226 LOAD_METHOD b
309+
228 LOAD_CONST_SMALL_INT 1
310+
229 CALL_METHOD n=1 nkw=0
311+
231 POP_TOP
312+
232 LOAD_FAST 0
313+
233 LOAD_METHOD b
314+
235 LOAD_CONST_STRING 'c'
315+
237 LOAD_CONST_SMALL_INT 1
316+
238 CALL_METHOD n=0 nkw=1
317+
241 POP_TOP
318+
242 LOAD_FAST 0
319+
243 LOAD_METHOD b
320+
245 LOAD_FAST 1
321+
246 LOAD_CONST_SMALL_INT 1
322+
247 CALL_METHOD_VAR_KW n=1 nkw=0
323+
249 POP_TOP
324+
250 LOAD_FAST 0
325+
251 POP_JUMP_IF_FALSE 260
326+
254 LOAD_DEREF 16
327+
256 POP_TOP
328+
257 JUMP 263
329+
260 LOAD_GLOBAL y
330+
262 POP_TOP
331+
263 JUMP 269
332+
266 LOAD_DEREF 14
333+
268 POP_TOP
334+
269 LOAD_FAST 0
335+
270 POP_JUMP_IF_TRUE 266
336+
273 JUMP 279
337+
276 LOAD_DEREF 14
338+
278 POP_TOP
339+
279 LOAD_FAST 0
340+
280 POP_JUMP_IF_FALSE 276
341+
283 LOAD_FAST 0
342+
284 JUMP_IF_TRUE_OR_POP 288
343+
287 LOAD_FAST 0
344+
288 STORE_FAST 0
345+
289 LOAD_DEREF 14
346+
291 GET_ITER_STACK
347+
292 FOR_ITER 301
348+
295 STORE_FAST 0
349+
296 LOAD_FAST 1
350+
297 POP_TOP
351+
298 JUMP 292
352+
301 SETUP_FINALLY 329
353+
304 SETUP_EXCEPT 320
354+
307 JUMP 313
355+
310 JUMP 317
356+
313 LOAD_FAST 0
357+
314 POP_JUMP_IF_TRUE 310
358+
317 POP_EXCEPT_JUMP 328
359+
320 POP_TOP
360+
321 LOAD_DEREF 14
361+
323 POP_TOP
362+
324 POP_EXCEPT_JUMP 328
363+
< 10000 span class="x x-first x-last">327 END_FINALLY
364+
328 LOAD_CONST_NONE
365+
329 LOAD_FAST 1
366+
330 POP_TOP
367+
331 END_FINALLY
368+
332 JUMP 350
369+
335 SETUP_EXCEPT 345
370+
338 UNWIND_JUMP 354 1
371+
342 POP_EXCEPT_JUMP 350
372+
345 POP_TOP
373+
346 POP_EXCEPT_JUMP 350
374+
349 END_FINALLY
375+
350 LOAD_FAST 0
376+
351 POP_JUMP_IF_TRUE 335
377+
354 LOAD_FAST 0
378+
355 SETUP_WITH 363
379+
358 POP_TOP
380+
359 LOAD_DEREF 14
381+
361 POP_TOP
382+
362 LOAD_CONST_NONE
383+
363 WITH_CLEANUP
384+
364 END_FINALLY
385+
365 LOAD_CONST_SMALL_INT 1
386+
366 STORE_DEREF 16
387+
368 LOAD_FAST_N 16
388+
370 MAKE_CLOSURE \.\+ 1
389+
373 STORE_FAST 13
390+
374 LOAD_CONST_SMALL_INT 0
391+
375 LOAD_CONST_NONE
392+
376 IMPORT_NAME 'a'
393+
378 STORE_FAST 0
394+
379 LOAD_CONST_SMALL_INT 0
395+
380 LOAD_CONST_STRING 'b'
396+
382 BUILD_TUPLE 1
397+
384 IMPORT_NAME 'a'
398+
386 IMPORT_FROM 'b'
399+
388 STORE_DEREF 14
400+
390 POP_TOP
401+
391 RAISE_LAST
402+
392 LOAD_CONST_SMALL_INT 1
403+
393 RAISE_OBJ
404+
394 LOAD_CONST_NONE
405+
395 RETURN_VALUE
406+
396 LOAD_CONST_SMALL_INT 1
406407
397 RETURN_VALUE
407-
398 LOAD_CONST_SMALL_INT 1
408-
399 RETURN_VALUE
409408
File cmdline/cmd_showbc.py, code block 'f' (descriptor: \.\+, bytecode @\.\+ 59 bytes)
410409
Raw bytecode (code_info_size=8, bytecode_size=51):
411410
a8 10 0a 02 80 82 34 38 81 57 c0 57 c1 57 c2 57

0 commit comments

Comments
 (0)
0