| Index: ppapi/cpp/var.cc
|
| diff --git a/ppapi/cpp/var.cc b/ppapi/cpp/var.cc
|
| index d8128ed2d5f4c0f46b335d582f003e7bfb0926b2..2b52f044944d7aa5566aec146147a9986095c99e 100644
|
| --- a/ppapi/cpp/var.cc
|
| +++ b/ppapi/cpp/var.cc
|
| @@ -28,6 +28,9 @@ namespace {
|
| template <> const char* interface_name<PPB_Var>() {
|
| return PPB_VAR_INTERFACE;
|
| }
|
| +template <> const char* interface_name<PPB_Var_1_0>() {
|
| + return PPB_VAR_INTERFACE_1_0;
|
| +}
|
|
|
| // Technically you can call AddRef and Release on any Var, but it may involve
|
| // cross-process calls depending on the plugin. This is an optimization so we
|
| @@ -36,6 +39,21 @@ 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.
|
| +PP_Var VarFromUtf8Helper(const char* utf8_str, uint32_t len) {
|
| + if (has_interface<PPB_Var>()) {
|
| + return get_interface<PPB_Var>()->VarFromUtf8(utf8_str, len);
|
| + } else if (has_interface<PPB_Var_1_0>()) {
|
| + return get_interface<PPB_Var_1_0>()->VarFromUtf8(Module::Get()->pp_module(),
|
| + utf8_str,
|
| + len);
|
| + } else {
|
| + return PP_MakeNull();
|
| + }
|
| +}
|
| +
|
| } // namespace
|
|
|
| Var::Var() {
|
| @@ -72,27 +90,14 @@ Var::Var(double d) {
|
| }
|
|
|
| Var::Var(const char* utf8_str) {
|
| - if (has_interface<PPB_Var>()) {
|
| - uint32_t len = utf8_str ? static_cast<uint32_t>(strlen(utf8_str)) : 0;
|
| - var_ = get_interface<PPB_Var>()->VarFromUtf8(Module::Get()->pp_module(),
|
| - utf8_str, len);
|
| - } else {
|
| - var_.type = PP_VARTYPE_NULL;
|
| - var_.padding = 0;
|
| - }
|
| + uint32_t len = utf8_str ? static_cast<uint32_t>(strlen(utf8_str)) : 0;
|
| + var_ = VarFromUtf8Helper(utf8_str, len);
|
| needs_release_ = (var_.type == PP_VARTYPE_STRING);
|
| }
|
|
|
| Var::Var(const std::string& utf8_str) {
|
| - if (has_interface<PPB_Var>()) {
|
| - var_ = get_interface<PPB_Var>()->VarFromUtf8(
|
| - Module::Get()->pp_module(),
|
| - utf8_str.c_str(),
|
| - static_cast<uint32_t>(utf8_str.size()));
|
| - } else {
|
| - var_.type = PP_VARTYPE_NULL;
|
| - var_.padding = 0;
|
| - }
|
| + var_ = VarFromUtf8Helper(utf8_str.c_str(),
|
| + static_cast<uint32_t>(utf8_str.size()));
|
| needs_release_ = (var_.type == PP_VARTYPE_STRING);
|
| }
|
|
|
| @@ -101,7 +106,7 @@ Var::Var(const Var& other) {
|
| if (NeedsRefcounting(var_)) {
|
| if (has_interface<PPB_Var>()) {
|
| needs_release_ = true;
|
| - get_interface<PPB_Var>()->AddRef(var_);
|
| + get_interface<PPB_Var_1_0>()->AddRef(var_);
|
| } else {
|
| var_.type = PP_VARTYPE_NULL;
|
| needs_release_ = false;
|
| @@ -113,7 +118,7 @@ Var::Var(const Var& other) {
|
|
|
| Var::~Var() {
|
| if (needs_release_ && has_interface<PPB_Var>())
|
| - get_interface<PPB_Var>()->Release(var_);
|
| + get_interface<PPB_Var_1_0>()->Release(var_);
|
| }
|
|
|
| Var& Var::operator=(const Var& other) {
|
| @@ -130,12 +135,12 @@ Var& Var::operator=(const Var& other) {
|
| // 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_);
|
| + get_interface<PPB_Var_1_0>()->AddRef(other.var_);
|
| } else {
|
| needs_release_ = false;
|
| }
|
| if (old_needs_release)
|
| - get_interface<PPB_Var>()->Release(var_);
|
| + get_interface<PPB_Var_1_0>()->Release(var_);
|
|
|
| var_ = other.var_;
|
| return *this;
|
| @@ -201,7 +206,7 @@ std::string Var::AsString() const {
|
| if (!has_interface<PPB_Var>())
|
| return std::string();
|
| uint32_t len;
|
| - const char* str = get_interface<PPB_Var>()->VarToUtf8(var_, &len);
|
| + const char* str = get_interface<PPB_Var_1_0>()->VarToUtf8(var_, &len);
|
| return std::string(str, len);
|
| }
|
|
|
|
|