Index: ppapi/cpp/var.cc |
diff --git a/ppapi/cpp/var.cc b/ppapi/cpp/var.cc |
index 1108e05ef46488ced290cef1d8f6ee7ae366fcf2..da4c12c4388294f13b62ce142dbf9c7bd5e2ef90 100644 |
--- a/ppapi/cpp/var.cc |
+++ b/ppapi/cpp/var.cc |
@@ -39,9 +39,8 @@ inline bool NeedsRefcounting(const PP_Var& var) { |
return var.type > PP_VARTYPE_DOUBLE; |
} |
-// This helper function detects whether PPB_Var version 1.1 is available. If so, |
-// it uses it to create a PP_Var for the given string. Otherwise it falls back |
-// to PPB_Var version 1.0. |
+// This helper function uses the latest available version of VarFromUtf8. Note |
+// that version 1.0 of this method has a different API to later versions. |
PP_Var VarFromUtf8Helper(const char* utf8_str, uint32_t len) { |
if (has_interface<PPB_Var_1_1>()) { |
return get_interface<PPB_Var_1_1>()->VarFromUtf8(utf8_str, len); |
@@ -54,6 +53,34 @@ PP_Var VarFromUtf8Helper(const char* utf8_str, uint32_t len) { |
} |
} |
+// This helper function uses the latest available version of AddRef. |
+// Returns true on success, false if no appropriate interface was available. |
+bool AddRefHelper(const PP_Var& var) { |
+ if (has_interface<PPB_Var_1_1>()) { |
+ get_interface<PPB_Var_1_1>()->AddRef(var); |
+ return true; |
+ } else if (has_interface<PPB_Var_1_0>()) { |
+ get_interface<PPB_Var_1_0>()->AddRef(var); |
+ return true; |
+ } else { |
+ return false; |
+ } |
dmichael (off chromium)
2014/02/10 22:53:08
per the style guide (as mentioned in https://coder
Matt Giuca
2014/02/10 23:58:10
Done.
|
+} |
+ |
+// This helper function uses the latest available version of Release. |
+// Returns true on success, false if no appropriate interface was available. |
+bool ReleaseHelper(const PP_Var& var) { |
+ if (has_interface<PPB_Var_1_1>()) { |
+ get_interface<PPB_Var_1_1>()->Release(var); |
+ return true; |
+ } else if (has_interface<PPB_Var_1_0>()) { |
+ get_interface<PPB_Var_1_0>()->Release(var); |
+ return true; |
+ } else { |
+ return false; |
+ } |
+} |
+ |
} // namespace |
Var::Var() { |
@@ -106,9 +133,7 @@ Var::Var(const PP_Var& var) { |
var_ = var; |
is_managed_ = true; |
if (NeedsRefcounting(var_)) { |
- if (has_interface<PPB_Var_1_0>()) |
- get_interface<PPB_Var_1_0>()->AddRef(var_); |
- else |
+ if (!AddRefHelper(var_)) |
var_.type = PP_VARTYPE_NULL; |
} |
} |
@@ -117,18 +142,14 @@ Var::Var(const Var& other) { |
var_ = other.var_; |
is_managed_ = true; |
if (NeedsRefcounting(var_)) { |
- if (has_interface<PPB_Var_1_0>()) |
- get_interface<PPB_Var_1_0>()->AddRef(var_); |
- else |
+ if (!AddRefHelper(var_)) |
var_.type = PP_VARTYPE_NULL; |
} |
} |
Var::~Var() { |
- if (NeedsRefcounting(var_) && |
- is_managed_ && |
- has_interface<PPB_Var_1_0>()) |
- get_interface<PPB_Var_1_0>()->Release(var_); |
+ if (NeedsRefcounting(var_) && is_managed_) |
+ ReleaseHelper(var_); |
} |
Var& Var::operator=(const Var& other) { |
@@ -143,12 +164,10 @@ Var& Var::operator=(const Var& other) { |
bool old_is_managed = is_managed_; |
is_managed_ = true; |
if (NeedsRefcounting(other.var_)) { |
- // Assume we already has_interface<PPB_Var_1_0> for refcounted vars or else |
- // we couldn't have created them in the first place. |
- get_interface<PPB_Var_1_0>()->AddRef(other.var_); |
+ AddRefHelper(other.var_); |
} |
if (NeedsRefcounting(var_) && old_is_managed) |
- get_interface<PPB_Var_1_0>()->Release(var_); |
+ ReleaseHelper(var_); |
var_ = other.var_; |
return *this; |
@@ -212,10 +231,14 @@ std::string Var::AsString() const { |
return std::string(); |
} |
- if (!has_interface<PPB_Var_1_0>()) |
- return std::string(); |
uint32_t len; |
- const char* str = get_interface<PPB_Var_1_0>()->VarToUtf8(var_, &len); |
+ const char* str; |
+ if (has_interface<PPB_Var_1_1>()) |
+ str = get_interface<PPB_Var_1_1>()->VarToUtf8(var_, &len); |
+ else if (has_interface<PPB_Var_1_0>()) |
+ str = get_interface<PPB_Var_1_0>()->VarToUtf8(var_, &len); |
+ else |
+ return std::string(); |
return std::string(str, len); |
} |