| Index: ppapi/cpp/var.cc
|
| diff --git a/ppapi/cpp/var.cc b/ppapi/cpp/var.cc
|
| index 1108e05ef46488ced290cef1d8f6ee7ae366fcf2..cb8172ca3eeb33883fdb718dc9d570818488d5df 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);
|
| @@ -49,9 +48,34 @@ PP_Var VarFromUtf8Helper(const char* utf8_str, uint32_t len) {
|
| return get_interface<PPB_Var_1_0>()->VarFromUtf8(Module::Get()->pp_module(),
|
| utf8_str,
|
| len);
|
| - } else {
|
| - return PP_MakeNull();
|
| }
|
| + return PP_MakeNull();
|
| +}
|
| +
|
| +// 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;
|
| + }
|
| + return false;
|
| +}
|
| +
|
| +// 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;
|
| + }
|
| + return false;
|
| }
|
|
|
| } // namespace
|
| @@ -106,9 +130,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 +139,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 +161,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 +228,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);
|
| }
|
|
|
|
|