diff --git a/runtime/io.js b/runtime/io.js index 680640ae1d..ab702a7fa4 100644 --- a/runtime/io.js +++ b/runtime/io.js @@ -31,6 +31,10 @@ function caml_sys_close(fd) { return 0; } +//Provides: MlChanid +function MlChanid(id){ + this.id = id +} //Provides: caml_sys_open //Requires: caml_raise_sys_error @@ -40,17 +44,18 @@ function caml_sys_close(fd) { //Requires: fs_node_supported //Requires: caml_sys_fds //Requires: caml_sys_open_for_node +//Requires: MlChanid function caml_sys_open_internal(file,idx) { var chanid; if(idx == undefined){ idx = caml_sys_fds.length; - chanid = Symbol(idx.toString()); + chanid = new MlChanid(idx); } else if(caml_sys_fds[idx]){ chanid = caml_sys_fds[idx].chanid; } else - chanid = Symbol(idx.toString ()); + chanid = new MlChanid(idx); caml_sys_fds[idx] = {file:file, chanid: chanid}; return idx | 0; } @@ -97,12 +102,13 @@ function caml_sys_open (name, flags, _perms) { //Provides: caml_ml_set_channel_name //Requires: caml_ml_channels function caml_ml_set_channel_name(chanid, name) { - var chan = caml_ml_channels[chanid]; + var chan = caml_ml_channels.get(chanid); chan.name = name; return 0; } //Provides: caml_ml_channels +//Requires: MlChanid function caml_ml_channels_state() { this.map = new globalThis.WeakMap (); this.opened = new globalThis.Set(); @@ -121,21 +127,7 @@ caml_ml_channels_state.prototype.all = function () { return this.opened.values(); } -var channels_handlers = { - get (target, prop, receiver) { - if(typeof prop == "symbol"){ - return target.get(prop); - } - return globalThis.Reflect.get(...arguments); - }, - set (target, prop, new_val, receiver) { - if(typeof prop == "symbol"){ - target.set(prop, new_val); - } - return true; - } -} -var caml_ml_channels = new globalThis.Proxy(new caml_ml_channels_state, channels_handlers); +var caml_ml_channels = new caml_ml_channels_state; //Provides: caml_ml_out_channels_list //Requires: caml_ml_channels @@ -144,7 +136,7 @@ function caml_ml_out_channels_list () { var l = 0; var keys = caml_ml_channels.all(); for(var k of keys){ - var chan = caml_ml_channels[k]; + var chan = caml_ml_channels.get(k); if(chan.opened && chan.out) l=[0,k,l]; } return l; @@ -169,7 +161,7 @@ function caml_ml_open_descriptor_out (fd) { buffer:new Uint8Array(65536), buffered:buffered }; - caml_ml_channels[chanid] = channel; + caml_ml_channels.set(chanid, channel); return chanid; } @@ -192,7 +184,7 @@ function caml_ml_open_descriptor_in (fd) { buffer:new Uint8Array(65536), refill:refill }; - caml_ml_channels[chanid] = channel; + caml_ml_channels.set(chanid, channel); return chanid; } @@ -215,14 +207,14 @@ function caml_ml_open_descriptor_out_with_flags(fd, flags){ //Requires: caml_ml_channels //Alias: win_filedescr_of_channel function caml_channel_descriptor(chanid){ - var chan = caml_ml_channels[chanid]; + var chan = caml_ml_channels.get(chanid); return chan.fd; } //Provides: caml_ml_set_binary_mode //Requires: caml_ml_channels function caml_ml_set_binary_mode(chanid,mode){ - var chan = caml_ml_channels[chanid]; + var chan = caml_ml_channels.get(chanid); chan.file.flags.text = !mode chan.file.flags.binary = mode return 0; @@ -232,7 +224,7 @@ function caml_ml_set_binary_mode(chanid,mode){ //Requires: caml_ml_channels //Version: >= 5.2 function caml_ml_is_binary_mode(chanid) { - var chan = caml_ml_channels[chanid]; + var chan = caml_ml_channels.get(chanid); return chan.file.flags.binary } @@ -242,7 +234,7 @@ function caml_ml_is_binary_mode(chanid) { //Requires: caml_ml_flush, caml_ml_channels //Requires: caml_sys_close function caml_ml_close_channel (chanid) { - var chan = caml_ml_channels[chanid]; + var chan = caml_ml_channels.get(chanid); if(chan.opened) { chan.opened = false; caml_ml_channels.close(chanid); @@ -258,21 +250,21 @@ function caml_ml_close_channel (chanid) { //Provides: caml_ml_channel_size //Requires: caml_ml_channels function caml_ml_channel_size(chanid) { - var chan = caml_ml_channels[chanid]; + var chan = caml_ml_channels.get(chanid); return chan.file.length(); } //Provides: caml_ml_channel_size_64 //Requires: caml_int64_of_float,caml_ml_channels function caml_ml_channel_size_64(chanid) { - var chan = caml_ml_channels[chanid]; + var chan = caml_ml_channels.get(chanid); return caml_int64_of_float(chan.file.length ()); } //Provides: caml_ml_set_channel_output //Requires: caml_ml_channels function caml_ml_set_channel_output(chanid,f) { - var chan = caml_ml_channels[chanid]; + var chan = caml_ml_channels.get(chanid); chan.output = (function (s) {f(s)}); return 0; } @@ -280,7 +272,7 @@ function caml_ml_set_channel_output(chanid,f) { //Provides: caml_ml_set_channel_refill //Requires: caml_ml_channels function caml_ml_set_channel_refill(chanid,f) { - caml_ml_channels[chanid].refill = f; + caml_ml_channels.get(chanid).refill = f; return 0; } @@ -329,7 +321,7 @@ function caml_ml_input_bigarray (chanid, b, i, l) { //Provides: caml_ml_input_block //Requires: caml_refill, caml_ml_channels function caml_ml_input_block (chanid, ba, i, l) { - var chan = caml_ml_channels[chanid]; + var chan = caml_ml_channels.get(chanid); var n = l; var avail = chan.buffer_max - chan.buffer_curr; if(l <= avail) { @@ -357,7 +349,7 @@ function caml_ml_input_block (chanid, ba, i, l) { //Requires: caml_refill, caml_failwith, caml_raise_end_of_file //Requires: caml_marshal_header_size function caml_input_value (chanid) { - var chan = caml_ml_channels[chanid]; + var chan = caml_ml_channels.get(chanid); var header = new Uint8Array(caml_marshal_header_size); function block(buffer, offset, n) { var r = 0; @@ -402,7 +394,7 @@ function caml_input_value_to_outside_heap(c) { //Requires: caml_raise_end_of_file, caml_array_bound_error //Requires: caml_ml_channels, caml_refill function caml_ml_input_char (chanid) { - var chan = caml_ml_channels[chanid]; + var chan = caml_ml_channels.get(chanid); if(chan.buffer_curr >= chan.buffer_max){ chan.buffer_curr = 0; chan.buffer_max = 0; @@ -419,7 +411,7 @@ function caml_ml_input_char (chanid) { //Requires: caml_raise_end_of_file //Requires: caml_ml_input_char, caml_ml_channels function caml_ml_input_int (chanid) { - var chan = caml_ml_channels[chanid]; + var chan = caml_ml_channels.get(chanid); var res = 0; for(var i = 0; i < 4; i++){ res = (res << 8) + caml_ml_input_char(chanid) | 0; @@ -430,7 +422,7 @@ function caml_ml_input_int (chanid) { //Provides: caml_seek_in //Requires: caml_raise_sys_error, caml_ml_channels function caml_seek_in(chanid, pos) { - var chan = caml_ml_channels[chanid]; + var chan = caml_ml_channels.get(chanid); if (chan.refill != null) caml_raise_sys_error("Illegal seek"); if(pos >= chan.offset - chan.buffer_max && pos <= chan.offset @@ -460,7 +452,7 @@ function caml_ml_seek_in_64(chanid,pos){ //Provides: caml_pos_in //Requires: caml_ml_channels function caml_pos_in(chanid) { - var chan = caml_ml_channels[chanid]; + var chan = caml_ml_channels.get(chanid); return chan.offset - (chan.buffer_max - chan.buffer_curr) | 0; } @@ -480,7 +472,7 @@ function caml_ml_pos_in_64(chanid) { //Requires: caml_array_bound_error //Requires: caml_ml_channels, caml_refill function caml_ml_input_scan_line(chanid){ - var chan = caml_ml_channels[chanid]; + var chan = caml_ml_channels.get(chanid); var p = chan.buffer_curr; do { if(p >= chan.buffer_max) { @@ -507,7 +499,7 @@ function caml_ml_input_scan_line(chanid){ //Requires: caml_raise_sys_error, caml_ml_channels //Requires: caml_subarray_to_jsbytes function caml_ml_flush (chanid) { - var chan = caml_ml_channels[chanid]; + var chan = caml_ml_channels.get(chanid); if(! chan.opened) caml_raise_sys_error("Cannot flush a closed channel"); if(!chan.buffer || chan.buffer_curr == 0) return 0; if(chan.output) { @@ -526,7 +518,7 @@ function caml_ml_flush (chanid) { //Requires: caml_ml_flush,caml_ml_bytes_length //Requires: caml_raise_sys_error, caml_ml_channels function caml_ml_output_ta(chanid,buffer,offset,len) { - var chan = caml_ml_channels[chanid]; + var chan = caml_ml_channels.get(chanid); if(! chan.opened) caml_raise_sys_error("Cannot output to a closed channel"); buffer = buffer.subarray(offset, offset + len); if(chan.buffer_curr + buffer.length > chan.buffer.length) { @@ -611,7 +603,7 @@ function caml_output_value (chanid,v,flags) { //Requires: caml_ml_channels, caml_ml_flush function caml_seek_out(chanid, pos){ caml_ml_flush(chanid); - var chan = caml_ml_channels[chanid]; + var chan = caml_ml_channels.get(chanid); chan.offset = pos; return 0; } @@ -631,7 +623,7 @@ function caml_ml_seek_out_64(chanid,pos){ //Provides: caml_pos_out //Requires: caml_ml_channels, caml_ml_flush function caml_pos_out(chanid) { - var chan = caml_ml_channels[chanid]; + var chan = caml_ml_channels.get(chanid); return chan.offset + chan.buffer_curr } @@ -660,13 +652,13 @@ function caml_ml_output_int (chanid,i) { //Provides: caml_ml_is_buffered //Requires: caml_ml_channels function caml_ml_is_buffered(chanid) { - return caml_ml_channels[chanid].buffered ? 1 : 0 + return caml_ml_channels.get(chanid).buffered ? 1 : 0 } //Provides: caml_ml_set_buffered //Requires: caml_ml_channels, caml_ml_flush function caml_ml_set_buffered(chanid,v) { - caml_ml_channels[chanid].buffered = v; + caml_ml_channels.get(chanid).buffered = v; if(!v) caml_ml_flush(chanid); return 0 }