Changeset 197642 in webkit
- Timestamp:
- Mar 6, 2016, 12:44:49 PM (11 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 7 edited
-
ChangeLog (modified) (1 diff)
-
bindings/js/JSDOMConstructor.h (modified) (3 diffs)
-
bindings/js/JSDOMWrapper.h (modified) (3 diffs)
-
bindings/js/JSKeyValueIterator.h (modified) (1 diff)
-
bindings/js/JSReadableStreamPrivateConstructors.cpp (modified) (1 diff)
-
bindings/scripts/CodeGeneratorJS.pm (modified) (1 diff)
-
bindings/scripts/test/JS/JSTestClassWithJSBuiltinConstructor.cpp (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r197637 r197642 1 2016-03-06 Youenn Fablet <youenn.fablet@crf.canon.fr> 2 3 Enable DOM class create functions to take parameters in case of JSBuiltinConstructor 4 https://bugs.webkit.org/show_bug.cgi?id=155022 5 6 Reviewed by Darin Adler. 7 8 Introducing JSDOMObjectInspector to check whether a given JS class is built-in (no DOM class). 9 If that is not the case, the JS class wraps a DOM class. 10 The inspector detects whether the DOM class create static method takes no parameter or some parameters. 11 This is used in JSDOMConstructor.h to generate correctly the createJSObject functions needed by JSBuiltinConstructor. 12 13 Updated binding generator to not generate anymore createJSObject as it is handled directly in JSDOMConstructor.h. 14 15 Covered by existing tests. 16 17 * bindings/js/JSDOMConstructor.h: 18 (WebCore::JSBuiltinConstructor<JSClass>::callConstructor): 19 (WebCore::createJSObject): 20 (WebCore::JSBuiltinConstructor<JSClass>::construct): 21 * bindings/js/JSDOMWrapper.h: 22 * bindings/js/JSKeyValueIterator.h: Taking benefit of JSClass::DOMWrapper type declaration. 23 * bindings/js/JSReadableStreamPrivateConstructors.cpp: 24 (WebCore::JSBuiltinReadableStreamReaderPrivateConstructor::initializeExecutable): Deleted. 25 (WebCore::JSBuiltinReadableStreamControllerPrivateConstructor::initializeExecutable): Deleted. 26 * bindings/scripts/CodeGeneratorJS.pm: 27 (GenerateConstructorDefinition): Deleted. 28 * bindings/scripts/test/JS/JSTestClassWithJSBuiltinConstructor.cpp: 29 (WebCore::JSTestClassWithJSBuiltinConstructorConstructor::prototypeForStructure): Deleted. 30 1 31 2016-03-06 Antti Koivisto <antti@apple.com> 2 32 -
trunk/Source/WebCore/bindings/js/JSDOMConstructor.h
r197614 r197642 105 105 template<typename JSClass> class JSBuiltinConstructor : public DOMConstructorJSBuiltinObject { 106 106 public: 107 typedef DOMConstructorJSBuiltinObject Base;107 using Base = DOMConstructorJSBuiltinObject; 108 108 109 109 static JSBuiltinConstructor* create(JSC::VM&, JSC::Structure*, JSDOMGlobalObject&); … … 120 120 static JSC::ConstructType getConstructData(JSC::JSCell*, JSC::ConstructData&); 121 121 static JSC::EncodedJSValue JSC_HOST_CALL construct(JSC::ExecState*); 122 JSC::JSObject* createJSObject(); 122 123 JSC::EncodedJSValue callConstructor(JSC::ExecState&, JSC::JSObject&); 124 JSC::EncodedJSValue callConstructor(JSC::ExecState&, JSC::JSObject*); 123 125 124 126 // Usually defined for each specialization class. … … 217 219 } 218 220 221 template<typename JSClass> inline JSC::EncodedJSValue JSBuiltinConstructor<JSClass>::callConstructor(JSC::ExecState& state, JSC::JSObject& object) 222 { 223 callFunctionWithCurrentArguments(state, object, *initializeFunction()); 224 return JSC::JSValue::encode(&object); 225 } 226 227 template<typename JSClass> inline JSC::EncodedJSValue JSBuiltinConstructor<JSClass>::callConstructor(JSC::ExecState& state, JSC::JSObject* object) 228 { 229 if (!object) 230 return throwConstructorDocumentUnavailableError(state, info()->className); 231 return callConstructor(state, *object); 232 } 233 234 template<typename JSClass> inline 235 typename std::enable_if<JSDOMObjectInspector<JSClass>::isSimpleWrapper, JSC::JSObject&>::type createJSObject(JSBuiltinConstructor<JSClass>& constructor) 236 { 237 auto& globalObject = *constructor.globalObject(); 238 return *JSClass::create(getDOMStructure<JSClass>(globalObject.vm(), globalObject), &globalObject, JSClass::DOMWrapped::create()); 239 } 240 241 template<typename JSClass> inline 242 typename std::enable_if<JSDOMObjectInspector<JSClass>::isBuiltin, JSC::JSObject&>::type createJSObject(JSBuiltinConstructor<JSClass>& constructor) 243 { 244 auto& globalObject = *constructor.globalObject(); 245 return *JSClass::create(getDOMStructure<JSClass>(globalObject.vm(), globalObject), &globalObject); 246 } 247 248 template<typename JSClass> inline 249 typename std::enable_if<JSDOMObjectInspector<JSClass>::isComplexWrapper, JSC::JSObject*>::type createJSObject(JSBuiltinConstructor<JSClass>& constructor) 250 { 251 ScriptExecutionContext* context = constructor.scriptExecutionContext(); 252 if (!context) 253 return nullptr; 254 auto& globalObject = *constructor.globalObject(); 255 return JSClass::create(getDOMStructure<JSClass>(globalObject.vm(), globalObject), &globalObject, JSClass::DOMWrapped::create(*context)); 256 } 257 219 258 template<typename JSClass> inline JSC::EncodedJSValue JSC_HOST_CALL JSBuiltinConstructor<JSClass>::construct(JSC::ExecState* state) 220 259 { 260 ASSERT(state); 221 261 auto* castedThis = JSC::jsCast<JSBuiltinConstructor*>(state->callee()); 222 auto* object = castedThis->createJSObject(); 223 callFunctionWithCurrentArguments(*state, *object, *castedThis->initializeFunction()); 224 return JSC::JSValue::encode(object); 225 } 226 227 template<typename JSClass> inline JSC::JSObject* JSBuiltinConstructor<JSClass>::createJSObject() 228 { 229 return JSClass::create(getDOMStructure<JSClass>(globalObject()->vm(), *globalObject()), globalObject()); 262 return castedThis->callConstructor(*state, createJSObject(*castedThis)); 230 263 } 231 264 -
trunk/Source/WebCore/bindings/js/JSDOMWrapper.h
r194496 r197642 37 37 public: 38 38 typedef JSC::JSDestructibleObject Base; 39 static constexpr bool isDOMWrapper = false; 39 40 40 41 JSDOMGlobalObject* globalObject() const { return JSC::jsCast<JSDOMGlobalObject*>(JSC::JSNonFinalObject::globalObject()); } … … 52 53 public: 53 54 typedef JSDOMObject Base; 55 typedef ImplementationClass DOMWrapped; 56 static constexpr bool isDOMWrapper = true; 54 57 55 58 ImplementationClass& wrapped() const { return const_cast<ImplementationClass&>(m_wrapped.get()); } … … 64 67 }; 65 68 69 template<typename JSClass, typename Enable = void> 70 struct JSDOMObjectInspector { 71 public: 72 static constexpr bool isSimpleWrapper = false; 73 static constexpr bool isComplexWrapper = false; 74 static constexpr bool isBuiltin = true; 75 }; 76 77 template<typename JSClass> 78 struct JSDOMObjectInspector<JSClass, typename std::enable_if<JSClass::isDOMWrapper>::type> { 79 private: 80 template<typename T> static constexpr auto test(int) -> decltype(T::create(), bool()) { return true; } 81 template<typename T> static constexpr bool test(...) { return false; } 82 83 public: 84 static constexpr bool isSimpleWrapper = test<typename JSClass::DOMWrapped>(0); 85 static constexpr bool isComplexWrapper = !isSimpleWrapper; 86 static constexpr bool isBuiltin = false; 87 }; 88 66 89 } // namespace WebCore 67 90 -
trunk/Source/WebCore/bindings/js/JSKeyValueIterator.h
r197614 r197642 36 36 class JSKeyValueIteratorPrototype : public JSC::JSNonFinalObject { 37 37 public: 38 using DOMWrapped = typename std::remove_reference<decltype(std::declval<JSWrapper>().wrapped())>::type;39 38 using Base = JSC::JSNonFinalObject; 39 using DOMWrapped = typename JSWrapper::DOMWrapped; 40 40 41 41 static JSKeyValueIteratorPrototype* create(JSC::VM& vm, JSC::JSGlobalObject* globalObject, JSC::Structure* structure) -
trunk/Source/WebCore/bindings/js/JSReadableStreamPrivateConstructors.cpp
r194960 r197642 64 64 template<> const ClassInfo JSBuiltinReadableStreamControllerPrivateConstructor::s_info = { "ReadableStreamControllerPrivateConstructor", &Base::s_info, 0, CREATE_METHOD_TABLE(JSBuiltinReadableStreamControllerPrivateConstructor) }; 65 65 66 template<> JSObject* JSBuiltinReadableStreamReaderPrivateConstructor::createJSObject()67 {68 return JSReadableStreamReader::create(getDOMStructure<JSReadableStreamReader>(globalObject()->vm(), *globalObject()), globalObject());69 }70 71 template<> JSObject* JSBuiltinReadableStreamControllerPrivateConstructor::createJSObject()72 {73 return JSReadableStreamController::create(getDOMStructure<JSReadableStreamController>(globalObject()->vm(), *globalObject()), globalObject());74 }75 76 66 template<> FunctionExecutable* JSBuiltinReadableStreamReaderPrivateConstructor::initializeExecutable(JSC::VM& vm) 77 67 { -
trunk/Source/WebCore/bindings/scripts/CodeGeneratorJS.pm
r197614 r197642 4789 4789 my $function = shift; 4790 4790 4791 4792 4791 if (IsJSBuiltinConstructor($interface)) { 4793 if ($interface->extendedAttributes->{"JSBuiltinConstructor"}) {4794 # FIXME: Add support for ConstructorCallWith4795 push(@$outputArray, <<END);4796 template<> JSC::JSObject* ${className}Constructor::createJSObject()4797 {4798 return ${className}::create(getDOMStructure<${className}>(globalObject()->vm(), *globalObject()), globalObject(), ${interfaceName}::create());4799 }4800 4801 END4802 }4803 4792 return; 4804 4793 } -
trunk/Source/WebCore/bindings/scripts/test/JS/JSTestClassWithJSBuiltinConstructor.cpp
r196396 r197642 63 63 64 64 typedef JSBuiltinConstructor<JSTestClassWithJSBuiltinConstructor> JSTestClassWithJSBuiltinConstructorConstructor; 65 66 template<> JSC::JSObject* JSTestClassWithJSBuiltinConstructorConstructor::createJSObject()67 {68 return JSTestClassWithJSBuiltinConstructor::create(getDOMStructure<JSTestClassWithJSBuiltinConstructor>(globalObject()->vm(), *globalObject()), globalObject(), TestClassWithJSBuiltinConstructor::create());69 }70 65 71 66 template<> JSValue JSTestClassWithJSBuiltinConstructorConstructor::prototypeForStructure(JSC::VM& vm, const JSDOMGlobalObject& globalObject)
Note:
See TracChangeset
for help on using the changeset viewer.