JS binding code generator doesn't handle "attribute unsigned long[]" well.
authorcommit-queue@webkit.org <commit-queue@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 29 Jun 2012 12:25:52 +0000 (12:25 +0000)
committercommit-queue@webkit.org <commit-queue@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 29 Jun 2012 12:25:52 +0000 (12:25 +0000)
https://bugs.webkit.org/show_bug.cgi?id=84540

Patch by Vineet Chaudhary <rgf748@motorola.com> on 2012-06-29
Reviewed by Kentaro Hara.

In JS/V8 Bindings using traits instead of specialised functions.
Also added support for "unsigned long" in JSDOMBinding and V8Binding.

No new tests, as no behavioural changes.

* bindings/js/JSDOMBinding.h:
(WebCore::Traits::arrayJSValue):
(WebCore::jsArray):
* bindings/v8/V8Binding.h:
(WebCore::Traits::arrayV8Value):
(WebCore::v8Array):

git-svn-id: http://svn.webkit.org/repository/webkit/trunk@121554 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Source/WebCore/ChangeLog
Source/WebCore/bindings/js/JSDOMBinding.h
Source/WebCore/bindings/v8/V8Binding.h

index 1c388fe..cb0eb5d 100644 (file)
@@ -1,3 +1,22 @@
+2012-06-29  Vineet Chaudhary  <rgf748@motorola.com>
+
+        JS binding code generator doesn't handle "attribute unsigned long[]" well.
+        https://bugs.webkit.org/show_bug.cgi?id=84540
+
+        Reviewed by Kentaro Hara.
+
+        In JS/V8 Bindings using traits instead of specialised functions.
+        Also added support for "unsigned long" in JSDOMBinding and V8Binding.
+
+        No new tests, as no behavioural changes.
+
+        * bindings/js/JSDOMBinding.h:
+        (WebCore::Traits::arrayJSValue):
+        (WebCore::jsArray):
+        * bindings/v8/V8Binding.h:
+        (WebCore::Traits::arrayV8Value):
+        (WebCore::v8Array):
+
 2012-06-29  Andreas Kling  <kling@webkit.org>
 
         Unreviewed mac build fix after r121547.
index b5ad3fb..c60e07d 100644 (file)
@@ -281,44 +281,53 @@ enum ParameterDefaultPolicy {
         return toJS(exec, globalObject, ptr.get());
     }
 
+    template <class T>
+    struct Traits {
+        static inline JSC::JSValue arrayJSValue(JSC::ExecState* exec, JSDOMGlobalObject* globalObject, const T& value)
+        {
+            return toJS(exec, globalObject, WTF::getPtr(value));
+        }
+    };
+
+    template<>
+    struct Traits<String> {
+        static inline JSC::JSValue arrayJSValue(JSC::ExecState* exec, JSDOMGlobalObject*, const String& value)
+        {
+            return jsString(exec, stringToUString(value));
+        }
+    };
+
+    template<>
+    struct Traits<float> {
+        static inline JSC::JSValue arrayJSValue(JSC::ExecState*, JSDOMGlobalObject*, const float& value)
+        {
+            return JSC::jsNumber(value);
+        }
+    };
+
+    template<>
+    struct Traits<unsigned long> {
+        static inline JSC::JSValue arrayJSValue(JSC::ExecState*, JSDOMGlobalObject*, const unsigned long& value)
+        {
+            return JSC::jsNumber(value);
+        }
+    };
+
     template <typename T, size_t inlineCapacity>
     JSC::JSValue jsArray(JSC::ExecState* exec, JSDOMGlobalObject* globalObject, const Vector<T, inlineCapacity>& iterator)
     {
         JSC::MarkedArgumentBuffer list;
-        typename Vector<T, inlineCapacity>::const_iterator end = iterator.end();
+        typename Vector<T, inlineCapacity>::const_iterator end = iterator.end();        
+        typedef Traits<T> TraitsType;
 
         for (typename Vector<T, inlineCapacity>::const_iterator iter = iterator.begin(); iter != end; ++iter)
-            list.append(toJS(exec, globalObject, WTF::getPtr(*iter)));
+            list.append(TraitsType::arrayJSValue(exec, globalObject, *iter));
 
         return JSC::constructArray(exec, globalObject, list);
     }
 
     JSC::JSValue jsArray(JSC::ExecState*, JSDOMGlobalObject*, PassRefPtr<DOMStringList>);
 
