Skip to content

Commit aa9722a

Browse files
authored
Merge pull request #181 from adobe/newissues
New Issues
2 parents 1dba1a8 + 301324a commit aa9722a

File tree

6 files changed

+41
-7
lines changed

6 files changed

+41
-7
lines changed

doc/spec.adoc

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -301,10 +301,11 @@ fragment EXP
301301
;
302302
----
303303

304-
Number literals follow the same syntax rules as numeric values in JSON with two exceptions:
304+
Number literals follow the same syntax rules as numeric values in JSON with three exceptions:
305305

306-
1. Number literals may omit a leading zero. For example, `.123` is not valid JSON, but is allowed as a number literal.
307-
2. The grammar construction for a number literal does not include a minus sign. Literal expressions are made negative by prefixing them with a unary minus.
306+
1. Number literals may omit a leading zero before the decimal point. For example, `.123` is not valid JSON, but is allowed as a number literal.
307+
2. Number literals may include leading zeros ahead of the integral part of the number. For example, `0123` is not valid JSON, but is allowed as a number literal.
308+
3. The grammar construction for a number literal does not include a minus sign. Literal expressions are made negative by prefixing them with a unary minus.
308309

309310
Note that number literals (and JSON numbers) allow scientific notation.
310311

src/TreeInterpreter.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ export default class TreeInterpreter {
9393
return null;
9494
}
9595

96-
visit(n, v) {
96+
visit(n, v = null) {
9797
const visitFunctions = {
9898
Identifier: this.field.bind(this),
9999
QuotedIdentifier: this.field.bind(this),

src/functions.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2181,9 +2181,9 @@ export default function functions(
21812181
const base = resolvedArgs.length > 1 ? toInteger(resolvedArgs[1]) : 10;
21822182
if (getType(num) === TYPE_STRING && base !== 10) {
21832183
let digitCheck;
2184-
if (base === 2) digitCheck = /^[01.]+$/;
2185-
else if (base === 8) digitCheck = /^[0-7.]+$/;
2186-
else if (base === 16) digitCheck = /^[0-9A-Fa-f.]+$/;
2184+
if (base === 2) digitCheck = /^\s*(\+|-)?[01.]+\s*$/;
2185+
else if (base === 8) digitCheck = /^\s*(\+|-)?[0-7.]+\s*$/;
2186+
else if (base === 16) digitCheck = /^\s*(\+|-)?[0-9A-Fa-f.]+\s*$/;
21872187
else throw evaluationError(`Invalid base: "${base}" for toNumber()`);
21882188

21892189
if (num === '') return 0;

src/stringToNumber.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ governing permissions and limitations under the License.
1313
import { typeError } from './errors.js';
1414

1515
export default function stringToNumber(n) {
16+
if (!/^\s*(-|\+)?(\d*)(\.\d+)?(e(\+|-)?\d+)?\s*$/i.test(n)) throw typeError(`Failed to convert "${n}" to number`);
1617
const ret = +n;
1718
if (Number.isNaN(ret)) {
1819
throw typeError(`Failed to convert "${n}" to number`);

test/functions.json

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -984,6 +984,28 @@
984984
"expression": "toNumber(toNum.n11, 16)",
985985
"result": 11
986986
},
987+
{
988+
"expression": "toNumber(\"0x11\")",
989+
"result": null
990+
},
991+
{
992+
"expression": "toNumber(\"0o11\")",
993+
"result": null
994+
},
995+
{
996+
"expression": "toNumber(\"0b11\")",
997+
"result": null
998+
},
999+
{ "expression": "toNumber(\" 01e01\\n\")", "result": 10},
1000+
{ "expression": "toNumber(\" 011\\n\", 2)", "result": 3},
1001+
{ "expression": "toNumber(\" -011\\n\", 2)", "result": -3},
1002+
{ "expression": "toNumber(\" +011\\n\", 2)", "result": 3},
1003+
{ "expression": "toNumber(\" 011\\n\", 16)", "result": 17},
1004+
{ "expression": "toNumber(\" -011\\n\", 16)", "result": -17},
1005+
{ "expression": "toNumber(\" +011\\n\", 16)", "result": 17},
1006+
{ "expression": "toNumber(\" 011\\n\", 8)", "result": 9},
1007+
{ "expression": "toNumber(\" -011\\n\", 8)", "result": -9},
1008+
{ "expression": "toNumber(\" +011\\n\", 8)", "result": 9},
9871009
{
9881010
"expression": "'toString'(`1.0`)",
9891011
"error": "SyntaxError"

test/tests.json

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,12 @@
146146
{ "expression": "sum([2,\"4\",6,`true`])", "result": 13 },
147147
{ "expression": "(3 + 2) * 10 / 2 - 5", "result": 20 },
148148
{ "expression": "2 * \"$2\" + `null`", "error": "TypeError" },
149+
{ "expression": "\"0x11\" * 1", "error": "TypeError"},
150+
{ "expression": "\"0b11\" * 1", "error": "TypeError"},
151+
{ "expression": "\"0o11\" * 1", "error": "TypeError"},
152+
{ "expression": "1+\"01e01\"", "result": 11},
153+
{ "expression": "1*\" +011e+01\\n\"", "result": 110},
154+
{ "expression": "1*\" -011e-01\\n\"", "result": -1.1},
149155
{ "expression": "1 < 2", "result": true },
150156
{ "expression": "1 > 2", "result": false },
151157
{ "expression": "12 >= 12", "result": true },
@@ -1573,6 +1579,10 @@
15731579
"expression": "merge(register(\"_p1\", &42), register(\"_p2\", &43), {r: _p1() + _p2()})",
15741580
"result": { "r": 85 }
15751581
},
1582+
{
1583+
"expression": "register(\"_identity\", &@) || _identity()",
1584+
"result": null
1585+
},
15761586
{
15771587
"expression": "register(\"\", &42)",
15781588
"error": "FunctionError"

0 commit comments

Comments
 (0)