diff options
author | Joyee Cheung <joyeec9h3@gmail.com> | 2018-11-06 18:05:48 +0800 |
---|---|---|
committer | Michaƫl Zasso <targos@protonmail.com> | 2018-12-06 15:25:38 +0100 |
commit | 0e090768de1844c493013d5e99bd903928aff2ab (patch) | |
tree | dde246dd6e38b75366106600cff75d958b9d16cb /deps/v8/src/api.cc | |
parent | 5620727f30e5867671d9ec03b77a36fb7ca7ff4f (diff) | |
download | android-node-v8-0e090768de1844c493013d5e99bd903928aff2ab.tar.gz android-node-v8-0e090768de1844c493013d5e99bd903928aff2ab.tar.bz2 android-node-v8-0e090768de1844c493013d5e99bd903928aff2ab.zip |
deps: cherry-pick 0483e9a from upstream V8
Original commit message:
[api] Allow embedder to construct an Array from Local<Value>*
Currently to obtain a v8::Array out of a C array or a std::vector,
one needs to loop through the elements and call array->Set() multiple
times, and these calls go into v8::Object::Set() which can be slow.
This patch adds a new Array::New overload that converts a
Local<Value>* with known size into a Local<Array>.
Change-Id: I0a768f0e18eec51e78d58be455482ec6425ca188
Reviewed-on: https://chromium-review.googlesource.com/c/1317049
Reviewed-by: Yang Guo <yangguo@chromium.org>
Reviewed-by: Adam Klein <adamk@chromium.org>
Commit-Queue: Joyee Cheung <joyee@igalia.com>
Cr-Commit-Position: refs/heads/master@{#57261}
Refs: https://github.com/v8/v8/commit/0483e9a9abe77a73632fd85b9c0cd608efa9aa0d
PR-URL: https://github.com/nodejs/node/pull/24125
Reviewed-By: Anna Henningsen <anna@addaleax.net>
Reviewed-By: Yang Guo <yangguo@chromium.org>
Reviewed-By: Gus Caplan <me@gus.host>
Reviewed-By: Colin Ihrig <cjihrig@gmail.com>
Reviewed-By: Ben Noordhuis <info@bnoordhuis.nl>
Reviewed-By: Refael Ackermann <refack@gmail.com>
Diffstat (limited to 'deps/v8/src/api.cc')
-rw-r--r-- | deps/v8/src/api.cc | 17 |
1 files changed, 17 insertions, 0 deletions
diff --git a/deps/v8/src/api.cc b/deps/v8/src/api.cc index 3f62a23d43..4e233d96dc 100644 --- a/deps/v8/src/api.cc +++ b/deps/v8/src/api.cc @@ -6911,6 +6911,23 @@ Local<v8::Array> v8::Array::New(Isolate* isolate, int length) { return Utils::ToLocal(obj); } +Local<v8::Array> v8::Array::New(Isolate* isolate, Local<Value>* elements, + size_t length) { + i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate); + i::Factory* factory = i_isolate->factory(); + LOG_API(i_isolate, Array, New); + ENTER_V8_NO_SCRIPT_NO_EXCEPTION(i_isolate); + int len = static_cast<int>(length); + + i::Handle<i::FixedArray> result = factory->NewFixedArray(len); + for (int i = 0; i < len; i++) { + i::Handle<i::Object> element = Utils::OpenHandle(*elements[i]); + result->set(i, *element); + } + + return Utils::ToLocal( + factory->NewJSArrayWithElements(result, i::PACKED_ELEMENTS, len)); +} uint32_t v8::Array::Length() const { i::Handle<i::JSArray> obj = Utils::OpenHandle(this); |