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

Unified Diff: runtime/vm/isolate.cc

Issue 834233003: Fix for issue 21398 (only send "literal like" objects across isolates spawned using spawnURI (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 5 years, 11 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
« no previous file with comments | « runtime/vm/isolate.h ('k') | runtime/vm/json_stream.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: runtime/vm/isolate.cc
===================================================================
--- runtime/vm/isolate.cc (revision 42788)
+++ runtime/vm/isolate.cc (working copy)
@@ -52,6 +52,24 @@
#define I (isolate())
+#if defined(DEBUG)
+// Helper class to ensure that a live origin_id is never reused
+// and assigned to an isolate.
+class VerifyOriginId : public IsolateVisitor {
+ public:
+ explicit VerifyOriginId(Dart_Port id) : id_(id) {}
+
+ void VisitIsolate(Isolate* isolate) {
+ ASSERT(isolate->origin_id() != id_);
+ }
+
+ private:
+ Dart_Port id_;
+ DISALLOW_COPY_AND_ASSIGN(VerifyOriginId);
+};
+#endif
+
+
static uint8_t* allocator(uint8_t* ptr, intptr_t old_size, intptr_t new_size) {
void* new_ptr = realloc(reinterpret_cast<void*>(ptr), new_size);
return reinterpret_cast<uint8_t*>(new_ptr);
@@ -60,8 +78,9 @@
static void SerializeObject(const Instance& obj,
uint8_t** obj_data,
- intptr_t* obj_len) {
- MessageWriter writer(obj_data, &allocator);
+ intptr_t* obj_len,
+ bool allow_any_object) {
+ MessageWriter writer(obj_data, &allocator, allow_any_object);
writer.WriteMessage(obj);
*obj_len = writer.BytesWritten();
}
@@ -178,7 +197,7 @@
if (priority == kImmediateAction) {
uint8_t* data = NULL;
intptr_t len = 0;
- SerializeObject(Object::null_instance(), &data, &len);
+ SerializeObject(Object::null_instance(), &data, &len, false);
PortMap::PostMessage(new Message(send_port.Id(),
data, len,
Message::kNormalPriority));
@@ -192,7 +211,7 @@
message.SetAt(3, Smi::Handle(I, Smi::New(kImmediateAction)));
uint8_t* data = NULL;
intptr_t len = 0;
- SerializeObject(message, &data, &len);
+ SerializeObject(message, &data, &len, false);
this->PostMessage(new Message(Message::kIllegalPort,
data, len,
Message::kNormalPriority),
@@ -220,7 +239,7 @@
message.SetAt(3, Smi::Handle(I, Smi::New(kImmediateAction)));
uint8_t* data = NULL;
intptr_t len = 0;
- SerializeObject(message, &data, &len);
+ SerializeObject(message, &data, &len, false);
this->PostMessage(new Message(Message::kIllegalPort,
data, len,
Message::kNormalPriority),
@@ -422,6 +441,7 @@
name_(NULL),
start_time_(OS::GetCurrentTimeMicros()),
main_port_(0),
+ origin_id_(0),
pause_capability_(0),
terminate_capability_(0),
heap_(NULL),
@@ -632,6 +652,12 @@
// main thread.
result->SetStackLimitFromStackBase(reinterpret_cast<uword>(&result));
result->set_main_port(PortMap::CreatePort(result->message_handler()));
+#if defined(DEBUG)
+ // Verify that we are never reusing a live origin id.
+ VerifyOriginId id_verifier(result->main_port());
+ Isolate::VisitIsolates(&id_verifier);
+#endif
+ result->set_origin_id(result->main_port());
result->set_pause_capability(result->random()->NextUInt64());
result->set_terminate_capability(result->random()->NextUInt64());
@@ -1486,7 +1512,11 @@
const String& class_name = String::Handle(cls.Name());
class_name_ = strdup(class_name.ToCString());
}
- SerializeObject(message, &serialized_message_, &serialized_message_len_);
+ bool can_send_any_object = true;
+ SerializeObject(message,
+ &serialized_message_,
+ &serialized_message_len_,
+ can_send_any_object);
}
@@ -1513,8 +1543,15 @@
}
library_url_ = NULL;
function_name_ = strdup("main");
- SerializeObject(args, &serialized_args_, &serialized_args_len_);
- SerializeObject(message, &serialized_message_, &serialized_message_len_);
+ bool can_send_any_object = false;
+ SerializeObject(args,
+ &serialized_args_,
+ &serialized_args_len_,
+ can_send_any_object);
+ SerializeObject(message,
+ &serialized_message_,
+ &serialized_message_len_,
+ can_send_any_object);
}
« no previous file with comments | « runtime/vm/isolate.h ('k') | runtime/vm/json_stream.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698