diff options
Diffstat (limited to 'Source/JavaScriptCore/inspector/InspectorValues.h')
-rw-r--r-- | Source/JavaScriptCore/inspector/InspectorValues.h | 322 |
1 files changed, 182 insertions, 140 deletions
diff --git a/Source/JavaScriptCore/inspector/InspectorValues.h b/Source/JavaScriptCore/inspector/InspectorValues.h index 06c5dfe97..6687bbaf6 100644 --- a/Source/JavaScriptCore/inspector/InspectorValues.h +++ b/Source/JavaScriptCore/inspector/InspectorValues.h @@ -1,5 +1,6 @@ /* * Copyright (C) 2009 Google Inc. All rights reserved. + * Copyright (C) 2014 University of Washington. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are @@ -28,10 +29,10 @@ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#ifndef InspectorValues_h -#define InspectorValues_h +#pragma once -#include <wtf/Forward.h> +#include "JSExportMacros.h" +#include <wtf/Assertions.h> #include <wtf/HashMap.h> #include <wtf/RefCounted.h> #include <wtf/Vector.h> @@ -41,96 +42,121 @@ namespace Inspector { class InspectorArray; +class InspectorArrayBase; class InspectorObject; +class InspectorObjectBase; class JS_EXPORT_PRIVATE InspectorValue : public RefCounted<InspectorValue> { public: static const int maxDepth = 1000; - InspectorValue() : m_type(TypeNull) { } - virtual ~InspectorValue() { } - - static PassRefPtr<InspectorValue> null(); + virtual ~InspectorValue() + { + switch (m_type) { + case Type::Null: + case Type::Boolean: + case Type::Double: + case Type::Integer: + break; + case Type::String: + if (m_value.string) + m_value.string->deref(); + break; + case Type::Object: + case Type::Array: + break; + } + } - typedef enum { - TypeNull = 0, - TypeBoolean, - TypeNumber, - TypeString, - TypeObject, - TypeArray - } Type; + static Ref<InspectorValue> null(); + static Ref<InspectorValue> create(bool); + static Ref<InspectorValue> create(int); + static Ref<InspectorValue> create(double); + static Ref<InspectorValue> create(const String&); + static Ref<InspectorValue> create(const char*); + + enum class Type { + Null = 0, + Boolean, + Double, + Integer, + String, + Object, + Array, + }; Type type() const { return m_type; } + bool isNull() const { return m_type == Type::Null; } - bool isNull() const { return m_type == TypeNull; } + bool asBoolean(bool&) const; + bool asInteger(int&) const; + bool asInteger(unsigned&) const; + bool asInteger(long&) const; + bool asInteger(long long&) const; + bool asInteger(unsigned long&) const; + bool asInteger(unsigned long long&) const; + bool asDouble(double&) const; + bool asDouble(float&) const; + bool asString(String&) const; + bool asValue(RefPtr<InspectorValue>&); - virtual bool asBoolean(bool* output) const; - virtual bool asNumber(double* output) const; - virtual bool asNumber(long* output) const; - virtual bool asNumber(int* output) const; - virtual bool asNumber(unsigned long* output) const; - virtual bool asNumber(unsigned int* output) const; - virtual bool asString(String* output) const; - virtual bool asValue(RefPtr<InspectorValue>* output); - virtual bool asObject(RefPtr<InspectorObject>* output); - virtual bool asArray(RefPtr<InspectorArray>* output); - virtual PassRefPtr<InspectorObject> asObject(); - virtual PassRefPtr<InspectorArray> asArray(); + virtual bool asObject(RefPtr<InspectorObject>&); + virtual bool asArray(RefPtr<InspectorArray>&); - static PassRefPtr<InspectorValue> parseJSON(const String& json); + static bool parseJSON(const String& jsonInput, RefPtr<InspectorValue>& output); String toJSONString() const; - virtual void writeJSON(StringBuilder* output) const; + virtual void writeJSON(StringBuilder& output) const; protected: - explicit InspectorValue(Type type) : m_type(type) { } - -private: - Type m_type; -}; - -class JS_EXPORT_PRIVATE InspectorBasicValue : public InspectorValue { -public: - - static PassRefPtr<InspectorBasicValue> create(bool); - static PassRefPtr<InspectorBasicValue> create(int); - static PassRefPtr<InspectorBasicValue> create(double); + InspectorValue() + : m_type(Type::Null) { } - virtual bool asBoolean(bool* output) const override; - virtual bool asNumber(double* output) const override; - virtual bool asNumber(long* output) const override; - virtual bool asNumber(int* output) const override; - virtual bool asNumber(unsigned long* output) const override; - virtual bool asNumber(unsigned* output) const override; + explicit InspectorValue(Type type) + : m_type(type) { } - virtual void writeJSON(StringBuilder* output) const override; - -private: - explicit InspectorBasicValue(bool value) : InspectorValue(TypeBoolean), m_boolValue(value) { } - explicit InspectorBasicValue(int value) : InspectorValue(TypeNumber), m_doubleValue((double)value) { } - explicit InspectorBasicValue(double value) : InspectorValue(TypeNumber), m_doubleValue(value) { } + explicit InspectorValue(bool value) + : m_type(Type::Boolean) + { + m_value.boolean = value; + } - union { - bool m_boolValue; - double m_doubleValue; - }; -}; + explicit InspectorValue(int value) + : m_type(Type::Integer) + { + m_value.number = static_cast<double>(value); + } -class JS_EXPORT_PRIVATE InspectorString : public InspectorValue { -public: - static PassRefPtr<InspectorString> create(const String&); - static PassRefPtr<InspectorString> create(const char*); + explicit InspectorValue(double value) + : m_type(Type::Double) + { + m_value.number = value; + } - virtual bool asString(String* output) const override; + explicit InspectorValue(const String& value) + : m_type(Type::String) + { + m_value.string = value.impl(); + if (m_value.string) + m_value.string->ref(); + } - virtual void writeJSON(StringBuilder* output) const override; + explicit InspectorValue(const char* value) + : m_type(Type::String) + { + String wrapper(value); + m_value.string = wrapper.impl(); + if (m_value.string) + m_value.string->ref(); + } private: - explicit InspectorString(const String& value) : InspectorValue(TypeString), m_stringValue(value) { } - explicit InspectorString(const char* value) : InspectorValue(TypeString), m_stringValue(value) { } - - String m_stringValue; + Type m_type { Type::Null }; + union { + bool boolean; + double number; + StringImpl* string; + } m_value; }; class JS_EXPORT_PRIVATE InspectorObjectBase : public InspectorValue { @@ -141,63 +167,77 @@ public: typedef Dictionary::iterator iterator; typedef Dictionary::const_iterator const_iterator; - virtual PassRefPtr<InspectorObject> asObject() override; InspectorObject* openAccessors(); protected: virtual ~InspectorObjectBase(); - virtual bool asObject(RefPtr<InspectorObject>* output) override; + bool asObject(RefPtr<InspectorObject>& output) override; + // FIXME: use templates to reduce the amount of duplicated set*() methods. void setBoolean(const String& name, bool); - void setNumber(const String& name, double); + void setInteger(const String& name, int); + void setDouble(const String& name, double); void setString(const String& name, const String&); - void setValue(const String& name, PassRefPtr<InspectorValue>); - void setObject(const String& name, PassRefPtr<InspectorObject>); - void setArray(const String& name, PassRefPtr<InspectorArray>); + void setValue(const String& name, RefPtr<InspectorValue>&&); + void setObject(const String& name, RefPtr<InspectorObjectBase>&&); + void setArray(const String& name, RefPtr<InspectorArrayBase>&&); iterator find(const String& name); const_iterator find(const String& name) const; - bool getBoolean(const String& name, bool* output) const; - template<class T> bool getNumber(const String& name, T* output) const + + // FIXME: use templates to reduce the amount of duplicated get*() methods. + bool getBoolean(const String& name, bool& output) const; + template<class T> bool getDouble(const String& name, T& output) const + { + RefPtr<InspectorValue> value; + if (!getValue(name, value)) + return false; + + return value->asDouble(output); + } + template<class T> bool getInteger(const String& name, T& output) const { - RefPtr<InspectorValue> value = get(name); - if (!value) + RefPtr<InspectorValue> value; + if (!getValue(name, value)) return false; - return value->asNumber(output); + + return value->asInteger(output); } - bool getString(const String& name, String* output) const; - PassRefPtr<InspectorObject> getObject(const String& name) const; - PassRefPtr<InspectorArray> getArray(const String& name) const; - PassRefPtr<InspectorValue> get(const String& name) const; + + bool getString(const String& name, String& output) const; + bool getObject(const String& name, RefPtr<InspectorObject>&) const; + bool getArray(const String& name, RefPtr<InspectorArray>&) const; + bool getValue(const String& name, RefPtr<InspectorValue>&) const; void remove(const String& name); - virtual void writeJSON(StringBuilder* output) const override; + void writeJSON(StringBuilder& output) const override; - iterator begin() { return m_data.begin(); } - iterator end() { return m_data.end(); } - const_iterator begin() const { return m_data.begin(); } - const_iterator end() const { return m_data.end(); } + iterator begin() { return m_map.begin(); } + iterator end() { return m_map.end(); } + const_iterator begin() const { return m_map.begin(); } + const_iterator end() const { return m_map.end(); } - int size() const { return m_data.size(); } + int size() const { return m_map.size(); } protected: InspectorObjectBase(); private: - Dictionary m_data; + Dictionary m_map; Vector<String> m_order; }; class InspectorObject : public InspectorObjectBase { public: - static JS_EXPORT_PRIVATE PassRefPtr<InspectorObject> create(); + static JS_EXPORT_PRIVATE Ref<InspectorObject> create(); using InspectorObjectBase::asObject; using InspectorObjectBase::setBoolean; - using InspectorObjectBase::setNumber; + using InspectorObjectBase::setInteger; + using InspectorObjectBase::setDouble; using InspectorObjectBase::setString; using InspectorObjectBase::setValue; using InspectorObjectBase::setObject; @@ -205,11 +245,12 @@ public: using InspectorObjectBase::find; using InspectorObjectBase::getBoolean; - using InspectorObjectBase::getNumber; + using InspectorObjectBase::getInteger; + using InspectorObjectBase::getDouble; using InspectorObjectBase::getString; using InspectorObjectBase::getObject; using InspectorObjectBase::getArray; - using InspectorObjectBase::get; + using InspectorObjectBase::getValue; using InspectorObjectBase::remove; @@ -225,48 +266,46 @@ public: typedef Vector<RefPtr<InspectorValue>>::iterator iterator; typedef Vector<RefPtr<InspectorValue>>::const_iterator const_iterator; - virtual PassRefPtr<InspectorArray> asArray() override; - - unsigned length() const { return m_data.size(); } + unsigned length() const { return static_cast<unsigned>(m_map.size()); } protected: virtual ~InspectorArrayBase(); - virtual bool asArray(RefPtr<InspectorArray>* output) override; + bool asArray(RefPtr<InspectorArray>&) override; void pushBoolean(bool); - void pushInt(int); - void pushNumber(double); + void pushInteger(int); + void pushDouble(double); void pushString(const String&); - void pushValue(PassRefPtr<InspectorValue>); - void pushObject(PassRefPtr<InspectorObject>); - void pushArray(PassRefPtr<InspectorArray>); + void pushValue(RefPtr<InspectorValue>&&); + void pushObject(RefPtr<InspectorObjectBase>&&); + void pushArray(RefPtr<InspectorArrayBase>&&); - PassRefPtr<InspectorValue> get(size_t index); + RefPtr<InspectorValue> get(size_t index) const; - virtual void writeJSON(StringBuilder* output) const override; + void writeJSON(StringBuilder& output) const override; - iterator begin() { return m_data.begin(); } - iterator end() { return m_data.end(); } - const_iterator begin() const { return m_data.begin(); } - const_iterator end() const { return m_data.end(); } + iterator begin() { return m_map.begin(); } + iterator end() { return m_map.end(); } + const_iterator begin() const { return m_map.begin(); } + const_iterator end() const { return m_map.end(); } protected: InspectorArrayBase(); private: - Vector<RefPtr<InspectorValue>> m_data; + Vector<RefPtr<InspectorValue>> m_map; }; class InspectorArray : public InspectorArrayBase { public: - static JS_EXPORT_PRIVATE PassRefPtr<InspectorArray> create(); + static JS_EXPORT_PRIVATE Ref<InspectorArray> create(); using InspectorArrayBase::asArray; using InspectorArrayBase::pushBoolean; - using InspectorArrayBase::pushInt; - using InspectorArrayBase::pushNumber; + using InspectorArrayBase::pushInteger; + using InspectorArrayBase::pushDouble; using InspectorArrayBase::pushString; using InspectorArrayBase::pushValue; using InspectorArrayBase::pushObject; @@ -281,88 +320,91 @@ public: inline InspectorObjectBase::iterator InspectorObjectBase::find(const String& name) { - return m_data.find(name); + return m_map.find(name); } inline InspectorObjectBase::const_iterator InspectorObjectBase::find(const String& name) const { - return m_data.find(name); + return m_map.find(name); } inline void InspectorObjectBase::setBoolean(const String& name, bool value) { - setValue(name, InspectorBasicValue::create(value)); + setValue(name, InspectorValue::create(value)); } -inline void InspectorObjectBase::setNumber(const String& name, double value) +inline void InspectorObjectBase::setInteger(const String& name, int value) { - setValue(name, InspectorBasicValue::create(value)); + setValue(name, InspectorValue::create(value)); +} + +inline void InspectorObjectBase::setDouble(const String& name, double value) +{ + setValue(name, InspectorValue::create(value)); } inline void InspectorObjectBase::setString(const String& name, const String& value) { - setValue(name, InspectorString::create(value)); + setValue(name, InspectorValue::create(value)); } -inline void InspectorObjectBase::setValue(const String& name, PassRefPtr<InspectorValue> value) +inline void InspectorObjectBase::setValue(const String& name, RefPtr<InspectorValue>&& value) { ASSERT(value); - if (m_data.set(name, value).isNewEntry) + if (m_map.set(name, WTFMove(value)).isNewEntry) m_order.append(name); } -inline void InspectorObjectBase::setObject(const String& name, PassRefPtr<InspectorObject> value) +inline void InspectorObjectBase::setObject(const String& name, RefPtr<InspectorObjectBase>&& value) { ASSERT(value); - if (m_data.set(name, value).isNewEntry) + if (m_map.set(name, WTFMove(value)).isNewEntry) m_order.append(name); } -inline void InspectorObjectBase::setArray(const String& name, PassRefPtr<InspectorArray> value) +inline void InspectorObjectBase::setArray(const String& name, RefPtr<InspectorArrayBase>&& value) { ASSERT(value); - if (m_data.set(name, value).isNewEntry) + if (m_map.set(name, WTFMove(value)).isNewEntry) m_order.append(name); } inline void InspectorArrayBase::pushBoolean(bool value) { - m_data.append(InspectorBasicValue::create(value)); + m_map.append(InspectorValue::create(value)); } -inline void InspectorArrayBase::pushInt(int value) +inline void InspectorArrayBase::pushInteger(int value) { - m_data.append(InspectorBasicValue::create(value)); + m_map.append(InspectorValue::create(value)); } -inline void InspectorArrayBase::pushNumber(double value) +inline void InspectorArrayBase::pushDouble(double value) { - m_data.append(InspectorBasicValue::create(value)); + m_map.append(InspectorValue::create(value)); } inline void InspectorArrayBase::pushString(const String& value) { - m_data.append(InspectorString::create(value)); + m_map.append(InspectorValue::create(value)); } -inline void InspectorArrayBase::pushValue(PassRefPtr<InspectorValue> value) +inline void InspectorArrayBase::pushValue(RefPtr<InspectorValue>&& value) { ASSERT(value); - m_data.append(value); + m_map.append(WTFMove(value)); } -inline void InspectorArrayBase::pushObject(PassRefPtr<InspectorObject> value) +inline void InspectorArrayBase::pushObject(RefPtr<InspectorObjectBase>&& value) { ASSERT(value); - m_data.append(value); + m_map.append(WTFMove(value)); } -inline void InspectorArrayBase::pushArray(PassRefPtr<InspectorArray> value) +inline void InspectorArrayBase::pushArray(RefPtr<InspectorArrayBase>&& value) { ASSERT(value); - m_data.append(value); + m_map.append(WTFMove(value)); } } // namespace Inspector - -#endif // !defined(InspectorValues_h) |