4848
4949BUILDER_CPP=" Python/jit/hir/builder.cpp"
5050BUILDER_EMIT_C=" Python/jit/hir/builder_emit_c.c"
51+ BUILDER_STATE_C_H=" Python/jit/hir/builder_state_c.h"
52+ BUILDER_STATE_C=" Python/jit/hir/builder_state_c.c"
5153CMAKE_BUILD_DIR=" Python/jit_build/build"
5254
53- if [ ! -f " $BUILDER_CPP " ] || [ ! -f " $BUILDER_EMIT_C " ]; then
54- echo " ERROR: missing $BUILDER_CPP or $BUILDER_EMIT_C — wrong CWD?" >&2
55- exit 1
56- fi
55+ for f in " $BUILDER_CPP " " $BUILDER_EMIT_C " " $BUILDER_STATE_C_H " " $BUILDER_STATE_C " ; do
56+ if [ ! -f " $f " ]; then
57+ echo " ERROR: missing $f — wrong CWD?" >&2
58+ exit 1
59+ fi
60+ done
5761
5862echo " === w45_bridge_drift_falsifier.sh — W45 gate ==="
5963echo " HEAD: $( git rev-parse HEAD) "
@@ -63,13 +67,19 @@ echo ""
6367# Backup files atomically; restore on any exit.
6468BACKUP_CPP=$( mktemp /tmp/w45_builder_cpp.XXXXXX)
6569BACKUP_C=$( mktemp /tmp/w45_builder_emit_c.XXXXXX)
70+ BACKUP_STATE_H=$( mktemp /tmp/w45_builder_state_h.XXXXXX)
71+ BACKUP_STATE_C=$( mktemp /tmp/w45_builder_state_c.XXXXXX)
6672cp " $BUILDER_CPP " " $BACKUP_CPP "
6773cp " $BUILDER_EMIT_C " " $BACKUP_C "
74+ cp " $BUILDER_STATE_C_H " " $BACKUP_STATE_H "
75+ cp " $BUILDER_STATE_C " " $BACKUP_STATE_C "
6876
6977restore_files () {
7078 cp " $BACKUP_CPP " " $BUILDER_CPP " 2> /dev/null || true
7179 cp " $BACKUP_C " " $BUILDER_EMIT_C " 2> /dev/null || true
72- rm -f " $BACKUP_CPP " " $BACKUP_C " 2> /dev/null || true
80+ cp " $BACKUP_STATE_H " " $BUILDER_STATE_C_H " 2> /dev/null || true
81+ cp " $BACKUP_STATE_C " " $BUILDER_STATE_C " 2> /dev/null || true
82+ rm -f " $BACKUP_CPP " " $BACKUP_C " " $BACKUP_STATE_H " " $BACKUP_STATE_C " 2> /dev/null || true
7383}
7484trap restore_files EXIT
7585
@@ -83,6 +93,9 @@ FIXTURES=(
8393 " hir_builder_emit_copy_free_vars_c|Phase 1 #4 emitCopyFreeVars delegation (5 args)"
8494 " hir_builder_emit_get_yield_from_iter_c|Phase 1 #4 emitGetYieldFromIter delegation (5 args)"
8595 " hir_builder_emit_primitive_load_const_c|Phase 1 #5 emitPrimitiveLoadConst delegation (5 args)"
96+ " hir_builder_state_init|Phase 3 Batch 1 state init (3 args)"
97+ " hir_builder_state_parse_exception_table_c|Phase 3 Batch 1 parseExceptionTable C body (2 args)"
98+ " hir_builder_state_exception_table_push_cpp|Phase 3 Batch 1 exception_table push bridge (6 args)"
8699)
87100
88101# Mutation: append ', int phx_w45_drift' before the closing paren of the
@@ -91,24 +104,20 @@ FIXTURES=(
91104mutate_bridge () {
92105 local symbol=" $1 "
93106 # Match: void <symbol>( ... ) — capture inner contents, append drift param.
94- # Multi-line via perl -0777.
107+ # Multi-line via perl -0777. Apply across all source files containing
108+ # bridge decls / defs.
95109 perl -i -0777 -pe \
96110 " s/(void\s+${symbol} \s*\([^)]*?)\)/\$ {1}, int phx_w45_drift)/g" \
97- " $BUILDER_CPP " " $BUILDER_EMIT_C "
111+ " $BUILDER_CPP " " $BUILDER_EMIT_C " " $BUILDER_STATE_C_H " " $BUILDER_STATE_C "
98112}
99113
100- # Verify mutation actually applied (perl substitution silently no-ops if
101- # pattern doesn't match — guard against false-positive PASS where the
102- # mutation didn't happen and build "passing" is meaningless).
114+ # Verify mutation actually applied somewhere (perl substitution silently
115+ # no-ops if pattern doesn't match — guard against false-positive PASS).
103116verify_mutated () {
104117 local symbol=" $1 "
105- if ! grep -q " phx_w45_drift" " $BUILDER_CPP " 2> /dev/null; then
106- return 1
107- fi
108- if ! grep -q " phx_w45_drift" " $BUILDER_EMIT_C " 2> /dev/null; then
109- return 1
110- fi
111- return 0
118+ grep -l " phx_w45_drift" \
119+ " $BUILDER_CPP " " $BUILDER_EMIT_C " " $BUILDER_STATE_C_H " " $BUILDER_STATE_C " \
120+ 2> /dev/null | grep -q .
112121}
113122
114123PASS=0
@@ -125,6 +134,8 @@ for fixture in "${FIXTURES[@]}"; do
125134 # Restore before each fixture (defensive).
126135 cp " $BACKUP_CPP " " $BUILDER_CPP "
127136 cp " $BACKUP_C " " $BUILDER_EMIT_C "
137+ cp " $BACKUP_STATE_H " " $BUILDER_STATE_C_H "
138+ cp " $BACKUP_STATE_C " " $BUILDER_STATE_C "
128139
129140 # Mutate.
130141 mutate_bridge " $SYMBOL "
@@ -138,8 +149,10 @@ for fixture in "${FIXTURES[@]}"; do
138149
139150 if [ " $DRY_RUN " -eq 1 ]; then
140151 echo " [DRY] mutation applied; mutation-marker sites (build skipped):"
141- grep -n " phx_w45_drift" " $BUILDER_CPP " | sed ' s/^/ cpp: /'
142- grep -n " phx_w45_drift" " $BUILDER_EMIT_C " | sed ' s/^/ c: /'
152+ { grep -n " phx_w45_drift" " $BUILDER_CPP " 2> /dev/null || true ; } | sed ' s/^/ cpp: /'
153+ { grep -n " phx_w45_drift" " $BUILDER_EMIT_C " 2> /dev/null || true ; } | sed ' s/^/ emit_c: /'
154+ { grep -n " phx_w45_drift" " $BUILDER_STATE_C_H " 2> /dev/null || true ; } | sed ' s/^/ state_h: /'
155+ { grep -n " phx_w45_drift" " $BUILDER_STATE_C " 2> /dev/null || true ; } | sed ' s/^/ state_c: /'
143156 SKIP=$(( SKIP+ 1 ))
144157 echo " "
145158 continue
184197echo " --- Restore + verify clean rebuild"
185198cp " $BACKUP_CPP " " $BUILDER_CPP "
186199cp " $BACKUP_C " " $BUILDER_EMIT_C "
200+ cp " $BACKUP_STATE_H " " $BUILDER_STATE_C_H "
201+ cp " $BACKUP_STATE_C " " $BUILDER_STATE_C "
187202
188203if [ " $DRY_RUN " -eq 0 ]; then
189204 BUILD_OUT=$( mktemp /tmp/w45_build_restore.XXXXXX)
0 commit comments