Changeset 86785 in webkit
- Timestamp:
- May 18, 2011 1:41:54 PM (13 years ago)
- Location:
- trunk/Source
- Files:
-
- 16 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/JavaScriptCore/API/JSContextRef.cpp
r86712 r86785 94 94 95 95 if (!globalObjectClass) { 96 JSGlobalObject* globalObject = new (globalData.get()) JSGlobalObject(*globalData );96 JSGlobalObject* globalObject = new (globalData.get()) JSGlobalObject(*globalData, JSGlobalObject::createStructure(*globalData, jsNull())); 97 97 return JSGlobalContextRetain(toGlobalRef(globalObject->globalExec())); 98 98 } -
trunk/Source/JavaScriptCore/ChangeLog
r86779 r86785 1 2011-05-18 Oliver Hunt <oliver@apple.com> 2 3 Reviewed by Sam Weinig. 4 5 JSGlobalObject and some others do GC allocation during initialization, which can cause heap corruption 6 https://bugs.webkit.org/show_bug.cgi?id=61090 7 8 Remove the Structure-free JSGlobalObject constructor and instead always 9 pass the structure into the JSGlobalObject constructor. 10 Stop DebuggerActivation creating a new structure every time, and simply 11 use a single shared structure held by the GlobalData. 12 13 * API/JSContextRef.cpp: 14 * debugger/DebuggerActivation.cpp: 15 (JSC::DebuggerActivation::DebuggerActivation): 16 * jsc.cpp: 17 (GlobalObject::GlobalObject): 18 (functionRun): 19 (jscmain): 20 * runtime/JSGlobalData.cpp: 21 (JSC::JSGlobalData::JSGlobalData): 22 (JSC::JSGlobalData::clearBuiltinStructures): 23 * runtime/JSGlobalData.h: 24 * runtime/JSGlobalObject.h: 25 1 26 2011-05-18 Oliver Hunt <oliver@apple.com> 2 27 -
trunk/Source/JavaScriptCore/debugger/DebuggerActivation.cpp
r86499 r86785 32 32 33 33 DebuggerActivation::DebuggerActivation(JSGlobalData& globalData, JSObject* activation) 34 : JSNonFinalObject(globalData, DebuggerActivation::createStructure(globalData, jsNull()))34 : JSNonFinalObject(globalData, globalData.debuggerActivationStructure.get()) 35 35 { 36 36 ASSERT(activation); -
trunk/Source/JavaScriptCore/jsc.cpp
r84052 r86785 142 142 class GlobalObject : public JSGlobalObject { 143 143 public: 144 GlobalObject(JSGlobalData&, const Vector<UString>& arguments);144 GlobalObject(JSGlobalData&, Structure*, const Vector<UString>& arguments); 145 145 virtual UString className() const { return "global"; } 146 146 }; … … 148 148 ASSERT_CLASS_FITS_IN_CELL(GlobalObject); 149 149 150 GlobalObject::GlobalObject(JSGlobalData& globalData, const Vector<UString>& arguments)151 : JSGlobalObject(globalData )150 GlobalObject::GlobalObject(JSGlobalData& globalData, Structure* structure, const Vector<UString>& arguments) 151 : JSGlobalObject(globalData, structure) 152 152 { 153 153 putDirectFunction(globalExec(), new (globalExec()) JSFunction(globalExec(), this, functionStructure(), 1, Identifier(globalExec(), "debug"), functionDebug)); … … 213 213 return JSValue::encode(throwError(exec, createError(exec, "Could not open file."))); 214 214 215 GlobalObject* globalObject = new (&exec->globalData()) GlobalObject(exec->globalData(), Vector<UString>());215 GlobalObject* globalObject = new (&exec->globalData()) GlobalObject(exec->globalData(), GlobalObject::createStructure(exec->globalData(), jsNull()), Vector<UString>()); 216 216 217 217 StopWatch stopWatch; … … 538 538 parseArguments(argc, argv, options, globalData); 539 539 540 GlobalObject* globalObject = new (globalData) GlobalObject(*globalData, options.arguments);540 GlobalObject* globalObject = new (globalData) GlobalObject(*globalData, GlobalObject::createStructure(*globalData, jsNull()), options.arguments); 541 541 bool success = runWithScripts(globalObject, options.scripts, options.dump); 542 542 if (options.interactive && success) -
trunk/Source/JavaScriptCore/runtime/JSGlobalData.cpp
r86727 r86785 33 33 #include "Heap.h" 34 34 #include "CommonIdentifiers.h" 35 #include "DebuggerActivation.h" 35 36 #include "FunctionConstructor.h" 36 37 #include "GetterSetter.h" … … 201 202 JSLock lock(SilenceAssertionsOnly); 202 203 structureStructure.set(*this, Structure::createStructure(*this)); 204 debuggerActivationStructure.set(*this, DebuggerActivation::createStructure(*this, jsNull())); 203 205 activationStructure.set(*this, JSActivation::createStructure(*this, jsNull())); 204 206 interruptedExecutionErrorStructure.set(*this, JSNonFinalObject::createStructure(*this, jsNull())); … … 260 262 { 261 263 structureStructure.clear(); 264 debuggerActivationStructure.clear(); 262 265 activationStructure.clear(); 263 266 interruptedExecutionErrorStructure.clear(); -
trunk/Source/JavaScriptCore/runtime/JSGlobalData.h
r86727 r86785 157 157 158 158 Strong<Structure> structureStructure; 159 Strong<Structure> debuggerActivationStructure; 159 160 Strong<Structure> activationStructure; 160 161 Strong<Structure> interruptedExecutionErrorStructure; -
trunk/Source/JavaScriptCore/runtime/JSGlobalObject.h
r86727 r86785 124 124 public: 125 125 void* operator new(size_t, JSGlobalData*); 126 127 explicit JSGlobalObject(JSGlobalData& globalData) 128 : JSVariableObject(globalData, JSGlobalObject::createStructure(globalData, jsNull()), &m_symbolTable, 0) 129 , m_registerArraySize(0) 130 , m_globalScopeChain() 131 , m_weakRandom(static_cast<unsigned>(randomNumber() * (std::numeric_limits<unsigned>::max() + 1.0))) 132 , m_isEvalEnabled(true) 133 { 134 COMPILE_ASSERT(JSGlobalObject::AnonymousSlotCount == 1, JSGlobalObject_has_only_a_single_slot); 135 putThisToAnonymousValue(0); 136 init(this); 137 } 138 126 139 127 explicit JSGlobalObject(JSGlobalData& globalData, Structure* structure) 140 128 : JSVariableObject(globalData, structure, &m_symbolTable, 0) -
trunk/Source/WebCore/ChangeLog
r86781 r86785 1 2011-05-18 Oliver Hunt <oliver@apple.com> 2 3 Reviewed by Sam Weinig. 4 5 JSGlobalObject and some others do GC allocation during initialization, which can cause heap corruption 6 https://bugs.webkit.org/show_bug.cgi?id=61090 7 8 Rather than having Constructor objects create their structure 9 as part of initialisation, we now pass their expected structure 10 in as an argument. This required fixing the few custom Constructors 11 and the code generator. 12 13 * bindings/js/JSAudioConstructor.cpp: 14 (WebCore::JSAudioConstructor::JSAudioConstructor): 15 * bindings/js/JSAudioConstructor.h: 16 * bindings/js/JSDOMGlobalObject.h: 17 (WebCore::getDOMConstructor): 18 Pass the Constructor objects structure in as an argument 19 * bindings/js/JSImageConstructor.cpp: 20 (WebCore::JSImageConstructor::JSImageConstructor): 21 * bindings/js/JSImageConstructor.h: 22 * bindings/js/JSOptionConstructor.cpp: 23 (WebCore::JSOptionConstructor::JSOptionConstructor): 24 * bindings/js/JSOptionConstructor.h: 25 * bindings/scripts/CodeGeneratorJS.pm: 26 1 27 2011-05-18 Abhishek Arya <inferno@chromium.org> 2 28 -
trunk/Source/WebCore/bindings/js/JSAudioConstructor.cpp
r84556 r86785 40 40 const ClassInfo JSAudioConstructor::s_info = { "AudioConstructor", &DOMConstructorWithDocument::s_info, 0, 0 }; 41 41 42 JSAudioConstructor::JSAudioConstructor(ExecState* exec, JSDOMGlobalObject* globalObject)43 : DOMConstructorWithDocument( JSAudioConstructor::createStructure(globalObject->globalData(), globalObject->objectPrototype()), globalObject)42 JSAudioConstructor::JSAudioConstructor(ExecState* exec, Structure* structure, JSDOMGlobalObject* globalObject) 43 : DOMConstructorWithDocument(structure, globalObject) 44 44 { 45 45 ASSERT(inherits(&s_info)); -
trunk/Source/WebCore/bindings/js/JSAudioConstructor.h
r84052 r86785 37 37 class JSAudioConstructor : public DOMConstructorWithDocument { 38 38 public: 39 JSAudioConstructor(JSC::ExecState*, JS DOMGlobalObject*);39 JSAudioConstructor(JSC::ExecState*, JSC::Structure*, JSDOMGlobalObject*); 40 40 41 41 static JSC::Structure* createStructure(JSC::JSGlobalData& globalData, JSC::JSValue prototype) -
trunk/Source/WebCore/bindings/js/JSDOMGlobalObject.h
r84556 r86785 89 89 if (JSC::JSObject* constructor = const_cast<JSDOMGlobalObject*>(globalObject)->constructors().get(&ConstructorClass::s_info).get()) 90 90 return constructor; 91 JSC::JSObject* constructor = new (exec) ConstructorClass(exec, const_cast<JSDOMGlobalObject*>(globalObject));91 JSC::JSObject* constructor = new (exec) ConstructorClass(exec, ConstructorClass::createStructure(exec->globalData(), globalObject->objectPrototype()), const_cast<JSDOMGlobalObject*>(globalObject)); 92 92 ASSERT(!const_cast<JSDOMGlobalObject*>(globalObject)->constructors().contains(&ConstructorClass::s_info)); 93 93 JSC::WriteBarrier<JSC::JSObject> temp; -
trunk/Source/WebCore/bindings/js/JSImageConstructor.cpp
r84556 r86785 35 35 const ClassInfo JSImageConstructor::s_info = { "ImageConstructor", &DOMConstructorWithDocument::s_info, 0, 0 }; 36 36 37 JSImageConstructor::JSImageConstructor(ExecState* exec, JSDOMGlobalObject* globalObject)38 : DOMConstructorWithDocument( JSImageConstructor::createStructure(globalObject->globalData(), globalObject->objectPrototype()), globalObject)37 JSImageConstructor::JSImageConstructor(ExecState* exec, Structure* structure, JSDOMGlobalObject* globalObject) 38 : DOMConstructorWithDocument(structure, globalObject) 39 39 { 40 40 ASSERT(inherits(&s_info)); -
trunk/Source/WebCore/bindings/js/JSImageConstructor.h
r84052 r86785 28 28 class JSImageConstructor : public DOMConstructorWithDocument { 29 29 public: 30 JSImageConstructor(JSC::ExecState*, JS DOMGlobalObject*);30 JSImageConstructor(JSC::ExecState*, JSC::Structure*, JSDOMGlobalObject*); 31 31 32 32 static JSC::Structure* createStructure(JSC::JSGlobalData& globalData, JSC::JSValue prototype) -
trunk/Source/WebCore/bindings/js/JSOptionConstructor.cpp
r81272 r86785 36 36 const ClassInfo JSOptionConstructor::s_info = { "OptionConstructor", &DOMConstructorWithDocument::s_info, 0, 0 }; 37 37 38 JSOptionConstructor::JSOptionConstructor(ExecState* exec, JSDOMGlobalObject* globalObject)39 : DOMConstructorWithDocument( JSOptionConstructor::createStructure(globalObject->globalData(), globalObject->objectPrototype()), globalObject)38 JSOptionConstructor::JSOptionConstructor(ExecState* exec, Structure* structure, JSDOMGlobalObject* globalObject) 39 : DOMConstructorWithDocument(structure, globalObject) 40 40 { 41 41 ASSERT(inherits(&s_info)); -
trunk/Source/WebCore/bindings/js/JSOptionConstructor.h
r84052 r86785 29 29 class JSOptionConstructor : public DOMConstructorWithDocument { 30 30 public: 31 JSOptionConstructor(JSC::ExecState*, JS DOMGlobalObject*);31 JSOptionConstructor(JSC::ExecState*, JSC::Structure*, JSDOMGlobalObject*); 32 32 33 33 static JSC::Structure* createStructure(JSC::JSGlobalData& globalData, JSC::JSValue prototype) -
trunk/Source/WebCore/bindings/scripts/CodeGeneratorJS.pm
r86499 r86785 2975 2975 push(@$outputArray, "class ${constructorClassName} : public DOMConstructorObject {\n"); 2976 2976 push(@$outputArray, "public:\n"); 2977 push(@$outputArray, " ${constructorClassName}(JSC::ExecState*, JS DOMGlobalObject*);\n\n");2977 push(@$outputArray, " ${constructorClassName}(JSC::ExecState*, JSC::Structure*, JSDOMGlobalObject*);\n\n"); 2978 2978 2979 2979 push(@$outputArray, " virtual bool getOwnPropertySlot(JSC::ExecState*, const JSC::Identifier&, JSC::PropertySlot&);\n"); … … 3014 3014 push(@$outputArray, "const ClassInfo ${constructorClassName}::s_info = { \"${visibleClassName}Constructor\", &DOMConstructorObject::s_info, &${constructorClassName}Table, 0 };\n\n"); 3015 3015 3016 push(@$outputArray, "${constructorClassName}::${constructorClassName}(ExecState* exec, JSDOMGlobalObject* globalObject)\n");3017 push(@$outputArray, " : DOMConstructorObject( ${constructorClassName}::createStructure(globalObject->globalData(), globalObject->objectPrototype()), globalObject)\n");3016 push(@$outputArray, "${constructorClassName}::${constructorClassName}(ExecState* exec, Structure* structure, JSDOMGlobalObject* globalObject)\n"); 3017 push(@$outputArray, " : DOMConstructorObject(structure, globalObject)\n"); 3018 3018 push(@$outputArray, "{\n"); 3019 3019 push(@$outputArray, " ASSERT(inherits(&s_info));\n");
Note: See TracChangeset
for help on using the changeset viewer.