greyscript-interpreter 1.6.6 → 1.7.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/bytecode-generator/context.d.ts +6 -0
- package/dist/bytecode-generator/context.js +14 -0
- package/dist/bytecode-generator/statement.d.ts +9 -0
- package/dist/bytecode-generator/statement.js +66 -0
- package/dist/bytecode-generator.d.ts +2 -6
- package/dist/bytecode-generator.js +31 -64
- package/dist/index.d.ts +2 -0
- package/dist/index.js +5 -1
- package/package.json +3 -3
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { BytecodeGeneratorContext as GreybelBytecodeGeneratorContext, BytecodeGeneratorContextOptions as GreybelBytecodeGeneratorContextOptions } from 'greybel-interpreter';
|
|
2
|
+
export declare class Context extends GreybelBytecodeGeneratorContext {
|
|
3
|
+
protected _evaluatedImportCodes: Set<string>;
|
|
4
|
+
constructor(options: GreybelBytecodeGeneratorContextOptions);
|
|
5
|
+
get evaluatedImportCodes(): Set<string>;
|
|
6
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Context = void 0;
|
|
4
|
+
const greybel_interpreter_1 = require("greybel-interpreter");
|
|
5
|
+
class Context extends greybel_interpreter_1.BytecodeGeneratorContext {
|
|
6
|
+
constructor(options) {
|
|
7
|
+
super(options);
|
|
8
|
+
this._evaluatedImportCodes = new Set();
|
|
9
|
+
}
|
|
10
|
+
get evaluatedImportCodes() {
|
|
11
|
+
return this._evaluatedImportCodes;
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
exports.Context = Context;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { BytecodeStatementGenerator as GreybelBytecodeStatementGenerator } from 'greybel-interpreter';
|
|
2
|
+
import { ASTImportCodeExpression } from 'greyscript-core';
|
|
3
|
+
import { ASTBase } from 'miniscript-core';
|
|
4
|
+
import { Context } from './context';
|
|
5
|
+
export declare class BytecodeStatementGenerator extends GreybelBytecodeStatementGenerator {
|
|
6
|
+
protected context: Context;
|
|
7
|
+
process(node: ASTBase): Promise<void>;
|
|
8
|
+
protected processImportCodeExpression(node: ASTImportCodeExpression): Promise<void>;
|
|
9
|
+
}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.BytecodeStatementGenerator = void 0;
|
|
13
|
+
const greybel_interpreter_1 = require("greybel-interpreter");
|
|
14
|
+
const miniscript_core_1 = require("miniscript-core");
|
|
15
|
+
class BytecodeStatementGenerator extends greybel_interpreter_1.BytecodeStatementGenerator {
|
|
16
|
+
process(node) {
|
|
17
|
+
const _super = Object.create(null, {
|
|
18
|
+
process: { get: () => super.process }
|
|
19
|
+
});
|
|
20
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
21
|
+
switch (node.type) {
|
|
22
|
+
case miniscript_core_1.ASTType.ImportCodeExpression:
|
|
23
|
+
yield this.processImportCodeExpression(node);
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
return _super.process.call(this, node);
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
processImportCodeExpression(node) {
|
|
30
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
31
|
+
const currentTarget = this.context.target.peek();
|
|
32
|
+
const importTarget = yield this.context.handler.resourceHandler.getTargetRelativeTo(currentTarget, node.directory);
|
|
33
|
+
if (this.context.evaluatedImportCodes.has(importTarget)) {
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
if (this.context.target.includes(importTarget)) {
|
|
37
|
+
console.warn(`Found circular dependency between "${currentTarget}" and "${importTarget}" at line ${node.start.line}. Using noop instead to prevent overflow.`);
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
const code = yield this.context.handler.resourceHandler.get(importTarget);
|
|
41
|
+
if (code == null) {
|
|
42
|
+
throw new greybel_interpreter_1.PrepareError(`Cannot find import "${currentTarget}"`, {
|
|
43
|
+
target: currentTarget,
|
|
44
|
+
range: new miniscript_core_1.ASTRange(node.start, node.end)
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
try {
|
|
48
|
+
this.context.target.push(importTarget);
|
|
49
|
+
const childNodes = this.parseCode(code);
|
|
50
|
+
yield this.process(childNodes);
|
|
51
|
+
this.context.target.pop();
|
|
52
|
+
this.context.evaluatedImportCodes.add(importTarget);
|
|
53
|
+
}
|
|
54
|
+
catch (err) {
|
|
55
|
+
if (err instanceof greybel_interpreter_1.PrepareError) {
|
|
56
|
+
throw err;
|
|
57
|
+
}
|
|
58
|
+
throw new greybel_interpreter_1.PrepareError(err.message, {
|
|
59
|
+
target: importTarget,
|
|
60
|
+
range: new miniscript_core_1.ASTRange(node.start, node.end)
|
|
61
|
+
}, err);
|
|
62
|
+
}
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
exports.BytecodeStatementGenerator = BytecodeStatementGenerator;
|
|
@@ -1,10 +1,6 @@
|
|
|
1
|
-
import { BytecodeConverterOptions, BytecodeGenerator as GreybelBytecodeGenerator } from 'greybel-interpreter';
|
|
2
|
-
import { ASTImportCodeExpression } from 'greyscript-core';
|
|
3
|
-
import { ASTBase } from 'miniscript-core';
|
|
1
|
+
import { BytecodeCompileResult, BytecodeConverterOptions, BytecodeGenerator as GreybelBytecodeGenerator } from 'greybel-interpreter';
|
|
4
2
|
export declare class BytecodeGenerator extends GreybelBytecodeGenerator {
|
|
5
3
|
protected evaluatedImportCodes: Set<string>;
|
|
6
4
|
constructor(options: BytecodeConverterOptions);
|
|
7
|
-
|
|
8
|
-
protected processNode(node: ASTBase): Promise<void>;
|
|
9
|
-
protected processImportCodeExpression(node: ASTImportCodeExpression): Promise<void>;
|
|
5
|
+
compile(code: string): Promise<BytecodeCompileResult>;
|
|
10
6
|
}
|
|
@@ -11,77 +11,44 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
11
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
12
|
exports.BytecodeGenerator = void 0;
|
|
13
13
|
const greybel_interpreter_1 = require("greybel-interpreter");
|
|
14
|
+
const context_1 = require("./bytecode-generator/context");
|
|
14
15
|
const greyscript_core_1 = require("greyscript-core");
|
|
15
|
-
const
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
16
|
+
const statement_1 = require("./bytecode-generator/statement");
|
|
17
|
+
const parse = function (code) {
|
|
18
|
+
try {
|
|
19
|
+
const parser = new greyscript_core_1.Parser(code);
|
|
20
|
+
return parser.parseChunk();
|
|
20
21
|
}
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
return parser.parseChunk();
|
|
22
|
+
catch (err) {
|
|
23
|
+
if (err instanceof greybel_interpreter_1.PrepareError) {
|
|
24
|
+
this.context.handler.errorHandler.raise(err);
|
|
25
25
|
}
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
this.handler.errorHandler.raise(new greybel_interpreter_1.PrepareError(err.message, {
|
|
32
|
-
range: err.range,
|
|
33
|
-
target: this.target.peek()
|
|
34
|
-
}));
|
|
35
|
-
}
|
|
26
|
+
else {
|
|
27
|
+
this.context.handler.errorHandler.raise(new greybel_interpreter_1.PrepareError(err.message, {
|
|
28
|
+
range: err.range,
|
|
29
|
+
target: this.context.target.peek()
|
|
30
|
+
}));
|
|
36
31
|
}
|
|
37
32
|
}
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
});
|
|
42
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
43
|
-
switch (node.type) {
|
|
44
|
-
case greyscript_core_1.ASTType.ImportCodeExpression:
|
|
45
|
-
yield this.processImportCodeExpression(node);
|
|
46
|
-
return;
|
|
47
|
-
}
|
|
48
|
-
return _super.processNode.call(this, node);
|
|
49
|
-
});
|
|
33
|
+
};
|
|
34
|
+
class BytecodeGenerator extends greybel_interpreter_1.BytecodeGenerator {
|
|
35
|
+
constructor(options) {
|
|
36
|
+
super(Object.assign({ context: new context_1.Context(options) }, options));
|
|
50
37
|
}
|
|
51
|
-
|
|
38
|
+
compile(code) {
|
|
52
39
|
return __awaiter(this, void 0, void 0, function* () {
|
|
53
|
-
const
|
|
54
|
-
const
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
target: currentTarget,
|
|
66
|
-
range: new miniscript_core_1.ASTRange(node.start, node.end)
|
|
67
|
-
});
|
|
68
|
-
}
|
|
69
|
-
try {
|
|
70
|
-
this.target.push(importTarget);
|
|
71
|
-
const childNodes = this.parse(code);
|
|
72
|
-
yield this.processNode(childNodes);
|
|
73
|
-
this.target.pop();
|
|
74
|
-
this.evaluatedImportCodes.add(importTarget);
|
|
75
|
-
}
|
|
76
|
-
catch (err) {
|
|
77
|
-
if (err instanceof greybel_interpreter_1.PrepareError) {
|
|
78
|
-
throw err;
|
|
79
|
-
}
|
|
80
|
-
throw new greybel_interpreter_1.PrepareError(err.message, {
|
|
81
|
-
target: importTarget,
|
|
82
|
-
range: new miniscript_core_1.ASTRange(node.start, node.end)
|
|
83
|
-
}, err);
|
|
84
|
-
}
|
|
40
|
+
const statementGenerator = new statement_1.BytecodeStatementGenerator(this.context, parse.bind(this));
|
|
41
|
+
const node = parse.call(this, code);
|
|
42
|
+
yield statementGenerator.process(node);
|
|
43
|
+
const mod = this.context.module.peek();
|
|
44
|
+
mod.pushCode({
|
|
45
|
+
op: greybel_interpreter_1.OpCode.HALT,
|
|
46
|
+
source: mod.getSourceLocation(node)
|
|
47
|
+
});
|
|
48
|
+
return {
|
|
49
|
+
code: mod.getCode(),
|
|
50
|
+
imports: this.context.imports
|
|
51
|
+
};
|
|
85
52
|
});
|
|
86
53
|
}
|
|
87
54
|
}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
import './overrides';
|
|
2
|
+
export { Context as BytecodeGeneratorContext } from './bytecode-generator/context';
|
|
3
|
+
export { BytecodeStatementGenerator } from './bytecode-generator/statement';
|
|
2
4
|
export { BytecodeGenerator } from './bytecode-generator';
|
|
3
5
|
export { Interpreter } from './interpreter';
|
|
4
6
|
export { CLASS_ID_PROPERTY } from './overrides';
|
package/dist/index.js
CHANGED
|
@@ -1,7 +1,11 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.CLASS_ID_PROPERTY = exports.Interpreter = exports.BytecodeGenerator = void 0;
|
|
3
|
+
exports.CLASS_ID_PROPERTY = exports.Interpreter = exports.BytecodeGenerator = exports.BytecodeStatementGenerator = exports.BytecodeGeneratorContext = void 0;
|
|
4
4
|
require("./overrides");
|
|
5
|
+
var context_1 = require("./bytecode-generator/context");
|
|
6
|
+
Object.defineProperty(exports, "BytecodeGeneratorContext", { enumerable: true, get: function () { return context_1.Context; } });
|
|
7
|
+
var statement_1 = require("./bytecode-generator/statement");
|
|
8
|
+
Object.defineProperty(exports, "BytecodeStatementGenerator", { enumerable: true, get: function () { return statement_1.BytecodeStatementGenerator; } });
|
|
5
9
|
var bytecode_generator_1 = require("./bytecode-generator");
|
|
6
10
|
Object.defineProperty(exports, "BytecodeGenerator", { enumerable: true, get: function () { return bytecode_generator_1.BytecodeGenerator; } });
|
|
7
11
|
var interpreter_1 = require("./interpreter");
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "greyscript-interpreter",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.7.1",
|
|
4
4
|
"description": "Interpreter",
|
|
5
5
|
"main": "dist/index",
|
|
6
6
|
"typings": "dist/index",
|
|
@@ -48,8 +48,8 @@
|
|
|
48
48
|
"typescript": "^5.0.4"
|
|
49
49
|
},
|
|
50
50
|
"dependencies": {
|
|
51
|
-
"greyscript-core": "~1.
|
|
52
|
-
"greybel-interpreter": "~4.
|
|
51
|
+
"greyscript-core": "~1.6.0",
|
|
52
|
+
"greybel-interpreter": "~4.6.3"
|
|
53
53
|
},
|
|
54
54
|
"keywords": [
|
|
55
55
|
"greyscript",
|