@naanlang/naan 1.4.0 → 1.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE.md +1 -1
- package/README.md +1 -1
- package/bin/index.js +25 -15
- package/dist/naan.min.js +5 -5
- package/frameworks/browser/sworker.js +23 -23
- package/frameworks/browser/terminals.nlg +1 -1
- package/frameworks/client/psm_client.nlg +2 -0
- package/frameworks/client/relaycon.nlg +1 -1
- package/frameworks/common/common.nlg +5 -2
- package/frameworks/node/filesystem.nlg +5 -4
- package/frameworks/node/psm_server.nlg +1 -1
- package/frameworks/node/shell.nlg +134 -0
- package/frameworks/node/worker.nlg +1 -1
- package/frameworks/project/build.nlg +1 -1
- package/frameworks/project/projects.nlg +1 -1
- package/frameworks/running/debugnub.nlg +102 -12
- package/frameworks/running/debugutil.nlg +30 -13
- package/frameworks/running/running.nlg +2 -2
- package/frameworks/running/sourcecode.nlg +3 -1
- package/frameworks/storage/dbt_pouch.nlg +29 -16
- package/frameworks/storage/file_manager.nlg +1 -1
- package/frameworks/storage/psm_dbtables.nlg +21 -22
- package/frameworks/storage/resources.nlg +12 -4
- package/frameworks/storage/storage.nlg +2 -2
- package/lib/browser/env_web.js +6 -6
- package/lib/core/naanlib.js +5 -5
- package/package.json +1 -1
- package/plugins/gitClient/gitClient.nlg +3 -3
- package/plugins/openSearch/openSearch.nlg +2 -2
- package/plugins/serviceAws/psm_aws.nlg +4 -2
- package/plugins/serviceAws/serviceAws.nlg +1 -1
- package/plugins/serviceGC/gc_api.nlg +4 -4
- package/plugins/serviceGitHub/serviceGitHub.nlg +1 -1
- package/plugins/serviceGitLab/psm_gitlab.nlg +1 -1
- package/plugins/serviceGitLab/serviceGitLab.nlg +1 -1
- package/test/harness.nlg +9 -9
- package/test/test_01_core.nlg +24 -2
- package/test/test_02_context.nlg +1 -1
- package/plugins/serviceGC/russian_trusted_root_ca_pem.crt +0 -33
|
@@ -36,7 +36,7 @@
|
|
|
36
36
|
*
|
|
37
37
|
*/
|
|
38
38
|
|
|
39
|
-
var CurrentCacheName = "Naanlang-1.4.
|
|
39
|
+
var CurrentCacheName = "Naanlang-1.4.1+1";
|
|
40
40
|
|
|
41
41
|
|
|
42
42
|
//
|
|
@@ -92,18 +92,18 @@ var terminated; // flag that this service worker
|
|
|
92
92
|
var pubVersion = event.data.hereIsMyVersion;
|
|
93
93
|
var sourceId = event.source.id; // client id of sender of message
|
|
94
94
|
msgPorts[sourceId] = msgport;
|
|
95
|
-
console.log("[1.4.
|
|
96
|
-
if (pubVersion != "1.4.
|
|
95
|
+
console.log("[1.4.1+1] received new msgport for", sourceId, pubID, "-", pubVersion);
|
|
96
|
+
if (pubVersion != "1.4.1+1") {
|
|
97
97
|
if (upgradeMsgPorts) { // if not activated
|
|
98
|
-
console.log("[1.4.
|
|
98
|
+
console.log("[1.4.1+1] update pending for", sourceId);
|
|
99
99
|
upgradeMsgPorts[sourceId] = msgport;
|
|
100
100
|
}
|
|
101
101
|
else {
|
|
102
102
|
msgport.postMessage({ // notify new version available
|
|
103
103
|
id: "upgrade",
|
|
104
|
-
version: "1.4.
|
|
104
|
+
version: "1.4.1+1"
|
|
105
105
|
});
|
|
106
|
-
console.log("[1.4.
|
|
106
|
+
console.log("[1.4.1+1] update sent for:", sourceId);
|
|
107
107
|
}
|
|
108
108
|
}
|
|
109
109
|
Reaper(); // clean up obsolete info
|
|
@@ -134,10 +134,10 @@ var terminated; // flag that this service worker
|
|
|
134
134
|
msgport.onmessage = function(msg) {
|
|
135
135
|
msg = msg.data;
|
|
136
136
|
if (msg.id == "skipWaiting") { // try to activate this SW now
|
|
137
|
-
console.log("[1.4.
|
|
137
|
+
console.log("[1.4.1+1] attempting skipWaiting");
|
|
138
138
|
self.skipWaiting();
|
|
139
139
|
} else if (msg.id == "terminate") { // termiante this SW now
|
|
140
|
-
console.log("[1.4.
|
|
140
|
+
console.log("[1.4.1+1] terminated");
|
|
141
141
|
terminate();
|
|
142
142
|
} else if (msg.id == "abortURL") { // abort an I/O transaction
|
|
143
143
|
var href = new URL(msg.url).href;
|
|
@@ -150,7 +150,7 @@ var terminated; // flag that this service worker
|
|
|
150
150
|
} else if (msg.id == "response") // response from fetch request
|
|
151
151
|
processResponse(msg);
|
|
152
152
|
else if (msg.id == "text") // just log some text
|
|
153
|
-
console.log("[1.4.
|
|
153
|
+
console.log("[1.4.1+1] msg received:", msg.text);
|
|
154
154
|
};
|
|
155
155
|
|
|
156
156
|
// send text to IDE log
|
|
@@ -161,7 +161,7 @@ var terminated; // flag that this service worker
|
|
|
161
161
|
// don't clutter the log
|
|
162
162
|
msgport.postMessage({
|
|
163
163
|
id: "text",
|
|
164
|
-
text: "port received by 1.4.
|
|
164
|
+
text: "port received by 1.4.1+1",
|
|
165
165
|
});
|
|
166
166
|
*/
|
|
167
167
|
if (--pending === 0)
|
|
@@ -178,7 +178,7 @@ var terminated; // flag that this service worker
|
|
|
178
178
|
includeUncontrolled: true
|
|
179
179
|
}).then(function(clientList) {
|
|
180
180
|
clientList.every(function(client) {
|
|
181
|
-
console.log("[1.4.
|
|
181
|
+
console.log("[1.4.1+1] requesting new msgport for", client.id);
|
|
182
182
|
++pending;
|
|
183
183
|
client.postMessage({ // tell client(s) we need this fetch source
|
|
184
184
|
msg: "Naan_need_fetch_port",
|
|
@@ -224,12 +224,12 @@ function Reaper() {
|
|
|
224
224
|
clients[clientList[clidex].id] = clientList[clidex];
|
|
225
225
|
for (var sourceId in msgPorts)
|
|
226
226
|
if (!clients[sourceId]) {
|
|
227
|
-
console.log("[1.4.
|
|
227
|
+
console.log("[1.4.1+1] source gone:", sourceId);
|
|
228
228
|
delete msgPorts[sourceId]; // no longer a source
|
|
229
229
|
}
|
|
230
230
|
for (var clientId in fetchPorts)
|
|
231
231
|
if (!clients[clientId]) {
|
|
232
|
-
console.log("[1.4.
|
|
232
|
+
console.log("[1.4.1+1] client gone:", clientId);
|
|
233
233
|
delete fetchPorts[clientId]; // no longer a client
|
|
234
234
|
}
|
|
235
235
|
for (var fqdex = 0; fqdex < fetchQueue.length; ++fqdex) {
|
|
@@ -263,16 +263,16 @@ function ClearCaches() {
|
|
|
263
263
|
return (Promise.all(
|
|
264
264
|
cacheNames.map(function(cacheName) {
|
|
265
265
|
if (cacheName != CurrentCacheName) {
|
|
266
|
-
console.log('[1.4.
|
|
266
|
+
console.log('[1.4.1+1] deleting old cache:', cacheName);
|
|
267
267
|
return (caches.delete(cacheName));
|
|
268
268
|
}
|
|
269
269
|
})
|
|
270
270
|
));
|
|
271
271
|
}).then(function() { // claim all clients
|
|
272
|
-
console.log('[1.4.
|
|
272
|
+
console.log('[1.4.1+1] claiming clients');
|
|
273
273
|
return (self.clients.claim());
|
|
274
274
|
}).then(function() {
|
|
275
|
-
console.log('[1.4.
|
|
275
|
+
console.log('[1.4.1+1] clients claimed');
|
|
276
276
|
return (Promise.resolve(true));
|
|
277
277
|
});
|
|
278
278
|
return (promise);
|
|
@@ -315,7 +315,7 @@ function GetClientResponse(event, urlpath) {
|
|
|
315
315
|
msgport.postMessage({
|
|
316
316
|
id: "fetch",
|
|
317
317
|
seq: seqno,
|
|
318
|
-
version: "1.4.
|
|
318
|
+
version: "1.4.1+1",
|
|
319
319
|
request: {
|
|
320
320
|
method: event.request.method,
|
|
321
321
|
url: event.request.url
|
|
@@ -363,7 +363,7 @@ function GetClientResponse(event, urlpath) {
|
|
|
363
363
|
*/
|
|
364
364
|
|
|
365
365
|
self.addEventListener('install', function(event) {
|
|
366
|
-
console.log("[1.4.
|
|
366
|
+
console.log("[1.4.1+1] install");
|
|
367
367
|
self.skipWaiting();
|
|
368
368
|
});
|
|
369
369
|
|
|
@@ -376,20 +376,20 @@ self.addEventListener('install', function(event) {
|
|
|
376
376
|
*/
|
|
377
377
|
|
|
378
378
|
self.addEventListener('activate', function(event) {
|
|
379
|
-
console.log("[1.4.
|
|
379
|
+
console.log("[1.4.1+1] activate");
|
|
380
380
|
self.clients.matchAll({ // for debugging, list controlled clients
|
|
381
381
|
includeUncontrolled: true
|
|
382
382
|
}).then(function(clientList) {
|
|
383
383
|
var urls = clientList.map(function(client) {
|
|
384
384
|
return (client.url);
|
|
385
385
|
});
|
|
386
|
-
console.log('[1.4.
|
|
386
|
+
console.log('[1.4.1+1] matching clients:', urls.join(', '));
|
|
387
387
|
});
|
|
388
388
|
var promise = ClearCaches().then(function() {
|
|
389
389
|
for (var sourceId in upgradeMsgPorts) {
|
|
390
390
|
upgradeMsgPorts[sourceId].postMessage({ // notify new version available
|
|
391
391
|
id: "upgrade",
|
|
392
|
-
version: "1.4.
|
|
392
|
+
version: "1.4.1+1"
|
|
393
393
|
});
|
|
394
394
|
}
|
|
395
395
|
upgradeMsgPorts = false;
|
|
@@ -421,7 +421,7 @@ self.addEventListener('fetch', function(event) {
|
|
|
421
421
|
var promise;
|
|
422
422
|
var url = new URL(request.url);
|
|
423
423
|
var nocache = request.method != "GET"
|
|
424
|
-
|| url.search.length !== 0 && url.searchParams.get("naanver") !== "
|
|
424
|
+
|| url.search.length !== 0 && url.searchParams.get("naanver") !== "348dfbc247edf982d7b9f50b51d55de4"
|
|
425
425
|
|| request.headers.get('range');
|
|
426
426
|
if (url.pathname.startsWith("/run/")) {
|
|
427
427
|
nocache = true;
|
|
@@ -455,7 +455,7 @@ self.addEventListener('fetch', function(event) {
|
|
|
455
455
|
statusText: "Request Cancelled"
|
|
456
456
|
}));
|
|
457
457
|
}
|
|
458
|
-
console.log("[1.4.
|
|
458
|
+
console.log("[1.4.1+1] fetch failed", request.url, e);
|
|
459
459
|
return (new Response(undefined, {
|
|
460
460
|
status: 404,
|
|
461
461
|
statusText: "Fetch Failed"
|
|
@@ -750,7 +750,7 @@ closure WorkerToMain(local nideRunning, track) {
|
|
|
750
750
|
error = Error("WorkerToMain only available in browser workers")
|
|
751
751
|
return (list(error))
|
|
752
752
|
}
|
|
753
|
-
nideRunning = require("frameworks/running/executors.nlg")
|
|
753
|
+
nideRunning = require("naanlib:frameworks/running/executors.nlg")
|
|
754
754
|
track = nideRunning.ExecutorTracker()
|
|
755
755
|
track.register(mainProxy, "proxy")
|
|
756
756
|
track.spawn("proxy") // returns result tuple
|
|
@@ -625,6 +625,8 @@ closure psmcFsConnector(psm, api, local connClassID, connector, watch) {
|
|
|
625
625
|
//
|
|
626
626
|
// Connect to the specified service.
|
|
627
627
|
connector.connect = function connect(resID, service, args, local error, creds, api, rootpath) {
|
|
628
|
+
if !resID || args && !tuple(args)
|
|
629
|
+
return (list(Error("invalid arguments")))
|
|
628
630
|
`(error, creds) = connector.access(resID)
|
|
629
631
|
if !error {
|
|
630
632
|
if creds == "HostFS"
|
|
@@ -85,7 +85,7 @@ closure RelayCon(host, secret, options, local relay, nlregex)
|
|
|
85
85
|
})
|
|
86
86
|
result = relay.wscon.connect()
|
|
87
87
|
if !result.0
|
|
88
|
-
sendControl("spawn", { name:
|
|
88
|
+
sendControl("spawn", { name: options.name }) // ensure worker is connected
|
|
89
89
|
else if options.debug
|
|
90
90
|
ErrorDebuglog("WebSocket connect failed:", result.0)
|
|
91
91
|
result
|
|
@@ -247,7 +247,9 @@ macro LoadComponentOnDemand(functionKeys, componentPath, local modobj, key) {
|
|
|
247
247
|
componentPath = eval(componentPath)
|
|
248
248
|
if name(functionKeys)
|
|
249
249
|
functionKeys = list(functionKeys)
|
|
250
|
-
for key in functionKeys
|
|
250
|
+
for key in functionKeys {
|
|
251
|
+
if modobj.exports[key]
|
|
252
|
+
continue // already defined
|
|
251
253
|
closure (key, path, local exproc) {
|
|
252
254
|
function loadComponent args { // called when exported function first called
|
|
253
255
|
exproc = require(path)[key]
|
|
@@ -257,6 +259,7 @@ macro LoadComponentOnDemand(functionKeys, componentPath, local modobj, key) {
|
|
|
257
259
|
}
|
|
258
260
|
modobj.exports[key] = loadComponent
|
|
259
261
|
} (key, componentPath)
|
|
262
|
+
}
|
|
260
263
|
true
|
|
261
264
|
};
|
|
262
265
|
|
|
@@ -274,7 +277,7 @@ macro LoadComponentOnDemand(functionKeys, componentPath, local modobj, key) {
|
|
|
274
277
|
* LiveImport() function to a module's exports.
|
|
275
278
|
*
|
|
276
279
|
* To use LiveImport, call from the importing module as follows:
|
|
277
|
-
* require("frameworks/common/common.nlg").LiveImport(<fixproc>);
|
|
280
|
+
* require("naanlib:frameworks/common/common.nlg").LiveImport(<fixproc>);
|
|
278
281
|
* The optional <fixproc> is called after the imports in case the foreign module wants to fix up
|
|
279
282
|
* anything after the import:
|
|
280
283
|
* fixproc(exporterMod);
|
|
@@ -1137,6 +1137,11 @@ closure Filesystem(rootpath, local files, badCreatePathRegEx) {
|
|
|
1137
1137
|
})
|
|
1138
1138
|
spawn.on("close", function(code) {
|
|
1139
1139
|
output.exitCode = code // zero on success; null on killed
|
|
1140
|
+
completed(false, output)
|
|
1141
|
+
})
|
|
1142
|
+
spawn.on("exit", function(code, signal) {
|
|
1143
|
+
output.exitCode = code // if exited
|
|
1144
|
+
output.signalName = signal // if terminated
|
|
1140
1145
|
})
|
|
1141
1146
|
spawn.stderr.on("error", function(err) {
|
|
1142
1147
|
completed(Error("stderr stream failed:", err))
|
|
@@ -1155,8 +1160,6 @@ closure Filesystem(rootpath, local files, badCreatePathRegEx) {
|
|
|
1155
1160
|
call(options.errproc, output)
|
|
1156
1161
|
if linerOut
|
|
1157
1162
|
linerErr = false // let end-of-out do the completion
|
|
1158
|
-
else
|
|
1159
|
-
completed(false, output)
|
|
1160
1163
|
})
|
|
1161
1164
|
linerErr.on("readable", function (local line) {
|
|
1162
1165
|
if options.errproc
|
|
@@ -1179,8 +1182,6 @@ closure Filesystem(rootpath, local files, badCreatePathRegEx) {
|
|
|
1179
1182
|
call(options.outproc)
|
|
1180
1183
|
if linerErr
|
|
1181
1184
|
linerOut = false // let end-of-err do the completion
|
|
1182
|
-
else
|
|
1183
|
-
completed(false, output)
|
|
1184
1185
|
})
|
|
1185
1186
|
linerOut.on("readable", function (local line) {
|
|
1186
1187
|
if options.outproc
|
|
@@ -525,7 +525,7 @@ function MakeServerPSM(api, name, local importPSM, error, path, psm) {
|
|
|
525
525
|
if !error {
|
|
526
526
|
App.psm = psm
|
|
527
527
|
psmsFsConnector(App.psm, api)
|
|
528
|
-
require("frameworks/storage/dbt_pouch.nlg").DbConnector(App.psm) // Pouch databases as filesystems
|
|
528
|
+
require("naanlib:frameworks/storage/dbt_pouch.nlg").DbConnector(App.psm) // Pouch databases as filesystems
|
|
529
529
|
} else
|
|
530
530
|
ErrorDebuglog("Cannot create PSM", error)
|
|
531
531
|
App.psm
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* shell.nlg
|
|
3
|
+
* Naanlib/frameworks/node
|
|
4
|
+
*
|
|
5
|
+
* Shell access and utilities for the host OS.
|
|
6
|
+
*
|
|
7
|
+
* column positioning: // // !
|
|
8
|
+
*
|
|
9
|
+
* Copyright (c) 2024 by Richard C. Zulch
|
|
10
|
+
*
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
/*
|
|
15
|
+
* ShellConnect
|
|
16
|
+
*
|
|
17
|
+
* Executing this installs itself in the current dialect to provide a REPL shell escape, returning a
|
|
18
|
+
* standard result tuple. This sends lines starting with ! to the shell with "bash -c". The result is
|
|
19
|
+
* output as text and also assigned to the $$ variable in the active namespace.
|
|
20
|
+
*
|
|
21
|
+
* Options:
|
|
22
|
+
* {
|
|
23
|
+
* fs: <filesystem> // optional: the filesystem object to use
|
|
24
|
+
* cwd: <string> // optional: Current Working Directory
|
|
25
|
+
* derive: <string> // optional: dialect to derive from, or "" for no !
|
|
26
|
+
* }
|
|
27
|
+
*
|
|
28
|
+
*/
|
|
29
|
+
|
|
30
|
+
closure ShellConnect(options, local shob, error, fs, xparser, shelly) {
|
|
31
|
+
global(js, compress)
|
|
32
|
+
shob = new(object, this)
|
|
33
|
+
|
|
34
|
+
// readline
|
|
35
|
+
// read one line of text from the source
|
|
36
|
+
function readline(source, local cc, output) {
|
|
37
|
+
output = ""
|
|
38
|
+
while cc = source.readchar() {
|
|
39
|
+
output = output.concat(cc)
|
|
40
|
+
if cc == "\n"
|
|
41
|
+
break }
|
|
42
|
+
output
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
// exec
|
|
46
|
+
//
|
|
47
|
+
// Execute a shell command with optional current-working-directory.
|
|
48
|
+
//
|
|
49
|
+
shob.exec = closure exec(cmd, args, cwd, local pending, report, xlparams) {
|
|
50
|
+
pending = new(nonce)
|
|
51
|
+
report = {
|
|
52
|
+
stdout: []
|
|
53
|
+
stderr: []
|
|
54
|
+
}
|
|
55
|
+
xlparams = {
|
|
56
|
+
cmdargs: args
|
|
57
|
+
outproc: function(output, liner, kill, local line) {
|
|
58
|
+
while line = liner.read() {
|
|
59
|
+
report.stdout.push(line)
|
|
60
|
+
printline("\x1b[33m${line}\x1b[0m") // amber for stdout
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
errproc: function(output, liner, kill, local line) {
|
|
64
|
+
while line = liner.read() {
|
|
65
|
+
report.stderr.push(line)
|
|
66
|
+
printline("\x1b[36m${line}\x1b[0m") // cyan for stderr
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
if cwd
|
|
71
|
+
xlparams.execops = { cwd: cwd }
|
|
72
|
+
else if options.cwd
|
|
73
|
+
xlparams.execops = { cwd: options.cwd }
|
|
74
|
+
fs.execLines(cmd, xlparams, function(error, result) {
|
|
75
|
+
evalactive(list(`assign, `(compress, "$$"), report)) // assign to $$ in active namespace
|
|
76
|
+
pending.signal(list(error, merge(result, report)))
|
|
77
|
+
})
|
|
78
|
+
pending.wait()
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
// shellparser
|
|
82
|
+
// intercept command-line parsing and look for a !shell escape
|
|
83
|
+
function shellparser(source, grammar, operators, local token) {
|
|
84
|
+
token = source.tokenread()
|
|
85
|
+
if token.atom == `! {
|
|
86
|
+
source.tokenlast(true) // "consume" the ! token
|
|
87
|
+
text = readline(source)
|
|
88
|
+
source.tokenpush({ // don't show any output
|
|
89
|
+
atom: `;;
|
|
90
|
+
loc: tuple(0, text.length)
|
|
91
|
+
})
|
|
92
|
+
exec("bash", ["-c", text], js.d) // default directory: js.d
|
|
93
|
+
}
|
|
94
|
+
else {
|
|
95
|
+
source.tokenpush(token)
|
|
96
|
+
xparser(source, grammar, operators)
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
if options.fs
|
|
101
|
+
fs = options.fs
|
|
102
|
+
else
|
|
103
|
+
`(error, fs) = Filesystem("") // error not possible
|
|
104
|
+
if options.derive != "" { // install hook
|
|
105
|
+
if string(options.derive)
|
|
106
|
+
shelly = Dialect.derive(options.derive)
|
|
107
|
+
else
|
|
108
|
+
shelly = Dialect
|
|
109
|
+
xparser = shelly.parser
|
|
110
|
+
shelly.parser = shellparser
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
// finis
|
|
114
|
+
shob
|
|
115
|
+
};
|
|
116
|
+
|
|
117
|
+
|
|
118
|
+
/*
|
|
119
|
+
* shInit
|
|
120
|
+
*
|
|
121
|
+
* Initialize the node module.
|
|
122
|
+
*
|
|
123
|
+
*
|
|
124
|
+
*/
|
|
125
|
+
|
|
126
|
+
function shInit(local manifest) {
|
|
127
|
+
manifest = `(ShellConnect, shInit)
|
|
128
|
+
|
|
129
|
+
Naan.module.build(module.id, "shell", function(modobj, compobj) {
|
|
130
|
+
require("./filesystem.nlg")
|
|
131
|
+
compobj.manifest = manifest
|
|
132
|
+
modobj.exports.ShellConnect = ShellConnect
|
|
133
|
+
})
|
|
134
|
+
} ();
|
|
@@ -312,7 +312,7 @@ closure workThread(workco, workerID, startup, guid
|
|
|
312
312
|
// create our worker thread
|
|
313
313
|
|
|
314
314
|
// options = { execArgv: ["--inspect-brk"] } // uncomment for NodeJS debugging
|
|
315
|
-
worker.thread = xnew(threads.Worker, JSpath.resolve(js.d, "node_worker.js"), options)
|
|
315
|
+
worker.thread = xnew(threads.Worker, JSpath.resolve(js.d, "lib/node_worker.js"), options)
|
|
316
316
|
subChannel = xnew(threads.MessageChannel)
|
|
317
317
|
worker.thread.postMessage({ hereIsYourPort: subChannel.port1 }, [subChannel.port1])
|
|
318
318
|
worker.msgport = subChannel.port2
|
|
@@ -368,7 +368,7 @@ closure Builder(rules, operation, fs, srcpath, destpath, track, local build, gro
|
|
|
368
368
|
// for each file. The result is a standard (error, data) tuple.
|
|
369
369
|
|
|
370
370
|
function zip1(files, options, local libzip, ziparc, file, result) {
|
|
371
|
-
libzip = require("frameworks/project/jszip.nlg").JSZip()
|
|
371
|
+
libzip = require("naanlib:frameworks/project/jszip.nlg").JSZip()
|
|
372
372
|
if !libzip
|
|
373
373
|
return (list(Error("Build requires zip but it's not available")))
|
|
374
374
|
ziparc = libzip.create()
|
|
@@ -296,7 +296,7 @@ closure projConnector(projman, projtype, local connector, watch) {
|
|
|
296
296
|
*
|
|
297
297
|
* Nide.proj/
|
|
298
298
|
* nide_cliser.cfg - JSON definition of the project (see below)
|
|
299
|
-
* NaanIDE_version.txt - [default] substitution file defining 1.4.
|
|
299
|
+
* NaanIDE_version.txt - [default] substitution file defining 1.4.1+1 etc.
|
|
300
300
|
* NaanIDE_version_builds.txt - [default] contains current build number as decimal string
|
|
301
301
|
* build/ - [optional] default build output location
|
|
302
302
|
* NaanIDE.lic - [optional] defines Zulch Laboratories, Inc. and other license info
|
|
@@ -33,6 +33,9 @@ closure DebugNub(local nub, debug, paused) {
|
|
|
33
33
|
nub.codemgr = CodeManager()
|
|
34
34
|
nub.exenable = true
|
|
35
35
|
nub.watches = []
|
|
36
|
+
nub.contIDs = new(weakmap)
|
|
37
|
+
nub.stacks = { }
|
|
38
|
+
nub.usage = { }
|
|
36
39
|
|
|
37
40
|
// debugDepth
|
|
38
41
|
// Return the recursive debugging depth as an integer.
|
|
@@ -80,7 +83,7 @@ closure DebugNub(local nub, debug, paused) {
|
|
|
80
83
|
for frame in nub.frames
|
|
81
84
|
if procedure(frame)
|
|
82
85
|
break
|
|
83
|
-
`(procdef, task) =
|
|
86
|
+
`(procdef, task) = debug.frameProcTask(frame)
|
|
84
87
|
}
|
|
85
88
|
if !procdef
|
|
86
89
|
return (false)
|
|
@@ -396,14 +399,75 @@ closure DebugNub(local nub, debug, paused) {
|
|
|
396
399
|
output.push(breakInfo(bpid))
|
|
397
400
|
output
|
|
398
401
|
}
|
|
402
|
+
|
|
403
|
+
// procLoc
|
|
404
|
+
//
|
|
405
|
+
// Get the location of a procdef.
|
|
406
|
+
|
|
407
|
+
nub.procLoc = function procLoc(procdef, task, local comp, position) {
|
|
408
|
+
if !task
|
|
409
|
+
task = rrrest(procdef)
|
|
410
|
+
comp = nub.codemgr.procComponent(procdef)
|
|
411
|
+
position = comp.textpos(procdef, task)
|
|
412
|
+
{
|
|
413
|
+
modname: comp.modname
|
|
414
|
+
compname: comp.compname
|
|
415
|
+
first: position.first
|
|
416
|
+
last: position.last
|
|
417
|
+
line: position.line
|
|
418
|
+
}
|
|
419
|
+
}
|
|
420
|
+
|
|
421
|
+
// getContID
|
|
422
|
+
//
|
|
423
|
+
// Get the contID for a continuation.
|
|
424
|
+
|
|
425
|
+
nub.getContID = function getContID(cont, local contID, frames) {
|
|
426
|
+
contID = nub.contIDs[cont]
|
|
427
|
+
if !contID
|
|
428
|
+
nub.contIDs[cont] = contID = UUID()
|
|
429
|
+
frames = cont.stacktrace().toarray
|
|
430
|
+
if frames.slice(-1).0 == `interrupt
|
|
431
|
+
frames.pop()
|
|
432
|
+
nub.stacks[contID] = frames
|
|
433
|
+
contID
|
|
434
|
+
}
|
|
435
|
+
|
|
436
|
+
// contGC
|
|
437
|
+
//
|
|
438
|
+
// Remove any continuations that are not in the specified array.
|
|
439
|
+
|
|
440
|
+
nub.contGC = function contGC(contIDs, local contID) {
|
|
441
|
+
contIDs = contIDs.concat(nub.usage.*.toarray) // keep preserved ids
|
|
442
|
+
for contID in nub.stacks
|
|
443
|
+
if contIDs.indexOf(contID) < 0
|
|
444
|
+
nub.stacks[contID] = undefined
|
|
445
|
+
}
|
|
446
|
+
|
|
447
|
+
// usingContID
|
|
448
|
+
//
|
|
449
|
+
// Mark that the contID is being used.
|
|
450
|
+
//
|
|
451
|
+
nub.usingContID = function usingContID(contID, usage) {
|
|
452
|
+
if nub.usage[contID]
|
|
453
|
+
nub.usage[contID] += usage
|
|
454
|
+
else if usage > 0
|
|
455
|
+
nub.usage[contID] = usage
|
|
456
|
+
if nub.usage[contID] == 0
|
|
457
|
+
nub.usage[contID] = undefined
|
|
458
|
+
}
|
|
399
459
|
|
|
400
460
|
// callStack
|
|
401
461
|
//
|
|
402
|
-
// List our callers as of the last entry.
|
|
462
|
+
// List our callers as of the last entry in the optional frames or current debugger stack.
|
|
403
463
|
|
|
404
|
-
nub.callStack = function callStack(local output, frame, type, record) {
|
|
464
|
+
nub.callStack = function callStack(contID, local frames, output, frame, type, record) {
|
|
405
465
|
output = []
|
|
406
|
-
|
|
466
|
+
if contID
|
|
467
|
+
frames = nub.stacks[contID]
|
|
468
|
+
else
|
|
469
|
+
frames = nub.frames
|
|
470
|
+
for frame in frames {
|
|
407
471
|
record = {
|
|
408
472
|
type: frame.0.tostring // e.g. "function"
|
|
409
473
|
}
|
|
@@ -425,8 +489,12 @@ closure DebugNub(local nub, debug, paused) {
|
|
|
425
489
|
//
|
|
426
490
|
// Return the nth stack frame in the list returned by callStack above.
|
|
427
491
|
|
|
428
|
-
nub.nthFrame = function nthFrame(nth, local frame) {
|
|
429
|
-
|
|
492
|
+
nub.nthFrame = function nthFrame(nth, contID, local frames, frame) {
|
|
493
|
+
if contID
|
|
494
|
+
frames = nub.stacks[contID]
|
|
495
|
+
else
|
|
496
|
+
frames = nub.frames
|
|
497
|
+
for frame in frames
|
|
430
498
|
if procedure(frame) || frame.0.tostring == "interrupt" {
|
|
431
499
|
if nth-- == 0
|
|
432
500
|
return (frame)
|
|
@@ -469,14 +537,15 @@ closure DebugNub(local nub, debug, paused) {
|
|
|
469
537
|
|
|
470
538
|
// evalWatchesInFrame
|
|
471
539
|
//
|
|
472
|
-
// Parse and evaluate our watchpoints, optionally in the context of the nth frame
|
|
473
|
-
//
|
|
540
|
+
// Parse and evaluate our watchpoints, optionally in the context of the nth frame of the
|
|
541
|
+
// specified continuation or the current debugger stack. Each entry in the returned array is for
|
|
542
|
+
// a watchpoint, comprising a tuple: `(error, expression, evaluated).
|
|
474
543
|
|
|
475
|
-
nub.evalWatchesInFrame = function evalWatchesInFrame(nth,
|
|
544
|
+
nub.evalWatchesInFrame = function evalWatchesInFrame(nth, contID,
|
|
476
545
|
local frame, locals, ns, mod, gohome, texts, watch, exprs, error, expr)
|
|
477
546
|
{
|
|
478
547
|
if integer(nth) {
|
|
479
|
-
frame = nthFrame(nth)
|
|
548
|
+
frame = nthFrame(nth, contID)
|
|
480
549
|
locals = localist(frame)
|
|
481
550
|
ns = frame.3.1.namespace
|
|
482
551
|
if ns !== nsactive().0 {
|
|
@@ -506,8 +575,29 @@ closure DebugNub(local nub, debug, paused) {
|
|
|
506
575
|
//
|
|
507
576
|
// Return procedure and task from a frame, as a `(procdef, task) tuple.
|
|
508
577
|
|
|
509
|
-
nub.procTask = function procTask(frame) {
|
|
510
|
-
|
|
578
|
+
nub.procTask = function procTask(frame, contID, local frames, ftrav, procdef, bodydef) {
|
|
579
|
+
if contID
|
|
580
|
+
frames = new(nub.stacks[contID])
|
|
581
|
+
else
|
|
582
|
+
frames = new(debug.frames)
|
|
583
|
+
loop {
|
|
584
|
+
if frames.length == 0
|
|
585
|
+
break
|
|
586
|
+
ftrav = frames.shift()
|
|
587
|
+
if ftrav eq frame
|
|
588
|
+
frame = false // can now stop on our desired procedure
|
|
589
|
+
if procedure(ftrav) {
|
|
590
|
+
if !frame {
|
|
591
|
+
procdef = ftrav.3 // first procedure definition starting with desired frame
|
|
592
|
+
if !bodydef
|
|
593
|
+
bodydef = procdef // use procdef as body if no body frame found
|
|
594
|
+
break }
|
|
595
|
+
bodydef = false } // any previously-found body applies to wrong procedure
|
|
596
|
+
else if ftrav.0 == `body || ftrav.0 == `loop {
|
|
597
|
+
if !bodydef
|
|
598
|
+
bodydef = ftrav.2 } } // use first body found before desired procedure
|
|
599
|
+
if procdef
|
|
600
|
+
list(procdef, bodydef) // found valid location
|
|
511
601
|
}
|
|
512
602
|
|
|
513
603
|
// lastStepValue
|