}
name = JS_GetPropertyStr(ctx, ctor, "name");
+ JS_FreeValue(ctx, ctor);
if (JS_IsException(name)) {
JS_FreeValue(ctx, ret);
return name;
}
- JS_FreeValue(ctx, ctor);
str = JS_ToCString(ctx, name);
+ if (str == NULL) {
+ JS_FreeValue(ctx, name);
+ JS_FreeValue(ctx, ret);
+ return JS_EXCEPTION;
+ }
if (strncmp(str, "Float32Array", 12) == 0) {
float32 = 1;
njs_str_t src, dst;
size = size / bytes;
+ offset = offset / bytes;
buffer = qjs_buffer_alloc(ctx, size);
if (JS_IsException(buffer)) {
JS_FreeValue(ctx, arr_buf);
ret = qjs_typed_array_data(ctx, buffer, &dst);
if (JS_IsException(ret)) {
- return ret;
+ goto fail;
}
p = dst.start;
for (i = 0; i < len; i++) {
ret = JS_GetPropertyUint32(ctx, obj, i);
if (njs_slow_path(JS_IsException(ret))) {
- return ret;
+ goto fail;
}
if (njs_slow_path(JS_ToInt32(ctx, &v, ret))) {
- return JS_EXCEPTION;
+ JS_FreeValue(ctx, ret);
+ goto fail;
}
JS_FreeValue(ctx, ret);
}
return buffer;
+
+fail:
+
+ JS_FreeValue(ctx, buffer);
+
+ return JS_EXCEPTION;
}
}
name.start = (u_char *) JS_ToCStringLen(ctx, &name.length, value);
+ if (name.start == NULL) {
+ return NULL;
+ }
for (encoding = &qjs_buffer_encodings[0];
encoding->name.length != 0;
}
}
- JS_FreeCString(ctx, (char *) name.start);
-
if (thrw) {
JS_ThrowTypeError(ctx, "\"%.*s\" encoding is not supported",
(int) name.length, name.start);
}
+ JS_FreeCString(ctx, (char *) name.start);
+
return NULL;
}
};
+function typedArrayWithOffset(TypedArray, prefix, values) {
+ let bytes = TypedArray.BYTES_PER_ELEMENT;
+ let buffer = new ArrayBuffer((prefix.length + values.length) * bytes);
+ let view = new TypedArray(buffer, prefix.length * bytes, values.length);
+
+ new TypedArray(buffer, 0, prefix.length).set(prefix);
+ view.set(values);
+
+ return view;
+}
+
+
let from_tsuite = {
name: "Buffer.from() tests",
skip: () => (!has_buffer()),
{ args: [new Float32Array([234.001, 123.11])], fmt: "hex", expected: 'ea7b' },
{ args: [new Uint32Array([234, 123])], fmt: "hex", expected: 'ea7b' },
{ args: [new Float64Array([234.001, 123.11])], fmt: "hex", expected: 'ea7b' },
+ { args: [typedArrayWithOffset(Uint16Array,
+ [0xaaaa, 0xbbbb, 0xcccc, 0xdddd],
+ [0x1234, 0x00ff, 0x0100, 0x017f])],
+ fmt: "hex", expected: '34ff007f' },
+ { args: [typedArrayWithOffset(Uint32Array,
+ [0xaaaaaaaa, 0xbbbbbbbb,
+ 0xcccccccc, 0xdddddddd],
+ [0x12345678, 0x000000ff,
+ 0x00000100, 0x0000017f])],
+ fmt: "hex", expected: '78ff007f' },
+ { args: [typedArrayWithOffset(Float64Array,
+ [1000.01, 1001.01], [234.001, 123.11])],
+ fmt: "hex", expected: 'ea7b' },
{ args: [(new Uint8Array(2)).buffer, -1],
exception: 'RangeError: invalid index' },
fmt: "hex", expected: '010203' },
{ args: [(function() {var a = [1,2,3,4]; a[1] = { valueOf() { a.length = 3; return 1; } }; return a})()],
fmt: "hex", expected: '01010300' },
+ { args: [{length: 3, get 0() { throw Error('boom') }}],
+ exception: 'Error: boom' },
+ { args: [{length: 3, 0: { valueOf() { throw Error('boom') } }}],
+ exception: 'Error: boom' },
{ args: [{type: 'B'}],
exception: 'TypeError: first argument is not a string or Buffer-like object' },