diff options
author | Arnold D. Robbins <arnold@skeeve.com> | 2018-11-29 21:43:17 +0200 |
---|---|---|
committer | Arnold D. Robbins <arnold@skeeve.com> | 2018-11-29 21:43:17 +0200 |
commit | ee2f450c7cf2550ca68fb205c5df22eca13e5b74 (patch) | |
tree | fbf8e24689c98fee012725f40a1f9565e4a6317e /interpret.h | |
parent | 1e12bcb4ceac5850999f4d714a305a00ce7a9ddc (diff) | |
parent | 68ba43d9c7604d8544834dadc6f549af45d8992c (diff) | |
download | egawk-ee2f450c7cf2550ca68fb205c5df22eca13e5b74.tar.gz egawk-ee2f450c7cf2550ca68fb205c5df22eca13e5b74.tar.bz2 egawk-ee2f450c7cf2550ca68fb205c5df22eca13e5b74.zip |
Merge branch 'master' into feature/fix-comments
Diffstat (limited to 'interpret.h')
-rw-r--r-- | interpret.h | 32 |
1 files changed, 19 insertions, 13 deletions
diff --git a/interpret.h b/interpret.h index 4381a929..6a1a08b4 100644 --- a/interpret.h +++ b/interpret.h @@ -348,16 +348,19 @@ uninitialized_scalar: * 3. Values that awk code stuck into SYMTAB not related to variables (Node_value) * For 1, since we are giving it a value, we have to change the type to Node_var. * For 1 and 2, we have to step through the Node_var to get to the value. - * For 3, we just us the value we got from assoc_lookup(), above. + * For 3, we fatal out. This avoids confusion on things like + * SYMTAB["a foo"] = 42 # variable with a space in its name? */ if (t1 == func_table) fatal(_("cannot assign to elements of FUNCTAB")); - else if ( t1 == symbol_table - && ( (*lhs)->type == Node_var + else if (t1 == symbol_table) { + if (( (*lhs)->type == Node_var || (*lhs)->type == Node_var_new)) { - update_global_values(); /* make sure stuff like NF, NR, are up to date */ - (*lhs)->type = Node_var; /* in case was Node_var_new */ - lhs = & ((*lhs)->var_value); /* extra level of indirection */ + update_global_values(); /* make sure stuff like NF, NR, are up to date */ + (*lhs)->type = Node_var; /* in case was Node_var_new */ + lhs = & ((*lhs)->var_value); /* extra level of indirection */ + } else + fatal(_("cannot assign to arbitrary elements of SYMTAB")); } assert(set_idx == NULL); @@ -658,22 +661,25 @@ mod: /* * Changing something in FUNCTAB is not allowed. * - * SYMTAB is a little more messy. Three kinds of values may - * be stored in SYMTAB: + * SYMTAB is a little more messy. Three possibilities for SYMTAB: * 1. Variables that don"t yet have a value (Node_var_new) * 2. Variables that have a value (Node_var) * 3. Values that awk code stuck into SYMTAB not related to variables (Node_value) * For 1, since we are giving it a value, we have to change the type to Node_var. * For 1 and 2, we have to step through the Node_var to get to the value. - * For 3, we just us the value we got from assoc_lookup(), above. + * For 3, we fatal out. This avoids confusion on things like + * SYMTAB["a foo"] = 42 # variable with a space in its name? */ if (t1 == func_table) fatal(_("cannot assign to elements of FUNCTAB")); - else if ( t1 == symbol_table - && ( (*lhs)->type == Node_var + else if (t1 == symbol_table) { + if (( (*lhs)->type == Node_var || (*lhs)->type == Node_var_new)) { - (*lhs)->type = Node_var; /* in case was Node_var_new */ - lhs = & ((*lhs)->var_value); /* extra level of indirection */ + update_global_values(); /* make sure stuff like NF, NR, are up to date */ + (*lhs)->type = Node_var; /* in case was Node_var_new */ + lhs = & ((*lhs)->var_value); /* extra level of indirection */ + } else + fatal(_("cannot assign to arbitrary elements of SYMTAB")); } unref(*lhs); |