| Index: ppapi/cpp/var.cc
|
| ===================================================================
|
| --- ppapi/cpp/var.cc (revision 95308)
|
| +++ ppapi/cpp/var.cc (working copy)
|
| @@ -117,20 +117,21 @@
|
| }
|
|
|
| Var& Var::operator=(const Var& other) {
|
| - if (needs_release_ && has_interface<PPB_Var>())
|
| - get_interface<PPB_Var>()->Release(var_);
|
| - var_ = other.var_;
|
| - if (NeedsRefcounting(var_)) {
|
| - if (has_interface<PPB_Var>()) {
|
| - needs_release_ = true;
|
| - get_interface<PPB_Var>()->AddRef(var_);
|
| - } else {
|
| - var_.type = PP_VARTYPE_NULL;
|
| - needs_release_ = false;
|
| - }
|
| + // Be careful to keep the ref alive for cases where we're assigning an
|
| + // object to itself by addrefing the new one before releasing the old one.
|
| + bool old_needs_release = needs_release_;
|
| + if (NeedsRefcounting(other.var_)) {
|
| + // Assume we already has_interface<PPB_Var> for refcounted vars or else we
|
| + // couldn't have created them in the first place.
|
| + needs_release_ = true;
|
| + get_interface<PPB_Var>()->AddRef(other.var_);
|
| } else {
|
| needs_release_ = false;
|
| }
|
| + if (old_needs_release)
|
| + get_interface<PPB_Var>()->Release(var_);
|
| +
|
| + var_ = other.var_;
|
| return *this;
|
| }
|
|
|
|
|