py: Move to Python 3.4.0 compatibility.
Very little has changed. In Python 3.4 they removed the opcode STORE_LOCALS, but in Micro Python we only ever used this for CPython compatibility, so it was a trivial thing to remove. It also allowed to clean up some dead code (eg the 0xdeadbeef in class construction), and now class builders use 1 less stack word. Python 3.4.0 introduced the LOAD_CLASSDEREF opcode, which I have not yet understood. Still, all tests (apart from bytecode test) still pass. Bytecode tests needs some more attention, but they are not that important anymore.
This commit is contained in:
parent
929a675a3d
commit
882b363564
@ -26,7 +26,7 @@ STATIC mp_obj_t mp_builtin___build_class__(uint n_args, const mp_obj_t *args) {
|
||||
mp_locals_set(mp_obj_dict_get_map(class_locals));
|
||||
|
||||
// call the class code
|
||||
mp_obj_t cell = mp_call_function_1(args[0], (mp_obj_t)0xdeadbeef);
|
||||
mp_obj_t cell = mp_call_function_0(args[0]);
|
||||
|
||||
// restore old __locals__ object
|
||||
mp_locals_set(old_locals);
|
||||
|
15
py/compile.c
15
py/compile.c
@ -2957,15 +2957,8 @@ void compile_scope(compiler_t *comp, scope_t *scope, pass_kind_t pass) {
|
||||
id_info_t *id_info = scope_find_or_add_id(scope, MP_QSTR___class__, &added);
|
||||
assert(added);
|
||||
id_info->kind = ID_INFO_KIND_LOCAL;
|
||||
id_info = scope_find_or_add_id(scope, MP_QSTR___locals__, &added);
|
||||
assert(added);
|
||||
id_info->kind = ID_INFO_KIND_LOCAL;
|
||||
id_info->param = true;
|
||||
scope->num_params = 1; // __locals__ is the parameter
|
||||
}
|
||||
|
||||
EMIT_ARG(load_id, MP_QSTR___locals__);
|
||||
EMIT(store_locals);
|
||||
EMIT_ARG(load_id, MP_QSTR___name__);
|
||||
EMIT_ARG(store_id, MP_QSTR___module__);
|
||||
EMIT_ARG(load_const_id, MP_PARSE_NODE_LEAF_ARG(pns->nodes[0])); // 0 is class name
|
||||
@ -3155,8 +3148,10 @@ void compile_scope_compute_things(compiler_t *comp, scope_t *scope) {
|
||||
}
|
||||
|
||||
// compute scope_flags
|
||||
//scope->scope_flags = 0; since we set some things in parameters
|
||||
if (scope->kind != SCOPE_MODULE) {
|
||||
|
||||
#if MICROPY_EMIT_CPYTHON
|
||||
// these flags computed here are for CPython compatibility only
|
||||
if (scope->kind == SCOPE_FUNCTION) {
|
||||
scope->scope_flags |= MP_SCOPE_FLAG_NEWLOCALS;
|
||||
}
|
||||
if (scope->kind == SCOPE_FUNCTION || scope->kind == SCOPE_LAMBDA || scope->kind == SCOPE_LIST_COMP || scope->kind == SCOPE_DICT_COMP || scope->kind == SCOPE_SET_COMP || scope->kind == SCOPE_GEN_EXPR) {
|
||||
@ -3169,6 +3164,8 @@ void compile_scope_compute_things(compiler_t *comp, scope_t *scope) {
|
||||
scope->scope_flags |= MP_SCOPE_FLAG_NESTED;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
int num_free = 0;
|
||||
for (int i = 0; i < scope->id_info_len; i++) {
|
||||
id_info_t *id = &scope->id_info[i];
|
||||
|
@ -54,7 +54,6 @@ typedef struct _emit_method_table_t {
|
||||
void (*store_global)(emit_t *emit, qstr qstr);
|
||||
void (*store_attr)(emit_t *emit, qstr qstr);
|
||||
void (*store_subscr)(emit_t *emit);
|
||||
void (*store_locals)(emit_t *emit);
|
||||
void (*delete_fast)(emit_t *emit, qstr qstr, int local_num);
|
||||
void (*delete_deref)(emit_t *emit, qstr qstr, int local_num);
|
||||
void (*delete_name)(emit_t *emit, qstr qstr);
|
||||
|
@ -486,12 +486,6 @@ STATIC void emit_bc_store_subscr(emit_t *emit) {
|
||||
emit_write_byte_code_byte(emit, MP_BC_STORE_SUBSCR);
|
||||
}
|
||||
|
||||
STATIC void emit_bc_store_locals(emit_t *emit) {
|
||||
// not needed
|
||||
emit_bc_pre(emit, -1);
|
||||
emit_write_byte_code_byte(emit, MP_BC_POP_TOP);
|
||||
}
|
||||
|
||||
STATIC void emit_bc_delete_fast(emit_t *emit, qstr qstr, int local_num) {
|
||||
assert(local_num >= 0);
|
||||
emit_bc_pre(emit, 0);
|
||||
@ -860,7 +854,6 @@ const emit_method_table_t emit_bc_method_table = {
|
||||
emit_bc_store_global,
|
||||
emit_bc_store_attr,
|
||||
emit_bc_store_subscr,
|
||||
emit_bc_store_locals,
|
||||
emit_bc_delete_fast,
|
||||
emit_bc_delete_deref,
|
||||
emit_bc_delete_name,
|
||||
|
@ -325,13 +325,6 @@ STATIC void emit_cpy_store_subscr(emit_t *emit) {
|
||||
}
|
||||
}
|
||||
|
||||
STATIC void emit_cpy_store_locals(emit_t *emit) {
|
||||
emit_pre(emit, -1, 1);
|
||||
if (emit->pass == PASS_3) {
|
||||
printf("STORE_LOCALS\n");
|
||||
}
|
||||
}
|
||||
|
||||
STATIC void emit_cpy_delete_fast(emit_t *emit, qstr qstr, int local_num) {
|
||||
emit_pre(emit, 0, 3);
|
||||
if (emit->pass == PASS_3) {
|
||||
@ -833,7 +826,6 @@ const emit_method_table_t emit_cpython_method_table = {
|
||||
emit_cpy_store_global,
|
||||
emit_cpy_store_attr,
|
||||
emit_cpy_store_subscr,
|
||||
emit_cpy_store_locals,
|
||||
emit_cpy_delete_fast,
|
||||
emit_cpy_delete_deref,
|
||||
emit_cpy_delete_name,
|
||||
|
@ -818,13 +818,6 @@ STATIC void emit_native_store_subscr(emit_t *emit) {
|
||||
emit_call(emit, MP_F_STORE_SUBSCR, mp_store_subscr);
|
||||
}
|
||||
|
||||
STATIC void emit_native_store_locals(emit_t *emit) {
|
||||
// not needed
|
||||
vtype_kind_t vtype;
|
||||
emit_pre_pop_reg(emit, &vtype, REG_TEMP0);
|
||||
emit_post(emit);
|
||||
}
|
||||
|
||||
STATIC void emit_native_delete_fast(emit_t *emit, qstr qstr, int local_num) {
|
||||
// not implemented
|
||||
// could support for Python types, just set to None (so GC can reclaim it)
|
||||
@ -1290,7 +1283,6 @@ const emit_method_table_t EXPORT_FUN(method_table) = {
|
||||
emit_native_store_global,
|
||||
emit_native_store_attr,
|
||||
emit_native_store_subscr,
|
||||
emit_native_store_locals,
|
||||
emit_native_delete_fast,
|
||||
emit_native_delete_deref,
|
||||
emit_native_delete_name,
|
||||
|
@ -182,5 +182,4 @@ const emit_method_table_t emit_pass1_method_table = {
|
||||
(void*)emit_pass1_dummy,
|
||||
(void*)emit_pass1_dummy,
|
||||
(void*)emit_pass1_dummy,
|
||||
(void*)emit_pass1_dummy,
|
||||
};
|
||||
|
Loading…
x
Reference in New Issue
Block a user