Changeset 172372 in webkit
- Timestamp:
- Aug 8, 2014 11:50:19 PM (10 years ago)
- Location:
- trunk/Source
- Files:
-
- 17 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/JavaScriptCore/ChangeLog
r172324 r172372 1 2014-08-08 Mark Lam <mark.lam@apple.com> 2 3 REGRESSION: Inspector crashes when debugger is paused and injected scripts access window.screen(). 4 <https://webkit.org/b/135656> 5 6 Not reviewed. 7 8 Rolling out r170680 which was merged to ToT in r172129. 9 10 * debugger/Debugger.h: 11 * debugger/DebuggerCallFrame.cpp: 12 (JSC::DebuggerCallFrame::scope): 13 (JSC::DebuggerCallFrame::evaluate): 14 (JSC::DebuggerCallFrame::invalidate): 15 * debugger/DebuggerCallFrame.h: 16 * debugger/DebuggerScope.cpp: 17 (JSC::DebuggerScope::DebuggerScope): 18 (JSC::DebuggerScope::finishCreation): 19 (JSC::DebuggerScope::visitChildren): 20 (JSC::DebuggerScope::className): 21 (JSC::DebuggerScope::getOwnPropertySlot): 22 (JSC::DebuggerScope::put): 23 (JSC::DebuggerScope::deleteProperty): 24 (JSC::DebuggerScope::getOwnPropertyNames): 25 (JSC::DebuggerScope::defineOwnProperty): 26 (JSC::DebuggerScope::next): Deleted. 27 (JSC::DebuggerScope::invalidateChain): Deleted. 28 (JSC::DebuggerScope::isWithScope): Deleted. 29 (JSC::DebuggerScope::isGlobalScope): Deleted. 30 (JSC::DebuggerScope::isFunctionScope): Deleted. 31 * debugger/DebuggerScope.h: 32 (JSC::DebuggerScope::create): 33 (JSC::DebuggerScope::Iterator::Iterator): Deleted. 34 (JSC::DebuggerScope::Iterator::get): Deleted. 35 (JSC::DebuggerScope::Iterator::operator++): Deleted. 36 (JSC::DebuggerScope::Iterator::operator==): Deleted. 37 (JSC::DebuggerScope::Iterator::operator!=): Deleted. 38 (JSC::DebuggerScope::isValid): Deleted. 39 (JSC::DebuggerScope::jsScope): Deleted. 40 (JSC::DebuggerScope::begin): Deleted. 41 (JSC::DebuggerScope::end): Deleted. 42 * inspector/JSJavaScriptCallFrame.cpp: 43 (Inspector::JSJavaScriptCallFrame::scopeType): 44 (Inspector::JSJavaScriptCallFrame::scopeChain): 45 * inspector/JavaScriptCallFrame.h: 46 (Inspector::JavaScriptCallFrame::scopeChain): 47 * inspector/ScriptDebugServer.cpp: 48 * runtime/JSGlobalObject.cpp: 49 (JSC::JSGlobalObject::reset): 50 (JSC::JSGlobalObject::visitChildren): 51 * runtime/JSGlobalObject.h: 52 (JSC::JSGlobalObject::debuggerScopeStructure): Deleted. 53 * runtime/JSObject.h: 54 (JSC::JSObject::isWithScope): Deleted. 55 * runtime/JSScope.h: 56 * runtime/VM.cpp: 57 (JSC::VM::VM): 58 * runtime/VM.h: 59 1 60 2014-08-07 Saam Barati <sbarati@apple.com> 2 61 -
trunk/Source/JavaScriptCore/debugger/Debugger.h
r172129 r172372 34 34 namespace JSC { 35 35 36 class CodeBlock;37 36 class ExecState; 38 37 class JSGlobalObject; -
trunk/Source/JavaScriptCore/debugger/DebuggerCallFrame.cpp
r172129 r172372 31 31 32 32 #include "CodeBlock.h" 33 #include "DebuggerScope.h"34 33 #include "Interpreter.h" 35 34 #include "JSActivation.h" … … 38 37 #include "Parser.h" 39 38 #include "StackVisitor.h" 40 #include "StrongInlines.h"41 39 42 40 namespace JSC { … … 109 107 } 110 108 111 DebuggerScope* DebuggerCallFrame::scope() 112 { 113 ASSERT(isValid()); 114 if (!isValid()) 115 return 0; 116 117 if (!m_scope) { 118 VM& vm = m_callFrame->vm(); 119 CodeBlock* codeBlock = m_callFrame->codeBlock(); 120 if (codeBlock && codeBlock->needsActivation() && !m_callFrame->hasActivation()) { 121 ASSERT(!m_callFrame->scope()->isWithScope()); 122 JSActivation* activation = JSActivation::create(vm, m_callFrame, codeBlock); 123 m_callFrame->setActivation(activation); 124 m_callFrame->setScope(activation); 125 } 126 127 m_scope.set(vm, DebuggerScope::create(vm, m_callFrame->scope())); 128 } 129 return m_scope.get(); 109 JSScope* DebuggerCallFrame::scope() const 110 { 111 ASSERT(isValid()); 112 if (!isValid()) 113 return 0; 114 115 CodeBlock* codeBlock = m_callFrame->codeBlock(); 116 if (codeBlock && codeBlock->needsActivation() && !m_callFrame->hasActivation()) { 117 JSActivation* activation = JSActivation::create(*codeBlock->vm(), m_callFrame, codeBlock); 118 m_callFrame->setActivation(activation); 119 m_callFrame->setScope(activation); 120 } 121 122 return m_callFrame->scope(); 130 123 } 131 124 … … 170 163 171 164 JSValue thisValue = thisValueForCallFrame(callFrame); 172 JSValue result = vm.interpreter->execute(eval, callFrame, thisValue, scope() ->jsScope());165 JSValue result = vm.interpreter->execute(eval, callFrame, thisValue, scope()); 173 166 if (vm.exception()) { 174 167 exception = vm.exception(); … … 182 175 { 183 176 m_callFrame = nullptr; 184 if (m_scope) {185 m_scope->invalidateChain();186 m_scope.clear();187 }188 177 RefPtr<DebuggerCallFrame> frame = m_caller.release(); 189 178 while (frame) { -
trunk/Source/JavaScriptCore/debugger/DebuggerCallFrame.h
r172129 r172372 30 30 #define DebuggerCallFrame_h 31 31 32 #include "CallFrame.h" 32 33 #include "DebuggerPrimitives.h" 33 #include "Strong.h"34 34 #include <wtf/PassRefPtr.h> 35 35 #include <wtf/RefCounted.h> … … 37 37 38 38 namespace JSC { 39 40 class DebuggerScope;41 class ExecState;42 typedef ExecState CallFrame;43 39 44 40 class DebuggerCallFrame : public RefCounted<DebuggerCallFrame> { … … 63 59 64 60 JS_EXPORT_PRIVATE JSGlobalObject* vmEntryGlobalObject() const; 65 JS_EXPORT_PRIVATE DebuggerScope* scope();61 JS_EXPORT_PRIVATE JSScope* scope() const; 66 62 JS_EXPORT_PRIVATE String functionName() const; 67 63 JS_EXPORT_PRIVATE Type type() const; … … 83 79 RefPtr<DebuggerCallFrame> m_caller; 84 80 TextPosition m_position; 85 // The DebuggerCallFrameScope is responsible for calling invalidate() which,86 // in turn, will clear this strong ref.87 Strong<DebuggerScope> m_scope;88 81 }; 89 82 -
trunk/Source/JavaScriptCore/debugger/DebuggerScope.cpp
r172129 r172372 29 29 #include "JSActivation.h" 30 30 #include "JSCInlines.h" 31 #include "JSWithScope.h"32 31 33 32 namespace JSC { … … 37 36 const ClassInfo DebuggerScope::s_info = { "DebuggerScope", &Base::s_info, 0, CREATE_METHOD_TABLE(DebuggerScope) }; 38 37 39 DebuggerScope::DebuggerScope(VM& vm , JSScope* scope)40 : JSNonFinalObject(vm, scope->globalObject()->debuggerScopeStructure())38 DebuggerScope::DebuggerScope(VM& vm) 39 : JSNonFinalObject(vm, vm.debuggerScopeStructure.get()) 41 40 { 42 ASSERT(scope);43 m_scope.set(vm, this, scope);44 41 } 45 42 46 void DebuggerScope::finishCreation(VM& vm )43 void DebuggerScope::finishCreation(VM& vm, JSObject* activation) 47 44 { 48 45 Base::finishCreation(vm); 46 ASSERT(activation); 47 ASSERT(activation->isActivationObject()); 48 m_activation.set(vm, this, jsCast<JSActivation*>(activation)); 49 49 } 50 50 … … 54 54 ASSERT_GC_OBJECT_INHERITS(thisObject, info()); 55 55 JSObject::visitChildren(thisObject, visitor); 56 visitor.append(&thisObject->m_scope); 57 visitor.append(&thisObject->m_next); 56 visitor.append(&thisObject->m_activation); 58 57 } 59 58 60 59 String DebuggerScope::className(const JSObject* object) 61 60 { 62 const DebuggerScope* scope = jsCast<const DebuggerScope*>(object); 63 ASSERT(scope->isValid()); 64 if (!scope->isValid()) 65 return String(); 66 JSObject* thisObject = JSScope::objectAtScope(scope->jsScope()); 67 return thisObject->methodTable()->className(thisObject); 61 const DebuggerScope* thisObject = jsCast<const DebuggerScope*>(object); 62 return thisObject->m_activation->methodTable()->className(thisObject->m_activation.get()); 68 63 } 69 64 70 65 bool DebuggerScope::getOwnPropertySlot(JSObject* object, ExecState* exec, PropertyName propertyName, PropertySlot& slot) 71 66 { 72 DebuggerScope* scope = jsCast<DebuggerScope*>(object); 73 ASSERT(scope->isValid()); 74 if (!scope->isValid()) 75 return false; 76 JSObject* thisObject = JSScope::objectAtScope(scope->jsScope()); 77 return thisObject->methodTable()->getOwnPropertySlot(thisObject, exec, propertyName, slot); 67 DebuggerScope* thisObject = jsCast<DebuggerScope*>(object); 68 return thisObject->m_activation->methodTable()->getOwnPropertySlot(thisObject->m_activation.get(), exec, propertyName, slot); 78 69 } 79 70 80 71 void DebuggerScope::put(JSCell* cell, ExecState* exec, PropertyName propertyName, JSValue value, PutPropertySlot& slot) 81 72 { 82 DebuggerScope* scope = jsCast<DebuggerScope*>(cell); 83 ASSERT(scope->isValid()); 84 if (!scope->isValid()) 85 return; 86 JSObject* thisObject = JSScope::objectAtScope(scope->jsScope()); 87 thisObject->methodTable()->put(thisObject, exec, propertyName, value, slot); 73 DebuggerScope* thisObject = jsCast<DebuggerScope*>(cell); 74 thisObject->m_activation->methodTable()->put(thisObject->m_activation.get(), exec, propertyName, value, slot); 88 75 } 89 76 90 77 bool DebuggerScope::deleteProperty(JSCell* cell, ExecState* exec, PropertyName propertyName) 91 78 { 92 DebuggerScope* scope = jsCast<DebuggerScope*>(cell); 93 ASSERT(scope->isValid()); 94 if (!scope->isValid()) 95 return false; 96 JSObject* thisObject = JSScope::objectAtScope(scope->jsScope()); 97 return thisObject->methodTable()->deleteProperty(thisObject, exec, propertyName); 79 DebuggerScope* thisObject = jsCast<DebuggerScope*>(cell); 80 return thisObject->m_activation->methodTable()->deleteProperty(thisObject->m_activation.get(), exec, propertyName); 98 81 } 99 82 100 83 void DebuggerScope::getOwnPropertyNames(JSObject* object, ExecState* exec, PropertyNameArray& propertyNames, EnumerationMode mode) 101 84 { 102 DebuggerScope* scope = jsCast<DebuggerScope*>(object); 103 ASSERT(scope->isValid()); 104 if (!scope->isValid()) 105 return; 106 JSObject* thisObject = JSScope::objectAtScope(scope->jsScope()); 107 thisObject->methodTable()->getPropertyNames(thisObject, exec, propertyNames, mode); 85 DebuggerScope* thisObject = jsCast<DebuggerScope*>(object); 86 thisObject->m_activation->methodTable()->getPropertyNames(thisObject->m_activation.get(), exec, propertyNames, mode); 108 87 } 109 88 110 89 bool DebuggerScope::defineOwnProperty(JSObject* object, ExecState* exec, PropertyName propertyName, const PropertyDescriptor& descriptor, bool shouldThrow) 111 90 { 112 DebuggerScope* scope = jsCast<DebuggerScope*>(object); 113 ASSERT(scope->isValid()); 114 if (!scope->isValid()) 115 return false; 116 JSObject* thisObject = JSScope::objectAtScope(scope->jsScope()); 117 return thisObject->methodTable()->defineOwnProperty(thisObject, exec, propertyName, descriptor, shouldThrow); 118 } 119 120 DebuggerScope* DebuggerScope::next() 121 { 122 ASSERT(isValid()); 123 if (!m_next && m_scope->next()) { 124 VM& vm = *m_scope->vm(); 125 DebuggerScope* nextScope = create(vm, m_scope->next()); 126 m_next.set(vm, this, nextScope); 127 } 128 return m_next.get(); 129 } 130 131 void DebuggerScope::invalidateChain() 132 { 133 DebuggerScope* scope = this; 134 while (scope) { 135 ASSERT(scope->isValid()); 136 DebuggerScope* nextScope = scope->m_next.get(); 137 scope->m_next.clear(); 138 scope->m_scope.clear(); 139 scope = nextScope; 140 } 141 } 142 143 bool DebuggerScope::isWithScope() const 144 { 145 return m_scope->isWithScope(); 146 } 147 148 bool DebuggerScope::isGlobalScope() const 149 { 150 return m_scope->isGlobalObject(); 151 } 152 153 bool DebuggerScope::isFunctionScope() const 154 { 155 // In the current debugger implementation, every function will create an 156 // activation object. Hence, an activation object implies a function scope. 157 return m_scope->isActivationObject(); 91 DebuggerScope* thisObject = jsCast<DebuggerScope*>(object); 92 return thisObject->m_activation->methodTable()->defineOwnProperty(thisObject->m_activation.get(), exec, propertyName, descriptor, shouldThrow); 158 93 } 159 94 -
trunk/Source/JavaScriptCore/debugger/DebuggerScope.h
r172176 r172372 31 31 namespace JSC { 32 32 33 class DebuggerCallFrame;34 class JSScope;35 36 33 class DebuggerScope : public JSNonFinalObject { 37 34 public: 38 35 typedef JSNonFinalObject Base; 39 36 40 static DebuggerScope* create(VM& vm, JS Scope* scope)37 static DebuggerScope* create(VM& vm, JSObject* object) 41 38 { 42 DebuggerScope* debuggerScope = new (NotNull, allocateCell<DebuggerScope>(vm.heap)) DebuggerScope(vm, scope);43 debuggerScope->finishCreation(vm);44 return debuggerScope;39 DebuggerScope* activation = new (NotNull, allocateCell<DebuggerScope>(vm.heap)) DebuggerScope(vm); 40 activation->finishCreation(vm, object); 41 return activation; 45 42 } 46 43 … … 60 57 } 61 58 62 class Iterator { 63 public: 64 Iterator(DebuggerScope* node) 65 : m_node(node) 66 { 67 } 59 protected: 60 static const unsigned StructureFlags = OverridesGetOwnPropertySlot | JSObject::StructureFlags; 68 61 69 DebuggerScope* get() { return m_node; } 70 Iterator& operator++() { m_node = m_node->next(); return *this; } 71 // postfix ++ intentionally omitted 72 73 bool operator==(const Iterator& other) const { return m_node == other.m_node; } 74 bool operator!=(const Iterator& other) const { return m_node != other.m_node; } 75 76 private: 77 DebuggerScope* m_node; 78 }; 79 80 Iterator begin(); 81 Iterator end(); 82 DebuggerScope* next(); 83 84 void invalidateChain(); 85 bool isValid() const { return !!m_scope; } 86 87 bool isWithScope() const; 88 bool isGlobalScope() const; 89 bool isFunctionScope() const; 62 JS_EXPORT_PRIVATE void finishCreation(VM&, JSObject* activation); 90 63 91 64 private: 92 JS_EXPORT_PRIVATE DebuggerScope(VM&, JSScope*); 93 JS_EXPORT_PRIVATE void finishCreation(VM&); 94 95 JSScope* jsScope() const { return m_scope.get(); } 96 97 static const unsigned StructureFlags = OverridesGetOwnPropertySlot | OverridesGetPropertyNames | JSObject::StructureFlags; 98 99 WriteBarrier<JSScope> m_scope; 100 WriteBarrier<DebuggerScope> m_next; 101 102 friend class DebuggerCallFrame; 65 JS_EXPORT_PRIVATE DebuggerScope(VM&); 66 WriteBarrier<JSActivation> m_activation; 103 67 }; 104 105 inline DebuggerScope::Iterator DebuggerScope::begin()106 {107 return Iterator(this);108 }109 110 inline DebuggerScope::Iterator DebuggerScope::end()111 {112 return Iterator(0);113 }114 68 115 69 } // namespace JSC -
trunk/Source/JavaScriptCore/inspector/JSJavaScriptCallFrame.cpp
r172129 r172372 29 29 #if ENABLE(INSPECTOR) 30 30 31 #include "DebuggerScope.h"32 31 #include "Error.h" 33 32 #include "JSCJSValue.h" … … 97 96 int index = exec->argument(0).asInt32(); 98 97 99 DebuggerScope* scopeChain = impl().scopeChain(); 100 DebuggerScope::Iterator end = scopeChain->end(); 98 JSScope* scopeChain = impl().scopeChain(); 99 ScopeChainIterator end = scopeChain->end(); 100 101 // FIXME: We should be identifying and returning CATCH_SCOPE appropriately. 101 102 102 103 bool foundLocalScope = false; 103 for (DebuggerScope::Iterator iter = scopeChain->begin(); iter != end; ++iter) { 104 DebuggerScope* scope = iter.get(); 105 106 if (!foundLocalScope && scope->isFunctionScope()) { 107 // First function scope is the local scope, each successive one is a closure. 108 if (!index) 109 return jsNumber(JSJavaScriptCallFrame::LOCAL_SCOPE); 110 foundLocalScope = true; 104 for (ScopeChainIterator iter = scopeChain->begin(); iter != end; ++iter) { 105 JSObject* scope = iter.get(); 106 if (scope->isActivationObject()) { 107 if (!foundLocalScope) { 108 // First activation object is local scope, each successive activation object is closure. 109 if (!index) 110 return jsNumber(JSJavaScriptCallFrame::LOCAL_SCOPE); 111 foundLocalScope = true; 112 } else if (!index) 113 return jsNumber(JSJavaScriptCallFrame::CLOSURE_SCOPE); 111 114 } 112 115 113 116 if (!index) { 114 if (scope->isWithScope()) 115 return jsNumber(JSJavaScriptCallFrame::WITH_SCOPE); 116 if (scope->isGlobalScope()) { 117 ASSERT(++iter == end); 117 // Last in the chain is global scope. 118 if (++iter == end) 118 119 return jsNumber(JSJavaScriptCallFrame::GLOBAL_SCOPE); 119 } 120 // FIXME: We should be identifying and returning CATCH_SCOPE appropriately. 121 ASSERT(scope->isFunctionScope()); 122 return jsNumber(JSJavaScriptCallFrame::CLOSURE_SCOPE); 120 return jsNumber(JSJavaScriptCallFrame::WITH_SCOPE); 123 121 } 124 122 … … 160 158 return jsNull(); 161 159 162 DebuggerScope* scopeChain = impl().scopeChain();163 DebuggerScope::Iterator iter = scopeChain->begin();164 DebuggerScope::Iterator end = scopeChain->end();160 JSScope* scopeChain = impl().scopeChain(); 161 ScopeChainIterator iter = scopeChain->begin(); 162 ScopeChainIterator end = scopeChain->end(); 165 163 166 164 // We must always have something in the scope chain. -
trunk/Source/JavaScriptCore/inspector/JavaScriptCallFrame.h
r172129 r172372 1 1 /* 2 * Copyright (C) 2008, 2013 -2014Apple Inc. All Rights Reserved.2 * Copyright (C) 2008, 2013 Apple Inc. All Rights Reserved. 3 3 * 4 4 * Redistribution and use in source and binary forms, with or without … … 54 54 String functionName() const { return m_debuggerCallFrame->functionName(); } 55 55 JSC::DebuggerCallFrame::Type type() const { return m_debuggerCallFrame->type(); } 56 JSC:: DebuggerScope* scopeChain() const { return m_debuggerCallFrame->scope(); }56 JSC::JSScope* scopeChain() const { return m_debuggerCallFrame->scope(); } 57 57 JSC::JSGlobalObject* vmEntryGlobalObject() const { return m_debuggerCallFrame->vmEntryGlobalObject(); } 58 58 -
trunk/Source/JavaScriptCore/inspector/ScriptDebugServer.cpp
r172129 r172372 35 35 36 36 #include "DebuggerCallFrame.h" 37 #include "DebuggerScope.h"38 37 #include "JSJavaScriptCallFrame.h" 39 38 #include "JSLock.h" -
trunk/Source/JavaScriptCore/runtime/JSGlobalObject.cpp
r172129 r172372 46 46 #include "DatePrototype.h" 47 47 #include "Debugger.h" 48 #include "DebuggerScope.h"49 48 #include "Error.h" 50 49 #include "ErrorConstructor.h" … … 322 321 m_activationStructure.set(vm, this, JSActivation::createStructure(vm, this, jsNull())); 323 322 m_strictEvalActivationStructure.set(vm, this, StrictEvalActivation::createStructure(vm, this, jsNull())); 324 m_debuggerScopeStructure.set(m_vm, this, DebuggerScope::createStructure(m_vm, this, jsNull()));325 323 m_withScopeStructure.set(vm, this, JSWithScope::createStructure(vm, this, jsNull())); 326 324 … … 665 663 #endif 666 664 667 visitor.append(&thisObject->m_debuggerScopeStructure);668 665 visitor.append(&thisObject->m_withScopeStructure); 669 666 visitor.append(&thisObject->m_strictEvalActivationStructure); -
trunk/Source/JavaScriptCore/runtime/JSGlobalObject.h
r172129 r172372 187 187 #endif 188 188 189 WriteBarrier<Structure> m_debuggerScopeStructure;190 189 WriteBarrier<Structure> m_withScopeStructure; 191 190 WriteBarrier<Structure> m_strictEvalActivationStructure; … … 393 392 #endif 394 393 395 Structure* debuggerScopeStructure() const { return m_debuggerScopeStructure.get(); }396 394 Structure* withScopeStructure() const { return m_withScopeStructure.get(); } 397 395 Structure* strictEvalActivationStructure() const { return m_strictEvalActivationStructure.get(); } -
trunk/Source/JavaScriptCore/runtime/JSObject.h
r172176 r172372 595 595 bool isActivationObject() const; 596 596 bool isErrorInstance() const; 597 bool isWithScope() const;598 597 599 598 JS_EXPORT_PRIVATE void seal(VM&); … … 1152 1151 } 1153 1152 1154 inline bool JSObject::isWithScope() const1155 {1156 return type() == WithScopeType;1157 }1158 1159 1153 inline void JSObject::setStructureAndButterfly(VM& vm, Structure* structure, Butterfly* butterfly) 1160 1154 { -
trunk/Source/JavaScriptCore/runtime/JSScope.h
r172129 r172372 151 151 static size_t offsetOfNext(); 152 152 153 static JSObject* objectAtScope(JSScope*);153 JS_EXPORT_PRIVATE static JSObject* objectAtScope(JSScope*); 154 154 155 155 static JSValue resolve(ExecState*, JSScope*, const Identifier&); -
trunk/Source/JavaScriptCore/runtime/VM.cpp
r172176 r172372 41 41 #include "DFGLongLivedState.h" 42 42 #include "DFGWorklist.h" 43 #include "DebuggerScope.h" 43 44 #include "ErrorInstance.h" 44 45 #include "FTLThunks.h" … … 206 207 structureStructure.set(*this, Structure::createStructure(*this)); 207 208 structureRareDataStructure.set(*this, StructureRareData::createStructure(*this, 0, jsNull())); 209 debuggerScopeStructure.set(*this, DebuggerScope::createStructure(*this, 0, jsNull())); 208 210 terminatedExecutionErrorStructure.set(*this, TerminatedExecutionError::createStructure(*this, 0, jsNull())); 209 211 stringStructure.set(*this, JSString::createStructure(*this, 0, jsNull())); -
trunk/Source/JavaScriptCore/runtime/VM.h
r172176 r172372 241 241 Strong<Structure> structureStructure; 242 242 Strong<Structure> structureRareDataStructure; 243 Strong<Structure> debuggerScopeStructure; 243 244 Strong<Structure> terminatedExecutionErrorStructure; 244 245 Strong<Structure> stringStructure; -
trunk/Source/WebCore/ChangeLog
r172367 r172372 1 2014-08-08 Mark Lam <mark.lam@apple.com> 2 3 REGRESSION: Inspector crashes when debugger is paused and injected scripts access window.screen(). 4 <https://webkit.org/b/135656> 5 6 Not reviewed. 7 8 Rolling out r170680 which was merged to ToT in r172129. 9 10 * bindings/js/ScriptController.cpp: 11 (WebCore::ScriptController::attachDebugger): 12 1 13 2014-08-08 Peyton Randolph <prandolph@apple.com> 2 14 -
trunk/Source/WebCore/bindings/js/ScriptController.cpp
r172129 r172372 308 308 309 309 JSDOMWindow* globalObject = shell->window(); 310 JSLockHolder lock(globalObject->vm());311 310 if (debugger) 312 311 debugger->attach(globalObject);
Note: See TracChangeset
for help on using the changeset viewer.