Changeset 37622 in webkit
- Timestamp:
- Oct 15, 2008 4:33:07 PM (15 years ago)
- Location:
- trunk
- Files:
-
- 1 added
- 32 edited
- 2 copied
Legend:
- Unmodified
- Added
- Removed
-
trunk/JavaScriptCore/ChangeLog
r37604 r37622 1 2008-10-15 Geoffrey Garen <ggaren@apple.com> 2 3 Reviewed by Cameron Zwarich. 4 5 Fixed https://bugs.webkit.org/show_bug.cgi?id=21345 6 Start the debugger without reloading the inspected page 7 8 * JavaScriptCore.exp: New symbols. 9 * JavaScriptCore.xcodeproj/project.pbxproj: New files. 10 11 * VM/CodeBlock.h: 12 (JSC::EvalCodeCache::get): Updated for tweak to parsing API. 13 14 * kjs/CollectorHeapIterator.h: Added. An iterator for the object heap, 15 which we use to find all the live functions and recompile them. 16 17 * kjs/DebuggerCallFrame.cpp: 18 (JSC::DebuggerCallFrame::evaluate): Updated for tweak to parsing API. 19 20 * kjs/FunctionConstructor.cpp: 21 (JSC::constructFunction): Updated for tweak to parsing API. 22 23 * kjs/JSFunction.cpp: 24 (JSC::JSFunction::JSFunction): Try to validate our SourceCode in debug 25 builds by ASSERTing that it's syntactically valid. This doesn't catch 26 all SourceCode bugs, but it catches a lot of them. 27 28 * kjs/JSGlobalObjectFunctions.cpp: 29 (JSC::globalFuncEval): Updated for tweak to parsing API. 30 31 * kjs/Parser.cpp: 32 (JSC::Parser::parse): 33 * kjs/Parser.h: 34 (JSC::Parser::parse): Tweaked the parser to make it possible to parse 35 without an ExecState, and to allow the client to specify a debugger to 36 notify (or not) about the source we parse. This allows the inspector 37 to recompile even though no JavaScript is executing, then notify the 38 debugger about all source code when it's done. 39 40 * kjs/Shell.cpp: 41 (prettyPrintScript): Updated for tweak to parsing API. 42 43 * kjs/SourceRange.h: 44 (JSC::SourceCode::isNull): Added to help with ASSERTs. 45 46 * kjs/collector.cpp: 47 (JSC::Heap::heapAllocate): 48 (JSC::Heap::sweep): 49 (JSC::Heap::primaryHeapBegin): 50 (JSC::Heap::primaryHeapEnd): 51 * kjs/collector.h: 52 (JSC::): Moved a bunch of declarations around to enable compilation of 53 CollectorHeapIterator. 54 55 * kjs/interpreter.cpp: 56 (JSC::Interpreter::checkSyntax): 57 (JSC::Interpreter::evaluate): Updated for tweak to parsing API. 58 59 * kjs/lexer.h: 60 (JSC::Lexer::sourceCode): BUG FIX: Calculate SourceCode ranges relative 61 to the SourceCode range in which we're lexing, otherwise nested functions 62 that are compiled individually get SourceCode ranges that don't reflect 63 their nesting. 64 65 * kjs/nodes.cpp: 66 (JSC::FunctionBodyNode::FunctionBodyNode): 67 (JSC::FunctionBodyNode::finishParsing): 68 (JSC::FunctionBodyNode::create): 69 (JSC::FunctionBodyNode::copyParameters): 70 * kjs/nodes.h: 71 (JSC::ScopeNode::setSource): 72 (JSC::FunctionBodyNode::parameterCount): Added some helper functions for 73 copying one FunctionBodyNode's parameters to another. The recompiler uses 74 these when calling "finishParsing". 75 1 76 2008-10-15 Joerg Bornemann <joerg.bornemann@trolltech.com> 2 77 -
trunk/JavaScriptCore/JavaScriptCore.exp
r37563 r37622 96 96 __ZN3JSC10Identifier3addEPNS_9ExecStateEPKc 97 97 __ZN3JSC10Identifier5equalEPKNS_7UString3RepEPKc 98 __ZN3JSC10JSFunction4infoE 98 99 __ZN3JSC10throwErrorEPNS_9ExecStateENS_9ErrorTypeE 99 100 __ZN3JSC10throwErrorEPNS_9ExecStateENS_9ErrorTypeEPKc … … 154 155 __ZN3JSC14constructArrayEPNS_9ExecStateERKNS_7ArgListE 155 156 __ZN3JSC15JSWrapperObject4markEv 157 __ZN3JSC16FunctionBodyNode13finishParsingEPNS_10IdentifierEm 158 __ZN3JSC16FunctionBodyNode14copyParametersEv 159 __ZN3JSC16FunctionBodyNode6createEPNS_12JSGlobalDataEPNS_14SourceElementsEPN3WTF6VectorISt4pairINS_10IdentifierEjELm16EEEPNS6_INS5_6RefPtrINS_12FuncDeclNodeEEELm16EEERKNS_10SourceCodeEji 156 160 __ZN3JSC16InternalFunction4infoE 157 161 __ZN3JSC16InternalFunctionC2EPNS_12JSGlobalDataEN3WTF10PassRefPtrINS_11StructureIDEEERKNS_10IdentifierE … … 170 174 __ZN3JSC23setUpStaticFunctionSlotEPNS_9ExecStateEPKNS_9HashEntryEPNS_8JSObjectERKNS_10IdentifierERNS_12PropertySlotE 171 175 __ZN3JSC4Heap14allocateNumberEm 176 __ZN3JSC4Heap14primaryHeapEndEv 172 177 __ZN3JSC4Heap15recordExtraCostEm 178 __ZN3JSC4Heap16primaryHeapBeginEv 173 179 __ZN3JSC4Heap17globalObjectCountEv 174 180 __ZN3JSC4Heap20protectedObjectCountEv … … 203 209 __ZN3JSC6JSLock9lockCountEv 204 210 __ZN3JSC6JSLockC1EPNS_9ExecStateE 205 __ZN3JSC6Parser5parseEPNS_ 9ExecStateEPiPNS_7UStringE211 __ZN3JSC6Parser5parseEPNS_12JSGlobalDataEPiPNS_7UStringE 206 212 __ZN3JSC6strtodEPKcPPc 207 213 __ZN3JSC7ArgList10slowAppendEPNS_7JSValueE -
trunk/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj
r37597 r37622 70 70 14BD5A320A3E91F600BAF59C /* JSValueRef.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 14BD5A2B0A3E91F600BAF59C /* JSValueRef.cpp */; }; 71 71 14E0FF120DBAAED00007C0AB /* Machine.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 149B15E70D81F986009CB8C7 /* Machine.cpp */; settings = {COMPILER_FLAGS = "-fno-tree-pre"; }; }; 72 14F3488F0E95EF8A003648BC /* CollectorHeapIterator.h in Headers */ = {isa = PBXBuildFile; fileRef = 14F3488E0E95EF8A003648BC /* CollectorHeapIterator.h */; settings = {ATTRIBUTES = (Private, ); }; }; 72 73 5D53726F0E1C54880021E549 /* Tracing.h in Headers */ = {isa = PBXBuildFile; fileRef = 5D53726E0E1C54880021E549 /* Tracing.h */; }; 73 74 5D5D8AB60E0D0A7200F9C692 /* jsc in Copy Into Framework */ = {isa = PBXBuildFile; fileRef = 932F5BE10822A1C700736975 /* jsc */; }; … … 516 517 14DE0D680D02431400AACCA2 /* JSGlobalObject.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSGlobalObject.cpp; sourceTree = "<group>"; }; 517 518 14F252560D08DD8D004ECFFF /* JSVariableObject.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSVariableObject.h; sourceTree = "<group>"; }; 519 14F3488E0E95EF8A003648BC /* CollectorHeapIterator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CollectorHeapIterator.h; sourceTree = "<group>"; }; 518 520 1C9051420BA9E8A70081E9D0 /* Version.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Version.xcconfig; sourceTree = "<group>"; }; 519 521 1C9051430BA9E8A70081E9D0 /* JavaScriptCore.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = JavaScriptCore.xcconfig; sourceTree = "<group>"; }; … … 1297 1299 147B83AA0E6DB8C9004775A4 /* BatchedTransitionOptimizer.h */, 1298 1300 147B84620E6DE6B1004775A4 /* PutPropertySlot.h */, 1301 14F3488E0E95EF8A003648BC /* CollectorHeapIterator.h */, 1299 1302 ); 1300 1303 path = kjs; … … 1601 1604 140D17D70E8AD4A9000CD17D /* JSBasePrivate.h in Headers */, 1602 1605 869EBCB70E8C6D4A008722CC /* ResultType.h in Headers */, 1606 14F3488F0E95EF8A003648BC /* CollectorHeapIterator.h in Headers */, 1603 1607 ); 1604 1608 runOnlyForDeploymentPostprocessing = 0; -
trunk/JavaScriptCore/VM/CodeBlock.h
r37433 r37622 162 162 163 163 SourceCode source = makeSource(evalSource); 164 evalNode = exec->globalData().parser->parse<EvalNode>(exec, source, &errLine, &errMsg);164 evalNode = exec->globalData().parser->parse<EvalNode>(exec, exec->dynamicGlobalObject()->debugger(), source, &errLine, &errMsg); 165 165 if (evalNode) { 166 166 if (evalSource.size() < maxCacheableSourceLength && (*scopeChain->begin())->isVariableObject() && cacheMap.size() < maxCacheEntries) -
trunk/JavaScriptCore/kjs/DebuggerCallFrame.cpp
r37433 r37622 73 73 UString errMsg; 74 74 SourceCode source = makeSource(script); 75 RefPtr<EvalNode> evalNode = m_callFrame->scopeChain()->globalData->parser->parse<EvalNode>(m_callFrame, source, &errLine, &errMsg);75 RefPtr<EvalNode> evalNode = m_callFrame->scopeChain()->globalData->parser->parse<EvalNode>(m_callFrame, m_callFrame->dynamicGlobalObject()->debugger(), source, &errLine, &errMsg); 76 76 if (!evalNode) 77 77 return Error::create(m_callFrame, SyntaxError, errMsg, errLine, source.provider()->asID(), source.provider()->url()); -
trunk/JavaScriptCore/kjs/FunctionConstructor.cpp
r37433 r37622 88 88 UString errMsg; 89 89 SourceCode source = makeSource(body, sourceURL, lineNumber); 90 RefPtr<FunctionBodyNode> functionBody = exec->globalData().parser->parse<FunctionBodyNode>(exec, source, &errLine, &errMsg);90 RefPtr<FunctionBodyNode> functionBody = exec->globalData().parser->parse<FunctionBodyNode>(exec, exec->dynamicGlobalObject()->debugger(), source, &errLine, &errMsg); 91 91 92 92 // No program node == syntax error - throw a syntax error … … 126 126 } 127 127 size_t count = parameters.size(); 128 functionBody->finishParsing( source,parameters.releaseBuffer(), count);128 functionBody->finishParsing(parameters.releaseBuffer(), count); 129 129 130 130 JSGlobalObject* globalObject = exec->lexicalGlobalObject(); -
trunk/JavaScriptCore/kjs/JSFunction.cpp
r37257 r37622 50 50 , m_scopeChain(scopeChainNode) 51 51 { 52 ASSERT(exec->globalData().parser->parse<FunctionBodyNode>(exec, 0, body->source())); 52 53 } 53 54 -
trunk/JavaScriptCore/kjs/JSGlobalObjectFunctions.cpp
r37433 r37622 287 287 288 288 SourceCode source = makeSource(s); 289 RefPtr<EvalNode> evalNode = exec->globalData().parser->parse<EvalNode>(exec, source, &errLine, &errMsg);289 RefPtr<EvalNode> evalNode = exec->globalData().parser->parse<EvalNode>(exec, exec->dynamicGlobalObject()->debugger(), source, &errLine, &errMsg); 290 290 291 291 if (!evalNode) -
trunk/JavaScriptCore/kjs/Parser.cpp
r37433 r37622 33 33 namespace JSC { 34 34 35 void Parser::parse( ExecState* exec, int* errLine, UString* errMsg)35 void Parser::parse(JSGlobalData* globalData, int* errLine, UString* errMsg) 36 36 { 37 37 ASSERT(!m_sourceElements); … … 48 48 *errMsg = 0; 49 49 50 Lexer& lexer = * exec->globalData().lexer;50 Lexer& lexer = *globalData->lexer; 51 51 lexer.setCode(*m_source); 52 52 53 int parseError = kjsyyparse( &exec->globalData());53 int parseError = kjsyyparse(globalData); 54 54 bool lexError = lexer.sawError(); 55 55 lexer.clear(); 56 56 57 ParserRefCounted::deleteNewObjects( &exec->globalData());57 ParserRefCounted::deleteNewObjects(globalData); 58 58 59 59 if (parseError || lexError) { … … 62 62 m_sourceElements.clear(); 63 63 } 64 65 if (Debugger* debugger = exec->dynamicGlobalObject()->debugger())66 debugger->sourceParsed(exec, *m_source, *errLine, *errMsg);67 64 } 68 65 -
trunk/JavaScriptCore/kjs/Parser.h
r37275 r37622 24 24 #define Parser_h 25 25 26 #include "debugger.h" 26 27 #include "SourceProvider.h" 27 28 #include "nodes.h" … … 49 50 class Parser : Noncopyable { 50 51 public: 51 template <class ParsedNode> PassRefPtr<ParsedNode> parse(ExecState*, PassRefPtr<SourceProvider>, int* errLine = 0, UString* errMsg = 0); 52 template <class ParsedNode> PassRefPtr<ParsedNode> parse(ExecState*, const SourceCode&, int* errLine = 0, UString* errMsg = 0); 52 template <class ParsedNode> PassRefPtr<ParsedNode> parse(ExecState*, Debugger*, const SourceCode&, int* errLine = 0, UString* errMsg = 0); 53 53 54 54 void didFinishParsing(SourceElements*, ParserRefCountedData<DeclarationStacks::VarStack>*, … … 56 56 57 57 private: 58 friend class JSGlobalData; 59 60 void parse(ExecState*, int* errLine, UString* errMsg); 58 void parse(JSGlobalData*, int* errLine, UString* errMsg); 61 59 62 60 const SourceCode* m_source; … … 69 67 }; 70 68 71 template <class ParsedNode> PassRefPtr<ParsedNode> Parser::parse(ExecState* exec, const SourceCode& source, int* errLine, UString* errMsg)69 template <class ParsedNode> PassRefPtr<ParsedNode> Parser::parse(ExecState* exec, Debugger* debugger, const SourceCode& source, int* errLine, UString* errMsg) 72 70 { 73 71 m_source = &source; 74 parse( exec, errLine, errMsg);72 parse(&exec->globalData(), errLine, errMsg); 75 73 RefPtr<ParsedNode> result; 76 74 if (m_sourceElements) { … … 89 87 m_varDeclarations = 0; 90 88 m_funcDeclarations = 0; 89 90 if (debugger) 91 debugger->sourceParsed(exec, source, *errLine, *errMsg); 91 92 return result.release(); 92 93 } -
trunk/JavaScriptCore/kjs/Shell.cpp
r37433 r37622 306 306 int errLine = 0; 307 307 UString errMsg; 308 RefPtr<ProgramNode> programNode = exec->globalData().parser->parse<ProgramNode>(exec, makeSource(script.data(), fileName), &errLine, &errMsg);308 RefPtr<ProgramNode> programNode = exec->globalData().parser->parse<ProgramNode>(exec, exec->dynamicGlobalObject()->debugger(), makeSource(script.data(), fileName), &errLine, &errMsg); 309 309 if (!programNode) { 310 310 fprintf(stderr, "%s:%d: %s.\n", fileName.UTF8String().c_str(), errLine, errMsg.UTF8String().c_str()); -
trunk/JavaScriptCore/kjs/SourceRange.h
r37184 r37622 69 69 } 70 70 71 bool isNull() const { return !m_provider; } 71 72 SourceProvider* provider() const { return m_provider.get(); } 72 73 int firstLine() const { return m_firstLine; } -
trunk/JavaScriptCore/kjs/collector.cpp
r37410 r37622 23 23 24 24 #include "ArgList.h" 25 #include "CollectorHeapIterator.h" 25 26 #include "ExecState.h" 26 27 #include "JSGlobalObject.h" … … 182 183 } 183 184 184 template <Heap ::HeapType heapType>185 template <HeapType heapType> 185 186 static NEVER_INLINE CollectorBlock* allocateBlock() 186 187 { … … 266 267 } 267 268 268 template <Heap::HeapType heapType> struct HeapConstants; 269 270 template <> struct HeapConstants<Heap::PrimaryHeap> { 271 static const size_t cellSize = CELL_SIZE; 272 static const size_t cellsPerBlock = CELLS_PER_BLOCK; 273 static const size_t bitmapShift = 0; 274 typedef CollectorCell Cell; 275 typedef CollectorBlock Block; 276 }; 277 278 template <> struct HeapConstants<Heap::NumberHeap> { 279 static const size_t cellSize = SMALL_CELL_SIZE; 280 static const size_t cellsPerBlock = SMALL_CELLS_PER_BLOCK; 281 static const size_t bitmapShift = 1; 282 typedef SmallCollectorCell Cell; 283 typedef SmallCellCollectorBlock Block; 284 }; 285 286 template <Heap::HeapType heapType> ALWAYS_INLINE void* Heap::heapAllocate(size_t s) 269 template <HeapType heapType> ALWAYS_INLINE void* Heap::heapAllocate(size_t s) 287 270 { 288 271 typedef typename HeapConstants<heapType>::Block Block; … … 860 843 } 861 844 862 template <Heap ::HeapType heapType> size_t Heap::sweep()845 template <HeapType heapType> size_t Heap::sweep() 863 846 { 864 847 typedef typename HeapConstants<heapType>::Block Block; … … 866 849 867 850 // SWEEP: delete everything with a zero refcount (garbage) and unmark everything else 868 CollectorHeap& heap = heapType == Heap::PrimaryHeap ? primaryHeap : numberHeap;851 CollectorHeap& heap = heapType == PrimaryHeap ? primaryHeap : numberHeap; 869 852 870 853 size_t emptyBlocks = 0; … … 883 866 Cell* cell = curBlock->cells + i; 884 867 885 if (heapType != Heap::NumberHeap) {868 if (heapType != NumberHeap) { 886 869 JSCell* imp = reinterpret_cast<JSCell*>(cell); 887 870 // special case for allocated but uninitialized object … … 911 894 } else { 912 895 if (!curBlock->marked.get(i >> HeapConstants<heapType>::bitmapShift)) { 913 if (heapType != Heap::NumberHeap) {896 if (heapType != NumberHeap) { 914 897 JSCell* imp = reinterpret_cast<JSCell*>(cell); 915 898 imp->~JSCell(); … … 1087 1070 } 1088 1071 1072 Heap::iterator Heap::primaryHeapBegin() 1073 { 1074 return iterator(primaryHeap.blocks, primaryHeap.blocks + primaryHeap.usedBlocks); 1075 } 1076 1077 Heap::iterator Heap::primaryHeapEnd() 1078 { 1079 return iterator(primaryHeap.blocks + primaryHeap.usedBlocks, primaryHeap.blocks + primaryHeap.usedBlocks); 1080 } 1081 1089 1082 } // namespace JSC -
trunk/JavaScriptCore/kjs/collector.h
r37215 r37622 46 46 47 47 enum OperationInProgress { NoOperation, Allocation, Collection }; 48 enum HeapType { PrimaryHeap, NumberHeap }; 49 50 template <HeapType> class CollectorHeapIterator; 48 51 49 52 struct CollectorHeap { … … 63 66 public: 64 67 class Thread; 65 enum HeapType { PrimaryHeap, NumberHeap };68 typedef CollectorHeapIterator<PrimaryHeap> iterator; 66 69 67 70 void destroy(); … … 109 112 JSGlobalData* globalData() const { return m_globalData; } 110 113 static bool isNumber(JSCell*); 114 115 // Iterators for the object heap. 116 iterator primaryHeapBegin(); 117 iterator primaryHeapEnd(); 111 118 112 119 private: 113 template <Heap ::HeapType heapType> void* heapAllocate(size_t);114 template <Heap ::HeapType heapType> size_t sweep();120 template <HeapType heapType> void* heapAllocate(size_t); 121 template <HeapType heapType> size_t sweep(); 115 122 static const CollectorBlock* cellBlock(const JSCell*); 116 123 static CollectorBlock* cellBlock(JSCell*); … … 207 214 CollectorBitmap marked; 208 215 Heap* heap; 209 Heap ::HeapType type;216 HeapType type; 210 217 }; 211 218 … … 217 224 CollectorBitmap marked; 218 225 Heap* heap; 219 Heap ::HeapType type;226 HeapType type; 220 227 }; 221 228 229 template <HeapType heapType> struct HeapConstants; 230 231 template <> struct HeapConstants<PrimaryHeap> { 232 static const size_t cellSize = CELL_SIZE; 233 static const size_t cellsPerBlock = CELLS_PER_BLOCK; 234 static const size_t bitmapShift = 0; 235 typedef CollectorCell Cell; 236 typedef CollectorBlock Block; 237 }; 238 239 template <> struct HeapConstants<NumberHeap> { 240 static const size_t cellSize = SMALL_CELL_SIZE; 241 static const size_t cellsPerBlock = SMALL_CELLS_PER_BLOCK; 242 static const size_t bitmapShift = 1; 243 typedef SmallCollectorCell Cell; 244 typedef SmallCellCollectorBlock Block; 245 }; 246 222 247 inline bool Heap::isNumber(JSCell* cell) 223 248 { -
trunk/JavaScriptCore/kjs/interpreter.cpp
r37433 r37622 47 47 UString errMsg; 48 48 49 RefPtr<ProgramNode> progNode = exec->globalData().parser->parse<ProgramNode>(exec, source, &errLine, &errMsg);49 RefPtr<ProgramNode> progNode = exec->globalData().parser->parse<ProgramNode>(exec, exec->dynamicGlobalObject()->debugger(), source, &errLine, &errMsg); 50 50 if (!progNode) 51 51 return Completion(Throw, Error::create(exec, SyntaxError, errMsg, errLine, source.provider()->asID(), source.provider()->url())); … … 59 59 int errLine; 60 60 UString errMsg; 61 RefPtr<ProgramNode> programNode = exec->globalData().parser->parse<ProgramNode>(exec, source, &errLine, &errMsg);61 RefPtr<ProgramNode> programNode = exec->globalData().parser->parse<ProgramNode>(exec, exec->dynamicGlobalObject()->debugger(), source, &errLine, &errMsg); 62 62 63 63 if (!programNode) -
trunk/JavaScriptCore/kjs/lexer.h
r37184 r37622 89 89 90 90 void clear(); 91 SourceCode sourceCode(int openBrace, int closeBrace, int firstLine) { return SourceCode(m_source->provider(), openBrace + 1,closeBrace, firstLine); }91 SourceCode sourceCode(int openBrace, int closeBrace, int firstLine) { return SourceCode(m_source->provider(), m_source->startOffset() + openBrace + 1, m_source->startOffset() + closeBrace, firstLine); } 92 92 93 93 private: -
trunk/JavaScriptCore/kjs/nodes.cpp
r37553 r37622 1747 1747 // ------------------------------ FunctionBodyNode ----------------------------- 1748 1748 1749 FunctionBodyNode::FunctionBodyNode(JSGlobalData* globalData, SourceElements* children, VarStack* varStack, FunctionStack* funcStack, CodeFeatures features, int numConstants)1750 : ScopeNode(globalData, SourceCode(), children, varStack, funcStack, features, numConstants)1749 FunctionBodyNode::FunctionBodyNode(JSGlobalData* globalData, SourceElements* children, VarStack* varStack, FunctionStack* funcStack, const SourceCode& sourceCode, CodeFeatures features, int numConstants) 1750 : ScopeNode(globalData, sourceCode, children, varStack, funcStack, features, numConstants) 1751 1751 , m_parameters(0) 1752 , m_parameterCount(0) 1752 1753 , m_refCount(0) 1753 1754 { … … 1766 1767 parameters.append(parameter->ident()); 1767 1768 size_t count = parameters.size(); 1768 finishParsing(source, parameters.releaseBuffer(), count); 1769 } 1770 1771 void FunctionBodyNode::finishParsing(const SourceCode& source, Identifier* parameters, size_t parameterCount) 1772 { 1769 1773 1770 setSource(source); 1771 finishParsing(parameters.releaseBuffer(), count); 1772 } 1773 1774 void FunctionBodyNode::finishParsing(Identifier* parameters, size_t parameterCount) 1775 { 1776 ASSERT(!source().isNull()); 1774 1777 m_parameters = parameters; 1775 1778 m_parameterCount = parameterCount; … … 1784 1787 FunctionBodyNode* FunctionBodyNode::create(JSGlobalData* globalData, SourceElements* children, VarStack* varStack, FunctionStack* funcStack, CodeFeatures features, int numConstants) 1785 1788 { 1786 return new FunctionBodyNode(globalData, children, varStack, funcStack, features, numConstants);1787 } 1788 1789 FunctionBodyNode* FunctionBodyNode::create(JSGlobalData* globalData, SourceElements* children, VarStack* varStack, FunctionStack* funcStack, const SourceCode& , CodeFeatures features, int numConstants)1790 { 1791 return new FunctionBodyNode(globalData, children, varStack, funcStack, features, numConstants);1789 return new FunctionBodyNode(globalData, children, varStack, funcStack, SourceCode(), features, numConstants); 1790 } 1791 1792 FunctionBodyNode* FunctionBodyNode::create(JSGlobalData* globalData, SourceElements* children, VarStack* varStack, FunctionStack* funcStack, const SourceCode& sourceCode, CodeFeatures features, int numConstants) 1793 { 1794 return new FunctionBodyNode(globalData, children, varStack, funcStack, sourceCode, features, numConstants); 1792 1795 } 1793 1796 … … 1849 1852 1850 1853 return s; 1854 } 1855 1856 Identifier* FunctionBodyNode::copyParameters() 1857 { 1858 Identifier* parameters = static_cast<Identifier*>(fastMalloc(m_parameterCount * sizeof(Identifier))); 1859 VectorCopier<false, Identifier>::uninitializedCopy(m_parameters, m_parameters + m_parameterCount, parameters); 1860 return parameters; 1851 1861 } 1852 1862 -
trunk/JavaScriptCore/kjs/nodes.h
r37433 r37622 2175 2175 virtual void streamTo(SourceStream&) const JSC_FAST_CALL; 2176 2176 2177 void setSource(const SourceCode& source) { m_source = source; }2178 2177 const SourceCode& source() const { return m_source; } 2179 2178 const UString& sourceURL() const JSC_FAST_CALL { return m_source.provider()->url(); } … … 2197 2196 2198 2197 protected: 2198 void setSource(const SourceCode& source) { m_source = source; } 2199 2199 2200 VarStack m_varStack; 2200 2201 FunctionStack m_functionStack; … … 2256 2257 2257 2258 const Identifier* parameters() const JSC_FAST_CALL { return m_parameters; } 2258 size_t parameterCount() { return m_parameterCount; }2259 size_t parameterCount() const { return m_parameterCount; } 2259 2260 UString paramString() const JSC_FAST_CALL; 2261 Identifier* copyParameters(); 2260 2262 2261 2263 virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) JSC_FAST_CALL; … … 2280 2282 2281 2283 void finishParsing(const SourceCode&, ParameterNode*); 2282 void finishParsing( const SourceCode&,Identifier* parameters, size_t parameterCount);2284 void finishParsing(Identifier* parameters, size_t parameterCount); 2283 2285 2284 2286 UString toSourceString() const JSC_FAST_CALL { return UString("{") + source().toString() + UString("}"); } … … 2299 2301 2300 2302 protected: 2301 FunctionBodyNode(JSGlobalData*, SourceElements*, VarStack*, FunctionStack*, CodeFeatures, int numConstants) JSC_FAST_CALL;2303 FunctionBodyNode(JSGlobalData*, SourceElements*, VarStack*, FunctionStack*, const SourceCode&, CodeFeatures, int numConstants) JSC_FAST_CALL; 2302 2304 2303 2305 private: -
trunk/WebCore/ChangeLog
r37621 r37622 1 2008-10-15 Geoffrey Garen <ggaren@apple.com> 2 3 Reviewed by Cameron Zwarich. 4 5 Fixed https://bugs.webkit.org/show_bug.cgi?id=21345 6 Start the debugger without reloading the inspected page 7 8 * WebCore.base.exp: New symbols. 9 10 * ForwardingHeaders/kjs/CollectorHeapIterator.h: Copied from ForwardingHeaders/kjs/ustring.h. 11 * ForwardingHeaders/kjs/Parser.h: Copied from ForwardingHeaders/kjs/ustring.h. 12 * WebCore.xcodeproj/project.pbxproj: New forwarding headers. 13 14 * inspector/InspectorController.cpp: 15 (WebCore::InspectorController::setWindowVisible): 16 (WebCore::InspectorController::windowScriptObjectAvailable): 17 (WebCore::InspectorController::startDebugging): 18 * inspector/InspectorController.h: Renamed startDebuggingAndReloadInspectedPage 19 to startDebugging, and changed its behavior to match. 20 21 * inspector/JavaScriptDebugListener.h: 22 * inspector/JavaScriptDebugServer.cpp: 23 (WebCore::JavaScriptDebugServer::JavaScriptDebugServer): 24 (WebCore::JavaScriptDebugServer::addListener): 25 (WebCore::JavaScriptDebugServer::removeListener): 26 (WebCore::JavaScriptDebugServer::recompileAllJSFunctions): 27 (WebCore::JavaScriptDebugServer::willAddFirstListener): 28 (WebCore::JavaScriptDebugServer::didRemoveLastListener): 29 * inspector/JavaScriptDebugServer.h: Refactored the 30 JavaScriptDebugServer to centralize handling of adding the first listener 31 and removing the last. Then, added a feature to recompile all JS functions 32 in these cases. This allows us to dynamically add and remove hooks like 33 the debugger hooks without reloading the page. 34 35 * inspector/front-end/ScriptsPanel.js: 36 * English.lproj/localizedStrings.js: Updated for startDebuggingAndReloadInspectedPage => 37 startDebugging rename. Removed all UI that claimed that starting the 38 debugger would reload the page. 39 1 40 2008-10-15 Adele Peterson <adele@apple.com> 2 41 -
trunk/WebCore/ForwardingHeaders/kjs/CollectorHeapIterator.h
r37586 r37622 1 #include <JavaScriptCore/ ustring.h>1 #include <JavaScriptCore/CollectorHeapIterator.h> -
trunk/WebCore/ForwardingHeaders/kjs/Parser.h
r37586 r37622 1 #include <JavaScriptCore/ ustring.h>1 #include <JavaScriptCore/Parser.h> -
trunk/WebCore/WebCore.base.exp
r37611 r37622 380 380 __ZN7WebCore19InspectorController12detachWindowEv 381 381 __ZN7WebCore19InspectorController13stopDebuggingEv 382 __ZN7WebCore19InspectorController14startDebuggingEv 382 383 __ZN7WebCore19InspectorController16setWindowVisibleEbb 383 384 __ZN7WebCore19InspectorController26stopUserInitiatedProfilingEv 384 385 __ZN7WebCore19InspectorController27startUserInitiatedProfilingEv 385 __ZN7WebCore19InspectorController36startDebuggingAndReloadInspectedPageEv386 386 __ZN7WebCore19InspectorController4showEv 387 387 __ZN7WebCore19InspectorController5closeEv … … 401 401 __ZN7WebCore20ResourceResponseBase24setExpectedContentLengthEx 402 402 __ZN7WebCore21ContextMenuController16clearContextMenuEv 403 __ZN7WebCore21JavaScriptDebugServer23recompileAllJSFunctionsEPNS_5TimerIS0_EE 404 __ZN7WebCore21JavaScriptDebugServer6sharedEv 403 405 __ZN7WebCore21PlatformKeyboardEvent24disambiguateKeyDownEventENS0_4TypeEb 404 406 __ZN7WebCore21PlatformKeyboardEventC1EP7NSEvent -
trunk/WebCore/WebCore.xcodeproj/project.pbxproj
r37590 r37622 365 365 1C81BA0C0E97348300266E07 /* JavaScriptDebugListener.h in Headers */ = {isa = PBXBuildFile; fileRef = 1C81BA060E97348300266E07 /* JavaScriptDebugListener.h */; settings = {ATTRIBUTES = (Private, ); }; }; 366 366 1C81BA0D0E97348300266E07 /* JavaScriptDebugServer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1C81BA070E97348300266E07 /* JavaScriptDebugServer.cpp */; }; 367 1C81BA0E0E97348300266E07 /* JavaScriptDebugServer.h in Headers */ = {isa = PBXBuildFile; fileRef = 1C81BA080E97348300266E07 /* JavaScriptDebugServer.h */; };367 1C81BA0E0E97348300266E07 /* JavaScriptDebugServer.h in Headers */ = {isa = PBXBuildFile; fileRef = 1C81BA080E97348300266E07 /* JavaScriptDebugServer.h */; settings = {ATTRIBUTES = (Private, ); }; }; 368 368 1CA19E050DC255950065A994 /* EventLoopMac.mm in Sources */ = {isa = PBXBuildFile; fileRef = 1CA19E030DC255950065A994 /* EventLoopMac.mm */; }; 369 369 1CA19E160DC255CA0065A994 /* EventLoop.h in Headers */ = {isa = PBXBuildFile; fileRef = 1CA19E150DC255CA0065A994 /* EventLoop.h */; }; -
trunk/WebCore/inspector/InspectorController.cpp
r37349 r37622 74 74 #include <kjs/JSLock.h> 75 75 #include <kjs/ustring.h> 76 #include <kjs/CollectorHeapIterator.h> 76 77 #include <profiler/Profile.h> 77 78 #include <profiler/Profiler.h> … … 431 432 SIMPLE_INSPECTOR_CALLBACK(attach, attachWindow); 432 433 SIMPLE_INSPECTOR_CALLBACK(detach, detachWindow); 433 SIMPLE_INSPECTOR_CALLBACK(startDebugging AndReloadInspectedPage, startDebuggingAndReloadInspectedPage);434 SIMPLE_INSPECTOR_CALLBACK(startDebugging, startDebugging); 434 435 SIMPLE_INSPECTOR_CALLBACK(stopDebugging, stopDebugging); 435 436 SIMPLE_INSPECTOR_CALLBACK(pauseInDebugger, pauseInDebugger); … … 1115 1116 focusNode(); 1116 1117 if (m_attachDebuggerWhenShown) 1117 startDebugging AndReloadInspectedPage();1118 startDebugging(); 1118 1119 if (m_showAfterVisible != CurrentPanel) 1119 1120 showPanel(m_showAfterVisible); … … 1322 1323 { "attach", WebCore::attach, kJSPropertyAttributeNone }, 1323 1324 { "detach", WebCore::detach, kJSPropertyAttributeNone }, 1324 { "startDebugging AndReloadInspectedPage", WebCore::startDebuggingAndReloadInspectedPage, kJSPropertyAttributeNone },1325 { "startDebugging", WebCore::startDebugging, kJSPropertyAttributeNone }, 1325 1326 { "stopDebugging", WebCore::stopDebugging, kJSPropertyAttributeNone }, 1326 1327 { "pauseInDebugger", WebCore::pauseInDebugger, kJSPropertyAttributeNone }, … … 2313 2314 } 2314 2315 2315 void InspectorController::startDebugging AndReloadInspectedPage()2316 void InspectorController::startDebugging() 2316 2317 { 2317 2318 if (!enabled()) … … 2332 2333 2333 2334 callSimpleFunction(m_scriptContext, m_scriptObject, "debuggerAttached"); 2334 2335 m_inspectedPage->mainFrame()->loader()->reload();2336 2335 } 2337 2336 -
trunk/WebCore/inspector/InspectorController.h
r37349 r37622 161 161 void closeWindow(); 162 162 163 void startDebugging AndReloadInspectedPage();163 void startDebugging(); 164 164 void stopDebugging(); 165 165 bool debuggerAttached() const { return m_debuggerAttached; } -
trunk/WebCore/inspector/JavaScriptDebugListener.h
r37289 r37622 31 31 32 32 namespace JSC { 33 class DebuggerCallFrame;34 33 class ExecState; 35 34 class SourceCode; -
trunk/WebCore/inspector/JavaScriptDebugServer.cpp
r37289 r37622 45 45 #include "Widget.h" 46 46 #include "ScriptController.h" 47 #include <kjs/CollectorHeapIterator.h> 47 48 #include <kjs/DebuggerCallFrame.h> 49 #include <kjs/JSLock.h> 50 #include <kjs/Parser.h> 48 51 #include <wtf/MainThread.h> 49 52 #include <wtf/UnusedParam.h> … … 68 71 , m_doneProcessingDebuggerEvents(true) 69 72 , m_pauseOnCallFrame(0) 73 , m_recompileTimer(this, &JavaScriptDebugServer::recompileAllJSFunctions) 70 74 { 71 75 } … … 81 85 { 82 86 if (!hasListeners()) 83 Page::setDebuggerForAllPages(this);87 willAddFirstListener(); 84 88 85 89 m_listeners.add(listener); … … 89 93 { 90 94 m_listeners.remove(listener); 91 if (!hasListeners()) { 92 Page::setDebuggerForAllPages(0); 93 m_doneProcessingDebuggerEvents = true; 94 } 95 if (!hasListeners()) 96 didRemoveLastListener(); 95 97 } 96 98 … … 100 102 101 103 if (!hasListeners()) 102 Page::setDebuggerForAllPages(this);104 willAddFirstListener(); 103 105 104 106 pair<PageListenersMap::iterator, bool> result = m_pageListenersMap.add(page, 0); … … 119 121 120 122 ListenerSet* listeners = it->second; 121 122 123 listeners->remove(listener); 123 124 124 if (listeners->isEmpty()) { 125 125 m_pageListenersMap.remove(it); … … 127 127 } 128 128 129 if (!hasListeners()) { 130 Page::setDebuggerForAllPages(0); 131 m_doneProcessingDebuggerEvents = true; 132 } 129 if (!hasListeners()) 130 didRemoveLastListener(); 133 131 } 134 132 … … 522 520 } 523 521 522 void JavaScriptDebugServer::recompileAllJSFunctions(Timer<JavaScriptDebugServer>*) 523 { 524 JSLock lock(false); 525 JSGlobalData* globalData = JSDOMWindow::commonJSGlobalData(); 526 527 // If JavaScript is running, it's not safe to recompile, since we'll end 528 // up throwing away code that is live on the stack. 529 ASSERT(!globalData->dynamicGlobalObject); 530 if (globalData->dynamicGlobalObject) 531 return; 532 533 Vector<ProtectedPtr<JSFunction> > functions; 534 Heap::iterator heapEnd = globalData->heap.primaryHeapEnd(); 535 for (Heap::iterator it = globalData->heap.primaryHeapBegin(); it != heapEnd; ++it) { 536 if ((*it)->isObject(&JSFunction::info)) 537 functions.append(static_cast<JSFunction*>(*it)); 538 } 539 540 typedef HashMap<RefPtr<FunctionBodyNode>, RefPtr<FunctionBodyNode> > FunctionBodyMap; 541 typedef HashSet<SourceProvider*> SourceProviderSet; 542 543 FunctionBodyMap functionBodies; 544 SourceProviderSet sourceProviders; 545 546 size_t size = functions.size(); 547 for (size_t i = 0; i < size; ++i) { 548 JSFunction* function = functions[i]; 549 550 FunctionBodyNode* oldBody = function->m_body.get(); 551 pair<FunctionBodyMap::iterator, bool> result = functionBodies.add(oldBody, 0); 552 if (!result.second) { 553 function->m_body = result.first->second; 554 continue; 555 } 556 557 ExecState* exec = function->scope().globalObject()->JSGlobalObject::globalExec(); 558 const SourceCode& sourceCode = oldBody->source(); 559 560 RefPtr<FunctionBodyNode> newBody = globalData->parser->parse<FunctionBodyNode>(exec, 0, sourceCode); 561 ASSERT(newBody); 562 newBody->finishParsing(oldBody->copyParameters(), oldBody->parameterCount()); 563 564 result.first->second = newBody; 565 function->m_body = newBody.release(); 566 567 if (hasListeners()) { 568 SourceProvider* provider = sourceCode.provider(); 569 if (sourceProviders.add(provider).second) 570 sourceParsed(exec, SourceCode(provider), -1, 0); 571 } 572 } 573 } 574 575 void JavaScriptDebugServer::willAddFirstListener() 576 { 577 Page::setDebuggerForAllPages(this); 578 m_recompileTimer.startOneShot(0); 579 } 580 581 void JavaScriptDebugServer::didRemoveLastListener() 582 { 583 Page::setDebuggerForAllPages(0); 584 m_doneProcessingDebuggerEvents = true; 585 m_recompileTimer.startOneShot(0); 586 } 587 524 588 } // namespace WebCore -
trunk/WebCore/inspector/JavaScriptDebugServer.h
r37289 r37622 30 30 #define JavaScriptDebugServer_h 31 31 32 #include "Timer.h" 32 33 #include <kjs/debugger.h> 33 34 34 #include <wtf/HashMap.h> 35 35 #include <wtf/HashSet.h> … … 74 74 void stepOutOfFunction(); 75 75 76 void recompileAllJSFunctions(Timer<JavaScriptDebugServer>*); 77 76 78 JavaScriptCallFrame* currentCallFrame(); 77 79 … … 104 106 virtual void didExecuteProgram(const JSC::DebuggerCallFrame&, intptr_t sourceID, int lineno); 105 107 virtual void didReachBreakpoint(const JSC::DebuggerCallFrame&, intptr_t sourceID, int lineno); 108 109 void willAddFirstListener(); 110 void didRemoveLastListener(); 106 111 107 112 typedef HashMap<Page*, ListenerSet*> PageListenersMap; … … 117 122 HashMap<RefPtr<Frame>, PausedTimeouts*> m_pausedTimeouts; 118 123 HashMap<intptr_t, HashSet<unsigned>*> m_breakpoints; 124 Timer<JavaScriptDebugServer> m_recompileTimer; 119 125 }; 120 126 -
trunk/WebCore/inspector/front-end/ScriptsPanel.js
r37289 r37622 144 144 this.attachOverlayElement.id = "scripts-attach-overlay"; 145 145 146 var headerElement = document.createElement("h1");147 headerElement.textContent = WebInspector.UIString("Starting debugging will reload the inspected page.");148 this.attachOverlayElement.appendChild(headerElement);149 150 this.attachOverlayElement.appendChild(document.createElement("br"));151 152 146 var attachButton = document.createElement("button"); 153 147 attachButton.textContent = WebInspector.UIString("Start Debugging"); … … 668 662 this.attachOverlayElement.parentNode.removeChild(this.attachOverlayElement); 669 663 } else { 670 this.debuggingButton.title = WebInspector.UIString("Start debugging and reload inspected page.");664 this.debuggingButton.title = WebInspector.UIString("Start debugging."); 671 665 this.debuggingButton.removeStyleClass("toggled-on"); 672 666 this.pauseButton.disabled = true; … … 749 743 InspectorController.stopDebugging(); 750 744 else 751 InspectorController.startDebugging AndReloadInspectedPage();745 InspectorController.startDebugging(); 752 746 753 747 this._clearInterface(); -
trunk/WebKit/mac/ChangeLog
r37611 r37622 1 2008-10-15 Geoffrey Garen <ggaren@apple.com> 2 3 Reviewed by Cameron Zwarich. 4 5 Fixed https://bugs.webkit.org/show_bug.cgi?id=21345 6 Start the debugger without reloading the inspected page 7 8 * WebInspector/WebInspector.mm: 9 (-[WebInspector startDebuggingJavaScript:]): Updated for rename. 10 1 11 2008-10-14 Maxime Britto <britto@apple.com> 2 12 -
trunk/WebKit/mac/WebInspector/WebInspector.mm
r35689 r37622 89 89 return; 90 90 page->inspectorController()->showPanel(InspectorController::ScriptsPanel); 91 page->inspectorController()->startDebugging AndReloadInspectedPage();91 page->inspectorController()->startDebugging(); 92 92 } 93 93 -
trunk/WebKit/win/ChangeLog
r37609 r37622 1 2008-10-15 Geoffrey Garen <ggaren@apple.com> 2 3 Reviewed by Cameron Zwarich. 4 5 Fixed https://bugs.webkit.org/show_bug.cgi?id=21345 6 Start the debugger without reloading the inspected page 7 8 * WebInspector.cpp: 9 (WebInspector::toggleDebuggingJavaScript): Updated for rename. 10 1 11 2008-10-15 Adam Roben <aroben@apple.com> 2 12 -
trunk/WebKit/win/WebInspector.cpp
r35460 r37622 179 179 else { 180 180 inspector->showPanel(InspectorController::ScriptsPanel); 181 inspector->startDebugging AndReloadInspectedPage();181 inspector->startDebugging(); 182 182 } 183 183
Note: See TracChangeset
for help on using the changeset viewer.