shithub: puzzles

Download patch

ref: 8d3a93ce47237114a88d8bed81ab175994eb9a6b
parent: 2499eb47fa4e0c86bc1b6100b4922026670b2ad8
author: Ben Harris <bjh21@bjh21.me.uk>
date: Sun Apr 2 16:58:30 EDT 2023

js: load games using FileReader.readAsArrayBuffer()

Using .readAsText() meant that trying to load a non-text file (for
instance something that's not a save file at all) would generate an
"RuntimeError: index out of bounds".  This would then leave the
Emscripten runtime in a broken state.

It might even be possible for a real save file not to be valid UTF-8,
for instance if it came from a platform that used a different character
encoding for random seeds.

There's still a problem with opening very large files, apparently
because Emscripten tries to stuff the entire file onto the C stack.
That will probably have to be fixed by properly exposing the incremental
file-loading API to JavaScript.

--- a/emccpre.js
+++ b/emccpre.js
@@ -423,7 +423,7 @@
     // 'number' is used for C pointers
     var get_save_file = Module.cwrap('get_save_file', 'number', []);
     var free_save_file = Module.cwrap('free_save_file', 'void', ['number']);
-    var load_game = Module.cwrap('load_game', 'void', ['string', 'number']);
+    var load_game = Module.cwrap('load_game', 'void', ['array', 'number']);
 
     if (save_button) save_button.onclick = function(event) {
         if (dlg_dimmer === null) {
@@ -457,10 +457,10 @@
                     var file = input.files.item(0);
                     var reader = new FileReader();
                     reader.addEventListener("loadend", function() {
-                        var string = reader.result;
-                        load_game(string, string.length);
+                        var array = new Uint8Array(reader.result);
+                        load_game(array, array.length);
                     });
-                    reader.readAsText(file);
+                    reader.readAsArrayBuffer(file);
                 }
             });
             input.click();