@bablr/agast-vm 0.8.0 → 0.9.0
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/README.md +14 -49
- package/lib/evaluate.js +116 -147
- package/lib/index.js +2 -1
- package/lib/node.js +176 -0
- package/lib/path.js +160 -1
- package/lib/state.js +256 -146
- package/package.json +3 -6
- package/lib/context.js +0 -88
- package/lib/utils/array.js +0 -7
- package/lib/utils/iterable.js +0 -13
- package/lib/utils/skip.js +0 -39
package/lib/context.js
DELETED
|
@@ -1,88 +0,0 @@
|
|
|
1
|
-
import { reifyExpression } from '@bablr/agast-vm-helpers';
|
|
2
|
-
import { sourceTextFor as sourceTextForTree } from '@bablr/agast-helpers/tree';
|
|
3
|
-
|
|
4
|
-
import { allTagPathsFor } from './path.js';
|
|
5
|
-
import { facades, actuals } from './facades.js';
|
|
6
|
-
|
|
7
|
-
export const ContextFacade = class AgastContextFacade {
|
|
8
|
-
getPreviousTagPath(token) {
|
|
9
|
-
return actuals.get(this).prevTags.get(token);
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
getNextTagPath(token) {
|
|
13
|
-
return actuals.get(this).nextTags.get(token);
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
allTagsFor(range) {
|
|
17
|
-
return actuals.get(this).allTagsFor(range);
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
reifyExpression(range) {
|
|
21
|
-
return actuals.get(this).reifyExpression(range);
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
sourceTextFor(range) {
|
|
25
|
-
return actuals.get(this).sourceTextFor(range);
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
buildRange(tags) {
|
|
29
|
-
return actuals.get(this).buildRange(tags);
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
nodeForTag(tag) {
|
|
33
|
-
return actuals.get(this).nodeForTag(tag);
|
|
34
|
-
}
|
|
35
|
-
};
|
|
36
|
-
|
|
37
|
-
export const Context = class AgastContext {
|
|
38
|
-
static create() {
|
|
39
|
-
return new Context();
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
constructor() {
|
|
43
|
-
this.tagNodes = new WeakMap();
|
|
44
|
-
this.facade = new ContextFacade();
|
|
45
|
-
|
|
46
|
-
facades.set(this, this.facade);
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
allTagsFor(range) {
|
|
50
|
-
return allTagPathsFor(range);
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
allTagsReverseFor(range) {
|
|
54
|
-
throw new Error('not implemented');
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
nodeForTag(tag) {
|
|
58
|
-
return this.tagNodes.get(tag);
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
sourceTextFor(node) {
|
|
62
|
-
return sourceTextForTree(node);
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
buildRange(tags) {
|
|
66
|
-
const { prevTags, nextTags } = this;
|
|
67
|
-
|
|
68
|
-
let start, end;
|
|
69
|
-
for (const tag of tags) {
|
|
70
|
-
if (prevTags.has(tag) || nextTags.has(tag)) {
|
|
71
|
-
throw new Error('buildRange must not overwrite linkages');
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
if (end) {
|
|
75
|
-
prevTags.set(tag, end);
|
|
76
|
-
nextTags.set(end, tag);
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
start = start || tag;
|
|
80
|
-
end = tag || end;
|
|
81
|
-
}
|
|
82
|
-
return start ? [start, end] : null;
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
reifyExpression(value) {
|
|
86
|
-
return reifyExpression(value);
|
|
87
|
-
}
|
|
88
|
-
};
|
package/lib/utils/array.js
DELETED
package/lib/utils/iterable.js
DELETED
package/lib/utils/skip.js
DELETED
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
import { findRight } from './array.js';
|
|
2
|
-
|
|
3
|
-
const skipLevels = 3;
|
|
4
|
-
const skipShiftExponentGrowth = 4;
|
|
5
|
-
const skipAmounts = new Array(skipLevels)
|
|
6
|
-
.fill(null)
|
|
7
|
-
.map((_, i) => 2 >> (i * skipShiftExponentGrowth));
|
|
8
|
-
const skipsByFrame = new WeakMap();
|
|
9
|
-
|
|
10
|
-
export const buildSkips = (frame) => {
|
|
11
|
-
let skipIdx = 0;
|
|
12
|
-
let skipAmount = skipAmounts[skipIdx];
|
|
13
|
-
let skips;
|
|
14
|
-
while ((frame.depth & skipAmount) === skipAmount) {
|
|
15
|
-
if (!skips) {
|
|
16
|
-
skips = [];
|
|
17
|
-
skipsByFrame.set(frame, skips);
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
skips[skipIdx] = frame.at(frame.depth - skipAmount);
|
|
21
|
-
|
|
22
|
-
skipIdx++;
|
|
23
|
-
skipAmount = skipAmounts[skipIdx];
|
|
24
|
-
}
|
|
25
|
-
};
|
|
26
|
-
|
|
27
|
-
export const skipToDepth = (depth, frame) => {
|
|
28
|
-
let parent = frame;
|
|
29
|
-
|
|
30
|
-
if (depth > frame.depth) throw new Error();
|
|
31
|
-
|
|
32
|
-
let d = frame.depth;
|
|
33
|
-
for (; d > depth; ) {
|
|
34
|
-
const skips = skipsByFrame.get(frame);
|
|
35
|
-
parent = (skips && findRight(skips, (skip) => d - skip > depth)) || parent.parent;
|
|
36
|
-
d = parent.depth;
|
|
37
|
-
}
|
|
38
|
-
return parent;
|
|
39
|
-
};
|