diff options
author | Sylvain Henry <sylvain@haskus.fr> | 2023-04-27 16:58:21 +0200 |
---|---|---|
committer | Sylvain Henry <sylvain@haskus.fr> | 2023-05-03 10:55:20 +0200 |
commit | eed582b504a14b307bef635b25a10e2ce2c9110e (patch) | |
tree | f252e1540d5d293d486d5993de9de7e264c86650 /rts/js/environment.js | |
parent | 0646d828de9c45e2bd0b83cd5367798af4cdb8f2 (diff) | |
download | haskell-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.js | 23 |
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; |