greybel-interpreter 0.3.7 → 0.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/dist/context.d.ts +14 -11
- package/dist/context.js +35 -85
- package/dist/interpreter.d.ts +2 -1
- package/dist/interpreter.js +23 -9
- package/dist/operations/body.js +17 -22
- package/package.json +1 -1
package/dist/context.d.ts
CHANGED
|
@@ -1,14 +1,11 @@
|
|
|
1
1
|
import CustomMap from './custom-types/map';
|
|
2
|
-
import { Operation } from './types/operation';
|
|
3
|
-
import { Expression } from './types/expression';
|
|
4
2
|
import { Callable } from './types/custom-type';
|
|
5
|
-
import {
|
|
3
|
+
import { ASTBase } from 'greybel-core';
|
|
6
4
|
import CPS from './cps';
|
|
7
5
|
export declare enum ContextType {
|
|
8
6
|
API = "API",
|
|
9
7
|
GLOBAL = "GLOBAL",
|
|
10
8
|
FUNCTION = "FUNCTION",
|
|
11
|
-
INJECTION = "INJECTION",
|
|
12
9
|
EXTERNAL = "EXTERNAL",
|
|
13
10
|
LOOP = "LOOP",
|
|
14
11
|
MAP = "MAP",
|
|
@@ -36,16 +33,17 @@ export declare class Debugger {
|
|
|
36
33
|
getBreakpoint(operationContext: OperationContext): boolean;
|
|
37
34
|
next(): Debugger;
|
|
38
35
|
resume(): Promise<void>;
|
|
39
|
-
interact(operationContext: OperationContext, item:
|
|
40
|
-
run(code: string): Promise<void>;
|
|
36
|
+
interact(operationContext: OperationContext, item: ASTBase): void;
|
|
41
37
|
}
|
|
42
38
|
export interface OperationContextProcessState {
|
|
43
39
|
exit: boolean;
|
|
44
40
|
pending: boolean;
|
|
41
|
+
last: OperationContext | null;
|
|
45
42
|
}
|
|
46
43
|
export interface OperationContextOptions {
|
|
47
44
|
target?: string;
|
|
48
45
|
isProtected?: boolean;
|
|
46
|
+
injected?: boolean;
|
|
49
47
|
type?: ContextType;
|
|
50
48
|
state?: ContextState;
|
|
51
49
|
previous?: OperationContext;
|
|
@@ -57,27 +55,32 @@ export interface OperationContextForkOptions {
|
|
|
57
55
|
type: ContextType;
|
|
58
56
|
state: ContextState;
|
|
59
57
|
target?: string;
|
|
58
|
+
injected?: boolean;
|
|
60
59
|
}
|
|
61
60
|
export declare class OperationContext {
|
|
62
61
|
target: string;
|
|
63
|
-
|
|
62
|
+
stackItem: ASTBase | null;
|
|
64
63
|
debugger: Debugger;
|
|
65
64
|
previous: OperationContext | null;
|
|
66
65
|
type: ContextType;
|
|
67
66
|
state: ContextState;
|
|
68
67
|
scope: Scope;
|
|
69
|
-
isProtected: boolean;
|
|
70
68
|
memory: Map<string, any>;
|
|
71
69
|
cps: CPS | null;
|
|
72
70
|
processState: OperationContextProcessState;
|
|
71
|
+
isProtected: boolean;
|
|
72
|
+
injected: boolean;
|
|
73
73
|
api: Scope | null;
|
|
74
74
|
locals: Scope | null;
|
|
75
75
|
globals: Scope | null;
|
|
76
76
|
constructor(options: OperationContextOptions);
|
|
77
|
-
|
|
78
|
-
|
|
77
|
+
step(item: ASTBase): Promise<void>;
|
|
78
|
+
setLastActive(opc: OperationContext): OperationContext;
|
|
79
|
+
getLastActive(): OperationContext | null;
|
|
79
80
|
isExit(): boolean;
|
|
81
|
+
exit(): Promise<OperationContext>;
|
|
80
82
|
isPending(): boolean;
|
|
83
|
+
setPending(pending: boolean): OperationContext;
|
|
81
84
|
lookupType(validate: (type: ContextType) => boolean): Scope;
|
|
82
85
|
lookupAPI(): Scope;
|
|
83
86
|
lookupGlobals(): Scope;
|
|
@@ -89,5 +92,5 @@ export declare class OperationContext {
|
|
|
89
92
|
getCallable(path: string[]): Promise<Callable>;
|
|
90
93
|
setMemory(key: string, value: any): OperationContext;
|
|
91
94
|
getMemory(key: string): any;
|
|
92
|
-
fork({ type, state, target }: OperationContextForkOptions): OperationContext;
|
|
95
|
+
fork({ type, state, target, injected }: OperationContextForkOptions): OperationContext;
|
|
93
96
|
}
|
package/dist/context.js
CHANGED
|
@@ -14,42 +14,6 @@ var __extends = (this && this.__extends) || (function () {
|
|
|
14
14
|
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
|
|
15
15
|
};
|
|
16
16
|
})();
|
|
17
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
18
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
19
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
20
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
21
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
22
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
23
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
24
|
-
});
|
|
25
|
-
};
|
|
26
|
-
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
27
|
-
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|
28
|
-
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
29
|
-
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
30
|
-
function step(op) {
|
|
31
|
-
if (f) throw new TypeError("Generator is already executing.");
|
|
32
|
-
while (_) try {
|
|
33
|
-
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
34
|
-
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
35
|
-
switch (op[0]) {
|
|
36
|
-
case 0: case 1: t = op; break;
|
|
37
|
-
case 4: _.label++; return { value: op[1], done: false };
|
|
38
|
-
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
39
|
-
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
40
|
-
default:
|
|
41
|
-
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
42
|
-
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
43
|
-
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
44
|
-
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
45
|
-
if (t[2]) _.ops.pop();
|
|
46
|
-
_.trys.pop(); continue;
|
|
47
|
-
}
|
|
48
|
-
op = body.call(thisArg, _);
|
|
49
|
-
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
50
|
-
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
51
|
-
}
|
|
52
|
-
};
|
|
53
17
|
var __read = (this && this.__read) || function (o, n) {
|
|
54
18
|
var m = typeof Symbol === "function" && o[Symbol.iterator];
|
|
55
19
|
if (!m) return o;
|
|
@@ -81,13 +45,11 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
81
45
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
82
46
|
exports.OperationContext = exports.Debugger = exports.Scope = exports.ContextState = exports.ContextType = void 0;
|
|
83
47
|
var map_1 = __importDefault(require("./custom-types/map"));
|
|
84
|
-
var greybel_core_1 = require("greybel-core");
|
|
85
48
|
var ContextType;
|
|
86
49
|
(function (ContextType) {
|
|
87
50
|
ContextType["API"] = "API";
|
|
88
51
|
ContextType["GLOBAL"] = "GLOBAL";
|
|
89
52
|
ContextType["FUNCTION"] = "FUNCTION";
|
|
90
|
-
ContextType["INJECTION"] = "INJECTION";
|
|
91
53
|
ContextType["EXTERNAL"] = "EXTERNAL";
|
|
92
54
|
ContextType["LOOP"] = "LOOP";
|
|
93
55
|
ContextType["MAP"] = "MAP";
|
|
@@ -218,7 +180,7 @@ var Debugger = /** @class */ (function () {
|
|
|
218
180
|
return me;
|
|
219
181
|
};
|
|
220
182
|
Debugger.prototype.getBreakpoint = function (operationContext) {
|
|
221
|
-
return operationContext.
|
|
183
|
+
return !operationContext.injected && this.breakpoint;
|
|
222
184
|
};
|
|
223
185
|
Debugger.prototype.next = function () {
|
|
224
186
|
var me = this;
|
|
@@ -250,41 +212,8 @@ var Debugger = /** @class */ (function () {
|
|
|
250
212
|
var me = this;
|
|
251
213
|
console.warn("Debugger is not setup.");
|
|
252
214
|
console.info(operationContext);
|
|
253
|
-
me.lastContext = operationContext;
|
|
254
215
|
me.breakpoint = false;
|
|
255
216
|
};
|
|
256
|
-
Debugger.prototype.run = function (code) {
|
|
257
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
258
|
-
var me, parser, chunk, item, context, err_1;
|
|
259
|
-
return __generator(this, function (_a) {
|
|
260
|
-
switch (_a.label) {
|
|
261
|
-
case 0:
|
|
262
|
-
me = this;
|
|
263
|
-
_a.label = 1;
|
|
264
|
-
case 1:
|
|
265
|
-
_a.trys.push([1, 4, , 5]);
|
|
266
|
-
parser = new greybel_core_1.Parser(code);
|
|
267
|
-
chunk = parser.parseChunk();
|
|
268
|
-
return [4 /*yield*/, me.lastContext.cps.visit(chunk)];
|
|
269
|
-
case 2:
|
|
270
|
-
item = _a.sent();
|
|
271
|
-
context = me.lastContext.fork({
|
|
272
|
-
type: ContextType.INJECTION,
|
|
273
|
-
state: ContextState.TEMPORARY
|
|
274
|
-
});
|
|
275
|
-
return [4 /*yield*/, item.run(context)];
|
|
276
|
-
case 3:
|
|
277
|
-
_a.sent();
|
|
278
|
-
return [3 /*break*/, 5];
|
|
279
|
-
case 4:
|
|
280
|
-
err_1 = _a.sent();
|
|
281
|
-
console.error(err_1);
|
|
282
|
-
return [3 /*break*/, 5];
|
|
283
|
-
case 5: return [2 /*return*/];
|
|
284
|
-
}
|
|
285
|
-
});
|
|
286
|
-
});
|
|
287
|
-
};
|
|
288
217
|
return Debugger;
|
|
289
218
|
}());
|
|
290
219
|
exports.Debugger = Debugger;
|
|
@@ -292,26 +221,49 @@ var OperationContext = /** @class */ (function () {
|
|
|
292
221
|
function OperationContext(options) {
|
|
293
222
|
var me = this;
|
|
294
223
|
me.target = options.target || 'unknown';
|
|
295
|
-
me.
|
|
296
|
-
line: 0,
|
|
297
|
-
character: 0
|
|
298
|
-
};
|
|
224
|
+
me.stackItem = null;
|
|
299
225
|
me.previous = options.previous || null;
|
|
300
226
|
me.type = options.type || ContextType.API;
|
|
301
227
|
me.state = options.state || ContextState.DEFAULT;
|
|
302
228
|
me.scope = new Scope(me);
|
|
303
229
|
me.isProtected = options.isProtected || false;
|
|
230
|
+
me.injected = options.injected || false;
|
|
304
231
|
me.memory = new Map();
|
|
305
232
|
me.debugger = options.debugger || new Debugger();
|
|
306
233
|
me.cps = options.cps;
|
|
307
234
|
me.processState = options.processState || {
|
|
308
235
|
exit: false,
|
|
309
|
-
pending: false
|
|
236
|
+
pending: false,
|
|
237
|
+
last: null
|
|
310
238
|
};
|
|
311
239
|
me.api = me.lookupAPI();
|
|
312
240
|
me.globals = me.lookupGlobals();
|
|
313
241
|
me.locals = me.lookupLocals();
|
|
314
242
|
}
|
|
243
|
+
OperationContext.prototype.step = function (item) {
|
|
244
|
+
var me = this;
|
|
245
|
+
var dbgr = me.debugger;
|
|
246
|
+
me.stackItem = item;
|
|
247
|
+
me.setLastActive(me);
|
|
248
|
+
if (dbgr.getBreakpoint(me)) {
|
|
249
|
+
dbgr.interact(me, item);
|
|
250
|
+
return dbgr.resume();
|
|
251
|
+
}
|
|
252
|
+
return Promise.resolve();
|
|
253
|
+
};
|
|
254
|
+
OperationContext.prototype.setLastActive = function (opc) {
|
|
255
|
+
var me = this;
|
|
256
|
+
if (!opc.injected) {
|
|
257
|
+
me.processState.last = opc;
|
|
258
|
+
}
|
|
259
|
+
return me;
|
|
260
|
+
};
|
|
261
|
+
OperationContext.prototype.getLastActive = function () {
|
|
262
|
+
return this.processState.last;
|
|
263
|
+
};
|
|
264
|
+
OperationContext.prototype.isExit = function () {
|
|
265
|
+
return this.processState.exit;
|
|
266
|
+
};
|
|
315
267
|
OperationContext.prototype.exit = function () {
|
|
316
268
|
var me = this;
|
|
317
269
|
var state = me.processState;
|
|
@@ -328,17 +280,14 @@ var OperationContext = /** @class */ (function () {
|
|
|
328
280
|
}
|
|
329
281
|
return Promise.reject(new Error('No running process found.'));
|
|
330
282
|
};
|
|
283
|
+
OperationContext.prototype.isPending = function () {
|
|
284
|
+
return this.processState.pending;
|
|
285
|
+
};
|
|
331
286
|
OperationContext.prototype.setPending = function (pending) {
|
|
332
287
|
var me = this;
|
|
333
288
|
me.processState.pending = pending;
|
|
334
289
|
return me;
|
|
335
290
|
};
|
|
336
|
-
OperationContext.prototype.isExit = function () {
|
|
337
|
-
return this.processState.exit;
|
|
338
|
-
};
|
|
339
|
-
OperationContext.prototype.isPending = function () {
|
|
340
|
-
return this.processState.exit;
|
|
341
|
-
};
|
|
342
291
|
OperationContext.prototype.lookupType = function (validate) {
|
|
343
292
|
var me = this;
|
|
344
293
|
if (validate(me.type)) {
|
|
@@ -412,7 +361,7 @@ var OperationContext = /** @class */ (function () {
|
|
|
412
361
|
return me.memory.get(key);
|
|
413
362
|
};
|
|
414
363
|
OperationContext.prototype.fork = function (_a) {
|
|
415
|
-
var type = _a.type, state = _a.state, target = _a.target;
|
|
364
|
+
var type = _a.type, state = _a.state, target = _a.target, injected = _a.injected;
|
|
416
365
|
var me = this;
|
|
417
366
|
var opc = new OperationContext({
|
|
418
367
|
target: target || me.target,
|
|
@@ -421,7 +370,8 @@ var OperationContext = /** @class */ (function () {
|
|
|
421
370
|
state: state,
|
|
422
371
|
debugger: me.debugger,
|
|
423
372
|
cps: me.cps,
|
|
424
|
-
processState: me.processState
|
|
373
|
+
processState: me.processState,
|
|
374
|
+
injected: injected || me.injected
|
|
425
375
|
});
|
|
426
376
|
if (type !== ContextType.FUNCTION) {
|
|
427
377
|
if (type !== ContextType.LOOP) {
|
package/dist/interpreter.d.ts
CHANGED
|
@@ -22,7 +22,8 @@ export default class Interpreter extends EventEmitter {
|
|
|
22
22
|
constructor(options: InterpreterOptions);
|
|
23
23
|
setTarget(target: string): Interpreter;
|
|
24
24
|
setDebugger(dbgr: Debugger): Interpreter;
|
|
25
|
-
inject(code: string): Promise<Interpreter>;
|
|
25
|
+
inject(code: string, context?: OperationContext): Promise<Interpreter>;
|
|
26
|
+
injectInLastContext(code: string): Promise<Interpreter>;
|
|
26
27
|
digest(customCode?: string): Promise<Interpreter>;
|
|
27
28
|
exit(): Promise<OperationContext>;
|
|
28
29
|
}
|
package/dist/interpreter.js
CHANGED
|
@@ -99,24 +99,25 @@ var Interpreter = /** @class */ (function (_super) {
|
|
|
99
99
|
me.globalContext.debugger = dbgr;
|
|
100
100
|
return me;
|
|
101
101
|
};
|
|
102
|
-
Interpreter.prototype.inject = function (code) {
|
|
102
|
+
Interpreter.prototype.inject = function (code, context) {
|
|
103
103
|
return __awaiter(this, void 0, void 0, function () {
|
|
104
|
-
var me, parser, chunk, body,
|
|
104
|
+
var me, parser, chunk, body, injectionCtx, err_1;
|
|
105
105
|
return __generator(this, function (_a) {
|
|
106
106
|
switch (_a.label) {
|
|
107
107
|
case 0:
|
|
108
108
|
me = this;
|
|
109
|
+
_a.label = 1;
|
|
110
|
+
case 1:
|
|
111
|
+
_a.trys.push([1, 4, , 5]);
|
|
109
112
|
parser = new greybel_core_1.Parser(code);
|
|
110
113
|
chunk = parser.parseChunk();
|
|
111
114
|
return [4 /*yield*/, me.cps.visit(chunk)];
|
|
112
|
-
case 1:
|
|
113
|
-
body = _a.sent();
|
|
114
|
-
_a.label = 2;
|
|
115
115
|
case 2:
|
|
116
|
-
_a.
|
|
117
|
-
|
|
118
|
-
type: context_1.ContextType.
|
|
119
|
-
state: context_1.ContextState.TEMPORARY
|
|
116
|
+
body = _a.sent();
|
|
117
|
+
injectionCtx = (context || me.globalContext).fork({
|
|
118
|
+
type: context_1.ContextType.CALL,
|
|
119
|
+
state: context_1.ContextState.TEMPORARY,
|
|
120
|
+
injected: true
|
|
120
121
|
});
|
|
121
122
|
return [4 /*yield*/, body.run(context)];
|
|
122
123
|
case 3:
|
|
@@ -131,6 +132,19 @@ var Interpreter = /** @class */ (function (_super) {
|
|
|
131
132
|
});
|
|
132
133
|
});
|
|
133
134
|
};
|
|
135
|
+
Interpreter.prototype.injectInLastContext = function (code) {
|
|
136
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
137
|
+
var me, last;
|
|
138
|
+
return __generator(this, function (_a) {
|
|
139
|
+
me = this;
|
|
140
|
+
last = me.apiContext.getLastActive();
|
|
141
|
+
if (me.apiContext.isPending()) {
|
|
142
|
+
me.inject(code, last);
|
|
143
|
+
}
|
|
144
|
+
return [2 /*return*/, me];
|
|
145
|
+
});
|
|
146
|
+
});
|
|
147
|
+
};
|
|
134
148
|
Interpreter.prototype.digest = function (customCode) {
|
|
135
149
|
return __awaiter(this, void 0, void 0, function () {
|
|
136
150
|
var me, code, _a, parser, chunk, body, process_1, err_2;
|
package/dist/operations/body.js
CHANGED
|
@@ -94,48 +94,43 @@ var BodyOperation = /** @class */ (function (_super) {
|
|
|
94
94
|
}
|
|
95
95
|
_d.label = 1;
|
|
96
96
|
case 1:
|
|
97
|
-
_d.trys.push([1, 11, 12
|
|
97
|
+
_d.trys.push([1, 10, 11, 12]);
|
|
98
98
|
_a = __values(me.stack), _b = _a.next();
|
|
99
99
|
_d.label = 2;
|
|
100
100
|
case 2:
|
|
101
|
-
if (!!_b.done) return [3 /*break*/,
|
|
101
|
+
if (!!_b.done) return [3 /*break*/, 9];
|
|
102
102
|
entity = _b.value;
|
|
103
|
-
operationContext.
|
|
104
|
-
if (!dbgr.getBreakpoint(operationContext)) return [3 /*break*/, 4];
|
|
105
|
-
dbgr.interact(operationContext, entity);
|
|
106
|
-
return [4 /*yield*/, dbgr.resume()];
|
|
103
|
+
return [4 /*yield*/, operationContext.step(entity.ast)];
|
|
107
104
|
case 3:
|
|
108
105
|
_d.sent();
|
|
109
|
-
|
|
110
|
-
case 4:
|
|
111
|
-
if (!(entity instanceof expression_1.Expression)) return [3 /*break*/, 6];
|
|
106
|
+
if (!(entity instanceof expression_1.Expression)) return [3 /*break*/, 5];
|
|
112
107
|
return [4 /*yield*/, entity.get(operationContext)];
|
|
113
|
-
case
|
|
108
|
+
case 4:
|
|
114
109
|
_d.sent();
|
|
115
|
-
return [3 /*break*/,
|
|
116
|
-
case
|
|
117
|
-
case
|
|
110
|
+
return [3 /*break*/, 7];
|
|
111
|
+
case 5: return [4 /*yield*/, entity.run(operationContext)];
|
|
112
|
+
case 6:
|
|
118
113
|
_d.sent();
|
|
114
|
+
_d.label = 7;
|
|
115
|
+
case 7:
|
|
116
|
+
if (isEOL() || operationContext.isExit())
|
|
117
|
+
return [3 /*break*/, 9];
|
|
119
118
|
_d.label = 8;
|
|
120
119
|
case 8:
|
|
121
|
-
if (isEOL() || operationContext.isExit())
|
|
122
|
-
return [3 /*break*/, 10];
|
|
123
|
-
_d.label = 9;
|
|
124
|
-
case 9:
|
|
125
120
|
_b = _a.next();
|
|
126
121
|
return [3 /*break*/, 2];
|
|
127
|
-
case
|
|
128
|
-
case
|
|
122
|
+
case 9: return [3 /*break*/, 12];
|
|
123
|
+
case 10:
|
|
129
124
|
e_1_1 = _d.sent();
|
|
130
125
|
e_1 = { error: e_1_1 };
|
|
131
|
-
return [3 /*break*/,
|
|
132
|
-
case
|
|
126
|
+
return [3 /*break*/, 12];
|
|
127
|
+
case 11:
|
|
133
128
|
try {
|
|
134
129
|
if (_b && !_b.done && (_c = _a.return)) _c.call(_a);
|
|
135
130
|
}
|
|
136
131
|
finally { if (e_1) throw e_1.error; }
|
|
137
132
|
return [7 /*endfinally*/];
|
|
138
|
-
case
|
|
133
|
+
case 12: return [2 /*return*/];
|
|
139
134
|
}
|
|
140
135
|
});
|
|
141
136
|
});
|