Skip to content
Snippets Groups Projects
Commit b1533c43 authored by Damien George's avatar Damien George
Browse files

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.
parent 2bf6eb9f
No related branches found
No related tags found
No related merge requests found
...@@ -461,6 +461,8 @@ STATIC const mp_rom_map_elem_t mp_constants_table[] = { ...@@ -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 ...@@ -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(): ...@@ -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'))
123 580 123 580
123 580 123 580
12 46
1 2
True False
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment