Skip to content

Commit f39c65f

Browse files
committed
Fix JS
Signed-off-by: Juan Cruz Viotti <jv@jviotti.com>
1 parent 0263cae commit f39c65f

2 files changed

Lines changed: 69 additions & 32 deletions

File tree

ports/javascript/index.mjs

Lines changed: 60 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@ const DEPTH_LIMIT = 300;
33
const ANNOTATION_EMIT = 44;
44
const ANNOTATION_TO_PARENT = 45;
55
const ANNOTATION_BASENAME_TO_PARENT = 46;
6-
const CONTROL_GROUP_START = 85;
7-
const CONTROL_EVALUATE_END = 89;
6+
const CONTROL_GROUP_START = 86;
7+
const CONTROL_EVALUATE_END = 90;
88
const URI_REGEX = /^[a-zA-Z][a-zA-Z0-9+\-.]*:[^\s]*$/;
99

1010
function buildJsonPointer(tokens, length) {
@@ -150,7 +150,7 @@ function prepareInstruction(instruction) {
150150
function resolveJumpTargets(instructions, targets) {
151151
for (let index = 0; index < instructions.length; index++) {
152152
const instruction = instructions[index];
153-
if (instruction[0] === 91) {
153+
if (instruction[0] === 92) {
154154
const targetIndex = instruction[5];
155155
if (targetIndex < targets.length) {
156156
instruction[5] = targets[targetIndex];
@@ -185,7 +185,7 @@ function collectAnchorNames(targets, result) {
185185
function collectAnchorNamesFromInstructions(instructions, result) {
186186
for (let index = 0; index < instructions.length; index++) {
187187
const instruction = instructions[index];
188-
if (instruction[0] === 90 && typeof instruction[5] === 'string') {
188+
if (instruction[0] === 91 && typeof instruction[5] === 'string') {
189189
result.add(instruction[5]);
190190
}
191191
if (instruction[6]) {
@@ -321,14 +321,14 @@ function compileInstructionToCode(instruction, captures, visited, budget) {
321321
case 79: { var r=R('t'); return r?r+'if(!Array.isArray(t))return true;for(var j=0;j<t.length;j++){var a=_jt(t[j]);if(a!=='+value+'&&!('+value+'===2&&_ii(t[j])))return false;}return true;':null; }
322322
case 80: { var r=R('t'); return r?r+'if(!Array.isArray(t))return true;for(var j=0;j<t.length;j++){if(_es(t[j])!=='+value+')return false;}return true;':null; }
323323
case 81: { var r=R('t'); return r?r+'if(!Array.isArray(t))return true;for(var j=0;j<t.length;j++){if(('+value+'&(1<<_es(t[j])))===0)return false;}return true;':null; }
324-
case 82: return fb(82); case 83: return fb(83); case 84: return fb(84);
325-
case 85: { if(!children||children.length===0)return 'return true;'; var c=''; for(var j=0;j<children.length;j++){var r2=compileInstructionToCode(children[j],captures,visited,budget); if(r2===null){var ci=captures.length;captures.push(children[j]);c+='if(!_e(_c['+ci+'],i,d+1,_t,_v))return false;';}else{budget[0]-=r2.length;c+='if(!(function(i,d,_t,_v){'+r2+'})(i,d+1,_t,_v))return false;';}} return c+'return true;'; }
326-
case 86: { var r=R('t'); if(!r)return null; var c=r+TO+'return true;if(!Object.hasOwn(t,'+JSON.stringify(value)+'))return true;'; if(children&&children.length>0)c+=seq(children,'i'); return c+'return true;'; }
327-
case 87: { var c=IO+'if(!Object.hasOwn(i,'+JSON.stringify(value)+'))return true;'; if(children&&children.length>0)c+=seq(children,'i'); return c+'return true;'; }
328-
case 88: { var c='if(_jt(i)!=='+value+')return true;'; if(children&&children.length>0)c+=seq(children,'i'); return c+'return true;'; }
329-
case 89: return 'return true;';
330-
case 90: return fb(90);
331-
case 91: { if(!value)return 'return true;'; if(visited&&visited.has(instruction))return fb(91); if(!visited)visited=new Set(); visited.add(instruction); var r=R('t'); if(!r)return fb(91); var c=r; for(var j=0;j<value.length;j++){var r2=compileInstructionToCode(value[j],captures,visited,budget); if(r2===null){var ci=captures.length;captures.push(value[j]);c+='if(!_e(_c['+ci+'],t,d+1,_t,_v))return false;';}else{budget[0]-=r2.length;c+='if(!(function(i,d,_t,_v){'+r2+'})(t,d+1,_t,_v))return false;';}} return c+'return true;'; }
324+
case 82: return fb(82); case 83: return fb(83); case 84: return fb(84); case 85: return fb(85);
325+
case 86: { if(!children||children.length===0)return 'return true;'; var c=''; for(var j=0;j<children.length;j++){var r2=compileInstructionToCode(children[j],captures,visited,budget); if(r2===null){var ci=captures.length;captures.push(children[j]);c+='if(!_e(_c['+ci+'],i,d+1,_t,_v))return false;';}else{budget[0]-=r2.length;c+='if(!(function(i,d,_t,_v){'+r2+'})(i,d+1,_t,_v))return false;';}} return c+'return true;'; }
326+
case 87: { var r=R('t'); if(!r)return null; var c=r+TO+'return true;if(!Object.hasOwn(t,'+JSON.stringify(value)+'))return true;'; if(children&&children.length>0)c+=seq(children,'i'); return c+'return true;'; }
327+
case 88: { var c=IO+'if(!Object.hasOwn(i,'+JSON.stringify(value)+'))return true;'; if(children&&children.length>0)c+=seq(children,'i'); return c+'return true;'; }
328+
case 89: { var c='if(_jt(i)!=='+value+')return true;'; if(children&&children.length>0)c+=seq(children,'i'); return c+'return true;'; }
329+
case 90: return 'return true;';
330+
case 91: return fb(91);
331+
case 92: { if(!value)return 'return true;'; if(visited&&visited.has(instruction))return fb(92); if(!visited)visited=new Set(); visited.add(instruction); var r=R('t'); if(!r)return fb(92); var c=r; for(var j=0;j<value.length;j++){var r2=compileInstructionToCode(value[j],captures,visited,budget); if(r2===null){var ci=captures.length;captures.push(value[j]);c+='if(!_e(_c['+ci+'],t,d+1,_t,_v))return false;';}else{budget[0]-=r2.length;c+='if(!(function(i,d,_t,_v){'+r2+'})(t,d+1,_t,_v))return false;';}} return c+'return true;'; }
332332
default: return null;
333333
}
334334
}
@@ -623,7 +623,7 @@ function evaluateInstructionTracked(instruction, instance, depth, template, eval
623623
if (!handler) return true;
624624

625625
const type = instruction[0];
626-
if (type < 85 || type > 89) {
626+
if (type < 86 || type > 90) {
627627
if (evaluator.trackMode) {
628628
evaluator.pushPath(instruction[1]);
629629
}
@@ -2288,6 +2288,28 @@ function LoopItemsPropertiesExactlyTypeStrictHash(instruction, instance, depth,
22882288
if (evaluator.callbackMode) evaluator.callbackPop(instruction, true);
22892289
return true;
22902290
};
2291+
2292+
function LoopItemsIntegerBounded(instruction, instance, depth, template, evaluator) {
2293+
const target = resolveInstance(instance, instruction[2]);
2294+
if (!Array.isArray(target) || target.length === 0) return true;
2295+
if (evaluator.callbackMode) evaluator.callbackPush(instruction);
2296+
const minimum = instruction[5][0];
2297+
const maximum = instruction[5][1];
2298+
for (let index = 0; index < target.length; index++) {
2299+
const element = target[index];
2300+
if (typeof element !== 'number') {
2301+
if (evaluator.callbackMode) evaluator.callbackPop(instruction, false);
2302+
return false;
2303+
}
2304+
if (element < minimum || element > maximum) {
2305+
if (evaluator.callbackMode) evaluator.callbackPop(instruction, false);
2306+
return false;
2307+
}
2308+
}
2309+
if (evaluator.callbackMode) evaluator.callbackPop(instruction, true);
2310+
return true;
2311+
};
2312+
22912313
function LoopContains(instruction, instance, depth, template, evaluator) {
22922314
const target = resolveInstance(instance, instruction[2]);
22932315
if (!Array.isArray(target)) return true;
@@ -2516,14 +2538,15 @@ const handlers = [
25162538
LoopItemsTypeStrictAny, // 81
25172539
LoopItemsPropertiesExactlyTypeStrictHash, // 82
25182540
LoopItemsPropertiesExactlyTypeStrictHash, // 83
2519-
LoopContains, // 84
2520-
ControlGroup, // 85
2521-
ControlGroupWhenDefines, // 86
2522-
ControlGroupWhenDefinesDirect, // 87
2523-
ControlGroupWhenType, // 88
2524-
ControlEvaluate, // 89
2525-
ControlDynamicAnchorJump, // 90
2526-
ControlJump // 91
2541+
LoopItemsIntegerBounded, // 84
2542+
LoopContains, // 85
2543+
ControlGroup, // 86
2544+
ControlGroupWhenDefines, // 87
2545+
ControlGroupWhenDefinesDirect, // 88
2546+
ControlGroupWhenType, // 89
2547+
ControlEvaluate, // 90
2548+
ControlDynamicAnchorJump, // 91
2549+
ControlJump // 92
25272550
];
25282551

25292552
function AssertionTypeArrayBounded_fast(instruction, instance, depth, template, evaluator) {
@@ -3622,6 +3645,18 @@ function ControlDynamicAnchorJump_fast(instruction, instance, depth, template, e
36223645
return false;
36233646
}
36243647

3648+
function LoopItemsIntegerBounded_fast(instruction, instance, depth, template, evaluator) {
3649+
const target = resolveInstance(instance, instruction[2]);
3650+
if (!Array.isArray(target) || target.length === 0) return true;
3651+
const minimum = instruction[5][0];
3652+
const maximum = instruction[5][1];
3653+
for (let index = 0; index < target.length; index++) {
3654+
const element = target[index];
3655+
if (typeof element !== 'number' || element < minimum || element > maximum) return false;
3656+
}
3657+
return true;
3658+
}
3659+
36253660
const fastHandlers = handlers.slice();
36263661
fastHandlers[15] = AssertionTypeArrayBounded_fast;
36273662
fastHandlers[81] = LoopItemsTypeStrictAny_fast;
@@ -3631,7 +3666,7 @@ fastHandlers[4] = AssertionDefinesAllStrict_fast;
36313666
fastHandlers[26] = AssertionEqual_fast;
36323667
fastHandlers[59] = LoopPropertiesMatch_fast;
36333668
fastHandlers[50] = LogicalOr_fast;
3634-
fastHandlers[91] = ControlJump_fast;
3669+
fastHandlers[92] = ControlJump_fast;
36353670
fastHandlers[28] = AssertionEqualsAnyStringHash_fast;
36363671
fastHandlers[52] = LogicalXor_fast;
36373672
fastHandlers[2] = AssertionDefinesStrict_fast;
@@ -3649,7 +3684,7 @@ fastHandlers[1] = AssertionDefines_fast;
36493684
fastHandlers[54] = LogicalWhenType_fast;
36503685
fastHandlers[55] = LogicalWhenDefines_fast;
36513686
fastHandlers[0] = AssertionFail_fast;
3652-
fastHandlers[84] = LoopContains_fast;
3687+
fastHandlers[85] = LoopContains_fast;
36533688
fastHandlers[48] = LogicalNot_fast;
36543689
fastHandlers[79] = LoopItemsType_fast;
36553690
fastHandlers[80] = LoopItemsTypeStrict_fast;
@@ -3709,6 +3744,7 @@ fastHandlers[77] = LoopItemsFrom_fast;
37093744
fastHandlers[78] = LoopItemsUnevaluated_fast;
37103745
fastHandlers[82] = LoopItemsPropertiesExactlyTypeStrictHash_fast;
37113746
fastHandlers[83] = LoopItemsPropertiesExactlyTypeStrictHash_fast;
3712-
fastHandlers[90] = ControlDynamicAnchorJump_fast;
3747+
fastHandlers[84] = LoopItemsIntegerBounded_fast;
3748+
fastHandlers[91] = ControlDynamicAnchorJump_fast;
37133749

37143750
export { Blaze };

ports/javascript/trace.mjs

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -95,14 +95,15 @@ const INSTRUCTION_NAMES = {
9595
"LoopItemsTypeStrictAny": 81,
9696
"LoopItemsPropertiesExactlyTypeStrictHash": 82,
9797
"LoopItemsPropertiesExactlyTypeStrictHash3": 83,
98-
"LoopContains": 84,
99-
"ControlGroup": 85,
100-
"ControlGroupWhenDefines": 86,
101-
"ControlGroupWhenDefinesDirect": 87,
102-
"ControlGroupWhenType": 88,
103-
"ControlEvaluate": 89,
104-
"ControlDynamicAnchorJump": 90,
105-
"ControlJump": 91,
98+
"LoopItemsIntegerBounded": 84,
99+
"LoopContains": 85,
100+
"ControlGroup": 86,
101+
"ControlGroupWhenDefines": 87,
102+
"ControlGroupWhenDefinesDirect": 88,
103+
"ControlGroupWhenType": 89,
104+
"ControlEvaluate": 90,
105+
"ControlDynamicAnchorJump": 91,
106+
"ControlJump": 92,
106107
"Annotation": -1
107108
};
108109

0 commit comments

Comments
 (0)