[EMAIL PROTECTED] wrote: > As part of some research I am doing a Python Virtual Machine in Java, > and the exact semantics of the STORE_NAME bytecode is unclear to be, > so I was hoping somebody here could clarify it. > The STORE_NAME bytecode is supposed to set a value for a name in the > current scope. However, the following piece of code: > > def hello(who): > print "Hello", who > return hello(who) > print "Say:" > hello("World") > > Results in this bytecode for the top level: > 1, LOAD_CONST, 1 > 4, MAKE_FUNCTION, 0 > 7, STORE_NAME, 0 > 10, LOAD_CONST, 2 > 13, PRINT_ITEM, None > 14, PRINT_NEWLINE, None > 15, LOAD_NAME, 0 > 18, LOAD_CONST, 3 > 21, CALL_FUNCTION, 1 > 24, POP_TOP, None > 25, LOAD_CONST, 0 > 28, RETURN_VALUE, None > > And this bytecode for the hello function: > 1, LOAD_CONST, 1 > 4, PRINT_ITEM, None > 5, LOAD_FAST, 0 > 8, PRINT_ITEM, None > 9, PRINT_NEWLINE, None > 10, LOAD_GLOBAL, 1 > 13, LOAD_FAST, 0 > 16, CALL_FUNCTION, 1 > 19, RETURN_VALUE, None > 20, LOAD_CONST, 0 > 23, RETURN_VALUE, None > > The first column are the byte numbers, and the last column contains > the arguments to the byte codes if they take any. > > The function is stored using STORE_NAME with offset 0 in the module > scope, but it is loaded from inside the hello method using LOAD_GLOBAL > with offset 1. My questions are: Does STORE_NAME add things to the > global scope when used top level? And why is the offset different?
Every code object has its own co_names attribute (a tuple). The arguments are offsets into that tuple. Using Python 2.5 I can't reproduce your example, I get 0 offsets in both cases. Here's a simpler one: >>> import dis >>> def f(): ... x ... y ... >>> def g(): ... y ... >>> dis.dis(f) 2 0 LOAD_GLOBAL 0 (x) 3 POP_TOP 3 4 LOAD_GLOBAL 1 (y) 7 POP_TOP 8 LOAD_CONST 0 (None) 11 RETURN_VALUE >>> dis.dis(g) 2 0 LOAD_GLOBAL 0 (y) 3 POP_TOP 4 LOAD_CONST 0 (None) 7 RETURN_VALUE >>> f.func_code.co_names ('x', 'y') >>> g.func_code.co_names ('y',) Peter -- http://mail.python.org/mailman/listinfo/python-list