diff --git a/libcef/renderer/v8_impl.cc b/libcef/renderer/v8_impl.cc index 2932e2d9c..226915628 100644 --- a/libcef/renderer/v8_impl.cc +++ b/libcef/renderer/v8_impl.cc @@ -319,6 +319,8 @@ class V8TrackArrayBuffer : public CefTrackNode { buffer_(buffer), release_callback_(release_callback) { DCHECK(isolate_); + isolate_->AdjustAmountOfExternalAllocatedMemory( + static_cast(sizeof(V8TrackArrayBuffer))); } ~V8TrackArrayBuffer() { @@ -335,6 +337,13 @@ class V8TrackArrayBuffer : public CefTrackNode { void Neuter() { buffer_ = nullptr; } + // Attach this track object to the specified V8 object. + void AttachTo(v8::Local context, + v8::Local arrayBuffer) { + SetPrivate(context, arrayBuffer, kCefTrackObject, + v8::External::New(isolate_, this)); + } + // Retrieve the track object for the specified V8 object. static V8TrackArrayBuffer* Unwrap(v8::Local context, v8::Local object) { @@ -346,35 +355,10 @@ class V8TrackArrayBuffer : public CefTrackNode { return nullptr; } - // Attach this track object to the specified V8 object. - void AttachTo(v8::Local context, - v8::Local arrayBuffer) { - isolate_->AdjustAmountOfExternalAllocatedMemory( - static_cast(sizeof(V8TrackArrayBuffer))); - - SetPrivate(context, arrayBuffer, kCefTrackObject, - v8::External::New(isolate_, this)); - - handle_.Reset(isolate_, arrayBuffer); - handle_.SetWeak(this, FirstWeakCallback, v8::WeakCallbackType::kParameter); - handle_.MarkIndependent(); - } - private: - static void FirstWeakCallback( - const v8::WeakCallbackInfo& data) { - V8TrackArrayBuffer* wrapper = data.GetParameter(); - if (wrapper->buffer_ != nullptr) { - wrapper->release_callback_->ReleaseBuffer(wrapper->buffer_); - wrapper->buffer_ = nullptr; - } - wrapper->handle_.Reset(); - } - v8::Isolate* isolate_; void* buffer_; CefRefPtr release_callback_; - v8::Persistent handle_; }; // Object wrapped in a v8::External and passed as the Data argument to diff --git a/tests/cefclient/renderer/performance_test_tests.cc b/tests/cefclient/renderer/performance_test_tests.cc index 59476a3ec..16c476fdb 100644 --- a/tests/cefclient/renderer/performance_test_tests.cc +++ b/tests/cefclient/renderer/performance_test_tests.cc @@ -318,6 +318,24 @@ PERF_TEST_FUNC(V8ObjectGetValueWithAccessor) { PERF_ITERATIONS_END() } +PERF_TEST_FUNC(V8ArrayBufferCreate) { + class ReleaseCallback : public CefV8ArrayBufferReleaseCallback { + public: + void ReleaseBuffer(void* buffer) override { std::free(buffer); } + IMPLEMENT_REFCOUNTING(ReleaseCallback); + }; + + size_t len = 1; + size_t byte_len = len * sizeof(float); + CefRefPtr callback = new ReleaseCallback(); + + PERF_ITERATIONS_START() + float* buffer = (float*)std::malloc(byte_len); + CefRefPtr ret = + CefV8Value::CreateArrayBuffer(buffer, byte_len, callback); + PERF_ITERATIONS_END() +} + PERF_TEST_FUNC(V8ContextEnterExit) { CefRefPtr context = CefV8Context::GetCurrentContext(); @@ -363,6 +381,7 @@ const PerfTestEntry kPerfTests[] = { PERF_TEST_ENTRY(V8ObjectGetValue), PERF_TEST_ENTRY(V8ObjectSetValueWithAccessor), PERF_TEST_ENTRY(V8ObjectGetValueWithAccessor), + PERF_TEST_ENTRY(V8ArrayBufferCreate), PERF_TEST_ENTRY(V8ContextEnterExit), PERF_TEST_ENTRY(V8ContextEval), };