diff --git a/hosts/ocaml/bin/sx_server.ml b/hosts/ocaml/bin/sx_server.ml index 4a5be83..4cfae75 100644 --- a/hosts/ocaml/bin/sx_server.ml +++ b/hosts/ocaml/bin/sx_server.ml @@ -913,6 +913,10 @@ let register_jit_hook env = | Some _ -> None (* compile failed — CEK handles *) | None -> if !_jit_compiling then None + else if Hashtbl.length l.l_closure.bindings > 0 + || l.l_closure.parent <> None then + (* Skip JIT for lambdas with closure bindings *) + None else begin let fn_name = match l.l_name with Some n -> n | None -> "?" in _jit_compiling := true; diff --git a/shared/sx/ocaml_bridge.py b/shared/sx/ocaml_bridge.py index 05dc206..184eb3e 100644 --- a/shared/sx/ocaml_bridge.py +++ b/shared/sx/ocaml_bridge.py @@ -440,16 +440,6 @@ class OcamlBridge: _logger.warning("OCaml load skipped %s: %s", filepath, e) - # JIT workaround: sx-parse has a complex letrec (20 mutually - # recursive functions) that the JIT compiles incorrectly — - # closing parens cause siblings to become children. - # CEK-interpreted sx-parse works correctly. - try: - await self._send('(vm-reset-fn "sx-parse")') - await self._read_until_ok(ctx=None) - except OcamlBridgeError: - pass - # SSR overrides: effect is a no-op on the server (prevents # reactive loops during island SSR — effects are DOM side-effects) try: