diff --git a/hosts/ocaml/browser/sx-platform.js b/hosts/ocaml/browser/sx-platform.js index acee5482..320bf33c 100644 --- a/hosts/ocaml/browser/sx-platform.js +++ b/hosts/ocaml/browser/sx-platform.js @@ -234,35 +234,28 @@ } /** - * Try loading a pre-compiled .sxbc.json bytecode module. + * Try loading a pre-compiled .sxbc bytecode module (SX text format). * Returns true on success, null on failure (caller falls back to .sx source). */ function loadBytecodeFile(path) { - var bcPath = path.replace(/\.sx$/, '.sxbc.json'); - var url = _baseUrl + bcPath + _sxbcCacheBust; + var sxbcPath = path.replace(/\.sx$/, '.sxbc'); + var url = _baseUrl + sxbcPath + _sxbcCacheBust; try { var xhr = new XMLHttpRequest(); xhr.open("GET", url, false); xhr.send(); if (xhr.status !== 200) return null; - var json = JSON.parse(xhr.responseText); - if (!json.module || json.magic !== 'SXBC') return null; - - var module = { - _type: 'dict', - bytecode: { _type: 'list', items: json.module.bytecode }, - constants: { _type: 'list', items: json.module.constants.map(deserializeConstant) }, - }; - - var result = K.loadModule(module); + window.__sxbcText = xhr.responseText; + var result = K.eval('(load-sxbc (first (parse (host-global "__sxbcText"))))'); + delete window.__sxbcText; if (typeof result === 'string' && result.indexOf('Error') === 0) { console.warn("[sx-platform] bytecode FAIL " + path + ":", result); return null; } - console.log("[sx-platform] ok " + path + " (bytecode)"); return true; } catch(e) { + delete window.__sxbcText; return null; } } diff --git a/shared/static/wasm/sx-platform-2.js b/shared/static/wasm/sx-platform-2.js index 08b61070..acee5482 100644 --- a/shared/static/wasm/sx-platform-2.js +++ b/shared/static/wasm/sx-platform-2.js @@ -339,9 +339,11 @@ for (var i = 0; i < files.length; i++) { var r = loadBytecodeFile(files[i]); if (r) { bcCount++; continue; } - // Bytecode not available — load source inside the batch (don't break it) + // Bytecode not available — end batch, load source, restart batch + if (K.endModuleLoad) K.endModuleLoad(); r = loadSxFile(files[i]); if (typeof r === "number") { loaded += r; srcCount++; } + if (K.beginModuleLoad) K.beginModuleLoad(); } if (K.endModuleLoad) K.endModuleLoad(); console.log("[sx-platform] Loaded " + files.length + " files (" + bcCount + " bytecode, " + srcCount + " source, " + loaded + " exprs)");