py/compile2: Track changes made between v1.8.4 and v1.8.5.

This commit is contained in:
Damien George 2017-08-14 16:24:46 +10:00
parent f6e6776d6f
commit a7f5c64d21
1 changed files with 20 additions and 42 deletions

View File

@ -510,7 +510,6 @@ STATIC void c_assign(compiler_t *comp, const byte *p, assign_kind_t assign_kind)
p1 = pt_rule_extract_top(p1, &ptop); p1 = pt_rule_extract_top(p1, &ptop);
c_assign_tuple(comp, p0, p1, ptop); c_assign_tuple(comp, p0, p1, ptop);
} else if (pt_is_rule(p1, PN_comp_for)) { } else if (pt_is_rule(p1, PN_comp_for)) {
// TODO can we ever get here? can it be compiled?
goto cannot_assign; goto cannot_assign;
} else { } else {
// sequence with 2 items // sequence with 2 items
@ -930,7 +929,6 @@ STATIC void c_del_stmt(compiler_t *comp, const byte *p) {
p1 = pt_next(p1); p1 = pt_next(p1);
} }
} else if (pt_is_rule(p1, PN_comp_for)) { } else if (pt_is_rule(p1, PN_comp_for)) {
// TODO not implemented; can't del comprehension? can we get here?
goto cannot_delete; goto cannot_delete;
} else { } else {
// sequence with 2 items // sequence with 2 items
@ -1218,18 +1216,14 @@ STATIC void compile_global_stmt(compiler_t *comp, const byte *p, const byte *pto
STATIC void compile_declare_nonlocal(compiler_t *comp, const byte *p_for_err, qstr qst) { STATIC void compile_declare_nonlocal(compiler_t *comp, const byte *p_for_err, qstr qst) {
bool added; bool added;
id_info_t *id_info = scope_find_or_add_id(comp->scope_cur, qst, &added); id_info_t *id_info = scope_find_or_add_id(comp->scope_cur, qst, &added);
if (!added && id_info->kind != ID_INFO_KIND_FREE) { if (added) {
scope_find_local_and_close_over(comp->scope_cur, id_info, qst);
if (id_info->kind == ID_INFO_KIND_GLOBAL_IMPLICIT) {
compile_syntax_error(comp, p_for_err, "no binding for nonlocal found");
}
} else if (id_info->kind != ID_INFO_KIND_FREE) {
compile_syntax_error(comp, p_for_err, "identifier redefined as nonlocal"); compile_syntax_error(comp, p_for_err, "identifier redefined as nonlocal");
return;
} }
id_info_t *id_info2 = scope_find_local_in_parent(comp->scope_cur, qst);
if (id_info2 == NULL || !(id_info2->kind == ID_INFO_KIND_LOCAL
|| id_info2->kind == ID_INFO_KIND_CELL || id_info2->kind == ID_INFO_KIND_FREE)) {
compile_syntax_error(comp, p_for_err, "no binding for nonlocal found");
return;
}
id_info->kind = ID_INFO_KIND_FREE;
scope_close_over_in_parents(comp->scope_cur, qst);
} }
STATIC void compile_nonlocal_stmt(compiler_t *comp, const byte *p, const byte *ptop) { STATIC void compile_nonlocal_stmt(compiler_t *comp, const byte *p, const byte *ptop) {
@ -1578,6 +1572,8 @@ STATIC void compile_try_except(compiler_t *comp, const byte *p_body, const byte
EMIT_ARG(label_assign, l1); // start of exception handler EMIT_ARG(label_assign, l1); // start of exception handler
EMIT(start_except_handler); EMIT(start_except_handler);
// at this point the top of the stack contains the exception instance that was raised
uint l2 = comp_next_label(comp); uint l2 = comp_next_label(comp);
while (p_except != p_except_top) { while (p_except != p_except_top) {
@ -1610,16 +1606,13 @@ STATIC void compile_try_except(compiler_t *comp, const byte *p_body, const byte
p_except = pt_next(p_except); p_except = pt_next(p_except);
EMIT(pop_top); // either discard or store the exception instance
if (qstr_exception_local == 0) { if (qstr_exception_local == 0) {
EMIT(pop_top); EMIT(pop_top);
} else { } else {
compile_store_id(comp, qstr_exception_local); compile_store_id(comp, qstr_exception_local);
} }
EMIT(pop_top);
uint l3 = 0; uint l3 = 0;
if (qstr_exception_local != 0) { if (qstr_exception_local != 0) {
l3 = comp_next_label(comp); l3 = comp_next_label(comp);
@ -1643,7 +1636,7 @@ STATIC void compile_try_except(compiler_t *comp, const byte *p_body, const byte
} }
EMIT_ARG(jump, l2); EMIT_ARG(jump, l2);
EMIT_ARG(label_assign, end_finally_label); EMIT_ARG(label_assign, end_finally_label);
EMIT_ARG(adjust_stack_size, 3); // stack adjust for the 3 exception items EMIT_ARG(adjust_stack_size, 1); // stack adjust for the exception instance
} }
compile_decrease_except_level(comp); compile_decrease_except_level(comp);
@ -2568,22 +2561,13 @@ STATIC const byte *compile_node(compiler_t *comp, const byte *p) {
p = pt_rule_extract(p, &rule_id, &src_line, &ptop); p = pt_rule_extract(p, &rule_id, &src_line, &ptop);
EMIT_ARG(set_source_line, src_line); EMIT_ARG(set_source_line, src_line);
compile_function_t f = compile_function[rule_id]; compile_function_t f = compile_function[rule_id];
if (f == NULL) { assert(f != NULL);
#if MICROPY_DEBUG_PRINTERS f(comp, p, ptop);
printf("node %u cannot be compiled\n", (uint)rule_id); if (comp->compile_error != MP_OBJ_NULL && comp->compile_error_line == 0) {
//mp_parse_node_print(pn, 0); // add line info for the error in case it didn't have a line number
#endif comp->compile_error_line = src_line;
compile_syntax_error(comp, p, "internal compiler error");
assert(0);
return ptop;
} else {
f(comp, p, ptop);
if (comp->compile_error != MP_OBJ_NULL && comp->compile_error_line == 0) {
// add line info for the error in case it didn't have a line number
comp->compile_error_line = src_line;
}
return ptop;
} }
return ptop;
} }
} }
@ -2724,17 +2708,11 @@ STATIC void compile_scope_comp_iter(compiler_t *comp, const byte *p_comp_for, co
if (p_iter == p_comp_for_top) { if (p_iter == p_comp_for_top) {
// no more nested if/for; compile inner expression // no more nested if/for; compile inner expression
compile_node(comp, p_inner_expr); compile_node(comp, p_inner_expr);
if (comp->scope_cur->kind == SCOPE_LIST_COMP) { if (comp->scope_cur->kind == SCOPE_GEN_EXPR) {
EMIT_ARG(list_append, for_depth + 2);
} else if (comp->scope_cur->kind == SCOPE_DICT_COMP) {
EMIT_ARG(map_add, for_depth + 2);
#if MICROPY_PY_BUILTINS_SET
} else if (comp->scope_cur->kind == SCOPE_SET_COMP) {
EMIT_ARG(set_add, for_depth + 2);
#endif
} else {
EMIT(yield_value); EMIT(yield_value);
EMIT(pop_top); EMIT(pop_top);
} else {
EMIT_ARG(store_comp, comp->scope_cur->kind, for_depth + 2);
} }
} else if (pt_is_rule(p_iter, PN_comp_if)) { } else if (pt_is_rule(p_iter, PN_comp_if)) {
// if condition // if condition
@ -3163,7 +3141,7 @@ STATIC void scope_compute_things(scope_t *scope) {
// __class__ is not counted as a local; if it's used then it becomes a ID_INFO_KIND_CELL // __class__ is not counted as a local; if it's used then it becomes a ID_INFO_KIND_CELL
continue; continue;
} }
if (scope->kind >= SCOPE_FUNCTION && scope->kind <= SCOPE_GEN_EXPR && id->kind == ID_INFO_KIND_GLOBAL_IMPLICIT) { if (SCOPE_IS_FUNC_LIKE(scope->kind) && id->kind == ID_INFO_KIND_GLOBAL_IMPLICIT) {
id->kind = ID_INFO_KIND_GLOBAL_EXPLICIT; id->kind = ID_INFO_KIND_GLOBAL_EXPLICIT;
} }
// params always count for 1 local, even if they are a cell // params always count for 1 local, even if they are a cell