py/parse: Treat constants that start with underscore as private.
Assignments of the form "_id = const(value)" are treated as private (following a similar CPython convention) and code is no longer emitted for the assignment to a global variable. See issue #2111.
This commit is contained in:
parent
2bf6eb9fe2
commit
b1533c4366
11
py/parse.c
11
py/parse.c
@ -461,6 +461,8 @@ STATIC const mp_rom_map_elem_t mp_constants_table[] = {
|
|||||||
STATIC MP_DEFINE_CONST_MAP(mp_constants_map, mp_constants_table);
|
STATIC MP_DEFINE_CONST_MAP(mp_constants_map, mp_constants_table);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
STATIC void push_result_rule(parser_t *parser, size_t src_line, const rule_t *rule, size_t num_args);
|
||||||
|
|
||||||
#if MICROPY_COMP_CONST_FOLDING
|
#if MICROPY_COMP_CONST_FOLDING
|
||||||
STATIC bool fold_constants(parser_t *parser, const rule_t *rule, size_t num_args) {
|
STATIC bool fold_constants(parser_t *parser, const rule_t *rule, size_t num_args) {
|
||||||
// this code does folding of arbitrary integer expressions, eg 1 + 2 * 3 + 4
|
// this code does folding of arbitrary integer expressions, eg 1 + 2 * 3 + 4
|
||||||
@ -587,6 +589,15 @@ STATIC bool fold_constants(parser_t *parser, const rule_t *rule, size_t num_args
|
|||||||
assert(elem->value == MP_OBJ_NULL);
|
assert(elem->value == MP_OBJ_NULL);
|
||||||
elem->value = MP_OBJ_NEW_SMALL_INT(value);
|
elem->value = MP_OBJ_NEW_SMALL_INT(value);
|
||||||
|
|
||||||
|
// If the constant starts with an underscore then treat it as a private
|
||||||
|
// variable and don't emit any code to store the value to the id.
|
||||||
|
if (qstr_str(id)[0] == '_') {
|
||||||
|
pop_result(parser); // pop const(value)
|
||||||
|
pop_result(parser); // pop id
|
||||||
|
push_result_rule(parser, 0, rules[RULE_pass_stmt], 0); // replace with "pass"
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
// replace const(value) with value
|
// replace const(value) with value
|
||||||
pop_result(parser);
|
pop_result(parser);
|
||||||
push_result_node(parser, pn_value);
|
push_result_node(parser, pn_value);
|
||||||
|
@ -9,3 +9,15 @@ def f():
|
|||||||
print(X, Y + 1)
|
print(X, Y + 1)
|
||||||
|
|
||||||
f()
|
f()
|
||||||
|
|
||||||
|
_X = const(12)
|
||||||
|
_Y = const(_X + 34)
|
||||||
|
|
||||||
|
print(_X, _Y)
|
||||||
|
|
||||||
|
class A:
|
||||||
|
Z = const(1)
|
||||||
|
_Z = const(2)
|
||||||
|
print(Z, _Z)
|
||||||
|
|
||||||
|
print(hasattr(A, 'Z'), hasattr(A, '_Z'))
|
||||||
|
@ -1,2 +1,5 @@
|
|||||||
123 580
|
123 580
|
||||||
123 580
|
123 580
|
||||||
|
12 46
|
||||||
|
1 2
|
||||||
|
True False
|
||||||
|
Loading…
x
Reference in New Issue
Block a user