diff options
Diffstat (limited to 'interpret.h')
-rw-r--r-- | interpret.h | 20 |
1 files changed, 18 insertions, 2 deletions
diff --git a/interpret.h b/interpret.h index 0a306848..26725a21 100644 --- a/interpret.h +++ b/interpret.h @@ -557,10 +557,26 @@ mod: } DEREF(t2); + /* + * Changing something in FUNCTAB is not allowed. + * + * SYMTAB is a little more messy. Three kinds of values may + * be stored in 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. + */ if (t1 == func_table) fatal(_("cannot assign to elements of FUNCTAB")); - else if (t1 == symbol_table && (*lhs)->type == Node_var) - lhs = & ((*lhs)->var_value); + else if ( t1 == symbol_table + && ( (*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 */ + } unref(*lhs); *lhs = POP_SCALAR(); |