mirror of
git://git.tartarus.org/simon/puzzles.git
synced 2025-04-21 08:01:30 -07:00
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.
This commit is contained in:
@ -423,7 +423,7 @@ function initPuzzle() {
|
|||||||
// 'number' is used for C pointers
|
// 'number' is used for C pointers
|
||||||
var get_save_file = Module.cwrap('get_save_file', 'number', []);
|
var get_save_file = Module.cwrap('get_save_file', 'number', []);
|
||||||
var free_save_file = Module.cwrap('free_save_file', 'void', ['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 (save_button) save_button.onclick = function(event) {
|
||||||
if (dlg_dimmer === null) {
|
if (dlg_dimmer === null) {
|
||||||
@ -457,10 +457,10 @@ function initPuzzle() {
|
|||||||
var file = input.files.item(0);
|
var file = input.files.item(0);
|
||||||
var reader = new FileReader();
|
var reader = new FileReader();
|
||||||
reader.addEventListener("loadend", function() {
|
reader.addEventListener("loadend", function() {
|
||||||
var string = reader.result;
|
var array = new Uint8Array(reader.result);
|
||||||
load_game(string, string.length);
|
load_game(array, array.length);
|
||||||
});
|
});
|
||||||
reader.readAsText(file);
|
reader.readAsArrayBuffer(file);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
input.click();
|
input.click();
|
||||||
|
Reference in New Issue
Block a user