From 178837b88d00be691ee2220fa6f7af7d40353291 Mon Sep 17 00:00:00 2001 From: John Alanbrook Date: Tue, 10 Feb 2026 09:53:41 -0600 Subject: [PATCH] bootstrap --- internal/bootstrap.cm | 32 ++++++--- internal/bootstrap.mach | Bin 4969 -> 4875 bytes internal/engine.cm | 143 ++++++++++++++++++++++++---------------- internal/engine.mach | Bin 0 -> 22470 bytes regen.cm | 42 ++++++++++++ source/cell.c | 8 +-- 6 files changed, 155 insertions(+), 70 deletions(-) create mode 100644 internal/engine.mach create mode 100644 regen.cm diff --git a/internal/bootstrap.cm b/internal/bootstrap.cm index 17ba5481..07fec6e1 100644 --- a/internal/bootstrap.cm +++ b/internal/bootstrap.cm @@ -123,37 +123,51 @@ function use_fn(path) { // Helper to load engine.cm and run it with given env function load_engine(env) { var engine_path = core_path + '/internal/engine.mach' + var data = null + var engine_src = null + var engine_ast = null if (fd.is_file(engine_path)) { - var data = fd.slurp(engine_path) + data = fd.slurp(engine_path) return mach_load(data, env) } engine_path = core_path + '/internal/engine.cm' - var engine_src = text(fd.slurp(engine_path)) - var engine_ast = analyze(engine_src, engine_path) + engine_src = text(fd.slurp(engine_path)) + engine_ast = analyze(engine_src, engine_path) return run_ast('engine', engine_ast, env) } // Detect mode and route // CLI mode has 'args'; actor spawn mode has 'init' +var program = null +var user_args = [] +var _j = 0 +var script_file = null +var script = null +var ast = null + if (args != null) { // CLI mode — run script directly - var program = args[0] - var user_args = [] - var _j = 1 + program = args[0] + _j = 1 while (_j < length(args)) { push(user_args, args[_j]) _j = _j + 1 } - var script_file = program + script_file = program if (!ends_with(script_file, '.ce') && !ends_with(script_file, '.cm')) script_file = program + '.cm' + // Search CWD then core_path, trying .cm then .ce if (!fd.is_file(script_file)) script_file = core_path + '/' + program + '.cm' + if (!fd.is_file(script_file)) + script_file = program + '.ce' + if (!fd.is_file(script_file)) + script_file = core_path + '/' + program + '.ce' - var script = text(fd.slurp(script_file)) - var ast = analyze(script, script_file) + script = text(fd.slurp(script_file)) + ast = analyze(script, script_file) run_ast(program, ast, {use: use_fn, args: user_args, json: json}) } else { // Actor spawn mode — load engine.cm with full actor env diff --git a/internal/bootstrap.mach b/internal/bootstrap.mach index 14cb55276421c38404867b4c451727d9591cd1a9..a188f1bfc77ff154b774e915b84d0905a8b12b8a 100644 GIT binary patch delta 2188 zcmZXVeNPlu6o=33y1TG|3+&6C;bmcE7uZFFrUGhP#9B2?YgPQCRzezTeGj{<&|;I? zsS<&tt<{dP(nOjF#Q=$|pA-wGyLV#214gBt%kXSbUa9y)vzCH7Y3;7Q+;2iz?GO;mbQ`{4I8a zNK>N(O{*!W%&3?V3C5HeFn39yDJDavQ6E>PbSs~T+Ra*2y}lNdl(o~3-mA=%ib}x3 zS2MmWBNi|%$tlAK1eF9-tpuDEf4`09fC@=3+EVCEnqsA_I5v(=U=!E|Yy(zdm6bI8 z@swpUHhE`ZE#5WNCe7xE4zQOB2E~vlw7`D&7$)Fr2uR!|EMc+362p|Jky@#dM438i zkloC7<4O}@9C2+_>KWJLNYl-;n{!$GWF-l?GC6$Yq#4p>df4A1O|Zw-50`yx>_eBP zpD_Jm!JaZd@a{f)G(RHw0YV-k>nDUf;>;tdEAyD~V`+5xS*qj-XP+Rjl10ue>iieU zU=cN%U)bpJlt4=yUc%9mwCy0rd_Nr7#;?*UnrEDQhQLaenJ?p~LIdowaqU>aihyu{S8+2KTnX!Uj$^ zq!)(EykOG{s`5JyN+_(R%jFO5vP36VGXzIpaSD4%UUE$@rK3!U1~uF!73aU;xz-TZ z84?rPp=&$NROso+81G`p*ThLP&Sh#6L{E@zf<{TWJ=lxgjv@oaZjDJKb920E#IReb zVk-%k$YA%nBoW(2xHhicqn(iL9QQ~uPZ21^_vO*S{tlYIL>k-Uk|t!D0;UOGLDHRM zSj@1H;b4Y0Wi}6mb3S{3ga?Q)Kw&)w>Fq(18RT;s$yHFusN<(-t|#Z@l6#_AviLGD3+*kOarQ0bO1L33(SsM{)Qb_837*bYeT@I0f1w z&A7w~CtLS{|9z=(&eV1E8S)_lPjdDn0(qR~V;rT!MtSdXmfDQx zNyGk(pqdK^_?+}FVlN@+5@~2IBjhqdG}riQuaRaY*V%KO4lB`t&ACkCW0C|t@{~8v z**pnVV7rq7_fTN5z+Y64A_s~DEpnhpvlRJ)D!D;zZ_qHBn~40|g0DM(6JC1gm@7Yz9V{M!0~UvK9~<{Na`G~Kswha~Ti zq{m$}+-0xFEc01%m?Z~~dlc**1=Gw?>^b(&p?N3stj%+~^ODZ$hsy$@7YMk3!v)%+ H67~5EG+w06M?7+fyfwfQ@Kt!!=y)?#3Ol!Q9kSHQlnzD;~SpO`Pseg5T)9;P!15c8YOS)TEH-++o+X*38}aYnObvsEG_{fB)z!G;NCXH%2*L>1RKRh ztzI>5#bUM<58GzKvdv_@Z5mAhiyTrllD9O?HfyZBp=mk2OWcw^l#4QDO3<`YLBouR z*@P^^%orB3kkEnzOG~*UHK!ex{=b9-5)u_Dgh^zq7RFi_YsI!!M5I9uL(HR*b|Y;?6YVA(DY~Q?lG2TjZm}U> zp$8v5$mo%5g*@x?l7bE&M|xShgY_NkD3irLqdFC(C4(i7Xql)qmT+hV!~JK#~KL za6obu205ES5*g%`4RS7nl+@=rbPbW$^Jp37Hom~x7s=-(>!@=`x-&Ye@4nOU`{etKet;~+1y1_{r|mOJx}&HX zA@U24B-Vy3^c>&{ui^?PrdXgx3*ts1KQ-t0Hg8x%&d$TeJK{UTR!KTFIlv2Tg9^jVg=v@8>FnTcg4 IszImx2P3c>bN~PV diff --git a/internal/engine.cm b/internal/engine.cm index d006d929..b2d04872 100644 --- a/internal/engine.cm +++ b/internal/engine.cm @@ -6,17 +6,13 @@ var SYSYM = '__SYSTEM__' var _cell = {} var need_stop = false -var dylib_ext - var cases = { Windows: '.dll', macOS: '.dylib', Linux: '.so' } -print(os.platform()) - -dylib_ext = cases[os.platform()] +var dylib_ext = cases[os.platform()] var MOD_EXT = '.cm' var ACTOR_EXT = '.ce' @@ -67,11 +63,14 @@ function use_core(path) { return use_cache[cache_key] var sym = use_embed(replace(path, '/', '_')) + var result = null + var script = null + var ast = null // Check for pre-compiled .mach file first var mach_path = core_path + '/' + path + '.mach' if (fd.is_file(mach_path)) { - var result = mach_load(fd.slurp(mach_path), {use: use_core}) + result = mach_load(fd.slurp(mach_path), {use: use_core}) use_cache[cache_key] = result return result } @@ -79,9 +78,9 @@ function use_core(path) { // Fall back to source .cm file — compile at runtime var file_path = core_path + '/' + path + MOD_EXT if (fd.is_file(file_path)) { - var script = text(fd.slurp(file_path)) - var ast = analyze(script, file_path) - var result = run_ast_fn('core:' + path, ast, {use: use_core}) + script = text(fd.slurp(file_path)) + ast = analyze(script, file_path) + result = run_ast_fn('core:' + path, ast, {use: use_core}) use_cache[cache_key] = result return result } @@ -108,21 +107,24 @@ function is_actor(value) { var ENETSERVICE = 0.1 var REPLYTIMEOUT = 60 // seconds before replies are ignored -function caller_data(depth = 0) +function caller_data(depth) { + var _depth = depth == null ? 0 : depth var file = "nofile" var line = 0 - - var caller = array(Error().stack, "\n")[1+depth] + var md = null + var m = null + + var caller = array(Error().stack, "\n")[1+_depth] if (caller) { - var md = extract(caller, /\((.*)\:/) - var m = md ? md[1] : "SCRIPT" + md = extract(caller, /\((.*)\:/) + m = md ? md[1] : "SCRIPT" if (m) file = m md = extract(caller, /\:(\d*)\)/) m = md ? md[1] : 0 if (m) line = m } - + return {file,line} } @@ -152,6 +154,9 @@ function log(name, args) { function actor_die(err) { + var reason = null + var unders = null + if (err && is_function(err.toString)) { os.print(err.toString()) os.print("\n") @@ -161,14 +166,14 @@ function actor_die(err) if (overling) { if (err) { // with an err, this is a forceful disrupt - var reason = (is_proto(err, Error)) ? err.stack : err + reason = (is_proto(err, Error)) ? err.stack : err report_to_overling({type:'disrupt', reason}) } else report_to_overling({type:'stop'}) } if (underlings) { - var unders = array(underlings) + unders = array(underlings) arrfor(unders, function(id, index) { log.console(`calling on ${id} to disrupt too`) $_.stop(create_actor({id})) @@ -192,9 +197,10 @@ function actor_die(err) _cell.args = init != null ? init : {} _cell.id = "newguy" -function create_actor(desc = {id:guid()}) { +function create_actor(desc) { + var _desc = desc == null ? {id:guid()} : desc var actor = {} - actor[ACTORDATA] = desc + actor[ACTORDATA] = _desc return actor } @@ -343,9 +349,10 @@ REPLYTIMEOUT = config.reply_timeout } */ -function guid(bits = 256) +function guid(bits) { - var guid = blob(bits, os.random) + var _bits = bits == null ? 256 : bits + var guid = blob(_bits, os.random) stone(guid) return text(guid,'h') } @@ -427,13 +434,16 @@ $_.portal = function(fn, port) { } function handle_host(e) { + var queue = null + var data = null + if (e.type == "connect") { log.system(`connected a new peer: ${e.peer.address}:${e.peer.port}`) peers[`${e.peer.address}:${e.peer.port}`] = e.peer - var queue = peer_queue.get(e.peer) + queue = peer_queue.get(e.peer) if (queue) { arrfor(queue, (msg, index) => e.peer.send(nota.encode(msg))) - log.system(`sent ${msg} out of queue`) + log.system(`sent queue out of queue`) peer_queue.delete(e.peer) } } else if (e.type == "disconnect") { @@ -443,27 +453,28 @@ function handle_host(e) { }) log.system('portal got disconnect from ' + e.peer.address + ":" + e.peer.port) } else if (e.type == "receive") { - var data = nota.decode(e.data) + data = nota.decode(e.data) if (data.replycc && !data.replycc.address) { data.replycc[ACTORDATA].address = e.peer.address data.replycc[ACTORDATA].port = e.peer.port } - function populate_actor_addresses(obj) { - if (!is_object(obj)) return - if (obj[ACTORDATA] && !obj[ACTORDATA].address) { - obj[ACTORDATA].address = e.peer.address - obj[ACTORDATA].port = e.peer.port - } - arrfor(array(obj), function(key, index) { - if (key in obj) - populate_actor_addresses(obj[key]) - }) - } - if (data.data) populate_actor_addresses(data.data) + if (data.data) populate_actor_addresses(data.data, e) turn(data) } } +function populate_actor_addresses(obj, e) { + if (!is_object(obj)) return + if (obj[ACTORDATA] && !obj[ACTORDATA].address) { + obj[ACTORDATA].address = e.peer.address + obj[ACTORDATA].port = e.peer.port + } + arrfor(array(obj), function(key, index) { + if (key in obj) + populate_actor_addresses(obj[key], e) + }) +} + // takes a callback function, an actor object, and a configuration record for getting information about the status of a connection to the actor. The configuration record is used to request the sort of information that needs to be communicated. This can include latency, bandwidth, activity, congestion, cost, partitions. The callback is given a record containing the requested information. $_.contact = function(callback, record) { send(create_actor(record), record, callback) @@ -512,12 +523,13 @@ $_.unneeded = function unneeded(fn, seconds) { } // schedules the invocation of a function after a specified amount of time. -$_.delay = function delay(fn, seconds = 0) { +$_.delay = function delay(fn, seconds) { + var _seconds = seconds == null ? 0 : seconds function delay_turn() { fn() send_messages() } - var id = actor_mod.delay(delay_turn, seconds) + var id = actor_mod.delay(delay_turn, _seconds) return function() { actor_mod.removetimer(id) } } @@ -542,6 +554,9 @@ function actor_send_immediate(actor, send) { } function actor_send(actor, message) { + var wota_blob = null + var peer = null + if (actor[HEADER] && !actor[HEADER].replycc) // attempting to respond to a message but sender is not expecting; silently drop return @@ -560,22 +575,21 @@ function actor_send(actor, message) { if (receive_fn) receive_fn(message.data) return } - + // message to actor in same flock if (actor[ACTORDATA].id && actor_mod.mailbox_exist(actor[ACTORDATA].id)) { - var wota_blob = wota.encode(message) -// log.console(`sending wota blob of ${length(wota_blob)/8} bytes`) + wota_blob = wota.encode(message) actor_mod.mailbox_push(actor[ACTORDATA].id, wota_blob) return } - + if (actor[ACTORDATA].address) { if (actor[ACTORDATA].id) message.target = actor[ACTORDATA].id else message.type = "contact" - - var peer = peers[actor[ACTORDATA].address + ":" + actor[ACTORDATA].port] + + peer = peers[actor[ACTORDATA].address + ":" + actor[ACTORDATA].port] if (!peer) { if (!portal) { log.system(`creating a contactor ...`) @@ -619,6 +633,11 @@ function send_messages() { var replies = {} function send(actor, message, reply) { + var send_msg = null + var target = null + var header = null + var id = null + if (!is_object(actor)) { log.error(`Must send to an actor object. Provided: ${actor}`) disrupt @@ -628,11 +647,11 @@ function send(actor, message, reply) { log.error('Message must be an object') disrupt } - var send_msg = {type:"user", data: message} - var target = actor + send_msg = {type:"user", data: message} + target = actor if (actor[HEADER] && actor[HEADER].replycc) { - var header = actor[HEADER] + header = actor[HEADER] if (!header.replycc || !is_actor(header.replycc)) { log.error(`Supplied actor had a return, but it's not a valid actor! ${actor[HEADER]}`) disrupt @@ -643,7 +662,7 @@ function send(actor, message, reply) { } if (reply) { - var id = guid() + id = guid() replies[id] = reply $_.delay(_ => { if (replies[id]) { @@ -728,18 +747,21 @@ function handle_actor_disconnect(id) { function handle_sysym(msg) { - var from + var from = null + var greeter = null + var letter2 = null + if (msg.kind == 'stop') { actor_die("got stop message") } else if (msg.kind == 'underling') { from = msg.from - var greeter = greeters[from[ACTORDATA].id] + greeter = greeters[from[ACTORDATA].id] if (greeter) greeter(msg.message) if (msg.message.type == 'disrupt') delete underlings[from[ACTORDATA].id] } else if (msg.kind == 'contact') { if (portal_fn) { - var letter2 = msg.data + letter2 = msg.data letter2[HEADER] = msg delete msg.data portal_fn(letter2) @@ -756,13 +778,16 @@ function handle_sysym(msg) } function handle_message(msg) { + var letter = null + var fn = null + if (msg[SYSYM]) { handle_sysym(msg[SYSYM], msg.from) return } if (msg.type == "user") { - var letter = msg.data // what the sender really sent + letter = msg.data // what the sender really sent _ObjectDefineProperty(letter, HEADER, { value: msg, enumerable: false }) @@ -771,7 +796,7 @@ function handle_message(msg) { }) if (msg.return) { - var fn = replies[msg.return] + fn = replies[msg.return] if (fn) fn(letter) delete replies[msg.return] return @@ -801,14 +826,16 @@ var package = use_core('package') // Find the .ce file var prog_path = prog + ".ce" +var pkg_dir = null +var core_dir = null if (!fd.is_file(prog_path)) { - var pkg_dir = package.find_package_dir(prog_path) + pkg_dir = package.find_package_dir(prog_path) if (pkg_dir) prog_path = pkg_dir + '/' + prog + '.ce' } if (!fd.is_file(prog_path)) { // Check core packages - var core_dir = core_path + core_dir = core_path prog_path = core_dir + '/' + prog + '.ce' } if (!fd.is_file(prog_path)) { @@ -824,9 +851,11 @@ $_.clock(_ => { var env = {} arrfor(array(runtime_env), function(k) { env[k] = runtime_env[k] }) var _ki = 0 + var inj = null + var key = null while (_ki < length(inject)) { - var inj = inject[_ki] - var key = inj + inj = inject[_ki] + key = inj if (key && key[0] == '$') key = text(key, 1) if (key == 'fd') env['$fd'] = fd else env['$' + key] = $_[key] diff --git a/internal/engine.mach b/internal/engine.mach new file mode 100644 index 0000000000000000000000000000000000000000..e740337fdeb5f513ba81a37ceff3ae70a8eb3d28 GIT binary patch literal 22470 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.val)); JS_SetPropertyStr(ctx, hidden_env, "json", js_json_use(ctx));