From 36dbba4aa1019da9a96187ce801a279296f15a08 Mon Sep 17 00:00:00 2001 From: nyash-codex Date: Sat, 1 Nov 2025 16:58:33 +0900 Subject: [PATCH] =?UTF-8?q?smokes(loops):=20Direct=20vs=20Bridge=20parity?= =?UTF-8?q?=20=E3=83=86=E3=82=B9=E3=83=88=E3=82=92=E8=BF=BD=E5=8A=A0?= =?UTF-8?q?=EF=BC=88sum/break/continue=E3=80=81opt=E2=80=91in=EF=BC=89\n\n?= =?UTF-8?q?-=20compare=5Floop=5F{sum,break,continue}=5Fvm.sh=EF=BC=88SMOKE?= =?UTF-8?q?S=5FENABLE=5FLOOP=5FCOMPARE=3D1=EF=BC=89\n-=20=E6=97=A2?= =?UTF-8?q?=E5=AD=98=E3=81=AE=20bridge=5Floop=5F*=20=E3=82=92=20chmod=20+x?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../quick/core/loops/compare_loop_break_vm.sh | 66 +++++++++++++++++++ .../core/loops/compare_loop_continue_vm.sh | 66 +++++++++++++++++++ .../quick/core/loops/compare_loop_sum_vm.sh | 63 ++++++++++++++++++ 3 files changed, 195 insertions(+) create mode 100644 tools/smokes/v2/profiles/quick/core/loops/compare_loop_break_vm.sh create mode 100644 tools/smokes/v2/profiles/quick/core/loops/compare_loop_continue_vm.sh create mode 100644 tools/smokes/v2/profiles/quick/core/loops/compare_loop_sum_vm.sh diff --git a/tools/smokes/v2/profiles/quick/core/loops/compare_loop_break_vm.sh b/tools/smokes/v2/profiles/quick/core/loops/compare_loop_break_vm.sh new file mode 100644 index 00000000..87913d6b --- /dev/null +++ b/tools/smokes/v2/profiles/quick/core/loops/compare_loop_break_vm.sh @@ -0,0 +1,66 @@ +#!/bin/bash +# Direct(Builder) vs Bridge(JSON v0) parity — loop + break +# 既定は SKIP(opt-in: SMOKES_ENABLE_LOOP_COMPARE=1) + +source "$(dirname "$0")/../../../lib/test_runner.sh" +source "$(dirname "$0")/../../../lib/result_checker.sh" + +require_env || exit 2 +preflight_plugins || exit 2 + +if [ "${SMOKES_ENABLE_LOOP_COMPARE:-0}" != "1" ]; then + test_skip "compare_loop_break_vm" "opt-in (set SMOKES_ENABLE_LOOP_COMPARE=1)" && exit 0 +fi + +test_compare_loop_break() { + # Direct (Nyash source) + local src=' +local i, result +i = 0 +result = 0 +loop(i < 100) { + if i == 5 { break } + result = result + i + i = i + 1 +} +print(result) +' + local direct_out + direct_out=$(run_nyash_vm -c "$src" 2>&1) + + # Bridge (JSON v0) + local tmp_json="/tmp/nyash_compare_loop_break_$$.json" + cat > "$tmp_json" <<'JSON' +{"version":0,"kind":"Program","body":[ + {"type":"Local","name":"i","expr":{"type":"Int","value":0}}, + {"type":"Local","name":"result","expr":{"type":"Int","value":0}}, + {"type":"Loop", + "cond":{"type":"Compare","op":"<","lhs":{"type":"Var","name":"i"},"rhs":{"type":"Int","value":100}}, + "body":[ + {"type":"If","cond":{"type":"Compare","op":"==","lhs":{"type":"Var","name":"i"},"rhs":{"type":"Int","value":5}}, + "then":[{"type":"Break"}],"else":[]}, + {"type":"Local","name":"result","expr":{"type":"Binary","op":"+","lhs":{"type":"Var","name":"result"},"rhs":{"type":"Var","name":"i"}}}, + {"type":"Local","name":"i","expr":{"type":"Binary","op":"+","lhs":{"type":"Var","name":"i"},"rhs":{"type":"Int","value":1}}} + ] + }, + {"type":"Extern","iface":"env.console","method":"log","args":[{"type":"Var","name":"result"}]} +]} +JSON + local bridge_out + bridge_out=$(NYASH_ENTRY_ALLOW_TOPLEVEL_MAIN=1 "$NYASH_BIN" --backend vm --json-file "$tmp_json" 2>&1 | filter_noise) + rm -f "$tmp_json" + + check_exact "10" "$direct_out" "direct_loop_break" + check_exact "10" "$bridge_out" "bridge_loop_break" + + if [ "$direct_out" != "$bridge_out" ]; then + echo "[FAIL] compare_loop_break: direct != bridge" >&2 + echo " direct: $direct_out" >&2 + echo " bridge: $bridge_out" >&2 + return 1 + fi + return 0 +} + +run_test "compare_loop_break" test_compare_loop_break + diff --git a/tools/smokes/v2/profiles/quick/core/loops/compare_loop_continue_vm.sh b/tools/smokes/v2/profiles/quick/core/loops/compare_loop_continue_vm.sh new file mode 100644 index 00000000..ee6a89f6 --- /dev/null +++ b/tools/smokes/v2/profiles/quick/core/loops/compare_loop_continue_vm.sh @@ -0,0 +1,66 @@ +#!/bin/bash +# Direct(Builder) vs Bridge(JSON v0) parity — loop + continue +# 既定は SKIP(opt-in: SMOKES_ENABLE_LOOP_COMPARE=1) + +source "$(dirname "$0")/../../../lib/test_runner.sh" +source "$(dirname "$0")/../../../lib/result_checker.sh" + +require_env || exit 2 +preflight_plugins || exit 2 + +if [ "${SMOKES_ENABLE_LOOP_COMPARE:-0}" != "1" ]; then + test_skip "compare_loop_continue_vm" "opt-in (set SMOKES_ENABLE_LOOP_COMPARE=1)" && exit 0 +fi + +test_compare_loop_continue() { + # Direct (Nyash source) + local src=' +local i, sum +i = 0 +sum = 0 +loop(i < 5) { + i = i + 1 + if i == 3 { continue } + sum = sum + i +} +print(sum) +' + local direct_out + direct_out=$(run_nyash_vm -c "$src" 2>&1) + + # Bridge (JSON v0) + local tmp_json="/tmp/nyash_compare_loop_continue_$$.json" + cat > "$tmp_json" <<'JSON' +{"version":0,"kind":"Program","body":[ + {"type":"Local","name":"i","expr":{"type":"Int","value":0}}, + {"type":"Local","name":"sum","expr":{"type":"Int","value":0}}, + {"type":"Loop", + "cond":{"type":"Compare","op":"<","lhs":{"type":"Var","name":"i"},"rhs":{"type":"Int","value":5}}, + "body":[ + {"type":"Local","name":"i","expr":{"type":"Binary","op":"+","lhs":{"type":"Var","name":"i"},"rhs":{"type":"Int","value":1}}}, + {"type":"If","cond":{"type":"Compare","op":"==","lhs":{"type":"Var","name":"i"},"rhs":{"type":"Int","value":3}}, + "then":[{"type":"Continue"}],"else":[]}, + {"type":"Local","name":"sum","expr":{"type":"Binary","op":"+","lhs":{"type":"Var","name":"sum"},"rhs":{"type":"Var","name":"i"}}} + ] + }, + {"type":"Extern","iface":"env.console","method":"log","args":[{"type":"Var","name":"sum"}]} +]} +JSON + local bridge_out + bridge_out=$(NYASH_ENTRY_ALLOW_TOPLEVEL_MAIN=1 "$NYASH_BIN" --backend vm --json-file "$tmp_json" 2>&1 | filter_noise) + rm -f "$tmp_json" + + check_exact "12" "$direct_out" "direct_loop_continue" + check_exact "12" "$bridge_out" "bridge_loop_continue" + + if [ "$direct_out" != "$bridge_out" ]; then + echo "[FAIL] compare_loop_continue: direct != bridge" >&2 + echo " direct: $direct_out" >&2 + echo " bridge: $bridge_out" >&2 + return 1 + fi + return 0 +} + +run_test "compare_loop_continue" test_compare_loop_continue + diff --git a/tools/smokes/v2/profiles/quick/core/loops/compare_loop_sum_vm.sh b/tools/smokes/v2/profiles/quick/core/loops/compare_loop_sum_vm.sh new file mode 100644 index 00000000..0176732f --- /dev/null +++ b/tools/smokes/v2/profiles/quick/core/loops/compare_loop_sum_vm.sh @@ -0,0 +1,63 @@ +#!/bin/bash +# Direct(Builder) vs Bridge(JSON v0) parity — loop sum +# 既定は SKIP(opt-in: SMOKES_ENABLE_LOOP_COMPARE=1) + +source "$(dirname "$0")/../../../lib/test_runner.sh" +source "$(dirname "$0")/../../../lib/result_checker.sh" + +require_env || exit 2 +preflight_plugins || exit 2 + +if [ "${SMOKES_ENABLE_LOOP_COMPARE:-0}" != "1" ]; then + test_skip "compare_loop_sum_vm" "opt-in (set SMOKES_ENABLE_LOOP_COMPARE=1)" && exit 0 +fi + +test_compare_loop_sum() { + # Direct (Nyash source) + local src=' +local count, sum +count = 0 +sum = 0 +loop(count < 5) { + sum = sum + count + count = count + 1 +} +print(sum) +' + local direct_out + direct_out=$(run_nyash_vm -c "$src" 2>&1) + + # Bridge (JSON v0) + local tmp_json="/tmp/nyash_compare_loop_sum_$$.json" + cat > "$tmp_json" <<'JSON' +{"version":0,"kind":"Program","body":[ + {"type":"Local","name":"count","expr":{"type":"Int","value":0}}, + {"type":"Local","name":"sum","expr":{"type":"Int","value":0}}, + {"type":"Loop", + "cond":{"type":"Compare","op":"<","lhs":{"type":"Var","name":"count"},"rhs":{"type":"Int","value":5}}, + "body":[ + {"type":"Local","name":"sum","expr":{"type":"Binary","op":"+","lhs":{"type":"Var","name":"sum"},"rhs":{"type":"Var","name":"count"}}}, + {"type":"Local","name":"count","expr":{"type":"Binary","op":"+","lhs":{"type":"Var","name":"count"},"rhs":{"type":"Int","value":1}}} + ] + }, + {"type":"Extern","iface":"env.console","method":"log","args":[{"type":"Var","name":"sum"}]} +]} +JSON + local bridge_out + bridge_out=$(NYASH_ENTRY_ALLOW_TOPLEVEL_MAIN=1 "$NYASH_BIN" --backend vm --json-file "$tmp_json" 2>&1 | filter_noise) + rm -f "$tmp_json" + + check_exact "10" "$direct_out" "direct_loop_sum" + check_exact "10" "$bridge_out" "bridge_loop_sum" + + if [ "$direct_out" != "$bridge_out" ]; then + echo "[FAIL] compare_loop_sum: direct != bridge" >&2 + echo " direct: $direct_out" >&2 + echo " bridge: $bridge_out" >&2 + return 1 + fi + return 0 +} + +run_test "compare_loop_sum" test_compare_loop_sum +