Skip to content

Commit

Permalink
WIP
Browse files Browse the repository at this point in the history
  • Loading branch information
hhugo committed Apr 15, 2024
1 parent 81814fe commit 6ab4f90
Showing 1 changed file with 34 additions and 42 deletions.
76 changes: 34 additions & 42 deletions runtime/io.js
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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;
}
Expand Down Expand Up @@ -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();
Expand All @@ -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
Expand All @@ -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;
Expand All @@ -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;
}

Expand All @@ -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;
}

Expand All @@ -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;
Expand All @@ -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
}

Expand All @@ -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);
Expand All @@ -258,29 +250,29 @@ 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;
}

//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;
}

Expand Down Expand Up @@ -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) {
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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;
Expand All @@ -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;
Expand All @@ -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
Expand Down Expand Up @@ -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;
}

Expand All @@ -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) {
Expand All @@ -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) {
Expand All @@ -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) {
Expand Down Expand Up @@ -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;
}
Expand All @@ -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
}

Expand Down Expand Up @@ -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
}

0 comments on commit 6ab4f90

Please sign in to comment.