Index: ppapi/proxy/serialized_var.cc |
=================================================================== |
--- ppapi/proxy/serialized_var.cc (revision 72840) |
+++ ppapi/proxy/serialized_var.cc (working copy) |
@@ -19,7 +19,8 @@ |
SerializedVar::Inner::Inner() |
: serialization_rules_(NULL), |
var_(PP_MakeUndefined()), |
- cleanup_mode_(CLEANUP_NONE) { |
+ cleanup_mode_(CLEANUP_NONE), |
+ dispatcher_for_end_send_pass_ref_(NULL) { |
#ifndef NDEBUG |
has_been_serialized_ = false; |
has_been_deserialized_ = false; |
@@ -29,7 +30,8 @@ |
SerializedVar::Inner::Inner(VarSerializationRules* serialization_rules) |
: serialization_rules_(serialization_rules), |
var_(PP_MakeUndefined()), |
- cleanup_mode_(CLEANUP_NONE) { |
+ cleanup_mode_(CLEANUP_NONE), |
+ dispatcher_for_end_send_pass_ref_(NULL) { |
#ifndef NDEBUG |
has_been_serialized_ = false; |
has_been_deserialized_ = false; |
@@ -40,7 +42,8 @@ |
const PP_Var& var) |
: serialization_rules_(serialization_rules), |
var_(var), |
- cleanup_mode_(CLEANUP_NONE) { |
+ cleanup_mode_(CLEANUP_NONE), |
+ dispatcher_for_end_send_pass_ref_(NULL) { |
#ifndef NDEBUG |
has_been_serialized_ = false; |
has_been_deserialized_ = false; |
@@ -50,7 +53,9 @@ |
SerializedVar::Inner::~Inner() { |
switch (cleanup_mode_) { |
case END_SEND_PASS_REF: |
- serialization_rules_->EndSendPassRef(var_); |
+ DCHECK(dispatcher_for_end_send_pass_ref_); |
+ serialization_rules_->EndSendPassRef(var_, |
+ dispatcher_for_end_send_pass_ref_); |
break; |
case END_RECEIVE_CALLER_OWNED: |
serialization_rules_->EndReceiveCallerOwned(var_); |
@@ -204,6 +209,18 @@ |
return success; |
} |
+void SerializedVar::Inner::SetCleanupModeToEndSendPassRef( |
+ Dispatcher* dispatcher) { |
+ DCHECK(dispatcher); |
+ DCHECK(!dispatcher_for_end_send_pass_ref_); |
+ dispatcher_for_end_send_pass_ref_ = dispatcher; |
+ cleanup_mode_ = END_SEND_PASS_REF; |
+} |
+ |
+void SerializedVar::Inner::SetCleanupModeToEndReceiveCallerOwned() { |
+ cleanup_mode_ = END_RECEIVE_CALLER_OWNED; |
+} |
+ |
// SerializedVar --------------------------------------------------------------- |
SerializedVar::SerializedVar() : inner_(new Inner) { |
@@ -339,7 +356,7 @@ |
// Ensure that when the serialized var goes out of scope it cleans up the |
// stuff we're making in BeginReceiveCallerOwned. |
- serialized_.inner_->set_cleanup_mode(SerializedVar::END_RECEIVE_CALLER_OWNED); |
+ serialized_.inner_->SetCleanupModeToEndReceiveCallerOwned(); |
serialized_.inner_->SetVar( |
serialized_.inner_->serialization_rules()->BeginReceiveCallerOwned( |
@@ -396,7 +413,7 @@ |
dispatcher->serialization_rules()); |
// Var must clean up after our BeginSendPassRef call. |
- serialized_->inner_->set_cleanup_mode(SerializedVar::END_SEND_PASS_REF); |
+ serialized_->inner_->SetCleanupModeToEndSendPassRef(dispatcher); |
serialized_->inner_->SetVar( |
dispatcher->serialization_rules()->BeginSendPassRef( |
@@ -408,7 +425,8 @@ |
SerializedVarOutParam::SerializedVarOutParam(SerializedVar* serialized) |
: serialized_(serialized), |
- writable_var_(PP_MakeUndefined()) { |
+ writable_var_(PP_MakeUndefined()), |
+ dispatcher_(NULL) { |
} |
SerializedVarOutParam::~SerializedVarOutParam() { |
@@ -422,11 +440,12 @@ |
// Normally the current object will be created on the stack to wrap a |
// SerializedVar and won't have a scope around the actual IPC send. So we |
// need to tell the SerializedVar to do the begin/end send pass ref calls. |
- serialized_->inner_->set_cleanup_mode(SerializedVar::END_SEND_PASS_REF); |
+ serialized_->inner_->SetCleanupModeToEndSendPassRef(dispatcher_); |
} |
} |
PP_Var* SerializedVarOutParam::OutParam(Dispatcher* dispatcher) { |
+ dispatcher_ = dispatcher; |
serialized_->inner_->set_serialization_rules( |
dispatcher->serialization_rules()); |
return &writable_var_; |
@@ -468,6 +487,25 @@ |
return &array_; |
} |
+SerializedVarTestConstructor::SerializedVarTestConstructor( |
+ const PP_Var& pod_var) { |
+ DCHECK(pod_var.type != PP_VARTYPE_STRING); |
+ inner_->SetVar(pod_var); |
+} |
+ |
+SerializedVarTestConstructor::SerializedVarTestConstructor( |
+ const std::string& str) { |
+ PP_Var string_var; |
+ string_var.type = PP_VARTYPE_STRING; |
+ string_var.value.as_id = 0; |
+ inner_->SetVar(string_var); |
+ *inner_->GetStringPtr() = str; |
+} |
+ |
+SerializedVarTestReader::SerializedVarTestReader(const SerializedVar& var) |
+ : SerializedVar(var) { |
+} |
+ |
} // namespace proxy |
} // namespace pp |