Skip to content

Commit 6fa9215

Browse files
committed
Array testcase improvements
* Add bug testcase for svaaralaGH-2023. * Testcase coverage improvement for Object.defineProperty() and array part handling.
1 parent 5b40e9b commit 6fa9215

4 files changed

Lines changed: 120 additions & 0 deletions

File tree

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
/*===
2+
10000001
3+
10000001
4+
25
5+
call count: 1
6+
done
7+
===*/
8+
9+
try {
10+
var callCount = 0;
11+
var a = []; a[1e7] = 5;
12+
print(a.length);
13+
var b = a.map(function (v) { callCount++; return v*v; });
14+
print(b.length);
15+
print(b[1e7]);
16+
print('call count: ' + callCount);
17+
} catch (e) {
18+
print(e.stack || e);
19+
}
20+
21+
print('done');
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
/*
2+
* Object.defineProperty() array part behavior coverage.
3+
*/
4+
5+
/*===
6+
1000
7+
foo foo undefined undefined
8+
1000000001
9+
foo foo undefined bar
10+
1000
11+
foo foo undefined undefined
12+
1001
13+
foo foo bar undefined
14+
999
15+
foo undefined foo undefined undefined undefined
16+
done
17+
===*/
18+
19+
function test() {
20+
var A;
21+
var i;
22+
23+
// These maintain the array part.
24+
A = [];
25+
for (i = 0; i < 1000; i++) {
26+
Object.defineProperty(A, i, { value: 'foo', writable: true, enumerable: true, configurable: true });
27+
}
28+
print(A.length);
29+
print(A[0], A[999], A[1000], A[1e9]);
30+
//print(JSON.stringify(Duktape.info(A)));
31+
32+
// This abandons it, array would become too sparse.
33+
Object.defineProperty(A, 1e9, { value: 'bar', writable: true, enumerable: true, configurable: true });
34+
print(A.length);
35+
print(A[0], A[999], A[1000], A[1e9]);
36+
//print(JSON.stringify(Duktape.info(A)));
37+
38+
// These maintain the array part.
39+
A = [];
40+
for (i = 0; i < 1000; i++) {
41+
Object.defineProperty(A, i, { value: 'foo', writable: true, enumerable: true, configurable: true });
42+
}
43+
print(A.length);
44+
print(A[0], A[999], A[1000], A[1e9]);
45+
//print(JSON.stringify(Duktape.info(A)));
46+
47+
// This abandons it, non-standard attributes.
48+
Object.defineProperty(A, 1000, { value: 'bar', writable: true, enumerable: false, configurable: true });
49+
print(A.length);
50+
print(A[0], A[999], A[1000], A[1e9]);
51+
//print(JSON.stringify(Duktape.info(A)));
52+
53+
// These maintain the array part, despite there being gaps.
54+
A = [];
55+
for (i = 0; i < 1000; i += 2) {
56+
Object.defineProperty(A, i, { value: 'foo', writable: true, enumerable: true, configurable: true });
57+
}
58+
print(A.length);
59+
print(A[0], A[1], A[998], A[999], A[1000], A[1e9]);
60+
//print(JSON.stringify(Duktape.info(A)));
61+
}
62+
63+
try {
64+
test();
65+
} catch (e) {
66+
print(e.stack || e);
67+
}
68+
print('done');
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
/*
2+
* https://github.com/svaarala/duktape/issues/2023
3+
*
4+
* Modified variant.
5+
*/
6+
7+
/*===
8+
done
9+
===*/
10+
11+
var input = [];
12+
input[65536] = 0;
13+
var output = input.map(Math.cos);
14+
15+
print('done');
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
/*
2+
* https://github.com/svaarala/duktape/issues/2023
3+
*/
4+
5+
/*===
6+
done
7+
===*/
8+
9+
function mapchar ( v ) { }
10+
var input ;
11+
var round ;
12+
input = [ ] ;
13+
input[ 65536 ] = 0 ;
14+
input.map( mapchar ).join( '' );
15+
16+
print('done');

0 commit comments

Comments
 (0)