Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

node api to create isolate/context #22

Closed
Closed
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
fix and re-enable builtin type transportation (microsoft#235)
  • Loading branch information
Allen Yongshuang Wang authored and helloshuangzi committed May 9, 2018
commit d1b883a2f68693b244329986b6ca8b27311fbba5
32 changes: 31 additions & 1 deletion src/v8-extensions/deserializer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,8 @@ MaybeLocal<Value> Deserializer::ReadValue() {
return MaybeLocal<Value>();
}

#if !V8_VERSION_EQUALS_TO_OR_NEWER_THAN(6, 6)

uint32_t index = 0;
Local<String> key = v8_helpers::MakeV8String(_isolate, "_externalized");
for (const auto& contents : _data->GetExternalizedSharedArrayBufferContents()) {
Expand All @@ -40,10 +42,38 @@ MaybeLocal<Value> Deserializer::ReadValue() {
_deserializer.TransferSharedArrayBuffer(index++, sharedArrayBuffers);
}

#endif

return _deserializer.ReadValue(context);
}

Deserializer* Deserializer::NewDeserializer(v8::Isolate* isolate, std::shared_ptr<SerializedData> data) {
#if V8_VERSION_EQUALS_TO_OR_NEWER_THAN(6, 6)

MaybeLocal<SharedArrayBuffer> Deserializer::GetSharedArrayBufferFromId(
Isolate* isolate, uint32_t cloneId) {
if (_data && cloneId < _data->GetExternalizedSharedArrayBufferContents().size()) {
auto externalizedSharedArrayBufferContents = _data->GetExternalizedSharedArrayBufferContents().at(cloneId);
SharedArrayBuffer::Contents contents = externalizedSharedArrayBufferContents.first;
auto sharedArrayBuffer = SharedArrayBuffer::New(isolate, contents.Data(), contents.ByteLength());

// After deserialization of a SharedArrayBuffer from its SerializedData,
// set its '_externalized' property to a ShareableWrap of its ExternalizedContents.
// This extends the lifecycle of the ExternalizedContents
// by the lifetime of the restored SharedArrayBuffer object.
Local<Context> context = _isolate->GetCurrentContext();
Local<String> key = v8_helpers::MakeV8String(_isolate, "_externalized");
auto shareableWrap = napa::module::binding::CreateShareableWrap(externalizedSharedArrayBufferContents.second);
sharedArrayBuffer->CreateDataProperty(context, key, shareableWrap);
return sharedArrayBuffer;
}
else {
return MaybeLocal<SharedArrayBuffer>();
}
}

#endif

Deserializer* Deserializer::NewDeserializer(Isolate* isolate, std::shared_ptr<SerializedData> data) {
return new Deserializer(isolate, data);
}

Expand Down
10 changes: 9 additions & 1 deletion src/v8-extensions/deserializer.h
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,15 @@ namespace v8_extensions {

v8::MaybeLocal<v8::Value> ReadValue();

static Deserializer* NewDeserializer(v8::Isolate* isolate, std::shared_ptr<SerializedData> data);
#if V8_VERSION_EQUALS_TO_OR_NEWER_THAN(6, 6)

v8::MaybeLocal<v8::SharedArrayBuffer> GetSharedArrayBufferFromId(
v8::Isolate* isolate, uint32_t cloneId) override;

#endif

static Deserializer* NewDeserializer(
v8::Isolate* isolate, std::shared_ptr<SerializedData> data);

private:
v8::Isolate* _isolate;
Expand Down
7 changes: 3 additions & 4 deletions test/transport-test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -341,12 +341,11 @@ describe('napajs/transport', () => {

let builtinTestGroup = 'Transport built-in objects';
let nodeVersionMajor = parseInt(process.versions.node.split('.')[0]);

// TODO #223: Fix transportation support for builtin types, which is broken due to breaking changes of v8 introduced from node v10.0.0.
if (nodeVersionMajor == 9) {

if (nodeVersionMajor >= 9) {
describe(builtinTestGroup, transportBuiltinObjects);
} else {
describe.skip(builtinTestGroup, transportBuiltinObjects);
require('npmlog').warn(builtinTestGroup, 'This test group is skipped since it requires node v9.0.0 .');
require('npmlog').warn(builtinTestGroup, 'This test group is skipped since it requires node v9.0.0 or above.');
}
});