From 12d237a656d1fd3bbc66a3db9f501c43dd0b70a5 Mon Sep 17 00:00:00 2001 From: Thomas Weber Date: Fri, 28 Aug 2020 20:53:29 -0500 Subject: [PATCH] js: Use native >, <, === when possible --- src/compiler/jsgen.js | 30 ++++++++++++++++++++++++------ 1 file changed, 24 insertions(+), 6 deletions(-) diff --git a/src/compiler/jsgen.js b/src/compiler/jsgen.js index b9d8637c..cb3061f3 100644 --- a/src/compiler/jsgen.js +++ b/src/compiler/jsgen.js @@ -251,20 +251,38 @@ class ScriptCompiler { return new TypedInput(`(Math.round(Math.cos((Math.PI * ${this.descendInput(node.value).asNumber()}) / 180) * 1e10) / 1e10)`, TYPE_NUMBER); case 'op.divide': return new TypedInput(`(${this.descendInput(node.left).asNumber()} / ${this.descendInput(node.right).asNumber()})`, TYPE_NUMBER_NAN); - case 'op.equals': - return new TypedInput(`compareEqual(${this.descendInput(node.left).asUnknown()}, ${this.descendInput(node.right).asUnknown()})`, TYPE_BOOLEAN); + case 'op.equals': { + const left = this.descendInput(node.left); + const right = this.descendInput(node.right); + if (left.isAlwaysNumber() && right.isAlwaysNumber()) { + return new TypedInput(`(${left.asNumber()} === ${right.asNumber()})`, TYPE_BOOLEAN); + } + return new TypedInput(`compareEqual(${left.asUnknown()}, ${right.asUnknown()})`, TYPE_BOOLEAN); + } case 'op.e^': return new TypedInput(`Math.exp(${this.descendInput(node.value).asNumber()})`, TYPE_NUMBER); case 'op.floor': return new TypedInput(`Math.floor(${this.descendInput(node.value).asNumber()})`, TYPE_NUMBER); - case 'op.greater': - return new TypedInput(`compareGreaterThan(${this.descendInput(node.left).asUnknown()}, ${this.descendInput(node.right).asUnknown()})`, TYPE_BOOLEAN); + case 'op.greater': { + const left = this.descendInput(node.left); + const right = this.descendInput(node.right); + if (left.isAlwaysNumber() && right.isAlwaysNumber()) { + return new TypedInput(`(${left.asNumber()} > ${right.asNumber()})`, TYPE_BOOLEAN); + } + return new TypedInput(`compareGreaterThan(${left.asUnknown()}, ${right.asUnknown()})`, TYPE_BOOLEAN); + } case 'op.join': return new TypedInput(`(${this.descendInput(node.left).asString()} + ${this.descendInput(node.right).asString()})`, TYPE_STRING); case 'op.length': return new TypedInput(`${this.descendInput(node.string).asString()}.length`, TYPE_NUMBER); - case 'op.less': - return new TypedInput(`compareLessThan(${this.descendInput(node.left).asUnknown()}, ${this.descendInput(node.right).asUnknown()})`, TYPE_BOOLEAN); + case 'op.less': { + const left = this.descendInput(node.left); + const right = this.descendInput(node.right); + if (left.isAlwaysNumber() && right.isAlwaysNumber()) { + return new TypedInput(`(${left.asNumber()} < ${right.asNumber()})`, TYPE_BOOLEAN); + } + return new TypedInput(`compareLessThan(${left.asUnknown()}, ${right.asUnknown()})`, TYPE_BOOLEAN); + } case 'op.letterOf': return new TypedInput(`((${this.descendInput(node.string).asString()})[(${this.descendInput(node.letter).asNumber()} | 0) - 1] || "")`, TYPE_STRING); case 'op.ln':