Chromium Code Reviews| 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); |
| } |