return NJS_ERROR;
}
- str.start = &njs_typed_array_buffer(array)->u.u8[array->offset + start];
- str.length = end - start;
-
- if (njs_slow_path(str.length == 0)) {
+ if (njs_slow_path(start >= end)) {
njs_set_empty_string(vm, retval);
return NJS_OK;
}
+ str.start = &njs_typed_array_buffer(array)->u.u8[array->offset + start];
+ str.length = end - start;
+
return encoding->encode(vm, retval, &str);
}
JS_CFUNC_MAGIC_DEF("swap32", 0, qjs_buffer_prototype_swap, 4),
JS_CFUNC_MAGIC_DEF("swap64", 0, qjs_buffer_prototype_swap, 8),
JS_CFUNC_DEF("toJSON", 0, qjs_buffer_prototype_to_json),
- JS_CFUNC_DEF("toString", 1, qjs_buffer_prototype_to_string),
+ JS_CFUNC_DEF("toString", 3, qjs_buffer_prototype_to_string),
JS_CFUNC_DEF("write", 4, qjs_buffer_prototype_write),
JS_CFUNC_MAGIC_DEF("writeInt8", 1, qjs_buffer_prototype_write_int,
qjs_buffer_magic(1, 1, 1)),
qjs_buffer_prototype_to_string(JSContext *ctx, JSValueConst this_val,
int argc, JSValueConst *argv)
{
+ uint64_t start, end;
JSValue ret;
njs_str_t src, data;
const qjs_buffer_encoding_t *encoding;
" object");
}
+ start = 0;
+ end = src.length;
+
+ if (!JS_IsUndefined(argv[1])) {
+ if (JS_ToIndex(ctx, &start, argv[1])) {
+ return JS_EXCEPTION;
+ }
+
+ start = njs_min(start, src.length);
+ }
+
+ if (!JS_IsUndefined(argv[2])) {
+ if (JS_ToIndex(ctx, &end, argv[2])) {
+ return JS_EXCEPTION;
+ }
+
+ end = njs_min(end, src.length);
+ }
+
+ if (start >= end) {
+ src.length = 0;
+
+ } else {
+ src.start += start;
+ src.length = end - start;
+ }
+
if (JS_IsUndefined(argv[0]) || src.length == 0) {
return JS_NewStringLen(ctx, (char *) src.start, src.length);
}
name: "Buffer.toString() tests",
skip: () => (!has_buffer()),
T: async (params) => {
- let r = Buffer.from(params.value).toString(params.fmt);
+ let r = Buffer.from(params.value).toString(params.fmt, params.start,
+ params.end);
if (r.length !== params.expected.length) {
throw Error(`unexpected "${r}" length ${r.length} != ${params.expected.length}`);
{ value: "ABCD", fmt: "base64", expected: 'QUJDRA==' },
{ value: "ABCD", fmt: "base64url", expected: 'QUJDRA' },
{ value: '', fmt: "utf-128", exception: 'TypeError: "utf-128" encoding is not supported' },
+ { value: "hello", fmt: "utf-8", start: 1, end: 4, expected: 'ell' },
+ { value: "hello", fmt: "utf-8", start: 3, end: 3, expected: '' },
+ { value: "hello", fmt: "utf-8", start: 10, end: 5, expected: '' },
+ { value: "hello", fmt: "utf-8", start: 4, end: 2, expected: '' },
+ { value: "hello", fmt: "hex", start: 4, end: 2, expected: '' },
]};