+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.
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)
{
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>