 Chromium Code Reviews
 Chromium Code Reviews Issue 6823016:
  Create a VarPrivate interface to contain the scripting helper functions of Var.  (Closed) 
  Base URL: svn://chrome-svn/chrome/trunk/src/
    
  
    Issue 6823016:
  Create a VarPrivate interface to contain the scripting helper functions of Var.  (Closed) 
  Base URL: svn://chrome-svn/chrome/trunk/src/| Index: ppapi/cpp/private/var_private.h | 
| =================================================================== | 
| --- ppapi/cpp/private/var_private.h (revision 80958) | 
| +++ ppapi/cpp/private/var_private.h (working copy) | 
| @@ -2,103 +2,33 @@ | 
| // Use of this source code is governed by a BSD-style license that can be | 
| // found in the LICENSE file. | 
| -#ifndef PPAPI_CPP_VAR_H_ | 
| -#define PPAPI_CPP_VAR_H_ | 
| +#ifndef PPAPI_CPP_PRIVATE_VAR_PRIVATE_H_ | 
| +#define PPAPI_CPP_PRIVATE_VAR_PRIVATE_H_ | 
| -#include <string> | 
| -#include <vector> | 
| +#include "ppapi/cpp/var.h" | 
| -#include "ppapi/c/pp_module.h" | 
| -#include "ppapi/c/pp_var.h" | 
| - | 
| namespace pp { | 
| -class Instance; | 
| - | 
| -namespace deprecated { | 
| -class ScriptableObject; | 
| -} | 
| - | 
| -class Var { | 
| +// VarPrivate is a version of Var that exposes the private scripting API. | 
| +// It's designed to be mostly interchangable with Var since most callers will | 
| +// be dealing with Vars from various places. | 
| +class VarPrivate : public Var { | 
| public: | 
| - struct Null {}; // Special value passed to constructor to make NULL. | 
| + VarPrivate() : Var() {} | 
| + VarPrivate(Null) : Var(Null()) {} | 
| + VarPrivate(bool b) : Var(b) {} | 
| + VarPrivate(int32_t i) : Var(i) {} | 
| + VarPrivate(double d) : Var(d) {} | 
| + VarPrivate(const char* utf8_str) : Var(utf8_str) {} | 
| + VarPrivate(const std::string& utf8_str) : Var(utf8_str) {} | 
| + VarPrivate(PassRef, PP_Var var) : Var(PassRef(), var) {} | 
| + VarPrivate(DontManage, PP_Var var) : Var(DontManage(), var) {} | 
| + VarPrivate(Instance* instance, deprecated::ScriptableObject* object); | 
| + VarPrivate(const Var& other) : Var(other) {} | 
| + VarPrivate(const VarPrivate& other) : Var((const Var&)other) {} | 
| 
dmichael(do not use this one)
2011/04/08 22:16:28
Assuming we really do want conversion contructors,
 
brettw
2011/04/10 05:08:41
The conversion constructors are important for the
 
dmichael (off chromium)
2011/04/11 00:09:16
Makes sense.
 | 
| - Var(); // PP_Var of type Undefined. | 
| - Var(Null); // PP_Var of type Null. | 
| - Var(bool b); | 
| - Var(int32_t i); | 
| - Var(double d); | 
| - Var(const char* utf8_str); // Must be encoded in UTF-8. | 
| - Var(const std::string& utf8_str); // Must be encoded in UTF-8. | 
| + virtual ~VarPrivate() {} | 
| - // This magic constructor is used when we've gotten a PP_Var as a return | 
| - // value that has already been addref'ed for us. | 
| - struct PassRef {}; | 
| - Var(PassRef, PP_Var var) { | 
| - var_ = var; | 
| - needs_release_ = true; | 
| - } | 
| - | 
| - // TODO(brettw): remove DontManage when this bug is fixed | 
| - // http://code.google.com/p/chromium/issues/detail?id=52105 | 
| - // This magic constructor is used when we've given a PP_Var as an input | 
| - // argument from somewhere and that reference is managing the reference | 
| - // count for us. The object will not be AddRef'ed or Release'd by this | 
| - // class instance.. | 
| - struct DontManage {}; | 
| - Var(DontManage, PP_Var var) { | 
| - var_ = var; | 
| - needs_release_ = false; | 
| - } | 
| - | 
| - // Takes ownership of the given pointer. | 
| - Var(Instance* instance, deprecated::ScriptableObject* object); | 
| - | 
| - Var(const Var& other); | 
| - | 
| - virtual ~Var(); | 
| - | 
| - Var& operator=(const Var& other); | 
| - | 
| - bool operator==(const Var& other) const; | 
| - | 
| - bool is_undefined() const { return var_.type == PP_VARTYPE_UNDEFINED; } | 
| - bool is_null() const { return var_.type == PP_VARTYPE_NULL; } | 
| - bool is_bool() const { return var_.type == PP_VARTYPE_BOOL; } | 
| - bool is_string() const { return var_.type == PP_VARTYPE_STRING; } | 
| - bool is_object() const { return var_.type == PP_VARTYPE_OBJECT; } | 
| - | 
| - // IsInt and IsDouble return the internal representation. The JavaScript | 
| - // runtime may convert between the two as needed, so the distinction may | 
| - // not be relevant in all cases (int is really an optimization inside the | 
| - // runtime). So most of the time, you will want to check IsNumber. | 
| - bool is_int() const { return var_.type == PP_VARTYPE_INT32; } | 
| - bool is_double() const { return var_.type == PP_VARTYPE_DOUBLE; } | 
| - bool is_number() const { | 
| - return var_.type == PP_VARTYPE_INT32 || | 
| - var_.type == PP_VARTYPE_DOUBLE; | 
| - } | 
| - | 
| - // Assumes the internal representation IsBool. If it's not, it will assert | 
| - // in debug mode, and return false. | 
| - bool AsBool() const; | 
| - | 
| - // AsInt and AsDouble implicitly convert between ints and doubles. This is | 
| - // because JavaScript doesn't have a concept of ints and doubles, only | 
| - // numbers. The distinction between the two is an optimization inside the | 
| - // compiler. Since converting from a double to an int may be lossy, if you | 
| - // care about the distinction, either always work in doubles, or check | 
| - // !IsDouble() before calling AsInt(). | 
| - // | 
| - // These functions will assert in debug mode and return 0 if the internal | 
| - // representation is not IsNumber(). | 
| - int32_t AsInt() const; | 
| - double AsDouble() const; | 
| - | 
| - // This assumes the object is of type string. If it's not, it will assert | 
| - // in debug mode, and return an empty string. | 
| - std::string AsString() const; | 
| - | 
| // This assumes the object is of type object. If it's not, it will assert in | 
| // debug mode. If it is not an object or not a ScriptableObject type, returns | 
| // NULL. | 
| @@ -106,45 +36,26 @@ | 
| bool HasProperty(const Var& name, Var* exception = NULL) const; | 
| bool HasMethod(const Var& name, Var* exception = NULL) const; | 
| - Var GetProperty(const Var& name, Var* exception = NULL) const; | 
| + VarPrivate GetProperty(const Var& name, Var* exception = NULL) const; | 
| void GetAllPropertyNames(std::vector<Var>* properties, | 
| Var* exception = NULL) const; | 
| void SetProperty(const Var& name, const Var& value, Var* exception = NULL); | 
| void RemoveProperty(const Var& name, Var* exception = NULL); | 
| - Var Call(const Var& method_name, uint32_t argc, Var* argv, | 
| + VarPrivate Call(const Var& method_name, uint32_t argc, Var* argv, | 
| Var* exception = NULL); | 
| - Var Construct(uint32_t argc, Var* argv, Var* exception = NULL) const; | 
| + VarPrivate Construct(uint32_t argc, Var* argv, Var* exception = NULL) const; | 
| // Convenience functions for calling functions with small # of args. | 
| - Var Call(const Var& method_name, Var* exception = NULL); | 
| - Var Call(const Var& method_name, const Var& arg1, Var* exception = NULL); | 
| - Var Call(const Var& method_name, const Var& arg1, const Var& arg2, | 
| - Var* exception = NULL); | 
| - Var Call(const Var& method_name, const Var& arg1, const Var& arg2, | 
| - const Var& arg3, Var* exception = NULL); | 
| - Var Call(const Var& method_name, const Var& arg1, const Var& arg2, | 
| - const Var& arg3, const Var& arg4, Var* exception = NULL); | 
| + VarPrivate Call(const Var& method_name, Var* exception = NULL); | 
| + VarPrivate Call(const Var& method_name, const Var& arg1, | 
| + Var* exception = NULL); | 
| + VarPrivate Call(const Var& method_name, const Var& arg1, const Var& arg2, | 
| + Var* exception = NULL); | 
| + VarPrivate Call(const Var& method_name, const Var& arg1, const Var& arg2, | 
| + const Var& arg3, Var* exception = NULL); | 
| + VarPrivate Call(const Var& method_name, const Var& arg1, const Var& arg2, | 
| + const Var& arg3, const Var& arg4, Var* exception = NULL); | 
| - // Returns a const reference to the PP_Var managed by this Var object. | 
| - const PP_Var& pp_var() const { | 
| - return var_; | 
| - } | 
| - | 
| - // Detaches from the internal PP_Var of this object, keeping the reference | 
| - // count the same. This is used when returning a PP_Var from an API function | 
| - // where the caller expects the return value to be AddRef'ed for it. | 
| - PP_Var Detach() { | 
| - PP_Var ret = var_; | 
| - var_ = PP_MakeUndefined(); | 
| - needs_release_ = false; | 
| - return ret; | 
| - } | 
| - | 
| - // Prints a short description "Var<X>" that can be used for logging, where | 
| - // "X" is the underlying scalar or "UNDEFINED" or "OBJ" as it does not call | 
| - // into the browser to get the object description. | 
| - std::string DebugString() const; | 
| - | 
| // For use when calling the raw C PPAPI when using the C++ Var as a possibly | 
| // NULL exception. This will handle getting the address of the internal value | 
| // out if it's non-NULL and fixing up the reference count. | 
| @@ -164,7 +75,7 @@ | 
| // | 
| // Example: | 
| // void FooBar(a, b, Var* exception = NULL) { | 
| - // foo_interface->Bar(a, b, Var::OutException(exception).get()); | 
| + // foo_interface->Bar(a, b, VarPrivate::OutException(exception).get()); | 
| // } | 
| class OutException { | 
| public: | 
| @@ -172,7 +83,7 @@ | 
| : output_(v), | 
| originally_had_exception_(v && v->is_null()) { | 
| if (output_) { | 
| - temp_ = output_->var_; | 
| + temp_ = output_->pp_var(); | 
| } else { | 
| temp_.padding = 0; | 
| temp_.type = PP_VARTYPE_UNDEFINED; | 
| @@ -199,12 +110,9 @@ | 
| // Prevent an arbitrary pointer argument from being implicitly converted to | 
| // a bool at Var construction. If somebody makes such a mistake, (s)he will | 
| // get a compilation error. | 
| - Var(void* non_scriptable_object_pointer); | 
| - | 
| - PP_Var var_; | 
| - bool needs_release_; | 
| + VarPrivate(void* non_scriptable_object_pointer); | 
| }; | 
| } // namespace pp | 
| -#endif // PPAPI_CPP_VAR_H_ | 
| +#endif // PPAPI_CPP_PRIVATE_VAR_PRIVATE_H_ |