Skip to content

Commit 414bdb7

Browse files
committed
Add prev retention for compiled comparison operators
1 parent 218f939 commit 414bdb7

File tree

3 files changed

+21
-15
lines changed

3 files changed

+21
-15
lines changed

compiler.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -307,7 +307,7 @@ function processBuiltString (method, str, buildState) {
307307
str = str.replace(`__%%%${x}%%%__`, item)
308308
})
309309

310-
const final = `(values, methods, notTraversed, asyncIterators, engine, above, coerceArray) => ${buildState.asyncDetected ? 'async' : ''} (context ${buildState.extraArguments ? ',' + buildState.extraArguments : ''}) => { const result = ${str}; return result }`
310+
const final = `(values, methods, notTraversed, asyncIterators, engine, above, coerceArray) => ${buildState.asyncDetected ? 'async' : ''} (context ${buildState.extraArguments ? ',' + buildState.extraArguments : ''}) => { let prev; const result = ${str}; return result }`
311311
// console.log(str)
312312
// console.log(final)
313313
// eslint-disable-next-line no-eval

defaultMethods.js

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -767,16 +767,16 @@ Object.keys(defaultMethods).forEach((item) => {
767767
defaultMethods['<'].compile = function (data, buildState) {
768768
if (!Array.isArray(data)) return false
769769
if (data.length < 2) return false
770-
let res = buildState.compile`(${data[0]} < ${data[1]})`
771-
for (let i = 2; i < data.length; i++) res = buildState.compile`(${res} && ${data[i - 1]} < ${data[i]})`
770+
let res = buildState.compile`(${data[0]} < (prev = ${data[1]}))`
771+
for (let i = 2; i < data.length; i++) res = buildState.compile`(${res} && prev < ${data[i]})`
772772
return res
773773
}
774774
// @ts-ignore Allow custom attribute
775775
defaultMethods['<='].compile = function (data, buildState) {
776776
if (!Array.isArray(data)) return false
777777
if (data.length < 2) return false
778-
let res = buildState.compile`(${data[0]} <= ${data[1]})`
779-
for (let i = 2; i < data.length; i++) res = buildState.compile`(${res} && ${data[i - 1]} <= ${data[i]})`
778+
let res = buildState.compile`(${data[0]} <= (prev = ${data[1]}))`
779+
for (let i = 2; i < data.length; i++) res = buildState.compile`(${res} && prev <= ${data[i]})`
780780
return res
781781
}
782782
// @ts-ignore Allow custom attribute
@@ -797,32 +797,32 @@ defaultMethods.max.compile = function (data, buildState) {
797797
defaultMethods['>'].compile = function (data, buildState) {
798798
if (!Array.isArray(data)) return false
799799
if (data.length < 2) return false
800-
let res = buildState.compile`(${data[0]} > ${data[1]})`
801-
for (let i = 2; i < data.length; i++) res = buildState.compile`(${res} && ${data[i - 1]} > ${data[i]})`
800+
let res = buildState.compile`(${data[0]} > (prev = ${data[1]}))`
801+
for (let i = 2; i < data.length; i++) res = buildState.compile`(${res} && prev > ${data[i]})`
802802
return res
803803
}
804804
// @ts-ignore Allow custom attribute
805805
defaultMethods['>='].compile = function (data, buildState) {
806806
if (!Array.isArray(data)) return false
807807
if (data.length < 2) return false
808-
let res = buildState.compile`(${data[0]} >= ${data[1]})`
809-
for (let i = 2; i < data.length; i++) res = buildState.compile`(${res} && ${data[i - 1]} >= ${data[i]})`
808+
let res = buildState.compile`(${data[0]} >= (prev = ${data[1]}))`
809+
for (let i = 2; i < data.length; i++) res = buildState.compile`(${res} && prev >= ${data[i]})`
810810
return res
811811
}
812812
// @ts-ignore Allow custom attribute
813813
defaultMethods['=='].compile = function (data, buildState) {
814814
if (!Array.isArray(data)) return false
815815
if (data.length < 2) return false
816-
let res = buildState.compile`(${data[0]} == ${data[1]})`
817-
for (let i = 2; i < data.length; i++) res = buildState.compile`(${res} && ${data[i - 1]} == ${data[i]})`
816+
let res = buildState.compile`(${data[0]} == (prev = ${data[1]}))`
817+
for (let i = 2; i < data.length; i++) res = buildState.compile`(${res} && prev == ${data[i]})`
818818
return res
819819
}
820820
// @ts-ignore Allow custom attribute
821821
defaultMethods['!='].compile = function (data, buildState) {
822822
if (!Array.isArray(data)) return false
823823
if (data.length < 2) return false
824-
let res = buildState.compile`(${data[0]} != ${data[1]})`
825-
for (let i = 2; i < data.length; i++) res = buildState.compile`(${res} && ${data[i - 1]} != ${data[i]})`
824+
let res = buildState.compile`(${data[0]} != (prev = ${data[1]}))`
825+
for (let i = 2; i < data.length; i++) res = buildState.compile`(${res} && prev != ${data[i]})`
826826
return res
827827
}
828828
// @ts-ignore Allow custom attribute

suites/plus.json

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -93,12 +93,18 @@
9393
"decimal": true
9494
},
9595
{
96-
"description": "Plus Operator with Single Operand, Direct (String .5)",
97-
"rule": { "+": ".5" },
96+
"description": "Plus Operator with Single Operand, Direct (String 0.5)",
97+
"rule": { "+": "0.5" },
9898
"result": 0.5,
9999
"data": null,
100100
"decimal": true
101101
},
102+
{
103+
"description": "Plus Operator with Single Operand, Direct (String 1e2)",
104+
"rule": { "+": "1e2" },
105+
"result": 100,
106+
"data": null
107+
},
102108
{
103109
"description": "Plus Operator with Single Operand, Direct (String 0)",
104110
"rule": { "+": "0" },

0 commit comments

Comments
 (0)