Title: [121554] trunk/Source/WebCore
Revision
121554
Author
[email protected]
Date
2012-06-29 05:25:52 -0700 (Fri, 29 Jun 2012)

Log Message

JS binding code generator doesn't handle "attribute unsigned long[]" well.
https://bugs.webkit.org/show_bug.cgi?id=84540

Patch by Vineet Chaudhary <[email protected]> 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):

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (121553 => 121554)


--- trunk/Source/WebCore/ChangeLog	2012-06-29 12:23:48 UTC (rev 121553)
+++ trunk/Source/WebCore/ChangeLog	2012-06-29 12:25:52 UTC (rev 121554)
@@ -1,3 +1,22 @@
+2012-06-29  Vineet Chaudhary  <[email protected]>
+
+        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  <[email protected]>
 
         Unreviewed mac build fix after r121547.

Modified: trunk/Source/WebCore/bindings/js/JSDOMBinding.h (121553 => 121554)


--- trunk/Source/WebCore/bindings/js/JSDOMBinding.h	2012-06-29 12:23:48 UTC (rev 121553)
+++ trunk/Source/WebCore/bindings/js/JSDOMBinding.h	2012-06-29 12:25:52 UTC (rev 121554)
@@ -281,44 +281,53 @@
         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)
     {

Modified: trunk/Source/WebCore/bindings/v8/V8Binding.h (121553 => 121554)


--- trunk/Source/WebCore/bindings/v8/V8Binding.h	2012-06-29 12:23:48 UTC (rev 121553)
+++ trunk/Source/WebCore/bindings/v8/V8Binding.h	2012-06-29 12:25:52 UTC (rev 121554)
@@ -337,28 +337,42 @@
         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>
_______________________________________________
webkit-changes mailing list
[email protected]
http://lists.webkit.org/mailman/listinfo.cgi/webkit-changes

Reply via email to