Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(36)

Unified Diff: src/api.cc

Issue 2327653002: Support delegating serialization of host objects. (Closed)
Patch Set: Isolate* argument to delegate Created 4 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« include/v8.h ('K') | « include/v8.h ('k') | src/value-serializer.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/api.cc
diff --git a/src/api.cc b/src/api.cc
index fc63c2c3163c732bf90d9f24bb741c98eddc56dc..a22846e20a6ac0719c246f078729addd779d61da 100644
--- a/src/api.cc
+++ b/src/api.cc
@@ -2847,6 +2847,15 @@ MaybeLocal<String> JSON::Stringify(Local<Context> context,
// --- V a l u e S e r i a l i z a t i o n ---
+Maybe<bool> ValueSerializer::Delegate::WriteHostObject(Isolate* v8_isolate,
+ Local<Object> object) {
+ i::Isolate* isolate = reinterpret_cast<i::Isolate*>(v8_isolate);
+ isolate->ScheduleThrow(*isolate->factory()->NewError(
+ isolate->error_function(), i::MessageTemplate::kDataCloneError,
+ Utils::OpenHandle(*object)));
+ return Nothing<bool>();
+}
+
struct ValueSerializer::PrivateData {
explicit PrivateData(i::Isolate* i, ValueSerializer::Delegate* delegate)
: isolate(i), serializer(i, delegate) {}
@@ -2891,9 +2900,30 @@ void ValueSerializer::TransferSharedArrayBuffer(
transfer_id, Utils::OpenHandle(*shared_array_buffer));
}
+void ValueSerializer::WriteUint32(uint32_t value) {
+ private_->serializer.WriteUint32(value);
+}
+
+void ValueSerializer::WriteUint64(uint64_t value) {
+ private_->serializer.WriteUint64(value);
+}
+
+void ValueSerializer::WriteRawBytes(const void* source, size_t length) {
+ private_->serializer.WriteRawBytes(source, length);
+}
+
+MaybeLocal<Object> ValueDeserializer::Delegate::ReadHostObject(
+ Isolate* v8_isolate) {
+ i::Isolate* isolate = reinterpret_cast<i::Isolate*>(v8_isolate);
+ isolate->ScheduleThrow(*isolate->factory()->NewError(
+ isolate->error_function(),
+ i::MessageTemplate::kDataCloneDeserializationError));
+ return MaybeLocal<Object>();
+}
+
struct ValueDeserializer::PrivateData {
- PrivateData(i::Isolate* i, i::Vector<const uint8_t> data)
- : isolate(i), deserializer(i, data) {}
+ PrivateData(i::Isolate* i, i::Vector<const uint8_t> data, Delegate* delegate)
+ : isolate(i), deserializer(i, data, delegate) {}
i::Isolate* isolate;
i::ValueDeserializer deserializer;
bool has_aborted = false;
@@ -2901,14 +2931,18 @@ struct ValueDeserializer::PrivateData {
};
ValueDeserializer::ValueDeserializer(Isolate* isolate, const uint8_t* data,
- size_t size) {
+ size_t size)
+ : ValueDeserializer(isolate, data, size, nullptr) {}
+
+ValueDeserializer::ValueDeserializer(Isolate* isolate, const uint8_t* data,
+ size_t size, Delegate* delegate) {
if (base::IsValueInRangeForNumericType<int>(size)) {
- private_ =
- new PrivateData(reinterpret_cast<i::Isolate*>(isolate),
- i::Vector<const uint8_t>(data, static_cast<int>(size)));
+ private_ = new PrivateData(
+ reinterpret_cast<i::Isolate*>(isolate),
+ i::Vector<const uint8_t>(data, static_cast<int>(size)), delegate);
} else {
private_ = new PrivateData(reinterpret_cast<i::Isolate*>(isolate),
- i::Vector<const uint8_t>(nullptr, 0));
+ i::Vector<const uint8_t>(nullptr, 0), nullptr);
private_->has_aborted = true;
}
}
@@ -2990,6 +3024,18 @@ void ValueDeserializer::TransferSharedArrayBuffer(
transfer_id, Utils::OpenHandle(*shared_array_buffer));
}
+bool ValueDeserializer::ReadUint32(uint32_t* value) {
+ return private_->deserializer.ReadUint32(value);
+}
+
+bool ValueDeserializer::ReadUint64(uint64_t* value) {
+ return private_->deserializer.ReadUint64(value);
+}
+
+bool ValueDeserializer::ReadRawBytes(size_t length, const void** data) {
+ return private_->deserializer.ReadRawBytes(length, data);
+}
+
// --- D a t a ---
bool Value::FullIsUndefined() const {
« include/v8.h ('K') | « include/v8.h ('k') | src/value-serializer.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698