#define LOAD_CLOSURE 135 /* Load free variable from closure */
#define LOAD_DEREF 136 /* Load and dereference from closure cell */
#define STORE_DEREF 137 /* Store into cell */
-#define LOAD_NAME_LOCAL_ONLY 138
/* The next 3 opcodes must be contiguous and satisfy
(CALL_FUNCTION_VAR - CALL_FUNCTION) & 3 == 1 */
#define GLOBAL_IMPLICIT 3
#define FREE 4
#define CELL 5
-#define LOCAL_ONLY 6
/* The following two names are used for the ste_unoptimized bit field */
#define OPT_IMPORT_STAR 1
h = g()
self.assertEqual(h(), 3)
- def testLocalClosureShadowing(self):
- exec("""
-x = 4
-def f(x):
- class C:
- x = x
-raises(NameError, f, 3)""", {"raises" : self.assertRaises})
-
def test_main():
run_unittest(ScopeTests)
PyErr_SetString(PyExc_TypeError,
"super(type, obj): "
"obj must be an instance or subtype of type");
- printf("%s\n", type->tp_name);
return NULL;
}
break;
TARGET(LOAD_NAME)
- TARGET(LOAD_NAME_LOCAL_ONLY)
w = GETITEM(names, oparg);
if ((v = f->f_locals) == NULL) {
PyErr_Format(PyExc_SystemError,
}
}
if (x == NULL) {
- if (opcode != LOAD_NAME_LOCAL_ONLY) {
- x = PyDict_GetItem(f->f_globals, w);
- if (x == NULL)
- x = PyDict_GetItem(f->f_builtins, w);
- }
+ x = PyDict_GetItem(f->f_globals, w);
if (x == NULL) {
- format_exc_check_arg(PyExc_NameError, NAME_ERROR_MSG, w);
- break;
+ x = PyDict_GetItem(f->f_builtins, w);
+ if (x == NULL) {
+ format_exc_check_arg(
+ PyExc_NameError,
+ NAME_ERROR_MSG, w);
+ break;
+ }
}
Py_INCREF(x);
}
case LOAD_CONST:
return 1;
case LOAD_NAME:
- case LOAD_NAME_LOCAL_ONLY:
return 1;
case BUILD_TUPLE:
case BUILD_LIST:
optype = OP_DEREF;
break;
case LOCAL:
- case LOCAL_ONLY:
if (c->u->u_ste->ste_type == FunctionBlock)
optype = OP_FAST;
break;
break;
case OP_NAME:
switch (ctx) {
- case Load: op = (scope == LOCAL_ONLY) ? LOAD_NAME_LOCAL_ONLY : LOAD_NAME; break;
+ case Load: op = LOAD_NAME; break;
case Store: op = STORE_NAME; break;
case Del: op = DELETE_NAME; break;
case AugLoad:
return PySet_Add(free, name) >= 0;
}
if (flags & DEF_BOUND) {
- if (ste->ste_type == ClassBlock &&
- !(flags & DEF_PARAM) &&
- bound && PySet_Contains(bound, name)) {
- SET_SCOPE(scopes, name, LOCAL_ONLY);
- }
- else {
- SET_SCOPE(scopes, name, LOCAL);
- }
+ SET_SCOPE(scopes, name, LOCAL);
if (PySet_Add(local, name) < 0)
return 0;
if (PySet_Discard(global, name) < 0)
long scope;
assert(PyLong_Check(v));
scope = PyLong_AS_LONG(v);
- if (scope != LOCAL && scope != LOCAL_ONLY)
+ if (scope != LOCAL)
continue;
if (!PySet_Contains(free, name))
continue;