mirror of https://github.com/svaarala/duktape.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
2053 lines
36 KiB
2053 lines
36 KiB
/*
|
|
* Test that duk_hbufferobject is memory safe when the underlying dynamic
|
|
* buffer is a dynamic buffer that is resized after creation. In particular,
|
|
* the testcase attempts to cover memory safety issues related to an
|
|
* underlying buffer not covering the logical duk_hbufferobject view.
|
|
*
|
|
* The exact results of "uncovered" operations are not very important and
|
|
* not always intuitive: an uncovered buffer is not considered normal buffer
|
|
* usage but its memory safety matters.
|
|
*/
|
|
|
|
/*---
|
|
{
|
|
"endianess": "little"
|
|
}
|
|
---*/
|
|
|
|
/*
|
|
* Helpers
|
|
*/
|
|
|
|
static void setup_nodejs_buffer(duk_context *ctx, duk_idx_t idx) {
|
|
duk_size_t sz;
|
|
|
|
idx = duk_require_normalize_index(ctx, idx);
|
|
(void) duk_require_buffer(ctx, idx, &sz);
|
|
duk_push_buffer_object(ctx, idx, 0, sz, DUK_BUFOBJ_NODEJS_BUFFER);
|
|
}
|
|
|
|
static void setup_nodejs_buffer_slice(duk_context *ctx, duk_idx_t idx, duk_int_t start, duk_int_t end) {
|
|
duk_size_t sz;
|
|
|
|
idx = duk_require_normalize_index(ctx, idx);
|
|
(void) duk_require_buffer(ctx, idx, &sz);
|
|
duk_eval_string(ctx,
|
|
"(function (buf, start, end) {\n"
|
|
" return buf.slice(start, end);\n"
|
|
"})\n");
|
|
duk_push_buffer_object(ctx, idx, 0, sz, DUK_BUFOBJ_NODEJS_BUFFER);
|
|
duk_push_int(ctx, start);
|
|
duk_push_int(ctx, end);
|
|
duk_call(ctx, 3);
|
|
}
|
|
|
|
static void setup_arraybuffer(duk_context *ctx, duk_idx_t idx) {
|
|
duk_size_t sz;
|
|
|
|
idx = duk_require_normalize_index(ctx, idx);
|
|
(void) duk_require_buffer(ctx, idx, &sz);
|
|
duk_push_buffer_object(ctx, idx, 0, sz, DUK_BUFOBJ_ARRAYBUFFER);
|
|
}
|
|
|
|
static void setup_typedarray(duk_context *ctx, duk_idx_t idx, const char *name) {
|
|
idx = duk_require_normalize_index(ctx, idx);
|
|
duk_push_sprintf(ctx,
|
|
"(function (plain_buffer) {\n"
|
|
" return new %s(plain_buffer.buffer);\n"
|
|
"})\n", name);
|
|
duk_eval(ctx);
|
|
duk_dup(ctx, idx);
|
|
duk_call(ctx, 1);
|
|
}
|
|
|
|
static void setup_typedarray_slice(duk_context *ctx, duk_idx_t idx, const char *name, duk_int_t start, duk_int_t end) {
|
|
idx = duk_require_normalize_index(ctx, idx);
|
|
duk_push_sprintf(ctx,
|
|
"(function (plain_buffer, start, length) {\n"
|
|
" return new %s(plain_buffer.buffer, start, length);\n"
|
|
"})\n", name);
|
|
duk_eval(ctx);
|
|
duk_dup(ctx, idx);
|
|
duk_push_int(ctx, start);
|
|
duk_push_int(ctx, end);
|
|
duk_call(ctx, 3);
|
|
}
|
|
|
|
/*
|
|
* Indexed writes
|
|
*/
|
|
|
|
/*===
|
|
*** test_nodejs_buffer_indexed_1a (duk_safe_call)
|
|
length 100
|
|
1
|
|
2
|
|
3
|
|
0 1
|
|
99 2
|
|
100 3
|
|
length 100
|
|
10
|
|
11
|
|
12
|
|
13
|
|
14
|
|
0 10
|
|
94 11
|
|
95 0
|
|
99 0
|
|
100 14
|
|
final top: 2
|
|
==> rc=0, result='undefined'
|
|
*** test_nodejs_buffer_indexed_1b (duk_safe_call)
|
|
length 100
|
|
1
|
|
2
|
|
3
|
|
0 1
|
|
99 2
|
|
100 3
|
|
length 100
|
|
10
|
|
11
|
|
12
|
|
13
|
|
14
|
|
0 10
|
|
94 11
|
|
95 0
|
|
99 0
|
|
100 14
|
|
final top: 2
|
|
==> rc=0, result='undefined'
|
|
*** test_arraybuffer_indexed_1a (duk_safe_call)
|
|
length undefined
|
|
1
|
|
2
|
|
3
|
|
0 1
|
|
99 2
|
|
100 3
|
|
length undefined
|
|
10
|
|
11
|
|
12
|
|
13
|
|
14
|
|
0 10
|
|
94 11
|
|
95 12
|
|
99 13
|
|
100 14
|
|
final top: 2
|
|
==> rc=0, result='undefined'
|
|
*** test_uint8array_indexed_1a (duk_safe_call)
|
|
length 100
|
|
1
|
|
2
|
|
3
|
|
0 1
|
|
99 2
|
|
100 3
|
|
length 100
|
|
10
|
|
11
|
|
12
|
|
13
|
|
14
|
|
0 10
|
|
94 11
|
|
95 0
|
|
99 0
|
|
100 14
|
|
final top: 2
|
|
==> rc=0, result='undefined'
|
|
*** test_uint8array_indexed_1b (duk_safe_call)
|
|
length 100
|
|
1
|
|
2
|
|
3
|
|
0 1
|
|
99 2
|
|
100 3
|
|
length 100
|
|
10
|
|
11
|
|
12
|
|
13
|
|
14
|
|
0 10
|
|
94 11
|
|
95 0
|
|
99 0
|
|
100 14
|
|
final top: 2
|
|
==> rc=0, result='undefined'
|
|
*** test_uint16array_indexed_1a (duk_safe_call)
|
|
length 100
|
|
1
|
|
2
|
|
3
|
|
0 1
|
|
99 2
|
|
100 3
|
|
length 100
|
|
10
|
|
11
|
|
12
|
|
13
|
|
14
|
|
0 10
|
|
94 11
|
|
95 0
|
|
99 0
|
|
100 14
|
|
final top: 2
|
|
==> rc=0, result='undefined'
|
|
*** test_uint16array_indexed_1b (duk_safe_call)
|
|
length 100
|
|
1
|
|
2
|
|
3
|
|
0 1
|
|
99 2
|
|
100 3
|
|
length 100
|
|
10
|
|
11
|
|
12
|
|
13
|
|
14
|
|
0 10
|
|
94 11
|
|
95 0
|
|
99 0
|
|
100 14
|
|
final top: 2
|
|
==> rc=0, result='undefined'
|
|
*** test_uint32array_indexed_1a (duk_safe_call)
|
|
length 100
|
|
1
|
|
2
|
|
3
|
|
0 1
|
|
99 2
|
|
100 3
|
|
length 100
|
|
10
|
|
11
|
|
12
|
|
13
|
|
14
|
|
0 10
|
|
94 11
|
|
95 0
|
|
99 0
|
|
100 14
|
|
final top: 2
|
|
==> rc=0, result='undefined'
|
|
*** test_uint32array_indexed_1b (duk_safe_call)
|
|
length 100
|
|
1
|
|
2
|
|
3
|
|
0 1
|
|
99 2
|
|
100 3
|
|
length 100
|
|
10
|
|
11
|
|
12
|
|
13
|
|
14
|
|
0 10
|
|
94 11
|
|
95 0
|
|
99 0
|
|
100 14
|
|
final top: 2
|
|
==> rc=0, result='undefined'
|
|
*** test_float32array_indexed_1a (duk_safe_call)
|
|
length 100
|
|
1
|
|
2
|
|
3
|
|
0 1
|
|
99 2
|
|
100 3
|
|
length 100
|
|
10
|
|
11
|
|
12
|
|
13
|
|
14
|
|
0 10
|
|
94 11
|
|
95 0
|
|
99 0
|
|
100 14
|
|
final top: 2
|
|
==> rc=0, result='undefined'
|
|
*** test_float32array_indexed_1b (duk_safe_call)
|
|
length 100
|
|
1
|
|
2
|
|
3
|
|
0 1
|
|
99 2
|
|
100 3
|
|
length 100
|
|
10
|
|
11
|
|
12
|
|
13
|
|
14
|
|
0 10
|
|
94 11
|
|
95 0
|
|
99 0
|
|
100 14
|
|
final top: 2
|
|
==> rc=0, result='undefined'
|
|
*** test_float64array_indexed_1a (duk_safe_call)
|
|
length 100
|
|
1
|
|
2
|
|
3
|
|
0 1
|
|
99 2
|
|
100 3
|
|
length 100
|
|
10
|
|
11
|
|
12
|
|
13
|
|
14
|
|
0 10
|
|
94 11
|
|
95 0
|
|
99 0
|
|
100 14
|
|
final top: 2
|
|
==> rc=0, result='undefined'
|
|
*** test_float64array_indexed_1b (duk_safe_call)
|
|
length 100
|
|
1
|
|
2
|
|
3
|
|
0 1
|
|
99 2
|
|
100 3
|
|
length 100
|
|
10
|
|
11
|
|
12
|
|
13
|
|
14
|
|
0 10
|
|
94 11
|
|
95 0
|
|
99 0
|
|
100 14
|
|
final top: 2
|
|
==> rc=0, result='undefined'
|
|
===*/
|
|
|
|
static void shared_read_write_index(duk_context *ctx, duk_size_t resize_to) {
|
|
/* [ plain_buffer buffer ] */
|
|
|
|
duk_eval_string(ctx,
|
|
"(function (buf) {\n"
|
|
" print('length', buf.length);\n"
|
|
" print(buf[0] = 1);\n"
|
|
" print(buf[99] = 2);\n"
|
|
" print(buf[100] = 3);\n" /* outside 'limit', not virtual -> becomes concrete property */
|
|
" print(0, buf[0]);\n" /* in buffer */
|
|
" print(99, buf[99]);\n" /* in buffer */
|
|
" print(100, buf[100]);\n" /* outside duk_hbufferobject 'limit', not virtual */
|
|
"})\n");
|
|
duk_dup(ctx, 1);
|
|
duk_call(ctx, 1);
|
|
duk_pop(ctx);
|
|
|
|
/* Resize to fewer number of bytes. */
|
|
|
|
duk_resize_buffer(ctx, 0, resize_to);
|
|
|
|
/* Reads inside the duk_hbufferobject limit but outside the underlying
|
|
* buffer return zero; writes are ignored.
|
|
*/
|
|
|
|
duk_eval_string(ctx,
|
|
"(function (buf) {\n"
|
|
" print('length', buf.length);\n"
|
|
" print(buf[0] = 10);\n"
|
|
" print(buf[94] = 11);\n"
|
|
" print(buf[95] = 12);\n"
|
|
" print(buf[99] = 13);\n"
|
|
" print(buf[100] = 14);\n"
|
|
" print(0, buf[0]);\n" /* in buffer */
|
|
" print(94, buf[94]);\n" /* in buffer */
|
|
" print(95, buf[95]);\n" /* inside duk_hbufferobject 'limit', but outside buffer */
|
|
" print(99, buf[99]);\n" /* inside duk_hbufferobject 'limit', but outside buffer */
|
|
" print(100, buf[100]);\n" /* outside duk_hbufferobject 'limit', not virtual */
|
|
"})\n");
|
|
duk_dup(ctx, 1);
|
|
duk_call(ctx, 1);
|
|
duk_pop(ctx);
|
|
}
|
|
|
|
/* Node.js Buffer, "full slice" */
|
|
static duk_ret_t test_nodejs_buffer_indexed_1a(duk_context *ctx, void *udata) {
|
|
(void) udata;
|
|
|
|
duk_push_dynamic_buffer(ctx, 100);
|
|
setup_nodejs_buffer(ctx, -1);
|
|
shared_read_write_index(ctx, 95);
|
|
|
|
printf("final top: %ld\n", (long) duk_get_top(ctx));
|
|
return 0;
|
|
}
|
|
|
|
/* Node.js Buffer, "partial slice" */
|
|
static duk_ret_t test_nodejs_buffer_indexed_1b(duk_context *ctx, void *udata) {
|
|
(void) udata;
|
|
|
|
duk_push_dynamic_buffer(ctx, 150);
|
|
setup_nodejs_buffer_slice(ctx, -1, 30, 130);
|
|
shared_read_write_index(ctx, 30 + 95);
|
|
|
|
printf("final top: %ld\n", (long) duk_get_top(ctx));
|
|
return 0;
|
|
}
|
|
|
|
/* ArrayBuffer, "full slice" */
|
|
static duk_ret_t test_arraybuffer_indexed_1a(duk_context *ctx, void *udata) {
|
|
(void) udata;
|
|
|
|
duk_push_dynamic_buffer(ctx, 100);
|
|
setup_arraybuffer(ctx, -1);
|
|
shared_read_write_index(ctx, 95);
|
|
|
|
printf("final top: %ld\n", (long) duk_get_top(ctx));
|
|
return 0;
|
|
}
|
|
|
|
/* Can't create slices for ArrayBuffer directly. */
|
|
|
|
/* Uint8Array, "full slice" */
|
|
static duk_ret_t test_uint8array_indexed_1a(duk_context *ctx, void *udata) {
|
|
(void) udata;
|
|
|
|
duk_push_dynamic_buffer(ctx, 100);
|
|
setup_typedarray(ctx, -1, "Uint8Array");
|
|
shared_read_write_index(ctx, 95);
|
|
|
|
printf("final top: %ld\n", (long) duk_get_top(ctx));
|
|
return 0;
|
|
}
|
|
|
|
/* Uint8Array, "partial slice" */
|
|
static duk_ret_t test_uint8array_indexed_1b(duk_context *ctx, void *udata) {
|
|
(void) udata;
|
|
|
|
duk_push_dynamic_buffer(ctx, 150);
|
|
setup_typedarray_slice(ctx, -1, "Uint8Array", 30, 100);
|
|
shared_read_write_index(ctx, 30 + 95);
|
|
|
|
printf("final top: %ld\n", (long) duk_get_top(ctx));
|
|
return 0;
|
|
}
|
|
|
|
/* Uint16Array, "full slice" */
|
|
static duk_ret_t test_uint16array_indexed_1a(duk_context *ctx, void *udata) {
|
|
(void) udata;
|
|
|
|
duk_push_dynamic_buffer(ctx, 200);
|
|
setup_typedarray(ctx, -1, "Uint16Array");
|
|
shared_read_write_index(ctx, 95 * 2);
|
|
|
|
printf("final top: %ld\n", (long) duk_get_top(ctx));
|
|
return 0;
|
|
}
|
|
|
|
/* Uint16Array, "partial slice" */
|
|
static duk_ret_t test_uint16array_indexed_1b(duk_context *ctx, void *udata) {
|
|
(void) udata;
|
|
|
|
duk_push_dynamic_buffer(ctx, 300);
|
|
setup_typedarray_slice(ctx, -1, "Uint16Array", 60, 100);
|
|
shared_read_write_index(ctx, 60 + 95 * 2);
|
|
|
|
printf("final top: %ld\n", (long) duk_get_top(ctx));
|
|
return 0;
|
|
}
|
|
|
|
/* Uint32Array, "full slice" */
|
|
static duk_ret_t test_uint32array_indexed_1a(duk_context *ctx, void *udata) {
|
|
(void) udata;
|
|
|
|
duk_push_dynamic_buffer(ctx, 400);
|
|
setup_typedarray(ctx, -1, "Uint32Array");
|
|
shared_read_write_index(ctx, 95 * 4);
|
|
|
|
printf("final top: %ld\n", (long) duk_get_top(ctx));
|
|
return 0;
|
|
}
|
|
|
|
/* Uint32Array, "partial slice" */
|
|
static duk_ret_t test_uint32array_indexed_1b(duk_context *ctx, void *udata) {
|
|
(void) udata;
|
|
|
|
duk_push_dynamic_buffer(ctx, 600);
|
|
setup_typedarray_slice(ctx, -1, "Uint32Array", 120, 100);
|
|
shared_read_write_index(ctx, 120 + 95 * 4);
|
|
|
|
printf("final top: %ld\n", (long) duk_get_top(ctx));
|
|
return 0;
|
|
}
|
|
|
|
/* Float32Array, "full slice" */
|
|
static duk_ret_t test_float32array_indexed_1a(duk_context *ctx, void *udata) {
|
|
(void) udata;
|
|
|
|
duk_push_dynamic_buffer(ctx, 400);
|
|
setup_typedarray(ctx, -1, "Float32Array");
|
|
shared_read_write_index(ctx, 95 * 4);
|
|
|
|
printf("final top: %ld\n", (long) duk_get_top(ctx));
|
|
return 0;
|
|
}
|
|
|
|
/* Float32Array, "partial slice" */
|
|
static duk_ret_t test_float32array_indexed_1b(duk_context *ctx, void *udata) {
|
|
(void) udata;
|
|
|
|
duk_push_dynamic_buffer(ctx, 600);
|
|
setup_typedarray_slice(ctx, -1, "Float32Array", 120, 100);
|
|
shared_read_write_index(ctx, 120 + 95 * 4);
|
|
|
|
printf("final top: %ld\n", (long) duk_get_top(ctx));
|
|
return 0;
|
|
}
|
|
|
|
/* Float64Array, "full slice" */
|
|
static duk_ret_t test_float64array_indexed_1a(duk_context *ctx, void *udata) {
|
|
(void) udata;
|
|
|
|
duk_push_dynamic_buffer(ctx, 800);
|
|
setup_typedarray(ctx, -1, "Float64Array");
|
|
shared_read_write_index(ctx, 95 * 8);
|
|
|
|
printf("final top: %ld\n", (long) duk_get_top(ctx));
|
|
return 0;
|
|
}
|
|
|
|
/* Float64Array, "partial slice" */
|
|
static duk_ret_t test_float64array_indexed_1b(duk_context *ctx, void *udata) {
|
|
(void) udata;
|
|
|
|
duk_push_dynamic_buffer(ctx, 1200);
|
|
setup_typedarray_slice(ctx, -1, "Float64Array", 240, 100);
|
|
shared_read_write_index(ctx, 240 + 95 * 8);
|
|
|
|
printf("final top: %ld\n", (long) duk_get_top(ctx));
|
|
return 0;
|
|
}
|
|
|
|
/*===
|
|
*** test_json_serialize_1 (duk_safe_call)
|
|
resize to 20
|
|
[{"type":"Buffer","data":[64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83]},{"type":"Buffer","data":[67,68]},{},{"0":64,"1":65,"2":66,"3":67,"4":68,"5":69,"6":70,"7":71,"8":72,"9":73,"10":74,"11":75,"12":76,"13":77,"14":78,"15":79,"16":80,"17":81,"18":82,"19":83},{"0":66,"1":67,"2":68,"3":69,"4":70,"5":71},{"0":1128415552,"1":1195787588,"2":1263159624,"3":1330531660,"4":1397903696},{"0":1195787588}]
|
|
[{type:"Buffer",data:[64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83]},{type:"Buffer",data:[67,68]},|404142434445464748494a4b4c4d4e4f50515253|,|404142434445464748494a4b4c4d4e4f50515253|,|424344454647|,|404142434445464748494a4b4c4d4e4f50515253|,|44454647|]
|
|
resize to 19
|
|
[null,{"type":"Buffer","data":[67,68]},{},{"0":64,"1":65,"2":66,"3":67,"4":68,"5":69,"6":70,"7":71,"8":72,"9":73,"10":74,"11":75,"12":76,"13":77,"14":78,"15":79,"16":80,"17":81,"18":82,"19":0},{"0":66,"1":67,"2":68,"3":69,"4":70,"5":71},{"0":1128415552,"1":1195787588,"2":1263159624,"3":1330531660,"4":0},{"0":1195787588}]
|
|
[null,{type:"Buffer",data:[67,68]},null,null,|424344454647|,null,|44454647|]
|
|
resize to 18
|
|
[null,{"type":"Buffer","data":[67,68]},{},{"0":64,"1":65,"2":66,"3":67,"4":68,"5":69,"6":70,"7":71,"8":72,"9":73,"10":74,"11":75,"12":76,"13":77,"14":78,"15":79,"16":80,"17":81,"18":0,"19":0},{"0":66,"1":67,"2":68,"3":69,"4":70,"5":71},{"0":1128415552,"1":1195787588,"2":1263159624,"3":1330531660,"4":0},{"0":1195787588}]
|
|
[null,{type:"Buffer",data:[67,68]},null,null,|424344454647|,null,|44454647|]
|
|
resize to 17
|
|
[null,{"type":"Buffer","data":[67,68]},{},{"0":64,"1":65,"2":66,"3":67,"4":68,"5":69,"6":70,"7":71,"8":72,"9":73,"10":74,"11":75,"12":76,"13":77,"14":78,"15":79,"16":80,"17":0,"18":0,"19":0},{"0":66,"1":67,"2":68,"3":69,"4":70,"5":71},{"0":1128415552,"1":1195787588,"2":1263159624,"3":1330531660,"4":0},{"0":1195787588}]
|
|
[null,{type:"Buffer",data:[67,68]},null,null,|424344454647|,null,|44454647|]
|
|
resize to 16
|
|
[null,{"type":"Buffer","data":[67,68]},{},{"0":64,"1":65,"2":66,"3":67,"4":68,"5":69,"6":70,"7":71,"8":72,"9":73,"10":74,"11":75,"12":76,"13":77,"14":78,"15":79,"16":0,"17":0,"18":0,"19":0},{"0":66,"1":67,"2":68,"3":69,"4":70,"5":71},{"0":1128415552,"1":1195787588,"2":1263159624,"3":1330531660,"4":0},{"0":1195787588}]
|
|
[null,{type:"Buffer",data:[67,68]},null,null,|424344454647|,null,|44454647|]
|
|
resize to 15
|
|
[null,{"type":"Buffer","data":[67,68]},{},{"0":64,"1":65,"2":66,"3":67,"4":68,"5":69,"6":70,"7":71,"8":72,"9":73,"10":74,"11":75,"12":76,"13":77,"14":78,"15":0,"16":0,"17":0,"18":0,"19":0},{"0":66,"1":67,"2":68,"3":69,"4":70,"5":71},{"0":1128415552,"1":1195787588,"2":1263159624,"3":0,"4":0},{"0":1195787588}]
|
|
[null,{type:"Buffer",data:[67,68]},null,null,|424344454647|,null,|44454647|]
|
|
resize to 14
|
|
[null,{"type":"Buffer","data":[67,68]},{},{"0":64,"1":65,"2":66,"3":67,"4":68,"5":69,"6":70,"7":71,"8":72,"9":73,"10":74,"11":75,"12":76,"13":77,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0},{"0":66,"1":67,"2":68,"3":69,"4":70,"5":71},{"0":1128415552,"1":1195787588,"2":1263159624,"3":0,"4":0},{"0":1195787588}]
|
|
[null,{type:"Buffer",data:[67,68]},null,null,|424344454647|,null,|44454647|]
|
|
resize to 13
|
|
[null,{"type":"Buffer","data":[67,68]},{},{"0":64,"1":65,"2":66,"3":67,"4":68,"5":69,"6":70,"7":71,"8":72,"9":73,"10":74,"11":75,"12":76,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0},{"0":66,"1":67,"2":68,"3":69,"4":70,"5":71},{"0":1128415552,"1":1195787588,"2":1263159624,"3":0,"4":0},{"0":1195787588}]
|
|
[null,{type:"Buffer",data:[67,68]},null,null,|424344454647|,null,|44454647|]
|
|
resize to 12
|
|
[null,{"type":"Buffer","data":[67,68]},{},{"0":64,"1":65,"2":66,"3":67,"4":68,"5":69,"6":70,"7":71,"8":72,"9":73,"10":74,"11":75,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0},{"0":66,"1":67,"2":68,"3":69,"4":70,"5":71},{"0":1128415552,"1":1195787588,"2":1263159624,"3":0,"4":0},{"0":1195787588}]
|
|
[null,{type:"Buffer",data:[67,68]},null,null,|424344454647|,null,|44454647|]
|
|
resize to 11
|
|
[null,{"type":"Buffer","data":[67,68]},{},{"0":64,"1":65,"2":66,"3":67,"4":68,"5":69,"6":70,"7":71,"8":72,"9":73,"10":74,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0},{"0":66,"1":67,"2":68,"3":69,"4":70,"5":71},{"0":1128415552,"1":1195787588,"2":0,"3":0,"4":0},{"0":1195787588}]
|
|
[null,{type:"Buffer",data:[67,68]},null,null,|424344454647|,null,|44454647|]
|
|
resize to 10
|
|
[null,{"type":"Buffer","data":[67,68]},{},{"0":64,"1":65,"2":66,"3":67,"4":68,"5":69,"6":70,"7":71,"8":72,"9":73,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0},{"0":66,"1":67,"2":68,"3":69,"4":70,"5":71},{"0":1128415552,"1":1195787588,"2":0,"3":0,"4":0},{"0":1195787588}]
|
|
[null,{type:"Buffer",data:[67,68]},null,null,|424344454647|,null,|44454647|]
|
|
resize to 9
|
|
[null,{"type":"Buffer","data":[67,68]},{},{"0":64,"1":65,"2":66,"3":67,"4":68,"5":69,"6":70,"7":71,"8":72,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0},{"0":66,"1":67,"2":68,"3":69,"4":70,"5":71},{"0":1128415552,"1":1195787588,"2":0,"3":0,"4":0},{"0":1195787588}]
|
|
[null,{type:"Buffer",data:[67,68]},null,null,|424344454647|,null,|44454647|]
|
|
resize to 8
|
|
[null,{"type":"Buffer","data":[67,68]},{},{"0":64,"1":65,"2":66,"3":67,"4":68,"5":69,"6":70,"7":71,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0},{"0":66,"1":67,"2":68,"3":69,"4":70,"5":71},{"0":1128415552,"1":1195787588,"2":0,"3":0,"4":0},{"0":1195787588}]
|
|
[null,{type:"Buffer",data:[67,68]},null,null,|424344454647|,null,|44454647|]
|
|
resize to 7
|
|
[null,{"type":"Buffer","data":[67,68]},{},{"0":64,"1":65,"2":66,"3":67,"4":68,"5":69,"6":70,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0},{"0":66,"1":67,"2":68,"3":69,"4":70,"5":0},{"0":1128415552,"1":0,"2":0,"3":0,"4":0},{"0":0}]
|
|
[null,{type:"Buffer",data:[67,68]},null,null,null,null,null]
|
|
resize to 6
|
|
[null,{"type":"Buffer","data":[67,68]},{},{"0":64,"1":65,"2":66,"3":67,"4":68,"5":69,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0},{"0":66,"1":67,"2":68,"3":69,"4":0,"5":0},{"0":1128415552,"1":0,"2":0,"3":0,"4":0},{"0":0}]
|
|
[null,{type:"Buffer",data:[67,68]},null,null,null,null,null]
|
|
resize to 5
|
|
[null,{"type":"Buffer","data":[67,68]},{},{"0":64,"1":65,"2":66,"3":67,"4":68,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0},{"0":66,"1":67,"2":68,"3":0,"4":0,"5":0},{"0":1128415552,"1":0,"2":0,"3":0,"4":0},{"0":0}]
|
|
[null,{type:"Buffer",data:[67,68]},null,null,null,null,null]
|
|
resize to 4
|
|
[null,null,{},{"0":64,"1":65,"2":66,"3":67,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0},{"0":66,"1":67,"2":0,"3":0,"4":0,"5":0},{"0":1128415552,"1":0,"2":0,"3":0,"4":0},{"0":0}]
|
|
[null,null,null,null,null,null,null]
|
|
resize to 3
|
|
[null,null,{},{"0":64,"1":65,"2":66,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0},{"0":66,"1":0,"2":0,"3":0,"4":0,"5":0},{"0":0,"1":0,"2":0,"3":0,"4":0},{"0":0}]
|
|
[null,null,null,null,null,null,null]
|
|
resize to 2
|
|
[null,null,{},{"0":64,"1":65,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0},{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0},{"0":0,"1":0,"2":0,"3":0,"4":0},{"0":0}]
|
|
[null,null,null,null,null,null,null]
|
|
resize to 1
|
|
[null,null,{},{"0":64,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0},{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0},{"0":0,"1":0,"2":0,"3":0,"4":0},{"0":0}]
|
|
[null,null,null,null,null,null,null]
|
|
resize to 0
|
|
[null,null,{},{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0},{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0},{"0":0,"1":0,"2":0,"3":0,"4":0},{"0":0}]
|
|
[null,null,null,null,null,null,null]
|
|
final top: 2
|
|
==> rc=0, result='undefined'
|
|
===*/
|
|
|
|
static duk_ret_t test_json_serialize_1(duk_context *ctx, void *udata) {
|
|
unsigned char *data;
|
|
int i;
|
|
duk_uarridx_t arridx = 0;
|
|
|
|
(void) udata;
|
|
|
|
data = (unsigned char *) duk_push_dynamic_buffer(ctx, 20);
|
|
for (i = 0; i < 20; i++) {
|
|
data[i] = 0x40 + i;
|
|
}
|
|
|
|
duk_push_array(ctx); /* index 1 */
|
|
setup_nodejs_buffer(ctx, 0);
|
|
duk_put_prop_index(ctx, 1, arridx++);
|
|
setup_nodejs_buffer_slice(ctx, 0, 3, 5);
|
|
duk_put_prop_index(ctx, 1, arridx++);
|
|
setup_arraybuffer(ctx, 0);
|
|
duk_put_prop_index(ctx, 1, arridx++);
|
|
setup_typedarray(ctx, 0, "Uint8Array");
|
|
duk_put_prop_index(ctx, 1, arridx++);
|
|
setup_typedarray_slice(ctx, 0, "Uint8Array", 2, 6);
|
|
duk_put_prop_index(ctx, 1, arridx++);
|
|
setup_typedarray(ctx, 0, "Uint32Array");
|
|
duk_put_prop_index(ctx, 1, arridx++);
|
|
setup_typedarray_slice(ctx, 0, "Uint32Array", 4, 1);
|
|
duk_put_prop_index(ctx, 1, arridx++);
|
|
|
|
/* Serialize with a full backing buffer first. */
|
|
|
|
for (i = 20; i >= 0; i--) {
|
|
printf("resize to %d\n", i);
|
|
duk_resize_buffer(ctx, 0, i);
|
|
|
|
duk_dup(ctx, 1);
|
|
duk_json_encode(ctx, -1);
|
|
printf("%s\n", duk_to_string(ctx, -1));
|
|
duk_pop(ctx);
|
|
duk_eval_string(ctx, "(function (v) { print(Duktape.enc('jx', v)); })");
|
|
duk_dup(ctx, 1);
|
|
duk_call(ctx, 1);
|
|
duk_pop(ctx);
|
|
}
|
|
|
|
printf("final top: %ld\n", (long) duk_get_top(ctx));
|
|
return 0;
|
|
}
|
|
|
|
/*===
|
|
*** test_typedarray_constructor_copy_1 (duk_safe_call)
|
|
|40414243444546474849|
|
|
|4000410042004300440045004600470048004900|
|
|
|40414243444546474800|
|
|
|4000410042004300440045004600470048000000|
|
|
|40414243444546470000|
|
|
|4000410042004300440045004600470000000000|
|
|
|40414243444546000000|
|
|
|4000410042004300440045004600000000000000|
|
|
|40414243444500000000|
|
|
|4000410042004300440045000000000000000000|
|
|
|40414243440000000000|
|
|
|4000410042004300440000000000000000000000|
|
|
|40414243000000000000|
|
|
|4000410042004300000000000000000000000000|
|
|
|40414200000000000000|
|
|
|4000410042000000000000000000000000000000|
|
|
|40410000000000000000|
|
|
|4000410000000000000000000000000000000000|
|
|
|40000000000000000000|
|
|
|4000000000000000000000000000000000000000|
|
|
|00000000000000000000|
|
|
|0000000000000000000000000000000000000000|
|
|
final top: 2
|
|
==> rc=0, result='undefined'
|
|
===*/
|
|
|
|
static duk_ret_t test_typedarray_constructor_copy_1(duk_context *ctx, void *udata) {
|
|
int i;
|
|
unsigned char *data;
|
|
|
|
(void) udata;
|
|
|
|
data = (unsigned char *) duk_push_dynamic_buffer(ctx, 10); /* index 0 */
|
|
for (i = 0; i < 10; i++) {
|
|
data[i] = 0x40 + i;
|
|
}
|
|
|
|
setup_typedarray(ctx, 0, "Uint8Array"); /* index 1 */
|
|
|
|
for (i = 10; i >= 0; i--) {
|
|
duk_resize_buffer(ctx, 0, i);
|
|
|
|
/* Compatible copy, uses byte copy when buffer is covered. */
|
|
duk_eval_string(ctx,
|
|
"(function (src) {\n"
|
|
" var buf = new Uint8Array(src);\n"
|
|
" print(Duktape.enc('jx', buf));\n"
|
|
"})\n");
|
|
duk_dup(ctx, 1);
|
|
duk_call(ctx, 1);
|
|
duk_pop(ctx);
|
|
|
|
/* Incompatible copy, uses "fast copy" when buffer is covered.
|
|
* Endian specific output.
|
|
*/
|
|
duk_eval_string(ctx,
|
|
"(function (src) {\n"
|
|
" var buf = new Uint16Array(src);\n"
|
|
" print(Duktape.enc('jx', buf));\n"
|
|
"})\n");
|
|
duk_dup(ctx, 1);
|
|
duk_call(ctx, 1);
|
|
duk_pop(ctx);
|
|
}
|
|
|
|
printf("final top: %ld\n", (long) duk_get_top(ctx));
|
|
return 0;
|
|
}
|
|
|
|
/*===
|
|
*** test_typedarray_set_1 (duk_safe_call)
|
|
10 1 1
|
|
10 1 2
|
|
10 1 3
|
|
10 1 4
|
|
10 1 5
|
|
10 2 1
|
|
RangeError
|
|
10 2 2
|
|
10 2 3
|
|
10 2 4
|
|
10 2 5
|
|
10 3 1
|
|
RangeError
|
|
10 3 2
|
|
10 3 3
|
|
10 3 4
|
|
10 3 5
|
|
10 4 1
|
|
RangeError
|
|
10 4 2
|
|
RangeError
|
|
10 4 3
|
|
RangeError
|
|
10 4 4
|
|
10 4 5
|
|
RangeError
|
|
9 1 1
|
|
9 1 2
|
|
9 1 3
|
|
9 1 4
|
|
9 1 5
|
|
9 2 1
|
|
RangeError
|
|
9 2 2
|
|
9 2 3
|
|
9 2 4
|
|
9 2 5
|
|
9 3 1
|
|
RangeError
|
|
9 3 2
|
|
9 3 3
|
|
9 3 4
|
|
9 3 5
|
|
9 4 1
|
|
RangeError
|
|
9 4 2
|
|
RangeError
|
|
9 4 3
|
|
RangeError
|
|
9 4 4
|
|
9 4 5
|
|
RangeError
|
|
8 1 1
|
|
8 1 2
|
|
8 1 3
|
|
8 1 4
|
|
8 1 5
|
|
8 2 1
|
|
RangeError
|
|
8 2 2
|
|
8 2 3
|
|
8 2 4
|
|
8 2 5
|
|
8 3 1
|
|
RangeError
|
|
8 3 2
|
|
8 3 3
|
|
8 3 4
|
|
8 3 5
|
|
8 4 1
|
|
RangeError
|
|
8 4 2
|
|
RangeError
|
|
8 4 3
|
|
RangeError
|
|
8 4 4
|
|
8 4 5
|
|
RangeError
|
|
7 1 1
|
|
7 1 2
|
|
7 1 3
|
|
7 1 4
|
|
7 1 5
|
|
7 2 1
|
|
RangeError
|
|
7 2 2
|
|
7 2 3
|
|
7 2 4
|
|
7 2 5
|
|
7 3 1
|
|
RangeError
|
|
7 3 2
|
|
7 3 3
|
|
7 3 4
|
|
7 3 5
|
|
7 4 1
|
|
RangeError
|
|
7 4 2
|
|
RangeError
|
|
7 4 3
|
|
RangeError
|
|
7 4 4
|
|
7 4 5
|
|
RangeError
|
|
6 1 1
|
|
6 1 2
|
|
6 1 3
|
|
6 1 4
|
|
6 1 5
|
|
6 2 1
|
|
RangeError
|
|
6 2 2
|
|
6 2 3
|
|
6 2 4
|
|
6 2 5
|
|
6 3 1
|
|
RangeError
|
|
6 3 2
|
|
6 3 3
|
|
6 3 4
|
|
6 3 5
|
|
6 4 1
|
|
RangeError
|
|
6 4 2
|
|
RangeError
|
|
6 4 3
|
|
RangeError
|
|
6 4 4
|
|
6 4 5
|
|
RangeError
|
|
5 1 1
|
|
5 1 2
|
|
5 1 3
|
|
5 1 4
|
|
5 1 5
|
|
5 2 1
|
|
RangeError
|
|
5 2 2
|
|
5 2 3
|
|
5 2 4
|
|
5 2 5
|
|
5 3 1
|
|
RangeError
|
|
5 3 2
|
|
5 3 3
|
|
5 3 4
|
|
5 3 5
|
|
5 4 1
|
|
RangeError
|
|
5 4 2
|
|
RangeError
|
|
5 4 3
|
|
RangeError
|
|
5 4 4
|
|
5 4 5
|
|
RangeError
|
|
4 1 1
|
|
4 1 2
|
|
4 1 3
|
|
4 1 4
|
|
4 1 5
|
|
4 2 1
|
|
RangeError
|
|
4 2 2
|
|
4 2 3
|
|
4 2 4
|
|
4 2 5
|
|
4 3 1
|
|
RangeError
|
|
4 3 2
|
|
4 3 3
|
|
4 3 4
|
|
4 3 5
|
|
4 4 1
|
|
RangeError
|
|
4 4 2
|
|
RangeError
|
|
4 4 3
|
|
RangeError
|
|
4 4 4
|
|
4 4 5
|
|
RangeError
|
|
3 1 1
|
|
3 1 2
|
|
3 1 3
|
|
3 1 4
|
|
3 1 5
|
|
3 2 1
|
|
RangeError
|
|
3 2 2
|
|
3 2 3
|
|
3 2 4
|
|
3 2 5
|
|
3 3 1
|
|
RangeError
|
|
3 3 2
|
|
3 3 3
|
|
3 3 4
|
|
3 3 5
|
|
3 4 1
|
|
RangeError
|
|
3 4 2
|
|
RangeError
|
|
3 4 3
|
|
RangeError
|
|
3 4 4
|
|
3 4 5
|
|
RangeError
|
|
2 1 1
|
|
2 1 2
|
|
2 1 3
|
|
2 1 4
|
|
2 1 5
|
|
2 2 1
|
|
RangeError
|
|
2 2 2
|
|
2 2 3
|
|
2 2 4
|
|
2 2 5
|
|
2 3 1
|
|
RangeError
|
|
2 3 2
|
|
2 3 3
|
|
2 3 4
|
|
2 3 5
|
|
2 4 1
|
|
RangeError
|
|
2 4 2
|
|
RangeError
|
|
2 4 3
|
|
RangeError
|
|
2 4 4
|
|
2 4 5
|
|
RangeError
|
|
1 1 1
|
|
1 1 2
|
|
1 1 3
|
|
1 1 4
|
|
1 1 5
|
|
1 2 1
|
|
RangeError
|
|
1 2 2
|
|
1 2 3
|
|
1 2 4
|
|
1 2 5
|
|
1 3 1
|
|
RangeError
|
|
1 3 2
|
|
1 3 3
|
|
1 3 4
|
|
1 3 5
|
|
1 4 1
|
|
RangeError
|
|
1 4 2
|
|
RangeError
|
|
1 4 3
|
|
RangeError
|
|
1 4 4
|
|
1 4 5
|
|
RangeError
|
|
0 1 1
|
|
0 1 2
|
|
0 1 3
|
|
0 1 4
|
|
0 1 5
|
|
0 2 1
|
|
RangeError
|
|
0 2 2
|
|
0 2 3
|
|
0 2 4
|
|
0 2 5
|
|
0 3 1
|
|
RangeError
|
|
0 3 2
|
|
0 3 3
|
|
0 3 4
|
|
0 3 5
|
|
0 4 1
|
|
RangeError
|
|
0 4 2
|
|
RangeError
|
|
0 4 3
|
|
RangeError
|
|
0 4 4
|
|
0 4 5
|
|
RangeError
|
|
final top: 6
|
|
==> rc=0, result='undefined'
|
|
===*/
|
|
|
|
static duk_ret_t test_typedarray_set_1(duk_context *ctx, void *udata) {
|
|
int i, dst, src;
|
|
unsigned char *data;
|
|
|
|
(void) udata;
|
|
|
|
data = (unsigned char *) duk_push_dynamic_buffer(ctx, 10); /* index 0 */
|
|
for (i = 0; i < 10; i++) {
|
|
data[i] = 0x40 + i;
|
|
}
|
|
|
|
/* Some combinations are not set() compatible and cause a RangeError
|
|
* (source longer than target). But this set should exercise byte copy,
|
|
* fast copy, and slow copy code paths.
|
|
*/
|
|
|
|
setup_typedarray(ctx, 0, "Uint8Array"); /* index 1, length 10 */
|
|
setup_typedarray_slice(ctx, 0, "Uint8Array", 2, 5); /* index 2, length 5 */
|
|
setup_typedarray(ctx, 0, "Uint16Array"); /* index 3, length 5 */
|
|
setup_typedarray_slice(ctx, 0, "Uint16Array", 2, 3); /* index 4, length 3 */
|
|
duk_eval_string(ctx, "[ 1, 2, 3, 4, 5 ]"); /* index 5, length 5 */
|
|
|
|
for (i = 10; i >= 0; i--) {
|
|
duk_resize_buffer(ctx, 0, i);
|
|
|
|
/* Various copy combinations. Resulting buffer is omitted;
|
|
* when both dst and src are typedarrays they share the same
|
|
* underlying buffer. so the results are a bit confusing (and
|
|
* not important to memory safety).
|
|
*/
|
|
|
|
for (dst = 1; dst <= 4; dst++) {
|
|
for (src = 1; src <= 5; src++) {
|
|
printf("%d %d %d\n", i, dst, src);
|
|
duk_eval_string(ctx,
|
|
"(function (dst, src) {\n"
|
|
" for (var i = 0; i < dst.length; i++) { dst[i] = 0x11; }\n"
|
|
" try { dst.set(src); } catch (e) { print(e.name); }\n"
|
|
"})\n");
|
|
duk_dup(ctx, dst);
|
|
duk_dup(ctx, src);
|
|
duk_call(ctx, 2);
|
|
duk_pop(ctx);
|
|
}
|
|
}
|
|
}
|
|
|
|
printf("final top: %ld\n", (long) duk_get_top(ctx));
|
|
return 0;
|
|
}
|
|
|
|
/*===
|
|
*** test_nodejs_buffer_compare_1 (duk_safe_call)
|
|
10 1 1
|
|
0 0
|
|
10 1 2
|
|
-1 -1
|
|
10 1 3
|
|
-1 -1
|
|
10 1 4
|
|
-1 -1
|
|
10 2 1
|
|
1 1
|
|
10 2 2
|
|
0 0
|
|
10 2 3
|
|
-1 -1
|
|
10 2 4
|
|
-1 -1
|
|
10 3 1
|
|
1 1
|
|
10 3 2
|
|
1 1
|
|
10 3 3
|
|
0 0
|
|
10 3 4
|
|
-1 -1
|
|
10 4 1
|
|
1 1
|
|
10 4 2
|
|
1 1
|
|
10 4 3
|
|
1 1
|
|
10 4 4
|
|
0 0
|
|
9 1 1
|
|
-1 -1
|
|
9 1 2
|
|
-1 -1
|
|
9 1 3
|
|
-1 -1
|
|
9 1 4
|
|
-1 -1
|
|
9 2 1
|
|
-1 -1
|
|
9 2 2
|
|
0 0
|
|
9 2 3
|
|
-1 -1
|
|
9 2 4
|
|
-1 -1
|
|
9 3 1
|
|
-1 -1
|
|
9 3 2
|
|
1 1
|
|
9 3 3
|
|
0 0
|
|
9 3 4
|
|
-1 -1
|
|
9 4 1
|
|
-1 -1
|
|
9 4 2
|
|
1 1
|
|
9 4 3
|
|
1 1
|
|
9 4 4
|
|
0 0
|
|
8 1 1
|
|
-1 -1
|
|
8 1 2
|
|
-1 -1
|
|
8 1 3
|
|
-1 -1
|
|
8 1 4
|
|
-1 -1
|
|
8 2 1
|
|
-1 -1
|
|
8 2 2
|
|
0 0
|
|
8 2 3
|
|
-1 -1
|
|
8 2 4
|
|
-1 -1
|
|
8 3 1
|
|
-1 -1
|
|
8 3 2
|
|
1 1
|
|
8 3 3
|
|
0 0
|
|
8 3 4
|
|
-1 -1
|
|
8 4 1
|
|
-1 -1
|
|
8 4 2
|
|
-1 -1
|
|
8 4 3
|
|
-1 -1
|
|
8 4 4
|
|
-1 -1
|
|
7 1 1
|
|
-1 -1
|
|
7 1 2
|
|
-1 -1
|
|
7 1 3
|
|
-1 -1
|
|
7 1 4
|
|
-1 -1
|
|
7 2 1
|
|
-1 -1
|
|
7 2 2
|
|
0 0
|
|
7 2 3
|
|
-1 -1
|
|
7 2 4
|
|
-1 -1
|
|
7 3 1
|
|
-1 -1
|
|
7 3 2
|
|
1 1
|
|
7 3 3
|
|
0 0
|
|
7 3 4
|
|
-1 -1
|
|
7 4 1
|
|
-1 -1
|
|
7 4 2
|
|
-1 -1
|
|
7 4 3
|
|
-1 -1
|
|
7 4 4
|
|
-1 -1
|
|
6 1 1
|
|
-1 -1
|
|
6 1 2
|
|
-1 -1
|
|
6 1 3
|
|
-1 -1
|
|
6 1 4
|
|
-1 -1
|
|
6 2 1
|
|
-1 -1
|
|
6 2 2
|
|
0 0
|
|
6 2 3
|
|
-1 -1
|
|
6 2 4
|
|
-1 -1
|
|
6 3 1
|
|
-1 -1
|
|
6 3 2
|
|
-1 -1
|
|
6 3 3
|
|
-1 -1
|
|
6 3 4
|
|
-1 -1
|
|
6 4 1
|
|
-1 -1
|
|
6 4 2
|
|
-1 -1
|
|
6 4 3
|
|
-1 -1
|
|
6 4 4
|
|
-1 -1
|
|
5 1 1
|
|
-1 -1
|
|
5 1 2
|
|
-1 -1
|
|
5 1 3
|
|
-1 -1
|
|
5 1 4
|
|
-1 -1
|
|
5 2 1
|
|
-1 -1
|
|
5 2 2
|
|
0 0
|
|
5 2 3
|
|
-1 -1
|
|
5 2 4
|
|
-1 -1
|
|
5 3 1
|
|
-1 -1
|
|
5 3 2
|
|
-1 -1
|
|
5 3 3
|
|
-1 -1
|
|
5 3 4
|
|
-1 -1
|
|
5 4 1
|
|
-1 -1
|
|
5 4 2
|
|
-1 -1
|
|
5 4 3
|
|
-1 -1
|
|
5 4 4
|
|
-1 -1
|
|
4 1 1
|
|
-1 -1
|
|
4 1 2
|
|
-1 -1
|
|
4 1 3
|
|
-1 -1
|
|
4 1 4
|
|
-1 -1
|
|
4 2 1
|
|
-1 -1
|
|
4 2 2
|
|
0 0
|
|
4 2 3
|
|
-1 -1
|
|
4 2 4
|
|
-1 -1
|
|
4 3 1
|
|
-1 -1
|
|
4 3 2
|
|
-1 -1
|
|
4 3 3
|
|
-1 -1
|
|
4 3 4
|
|
-1 -1
|
|
4 4 1
|
|
-1 -1
|
|
4 4 2
|
|
-1 -1
|
|
4 4 3
|
|
-1 -1
|
|
4 4 4
|
|
-1 -1
|
|
3 1 1
|
|
-1 -1
|
|
3 1 2
|
|
-1 -1
|
|
3 1 3
|
|
-1 -1
|
|
3 1 4
|
|
-1 -1
|
|
3 2 1
|
|
-1 -1
|
|
3 2 2
|
|
-1 -1
|
|
3 2 3
|
|
-1 -1
|
|
3 2 4
|
|
-1 -1
|
|
3 3 1
|
|
-1 -1
|
|
3 3 2
|
|
-1 -1
|
|
3 3 3
|
|
-1 -1
|
|
3 3 4
|
|
-1 -1
|
|
3 4 1
|
|
-1 -1
|
|
3 4 2
|
|
-1 -1
|
|
3 4 3
|
|
-1 -1
|
|
3 4 4
|
|
-1 -1
|
|
2 1 1
|
|
-1 -1
|
|
2 1 2
|
|
-1 -1
|
|
2 1 3
|
|
-1 -1
|
|
2 1 4
|
|
-1 -1
|
|
2 2 1
|
|
-1 -1
|
|
2 2 2
|
|
-1 -1
|
|
2 2 3
|
|
-1 -1
|
|
2 2 4
|
|
-1 -1
|
|
2 3 1
|
|
-1 -1
|
|
2 3 2
|
|
-1 -1
|
|
2 3 3
|
|
-1 -1
|
|
2 3 4
|
|
-1 -1
|
|
2 4 1
|
|
-1 -1
|
|
2 4 2
|
|
-1 -1
|
|
2 4 3
|
|
-1 -1
|
|
2 4 4
|
|
-1 -1
|
|
1 1 1
|
|
-1 -1
|
|
1 1 2
|
|
-1 -1
|
|
1 1 3
|
|
-1 -1
|
|
1 1 4
|
|
-1 -1
|
|
1 2 1
|
|
-1 -1
|
|
1 2 2
|
|
-1 -1
|
|
1 2 3
|
|
-1 -1
|
|
1 2 4
|
|
-1 -1
|
|
1 3 1
|
|
-1 -1
|
|
1 3 2
|
|
-1 -1
|
|
1 3 3
|
|
-1 -1
|
|
1 3 4
|
|
-1 -1
|
|
1 4 1
|
|
-1 -1
|
|
1 4 2
|
|
-1 -1
|
|
1 4 3
|
|
-1 -1
|
|
1 4 4
|
|
-1 -1
|
|
0 1 1
|
|
-1 -1
|
|
0 1 2
|
|
-1 -1
|
|
0 1 3
|
|
-1 -1
|
|
0 1 4
|
|
-1 -1
|
|
0 2 1
|
|
-1 -1
|
|
0 2 2
|
|
-1 -1
|
|
0 2 3
|
|
-1 -1
|
|
0 2 4
|
|
-1 -1
|
|
0 3 1
|
|
-1 -1
|
|
0 3 2
|
|
-1 -1
|
|
0 3 3
|
|
-1 -1
|
|
0 3 4
|
|
-1 -1
|
|
0 4 1
|
|
-1 -1
|
|
0 4 2
|
|
-1 -1
|
|
0 4 3
|
|
-1 -1
|
|
0 4 4
|
|
-1 -1
|
|
final top: 5
|
|
==> rc=0, result='undefined'
|
|
===*/
|
|
|
|
static duk_ret_t test_nodejs_buffer_compare_1(duk_context *ctx, void *udata) {
|
|
int i, dst, src;
|
|
unsigned char *data;
|
|
|
|
(void) udata;
|
|
|
|
/* There are two relevant methods: Buffer.compare and Buffer.prototype.compare() */
|
|
|
|
data = (unsigned char *) duk_push_dynamic_buffer(ctx, 10); /* index 0 */
|
|
for (i = 0; i < 10; i++) {
|
|
data[i] = 0x40 + i;
|
|
}
|
|
|
|
setup_nodejs_buffer(ctx, 0);
|
|
setup_nodejs_buffer_slice(ctx, 0, 1, 4);
|
|
setup_nodejs_buffer_slice(ctx, 0, 3, 7);
|
|
setup_nodejs_buffer_slice(ctx, 0, 6, 9);
|
|
|
|
for (i = 10; i >= 0; i--) {
|
|
duk_resize_buffer(ctx, 0, i);
|
|
|
|
for (dst = 1; dst <= 4; dst++) {
|
|
for (src = 1; src <= 4; src++) {
|
|
printf("%d %d %d\n", i, dst, src);
|
|
duk_eval_string(ctx,
|
|
"(function (dst, src) {\n"
|
|
" print(Buffer.compare(dst, src), dst.compare(src));\n"
|
|
"})");
|
|
duk_dup(ctx, dst);
|
|
duk_dup(ctx, src);
|
|
duk_call(ctx, 2);
|
|
duk_pop(ctx);
|
|
}
|
|
}
|
|
}
|
|
|
|
printf("final top: %ld\n", (long) duk_get_top(ctx));
|
|
return 0;
|
|
}
|
|
|
|
/*===
|
|
*** test_nodejs_buffer_write_1 (duk_safe_call)
|
|
10 1 5
|
|
10 1 6
|
|
10 1 7
|
|
10 1 8
|
|
10 2 5
|
|
10 2 6
|
|
10 2 7
|
|
10 2 8
|
|
10 3 5
|
|
10 3 6
|
|
10 3 7
|
|
10 3 8
|
|
10 4 5
|
|
10 4 6
|
|
10 4 7
|
|
10 4 8
|
|
9 1 5
|
|
9 1 6
|
|
9 1 7
|
|
9 1 8
|
|
9 2 5
|
|
9 2 6
|
|
9 2 7
|
|
9 2 8
|
|
9 3 5
|
|
9 3 6
|
|
9 3 7
|
|
9 3 8
|
|
9 4 5
|
|
9 4 6
|
|
9 4 7
|
|
9 4 8
|
|
8 1 5
|
|
8 1 6
|
|
8 1 7
|
|
8 1 8
|
|
8 2 5
|
|
8 2 6
|
|
8 2 7
|
|
8 2 8
|
|
8 3 5
|
|
8 3 6
|
|
8 3 7
|
|
8 3 8
|
|
8 4 5
|
|
8 4 6
|
|
8 4 7
|
|
8 4 8
|
|
7 1 5
|
|
7 1 6
|
|
7 1 7
|
|
7 1 8
|
|
7 2 5
|
|
7 2 6
|
|
7 2 7
|
|
7 2 8
|
|
7 3 5
|
|
7 3 6
|
|
7 3 7
|
|
7 3 8
|
|
7 4 5
|
|
7 4 6
|
|
7 4 7
|
|
7 4 8
|
|
6 1 5
|
|
6 1 6
|
|
6 1 7
|
|
6 1 8
|
|
6 2 5
|
|
6 2 6
|
|
6 2 7
|
|
6 2 8
|
|
6 3 5
|
|
6 3 6
|
|
6 3 7
|
|
6 3 8
|
|
6 4 5
|
|
6 4 6
|
|
6 4 7
|
|
6 4 8
|
|
5 1 5
|
|
5 1 6
|
|
5 1 7
|
|
5 1 8
|
|
5 2 5
|
|
5 2 6
|
|
5 2 7
|
|
5 2 8
|
|
5 3 5
|
|
5 3 6
|
|
5 3 7
|
|
5 3 8
|
|
5 4 5
|
|
5 4 6
|
|
5 4 7
|
|
5 4 8
|
|
4 1 5
|
|
4 1 6
|
|
4 1 7
|
|
4 1 8
|
|
4 2 5
|
|
4 2 6
|
|
4 2 7
|
|
4 2 8
|
|
4 3 5
|
|
4 3 6
|
|
4 3 7
|
|
4 3 8
|
|
4 4 5
|
|
4 4 6
|
|
4 4 7
|
|
4 4 8
|
|
3 1 5
|
|
3 1 6
|
|
3 1 7
|
|
3 1 8
|
|
3 2 5
|
|
3 2 6
|
|
3 2 7
|
|
3 2 8
|
|
3 3 5
|
|
3 3 6
|
|
3 3 7
|
|
3 3 8
|
|
3 4 5
|
|
3 4 6
|
|
3 4 7
|
|
3 4 8
|
|
2 1 5
|
|
2 1 6
|
|
2 1 7
|
|
2 1 8
|
|
2 2 5
|
|
2 2 6
|
|
2 2 7
|
|
2 2 8
|
|
2 3 5
|
|
2 3 6
|
|
2 3 7
|
|
2 3 8
|
|
2 4 5
|
|
2 4 6
|
|
2 4 7
|
|
2 4 8
|
|
1 1 5
|
|
1 1 6
|
|
1 1 7
|
|
1 1 8
|
|
1 2 5
|
|
1 2 6
|
|
1 2 7
|
|
1 2 8
|
|
1 3 5
|
|
1 3 6
|
|
1 3 7
|
|
1 3 8
|
|
1 4 5
|
|
1 4 6
|
|
1 4 7
|
|
1 4 8
|
|
0 1 5
|
|
0 1 6
|
|
0 1 7
|
|
0 1 8
|
|
0 2 5
|
|
0 2 6
|
|
0 2 7
|
|
0 2 8
|
|
0 3 5
|
|
0 3 6
|
|
0 3 7
|
|
0 3 8
|
|
0 4 5
|
|
0 4 6
|
|
0 4 7
|
|
0 4 8
|
|
final top: 9
|
|
==> rc=0, result='undefined'
|
|
===*/
|
|
|
|
static duk_ret_t test_nodejs_buffer_write_1(duk_context *ctx, void *udata) {
|
|
int i, dst, src;
|
|
unsigned char *data;
|
|
|
|
(void) udata;
|
|
|
|
data = (unsigned char *) duk_push_dynamic_buffer(ctx, 10); /* index 0 */
|
|
for (i = 0; i < 10; i++) {
|
|
data[i] = 0x40 + i;
|
|
}
|
|
|
|
setup_nodejs_buffer(ctx, 0); /* index 1 */
|
|
setup_nodejs_buffer_slice(ctx, 0, 1, 4); /* index 2 */
|
|
setup_nodejs_buffer_slice(ctx, 0, 3, 7); /* index 3 */
|
|
setup_nodejs_buffer_slice(ctx, 0, 6, 9); /* index 4 */
|
|
duk_push_string(ctx, ""); /* index 5 */
|
|
duk_push_string(ctx, "fo"); /* index 6 */
|
|
duk_push_string(ctx, "bar"); /* index 7 */
|
|
duk_push_string(ctx, "quux"); /* index 8 */
|
|
|
|
for (i = 10; i >= 0; i--) {
|
|
duk_resize_buffer(ctx, 0, i);
|
|
|
|
/* The resulting buffers are not printed here; they're not very
|
|
* intuitive because both the source and the destination share
|
|
* the same underlying buffer.
|
|
*/
|
|
|
|
for (dst = 1; dst <= 4; dst++) {
|
|
for (src = 5; src <= 8; src++) {
|
|
printf("%d %d %d\n", i, dst, src);
|
|
duk_eval_string(ctx,
|
|
"(function (dst, src) {\n"
|
|
" for (var i = 0; i < dst.length; i++) { dst[i] = 0x11; }\n"
|
|
" dst.write(src);\n"
|
|
" for (var i = 0; i < dst.length; i++) { dst[i] = 0x11; }\n"
|
|
" dst.write(src, 1);\n"
|
|
"})");
|
|
duk_dup(ctx, dst);
|
|
duk_dup(ctx, src);
|
|
duk_call(ctx, 2);
|
|
duk_pop(ctx);
|
|
}
|
|
}
|
|
}
|
|
|
|
printf("final top: %ld\n", (long) duk_get_top(ctx));
|
|
return 0;
|
|
}
|
|
|
|
/*===
|
|
*** test_nodejs_buffer_copy_1 (duk_safe_call)
|
|
10 1 1
|
|
10 1 2
|
|
10 1 3
|
|
10 1 4
|
|
10 2 1
|
|
10 2 2
|
|
10 2 3
|
|
10 2 4
|
|
10 3 1
|
|
10 3 2
|
|
10 3 3
|
|
10 3 4
|
|
10 4 1
|
|
10 4 2
|
|
10 4 3
|
|
10 4 4
|
|
9 1 1
|
|
9 1 2
|
|
9 1 3
|
|
9 1 4
|
|
9 2 1
|
|
9 2 2
|
|
9 2 3
|
|
9 2 4
|
|
9 3 1
|
|
9 3 2
|
|
9 3 3
|
|
9 3 4
|
|
9 4 1
|
|
9 4 2
|
|
9 4 3
|
|
9 4 4
|
|
8 1 1
|
|
8 1 2
|
|
8 1 3
|
|
8 1 4
|
|
8 2 1
|
|
8 2 2
|
|
8 2 3
|
|
8 2 4
|
|
8 3 1
|
|
8 3 2
|
|
8 3 3
|
|
8 3 4
|
|
8 4 1
|
|
8 4 2
|
|
8 4 3
|
|
8 4 4
|
|
7 1 1
|
|
7 1 2
|
|
7 1 3
|
|
7 1 4
|
|
7 2 1
|
|
7 2 2
|
|
7 2 3
|
|
7 2 4
|
|
7 3 1
|
|
7 3 2
|
|
7 3 3
|
|
7 3 4
|
|
7 4 1
|
|
7 4 2
|
|
7 4 3
|
|
7 4 4
|
|
6 1 1
|
|
6 1 2
|
|
6 1 3
|
|
6 1 4
|
|
6 2 1
|
|
6 2 2
|
|
6 2 3
|
|
6 2 4
|
|
6 3 1
|
|
6 3 2
|
|
6 3 3
|
|
6 3 4
|
|
6 4 1
|
|
6 4 2
|
|
6 4 3
|
|
6 4 4
|
|
5 1 1
|
|
5 1 2
|
|
5 1 3
|
|
5 1 4
|
|
5 2 1
|
|
5 2 2
|
|
5 2 3
|
|
5 2 4
|
|
5 3 1
|
|
5 3 2
|
|
5 3 3
|
|
5 3 4
|
|
5 4 1
|
|
5 4 2
|
|
5 4 3
|
|
5 4 4
|
|
4 1 1
|
|
4 1 2
|
|
4 1 3
|
|
4 1 4
|
|
4 2 1
|
|
4 2 2
|
|
4 2 3
|
|
4 2 4
|
|
4 3 1
|
|
4 3 2
|
|
4 3 3
|
|
4 3 4
|
|
4 4 1
|
|
4 4 2
|
|
4 4 3
|
|
4 4 4
|
|
3 1 1
|
|
3 1 2
|
|
3 1 3
|
|
3 1 4
|
|
3 2 1
|
|
3 2 2
|
|
3 2 3
|
|
3 2 4
|
|
3 3 1
|
|
3 3 2
|
|
3 3 3
|
|
3 3 4
|
|
3 4 1
|
|
3 4 2
|
|
3 4 3
|
|
3 4 4
|
|
2 1 1
|
|
2 1 2
|
|
2 1 3
|
|
2 1 4
|
|
2 2 1
|
|
2 2 2
|
|
2 2 3
|
|
2 2 4
|
|
2 3 1
|
|
2 3 2
|
|
2 3 3
|
|
2 3 4
|
|
2 4 1
|
|
2 4 2
|
|
2 4 3
|
|
2 4 4
|
|
1 1 1
|
|
1 1 2
|
|
1 1 3
|
|
1 1 4
|
|
1 2 1
|
|
1 2 2
|
|
1 2 3
|
|
1 2 4
|
|
1 3 1
|
|
1 3 2
|
|
1 3 3
|
|
1 3 4
|
|
1 4 1
|
|
1 4 2
|
|
1 4 3
|
|
1 4 4
|
|
0 1 1
|
|
0 1 2
|
|
0 1 3
|
|
0 1 4
|
|
0 2 1
|
|
0 2 2
|
|
0 2 3
|
|
0 2 4
|
|
0 3 1
|
|
0 3 2
|
|
0 3 3
|
|
0 3 4
|
|
0 4 1
|
|
0 4 2
|
|
0 4 3
|
|
0 4 4
|
|
final top: 5
|
|
==> rc=0, result='undefined'
|
|
===*/
|
|
|
|
static duk_ret_t test_nodejs_buffer_copy_1(duk_context *ctx, void *udata) {
|
|
int i, dst, src;
|
|
unsigned char *data;
|
|
|
|
(void) udata;
|
|
|
|
data = (unsigned char *) duk_push_dynamic_buffer(ctx, 10); /* index 0 */
|
|
for (i = 0; i < 10; i++) {
|
|
data[i] = 0x40 + i;
|
|
}
|
|
|
|
setup_nodejs_buffer(ctx, 0);
|
|
setup_nodejs_buffer_slice(ctx, 0, 1, 4);
|
|
setup_nodejs_buffer_slice(ctx, 0, 3, 7);
|
|
setup_nodejs_buffer_slice(ctx, 0, 6, 9);
|
|
|
|
for (i = 10; i >= 0; i--) {
|
|
duk_resize_buffer(ctx, 0, i);
|
|
|
|
/* The resulting buffers are not printed here; they're not very
|
|
* intuitive because both the source and the destination share
|
|
* the same underlying buffer.
|
|
*/
|
|
|
|
for (dst = 1; dst <= 4; dst++) {
|
|
for (src = 1; src <= 4; src++) {
|
|
printf("%d %d %d\n", i, dst, src);
|
|
duk_eval_string(ctx,
|
|
"(function (dst, src) {\n"
|
|
" for (var i = 0; i < dst.length; i++) { dst[i] = 0x11; }\n"
|
|
" for (var i = 0; i < src.length; i++) { src[i] = 0x22; }\n"
|
|
" src.copy(dst);\n"
|
|
" for (var i = 0; i < dst.length; i++) { dst[i] = 0x11; }\n"
|
|
" for (var i = 0; i < src.length; i++) { src[i] = 0x22; }\n"
|
|
" src.copy(dst, 4, 1);\n"
|
|
"})");
|
|
duk_dup(ctx, dst);
|
|
duk_dup(ctx, src);
|
|
duk_call(ctx, 2);
|
|
duk_pop(ctx);
|
|
}
|
|
}
|
|
}
|
|
|
|
printf("final top: %ld\n", (long) duk_get_top(ctx));
|
|
return 0;
|
|
}
|
|
|
|
/*===
|
|
*** test_nodejs_buffer_concat_1 (duk_safe_call)
|
|
10
|
|
{type:"Buffer",data:[64,65,66,67,68,69,70,71,72,73,65,66,67,68,69,67,68,69,70,70,71,72,65,66,67,68,69,70,71]}
|
|
9
|
|
{type:"Buffer",data:[0,0,0,0,0,0,0,0,0,0,65,66,67,68,69,67,68,69,70,70,71,72,65,66,67,68,69,70,71]}
|
|
8
|
|
{type:"Buffer",data:[0,0,0,0,0,0,0,0,0,0,65,66,67,68,69,67,68,69,70,0,0,0,65,66,67,68,69,70,71]}
|
|
7
|
|
{type:"Buffer",data:[0,0,0,0,0,0,0,0,0,0,65,66,67,68,69,67,68,69,70,0,0,0,0,0,0,0,0,0,0]}
|
|
6
|
|
{type:"Buffer",data:[0,0,0,0,0,0,0,0,0,0,65,66,67,68,69,0,0,0,0,0,0,0,0,0,0,0,0,0,0]}
|
|
5
|
|
{type:"Buffer",data:[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]}
|
|
4
|
|
{type:"Buffer",data:[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]}
|
|
3
|
|
{type:"Buffer",data:[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]}
|
|
2
|
|
{type:"Buffer",data:[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]}
|
|
1
|
|
{type:"Buffer",data:[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]}
|
|
0
|
|
{type:"Buffer",data:[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]}
|
|
final top: 6
|
|
==> rc=0, result='undefined'
|
|
===*/
|
|
|
|
static duk_ret_t test_nodejs_buffer_concat_1(duk_context *ctx, void *udata) {
|
|
int i;
|
|
unsigned char *data;
|
|
|
|
(void) udata;
|
|
|
|
data = (unsigned char *) duk_push_dynamic_buffer(ctx, 10); /* index 0 */
|
|
for (i = 0; i < 10; i++) {
|
|
data[i] = 0x40 + i;
|
|
}
|
|
|
|
setup_nodejs_buffer(ctx, 0);
|
|
setup_nodejs_buffer_slice(ctx, 0, 1, 6);
|
|
setup_nodejs_buffer_slice(ctx, 0, 3, 7);
|
|
setup_nodejs_buffer_slice(ctx, 0, 6, 9);
|
|
setup_nodejs_buffer_slice(ctx, 0, 1, 8);
|
|
|
|
for (i = 10; i >= 0; i--) {
|
|
duk_resize_buffer(ctx, 0, i);
|
|
|
|
printf("%d\n", i);
|
|
duk_eval_string(ctx,
|
|
"(function (arg1, arg2, arg3, arg4, arg5) {\n"
|
|
" var res = Buffer.concat([ arg1, arg2, arg3, arg4, arg5 ]);\n"
|
|
" print(Duktape.enc('jx', res));\n"
|
|
"})");
|
|
duk_dup(ctx, 1);
|
|
duk_dup(ctx, 2);
|
|
duk_dup(ctx, 3);
|
|
duk_dup(ctx, 4);
|
|
duk_dup(ctx, 5);
|
|
duk_call(ctx, 5);
|
|
duk_pop(ctx);
|
|
}
|
|
|
|
printf("final top: %ld\n", (long) duk_get_top(ctx));
|
|
return 0;
|
|
}
|
|
|
|
void test(duk_context *ctx) {
|
|
/* Indexed read/write */
|
|
TEST_SAFE_CALL(test_nodejs_buffer_indexed_1a);
|
|
TEST_SAFE_CALL(test_nodejs_buffer_indexed_1b);
|
|
TEST_SAFE_CALL(test_arraybuffer_indexed_1a);
|
|
TEST_SAFE_CALL(test_uint8array_indexed_1a);
|
|
TEST_SAFE_CALL(test_uint8array_indexed_1b);
|
|
TEST_SAFE_CALL(test_uint16array_indexed_1a);
|
|
TEST_SAFE_CALL(test_uint16array_indexed_1b);
|
|
TEST_SAFE_CALL(test_uint32array_indexed_1a);
|
|
TEST_SAFE_CALL(test_uint32array_indexed_1b);
|
|
TEST_SAFE_CALL(test_float32array_indexed_1a);
|
|
TEST_SAFE_CALL(test_float32array_indexed_1b);
|
|
TEST_SAFE_CALL(test_float64array_indexed_1a);
|
|
TEST_SAFE_CALL(test_float64array_indexed_1b);
|
|
|
|
/* JSON.serialize */
|
|
TEST_SAFE_CALL(test_json_serialize_1);
|
|
|
|
/* TypedArray constructor byte copy and fast copy */
|
|
TEST_SAFE_CALL(test_typedarray_constructor_copy_1);
|
|
|
|
/* TypedArray.prototype.set() */
|
|
TEST_SAFE_CALL(test_typedarray_set_1);
|
|
|
|
/* Node.js Buffer compare() */
|
|
TEST_SAFE_CALL(test_nodejs_buffer_compare_1);
|
|
|
|
/* Node.js Buffer write() */
|
|
TEST_SAFE_CALL(test_nodejs_buffer_write_1);
|
|
|
|
/* Node.js Buffer copy() */
|
|
TEST_SAFE_CALL(test_nodejs_buffer_copy_1);
|
|
|
|
/* Node.js Buffer concat() */
|
|
TEST_SAFE_CALL(test_nodejs_buffer_concat_1);
|
|
}
|
|
|