pineforge-codegen 0.10.1__tar.gz → 0.10.2__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.10.1 → pineforge_codegen-0.10.2}/.github/workflows/release.yml +1 -1
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/PKG-INFO +2 -2
- pineforge_codegen-0.10.2/VERSION +1 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/docs/codegen-coverage-gaps.md +52 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/pineforge_codegen/codegen/base.py +141 -1
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/pineforge_codegen/codegen/emit_top.py +15 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/pineforge_codegen/codegen/security.py +160 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/pineforge_codegen/codegen/tables.py +130 -29
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/pineforge_codegen/codegen/types.py +6 -1
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/pineforge_codegen/codegen/visit_call.py +33 -15
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/pineforge_codegen/support_checker.py +68 -4
- pineforge_codegen-0.10.2/tests/test_array_bounds_insert_fill_slice.py +277 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/test_array_checked_access.py +4 -1
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/test_calc_on_order_fills_codegen.py +26 -11
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/test_callable_series_param_types.py +10 -6
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/test_codegen_audit_fixes.py +4 -1
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/test_codegen_validation_fixes.py +11 -5
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/test_method_written_callsite_lifecycle.py +6 -3
- pineforge_codegen-0.10.2/tests/test_security_lazy_ta_under_conditionals.py +246 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/test_support_checker.py +71 -0
- pineforge_codegen-0.10.2/tests/test_udf_series_parameter_history.py +177 -0
- pineforge_codegen-0.10.1/VERSION +0 -1
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/.github/dependabot.yml +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/.github/workflows/gate.yml +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/.github/workflows/publish-pyodide.yml +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/.github/workflows/test.yml +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/.gitignore +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/CLAUDE.md +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/LEGAL.md +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/LICENSE +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/PYODIDE_TARGET +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/README.md +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/gate/compare.mjs +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/gate/glue.py +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/gate/oracle.py +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/gate/run-gate.mjs +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/gate/selftest.mjs +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/npm/README.md +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/npm/index.mjs +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/npm/package.json +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/package-lock.json +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/package.json +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/pineforge_codegen/__init__.py +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/pineforge_codegen/analyzer/__init__.py +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/pineforge_codegen/analyzer/base.py +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/pineforge_codegen/analyzer/call_handlers.py +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/pineforge_codegen/analyzer/contracts.py +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/pineforge_codegen/analyzer/diagnostics.py +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/pineforge_codegen/analyzer/tables.py +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/pineforge_codegen/analyzer/types.py +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/pineforge_codegen/ast_nodes.py +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/pineforge_codegen/codegen/__init__.py +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/pineforge_codegen/codegen/drawing.py +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/pineforge_codegen/codegen/helpers.py +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/pineforge_codegen/codegen/helpers_syminfo.py +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/pineforge_codegen/codegen/input.py +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/pineforge_codegen/codegen/ta.py +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/pineforge_codegen/codegen/visit_expr.py +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/pineforge_codegen/codegen/visit_stmt.py +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/pineforge_codegen/errors.py +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/pineforge_codegen/finite_ta_length.py +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/pineforge_codegen/lexer.py +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/pineforge_codegen/method_binding.py +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/pineforge_codegen/parser.py +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/pineforge_codegen/pragmas.py +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/pineforge_codegen/signatures.py +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/pineforge_codegen/symbols.py +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/pineforge_codegen/tokens.py +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/pineforge_codegen/tv_input_choices.py +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/pyproject.toml +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/scripts/build-npm-package.mjs +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/scripts/dump-tables.py +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/scripts/worker-template.mjs +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/__init__.py +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/_compile.py +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/fixtures/matrix_eigen_pca.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/err/const_ns_plot_style_free.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/err/const_ns_shape_free.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/err/export_func.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/err/footprint_new.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/err/hard_reject_dividends.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/err/matrix_unknown_elem.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/err/multi_error_one_line.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/err/sec_tf_invalid.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/err/unknown_color.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/err/unknown_math.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/err/unknown_str.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/err/unknown_strategy_fn.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/err/unknown_syminfo.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/err/unknown_ta.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/AAPL__session-ismarket-nyse-rth-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/AAPL__time-tradingday-daily-reset-counter-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/QQQ__session-ispremarket-nasdaq-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/SPY__session-firstbar-vwap-anchor-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/SPY__session-lastbar-flatten-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/chart_bg_color.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/crypto-htf__mtf-htf-monthly-ema-cross-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/crypto-leverage__leverage-margin-call-perp-5x-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/divergent_last_bar_index.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/forex__symbol-fx-5dp-eurusd-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/futures__symbol-futures-pointvalue-es-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/tutorial__macd__strategy.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/tutorial__mtf__strategy_htf.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/tutorial__mtf__strategy_ltf.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/us-equity__symbol-equity-rth-gaps-aapl-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/us-equity__us-equity-exchange-tz-intraday-cap-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__analyzer-parity-choch-bos-isolator-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__analyzer-parity-edge-margin-50-pct-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__analyzer-parity-percent-of-equity-sizing-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__analyzer-parity-small-equity-fraction-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__analyzer-parity-stop-limit-timing-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__analyzer-self-test-multi-mode-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__anomaly-equity-mirror-strategy-equity-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__barstate-isconfirmed-magnifier-off-01b.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__barstate-isconfirmed-magnifier-on-01a.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__bracket-atr-trail-series-int-points-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__bracket-atr-trailing-stop-state-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__bracket-entry-exit-same-pass-attach-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__bracket-exit-stop-limit-trail-same-bar-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__bracket-exit-three-way-set-once-entry-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__bracket-exit-tp-sl-fixed-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__bracket-narrow-stop-limit-with-trail8-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__bracket-partial-exit-qty-percent-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__bracket-same-id-exit-replace-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__bracket-tp-sl-oca-reduce-isolate-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__bracket-trail-points-no-offset-explicit-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__bracket-trail-points-with-offset-only-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__bracket-trailing-activation-offset-path-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__cap-max-intraday-filled-orders-isolate-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__cap-risk-gates-allow-max-intraday-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__composite-4emarsi-integration-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__composite-4emarsi-quad-ema-stack-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__composite-4emarsi-rsi-pullback-latch-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__composite-4emarsi-session-window-nbar-exit-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__composite-boscurv-integration-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__composite-boscurv-linreg-slope-channel-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__composite-boscurv-pivot-bos-trigger-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__composite-bracket-cap-range-pending-stop-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__composite-ies-adx-regime-classify-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__composite-ies-bb-kc-squeeze-release-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__composite-ies-cooldown-daily-cap-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__composite-ies-equity-feedback-sizing-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__composite-ies-integration-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__composite-ies-pivot-liquidity-sweep-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__composite-ies-pressure-gauge-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__composite-ies-rsi-macd-momentum-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__composite-ies-three-ema-bias-score-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__composite-kanuck-calc-on-every-tick-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__composite-kanuck-integration-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__composite-kanuck-kama-state-recurrence-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__composite-kanuck-max-bars-back-500-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__composite-kkb-ema-atr-breakout-band-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__composite-kkb-integration-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__composite-kkb-kalman-filter-1d-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__composite-kkb-margin-100-pct-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__composite-liqsweep-integration-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__composite-liqsweep-pivot-hh-ll-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__composite-liqsweep-wait-one-continuation-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__composite-liqsweep-wick-pierce-close-back-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__composite-marketshift-integration-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__composite-marketshift-pivot-state-machine-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__composite-marketshift-rolling-highest-lowest-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__composite-marketshift-state-edge-detector-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__composite-scalping-fast-ma-cross-trigger-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__composite-scalping-integration-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__composite-scalping-tight-tp-sl-points-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__composite-trendmaster-integration-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__composite-trendmaster-line-new-projection-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__composite-trendmaster-pivot-anchored-bracket-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__composite-trendmaster-three-tier-ema-state-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__composite-trendmaster-trend-momentum-structure-gate-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__composite-vcp-cumulative-volume-delta-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__composite-vcp-fvg-active-zones-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__composite-vcp-integration-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__composite-vcp-manual-adx-regime-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__composite-vcp-pivot-strength-5-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__composite-vcp-rsi-smooth-divergence-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__composite-vcp-session-tz-newyork-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__composite-vcp-vol-zscore-anomaly-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__composite-wunderscalper-alert-templates-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__composite-wunderscalper-explicit-reverse-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__composite-wunderscalper-integration-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__input-source-runtime-override-high-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__input-source-subscript-hl2-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__ltf-bool-array-bull-majority-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__ltf-numeric-float-ratio15-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__magnifier-tick-dist-endpoints-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__magnifier-tick-dist-endpoints-rsi-cross-08a.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__magnifier-tick-dist-volume-weighted-on-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__matrix-bool-mask-explicit-utc-tz-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__matrix-bool-mask-no-transpose-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__matrix-bool-mask-transpose-roundtrip-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__matrix-bool-regime-mask-24x7-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__matrix-covariance-eigen-pca-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__matrix-eigen-rank-deficient-cov-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__max-bars-back-function-call-deep-history-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__mtf-daily-array-median-percentrank-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__mtf-daily-ema26-warmup-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__mtf-daily-prev-high-break-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__mtf-dual-tf-60-240-rising-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__mtf-htf-60-close-change-baseline-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__mtf-htf-60-close-roll-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__mtf-htf-60-gaps-on-roll-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__mtf-htf-60-rsi14-inside-security-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__mtf-htf-60-sma20-inside-security-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__mtf-htf-60-volume-spike-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__mtf-htf-confluence-manual-trail-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__mtf-htf-confluence-static-bracket-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__mtf-htf-weekly-sma-cross-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__mtf-roll-state-60-240-d-minimal-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__mtf-triple-tf-close-confluence-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__mtf-triple-tf-macd-hist-confluence-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__na-deep-history-int-na-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__na-nz-fixnan-history-chain-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__oca-exit-bracket-internal-cancel-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__oca-multi-bracket-isolation-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__oca-raw-strategy-order-reduce-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__order-close-all-cancel-all-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__order-close-immediate-vs-next-bar-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__order-cross-entry-cancel-same-pass-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__order-cross-entry-close-same-pass-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__order-cross-exit-close-same-pass-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__order-deferred-flip-guaranteed-gap-stops-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__order-deferred-flip-pooc-cross-bar-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__order-dual-four-bar-stop-no-close-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__order-dual-side-same-id-stop-no-cancel-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__order-dual-stop-both-touch-priority-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__order-dual-stop-cancel-rotation-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__order-dual-stop-far-only-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__order-dual-stop-near-only-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__order-dual-stop-open-high-first-path-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__order-dual-stop-open-low-first-path-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__order-dual-stop-open-tie-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__order-dual-stop-source-order-long-first-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__order-dual-stop-source-order-short-first-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__order-entry-implicit-reversal-exit-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__order-flip-stop-no-paired-close-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__order-market-close-fill-basis-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__order-one-side-four-bar-far-opposite-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__order-opposite-entry-close-same-pass-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__order-percent-equity-cash-commission-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__order-process-on-close-false-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__order-process-on-close-true-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__order-range-expansion-pending-stop-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__order-same-id-entry-close-same-bar-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__order-same-id-market-entry-repeat-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__order-same-id-stop-after-flat-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__order-same-id-stop-cross-before-modify-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__order-same-id-stop-minute-zero-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__order-same-id-stop-modification-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__order-same-id-stop-raise-only-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__order-same-id-stop-window-four-bars-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__order-stale-stop-after-close-no-cancel-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__order-stop-cancel-no-regime-close-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__order-stop-entry-cancel-opposite-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__order-stop-entry-reversal-grouping-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__order-stop-entry-touch-boundary-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__pyramid-cash-fractional-commission-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__pyramid-close-id-grouping-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__pyramid-deferred-flip-close-all-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__pyramid-flip-stop-pyramiding-2-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__recompute-alma-sar-corr-magnifier-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__recompute-mtf-rsi-macd-bb-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__risk-max-contracts-held-gate-pyramid-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__session-hour-minute-pulse-filter-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__session-ny-spring-forward-dst-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__stats-eventrades-zero-pnl-count-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__ta-accdist-ema-cross-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__ta-bb-kc-squeeze-breakout-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__ta-bb-rsi-mean-reversion-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__ta-cci-threshold-cross-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__ta-chandelier-exit-direction-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__ta-closedtrades-risk-introspection-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__ta-cmo-9-zero-cross-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__ta-cog-10-signal-cross-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__ta-dmi-adx-di-cross-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__ta-donchian-channel-breakout-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__ta-dual-ma-switch-dispatch-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__ta-dual-thrust-open-anchored-range-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__ta-elder-ray-bull-bear-power-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__ta-ema-ribbon-stack-transition-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__ta-engulfing-candle-pattern-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__ta-highestbars-lowestbars-breakout-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__ta-hma-55-close-cross-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__ta-hma-fast-slow-cross-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__ta-inside-bar-engulfing-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__ta-kama-style-efficiency-ratio-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__ta-keltner-channel-break-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__ta-linreg-stdev-channel-revert-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__ta-macd-12-26-9-line-signal-cross-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__ta-macd-histogram-reversal-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__ta-macd-line-gt-signal-continuous-state-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__ta-map-regime-threshold-lookup-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__ta-median-vs-ema-cross-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__ta-mfi-14-bands-20-80-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__ta-momentum-roc-zero-cross-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__ta-multi-indicator-score-composite-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__ta-nvi-pvi-cross-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__ta-obv-ema-cross-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__ta-percentrank-mean-reversion-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__ta-pivot-array-unshift-pop-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__ta-pivot-atr-stop-target-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__ta-pivot-confirmed-break-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__ta-pivot-point-levels-break-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__ta-pvt-ema-cross-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__ta-range-filter-var-band-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__ta-rci-14-zero-cross-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__ta-rsi-bb-self-bands-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__ta-rsi-ema-signal-cross-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__ta-rsi-macd-and-continuous-state-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__ta-rsi14-bands-30-70-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__ta-rsi14-cross-50-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__ta-rsi14-gt-50-continuous-state-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__ta-rsi14-gt60-lt45-no-matrix-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__ta-sar-flip-entry-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__ta-sma-152-close-cross-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__ta-sma-dual-cross-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__ta-stdev-sma-expansion-break-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__ta-stoch-slow-k-d-cross-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__ta-stochastic-rsi-cross-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__ta-str-match-regex-filter-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__ta-supertrend-adx-filter-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__ta-supertrend-direction-flip-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__ta-triple-sma-stack-latch-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__ta-tsi-25-13-signal-cross-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__ta-volume-spike-atr-breakout-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__ta-vwma-vs-sma-divergence-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__ta-wpr-14-bands-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__timeframe-main-period-self-adaptive-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__udt-method-calls-sibling-cumulative-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__udt-method-default-param-kwargs-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__udt-method-drives-strategy-entry-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__udt-method-extra-primitive-args-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__udt-method-feeds-strategy-exit-prices-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__udt-method-in-for-loop-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__udt-method-in-if-else-branch-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__udt-method-in-switch-arms-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__udt-method-in-while-loop-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__udt-method-mutating-self-ref-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__udt-method-on-array-element-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__udt-method-reads-strategy-state-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__udt-method-receives-ta-series-param-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__udt-method-scalar-return-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__udt-method-tuple-return-destructure-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__udt-method-udt-return-from-func-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__udt-method-uses-history-globals-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__udt-method-uses-math-funcs-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__udt-method-uses-na-nz-fixnan-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__udt-method-var-instance-streak-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__udt-method-windowed-method-chain-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__udt-regime-stack-stress-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__vwap-bands-breakout-1sigma-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__vwap-bands-mean-reversion-2sigma-01.pine +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/golden/matrix_eigen_pca.cpp +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/test_analyzer.py +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/test_analyzer_matrix_inference.py +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/test_analyzer_ta_return_types.py +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/test_array_empty_aggregates.py +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/test_array_terminal_returns.py +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/test_callable_ta_forwarded_length.py +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/test_callable_var_first_reach.py +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/test_codegen_determinism.py +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/test_codegen_drawing_data.py +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/test_codegen_drawing_handles.py +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/test_codegen_fallthrough_guards.py +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/test_codegen_golden.py +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/test_codegen_input_getters.py +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/test_codegen_matrix_typed.py +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/test_codegen_new.py +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/test_codegen_string_escape.py +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/test_codegen_ta_derived_length.py +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/test_codegen_ta_finite_choice_length.py +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/test_codegen_ta_stable_var_literal.py +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/test_collection_scope_isolation.py +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/test_compile_corpus.py +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/test_compile_smoke.py +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/test_errors.py +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/test_extract_inputs.py +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/test_float_relational_runtime.py +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/test_glue_smoke.py +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/test_hungpixi_regressions.py +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/test_import_all.py +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/test_input_time_int64.py +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/test_int64_reassign_promotion.py +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/test_int64_time_storage.py +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/test_lazy_saturated_roc.py +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/test_lazy_saturated_roc_runtime.py +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/test_lexer.py +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/test_map_call_diagnostics.py +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/test_map_param_methods.py +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/test_map_terminal_returns.py +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/test_math_sign_na_codegen.py +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/test_matrix_identity_checkpoint.py +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/test_matrix_na_lifecycle.py +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/test_matrix_void_method_return.py +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/test_method_receiver_types.py +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/test_na_reassign_retype.py +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/test_na_relational_lowering.py +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/test_official_surface.py +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/test_parser.py +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/test_persistent_callable_owner_state.py +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/test_pinemap_boundaries_and_order.py +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/test_pinemap_cold_followups_history.py +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/test_pinemap_semantics.py +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/test_pinemap_temp_receiver_var.py +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/test_runtime_var_initialization.py +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/test_security_helper_local_var.py +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/test_security_math_reducer.py +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/test_security_ohlc_hist_is_complete.py +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/test_security_ta_input_history_offset.py +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/test_security_tf_input_derived.py +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/test_security_tf_literal.py +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/test_security_tuple_interactions.py +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/test_signatures.py +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/test_strategy_close_callsite_tokens.py +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/test_support_checker_chart_visible_bar_time.py +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/test_support_checker_color_cast.py +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/test_support_checker_const_namespaces.py +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/test_support_checker_dividends_earnings.py +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/test_support_checker_footprint.py +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/test_support_checker_input_color.py +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/test_support_checker_input_source.py +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/test_support_checker_matrix.py +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/test_support_checker_security_adjustment.py +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/test_support_checker_syminfo_gap_fields.py +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/test_support_checker_timeframe_from_seconds.py +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/test_support_checker_varip.py +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/test_support_checker_volume_row.py +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/test_symbols.py +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/test_ta_official_surface.py +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/test_transpile_division.py +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/test_transpile_enum_order.py +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/test_transpile_pf_trace.py +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/test_transpile_tr_handle_na.py +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/test_transpiler_matrix_kwargs.py +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/test_typed_void_method_precedence.py +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/test_typespec_matrix.py +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/test_udt_drawing_field_cleanup.py +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/test_udt_lvalue_alias.py +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/test_udt_na_lifecycle.py +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/test_udt_object_identity.py +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/test_unsupported_reporting.py +0 -0
- {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/test_vwap_tuple_unpack.py +0 -0
|
@@ -124,7 +124,7 @@ jobs:
|
|
|
124
124
|
# failure would leave npm shipping a version PyPI never got.
|
|
125
125
|
- name: Publish to PyPI
|
|
126
126
|
if: ${{ !inputs.dry_run }}
|
|
127
|
-
uses: pypa/gh-action-pypi-publish@
|
|
127
|
+
uses: pypa/gh-action-pypi-publish@dc37677b2e1c63e2034f94d8a5b11f265b73ba33 # v1.14.2
|
|
128
128
|
|
|
129
129
|
# Commit + tag + push AFTER PyPI succeeds. The `git push --tags` triggers
|
|
130
130
|
# publish-pyodide.yml for npm (which re-runs the gate — defense in depth),
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
Metadata-Version: 2.
|
|
1
|
+
Metadata-Version: 2.5
|
|
2
2
|
Name: pineforge-codegen
|
|
3
|
-
Version: 0.10.
|
|
3
|
+
Version: 0.10.2
|
|
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.10.2
|
|
@@ -76,3 +76,55 @@ were added to convert the most fragile defensive paths from
|
|
|
76
76
|
silent-on-bug to loud-on-bug.
|
|
77
77
|
|
|
78
78
|
No new follow-up work identified by this audit.
|
|
79
|
+
|
|
80
|
+
## Residuals left open by the array-bounds guard (2026-07-25)
|
|
81
|
+
|
|
82
|
+
`array.insert`, the 3-argument `array.fill`, and `array.slice` now reject an
|
|
83
|
+
out-of-range index instead of emitting raw STL iterator arithmetic (undefined
|
|
84
|
+
behaviour). Three questions the bounds work deliberately does NOT settle:
|
|
85
|
+
|
|
86
|
+
1. **`array.slice` shares storage with its source; codegen deep-copies.**
|
|
87
|
+
The Pine v6 reference says "Changing the elements in a slice directly
|
|
88
|
+
changes the elements in the original array, and vice versa", while both
|
|
89
|
+
lowerings construct a fresh `std::vector` from the iterator range. Any
|
|
90
|
+
write through a slice (or through the source while a slice is live) is
|
|
91
|
+
therefore lost. Closing this needs a view/alias type over the receiver's
|
|
92
|
+
storage, not an index check, so it is a separate and much larger change.
|
|
93
|
+
The extent of the aliasing is itself unsettled: the reference sentence
|
|
94
|
+
says "an object from the slice", which is unambiguous for arrays of
|
|
95
|
+
reference-like elements (UDT instances) but does NOT establish that a
|
|
96
|
+
primitive `array<float>` slice aliases element-for-element. Pin that
|
|
97
|
+
against TradingView before designing the view type — the answer decides
|
|
98
|
+
whether the fix is "arrays of UDTs only" or "all arrays".
|
|
99
|
+
|
|
100
|
+
2. **Inverted ranges (`index_from > index_to`) are rejected, not clamped.**
|
|
101
|
+
No evidence pins TradingView's behaviour for `array.fill(id, v, 2, 1)` /
|
|
102
|
+
`array.slice(id, 2, 1)`. Rejecting is the fail-closed choice and the
|
|
103
|
+
3-argument `fill` range form has no current corpus exposure, but a
|
|
104
|
+
TradingView probe could show TV treats it as an empty range instead.
|
|
105
|
+
|
|
106
|
+
3. **Negative endpoints for `fill`/`slice` are rejected.** The reference
|
|
107
|
+
lists only `array.get`/`array.set`/`array.insert`/`array.remove` as
|
|
108
|
+
negative-indexing functions, so `fill`/`slice` follow `array.percentrank`
|
|
109
|
+
and reject. If TradingView in fact normalises them, this is an
|
|
110
|
+
over-rejection (a valid script fails to transpile), not a wrong result.
|
|
111
|
+
|
|
112
|
+
## Residual left open by the request.security rebind guard (2026-07-25)
|
|
113
|
+
|
|
114
|
+
`_scalar_rebinds` is keyed by BARE NAME with no scope resolution, mirroring
|
|
115
|
+
the existing `_scalar_defs`. A divergent `:=` rebind of a *local* named `sym`
|
|
116
|
+
inside a user function therefore also disqualifies an unrelated *global*
|
|
117
|
+
`sym` used as a `request.security` symbol. That direction is fail-closed
|
|
118
|
+
(over-rejection, never a silent wrong-symbol run), but a scoped symbol table
|
|
119
|
+
would be the exact fix. A 788-source differential shows the over-rejection
|
|
120
|
+
costs nothing on the current corpus.
|
|
121
|
+
|
|
122
|
+
**Still open — the ternary branch hole (KI-47(a)).** `_is_current_symbol_expr`
|
|
123
|
+
still accepts `cond ? "EXCH:OTHER" : syminfo.tickerid` because EITHER branch
|
|
124
|
+
resolving to the chart symbol is enough. Tightening it to require BOTH
|
|
125
|
+
branches is correct in principle but rejects
|
|
126
|
+
`data/standard/doriannnq-tjr-v4-strategy`, whose alternate branch is
|
|
127
|
+
unreachable at its declared input configuration (`smtSym` defaults to `""`)
|
|
128
|
+
and which grades Excellent at 44/44 / 100% match. Closing this needs the
|
|
129
|
+
checker to see the effective input configuration, which it currently cannot
|
|
130
|
+
(see the analysis in the R6 handoff). Held deliberately, not overlooked.
|
|
@@ -514,6 +514,15 @@ class CodeGen(CallVisitor, ExprVisitor, StmtVisitor, TopLevelEmitter, SecurityEm
|
|
|
514
514
|
# the declaration-derived checkpoint inventory.
|
|
515
515
|
self._inline_history_members: list[dict] = []
|
|
516
516
|
self._inline_history_member_by_key: dict[tuple, str] = {}
|
|
517
|
+
# request.security/request.security_lower_tf inline their Pine helper
|
|
518
|
+
# expressions on the requested clock instead of calling the ordinary
|
|
519
|
+
# emitted UDF methods. The chart-clocked plain-UDF history factor must
|
|
520
|
+
# therefore exclude those source nodes and any emitted helper context
|
|
521
|
+
# reached only through them.
|
|
522
|
+
self._requested_context_inline_node_ids: set[int] = set()
|
|
523
|
+
self._requested_context_only_inline_contexts: set[
|
|
524
|
+
tuple[str, str | None]
|
|
525
|
+
] = set()
|
|
517
526
|
# Unique lambda-local names used when an array lowering references its
|
|
518
527
|
# receiver more than once. The binding keeps temporary-producing or
|
|
519
528
|
# side-effectful receivers single-evaluation (see TypeInferer).
|
|
@@ -3173,7 +3182,11 @@ class CodeGen(CallVisitor, ExprVisitor, StmtVisitor, TopLevelEmitter, SecurityEm
|
|
|
3173
3182
|
"""
|
|
3174
3183
|
self._inline_history_members = []
|
|
3175
3184
|
self._inline_history_member_by_key = {}
|
|
3176
|
-
counters = {
|
|
3185
|
+
counters = {
|
|
3186
|
+
"hist_call": 0,
|
|
3187
|
+
"series_arg": 0,
|
|
3188
|
+
"udf_series_arg": 0,
|
|
3189
|
+
}
|
|
3177
3190
|
|
|
3178
3191
|
def walk_nodes(value):
|
|
3179
3192
|
"""Yield AST nodes in stable field order, including tuple elements.
|
|
@@ -3345,6 +3358,113 @@ class CodeGen(CallVisitor, ExprVisitor, StmtVisitor, TopLevelEmitter, SecurityEm
|
|
|
3345
3358
|
lexical.update(self._func_collection_types.get(owner, {}))
|
|
3346
3359
|
return lexical
|
|
3347
3360
|
|
|
3361
|
+
def plain_udf_info(call: FuncCall):
|
|
3362
|
+
if not isinstance(call.callee, Identifier):
|
|
3363
|
+
return None
|
|
3364
|
+
candidate = self._func_info_map.get(call.callee.name)
|
|
3365
|
+
if (
|
|
3366
|
+
candidate is None
|
|
3367
|
+
or candidate.node is None
|
|
3368
|
+
or getattr(candidate, "is_udt_method", False)
|
|
3369
|
+
):
|
|
3370
|
+
return None
|
|
3371
|
+
return candidate
|
|
3372
|
+
|
|
3373
|
+
# Requested-context UDF expressions are lowered independently by
|
|
3374
|
+
# security.py. Classify their otherwise-emitted helper variants so
|
|
3375
|
+
# this chart-clocked factor neither allocates unused buffers for them
|
|
3376
|
+
# nor changes the legacy bodies that remain in generated C++.
|
|
3377
|
+
requested_node_ids: set[int] = set()
|
|
3378
|
+
for security_call in self._security_calls:
|
|
3379
|
+
expression = security_call.get("expr_node")
|
|
3380
|
+
if expression is None:
|
|
3381
|
+
continue
|
|
3382
|
+
requested_node_ids.update(
|
|
3383
|
+
id(child) for child in walk_nodes(expression)
|
|
3384
|
+
)
|
|
3385
|
+
self._requested_context_inline_node_ids = requested_node_ids
|
|
3386
|
+
|
|
3387
|
+
def emitted_context_for_call(
|
|
3388
|
+
fi,
|
|
3389
|
+
call: FuncCall,
|
|
3390
|
+
owner: str | None,
|
|
3391
|
+
owner_context: str | None,
|
|
3392
|
+
) -> str | None:
|
|
3393
|
+
dispatch = self._instance_dispatch.get(
|
|
3394
|
+
(owner_context, id(call))
|
|
3395
|
+
)
|
|
3396
|
+
if dispatch is not None:
|
|
3397
|
+
return dispatch
|
|
3398
|
+
target_cs = target_cs_for_context(
|
|
3399
|
+
fi, call, owner, owner_context
|
|
3400
|
+
)
|
|
3401
|
+
if target_cs is not None:
|
|
3402
|
+
return f"{self._func_cpp_base_name(fi.name)}_cs{target_cs}"
|
|
3403
|
+
return None
|
|
3404
|
+
|
|
3405
|
+
requested_roots: set[tuple[str, str | None]] = set()
|
|
3406
|
+
chart_roots: set[tuple[str, str | None]] = set()
|
|
3407
|
+
context_edges: dict[
|
|
3408
|
+
tuple[str, str | None], set[tuple[str, str | None]]
|
|
3409
|
+
] = {}
|
|
3410
|
+
for call in (
|
|
3411
|
+
candidate
|
|
3412
|
+
for candidate in walk_nodes(self.ctx.ast)
|
|
3413
|
+
if isinstance(candidate, FuncCall)
|
|
3414
|
+
):
|
|
3415
|
+
fi = plain_udf_info(call)
|
|
3416
|
+
if fi is None:
|
|
3417
|
+
continue
|
|
3418
|
+
owner = owner_by_node.get(id(call))
|
|
3419
|
+
if id(call) in requested_node_ids:
|
|
3420
|
+
owner_contexts = (
|
|
3421
|
+
[None]
|
|
3422
|
+
if owner is None
|
|
3423
|
+
else self._inline_history_contexts_for_owner(owner)
|
|
3424
|
+
)
|
|
3425
|
+
for owner_context in owner_contexts:
|
|
3426
|
+
requested_roots.add((
|
|
3427
|
+
fi.name,
|
|
3428
|
+
emitted_context_for_call(
|
|
3429
|
+
fi, call, owner, owner_context
|
|
3430
|
+
),
|
|
3431
|
+
))
|
|
3432
|
+
continue
|
|
3433
|
+
if owner is None:
|
|
3434
|
+
target = (
|
|
3435
|
+
fi.name,
|
|
3436
|
+
emitted_context_for_call(fi, call, None, None),
|
|
3437
|
+
)
|
|
3438
|
+
chart_roots.add(target)
|
|
3439
|
+
continue
|
|
3440
|
+
for owner_context in self._inline_history_contexts_for_owner(owner):
|
|
3441
|
+
source = (owner, owner_context)
|
|
3442
|
+
target = (
|
|
3443
|
+
fi.name,
|
|
3444
|
+
emitted_context_for_call(
|
|
3445
|
+
fi, call, owner, owner_context
|
|
3446
|
+
),
|
|
3447
|
+
)
|
|
3448
|
+
context_edges.setdefault(source, set()).add(target)
|
|
3449
|
+
|
|
3450
|
+
def reachable(
|
|
3451
|
+
roots: set[tuple[str, str | None]],
|
|
3452
|
+
) -> set[tuple[str, str | None]]:
|
|
3453
|
+
found = set(roots)
|
|
3454
|
+
pending = list(roots)
|
|
3455
|
+
while pending:
|
|
3456
|
+
source = pending.pop()
|
|
3457
|
+
for target in context_edges.get(source, ()):
|
|
3458
|
+
if target in found:
|
|
3459
|
+
continue
|
|
3460
|
+
found.add(target)
|
|
3461
|
+
pending.append(target)
|
|
3462
|
+
return found
|
|
3463
|
+
|
|
3464
|
+
self._requested_context_only_inline_contexts = (
|
|
3465
|
+
reachable(requested_roots) - reachable(chart_roots)
|
|
3466
|
+
)
|
|
3467
|
+
|
|
3348
3468
|
for node in walk_nodes(self.ctx.ast):
|
|
3349
3469
|
owner = owner_by_node.get(id(node))
|
|
3350
3470
|
if isinstance(node, Subscript) and isinstance(node.object, FuncCall):
|
|
@@ -3403,6 +3523,26 @@ class CodeGen(CallVisitor, ExprVisitor, StmtVisitor, TopLevelEmitter, SecurityEm
|
|
|
3403
3523
|
expected_cpp_type = self._series_param_element_cpp_type(
|
|
3404
3524
|
fi, idx, target_cs
|
|
3405
3525
|
)
|
|
3526
|
+
# Pine gives each plain-UDF written call its own
|
|
3527
|
+
# chart-aligned parameter history. Even an exact Series
|
|
3528
|
+
# actual therefore needs a call-site-owned buffer: skipped
|
|
3529
|
+
# evaluations hold the last value in that bar's slot
|
|
3530
|
+
# instead of exposing the caller's independently changing
|
|
3531
|
+
# history. Typed methods retain their established direct
|
|
3532
|
+
# binding/bridge behavior below.
|
|
3533
|
+
chart_execution_context = (
|
|
3534
|
+
id(node) not in requested_node_ids
|
|
3535
|
+
and (owner, context)
|
|
3536
|
+
not in self._requested_context_only_inline_contexts
|
|
3537
|
+
)
|
|
3538
|
+
if not method_call and chart_execution_context:
|
|
3539
|
+
register_one(
|
|
3540
|
+
"udf_series_arg",
|
|
3541
|
+
(id(node), idx),
|
|
3542
|
+
expected_cpp_type,
|
|
3543
|
+
context,
|
|
3544
|
+
)
|
|
3545
|
+
continue
|
|
3406
3546
|
needs_bridge = True
|
|
3407
3547
|
if isinstance(arg, Identifier):
|
|
3408
3548
|
if (
|
|
@@ -949,6 +949,21 @@ class TopLevelEmitter:
|
|
|
949
949
|
f"{info['member_name']}.clear();"
|
|
950
950
|
)
|
|
951
951
|
|
|
952
|
+
# A history-reading plain-UDF parameter advances on the chart clock,
|
|
953
|
+
# even when lazy control flow skips its written call on this bar. Seed
|
|
954
|
+
# the new slot with the prior current value (``na`` before first reach);
|
|
955
|
+
# an executed call later in the bar updates this same slot with its
|
|
956
|
+
# scalar actual. Typed-method ``series_arg`` bridges intentionally keep
|
|
957
|
+
# their existing execution-clock behavior.
|
|
958
|
+
for info in self._inline_history_members:
|
|
959
|
+
if info["kind"] != "udf_series_arg":
|
|
960
|
+
continue
|
|
961
|
+
member = info["member_name"]
|
|
962
|
+
lines.append(
|
|
963
|
+
f" if (history_advances_new_bar()) "
|
|
964
|
+
f"{member}.push({member}.current());"
|
|
965
|
+
)
|
|
966
|
+
|
|
952
967
|
# a. Push bar field series (with bar magnifier support)
|
|
953
968
|
for field_name in sorted(self.ctx.series_bar_fields):
|
|
954
969
|
push_expr = BAR_SERIES_PUSH.get(field_name, f"current_bar_.{field_name}")
|
|
@@ -2844,6 +2844,156 @@ class SecurityEmitter:
|
|
|
2844
2844
|
)
|
|
2845
2845
|
return out
|
|
2846
2846
|
|
|
2847
|
+
def _security_lazy_ta_keys(
|
|
2848
|
+
self,
|
|
2849
|
+
sec_id: int,
|
|
2850
|
+
expr_node,
|
|
2851
|
+
info: dict,
|
|
2852
|
+
) -> set[tuple[int, tuple]]:
|
|
2853
|
+
"""``(ta_index, binding_signature)`` pairs Pine reaches only lazily.
|
|
2854
|
+
|
|
2855
|
+
Pine evaluates ``and``/``or`` with left-to-right short-circuit and a
|
|
2856
|
+
ternary evaluates its condition plus exactly one branch. A ``ta.*``
|
|
2857
|
+
call sitting in a skipped operand is **not evaluated on that bar**, so
|
|
2858
|
+
its series state does not advance. The evaluator used to hoist every
|
|
2859
|
+
collected site into an unconditional ``auto _secval_N = ...compute(...)``
|
|
2860
|
+
prologue, which advanced every site on every HTF bar and desynchronised
|
|
2861
|
+
the series against TradingView.
|
|
2862
|
+
|
|
2863
|
+
A site returned here is dropped from that prologue. ``_build_security_expr``
|
|
2864
|
+
then falls through to its inline
|
|
2865
|
+
``(security_series_slot_is_new(N) ? m.compute(a) : m.recompute(a))``
|
|
2866
|
+
form, emitted in expression position — C++'s own ``&&`` / ``||`` /
|
|
2867
|
+
``?:`` short-circuit then advances the state exactly when Pine would,
|
|
2868
|
+
and the relational lowering's ``_pna_l`` / ``_pna_r`` temporaries keep
|
|
2869
|
+
the evaluation order left-to-right.
|
|
2870
|
+
|
|
2871
|
+
Deliberately conservative — anything not provably single-reach and
|
|
2872
|
+
conditional keeps the existing eager hoist, so scripts without
|
|
2873
|
+
conditional security TA regenerate byte-identically:
|
|
2874
|
+
|
|
2875
|
+
- A site reached more than once must stay hoisted: sharing one
|
|
2876
|
+
``_secval_*`` is what keeps it to a single advance per bar, whereas
|
|
2877
|
+
two inline copies would advance it twice (or zero times).
|
|
2878
|
+
- Laziness does **not** propagate through a global binding. In the
|
|
2879
|
+
requested context that global is its own unconditional top-level
|
|
2880
|
+
statement, so it evaluates on every HTF bar wherever it is read
|
|
2881
|
+
(this is what keeps chart-side ``t0``-shaped code exact).
|
|
2882
|
+
- Sites with a history offset (``ta.ema(close, 55)[1]``) keep the
|
|
2883
|
+
committed ``_secval_*`` their per-bar Series push reads.
|
|
2884
|
+
- Securities that rebind mutable globals, and multi-statement helper
|
|
2885
|
+
calls, bail entirely: both lower through statement emitters that
|
|
2886
|
+
consume ``ta_results`` outside this expression.
|
|
2887
|
+
"""
|
|
2888
|
+
if info.get("mutable_globals"):
|
|
2889
|
+
return set()
|
|
2890
|
+
|
|
2891
|
+
occurrences: dict[tuple[int, tuple], list[bool]] = {}
|
|
2892
|
+
unsafe = False
|
|
2893
|
+
|
|
2894
|
+
def walk(node, lazy: bool, binding_stack, resolving: set[str]) -> None:
|
|
2895
|
+
nonlocal unsafe
|
|
2896
|
+
if node is None or unsafe:
|
|
2897
|
+
return
|
|
2898
|
+
|
|
2899
|
+
if isinstance(node, Identifier):
|
|
2900
|
+
binding = None
|
|
2901
|
+
if not self._security_identifier_is_global_binding(node):
|
|
2902
|
+
binding = self._security_lookup_helper_binding_context(
|
|
2903
|
+
node.name, binding_stack
|
|
2904
|
+
)
|
|
2905
|
+
if binding is not None:
|
|
2906
|
+
bound, bound_stack = binding
|
|
2907
|
+
if isinstance(bound, str):
|
|
2908
|
+
return
|
|
2909
|
+
bind_key = f"bind:{id(bound)}"
|
|
2910
|
+
if bind_key in resolving:
|
|
2911
|
+
return
|
|
2912
|
+
resolving.add(bind_key)
|
|
2913
|
+
walk(bound, lazy, bound_stack, resolving)
|
|
2914
|
+
resolving.discard(bind_key)
|
|
2915
|
+
return
|
|
2916
|
+
|
|
2917
|
+
if self._global_mutable_infos.get(node.name) is not None:
|
|
2918
|
+
unsafe = True
|
|
2919
|
+
return
|
|
2920
|
+
|
|
2921
|
+
global_expr_map = getattr(self.ctx, "global_expr_map", {}) or {}
|
|
2922
|
+
if (
|
|
2923
|
+
self._security_identifier_is_global_binding(node)
|
|
2924
|
+
and node.name in global_expr_map
|
|
2925
|
+
and node.name not in resolving
|
|
2926
|
+
):
|
|
2927
|
+
resolving.add(node.name)
|
|
2928
|
+
walk(global_expr_map[node.name], False, (), resolving)
|
|
2929
|
+
resolving.remove(node.name)
|
|
2930
|
+
return
|
|
2931
|
+
|
|
2932
|
+
if isinstance(node, FuncCall) and isinstance(node.callee, Identifier):
|
|
2933
|
+
func_name = node.callee.name
|
|
2934
|
+
if func_name in self._func_names:
|
|
2935
|
+
call_key = f"func:{func_name}"
|
|
2936
|
+
if call_key in resolving:
|
|
2937
|
+
return
|
|
2938
|
+
resolving.add(call_key)
|
|
2939
|
+
plan = self._security_helper_call_plan(node, binding_stack)
|
|
2940
|
+
if plan["mode"] == "expr":
|
|
2941
|
+
walk(plan["expr"], lazy, plan["binding_stack"], resolving)
|
|
2942
|
+
else:
|
|
2943
|
+
unsafe = True
|
|
2944
|
+
resolving.discard(call_key)
|
|
2945
|
+
return
|
|
2946
|
+
|
|
2947
|
+
if isinstance(node, BinOp) and node.op in ("and", "or"):
|
|
2948
|
+
walk(node.left, lazy, binding_stack, resolving)
|
|
2949
|
+
walk(node.right, True, binding_stack, resolving)
|
|
2950
|
+
return
|
|
2951
|
+
|
|
2952
|
+
if isinstance(node, Ternary):
|
|
2953
|
+
walk(node.condition, lazy, binding_stack, resolving)
|
|
2954
|
+
walk(node.true_val, True, binding_stack, resolving)
|
|
2955
|
+
walk(node.false_val, True, binding_stack, resolving)
|
|
2956
|
+
return
|
|
2957
|
+
|
|
2958
|
+
site = self._get_ta_site(node)
|
|
2959
|
+
if site is not None:
|
|
2960
|
+
idx = self._ta_index_by_site_id.get(id(site))
|
|
2961
|
+
if idx is not None:
|
|
2962
|
+
key = (idx, self._security_binding_stack_signature(binding_stack))
|
|
2963
|
+
occurrences.setdefault(key, []).append(lazy)
|
|
2964
|
+
|
|
2965
|
+
for child in vars(node).values():
|
|
2966
|
+
walk_value(child, lazy, binding_stack, resolving)
|
|
2967
|
+
|
|
2968
|
+
def walk_value(value, lazy: bool, binding_stack, resolving: set[str]) -> None:
|
|
2969
|
+
if value is None or unsafe:
|
|
2970
|
+
return
|
|
2971
|
+
if hasattr(value, "__dict__"):
|
|
2972
|
+
walk(value, lazy, binding_stack, resolving)
|
|
2973
|
+
return
|
|
2974
|
+
if isinstance(value, (list, tuple)):
|
|
2975
|
+
for item in value:
|
|
2976
|
+
walk_value(item, lazy, binding_stack, resolving)
|
|
2977
|
+
return
|
|
2978
|
+
if isinstance(value, dict):
|
|
2979
|
+
for item in value.values():
|
|
2980
|
+
walk_value(item, lazy, binding_stack, resolving)
|
|
2981
|
+
|
|
2982
|
+
walk(expr_node, False, (), set())
|
|
2983
|
+
if unsafe:
|
|
2984
|
+
return set()
|
|
2985
|
+
|
|
2986
|
+
hist_indices = set(self._security_ta_hist_idx_by_sec.get(sec_id, ()))
|
|
2987
|
+
inline_helper_ta_indices = set(info.get("inline_helper_ta_indices", []))
|
|
2988
|
+
return {
|
|
2989
|
+
key
|
|
2990
|
+
for key, reaches in occurrences.items()
|
|
2991
|
+
if key[0] not in hist_indices
|
|
2992
|
+
and key[0] not in inline_helper_ta_indices
|
|
2993
|
+
and len(reaches) == 1
|
|
2994
|
+
and reaches[0]
|
|
2995
|
+
}
|
|
2996
|
+
|
|
2847
2997
|
def _emit_security_ohlc_hist_pushes(self, sec_id: int, lines: list[str]) -> None:
|
|
2848
2998
|
"""Emit the OHLC history-offset Series pushes for ``sec_id``, gated on
|
|
2849
2999
|
``is_complete``.
|
|
@@ -2909,6 +3059,7 @@ class SecurityEmitter:
|
|
|
2909
3059
|
ta_indices = info.get("ta_indices") or []
|
|
2910
3060
|
security_mutable_names = set(info.get("mutable_globals", []))
|
|
2911
3061
|
inline_helper_ta_indices = set(info.get("inline_helper_ta_indices", []))
|
|
3062
|
+
lazy_ta_keys = self._security_lazy_ta_keys(sec_id, expr_node, info)
|
|
2912
3063
|
|
|
2913
3064
|
lines.append(f" void _eval_security_{sec_id}(const Bar& bar, bool is_complete) {{")
|
|
2914
3065
|
|
|
@@ -2949,6 +3100,15 @@ class SecurityEmitter:
|
|
|
2949
3100
|
site = self.ctx.ta_call_sites[idx]
|
|
2950
3101
|
variants = (info.get("ta_variants") or {}).get(idx, [])
|
|
2951
3102
|
for variant in variants:
|
|
3103
|
+
if (idx, variant["signature"]) in lazy_ta_keys:
|
|
3104
|
+
# Pine only reaches this site through a
|
|
3105
|
+
# short-circuited operand or an untaken ternary
|
|
3106
|
+
# branch. Leave it out of the eager prologue:
|
|
3107
|
+
# _build_security_expr emits its
|
|
3108
|
+
# compute()/recompute() inline in expression
|
|
3109
|
+
# position, where C++'s &&/||/?: short-circuit
|
|
3110
|
+
# advances the series exactly on the bars Pine does.
|
|
3111
|
+
continue
|
|
2952
3112
|
helper_binding_stack = variant.get("binding_stack", ())
|
|
2953
3113
|
compute_args = self._security_ta_compute_args_for_site(
|
|
2954
3114
|
sec_id,
|
|
@@ -459,45 +459,143 @@ ORDER_DIRECTION_MAP = {
|
|
|
459
459
|
# ---------------------------------------------------------------------------
|
|
460
460
|
|
|
461
461
|
|
|
462
|
-
def _checked_array_index_prelude(
|
|
462
|
+
def _checked_array_index_prelude(
|
|
463
|
+
*,
|
|
464
|
+
normalize_negative: bool = True,
|
|
465
|
+
allow_size: bool = False,
|
|
466
|
+
name: str = "index",
|
|
467
|
+
) -> str:
|
|
463
468
|
"""C++ body shared by checked single-index operations.
|
|
464
469
|
|
|
465
|
-
Pine v6 explicitly gives end-relative negative indices to
|
|
466
|
-
``
|
|
467
|
-
``percentrank``
|
|
468
|
-
|
|
469
|
-
|
|
470
|
+
Pine v6 explicitly gives end-relative negative indices to ``array.get``,
|
|
471
|
+
``array.set``, ``array.insert``, and ``array.remove``. Other indexed
|
|
472
|
+
functions such as ``percentrank`` and the ``fill``/``slice`` range
|
|
473
|
+
endpoints still need the same NA/non-finite/range checks, but must reject
|
|
474
|
+
negative indices instead of normalizing them (``normalize_negative``).
|
|
475
|
+
|
|
476
|
+
``allow_size`` widens the upper bound from ``index < size`` to
|
|
477
|
+
``index <= size``. An *element access* is invalid at ``size``, but an
|
|
478
|
+
*insertion point* is not: ``array.insert(id, size, v)`` appends, and the
|
|
479
|
+
half-open ``[index_from, index_to)`` ranges of ``array.fill`` /
|
|
480
|
+
``array.slice`` legally end at ``size``.
|
|
481
|
+
|
|
482
|
+
``name`` renames every emitted local so two endpoints can be checked in
|
|
483
|
+
one C++ scope without colliding. ``name="index"`` reproduces the original
|
|
484
|
+
identifiers byte-for-byte.
|
|
470
485
|
"""
|
|
486
|
+
raw_value = f"__pf_raw_{name}_value"
|
|
487
|
+
raw_type = f"__pf_raw_{name}_type"
|
|
488
|
+
raw_text = f"__pf_raw_{name}_text"
|
|
489
|
+
raw_wide = f"__pf_raw_{name}_wide"
|
|
490
|
+
raw = f"__pf_raw_{name}"
|
|
491
|
+
checked = f"__pf_array_{name}"
|
|
492
|
+
size = "__pf_array_size" if name == "index" else f"__pf_array_size_{name}"
|
|
471
493
|
checked_index = (
|
|
472
|
-
"
|
|
473
|
-
if normalize_negative
|
|
474
|
-
else "__pf_raw_index"
|
|
494
|
+
f"{raw}<0?{raw}+{size}:{raw}" if normalize_negative else raw
|
|
475
495
|
)
|
|
496
|
+
upper = ">" if allow_size else ">="
|
|
476
497
|
return (
|
|
477
|
-
"using
|
|
478
|
-
"if constexpr(!std::is_same_v<
|
|
479
|
-
"if(is_na(
|
|
498
|
+
f"using {raw_type}=std::decay_t<decltype({raw_value})>; "
|
|
499
|
+
f"if constexpr(!std::is_same_v<{raw_type},bool>) {{ "
|
|
500
|
+
f"if(is_na({raw_value})) "
|
|
480
501
|
"pine_runtime_error(std::string(\"Index na is out of bounds. Array size is \")+"
|
|
481
502
|
"std::to_string((int64_t)__pf_array.size())); } "
|
|
482
|
-
"if constexpr(std::is_floating_point_v<
|
|
483
|
-
"if(!std::isfinite(
|
|
484
|
-
"std::string
|
|
485
|
-
"pine_runtime_error(std::string(\"Index \")+
|
|
503
|
+
f"if constexpr(std::is_floating_point_v<{raw_type}>) {{ "
|
|
504
|
+
f"if(!std::isfinite({raw_value})) {{ "
|
|
505
|
+
f"std::string {raw_text}={raw_value}>0?\"inf\":\"-inf\"; "
|
|
506
|
+
f"pine_runtime_error(std::string(\"Index \")+{raw_text}+"
|
|
486
507
|
"\" is out of bounds. Array size is \"+"
|
|
487
508
|
"std::to_string((int64_t)__pf_array.size())); } "
|
|
488
|
-
"long double
|
|
489
|
-
"if(
|
|
490
|
-
"
|
|
509
|
+
f"long double {raw_wide}=(long double){raw_value}; "
|
|
510
|
+
f"if({raw_wide}<(long double)std::numeric_limits<int64_t>::min()||"
|
|
511
|
+
f"{raw_wide}>(long double)std::numeric_limits<int64_t>::max()) "
|
|
491
512
|
"pine_runtime_error(std::string(\"Index \")+"
|
|
492
|
-
"std::to_string((double)
|
|
513
|
+
f"std::to_string((double){raw_value})+"
|
|
493
514
|
"\" is out of bounds. Array size is \"+"
|
|
494
515
|
"std::to_string((int64_t)__pf_array.size())); } "
|
|
495
|
-
"int64_t
|
|
496
|
-
"int64_t
|
|
497
|
-
f"int64_t
|
|
498
|
-
"if(
|
|
499
|
-
"pine_runtime_error(std::string(\"Index \")+std::to_string(
|
|
500
|
-
"\" is out of bounds. Array size is \"+std::to_string(
|
|
516
|
+
f"int64_t {raw}=(int64_t){raw_value}; "
|
|
517
|
+
f"int64_t {size}=(int64_t)__pf_array.size(); "
|
|
518
|
+
f"int64_t {checked}={checked_index}; "
|
|
519
|
+
f"if({checked}<0||{checked}{upper}{size}) "
|
|
520
|
+
f"pine_runtime_error(std::string(\"Index \")+std::to_string({raw})+"
|
|
521
|
+
f"\" is out of bounds. Array size is \"+std::to_string({size})); "
|
|
522
|
+
)
|
|
523
|
+
|
|
524
|
+
|
|
525
|
+
def _checked_array_range_prelude() -> str:
|
|
526
|
+
"""Validate the half-open ``[index_from, index_to)`` range of fill/slice.
|
|
527
|
+
|
|
528
|
+
Both endpoints are checked with ``allow_size`` (``index_to`` is exclusive,
|
|
529
|
+
so ``size`` is a legal endpoint) and without negative normalization
|
|
530
|
+
(neither function appears in the Pine v6 reference's negative-indexing
|
|
531
|
+
set). An inverted range is rejected rather than silently treated as empty:
|
|
532
|
+
``begin()+from > begin()+to`` is undefined behaviour in the STL forms this
|
|
533
|
+
replaces, and no evidence pins TradingView's behaviour there.
|
|
534
|
+
"""
|
|
535
|
+
return (
|
|
536
|
+
_checked_array_index_prelude(
|
|
537
|
+
normalize_negative=False, allow_size=True, name="index_from"
|
|
538
|
+
)
|
|
539
|
+
+ _checked_array_index_prelude(
|
|
540
|
+
normalize_negative=False, allow_size=True, name="index_to"
|
|
541
|
+
)
|
|
542
|
+
+ "if(__pf_array_index_from>__pf_array_index_to) "
|
|
543
|
+
"pine_runtime_error(std::string(\"Index range \")+"
|
|
544
|
+
"std::to_string(__pf_array_index_from)+\"..\"+"
|
|
545
|
+
"std::to_string(__pf_array_index_to)+"
|
|
546
|
+
"\" is invalid. Array size is \"+"
|
|
547
|
+
"std::to_string(__pf_array_size_index_from)); "
|
|
548
|
+
)
|
|
549
|
+
|
|
550
|
+
|
|
551
|
+
def _checked_array_insert(a: str, args: list[str]) -> str:
|
|
552
|
+
"""``array.insert(id, index, value)`` — index is an INSERTION point.
|
|
553
|
+
|
|
554
|
+
``index == size`` appends, so the bound is ``index <= size``; a negative
|
|
555
|
+
index is end-relative, exactly as for ``get``/``set``/``remove``.
|
|
556
|
+
"""
|
|
557
|
+
check = _checked_array_index_prelude(allow_size=True)
|
|
558
|
+
return (
|
|
559
|
+
"[&](auto&& __pf_array){ "
|
|
560
|
+
"return [&](auto&& __pf_raw_index_value){ "
|
|
561
|
+
"return [&](auto&& __pf_array_value){ "
|
|
562
|
+
f"{check}"
|
|
563
|
+
"__pf_array.insert(__pf_array.begin()+(size_t)__pf_array_index, "
|
|
564
|
+
"__pf_array_value); "
|
|
565
|
+
f"}}(({args[1]})); }}(({args[0]})); }}(({a}))"
|
|
566
|
+
)
|
|
567
|
+
|
|
568
|
+
|
|
569
|
+
def _checked_array_fill_range(a: str, args: list[str]) -> str:
|
|
570
|
+
"""``array.fill(id, value, index_from, index_to)`` — bounded range fill."""
|
|
571
|
+
check = _checked_array_range_prelude()
|
|
572
|
+
return (
|
|
573
|
+
"[&](auto&& __pf_array){ "
|
|
574
|
+
"return [&](auto&& __pf_array_value){ "
|
|
575
|
+
"return [&](auto&& __pf_raw_index_from_value){ "
|
|
576
|
+
"return [&](auto&& __pf_raw_index_to_value){ "
|
|
577
|
+
f"{check}"
|
|
578
|
+
"std::fill(__pf_array.begin()+(size_t)__pf_array_index_from, "
|
|
579
|
+
"__pf_array.begin()+(size_t)__pf_array_index_to, __pf_array_value); "
|
|
580
|
+
f"}}(({args[2]})); }}(({args[1]})); }}(({args[0]})); }}(({a}))"
|
|
581
|
+
)
|
|
582
|
+
|
|
583
|
+
|
|
584
|
+
def checked_array_slice(a: str, args: list[str], *, result_type: str) -> str:
|
|
585
|
+
"""``array.slice(id, index_from, index_to)`` — bounded range extraction.
|
|
586
|
+
|
|
587
|
+
``result_type`` stays caller-supplied so the typed method lane keeps
|
|
588
|
+
emitting the receiver's own element type; only the bounds checks are new.
|
|
589
|
+
"""
|
|
590
|
+
check = _checked_array_range_prelude()
|
|
591
|
+
return (
|
|
592
|
+
"[&](auto&& __pf_array){ "
|
|
593
|
+
"return [&](auto&& __pf_raw_index_from_value){ "
|
|
594
|
+
"return [&](auto&& __pf_raw_index_to_value){ "
|
|
595
|
+
f"{check}"
|
|
596
|
+
f"return {result_type}(__pf_array.begin()+(size_t)__pf_array_index_from, "
|
|
597
|
+
"__pf_array.begin()+(size_t)__pf_array_index_to); "
|
|
598
|
+
f"}}(({args[1]})); }}(({args[0]})); }}(({a}))"
|
|
501
599
|
)
|
|
502
600
|
|
|
503
601
|
|
|
@@ -600,7 +698,7 @@ ARRAY_METHODS = {
|
|
|
600
698
|
"set": _checked_array_set,
|
|
601
699
|
"push": lambda a, args: f"{a}.push_back({args[0]})",
|
|
602
700
|
"unshift": lambda a, args: f"{a}.insert({a}.begin(), {args[0]})",
|
|
603
|
-
"insert":
|
|
701
|
+
"insert": _checked_array_insert,
|
|
604
702
|
"pop": lambda a, args: _checked_array_end_remove(a, "pop"),
|
|
605
703
|
"shift": lambda a, args: _checked_array_end_remove(a, "shift"),
|
|
606
704
|
"remove": _checked_array_remove,
|
|
@@ -609,7 +707,7 @@ ARRAY_METHODS = {
|
|
|
609
707
|
"size": lambda a, args: f"(double){a}.size()",
|
|
610
708
|
"clear": lambda a, args: f"{a}.clear()",
|
|
611
709
|
"fill": lambda a, args: f"std::fill({a}.begin(), {a}.end(), {args[0]})" if len(args) == 1
|
|
612
|
-
else
|
|
710
|
+
else _checked_array_fill_range(a, args),
|
|
613
711
|
"includes": lambda a, args: f"(std::find({a}.begin(), {a}.end(), {args[0]}) != {a}.end())",
|
|
614
712
|
"indexof": lambda a, args: f"[&](){{ auto it=std::find({a}.begin(),{a}.end(),{args[0]}); return it!={a}.end()?(double)(it-{a}.begin()):-1.0; }}()",
|
|
615
713
|
"lastindexof": lambda a, args: f"[&](){{ for(int i=(int){a}.size()-1;i>=0;i--)if({a}[i]=={args[0]})return(double)i; return -1.0; }}()",
|
|
@@ -619,7 +717,7 @@ ARRAY_METHODS = {
|
|
|
619
717
|
),
|
|
620
718
|
"reverse": lambda a, args: f"std::reverse({a}.begin(),{a}.end())",
|
|
621
719
|
"copy": lambda a, args: f"std::vector<double>({a})",
|
|
622
|
-
"slice": lambda a, args:
|
|
720
|
+
"slice": lambda a, args: checked_array_slice(a, args, result_type="std::vector<double>"),
|
|
623
721
|
"concat": lambda a, args: f"{a}.insert({a}.end(),{args[0]}.begin(),{args[0]}.end())",
|
|
624
722
|
"sum": lambda a, args: f"({a}.empty()?na<double>():std::accumulate({a}.begin(),{a}.end(),0.0))",
|
|
625
723
|
"avg": lambda a, args: f"({a}.empty()?na<double>():std::accumulate({a}.begin(),{a}.end(),0.0)/{a}.size())",
|
|
@@ -667,6 +765,9 @@ CHECKED_ARRAY_METHOD_KWARGS: dict[str, list[str]] = {
|
|
|
667
765
|
"set": ["index", "value"],
|
|
668
766
|
"remove": ["index"],
|
|
669
767
|
"percentrank": ["index"],
|
|
768
|
+
"insert": ["index", "value"],
|
|
769
|
+
"fill": ["value", "index_from", "index_to"],
|
|
770
|
+
"slice": ["index_from", "index_to"],
|
|
670
771
|
"first": [],
|
|
671
772
|
"last": [],
|
|
672
773
|
"pop": [],
|