pineforge-codegen 0.7.1__tar.gz → 0.7.3__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- pineforge_codegen-0.7.3/.github/dependabot.yml +20 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/.github/workflows/release.yml +29 -9
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/PKG-INFO +1 -1
- pineforge_codegen-0.7.3/VERSION +1 -0
- pineforge_codegen-0.7.3/gate/compare.mjs +69 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/gate/run-gate.mjs +19 -5
- pineforge_codegen-0.7.3/gate/selftest.mjs +57 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/pineforge_codegen/codegen/base.py +109 -20
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/pineforge_codegen/codegen/visit_call.py +5 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/pineforge_codegen/support_checker.py +62 -19
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/scripts/worker-template.mjs +21 -0
- pineforge_codegen-0.7.3/tests/gate-corpus/err/divergent_last_bar_index.pine +7 -0
- pineforge_codegen-0.7.3/tests/gate-corpus/err/divergent_time_close.pine +9 -0
- pineforge_codegen-0.7.3/tests/gate-corpus/ok/validation__max-bars-back-function-call-deep-history-01.pine +23 -0
- pineforge_codegen-0.7.3/tests/test_codegen_determinism.py +136 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/test_official_surface.py +40 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/test_support_checker.py +78 -8
- pineforge_codegen-0.7.3/tests/test_support_checker_syminfo_gap_fields.py +120 -0
- pineforge_codegen-0.7.1/.github/dependabot.yml +0 -8
- pineforge_codegen-0.7.1/VERSION +0 -1
- pineforge_codegen-0.7.1/gate/compare.mjs +0 -29
- pineforge_codegen-0.7.1/gate/selftest.mjs +0 -29
- pineforge_codegen-0.7.1/tests/test_support_checker_syminfo_gap_fields.py +0 -71
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/.github/workflows/gate.yml +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/.github/workflows/publish-pyodide.yml +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/.github/workflows/test.yml +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/.gitignore +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/CLAUDE.md +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/LEGAL.md +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/LICENSE +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/PYODIDE_TARGET +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/README.md +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/docs/codegen-coverage-gaps.md +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/gate/glue.py +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/gate/oracle.py +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/npm/README.md +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/npm/index.mjs +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/npm/package.json +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/package-lock.json +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/package.json +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/pineforge_codegen/__init__.py +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/pineforge_codegen/analyzer/__init__.py +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/pineforge_codegen/analyzer/base.py +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/pineforge_codegen/analyzer/call_handlers.py +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/pineforge_codegen/analyzer/contracts.py +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/pineforge_codegen/analyzer/diagnostics.py +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/pineforge_codegen/analyzer/tables.py +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/pineforge_codegen/analyzer/types.py +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/pineforge_codegen/ast_nodes.py +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/pineforge_codegen/codegen/__init__.py +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/pineforge_codegen/codegen/emit_top.py +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/pineforge_codegen/codegen/helpers.py +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/pineforge_codegen/codegen/helpers_syminfo.py +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/pineforge_codegen/codegen/input.py +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/pineforge_codegen/codegen/security.py +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/pineforge_codegen/codegen/ta.py +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/pineforge_codegen/codegen/tables.py +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/pineforge_codegen/codegen/types.py +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/pineforge_codegen/codegen/visit_expr.py +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/pineforge_codegen/codegen/visit_stmt.py +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/pineforge_codegen/errors.py +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/pineforge_codegen/lexer.py +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/pineforge_codegen/parser.py +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/pineforge_codegen/pragmas.py +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/pineforge_codegen/signatures.py +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/pineforge_codegen/symbols.py +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/pineforge_codegen/tokens.py +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/pineforge_codegen/tv_input_choices.py +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/pyproject.toml +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/scripts/build-npm-package.mjs +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/scripts/dump-tables.py +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/__init__.py +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/_compile.py +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/err/chart_bg_color.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/err/const_ns_plot_style_free.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/err/const_ns_shape_free.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/err/export_func.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/err/footprint_new.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/err/hard_reject_dividends.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/err/matrix_unknown_elem.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/err/multi_error_one_line.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/err/sec_tf_invalid.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/err/unknown_color.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/err/unknown_math.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/err/unknown_str.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/err/unknown_strategy_fn.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/err/unknown_syminfo.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/err/unknown_ta.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/AAPL__session-ismarket-nyse-rth-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/AAPL__time-tradingday-daily-reset-counter-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/QQQ__session-ispremarket-nasdaq-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/SPY__session-firstbar-vwap-anchor-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/SPY__session-lastbar-flatten-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/crypto-htf__mtf-htf-monthly-ema-cross-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/crypto-leverage__leverage-margin-call-perp-5x-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/forex__symbol-fx-5dp-eurusd-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/futures__symbol-futures-pointvalue-es-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/tutorial__macd__strategy.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/tutorial__mtf__strategy_htf.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/tutorial__mtf__strategy_ltf.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/us-equity__symbol-equity-rth-gaps-aapl-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/us-equity__us-equity-exchange-tz-intraday-cap-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__analyzer-parity-choch-bos-isolator-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__analyzer-parity-edge-margin-50-pct-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__analyzer-parity-percent-of-equity-sizing-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__analyzer-parity-small-equity-fraction-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__analyzer-parity-stop-limit-timing-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__analyzer-self-test-multi-mode-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__anomaly-equity-mirror-strategy-equity-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__barstate-isconfirmed-magnifier-off-01b.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__barstate-isconfirmed-magnifier-on-01a.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__bracket-atr-trail-series-int-points-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__bracket-atr-trailing-stop-state-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__bracket-entry-exit-same-pass-attach-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__bracket-exit-stop-limit-trail-same-bar-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__bracket-exit-three-way-set-once-entry-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__bracket-exit-tp-sl-fixed-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__bracket-narrow-stop-limit-with-trail8-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__bracket-partial-exit-qty-percent-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__bracket-same-id-exit-replace-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__bracket-tp-sl-oca-reduce-isolate-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__bracket-trail-points-no-offset-explicit-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__bracket-trail-points-with-offset-only-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__bracket-trailing-activation-offset-path-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__cap-max-intraday-filled-orders-isolate-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__cap-risk-gates-allow-max-intraday-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__composite-4emarsi-integration-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__composite-4emarsi-quad-ema-stack-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__composite-4emarsi-rsi-pullback-latch-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__composite-4emarsi-session-window-nbar-exit-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__composite-boscurv-integration-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__composite-boscurv-linreg-slope-channel-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__composite-boscurv-pivot-bos-trigger-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__composite-bracket-cap-range-pending-stop-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__composite-ies-adx-regime-classify-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__composite-ies-bb-kc-squeeze-release-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__composite-ies-cooldown-daily-cap-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__composite-ies-equity-feedback-sizing-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__composite-ies-integration-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__composite-ies-pivot-liquidity-sweep-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__composite-ies-pressure-gauge-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__composite-ies-rsi-macd-momentum-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__composite-ies-three-ema-bias-score-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__composite-kanuck-calc-on-every-tick-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__composite-kanuck-integration-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__composite-kanuck-kama-state-recurrence-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__composite-kanuck-max-bars-back-500-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__composite-kkb-ema-atr-breakout-band-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__composite-kkb-integration-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__composite-kkb-kalman-filter-1d-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__composite-kkb-margin-100-pct-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__composite-liqsweep-integration-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__composite-liqsweep-pivot-hh-ll-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__composite-liqsweep-wait-one-continuation-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__composite-liqsweep-wick-pierce-close-back-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__composite-marketshift-integration-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__composite-marketshift-pivot-state-machine-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__composite-marketshift-rolling-highest-lowest-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__composite-marketshift-state-edge-detector-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__composite-scalping-fast-ma-cross-trigger-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__composite-scalping-integration-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__composite-scalping-tight-tp-sl-points-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__composite-trendmaster-integration-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__composite-trendmaster-line-new-projection-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__composite-trendmaster-pivot-anchored-bracket-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__composite-trendmaster-three-tier-ema-state-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__composite-trendmaster-trend-momentum-structure-gate-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__composite-vcp-cumulative-volume-delta-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__composite-vcp-fvg-active-zones-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__composite-vcp-integration-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__composite-vcp-manual-adx-regime-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__composite-vcp-pivot-strength-5-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__composite-vcp-rsi-smooth-divergence-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__composite-vcp-session-tz-newyork-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__composite-vcp-vol-zscore-anomaly-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__composite-wunderscalper-alert-templates-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__composite-wunderscalper-explicit-reverse-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__composite-wunderscalper-integration-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__input-source-runtime-override-high-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__input-source-subscript-hl2-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__ltf-bool-array-bull-majority-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__ltf-numeric-float-ratio15-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__magnifier-tick-dist-endpoints-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__magnifier-tick-dist-endpoints-rsi-cross-08a.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__magnifier-tick-dist-volume-weighted-on-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__matrix-bool-mask-explicit-utc-tz-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__matrix-bool-mask-no-transpose-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__matrix-bool-mask-transpose-roundtrip-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__matrix-bool-regime-mask-24x7-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__matrix-covariance-eigen-pca-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__matrix-eigen-rank-deficient-cov-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__mtf-daily-array-median-percentrank-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__mtf-daily-ema26-warmup-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__mtf-daily-prev-high-break-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__mtf-dual-tf-60-240-rising-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__mtf-htf-60-close-change-baseline-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__mtf-htf-60-close-roll-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__mtf-htf-60-gaps-on-roll-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__mtf-htf-60-rsi14-inside-security-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__mtf-htf-60-sma20-inside-security-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__mtf-htf-60-volume-spike-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__mtf-htf-confluence-manual-trail-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__mtf-htf-confluence-static-bracket-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__mtf-htf-weekly-sma-cross-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__mtf-roll-state-60-240-d-minimal-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__mtf-triple-tf-close-confluence-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__mtf-triple-tf-macd-hist-confluence-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__na-deep-history-int-na-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__na-nz-fixnan-history-chain-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__oca-exit-bracket-internal-cancel-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__oca-multi-bracket-isolation-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__oca-raw-strategy-order-reduce-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__order-close-all-cancel-all-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__order-close-immediate-vs-next-bar-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__order-cross-entry-cancel-same-pass-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__order-cross-entry-close-same-pass-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__order-cross-exit-close-same-pass-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__order-deferred-flip-guaranteed-gap-stops-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__order-deferred-flip-pooc-cross-bar-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__order-dual-four-bar-stop-no-close-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__order-dual-side-same-id-stop-no-cancel-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__order-dual-stop-both-touch-priority-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__order-dual-stop-cancel-rotation-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__order-dual-stop-far-only-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__order-dual-stop-near-only-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__order-dual-stop-open-high-first-path-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__order-dual-stop-open-low-first-path-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__order-dual-stop-open-tie-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__order-dual-stop-source-order-long-first-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__order-dual-stop-source-order-short-first-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__order-entry-implicit-reversal-exit-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__order-flip-stop-no-paired-close-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__order-market-close-fill-basis-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__order-one-side-four-bar-far-opposite-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__order-opposite-entry-close-same-pass-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__order-percent-equity-cash-commission-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__order-process-on-close-false-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__order-process-on-close-true-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__order-range-expansion-pending-stop-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__order-same-id-entry-close-same-bar-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__order-same-id-market-entry-repeat-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__order-same-id-stop-after-flat-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__order-same-id-stop-cross-before-modify-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__order-same-id-stop-minute-zero-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__order-same-id-stop-modification-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__order-same-id-stop-raise-only-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__order-same-id-stop-window-four-bars-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__order-stale-stop-after-close-no-cancel-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__order-stop-cancel-no-regime-close-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__order-stop-entry-cancel-opposite-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__order-stop-entry-reversal-grouping-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__order-stop-entry-touch-boundary-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__pyramid-cash-fractional-commission-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__pyramid-close-id-grouping-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__pyramid-deferred-flip-close-all-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__pyramid-flip-stop-pyramiding-2-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__recompute-alma-sar-corr-magnifier-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__recompute-mtf-rsi-macd-bb-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__risk-max-contracts-held-gate-pyramid-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__session-hour-minute-pulse-filter-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__session-ny-spring-forward-dst-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__stats-eventrades-zero-pnl-count-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__ta-accdist-ema-cross-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__ta-bb-kc-squeeze-breakout-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__ta-bb-rsi-mean-reversion-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__ta-cci-threshold-cross-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__ta-chandelier-exit-direction-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__ta-closedtrades-risk-introspection-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__ta-cmo-9-zero-cross-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__ta-cog-10-signal-cross-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__ta-dmi-adx-di-cross-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__ta-donchian-channel-breakout-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__ta-dual-ma-switch-dispatch-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__ta-dual-thrust-open-anchored-range-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__ta-elder-ray-bull-bear-power-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__ta-ema-ribbon-stack-transition-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__ta-engulfing-candle-pattern-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__ta-highestbars-lowestbars-breakout-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__ta-hma-55-close-cross-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__ta-hma-fast-slow-cross-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__ta-inside-bar-engulfing-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__ta-kama-style-efficiency-ratio-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__ta-keltner-channel-break-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__ta-linreg-stdev-channel-revert-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__ta-macd-12-26-9-line-signal-cross-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__ta-macd-histogram-reversal-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__ta-macd-line-gt-signal-continuous-state-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__ta-map-regime-threshold-lookup-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__ta-median-vs-ema-cross-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__ta-mfi-14-bands-20-80-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__ta-momentum-roc-zero-cross-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__ta-multi-indicator-score-composite-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__ta-nvi-pvi-cross-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__ta-obv-ema-cross-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__ta-percentrank-mean-reversion-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__ta-pivot-array-unshift-pop-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__ta-pivot-atr-stop-target-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__ta-pivot-confirmed-break-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__ta-pivot-point-levels-break-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__ta-pvt-ema-cross-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__ta-range-filter-var-band-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__ta-rci-14-zero-cross-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__ta-rsi-bb-self-bands-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__ta-rsi-ema-signal-cross-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__ta-rsi-macd-and-continuous-state-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__ta-rsi14-bands-30-70-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__ta-rsi14-cross-50-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__ta-rsi14-gt-50-continuous-state-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__ta-rsi14-gt60-lt45-no-matrix-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__ta-sar-flip-entry-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__ta-sma-152-close-cross-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__ta-sma-dual-cross-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__ta-stdev-sma-expansion-break-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__ta-stoch-slow-k-d-cross-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__ta-stochastic-rsi-cross-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__ta-str-match-regex-filter-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__ta-supertrend-adx-filter-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__ta-supertrend-direction-flip-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__ta-triple-sma-stack-latch-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__ta-tsi-25-13-signal-cross-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__ta-volume-spike-atr-breakout-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__ta-vwma-vs-sma-divergence-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__ta-wpr-14-bands-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__timeframe-main-period-self-adaptive-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__udt-method-calls-sibling-cumulative-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__udt-method-default-param-kwargs-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__udt-method-drives-strategy-entry-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__udt-method-extra-primitive-args-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__udt-method-feeds-strategy-exit-prices-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__udt-method-in-for-loop-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__udt-method-in-if-else-branch-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__udt-method-in-switch-arms-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__udt-method-in-while-loop-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__udt-method-mutating-self-ref-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__udt-method-on-array-element-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__udt-method-reads-strategy-state-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__udt-method-receives-ta-series-param-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__udt-method-scalar-return-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__udt-method-tuple-return-destructure-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__udt-method-udt-return-from-func-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__udt-method-uses-history-globals-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__udt-method-uses-math-funcs-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__udt-method-uses-na-nz-fixnan-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__udt-method-var-instance-streak-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__udt-method-windowed-method-chain-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__udt-regime-stack-stress-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__vwap-bands-breakout-1sigma-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__vwap-bands-mean-reversion-2sigma-01.pine +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/golden/matrix_eigen_pca.cpp +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/test_analyzer.py +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/test_analyzer_matrix_inference.py +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/test_analyzer_ta_return_types.py +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/test_codegen_audit_fixes.py +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/test_codegen_fallthrough_guards.py +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/test_codegen_golden.py +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/test_codegen_input_getters.py +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/test_codegen_matrix_typed.py +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/test_codegen_new.py +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/test_compile_corpus.py +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/test_compile_smoke.py +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/test_errors.py +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/test_import_all.py +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/test_input_time_int64.py +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/test_int64_time_storage.py +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/test_lexer.py +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/test_parser.py +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/test_security_tf_literal.py +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/test_signatures.py +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/test_support_checker_chart_visible_bar_time.py +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/test_support_checker_color_cast.py +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/test_support_checker_const_namespaces.py +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/test_support_checker_dividends_earnings.py +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/test_support_checker_footprint.py +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/test_support_checker_input_color.py +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/test_support_checker_input_source.py +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/test_support_checker_matrix.py +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/test_support_checker_security_adjustment.py +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/test_support_checker_timeframe_from_seconds.py +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/test_support_checker_varip.py +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/test_support_checker_volume_row.py +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/test_symbols.py +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/test_ta_official_surface.py +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/test_transpile_division.py +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/test_transpile_enum_order.py +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/test_transpile_pf_trace.py +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/test_transpile_tr_handle_na.py +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/test_transpiler_matrix_kwargs.py +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/test_typespec_matrix.py +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/test_udt_drawing_field_cleanup.py +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/test_unsupported_reporting.py +0 -0
- {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/test_vwap_tuple_unpack.py +0 -0
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
version: 2
|
|
2
|
+
updates:
|
|
3
|
+
# Keep the SHA-pinned GitHub Actions in workflows up to date with
|
|
4
|
+
# reviewable PRs (security review: pinned actions need a bump path).
|
|
5
|
+
- package-ecosystem: "github-actions"
|
|
6
|
+
directory: "/"
|
|
7
|
+
schedule:
|
|
8
|
+
interval: "weekly"
|
|
9
|
+
# The conformance-gate / npm-package tooling (pyodide pinned to PYODIDE_TARGET,
|
|
10
|
+
# tar caret range) — get reviewable bump PRs. NOTE: a pyodide bump must move
|
|
11
|
+
# PYODIDE_TARGET in lockstep (the gate validates against it), so review these.
|
|
12
|
+
- package-ecosystem: "npm"
|
|
13
|
+
directory: "/"
|
|
14
|
+
schedule:
|
|
15
|
+
interval: "weekly"
|
|
16
|
+
# Python dev deps (pytest).
|
|
17
|
+
- package-ecosystem: "pip"
|
|
18
|
+
directory: "/"
|
|
19
|
+
schedule:
|
|
20
|
+
interval: "weekly"
|
|
@@ -36,8 +36,9 @@ jobs:
|
|
|
36
36
|
release:
|
|
37
37
|
runs-on: ubuntu-latest
|
|
38
38
|
env:
|
|
39
|
-
BUMP:
|
|
40
|
-
OVERRIDE:
|
|
39
|
+
BUMP: ${{ inputs.bump }}
|
|
40
|
+
OVERRIDE: ${{ inputs.override }}
|
|
41
|
+
PYTHONHASHSEED: "0" # deterministic gate runtime (match gate.yml)
|
|
41
42
|
steps:
|
|
42
43
|
- uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
|
|
43
44
|
with:
|
|
@@ -83,7 +84,22 @@ jobs:
|
|
|
83
84
|
|
|
84
85
|
- uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5
|
|
85
86
|
with:
|
|
86
|
-
python-version: "3.
|
|
87
|
+
python-version: "3.14" # match the gate's runtime
|
|
88
|
+
|
|
89
|
+
- uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4
|
|
90
|
+
with:
|
|
91
|
+
node-version: "22"
|
|
92
|
+
|
|
93
|
+
# Conformance gate (BLOCKING): the differential parity gate must pass
|
|
94
|
+
# before anything is built, published, or tagged. A gate-broken codegen
|
|
95
|
+
# fails the release here — nothing reaches PyPI, no tag is pushed (so the
|
|
96
|
+
# tag->npm trigger never fires), and no GitHub Release is created.
|
|
97
|
+
- name: Run conformance gate (blocking)
|
|
98
|
+
run: |
|
|
99
|
+
python -m pip install -e .
|
|
100
|
+
npm ci
|
|
101
|
+
npm run gate:selftest
|
|
102
|
+
npm run gate:full
|
|
87
103
|
|
|
88
104
|
- name: Build sdist + wheel
|
|
89
105
|
run: |
|
|
@@ -91,8 +107,16 @@ jobs:
|
|
|
91
107
|
python -m build
|
|
92
108
|
ls -l dist/
|
|
93
109
|
|
|
94
|
-
#
|
|
95
|
-
#
|
|
110
|
+
# Publish to PyPI BEFORE the tag is pushed. The tag push triggers
|
|
111
|
+
# publish-pyodide.yml (npm), so PyPI must land first — otherwise a PyPI
|
|
112
|
+
# failure would leave npm shipping a version PyPI never got.
|
|
113
|
+
- name: Publish to PyPI
|
|
114
|
+
if: ${{ !inputs.dry_run }}
|
|
115
|
+
uses: pypa/gh-action-pypi-publish@cef221092ed1bacb1cc03d23a2d87d1d172e277b # release/v1
|
|
116
|
+
|
|
117
|
+
# Commit + tag + push AFTER PyPI succeeds. The `git push --tags` triggers
|
|
118
|
+
# publish-pyodide.yml for npm (which re-runs the gate — defense in depth),
|
|
119
|
+
# so the tag only exists once the gate passed and PyPI published.
|
|
96
120
|
- name: Commit + tag + push
|
|
97
121
|
if: ${{ !inputs.dry_run }}
|
|
98
122
|
env:
|
|
@@ -105,10 +129,6 @@ jobs:
|
|
|
105
129
|
git tag "v${NEW_VERSION}"
|
|
106
130
|
git push origin HEAD --tags
|
|
107
131
|
|
|
108
|
-
- name: Publish to PyPI
|
|
109
|
-
if: ${{ !inputs.dry_run }}
|
|
110
|
-
uses: pypa/gh-action-pypi-publish@cef221092ed1bacb1cc03d23a2d87d1d172e277b # release/v1
|
|
111
|
-
|
|
112
132
|
- name: Create GitHub Release
|
|
113
133
|
if: ${{ !inputs.dry_run }}
|
|
114
134
|
env:
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: pineforge-codegen
|
|
3
|
-
Version: 0.7.
|
|
3
|
+
Version: 0.7.3
|
|
4
4
|
Summary: PineScript v6 to C++ transpiler that targets the pineforge-engine runtime.
|
|
5
5
|
Project-URL: Homepage, https://github.com/pineforge-4pass/pineforge-codegen-oss
|
|
6
6
|
Project-URL: Issues, https://github.com/pineforge-4pass/pineforge-codegen-oss/issues
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
0.7.3
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
// Pure, side-effect-free comparator for the gate. Both run-gate.mjs (the runner)
|
|
2
|
+
// and selftest.mjs (the canary) import this — so importing it never triggers a
|
|
3
|
+
// gate run. Each side is {json: "<transpile_json string>"} (normal return) or
|
|
4
|
+
// {unexpected: "Type: msg"} (non-CompileError exception). Returns a mismatch
|
|
5
|
+
// string, or null if the two sides agree.
|
|
6
|
+
export function compareResults(name, native, browser) {
|
|
7
|
+
if (!native) return `${name}: oracle produced no result`;
|
|
8
|
+
if (!browser) return `${name}: pyodide produced no result`;
|
|
9
|
+
if (native.unexpected || browser.unexpected) {
|
|
10
|
+
if (native.unexpected !== browser.unexpected) {
|
|
11
|
+
return `${name}: unexpected-exception mismatch\n native : ${native.unexpected ?? "<none>"}\n pyodide: ${browser.unexpected ?? "<none>"}`;
|
|
12
|
+
}
|
|
13
|
+
return null;
|
|
14
|
+
}
|
|
15
|
+
if (native.json !== browser.json) {
|
|
16
|
+
let detail = "";
|
|
17
|
+
try {
|
|
18
|
+
const n = JSON.parse(native.json);
|
|
19
|
+
const b = JSON.parse(browser.json);
|
|
20
|
+
if (n.ok !== b.ok) detail = `verdict ${b.ok} (pyodide) != ${n.ok} (native)`;
|
|
21
|
+
else if (n.ok) detail = "C++ output differs";
|
|
22
|
+
else detail = `error/diagnostics differ\n native : ${native.json}\n pyodide: ${browser.json}`;
|
|
23
|
+
} catch {
|
|
24
|
+
detail = `raw json differs\n native : ${native.json}\n pyodide: ${browser.json}`;
|
|
25
|
+
}
|
|
26
|
+
return `${name}: ${detail}`;
|
|
27
|
+
}
|
|
28
|
+
return null;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
// Expected verdict for a corpus branch: "ok/*" fixtures must transpile
|
|
32
|
+
// successfully (result.ok === true), "err/*" fixtures must be rejected
|
|
33
|
+
// (result.ok === false). Anything else — the wrong verdict, an unparseable
|
|
34
|
+
// payload, or an unexpected (non-CompileError) exception — is a gate failure
|
|
35
|
+
// even when native and wasm agree (two identical crashes must NOT pass).
|
|
36
|
+
//
|
|
37
|
+
// This is intentionally separate from compareResults so the gate enforces BOTH
|
|
38
|
+
// (a) native↔wasm parity and (b) the right answer. `side` is {json} or
|
|
39
|
+
// {unexpected}; `expectOk` is true for "ok", false for "err".
|
|
40
|
+
function verdictOf(side) {
|
|
41
|
+
if (!side) return { kind: "missing" };
|
|
42
|
+
if (side.unexpected) return { kind: "unexpected", detail: side.unexpected };
|
|
43
|
+
try {
|
|
44
|
+
const v = JSON.parse(side.json);
|
|
45
|
+
if (typeof v.ok !== "boolean") return { kind: "malformed", detail: side.json };
|
|
46
|
+
return { kind: "verdict", ok: v.ok };
|
|
47
|
+
} catch {
|
|
48
|
+
return { kind: "malformed", detail: side.json };
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
// Returns a failure string if either side does not match the expected verdict
|
|
53
|
+
// for the fixture's branch, or null if both sides produced the expected verdict.
|
|
54
|
+
export function checkExpectedVerdict(name, expectOk, native, browser) {
|
|
55
|
+
for (const [label, side] of [["native", native], ["pyodide", browser]]) {
|
|
56
|
+
const r = verdictOf(side);
|
|
57
|
+
if (r.kind === "missing") return `${name}: ${label} produced no result`;
|
|
58
|
+
if (r.kind === "unexpected") {
|
|
59
|
+
return `${name}: ${label} threw an unexpected exception (expected ok=${expectOk}): ${r.detail}`;
|
|
60
|
+
}
|
|
61
|
+
if (r.kind === "malformed") {
|
|
62
|
+
return `${name}: ${label} returned a malformed result (expected ok=${expectOk}): ${r.detail}`;
|
|
63
|
+
}
|
|
64
|
+
if (r.ok !== expectOk) {
|
|
65
|
+
return `${name}: ${label} verdict ok=${r.ok} but corpus dir expects ok=${expectOk}`;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
return null;
|
|
69
|
+
}
|
|
@@ -13,7 +13,7 @@ import { existsSync, mkdirSync, readFileSync, readdirSync, writeFileSync } from
|
|
|
13
13
|
import { createRequire } from "node:module";
|
|
14
14
|
import { dirname, join } from "node:path";
|
|
15
15
|
import { fileURLToPath } from "node:url";
|
|
16
|
-
import { compareResults } from "./compare.mjs";
|
|
16
|
+
import { checkExpectedVerdict, compareResults } from "./compare.mjs";
|
|
17
17
|
|
|
18
18
|
const require = createRequire(import.meta.url);
|
|
19
19
|
const HERE = dirname(fileURLToPath(import.meta.url));
|
|
@@ -79,8 +79,14 @@ async function main() {
|
|
|
79
79
|
});
|
|
80
80
|
const native = JSON.parse(oracleOut);
|
|
81
81
|
|
|
82
|
-
// 4. Pyodide side + compare.
|
|
82
|
+
// 4. Pyodide side + compare. The gate enforces TWO independent properties:
|
|
83
|
+
// (a) native↔wasm parity (compareResults) and
|
|
84
|
+
// (b) the EXPECTED verdict by corpus dir (checkExpectedVerdict): ok/* must
|
|
85
|
+
// succeed, err/* must be rejected. A purely differential check would
|
|
86
|
+
// let two identical crashes — or an ok/ fixture that erroneously errors
|
|
87
|
+
// — slip through; (b) closes that gap.
|
|
83
88
|
const mismatches = [];
|
|
89
|
+
const verdictFailures = [];
|
|
84
90
|
for (const { name, src } of items) {
|
|
85
91
|
let browser;
|
|
86
92
|
try {
|
|
@@ -90,6 +96,9 @@ async function main() {
|
|
|
90
96
|
}
|
|
91
97
|
const m = compareResults(name, native[name], browser);
|
|
92
98
|
if (m) mismatches.push(m);
|
|
99
|
+
const expectOk = name.startsWith("ok/");
|
|
100
|
+
const v = checkExpectedVerdict(name, expectOk, native[name], browser);
|
|
101
|
+
if (v) verdictFailures.push(v);
|
|
93
102
|
}
|
|
94
103
|
|
|
95
104
|
// 5. release.json (versions derived from the loaded Pyodide lock).
|
|
@@ -106,11 +115,16 @@ async function main() {
|
|
|
106
115
|
writeFileSync(join(ROOT, "release.json"), JSON.stringify(release, null, 2) + "\n");
|
|
107
116
|
console.log("gate: release.json ->", JSON.stringify(release));
|
|
108
117
|
|
|
109
|
-
if (mismatches.length) {
|
|
110
|
-
|
|
118
|
+
if (mismatches.length || verdictFailures.length) {
|
|
119
|
+
if (mismatches.length) {
|
|
120
|
+
console.error(`gate: ${mismatches.length} PARITY MISMATCH(es):\n` + mismatches.join("\n"));
|
|
121
|
+
}
|
|
122
|
+
if (verdictFailures.length) {
|
|
123
|
+
console.error(`gate: ${verdictFailures.length} VERDICT FAILURE(s) (wrong ok/err result):\n` + verdictFailures.join("\n"));
|
|
124
|
+
}
|
|
111
125
|
process.exit(1);
|
|
112
126
|
}
|
|
113
|
-
console.log(`gate: PARITY OK over ${items.length} fixtures`);
|
|
127
|
+
console.log(`gate: PARITY OK over ${items.length} fixtures (verdicts asserted: ok/* succeed, err/* rejected)`);
|
|
114
128
|
}
|
|
115
129
|
|
|
116
130
|
main().catch((e) => {
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
// Canary: prove the gate's checks actually catch divergences. Imports the PURE
|
|
2
|
+
// comparator + verdict checker (gate/compare.mjs) so it runs in <1s without
|
|
3
|
+
// loading Pyodide. Covers BOTH (a) native↔wasm parity (compareResults) and
|
|
4
|
+
// (b) expected-verdict-by-corpus-dir (checkExpectedVerdict).
|
|
5
|
+
import { checkExpectedVerdict, compareResults } from "./compare.mjs";
|
|
6
|
+
|
|
7
|
+
const OK = '{"ok":true,"cpp":"X"}';
|
|
8
|
+
const ERR = '{"ok":false,"error":"e","diagnostics":[]}';
|
|
9
|
+
|
|
10
|
+
// --- (a) differential comparator cases: [name, native, browser, mustFlag] ---
|
|
11
|
+
const cmpCases = [
|
|
12
|
+
["same-ok", { json: OK }, { json: OK }, false],
|
|
13
|
+
["cpp-differs", { json: '{"ok":true,"cpp":"X"}' }, { json: '{"ok":true,"cpp":"Y"}' }, true],
|
|
14
|
+
["verdict-differs", { json: OK }, { json: ERR }, true],
|
|
15
|
+
["error-differs", { json: '{"ok":false,"error":"a","diagnostics":[]}' }, { json: '{"ok":false,"error":"b","diagnostics":[]}' }, true],
|
|
16
|
+
["unexpected-one-side", { json: OK }, { unexpected: "TypeError: boom" }, true],
|
|
17
|
+
["unexpected-both-same", { unexpected: "TypeError: boom" }, { unexpected: "TypeError: boom" }, false],
|
|
18
|
+
["unexpected-both-diff", { unexpected: "TypeError: a" }, { unexpected: "ValueError: b" }, true],
|
|
19
|
+
["missing-native", undefined, { json: OK }, true],
|
|
20
|
+
];
|
|
21
|
+
|
|
22
|
+
// --- (b) expected-verdict cases: [name, expectOk, native, browser, mustFlag] ---
|
|
23
|
+
// A native↔wasm match with the WRONG verdict (e.g. ok/ that errors, or a shared
|
|
24
|
+
// unexpected exception) must FAIL even though compareResults would pass it.
|
|
25
|
+
const verdictCases = [
|
|
26
|
+
["ok/good", true, { json: OK }, { json: OK }, false],
|
|
27
|
+
["err/bad", false, { json: ERR }, { json: ERR }, false],
|
|
28
|
+
["ok/that-errors-both-sides", true, { json: ERR }, { json: ERR }, true],
|
|
29
|
+
["err/that-succeeds-both-sides", false, { json: OK }, { json: OK }, true],
|
|
30
|
+
["ok/unexpected-both-same", true, { unexpected: "TypeError: boom" }, { unexpected: "TypeError: boom" }, true],
|
|
31
|
+
["err/unexpected-both-same", false, { unexpected: "TypeError: boom" }, { unexpected: "TypeError: boom" }, true],
|
|
32
|
+
["ok/native-wrong-only", true, { json: ERR }, { json: OK }, true],
|
|
33
|
+
["ok/pyodide-wrong-only", true, { json: OK }, { json: ERR }, true],
|
|
34
|
+
["ok/missing-native", true, undefined, { json: OK }, true],
|
|
35
|
+
["ok/malformed", true, { json: "not json" }, { json: OK }, true],
|
|
36
|
+
];
|
|
37
|
+
|
|
38
|
+
let failed = 0;
|
|
39
|
+
for (const [name, n, b, mustFlag] of cmpCases) {
|
|
40
|
+
const flagged = compareResults(name, n, b) !== null;
|
|
41
|
+
if (flagged !== mustFlag) {
|
|
42
|
+
console.error(`selftest FAIL (compareResults): ${name} expected mustFlag=${mustFlag} got ${flagged}`);
|
|
43
|
+
failed++;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
for (const [name, expectOk, n, b, mustFlag] of verdictCases) {
|
|
47
|
+
const flagged = checkExpectedVerdict(name, expectOk, n, b) !== null;
|
|
48
|
+
if (flagged !== mustFlag) {
|
|
49
|
+
console.error(`selftest FAIL (checkExpectedVerdict): ${name} expected mustFlag=${mustFlag} got ${flagged}`);
|
|
50
|
+
failed++;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
if (failed) {
|
|
54
|
+
console.error(`gate selftest: ${failed} case(s) failed`);
|
|
55
|
+
process.exit(1);
|
|
56
|
+
}
|
|
57
|
+
console.log(`gate selftest: ${cmpCases.length} comparator + ${verdictCases.length} verdict cases OK`);
|
|
@@ -185,19 +185,31 @@ class CodeGen(CallVisitor, ExprVisitor, StmtVisitor, TopLevelEmitter, SecurityEm
|
|
|
185
185
|
# This ensures sub-function series vars get cloned for the parent's call sites.
|
|
186
186
|
func_var_originals: dict[str, list[str]] = {} # func_name -> list of original var names
|
|
187
187
|
|
|
188
|
-
# First, collect all function-scoped series vars (union across all functions)
|
|
189
|
-
|
|
188
|
+
# First, collect all function-scoped series vars (union across all functions).
|
|
189
|
+
# Use an ordered, de-duplicated list (NOT a set): set iteration order is
|
|
190
|
+
# PYTHONHASHSEED-randomized, and this order reaches emitted C++ member
|
|
191
|
+
# declarations via ``orig_names`` -> ``func_var_originals`` ->
|
|
192
|
+
# ``_func_cs_var_remap``. ``ctx.func_series_vars`` is a dict whose VALUES
|
|
193
|
+
# are themselves sets (analyzer stores ``dict[str, set]``), so we must
|
|
194
|
+
# iterate each value in ``sorted`` order to be hash-seed independent.
|
|
195
|
+
all_func_scoped_series: list[str] = []
|
|
190
196
|
for svars in ctx.func_series_vars.values():
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
197
|
+
for sv in sorted(svars):
|
|
198
|
+
if sv not in all_func_scoped_series:
|
|
199
|
+
all_func_scoped_series.append(sv)
|
|
200
|
+
# Also include function-scoped var_members (same ordered-list rationale).
|
|
201
|
+
# ``ctx.func_var_members`` values are lists (already insertion-ordered).
|
|
202
|
+
all_func_scoped_vars: list[str] = []
|
|
194
203
|
for vlist in ctx.func_var_members.values():
|
|
195
204
|
for n, _, _ in vlist:
|
|
196
|
-
all_func_scoped_vars
|
|
205
|
+
if n not in all_func_scoped_vars:
|
|
206
|
+
all_func_scoped_vars.append(n)
|
|
197
207
|
|
|
198
208
|
# For each function with call-site cloning (has TA ranges or is called multiple times),
|
|
199
|
-
# include ALL function-scoped series/var vars that could be used in its body
|
|
200
|
-
|
|
209
|
+
# include ALL function-scoped series/var vars that could be used in its body.
|
|
210
|
+
# Iterate the dict directly (insertion-ordered) rather than ``set(...keys())``,
|
|
211
|
+
# which would randomize the order of emitted clones across hash seeds.
|
|
212
|
+
for fname in ctx.func_call_site_counts:
|
|
201
213
|
total_cs = ctx.func_call_site_counts[fname]
|
|
202
214
|
if total_cs <= 1:
|
|
203
215
|
continue # No cloning needed for single-call-site functions
|
|
@@ -207,9 +219,9 @@ class CodeGen(CallVisitor, ExprVisitor, StmtVisitor, TopLevelEmitter, SecurityEm
|
|
|
207
219
|
for n, _, _ in ctx.func_var_members[fname]:
|
|
208
220
|
if n not in orig_names:
|
|
209
221
|
orig_names.append(n)
|
|
210
|
-
# Include function's own series vars
|
|
222
|
+
# Include function's own series vars (set -> sorted for determinism)
|
|
211
223
|
if fname in ctx.func_series_vars:
|
|
212
|
-
for sv in ctx.func_series_vars[fname]:
|
|
224
|
+
for sv in sorted(ctx.func_series_vars[fname]):
|
|
213
225
|
if sv not in orig_names:
|
|
214
226
|
orig_names.append(sv)
|
|
215
227
|
# Include series vars from sub-functions (they share the same class members)
|
|
@@ -457,6 +469,79 @@ class CodeGen(CallVisitor, ExprVisitor, StmtVisitor, TopLevelEmitter, SecurityEm
|
|
|
457
469
|
self._register_global_aggregate_member_types()
|
|
458
470
|
self._uses_matrix = self._detect_matrix_usage()
|
|
459
471
|
|
|
472
|
+
# max_bars_back: the per-variable history depth the engine's Series<T>
|
|
473
|
+
# ring buffer should retain. Pine exposes this two ways — the
|
|
474
|
+
# ``strategy(..., max_bars_back=N)`` kwarg (global) and the
|
|
475
|
+
# ``max_bars_back(var, N)`` function (per-var). The engine's
|
|
476
|
+
# ``Series<T>(int max_len)`` ctor (default 500, include/pineforge/
|
|
477
|
+
# series.hpp) is the wiring point: reads past the retained depth return
|
|
478
|
+
# na, so honoring the directive means constructing each Series with a
|
|
479
|
+
# capacity >= the requested depth. We take the MAX requested N and apply
|
|
480
|
+
# it (via ``_series_decl_suffix`` -> ``{N}``) to the directly-declared
|
|
481
|
+
# ``Series<T>`` members — a safe superset of Pine's per-var semantics
|
|
482
|
+
# (it never retains LESS than Pine, so any history access that succeeds
|
|
483
|
+
# in Pine succeeds here). ``None`` => no directive => keep the engine
|
|
484
|
+
# default 500 (emit a bare ``Series<T>`` with no ctor arg, so
|
|
485
|
+
# directive-free output is byte-identical to before).
|
|
486
|
+
#
|
|
487
|
+
# KNOWN LIMITATION: the lazily-constructed security-helper map series
|
|
488
|
+
# (``_security_helper_series_``, the ``std::unordered_map<std::string,
|
|
489
|
+
# Series<double>>`` ~line 971) do NOT pick up the cap. Their entries are
|
|
490
|
+
# default-constructed on first ``operator[]`` access, so they always use
|
|
491
|
+
# the engine default 500 regardless of the requested ``N``. A
|
|
492
|
+
# max_bars_back directive larger than 500 is therefore not honored for
|
|
493
|
+
# history reads off security-helper series.
|
|
494
|
+
self._max_bars_back_cap: int | None = self._compute_max_bars_back_cap()
|
|
495
|
+
|
|
496
|
+
@staticmethod
|
|
497
|
+
def _int_literal_value(node: ASTNode | None) -> int | None:
|
|
498
|
+
"""Return the integer value of a (possibly unary-minus) NumberLiteral,
|
|
499
|
+
or None if ``node`` is not an integer literal expression."""
|
|
500
|
+
if isinstance(node, UnaryOp) and node.op == "-":
|
|
501
|
+
inner = CodeGen._int_literal_value(node.operand)
|
|
502
|
+
return -inner if inner is not None else None
|
|
503
|
+
if isinstance(node, NumberLiteral) and isinstance(node.value, int):
|
|
504
|
+
return node.value
|
|
505
|
+
if isinstance(node, NumberLiteral) and isinstance(node.value, float):
|
|
506
|
+
# Pine accepts ``max_bars_back=5e2`` style; accept integral floats.
|
|
507
|
+
return int(node.value) if node.value.is_integer() else None
|
|
508
|
+
return None
|
|
509
|
+
|
|
510
|
+
def _compute_max_bars_back_cap(self) -> int | None:
|
|
511
|
+
"""Scan the AST for max_bars_back directives (strategy() kwarg AND the
|
|
512
|
+
bare function call) and return the largest positive integer requested,
|
|
513
|
+
or None if none is present / none is a usable literal."""
|
|
514
|
+
ast = getattr(self.ctx, "ast", None)
|
|
515
|
+
if ast is None:
|
|
516
|
+
return None
|
|
517
|
+
caps: list[int] = []
|
|
518
|
+
for node in self._walk_ast(ast):
|
|
519
|
+
if isinstance(node, StrategyDecl):
|
|
520
|
+
val = self._int_literal_value(node.kwargs.get("max_bars_back"))
|
|
521
|
+
if val is not None and val > 0:
|
|
522
|
+
caps.append(val)
|
|
523
|
+
elif (
|
|
524
|
+
isinstance(node, FuncCall)
|
|
525
|
+
and isinstance(node.callee, Identifier)
|
|
526
|
+
and node.callee.name == "max_bars_back"
|
|
527
|
+
):
|
|
528
|
+
# max_bars_back(var, num) — second positional arg, or the
|
|
529
|
+
# ``num=`` kwarg, is the depth.
|
|
530
|
+
num_node = None
|
|
531
|
+
if len(node.args) >= 2:
|
|
532
|
+
num_node = node.args[1]
|
|
533
|
+
elif "num" in node.kwargs:
|
|
534
|
+
num_node = node.kwargs["num"]
|
|
535
|
+
val = self._int_literal_value(num_node)
|
|
536
|
+
if val is not None and val > 0:
|
|
537
|
+
caps.append(val)
|
|
538
|
+
return max(caps) if caps else None
|
|
539
|
+
|
|
540
|
+
def _series_decl_suffix(self) -> str:
|
|
541
|
+
"""C++ constructor-arg suffix for Series<T> member declarations. Empty
|
|
542
|
+
(engine default 500) unless a max_bars_back directive raised the cap."""
|
|
543
|
+
return f"{{{self._max_bars_back_cap}}}" if self._max_bars_back_cap else ""
|
|
544
|
+
|
|
460
545
|
def _register_global_aggregate_member_types(self) -> None:
|
|
461
546
|
"""Infer matrix/array/map class members for global non-var declarations from RHS AST.
|
|
462
547
|
|
|
@@ -790,6 +875,10 @@ class CodeGen(CallVisitor, ExprVisitor, StmtVisitor, TopLevelEmitter, SecurityEm
|
|
|
790
875
|
|
|
791
876
|
lines: list[str] = []
|
|
792
877
|
|
|
878
|
+
# Series<T> ctor-arg suffix from any max_bars_back directive (empty when
|
|
879
|
+
# absent, so directive-free output is byte-identical to before).
|
|
880
|
+
_mbb = self._series_decl_suffix()
|
|
881
|
+
|
|
793
882
|
# 1. Includes
|
|
794
883
|
self._emit_includes(lines)
|
|
795
884
|
|
|
@@ -863,7 +952,7 @@ class CodeGen(CallVisitor, ExprVisitor, StmtVisitor, TopLevelEmitter, SecurityEm
|
|
|
863
952
|
self._security_ohlc_hist_fields_by_sec.get(sec_id, ())
|
|
864
953
|
):
|
|
865
954
|
lines.append(
|
|
866
|
-
f" Series<double> {self._security_ohlc_hist_series_cpp(sec_id, field)};"
|
|
955
|
+
f" Series<double> {self._security_ohlc_hist_series_cpp(sec_id, field)}{_mbb};"
|
|
867
956
|
)
|
|
868
957
|
continue
|
|
869
958
|
if returns_tuple and tuple_size and tuple_size > 0 and isinstance(expr_node, TupleLiteral):
|
|
@@ -884,7 +973,7 @@ class CodeGen(CallVisitor, ExprVisitor, StmtVisitor, TopLevelEmitter, SecurityEm
|
|
|
884
973
|
lines.append(f" double _req_sec_{sec_id} = na<double>();")
|
|
885
974
|
for field in sorted(self._security_ohlc_hist_fields_by_sec.get(sec_id, ())):
|
|
886
975
|
lines.append(
|
|
887
|
-
f" Series<double> {self._security_ohlc_hist_series_cpp(sec_id, field)};"
|
|
976
|
+
f" Series<double> {self._security_ohlc_hist_series_cpp(sec_id, field)}{_mbb};"
|
|
888
977
|
)
|
|
889
978
|
|
|
890
979
|
if self._security_calls:
|
|
@@ -899,7 +988,7 @@ class CodeGen(CallVisitor, ExprVisitor, StmtVisitor, TopLevelEmitter, SecurityEm
|
|
|
899
988
|
state_name = self._security_state_name(info["sec_id"], name)
|
|
900
989
|
cpp_type = self._security_cpp_type_for_mutable(name, ginfo)
|
|
901
990
|
if getattr(ginfo, "is_series", False):
|
|
902
|
-
lines.append(f" Series<{cpp_type}> {state_name};")
|
|
991
|
+
lines.append(f" Series<{cpp_type}> {state_name}{_mbb};")
|
|
903
992
|
else:
|
|
904
993
|
default = self._default_for_type(cpp_type)
|
|
905
994
|
lines.append(f" {cpp_type} {state_name} = {default};")
|
|
@@ -926,7 +1015,7 @@ class CodeGen(CallVisitor, ExprVisitor, StmtVisitor, TopLevelEmitter, SecurityEm
|
|
|
926
1015
|
|
|
927
1016
|
# 4. Series members for bar field history
|
|
928
1017
|
for field_name in sorted(self.ctx.series_bar_fields):
|
|
929
|
-
lines.append(f" Series<double> _s_{field_name};")
|
|
1018
|
+
lines.append(f" Series<double> _s_{field_name}{_mbb};")
|
|
930
1019
|
|
|
931
1020
|
# 5. var/varip members (deduplicate by name)
|
|
932
1021
|
seen_var_members: set[str] = set()
|
|
@@ -975,7 +1064,7 @@ class CodeGen(CallVisitor, ExprVisitor, StmtVisitor, TopLevelEmitter, SecurityEm
|
|
|
975
1064
|
if cpp_type == "int" and self._is_int64_builtin_init(name):
|
|
976
1065
|
cpp_type = "int64_t"
|
|
977
1066
|
if name in self.ctx.series_vars:
|
|
978
|
-
lines.append(f" Series<{cpp_type}> {safe};")
|
|
1067
|
+
lines.append(f" Series<{cpp_type}> {safe}{_mbb};")
|
|
979
1068
|
else:
|
|
980
1069
|
lines.append(f" {cpp_type} {safe};")
|
|
981
1070
|
|
|
@@ -984,7 +1073,7 @@ class CodeGen(CallVisitor, ExprVisitor, StmtVisitor, TopLevelEmitter, SecurityEm
|
|
|
984
1073
|
if name not in self._var_names:
|
|
985
1074
|
safe = self._safe_name(name)
|
|
986
1075
|
cpp_type = self._series_type_for(name)
|
|
987
|
-
lines.append(f" Series<{cpp_type}> {safe};")
|
|
1076
|
+
lines.append(f" Series<{cpp_type}> {safe}{_mbb};")
|
|
988
1077
|
|
|
989
1078
|
# 7. Fixnan members
|
|
990
1079
|
for site in self.ctx.fixnan_sites:
|
|
@@ -997,9 +1086,9 @@ class CodeGen(CallVisitor, ExprVisitor, StmtVisitor, TopLevelEmitter, SecurityEm
|
|
|
997
1086
|
# Determine type: int for count vars, double for float vars
|
|
998
1087
|
if member in ("closedtrades", "opentrades", "wintrades", "losstrades",
|
|
999
1088
|
"eventrades"):
|
|
1000
|
-
lines.append(f" Series<int> {svar};")
|
|
1089
|
+
lines.append(f" Series<int> {svar}{_mbb};")
|
|
1001
1090
|
else:
|
|
1002
|
-
lines.append(f" Series<double> {svar};")
|
|
1091
|
+
lines.append(f" Series<double> {svar}{_mbb};")
|
|
1003
1092
|
|
|
1004
1093
|
# 8b. Global-scope non-var declarations as class members
|
|
1005
1094
|
# (so user-defined functions can reference them)
|
|
@@ -1051,7 +1140,7 @@ class CodeGen(CallVisitor, ExprVisitor, StmtVisitor, TopLevelEmitter, SecurityEm
|
|
|
1051
1140
|
if self._safe_name(vname) == orig_safe:
|
|
1052
1141
|
cpp_type = PINE_TYPE_TO_CPP.get(ptype, "double")
|
|
1053
1142
|
if vname in self.ctx.series_vars:
|
|
1054
|
-
lines.append(f" Series<{cpp_type}> {cloned_safe};")
|
|
1143
|
+
lines.append(f" Series<{cpp_type}> {cloned_safe}{_mbb};")
|
|
1055
1144
|
elif vname in self._matrix_specs:
|
|
1056
1145
|
lines.append(f" {self._type_spec_to_cpp(self._matrix_specs[vname])} {cloned_safe};")
|
|
1057
1146
|
elif vname in self._array_vars:
|
|
@@ -1066,7 +1155,7 @@ class CodeGen(CallVisitor, ExprVisitor, StmtVisitor, TopLevelEmitter, SecurityEm
|
|
|
1066
1155
|
# Non-var series var
|
|
1067
1156
|
if orig_safe in [self._safe_name(n) for n in self.ctx.series_vars]:
|
|
1068
1157
|
cpp_type = self._series_type_for(orig_safe)
|
|
1069
|
-
lines.append(f" Series<{cpp_type}> {cloned_safe};")
|
|
1158
|
+
lines.append(f" Series<{cpp_type}> {cloned_safe}{_mbb};")
|
|
1070
1159
|
else:
|
|
1071
1160
|
lines.append(f" double {cloned_safe} = 0.0;")
|
|
1072
1161
|
|
|
@@ -444,6 +444,11 @@ class CallVisitor:
|
|
|
444
444
|
return "0"
|
|
445
445
|
if func_name in SKIP_FUNC_NAMES and namespace is None:
|
|
446
446
|
return "0"
|
|
447
|
+
# max_bars_back(var, num): a history-depth DIRECTIVE, not a value.
|
|
448
|
+
# Its effect is captured in CodeGen._compute_max_bars_back_cap (which
|
|
449
|
+
# sizes every Series<T> ring buffer), so the call itself emits nothing.
|
|
450
|
+
if func_name == "max_bars_back" and namespace is None:
|
|
451
|
+
return "0"
|
|
447
452
|
|
|
448
453
|
# request.* calls
|
|
449
454
|
if namespace == "request":
|