LibJS: Make string to integer parsing for properties more strict

This does break two TypedArray test262 test but those really were not
  correct because hasProperty was not implemented
This commit is contained in:
davidot 2021-06-22 20:13:42 +02:00 committed by Linus Groh
parent 105e72cdad
commit f7e2994f35
Notes: sideshowbarker 2024-07-18 11:39:05 +09:00
3 changed files with 62 additions and 7 deletions

View file

@ -113,6 +113,19 @@ public:
bool try_coerce_into_number()
{
VERIFY(m_string_may_be_number);
if (m_string.is_empty()) {
m_string_may_be_number = false;
return false;
}
if (char first = m_string.characters()[0]; first < '0' || first > '9') {
m_string_may_be_number = false;
return false;
} else if (m_string.length() > 1 && first == '0') {
m_string_may_be_number = false;
return false;
}
i32 property_index = m_string.to_int(TrimWhitespace::No).value_or(-1);
if (property_index < 0) {
m_string_may_be_number = false;

View file

@ -0,0 +1,49 @@
describe("normal behavior", () => {
var arr = [3, 4, 5];
test("basic", () => {
expect(arr["0"]).toBe(3);
expect(arr["1"]).toBe(4);
expect(arr["2"]).toBe(5);
});
test("above length", () => {
expect(arr["3"]).toBeUndefined();
});
});
describe("strings with extra characters", () => {
var arr = [3, 4, 5];
test("whitespace", () => {
expect(arr[" 0"]).toBeUndefined();
expect(arr["0 "]).toBeUndefined();
expect(arr[" 0"]).toBeUndefined();
expect(arr[" 0 "]).toBeUndefined();
expect(arr[" 3 "]).toBeUndefined();
});
test("leading 0", () => {
expect(arr["00"]).toBeUndefined();
expect(arr["01"]).toBeUndefined();
expect(arr["02"]).toBeUndefined();
expect(arr["03"]).toBeUndefined();
});
test("leading +/-", () => {
["+", "-"].forEach(op => {
expect(arr[op + "0"]).toBeUndefined();
expect(arr[op + "1"]).toBeUndefined();
expect(arr[op + "-0"]).toBeUndefined();
expect(arr[op + "+0"]).toBeUndefined();
});
});
test("combined", () => {
expect(arr["+00"]).toBeUndefined();
expect(arr[" +0"]).toBeUndefined();
expect(arr[" +0 "]).toBeUndefined();
expect(arr[" 00 "]).toBeUndefined();
});
});

View file

@ -1,7 +0,0 @@
test("indexing the array doesn't strip whitespace if it's a number", () => {
var a = [];
a[1] = 1;
expect(a["1"]).toBe(1);
expect(a[" 1 "]).toBeUndefined();
});