-    template<>
-    inline JSC::JSValue jsArray(JSC::ExecState* exec, JSDOMGlobalObject* globalObject, const Vector<String>& iterator)
-    {
-        JSC::MarkedArgumentBuffer array;
-        Vector<String>::const_iterator end = iterator.end();
-
-        for (Vector<String>::const_iterator it = iterator.begin(); it != end; ++it)
-            array.append(jsString(exec, stringToUString(*it)));
-
-        return JSC::constructArray(exec, globalObject, array);
-    }
-
-    template<>
-    inline JSC::JSValue jsArray(JSC::ExecState* exec, JSDOMGlobalObject* globalObject, const Vector<float>& iterator)
-    {
-        JSC::MarkedArgumentBuffer array;
-        Vector<float>::const_iterator end = iterator.end();
-
-        for (Vector<float>::const_iterator it = iterator.begin(); it != end; ++it)
-            array.append(JSC::jsNumber(*it));
-
-        return JSC::constructArray(exec, globalObject, array);
-    }
-
     template <class T>
     Vector<T> toNativeArray(JSC::ExecState* exec, JSC::JSValue value)
     {
index d30c6d2..07c6615 100644 (file)
@@ -337,28 +337,42 @@ namespace WebCore {
         return data->integerCache()->v8UnsignedInteger(value);
     }
 
+    template <class T>
+    struct Traits {
+        static inline v8::Handle<v8::Value> arrayV8Value(const T& value, v8::Isolate* isolate)
+        {
+            return toV8(WTF::getPtr(value), isolate);
+        }
+    };
+
+    template<>
+    struct Traits<String> {
+        static inline v8::Handle<v8::Value> arrayV8Value(const String& value, v8::Isolate* isolate)
+        {
+            return v8String(value, isolate);
+        }
+    };
+
+    template<>
+    struct Traits<unsigned long> {
+        static inline v8::Handle<v8::Value> arrayV8Value(const unsigned long& value, v8::Isolate* isolate)
+        {
+            return v8UnsignedInteger(value, isolate);
+        }
+    };
+
     template<typename T>
     v8::Handle<v8::Value> v8Array(const Vector<T>& iterator, v8::Isolate* isolate)
     {
         v8::Local<v8::Array> result = v8::Array::New(iterator.size());
         int index = 0;
         typename Vector<T>::const_iterator end = iterator.end();
+        typedef Traits<T> TraitsType;
         for (typename Vector<T>::const_iterator iter = iterator.begin(); iter != end; ++iter)
-            result->Set(v8Integer(index++, isolate), toV8(WTF::getPtr(*iter), isolate));
+            result->Set(v8Integer(index++, isolate), TraitsType::arrayV8Value(*iter, isolate));
         return result;
     }
 
-    template<>
-    inline v8::Handle<v8::Value> v8Array(const Vector<String>& iterator, v8::Isolate* isolate)
-    {
-        v8::Local<v8::Array> array = v8::Array::New(iterator.size());
-        Vector<String>::const_iterator end = iterator.end();
-        int index = 0;
-        for (Vector<String>::const_iterator iter = iterator.begin(); iter != end; ++iter)
-            array->Set(v8Integer(index++, isolate), v8String(*iter, isolate));
-        return array;
-    }
-
     v8::Handle<v8::Value> v8Array(PassRefPtr<DOMStringList>, v8::Isolate*);
 
     template <class T>