wcc/ww: match on a global value-struct tagged field reads g(SB) (#29)
A match whose scrutinee is a tagged field of a GLOBAL value-struct read the tag/payload from the BP region (saved-BP + return-addr) instead of g(SB) and returned garbage. Both stages were identical-wrong, so the byte-id gate could not see it -- a gate-blind regression introduced by M1 (#25): M1's in-place N_DOT match arm uses localfind(base), which returns the 0 not-found sentinel for a global base, so 0+field.offset landed in the frame. Gate the in-place arm on a confirmed-local base -- `localfind(base)==0 && let_islet/isletvar(base)`, verbatim from cstage's own global test at cgen.c:2000 (both stages, same spelling). A global base now falls through to the existing spill path, which cgexprs the scrutinee and resolves g(SB). M1's local-field in-place ($32) path is untouched. Regenerates the w6c and wwdump combined.ww. Table-driven 841 test (global int/reassign/str-payload + a local-field M1 regression row), runtime-discriminating: pre-fix returns garbage, post-fix 42 on both stages; rob's direct-global-field spill caveat confirmed at runtime.
This commit is contained in:
7
Makefile
7
Makefile
@@ -343,6 +343,7 @@ TESTS = $(BIN)/test_smoke $(BIN)/test_lex $(BIN)/test_parse $(BIN)/test_check \
|
||||
$(BIN)/test_tagged_widen_f64 \
|
||||
$(BIN)/test_match_spill_pointer_payload \
|
||||
$(BIN)/test_match_field_inplace \
|
||||
$(BIN)/test_match_global_field \
|
||||
$(BIN)/test_struct_byval_param \
|
||||
$(BIN)/test_struct_multi_return_scratch \
|
||||
$(BIN)/test_signed_data_emit \
|
||||
@@ -2125,6 +2126,12 @@ $(BIN)/test_match_field_inplace: test/wcc/831_match_field_inplace.c \
|
||||
$(LIB)/libwwrt.a | $(BIN)
|
||||
$(CC) $(CFLAGS) -o $@ $<
|
||||
|
||||
$(BIN)/test_match_global_field: test/wcc/841_match_global_field.c \
|
||||
$(BIN)/ww $(BIN)/w6c $(BIN)/w6a $(BIN)/w6l \
|
||||
$(BIN)/ww_ww $(BIN)/w6c_ww $(BIN)/w6a_ww $(BIN)/w6l_ww \
|
||||
$(LIB)/libwwrt.a | $(BIN)
|
||||
$(CC) $(CFLAGS) -o $@ $<
|
||||
|
||||
$(BIN)/test_struct_byval_param: test/wcc/717_struct_byval_param.c \
|
||||
$(BIN)/ww $(BIN)/w6c $(BIN)/w6a $(BIN)/w6l \
|
||||
$(BIN)/ww_ww $(BIN)/w6c_ww $(BIN)/w6a_ww $(BIN)/w6l_ww \
|
||||
|
||||
Reference in New Issue
Block a user