summaryrefslogtreecommitdiff
path: root/rts/js/environment.js
diff options
context:
space:
mode:
authorSylvain Henry <sylvain@haskus.fr>2023-04-27 16:58:21 +0200
committerSylvain Henry <sylvain@haskus.fr>2023-05-03 10:55:20 +0200
commiteed582b504a14b307bef635b25a10e2ce2c9110e (patch)
treef252e1540d5d293d486d5993de9de7e264c86650 /rts/js/environment.js
parent0646d828de9c45e2bd0b83cd5367798af4cdb8f2 (diff)
downloadhaskell-wip/js-boundsCheck.tar.gz
Fix remaining issues with bound checking (#23123)wip/js-boundsCheck
While fixing these I've also changed the way we store addresses into ByteArray#. Addr# are composed of two parts: a JavaScript array and an offset (32-bit number). Suppose we want to store an Addr# in a ByteArray# foo at offset i. Before this patch, we were storing both fields as a tuple in the "arr" array field: foo.arr[i] = [addr_arr, addr_offset]; Now we only store the array part in the "arr" field and the offset directly in the array: foo.dv.setInt32(i, addr_offset): foo.arr[i] = addr_arr; It avoids wasting space for the tuple.
Diffstat (limited to 'rts/js/environment.js')
-rw-r--r--rts/js/environment.js23
1 files changed, 11 insertions, 12 deletions
diff --git a/rts/js/environment.js b/rts/js/environment.js
index 193d6a6029..1cd4e6cfbb 100644
--- a/rts/js/environment.js
+++ b/rts/js/environment.js
@@ -158,20 +158,19 @@ function h$getProgArgv(argc_v,argc_off,argv_v,argv_off) {
} else {
argc_v.dv.setInt32(argc_off, c, true);
var argv = h$newByteArray(4*c);
- argv.arr = [];
for(var i=0;i<h$programArgs().length;i++) {
- argv.arr[4*i] = [ h$encodeUtf8(h$programArgs()[i]), 0 ];
+ PUT_ADDR(argv,4*i,h$encodeUtf8(h$programArgs()[i]),0);
}
- if(!argv_v.arr) { argv_v.arr = []; }
- argv_v.arr[argv_off] = [argv, 0];
+ PUT_ADDR(argv_v,argv_off,argv,0);
}
}
function h$setProgArgv(n, ptr_d, ptr_o) {
args = [];
for(var i=0;i<n;i++) {
- var p = ptr_d.arr[ptr_o+4*i];
- var arg = h$decodeUtf8z(p[0], p[1]);
+ var off = ptr_o+4*i;
+ GET_ADDR(ptr_d,off,p,o);
+ var arg = h$decodeUtf8z(p, o);
args.push(arg);
}
h$programArgs_ = args;
@@ -218,9 +217,10 @@ function h$__hscore_environ() {
}
if(env.length === 0) return null;
var p = h$newByteArray(4*env.length+1);
- p.arr = [];
- for(i=0;i<env.length;i++) p.arr[4*i] = [h$encodeUtf8(env[i]), 0];
- p.arr[4*env.length] = [null, 0];
+ for(i=0;i<env.length;i++) {
+ PUT_ADDR(p,4*i,h$encodeUtf8(env[i]),0);
+ }
+ PUT_ADDR(p,4*env.length,null,0);
RETURN_UBX_TUP2(p, 0);
}
#endif
@@ -435,9 +435,8 @@ function h$localtime_r(timep_v, timep_o, result_v, result_o) {
result_v.dv.setInt32(result_o + 28, 0, true); // fixme yday 1-365 (366?)
result_v.dv.setInt32(result_o + 32, -1, true); // dst information unknown
result_v.dv.setInt32(result_o + 40, 0, true); // gmtoff?
- if(!result_v.arr) result_v.arr = [];
- result_v.arr[result_o + 40] = [h$myTimeZone, 0];
- result_v.arr[result_o + 48] = [h$myTimeZone, 0];
+ PUT_ADDR(result_v,result_o+40, h$myTimeZone, 0);
+ PUT_ADDR(result_v,result_o+48, h$myTimeZone, 0);
RETURN_UBX_TUP2(result_v, result_o);
}
var h$__hscore_localtime_r = h$localtime_r;