src: allow ArrayBufferView as instance of Buffer
PR-URL: https://github.com/nodejs/node/pull/12223 Reviewed-By: Matteo Collina <matteo.collina@gmail.com> Reviewed-By: James M Snell <jasnell@gmail.com> Reviewed-By: Anna Henningsen <anna@addaleax.net>
This commit is contained in:
parent
ec53921d2e
commit
faa447b256
@ -70,6 +70,7 @@ namespace Buffer {
|
|||||||
|
|
||||||
using v8::ArrayBuffer;
|
using v8::ArrayBuffer;
|
||||||
using v8::ArrayBufferCreationMode;
|
using v8::ArrayBufferCreationMode;
|
||||||
|
using v8::ArrayBufferView;
|
||||||
using v8::Context;
|
using v8::Context;
|
||||||
using v8::EscapableHandleScope;
|
using v8::EscapableHandleScope;
|
||||||
using v8::FunctionCallbackInfo;
|
using v8::FunctionCallbackInfo;
|
||||||
@ -195,41 +196,41 @@ inline MUST_USE_RESULT bool ParseArrayIndex(Local<Value> arg,
|
|||||||
// Buffer methods
|
// Buffer methods
|
||||||
|
|
||||||
bool HasInstance(Local<Value> val) {
|
bool HasInstance(Local<Value> val) {
|
||||||
return val->IsUint8Array();
|
return val->IsArrayBufferView();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool HasInstance(Local<Object> obj) {
|
bool HasInstance(Local<Object> obj) {
|
||||||
return obj->IsUint8Array();
|
return obj->IsArrayBufferView();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
char* Data(Local<Value> val) {
|
char* Data(Local<Value> val) {
|
||||||
CHECK(val->IsUint8Array());
|
CHECK(val->IsArrayBufferView());
|
||||||
Local<Uint8Array> ui = val.As<Uint8Array>();
|
Local<ArrayBufferView> ui = val.As<ArrayBufferView>();
|
||||||
ArrayBuffer::Contents ab_c = ui->Buffer()->GetContents();
|
ArrayBuffer::Contents ab_c = ui->Buffer()->GetContents();
|
||||||
return static_cast<char*>(ab_c.Data()) + ui->ByteOffset();
|
return static_cast<char*>(ab_c.Data()) + ui->ByteOffset();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
char* Data(Local<Object> obj) {
|
char* Data(Local<Object> obj) {
|
||||||
CHECK(obj->IsUint8Array());
|
CHECK(obj->IsArrayBufferView());
|
||||||
Local<Uint8Array> ui = obj.As<Uint8Array>();
|
Local<ArrayBufferView> ui = obj.As<ArrayBufferView>();
|
||||||
ArrayBuffer::Contents ab_c = ui->Buffer()->GetContents();
|
ArrayBuffer::Contents ab_c = ui->Buffer()->GetContents();
|
||||||
return static_cast<char*>(ab_c.Data()) + ui->ByteOffset();
|
return static_cast<char*>(ab_c.Data()) + ui->ByteOffset();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
size_t Length(Local<Value> val) {
|
size_t Length(Local<Value> val) {
|
||||||
CHECK(val->IsUint8Array());
|
CHECK(val->IsArrayBufferView());
|
||||||
Local<Uint8Array> ui = val.As<Uint8Array>();
|
Local<ArrayBufferView> ui = val.As<ArrayBufferView>();
|
||||||
return ui->ByteLength();
|
return ui->ByteLength();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
size_t Length(Local<Object> obj) {
|
size_t Length(Local<Object> obj) {
|
||||||
CHECK(obj->IsUint8Array());
|
CHECK(obj->IsArrayBufferView());
|
||||||
Local<Uint8Array> ui = obj.As<Uint8Array>();
|
Local<ArrayBufferView> ui = obj.As<ArrayBufferView>();
|
||||||
return ui->ByteLength();
|
return ui->ByteLength();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -800,7 +801,7 @@ void WriteFloatGeneric(const FunctionCallbackInfo<Value>& args) {
|
|||||||
THROW_AND_RETURN_UNLESS_BUFFER(env, args[0]);
|
THROW_AND_RETURN_UNLESS_BUFFER(env, args[0]);
|
||||||
}
|
}
|
||||||
|
|
||||||
Local<Uint8Array> ts_obj = args[0].As<Uint8Array>();
|
Local<ArrayBufferView> ts_obj = args[0].As<ArrayBufferView>();
|
||||||
ArrayBuffer::Contents ts_obj_c = ts_obj->Buffer()->GetContents();
|
ArrayBuffer::Contents ts_obj_c = ts_obj->Buffer()->GetContents();
|
||||||
const size_t ts_obj_offset = ts_obj->ByteOffset();
|
const size_t ts_obj_offset = ts_obj->ByteOffset();
|
||||||
const size_t ts_obj_length = ts_obj->ByteLength();
|
const size_t ts_obj_length = ts_obj->ByteLength();
|
||||||
|
@ -439,8 +439,8 @@ class BufferValue : public MaybeStackBuffer<char> {
|
|||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
#define SPREAD_BUFFER_ARG(val, name) \
|
#define SPREAD_BUFFER_ARG(val, name) \
|
||||||
CHECK((val)->IsUint8Array()); \
|
CHECK((val)->IsArrayBufferView()); \
|
||||||
v8::Local<v8::Uint8Array> name = (val).As<v8::Uint8Array>(); \
|
v8::Local<v8::ArrayBufferView> name = (val).As<v8::ArrayBufferView>(); \
|
||||||
v8::ArrayBuffer::Contents name##_c = name->Buffer()->GetContents(); \
|
v8::ArrayBuffer::Contents name##_c = name->Buffer()->GetContents(); \
|
||||||
const size_t name##_offset = name->ByteOffset(); \
|
const size_t name##_offset = name->ByteOffset(); \
|
||||||
const size_t name##_length = name->ByteLength(); \
|
const size_t name##_length = name->ByteLength(); \
|
||||||
|
@ -18,7 +18,7 @@ function write(funx, args, result, res) {
|
|||||||
|
|
||||||
if (!/Int/.test(funx)) {
|
if (!/Int/.test(funx)) {
|
||||||
assert.throws(
|
assert.throws(
|
||||||
() => Buffer.alloc(9)[funx].apply(new Uint32Array(1), args),
|
() => Buffer.alloc(9)[funx].apply(new Map(), args),
|
||||||
/^TypeError: argument should be a Buffer$/
|
/^TypeError: argument should be a Buffer$/
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user