| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
1 parent 7d0b589 commit 5667369
4 files changed
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -362,6 +362,11 @@ MaybeLocal<Object> New(Environment* env, | |||
| 362 | 362 | } | |
| 363 | 363 | ||
| 364 | 364 | Local<ArrayBuffer> ab = ArrayBuffer::New(env->isolate(), data, length); | |
| 365 | + // `Neuter()`ing is required here to prevent materialization of the backing | ||
| 366 | + // store in v8. `nullptr` buffers are not writable, so this is semantically | ||
| 367 | + // correct. | ||
| 368 | + if (data == nullptr) | ||
| 369 | + ab->Neuter(); | ||
| 365 | 370 | Local<Uint8Array> ui = Uint8Array::New(ab, 0, length); | |
| 366 | 371 | Maybe<bool> mb = | |
| 367 | 372 | ui->SetPrototype(env->context(), env->buffer_prototype_object()); | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -0,0 +1,40 @@ | |||
| 1 | + #include <node.h> | ||
| 2 | + #include <node_buffer.h> | ||
| 3 | + #include <util.h> | ||
| 4 | + #include <v8.h> | ||
| 5 | + | ||
| 6 | + static int alive; | ||
| 7 | + | ||
| 8 | + static void FreeCallback(char* data, void* hint) { | ||
| 9 | + CHECK_EQ(data, nullptr); | ||
| 10 | + alive--; | ||
| 11 | + } | ||
| 12 | + | ||
| 13 | + void Run(const v8::FunctionCallbackInfo<v8::Value>& args) { | ||
| 14 | + v8::Isolate* isolate = args.GetIsolate(); | ||
| 15 | + alive++; | ||
| 16 | + | ||
| 17 | + { | ||
| 18 | + v8::HandleScope scope(isolate); | ||
| 19 | + v8::Local<v8::Object> buf = node::Buffer::New( | ||
| 20 | + isolate, | ||
| 21 | + nullptr, | ||
| 22 | + 0, | ||
| 23 | + FreeCallback, | ||
| 24 | + nullptr).ToLocalChecked(); | ||
| 25 | + | ||
| 26 | + char* data = node::Buffer::Data(buf); | ||
| 27 | + CHECK_EQ(data, nullptr); | ||
| 28 | + } | ||
| 29 | + | ||
| 30 | + isolate->RequestGarbageCollectionForTesting( | ||
| 31 | + v8::Isolate::kFullGarbageCollection); | ||
| 32 | + | ||
| 33 | + CHECK_EQ(alive, 0); | ||
| 34 | + } | ||
| 35 | + | ||
| 36 | + void init(v8::Local<v8::Object> target) { | ||
| 37 | + NODE_SET_METHOD(target, "run", Run); | ||
| 38 | + } | ||
| 39 | + | ||
| 40 | + NODE_MODULE(binding, init); | ||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -0,0 +1,8 @@ | |||
| 1 | + { | ||
| 2 | + 'targets': [ | ||
| 3 | + { | ||
| 4 | + 'target_name': 'binding', | ||
| 5 | + 'sources': [ 'binding.cc' ] | ||
| 6 | + } | ||
| 7 | + ] | ||
| 8 | + } | ||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -0,0 +1,7 @@ | |||
| 1 | + 'use strict'; | ||
| 2 | + // Flags: --expose-gc | ||
| 3 | + | ||
| 4 | + require('../../common'); | ||
| 5 | + var binding = require('./build/Release/binding'); | ||
| 6 | + | ||
| 7 | + binding.run(); | ||
| Back | FazBrowse Home | New Git URL |
0 commit comments