| 2012-10-02 Filip Pizlo <fpizlo@apple.com> |
| |
| REGRESSION(r128400): ASSERT (crash in release) @ app.asana.com |
| https://bugs.webkit.org/show_bug.cgi?id=98175 |
| |
| Reviewed by Oliver Hunt. |
| |
| It's bad karma to create a new structure while stealing another structure's property table |
| while leaving the m_offset unset. Eventually someone will then steal your property table, and |
| then you won't know how many properties you have anymore. |
| |
| * runtime/Structure.cpp: |
| (JSC::Structure::nonPropertyTransition): |
| |
| 2012-10-02 Michael Saboff <msaboff@apple.com> |
| |
| Comment additions after r130109 |
| |
| Rubber stamped by Geoffrey Garen. |
| |
| Updated comments to how array storage works. |
| |
| * runtime/ArrayStorage.h: |
| * runtime/JSArray.cpp: |
| |
| 2012-10-01 Mark Hahnenberg <mhahnenberg@apple.com> |
| |
| Block freeing thread should sleep indefinitely when there's no work to do |
| https://bugs.webkit.org/show_bug.cgi?id=98084 |
| |
| Reviewed by Geoffrey Garen. |
| |
| Currently the block freeing thread wakes up once a second to check if there are any blocks |
| for it to release back to the OS. This is wasteful. We should change it to sleep when it |
| realizes there are no more blocks to free. Any thread that returns a block to the BlockAllocator |
| should then notify the block freeing thread that there is more work to do now. |
| |
| * heap/BlockAllocator.cpp: |
| (JSC::BlockAllocator::BlockAllocator): |
| (JSC::BlockAllocator::blockFreeingThreadMain): |
| * heap/BlockAllocator.h: |
| (BlockAllocator): |
| (JSC::BlockAllocator::deallocate): |
| |
| 2012-10-01 Michael Saboff <msaboff@apple.com> |
| |
| JSArray::unshiftCountSlowCase needs to clear array slots when adding space to end of array |
| https://bugs.webkit.org/show_bug.cgi?id=98101 |
| |
| Reviewed by Filip Pizlo. |
| |
| Cleared new array entries when adding to end due to shifting contents to lower memory. Also |
| checnaged the order of moving array contents and metadata in the shift left case to avoid |
| clobbering the metadata with array contents. Optimized the to only make a memmove if the |
| count is non-zero. |
| |
| * runtime/JSArray.cpp: |
| (JSC::JSArray::unshiftCountSlowCase): |
| (JSC::JSArray::unshiftCount): |
| |
| 2012-10-01 Filip Pizlo <fpizlo@apple.com> |
| |
| Address a FIXME in JSArray::sort |
| https://bugs.webkit.org/show_bug.cgi?id=98080 |
| <rdar://problem/12407844> |
| |
| Reviewed by Oliver Hunt. |
| |
| Get rid of fast sorting of sparse maps. I don't know that it's broken but I do know that we don't |
| have coverage for it. Then also address the FIXME in JSArray::sort regarding side-effecting |
| compare functions. |
| |
| * runtime/ArrayPrototype.cpp: |
| (JSC::arrayProtoFuncSort): |
| * runtime/JSArray.cpp: |
| (JSC::JSArray::sortNumeric): |
| (JSC::JSArray::sort): |
| (JSC::JSArray::compactForSorting): |
| * runtime/JSArray.h: |
| (JSArray): |
| * runtime/JSObject.h: |
| (JSC::JSObject::hasSparseMap): |
| (JSObject): |
| |
| 2012-10-01 Jonathan Liu <net147@gmail.com> |
| |
| Remove unused sys/mman.h include |
| https://bugs.webkit.org/show_bug.cgi?id=97995 |
| |
| Reviewed by Kentaro Hara. |
| |
| The sys/mman.h is not used and removing it improves portability as not |
| all systems have sys/mman.h. |
| |
| * jit/ExecutableAllocatorFixedVMPool.cpp: |
| |
| 2012-09-28 Filip Pizlo <fpizlo@apple.com> |
| |
| ASSERTION in m_graph[tailNodeIndex].op() == Flush || m_graph[tailNodeIndex].op() == SetLocal on plus.google.com |
| https://bugs.webkit.org/show_bug.cgi?id=97656 |
| |
| Reviewed by Mark Hahnenberg. |
| |
| There were two bugs here: |
| |
| 1) In case of multiple GetLocals to the same captured variable, the bytecode parser would linke the first, |
| rather than the last, of the GetLocals into the vars-at-tail table. |
| |
| 2) The constant folding phase was asserting that any GetLocal it eliminates must be linked into the |
| vars-at-tail table, when for captured variables only the last of those should be. |
| |
| * dfg/DFGByteCodeParser.cpp: |
| (JSC::DFG::ByteCodeParser::getLocal): |
| * dfg/DFGConstantFoldingPhase.cpp: |
| (JSC::DFG::ConstantFoldingPhase::foldConstants): |
| |
| 2012-09-28 Filip Pizlo <fpizlo@apple.com> |
| |
| DFGStructureHoistingPhase SetLocal assumes StructureTransitionWatchpoint has a structure set |
| https://bugs.webkit.org/show_bug.cgi?id=97810 |
| |
| Reviewed by Mark Hahnenberg. |
| |
| No tests because this can't happen in ToT: the structure check hoisting phase runs before any |
| CFA or folding, so the only StructureTransitionWatchpoints it will see are the ones inserted |
| by the parser. But the parser will only insert StructureTransitinWatchpoints on constants, which |
| will not be subject to SetLocals. |
| |
| Still, it would be good to fix this in case things changed. |
| |
| * dfg/DFGStructureCheckHoistingPhase.cpp: |
| (JSC::DFG::StructureCheckHoistingPhase::run): |
| |
| 2012-09-27 Mark Lam <mark.lam@apple.com> |
| |
| Put initializeHostCallReturnValue() behind #if ENABLE(JIT). |
| Fixes non JIT builds. |
| https://bugs.webkit.org/show_bug.cgi?id=97838. |
| |
| Reviewed by John Sullivan. |
| |
| * runtime/JSGlobalData.cpp: |
| (JSC::JSGlobalData::JSGlobalData): |
| |
| 2012-09-27 Mark Lam <mark.lam@apple.com> |
| |
| Fixed CallFrameClosure::resetCallFrame() to use the valid |
| range of argument index values. |
| https://bugs.webkit.org/show_bug.cgi?id=97836. |
| |
| Reviewed by Gavin Barraclough. |
| |
| * interpreter/CallFrame.h: |
| (ExecState): |
| * interpreter/CallFrameClosure.h: |
| (JSC::CallFrameClosure::resetCallFrame): |
| |
| 2012-09-27 Patrick Gansterer <paroga@webkit.org> |
| |
| Fix usage of COMPILER() macros |
| https://bugs.webkit.org/show_bug.cgi?id=97642 |
| |
| Reviewed by Geoffrey Garen. |
| |
| Add COMPILER(GCC) around compiler specific code and remove it from generic code. |
| This allows us to implement the DFG code for other compilers to in a next step. |
| |
| * dfg/DFGOperations.cpp: |
| * jit/HostCallReturnValue.h: |
| |
| 2012-09-27 Andreas Kling <kling@webkit.org> |
| |
| 3.20MB below FunctionParameters::create() on Membuster3. |
| <http://webkit.org/b/97730> |
| |
| Reviewed by Anders Carlsson. |
| |
| Figure out the exact space needed for parameter identifiers and use reserveInitialCapacity(). |
| Reduces memory consumption on Membuster3 by ~1.60 MB. |
| |
| * parser/Nodes.cpp: |
| (JSC::FunctionParameters::FunctionParameters): |
| |
| 2012-09-27 Csaba Osztrogonác <ossy@webkit.org>, Tor Arne Vestbø <vestbo@webkit.org> |
| |
| [Qt] Enable the LLInt on Linux |
| https://bugs.webkit.org/show_bug.cgi?id=95749 |
| |
| Reviewed by Simon Hausmann. |
| |
| * DerivedSources.pri: |
| * JavaScriptCore.pro: |
| * LLIntOffsetsExtractor.pro: Added. |
| * Target.pri: |
| |
| 2012-09-27 Patrick Gansterer <paroga@webkit.org> |
| |
| [CMake] Fix build with static JavaScriptCore library |
| |
| * shell/CMakeLists.txt: Define STATICALLY_LINKED_WITH_JavaScriptCore if |
| JavaScriptCore_LIBRARY_TYPE is set to STATIC. |
| |
| 2012-09-26 Gavin Barraclough <barraclough@apple.com> |
| |
| Proxy the global this in JSC |
| https://bugs.webkit.org/show_bug.cgi?id=97734 |
| |
| Reviewed by Filip Pizlo. |
| |
| Eeep – fix a bug - was leaving the global this proxy's structure's globalObject as 0, |
| and setting the proxy's prototype as the global object, rather than its prototype. |
| |
| * jsc.cpp: |
| (GlobalObject::create): |
| * runtime/JSProxy.h: |
| (JSC::JSProxy::createStructure): |
| |
| 2012-09-26 Gavin Barraclough <barraclough@apple.com> |
| |
| Speculative Windows build fix. |
| |
| * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.def: |
| |
| 2012-09-26 Filip Pizlo <fpizlo@apple.com> |
| |
| Unreviewed, 32-bit build fix. |
| |
| * llint/LowLevelInterpreter32_64.asm: |
| |
| 2012-09-26 Filip Pizlo <fpizlo@apple.com> |
| |
| jneq_ptr shouldn't have a pointer |
| https://bugs.webkit.org/show_bug.cgi?id=97739 |
| |
| Reviewed by Oliver Hunt. |
| |
| Slamming pointers directly into bytecode is sometimes cool, but in this case it's |
| unwieldy and confusing. Switched the instruction to use an enum instead. This has |
| zero effect on code gen behavior in the JITs. In the LLInt, there is now more |
| indirection, but that doesn't affect benchmarks. |
| |
| * CMakeLists.txt: |
| * GNUmakefile.list.am: |
| * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: |
| * JavaScriptCore.xcodeproj/project.pbxproj: |
| * Target.pri: |
| * bytecode/Instruction.h: |
| (JSC::Instruction::Instruction): |
| (Instruction): |
| * bytecode/SpecialPointer.cpp: Added. |
| (JSC): |
| (JSC::actualPointerFor): |
| * bytecode/SpecialPointer.h: Added. |
| (JSC): |
| (JSC::pointerIsFunction): |
| (JSC::pointerIsCell): |
| * bytecompiler/BytecodeGenerator.cpp: |
| (JSC::BytecodeGenerator::emitJumpIfNotFunctionCall): |
| (JSC::BytecodeGenerator::emitJumpIfNotFunctionApply): |
| * dfg/DFGByteCodeParser.cpp: |
| (JSC::DFG::ByteCodeParser::parseBlock): |
| * jit/JITOpcodes.cpp: |
| (JSC::JIT::emit_op_jneq_ptr): |
| * jit/JITOpcodes32_64.cpp: |
| (JSC::JIT::emit_op_jneq_ptr): |
| * llint/LowLevelInterpreter32_64.asm: |
| * llint/LowLevelInterpreter64.asm: |
| * runtime/JSGlobalObject.cpp: |
| (JSC::JSGlobalObject::reset): |
| (JSC): |
| * runtime/JSGlobalObject.h: |
| (JSGlobalObject): |
| (JSC::JSGlobalObject::actualPointerFor): |
| |
| 2012-09-26 Gavin Barraclough <barraclough@apple.com> |
| |
| REGRESSION (r129456): http/tests/security/xss-eval.html is failing on JSC platforms |
| https://bugs.webkit.org/show_bug.cgi?id=97529 |
| |
| Reviewed by Filip Pizlo. |
| |
| A recent patch changed JSC's EvalError behaviour; bring this more into line with other browsers. |
| |
| JSC currently throws an EvalError if you try to call eval with a this object that doesn't |
| match the given eval function. This does not match other browsers, which generally just |
| ignore the this value that was passed, and eval the string in the eval function's environment. |
| |
| * runtime/JSGlobalObjectFunctions.cpp: |
| (JSC::globalFuncEval): |
| - Remove EvalError, ignore passed this value. |
| |
| 2012-09-26 Gavin Barraclough <barraclough@apple.com> |
| |
| Proxy the global this in JSC |
| https://bugs.webkit.org/show_bug.cgi?id=97734 |
| |
| Reviewed by Oliver Hunt. |
| |
| Having jsc diverge from WebCore here is not beneficial; it potentially masks bugs and/or performance |
| problems from command line testing. |
| |
| * jsc.cpp: |
| (GlobalObject::create): |
| - Create a this value proxy for the global object. |
| * runtime/JSGlobalObject.h: |
| (JSGlobalObject): |
| - Make setGlobalThis protected. |
| * runtime/JSProxy.h: |
| (JSC::JSProxy::create): |
| (JSC::JSProxy::target): |
| (JSC::JSProxy::finishCreation): |
| (JSProxy): |
| - Allow proxy target to be a JSObject, add target to create method. |
| |
| 2012-09-26 Gavin Barraclough <barraclough@apple.com> |
| |
| Speculative Windows build fix. |
| |
| * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.def: |
| |
| 2012-09-26 Filip Pizlo <fpizlo@apple.com> |
| |
| JSObject::ensureArrayStorage() ignores the possibility that extensions have been prevented |
| https://bugs.webkit.org/show_bug.cgi?id=97719 |
| |
| Reviewed by Gavin Barraclough. |
| |
| * runtime/JSObject.cpp: |
| (JSC::JSObject::ensureArrayStorageSlow): |
| (JSC): |
| * runtime/JSObject.h: |
| (JSC::JSObject::ensureArrayStorage): |
| (JSObject): |
| |
| 2012-09-26 Gavin Barraclough <barraclough@apple.com> |
| |
| Generalize JSGlobalThis as JSProxy |
| https://bugs.webkit.org/show_bug.cgi?id=97716 |
| |
| Reviewed by Oliver Hunt. |
| |
| Generalize JSGlobalThis as JSProxy and move proxying functionality up from the window shell into JSProxy. |
| |
| * CMakeLists.txt: |
| * GNUmakefile.list.am: |
| * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.def: |
| * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: |
| * JavaScriptCore.xcodeproj/project.pbxproj: |
| * Target.pri: |
| * runtime/JSGlobalObject.cpp: |
| (JSC::JSGlobalObject::toThisObject): |
| - Hoist toThisObject from WebCore. |
| (JSC): |
| * runtime/JSGlobalObject.h: |
| - removed include. |
| (JSC::JSGlobalObject::finishCreation): |
| - JSGlobalThis -> JSObject |
| (JSGlobalObject): |
| - Hoist toThisObject from WebCore. |
| * runtime/JSGlobalThis.cpp: Removed. |
| * runtime/JSGlobalThis.h: Removed. |
| * runtime/JSObject.cpp: |
| - removed include. |
| * runtime/JSObject.h: |
| (JSObject): |
| (JSC::JSObject::isProxy): |
| - isGlobalThis -> isProxy |
| - GlobalThisType -> ProxyType |
| * runtime/JSProxy.cpp: Copied from Source/JavaScriptCore/runtime/JSGlobalThis.cpp. |
| (JSC): |
| (JSC::JSProxy::visitChildren): |
| (JSC::JSProxy::setTarget): |
| (JSC::JSProxy::className): |
| (JSC::JSProxy::getOwnPropertySlot): |
| (JSC::JSProxy::getOwnPropertySlotByIndex): |
| (JSC::JSProxy::getOwnPropertyDescriptor): |
| (JSC::JSProxy::put): |
| (JSC::JSProxy::putByIndex): |
| (JSC::JSProxy::putDirectVirtual): |
| (JSC::JSProxy::defineOwnProperty): |
| (JSC::JSProxy::deleteProperty): |
| (JSC::JSProxy::deletePropertyByIndex): |
| (JSC::JSProxy::getPropertyNames): |
| (JSC::JSProxy::getOwnPropertyNames): |
| - Class cretaed from JSGlobalThis, JSDOMWindowShell. |
| * runtime/JSProxy.h: Copied from Source/JavaScriptCore/runtime/JSGlobalThis.h. |
| (JSC::JSProxy::create): |
| (JSC::JSProxy::createStructure): |
| (JSProxy): |
| (JSC::JSProxy::target): |
| (JSC::JSProxy::JSProxy): |
| - Class cretaed from JSGlobalThis, JSDOMWindowShell. |
| * runtime/JSType.h: |
| - GlobalThisType -> ProxyType |
| |
| 2012-09-26 Michael Saboff <msaboff@apple.com> |
| |
| Add ability for JSArray::unshiftCount to unshift in middle of an array |
| https://bugs.webkit.org/show_bug.cgi?id=97691 |
| |
| Reviewed by Filip Pizlo. |
| |
| Changed JSArray::unshiftCount and unshiftCountSlowCase to handle unshifting from the middle of an |
| array. Depending on where the unshift point is, either the front part of the array will be moved |
| "left" or the back part will be moved right. Given that unshiftCount only works on contiguous |
| arrays it is safe to use memmove for the moves. |
| |
| This change is worth 25% performance improvement on pdfjs. It doesn't seem to have any impact on |
| any other benchmarks. |
| |
| * runtime/ArrayPrototype.cpp: |
| (JSC::unshift): |
| * runtime/JSArray.cpp: |
| (JSC::JSArray::unshiftCountSlowCase): |
| (JSC::JSArray::unshiftCount): |
| * runtime/JSArray.h: |
| (JSArray): |
| |
| 2012-09-26 Sheriff Bot <webkit.review.bot@gmail.com> |
| |
| Unreviewed, rolling out r129592. |
| http://trac.webkit.org/changeset/129592 |
| https://bugs.webkit.org/show_bug.cgi?id=97670 |
| |
| Failures in Chromium security tests (Requested by schenney on |
| #webkit). |
| |
| * runtime/JSGlobalObjectFunctions.cpp: |
| (JSC::globalFuncEval): |
| |
| 2012-09-25 Gavin Barraclough <barraclough@apple.com> |
| |
| REGRESSION (r129456): http/tests/security/xss-eval.html is failing on JSC platforms |
| https://bugs.webkit.org/show_bug.cgi?id=97529 |
| |
| Reviewed by Filip Pizlo. |
| |
| A recent patch changed JSC's EvalError behaviour; bring this more into line with other browsers. |
| |
| JSC currently throws an EvalError if you try to call eval with a this object that doesn't |
| match the given eval function. This does not match other browsers, which generally just |
| ignore the this value that was passed, and eval the string in the eval function's environment. |
| |
| * runtime/JSGlobalObjectFunctions.cpp: |
| (JSC::globalFuncEval): |
| - Remove EvalError, ignore passed this value. |
| |
| 2012-09-25 Filip Pizlo <fpizlo@apple.com> |
| |
| DFG ArrayPush, ArrayPop don't handle clobbering or having a bad time correctly |
| https://bugs.webkit.org/show_bug.cgi?id=97535 |
| |
| Reviewed by Oliver Hunt. |
| |
| * dfg/DFGAbstractState.cpp: |
| (JSC::DFG::AbstractState::execute): |
| * dfg/DFGByteCodeParser.cpp: |
| (JSC::DFG::ByteCodeParser::handleIntrinsic): |
| * dfg/DFGStructureCheckHoistingPhase.cpp: |
| (JSC::DFG::StructureCheckHoistingPhase::run): |
| |
| 2012-09-25 Geoffrey Garen <ggaren@apple.com> |
| |
| JSC should dump object size inference statistics |
| https://bugs.webkit.org/show_bug.cgi?id=97618 |
| |
| Reviewed by Filip Pizlo. |
| |
| Added an option to dump object size inference statistics. |
| |
| To see statistics on live objects: |
| |
| jsc --showHeapStatistics=1 |
| |
| To see cumulative statistics on all objects ever allocated: |
| |
| jsc --showHeapStatistics=1 --objectsAreImmortal=1 |
| |
| (This is useful for showing GC churn caused by over-allocation.) |
| |
| To support this second mode, I refactored Zombies to separate out their |
| immortality feature so I could reuse it. |
| |
| * heap/Heap.cpp: |
| (JSC::MarkObject): Helper for making things immortal. We have to checked |
| for being zapped because blocks start out in this state. |
| |
| (JSC::StorageStatistics): Gather statistics by walking the heap. Ignore |
| arrays and hash tables for now because they're not our focus. (We'll |
| remove these exceptions in future.) |
| |
| (JSC::Heap::collect): Moved zombify to the end so it wouldn't interfere |
| with statistics gathering. |
| |
| (JSC::Heap::showStatistics): |
| (JSC::Heap::markAllObjects): Factored out helper, so statistics could |
| take advantage of immortal objects. |
| |
| (Zombify): Don't mark immortal objects -- that's another class's job now. |
| |
| (JSC::Zombify::operator()): |
| (JSC::Heap::zombifyDeadObjects): Take advantage of forEachDeadCell instead |
| of rolling our own. |
| |
| * heap/Heap.h: |
| (Heap): |
| * heap/MarkedSpace.h: |
| (MarkedSpace): |
| (JSC::MarkedSpace::forEachDeadCell): Added, so clients don't have to do |
| the iteration logic themselves. |
| |
| * runtime/Options.cpp: |
| (JSC::Options::initialize): |
| * runtime/Options.h: New options, listed above. Make sure to initialize |
| based on environment variable first, so we can override with specific settings. |
| |
| 2012-09-25 Filip Pizlo <fpizlo@apple.com> |
| |
| We shouldn't use the optimized versions of shift/unshift if the user is doing crazy things to the array |
| https://bugs.webkit.org/show_bug.cgi?id=97603 |
| <rdar://problem/12370864> |
| |
| Reviewed by Gavin Barraclough. |
| |
| You changed the length behind our backs? No optimizations for you then! |
| |
| * runtime/ArrayPrototype.cpp: |
| (JSC::shift): |
| (JSC::unshift): |
| * runtime/JSArray.cpp: |
| (JSC::JSArray::shiftCount): |
| |
| 2012-09-25 Filip Pizlo <fpizlo@apple.com> |
| |
| JSC bindings appear to sometimes ignore the possibility of arrays being in sparse mode |
| https://bugs.webkit.org/show_bug.cgi?id=95610 |
| |
| Reviewed by Oliver Hunt. |
| |
| Add better support for quickly accessing the indexed storage from bindings. |
| |
| * runtime/JSObject.h: |
| (JSC::JSObject::tryGetIndexQuickly): |
| (JSObject): |
| (JSC::JSObject::getDirectIndex): |
| (JSC::JSObject::getIndex): |
| |
| 2012-09-25 Filip Pizlo <fpizlo@apple.com> |
| |
| Structure check hoisting phase doesn't know about the side-effecting nature of Arrayify |
| https://bugs.webkit.org/show_bug.cgi?id=97537 |
| |
| Reviewed by Mark Hahnenberg. |
| |
| No tests because if we use Arrayify then we also use PutByVal(BlankToXYZ), and the latter is |
| already known to be side-effecting. So this bug shouldn't have had any symptoms, as far as I |
| can tell. |
| |
| * dfg/DFGStructureCheckHoistingPhase.cpp: |
| (JSC::DFG::StructureCheckHoistingPhase::run): |
| |
| 2012-09-25 Gavin Barraclough <barraclough@apple.com> |
| |
| Regression: put beyond vector length prefers prototype setters to sparse properties |
| https://bugs.webkit.org/show_bug.cgi?id=97593 |
| |
| Reviewed by Geoff Garen & Filip Pizlo. |
| |
| * runtime/JSObject.cpp: |
| (JSC::JSObject::putByIndexBeyondVectorLength): |
| - Check for self properties in the sparse map - if present, don't examine the protochain. |
| |
| 2012-09-24 Gavin Barraclough <barraclough@apple.com> |
| |
| https://bugs.webkit.org/show_bug.cgi?id=97530 |
| Regression, freeze applied to numeric properties of non-array objects |
| |
| Reviewed by Filip Pizlo. |
| |
| Object.freeze has a fast implementation in JSObject, but this hasn't been updated to take into account numeric properties in butterflies. |
| For now, just fall back to the generic implementation if the object has numeric properties. |
| |
| * runtime/ObjectConstructor.cpp: |
| (JSC::objectConstructorFreeze): |
| - fallback if the object has a non-zero indexed property vector length. |
| |
| 2012-09-24 Gavin Barraclough <barraclough@apple.com> |
| |
| Bug in numeric accessors on global environment |
| https://bugs.webkit.org/show_bug.cgi?id=97526 |
| |
| Reviewed by Geoff Garen. |
| |
| I've hit this assert in test262 in browser, but haven't yet worked out how to repro in a test case :-/ |
| The sparsemap is failing to map back from the global object to the window shell. |
| A test case would need to resolve a numeric property name against the global environment. |
| |
| (JSC::SparseArrayEntry::get): |
| (JSC::SparseArrayEntry::put): |
| - Add missing toThisObject calls. |
| |
| 2012-09-24 Filip Pizlo <fpizlo@apple.com> |
| |
| SerializedScriptValue isn't aware of indexed storage, but should be |
| https://bugs.webkit.org/show_bug.cgi?id=97515 |
| <rdar://problem/12361874> |
| |
| Reviewed by Sam Weinig. |
| |
| Export a method that WebCore now uses. |
| |
| * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.def: |
| * runtime/JSObject.h: |
| (JSObject): |
| |
| 2012-09-24 Gavin Barraclough <barraclough@apple.com> |
| |
| Remove JSObject::unwrappedGlobalObject(), JSObject::unwrappedObject() |
| https://bugs.webkit.org/show_bug.cgi?id=97519 |
| |
| Reviewed by Geoff Garen. |
| |
| unwrappedGlobalObject() was only needed because globalObject() doesn't always return a helpful result - |
| specifically for WebCore's window shell the structure's globalObject is set to null. We can fix this by |
| simply keeping the structure up to date as the window navigates, obviating the need for this function. |
| |
| The only other use of unwrappedObject() came from globalFuncEval(), and this can be trivially removed |
| by flipping the way we perform this globalObject check (which we may also be able to remove!) - instead |
| of getting the globalObject from the provided this value & comparing to the expected globalObject, we |
| can get the this value from the expected globalObject, and compare to that provided. |
| |
| * runtime/JSGlobalObject.cpp: |
| - Call globalObject() instead of unwrappedGlobalObject(). |
| * runtime/JSGlobalObjectFunctions.cpp: |
| (JSC::globalFuncEval): |
| - Changed to compare this object values, instead of globalObjects - |
| this means we only need to be able to map globalObject -> this, |
| and not vice versa. |
| * runtime/JSObject.cpp: |
| (JSC::JSObject::allowsAccessFrom): |
| (JSC::JSObject::createInheritorID): |
| - Call globalObject() instead of unwrappedGlobalObject(). |
| * runtime/JSObject.h: |
| (JSObject): |
| - Removed unwrappedGlobalObject(), unwrappedObject(). |
| |
| 2012-09-24 Mark Lam <mark.lam@apple.com> |
| |
| Deleting the classic interpreter and cleaning up some build options. |
| https://bugs.webkit.org/show_bug.cgi?id=96969. |
| |
| Reviewed by Geoffrey Garen. |
| |
| * bytecode/CodeBlock.cpp: |
| (JSC::CodeBlock::dump): |
| (JSC::CodeBlock::finalizeUnconditionally): |
| (JSC::CodeBlock::stronglyVisitStrongReferences): |
| (JSC): |
| * bytecode/Instruction.h: |
| (JSC::Instruction::Instruction): |
| * interpreter/AbstractPC.cpp: |
| (JSC::AbstractPC::AbstractPC): |
| * interpreter/AbstractPC.h: |
| (AbstractPC): |
| * interpreter/CallFrame.h: |
| (ExecState): |
| * interpreter/Interpreter.cpp: |
| (JSC): |
| (JSC::Interpreter::Interpreter): |
| (JSC::Interpreter::~Interpreter): |
| (JSC::Interpreter::initialize): |
| (JSC::Interpreter::isOpcode): |
| (JSC::Interpreter::unwindCallFrame): |
| (JSC::getLineNumberForCallFrame): |
| (JSC::getCallerInfo): |
| (JSC::getSourceURLFromCallFrame): |
| (JSC::Interpreter::execute): |
| (JSC::Interpreter::executeCall): |
| (JSC::Interpreter::executeConstruct): |
| (JSC::Interpreter::retrieveArgumentsFromVMCode): |
| (JSC::Interpreter::retrieveCallerFromVMCode): |
| (JSC::Interpreter::retrieveLastCaller): |
| * interpreter/Interpreter.h: |
| (JSC::Interpreter::getOpcodeID): |
| (Interpreter): |
| * jit/ExecutableAllocatorFixedVMPool.cpp: |
| (JSC::FixedVMPoolExecutableAllocator::FixedVMPoolExecutableAllocator): |
| * offlineasm/asm.rb: |
| * offlineasm/offsets.rb: |
| * runtime/Executable.cpp: |
| (JSC::EvalExecutable::compileInternal): |
| (JSC::ProgramExecutable::compileInternal): |
| (JSC::FunctionExecutable::compileForCallInternal): |
| (JSC::FunctionExecutable::compileForConstructInternal): |
| * runtime/Executable.h: |
| (JSC::NativeExecutable::create): |
| (NativeExecutable): |
| (JSC::NativeExecutable::finishCreation): |
| * runtime/JSGlobalData.cpp: |
| (JSC): |
| (JSC::JSGlobalData::JSGlobalData): |
| (JSC::JSGlobalData::getHostFunction): |
| * runtime/JSGlobalData.h: |
| (JSGlobalData): |
| (JSC::JSGlobalData::canUseJIT): |
| (JSC::JSGlobalData::canUseRegExpJIT): |
| * runtime/Options.cpp: |
| (JSC::Options::initialize): |
| |
| 2012-09-24 Filip Pizlo <fpizlo@apple.com> |
| |
| Nested try/finally should not confuse the finally unpopper in BytecodeGenerator::emitComplexJumpScopes |
| https://bugs.webkit.org/show_bug.cgi?id=97508 |
| <rdar://problem/12361132> |
| |
| Reviewed by Sam Weinig. |
| |
| We're reusing some vector for multiple iterations of a loop, but we were forgetting to clear its |
| contents from one iteration to the next. Hence if you did multiple iterations of finally unpopping |
| (like in a nested try/finally and a jump out of both of them) then you'd get a corrupted try |
| context stack afterwards. |
| |
| * bytecompiler/BytecodeGenerator.cpp: |
| (JSC::BytecodeGenerator::emitComplexJumpScopes): |
| |
| 2012-09-24 Filip Pizlo <fpizlo@apple.com> |
| |
| ValueToInt32 bool case does bad things to registers |
| https://bugs.webkit.org/show_bug.cgi?id=97505 |
| <rdar://problem/12356331> |
| |
| Reviewed by Mark Hahnenberg. |
| |
| * dfg/DFGSpeculativeJIT.cpp: |
| (JSC::DFG::SpeculativeJIT::compileValueToInt32): |
| |
| 2012-09-24 Mark Lam <mark.lam@apple.com> |
| |
| Add cloopDo instruction for debugging the llint C++ backend. |
| https://bugs.webkit.org/show_bug.cgi?id=97502. |
| |
| Reviewed by Geoffrey Garen. |
| |
| * offlineasm/cloop.rb: |
| * offlineasm/instructions.rb: |
| * offlineasm/parser.rb: |
| |
| 2012-09-24 Filip Pizlo <fpizlo@apple.com> |
| |
| JSArray::putByIndex asserts with readonly property on prototype |
| https://bugs.webkit.org/show_bug.cgi?id=97435 |
| <rdar://problem/12357084> |
| |
| Reviewed by Geoffrey Garen. |
| |
| Boy, there were some problems: |
| |
| - putDirectIndex() should know that it can set the index quickly even if it's a hole and we're |
| in SlowPut mode, since that's the whole point of PutDirect. |
| |
| - We should have a fast path for putByIndex(). |
| |
| - The LiteralParser should not use push(), since that may throw if we're having a bad time. |
| |
| * interpreter/Interpreter.cpp: |
| (JSC::eval): |
| * runtime/JSObject.h: |
| (JSC::JSObject::putByIndexInline): |
| (JSObject): |
| (JSC::JSObject::putDirectIndex): |
| * runtime/LiteralParser.cpp: |
| (JSC::::parse): |
| |
| 2012-09-24 Mark Lam <mark.lam@apple.com> |
| |
| Added a missing "if VALUE_PROFILER" around an access to ArrayProfile record. |
| https://bugs.webkit.org/show_bug.cgi?id=97496. |
| |
| Reviewed by Filip Pizlo. |
| |
| * llint/LowLevelInterpreter32_64.asm: |
| * llint/LowLevelInterpreter64.asm: |
| |
| 2012-09-24 Geoffrey Garen <ggaren@apple.com> |
| |
| Inlined activation tear-off in the DFG |
| https://bugs.webkit.org/show_bug.cgi?id=97487 |
| |
| Reviewed by Filip Pizlo. |
| |
| * dfg/DFGOperations.cpp: |
| * dfg/DFGOperations.h: Activation tear-off is always inlined now, so I |
| removed its out-of-line implementation. |
| |
| * dfg/DFGSpeculativeJIT32_64.cpp: |
| (JSC::DFG::SpeculativeJIT::compile): |
| * dfg/DFGSpeculativeJIT64.cpp: |
| (JSC::DFG::SpeculativeJIT::compile): Inlined the variable copy and update |
| of JSVariableObject::m_registers. This usually turns into < 10 instructions, |
| which is close to pure win as compared to the operation function call. |
| |
| * runtime/JSActivation.h: |
| (JSActivation): |
| (JSC::JSActivation::registersOffset): |
| (JSC::JSActivation::tearOff): |
| (JSC::JSActivation::isTornOff): |
| (JSC): |
| (JSC::JSActivation::storageOffset): |
| (JSC::JSActivation::storage): Tiny bit of refactoring so the JIT can |
| share the pointer math helper functions we use internally. |
| |
| 2012-09-24 Balazs Kilvady <kilvadyb@homejinni.com> |
| |
| MIPS: store8 functions added to MacroAssembler. |
| |
| MIPS store8 functions |
| https://bugs.webkit.org/show_bug.cgi?id=97243 |
| |
| Reviewed by Oliver Hunt. |
| |
| Add MIPS store8 functions. |
| |
| * assembler/MIPSAssembler.h: |
| (JSC::MIPSAssembler::lhu): New function. |
| (MIPSAssembler): |
| (JSC::MIPSAssembler::sb): New function. |
| (JSC::MIPSAssembler::sh): New function. |
| * assembler/MacroAssemblerMIPS.h: |
| (JSC::MacroAssemblerMIPS::store8): New function. |
| (MacroAssemblerMIPS): |
| (JSC::MacroAssemblerMIPS::store16): New function. |
| |
| 2012-09-23 Geoffrey Garen <ggaren@apple.com> |
| |
| PutScopedVar should not be marked as clobbering the world |
| https://bugs.webkit.org/show_bug.cgi?id=97416 |
| |
| Reviewed by Filip Pizlo. |
| |
| No performance change. |
| |
| PutScopedVar doesn't have arbitrary side-effects, so it shouldn't be marked |
| as such. |
| |
| * dfg/DFGNodeType.h: |
| (DFG): |
| |
| 2012-09-23 Geoffrey Garen <ggaren@apple.com> |
| |
| I accidentally the whole 32-bit :(. |
| |
| Unbreak the DFG in 32-bit with the 32-bit path I forgot in my last patch. |
| |
| * dfg/DFGSpeculativeJIT32_64.cpp: |
| (JSC::DFG::SpeculativeJIT::compile): |
| |
| 2012-09-23 Byungwoo Lee <bw80.lee@gmail.com> |
| |
| Fix build warnings : -Wunused-parameter, -Wparentheses, -Wuninitialized. |
| https://bugs.webkit.org/show_bug.cgi?id=97306 |
| |
| Reviewed by Benjamin Poulain. |
| |
| Fix build warning about -Wunused-parameter on MachineStackMarker.cpp, |
| LLIntSlowPaths.cpp, DatePrototype.cpp, Options.cpp by using |
| UNUSED_PARAM() macro or remove parameter name. |
| |
| * heap/MachineStackMarker.cpp: |
| (JSC::pthreadSignalHandlerSuspendResume): |
| * llint/LLIntSlowPaths.cpp: |
| (JSC::LLInt::entryOSR): |
| * runtime/DatePrototype.cpp: |
| (JSC::formatLocaleDate): |
| * runtime/Options.cpp: |
| (JSC::computeNumberOfGCMarkers): |
| |
| 2012-09-23 Gavin Barraclough <barraclough@apple.com> |
| |
| Sorting a non-array creates propreties (spec-violation) |
| https://bugs.webkit.org/show_bug.cgi?id=25477 |
| |
| Reviewed by Oliver Hunt. |
| |
| We're just calling get() to get properties, which is converting missing properties to |
| undefined. Hole values should be retained, and moved to the end of the array. |
| |
| * runtime/ArrayPrototype.cpp: |
| (JSC::getOrHole): |
| - Helper function, returns JSValue() instead of undefined for missing properties. |
| (JSC::arrayProtoFuncSort): |
| - Implemented per 15.4.4.11, see comments above. |
| |
| 2012-09-23 Geoffrey Garen <ggaren@apple.com> |
| |
| CSE for access to closure variables (get_/put_scoped_var) |
| https://bugs.webkit.org/show_bug.cgi?id=97414 |
| |
| Reviewed by Oliver Hunt. |
| |
| I separated loading a scope from loading its storage pointer, so we can |
| CSE the storage pointer load. Then, I copied the global var CSE and adjusted |
| it for closure vars. |
| |
| * dfg/DFGAbstractState.cpp: |
| (JSC::DFG::AbstractState::execute): Renamed GetScopeChain => GetScope to |
| reflect renames from a few weeks ago. |
| |
| Added a case for the storage pointer load, similar to object storage pointer load. |
| |
| * dfg/DFGByteCodeParser.cpp: |
| (JSC::DFG::ByteCodeParser::parseBlock): Added an independent node for |
| the storage pointer. |
| |
| * dfg/DFGCSEPhase.cpp: |
| (JSC::DFG::CSEPhase::scopedVarLoadElimination): |
| (CSEPhase): |
| (JSC::DFG::CSEPhase::scopedVarStoreElimination): |
| (JSC::DFG::CSEPhase::getScopeLoadElimination): |
| (JSC::DFG::CSEPhase::getScopeRegistersLoadElimination): |
| (JSC::DFG::CSEPhase::setLocalStoreElimination): |
| (JSC::DFG::CSEPhase::performNodeCSE): Copied globalVarLoad/StoreElimination |
| and adapted the same logic to closure vars. |
| |
| * dfg/DFGNode.h: |
| (JSC::DFG::Node::hasScopeChainDepth): |
| (JSC::DFG::Node::scope): |
| (Node): |
| * dfg/DFGNodeType.h: |
| (DFG): GetScopedVar and GetGlobalVar are no longer MustGenerate. I'm not |
| sure why they ever were. But these are simple load operations so, if they're |
| unused, they're truly dead. |
| |
| * dfg/DFGPredictionPropagationPhase.cpp: |
| (JSC::DFG::PredictionPropagationPhase::propagate): |
| * dfg/DFGSpeculativeJIT32_64.cpp: |
| (JSC::DFG::SpeculativeJIT::compile): |
| * dfg/DFGSpeculativeJIT64.cpp: |
| (JSC::DFG::SpeculativeJIT::compile): Updated for renames and split-out |
| node for getting the storage pointer. |
| |
| 2012-09-21 Geoffrey Garen <ggaren@apple.com> |
| |
| Unreviewed, rolled out a line I committed by accident. |
| |
| * interpreter/Interpreter.cpp: |
| (JSC::Interpreter::execute): |
| |
| 2012-09-21 Geoffrey Garen <ggaren@apple.com> |
| |
| Optimized closures that capture arguments |
| https://bugs.webkit.org/show_bug.cgi?id=97358 |
| |
| Reviewed by Oliver Hunt. |
| |
| Previously, the activation object was responsible for capturing all |
| arguments in a way that was convenient for the arguments object. Now, |
| we move all captured variables into a contiguous region in the stack, |
| allocate an activation for exactly that size, and make the arguments |
| object responsible for knowing all the places to which arguments could |
| have moved. |
| |
| This seems like the right tradeoff because |
| |
| (a) Closures are common and long-lived, so we want them to be small. |
| |
| (b) Our primary strategy for optimizing the arguments object is to make |
| it go away. If you're allocating arguments objects, you're already having |
| a bad time. |
| |
| (c) It's common to use either the arguments object or named argument |
| closure, but not both. |
| |
| * bytecode/CodeBlock.cpp: |
| (JSC::CodeBlock::dump): |
| (JSC::CodeBlock::CodeBlock): |
| * bytecode/CodeBlock.h: |
| (JSC::CodeBlock::argumentsRegister): |
| (JSC::CodeBlock::activationRegister): |
| (JSC::CodeBlock::isCaptured): |
| (JSC::CodeBlock::argumentIndexAfterCapture): m_numCapturedVars is gone |
| now -- we have an explicit range instead. |
| |
| * bytecompiler/BytecodeGenerator.cpp: |
| (JSC::BytecodeGenerator::BytecodeGenerator): Move captured arguments |
| into the captured region of local variables for space efficiency. Record |
| precise data about where they moved for the sake of the arguments object. |
| |
| Some of this data was previously wrong, but it didn't cause any problems |
| because the arguments weren't actually moving. |
| |
| * dfg/DFGByteCodeParser.cpp: |
| (JSC::DFG::ByteCodeParser::flushArgumentsAndCapturedVariables): Don't |
| assume that captured vars are in any particular location -- always ask |
| the CodeBlock. This is better encapsulation. |
| |
| (JSC::DFG::ByteCodeParser::parseCodeBlock): |
| * dfg/DFGSpeculativeJIT32_64.cpp: |
| (JSC::DFG::SpeculativeJIT::compile): |
| * dfg/DFGSpeculativeJIT64.cpp: |
| (JSC::DFG::SpeculativeJIT::compile): I rename things sometimes. |
| |
| * runtime/Arguments.cpp: |
| (JSC::Arguments::tearOff): Account for a particularly nasty edge case. |
| |
| (JSC::Arguments::didTearOffActivation): Don't allocate our slow arguments |
| data on tear-off. We need to allocate it eagerly instead, since we need |
| to know about displaced, captured arguments during access before tear-off. |
| |
| * runtime/Arguments.h: |
| (JSC::Arguments::allocateSlowArguments): |
| (JSC::Arguments::argument): Tell our slow arguments array where all arguments |
| are, even if they are not captured. This simplifies some things, so we don't |
| have to account explicitly for the full matrix of (not torn off, torn off) |
| * (captured, not captured). |
| |
| (JSC::Arguments::finishCreation): Allocate our slow arguments array eagerly |
| because we need to know about displaced, captured arguments during access |
| before tear-off. |
| |
| * runtime/Executable.cpp: |
| (JSC::FunctionExecutable::FunctionExecutable): |
| (JSC::FunctionExecutable::compileForCallInternal): |
| (JSC::FunctionExecutable::compileForConstructInternal): |
| * runtime/Executable.h: |
| (JSC::FunctionExecutable::parameterCount): |
| (FunctionExecutable): |
| * runtime/JSActivation.cpp: |
| (JSC::JSActivation::visitChildren): |
| * runtime/JSActivation.h: |
| (JSActivation): |
| (JSC::JSActivation::create): |
| (JSC::JSActivation::JSActivation): |
| (JSC::JSActivation::registerOffset): |
| (JSC::JSActivation::tearOff): |
| (JSC::JSActivation::allocationSize): |
| (JSC::JSActivation::isValid): This is really the point of the patch. All |
| the pointer math in Activations basically boils away, since we always |
| copy a contiguous region of captured variables now. |
| |
| * runtime/SymbolTable.h: |
| (JSC::SlowArgument::SlowArgument): |
| (SlowArgument): |
| (SharedSymbolTable): |
| (JSC::SharedSymbolTable::captureCount): |
| (JSC::SharedSymbolTable::SharedSymbolTable): AllOfTheThings capture mode |
| is gone now -- that's the point of the patch. indexIfCaptured gets renamed |
| to index because we always have an index, even if not captured. (The only |
| time when the index is meaningless is when we're Deleted.) |
| |
| 2012-09-21 Gavin Barraclough <barraclough@apple.com> |
| |
| Eeeep - broke early boyer in bug#97382 |
| https://bugs.webkit.org/show_bug.cgi?id=97383 |
| |
| Rubber stamped by Sam Weinig. |
| |
| missed a child3 -> child2! |
| |
| * dfg/DFGSpeculativeJIT.cpp: |
| (JSC::DFG::SpeculativeJIT::compileInstanceOf): |
| |
| 2012-09-21 Gavin Barraclough <barraclough@apple.com> |
| |
| Unreviewed windows build fix. |
| |
| * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.def: |
| |
| 2012-09-21 Gavin Barraclough <barraclough@apple.com> |
| |
| Pedantic test in Mozilla's JavaScript test suite fails. function-001.js function-001-n.js |
| https://bugs.webkit.org/show_bug.cgi?id=27219 |
| |
| Reviewed by Sam Weinig. |
| |
| These tests are just wrong. |
| See ECMA 262 A.5, FunctionDelcaration does not require a semicolon. |
| |
| * tests/mozilla/expected.html: |
| * tests/mozilla/js1_2/function/function-001-n.js: |
| * tests/mozilla/js1_3/Script/function-001-n.js: |
| * tests/mozilla/js1_3/regress/function-001-n.js: |
| |
| 2012-09-21 Gavin Barraclough <barraclough@apple.com> |
| |
| Remove redundant argument to op_instanceof |
| https://bugs.webkit.org/show_bug.cgi?id=97382 |
| |
| Reviewed by Geoff Garen. |
| |
| No longer needed after my last change. |
| |
| * bytecode/CodeBlock.cpp: |
| (JSC::CodeBlock::dump): |
| * bytecode/Opcode.h: |
| (JSC): |
| (JSC::padOpcodeName): |
| * bytecompiler/BytecodeGenerator.cpp: |
| (JSC::BytecodeGenerator::emitInstanceOf): |
| * bytecompiler/BytecodeGenerator.h: |
| (BytecodeGenerator): |
| * bytecompiler/NodesCodegen.cpp: |
| (JSC::InstanceOfNode::emitBytecode): |
| * dfg/DFGAbstractState.cpp: |
| (JSC::DFG::AbstractState::execute): |
| * dfg/DFGByteCodeParser.cpp: |
| (JSC::DFG::ByteCodeParser::parseBlock): |
| * dfg/DFGSpeculativeJIT.cpp: |
| (JSC::DFG::SpeculativeJIT::compileInstanceOf): |
| * interpreter/Interpreter.cpp: |
| (JSC::Interpreter::privateExecute): |
| * jit/JITOpcodes.cpp: |
| (JSC::JIT::emit_op_instanceof): |
| (JSC::JIT::emitSlow_op_instanceof): |
| * jit/JITOpcodes32_64.cpp: |
| (JSC::JIT::emit_op_instanceof): |
| (JSC::JIT::emitSlow_op_instanceof): |
| * jit/JITStubs.cpp: |
| (JSC::DEFINE_STUB_FUNCTION): |
| * llint/LLIntSlowPaths.cpp: |
| (JSC::LLInt::LLINT_SLOW_PATH_DECL): |
| * llint/LowLevelInterpreter32_64.asm: |
| * llint/LowLevelInterpreter64.asm: |
| |
| 2012-09-21 Gavin Barraclough <barraclough@apple.com> |
| |
| Unreviewed windows build fix. |
| |
| * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.def: |
| |
| 2012-09-21 Gavin Barraclough <barraclough@apple.com> |
| |
| instanceof should not get the prototype for non-default HasInstance |
| https://bugs.webkit.org/show_bug.cgi?id=68656 |
| |
| Reviewed by Oliver Hunt. |
| |
| Instanceof is currently implemented as a sequance of three opcodes: |
| check_has_instance |
| get_by_id(prototype) |
| op_instanceof |
| There are three interesting types of base value that instanceof can be applied to: |
| (A) Objects supporting default instanceof behaviour (functions, other than those created with bind) |
| (B) Objects overriding the default instancecof behaviour with a custom one (API objects, bound functions) |
| (C) Values that do not respond to the [[HasInstance]] trap. |
| Currently check_has_instance handles case (C), leaving the op_instanceof opcode to handle (A) & (B). There are |
| two problems with this apporach. Firstly, this is suboptimal for case (A), since we have to check for |
| hasInstance support twice (once in check_has_instance, then for default behaviour in op_instanceof). Secondly, |
| this means that in cases (B) we also perform the get_by_id, which is both suboptimal and an observable spec |
| violation. |
| |
| The fix here is to move handing of non-default instanceof (cases (B)) to the check_has_instance op, leaving |
| op_instanceof to handle only cases (A). |
| |
| * API/JSCallbackObject.h: |
| (JSCallbackObject): |
| * API/JSCallbackObjectFunctions.h: |
| (JSC::::customHasInstance): |
| * API/JSValueRef.cpp: |
| (JSValueIsInstanceOfConstructor): |
| - renamed hasInstance to customHasInstance |
| * bytecode/CodeBlock.cpp: |
| (JSC::CodeBlock::dump): |
| - added additional parameters to check_has_instance opcode |
| * bytecode/Opcode.h: |
| (JSC): |
| (JSC::padOpcodeName): |
| - added additional parameters to check_has_instance opcode |
| * bytecompiler/BytecodeGenerator.cpp: |
| (JSC::BytecodeGenerator::emitCheckHasInstance): |
| - added additional parameters to check_has_instance opcode |
| * bytecompiler/BytecodeGenerator.h: |
| (BytecodeGenerator): |
| - added additional parameters to check_has_instance opcode |
| * bytecompiler/NodesCodegen.cpp: |
| (JSC::InstanceOfNode::emitBytecode): |
| - added additional parameters to check_has_instance opcode |
| * dfg/DFGByteCodeParser.cpp: |
| (JSC::DFG::ByteCodeParser::parseBlock): |
| - added additional parameters to check_has_instance opcode |
| * interpreter/Interpreter.cpp: |
| (JSC::isInvalidParamForIn): |
| (JSC::Interpreter::privateExecute): |
| - Add handling for non-default instanceof to op_check_has_instance |
| * jit/JITInlineMethods.h: |
| (JSC::JIT::emitArrayProfilingSiteForBytecodeIndex): |
| - Fixed no-LLInt no_DFG build |
| * jit/JITOpcodes.cpp: |
| (JSC::JIT::emit_op_check_has_instance): |
| (JSC::JIT::emitSlow_op_check_has_instance): |
| - check for ImplementsDefaultHasInstance, handle additional arguments to op_check_has_instance. |
| (JSC::JIT::emit_op_instanceof): |
| (JSC::JIT::emitSlow_op_instanceof): |
| - no need to check for ImplementsDefaultHasInstance. |
| * jit/JITOpcodes32_64.cpp: |
| (JSC::JIT::emit_op_check_has_instance): |
| (JSC::JIT::emitSlow_op_check_has_instance): |
| - check for ImplementsDefaultHasInstance, handle additional arguments to op_check_has_instance. |
| (JSC::JIT::emit_op_instanceof): |
| (JSC::JIT::emitSlow_op_instanceof): |
| - no need to check for ImplementsDefaultHasInstance. |
| * jit/JITStubs.cpp: |
| (JSC::DEFINE_STUB_FUNCTION): |
| * jit/JITStubs.h: |
| - Add handling for non-default instanceof to op_check_has_instance |
| * llint/LLIntSlowPaths.cpp: |
| (JSC::LLInt::LLINT_SLOW_PATH_DECL): |
| * llint/LowLevelInterpreter32_64.asm: |
| * llint/LowLevelInterpreter64.asm: |
| - move check for ImplementsDefaultHasInstance, handle additional arguments to op_check_has_instance. |
| * runtime/ClassInfo.h: |
| (MethodTable): |
| (JSC): |
| - renamed hasInstance to customHasInstance |
| * runtime/CommonSlowPaths.h: |
| (CommonSlowPaths): |
| - removed opInstanceOfSlow (this was whittled down to one function call!) |
| * runtime/JSBoundFunction.cpp: |
| (JSC::JSBoundFunction::customHasInstance): |
| * runtime/JSBoundFunction.h: |
| (JSBoundFunction): |
| - renamed hasInstance to customHasInstance, reimplemented. |
| * runtime/JSCell.cpp: |
| (JSC::JSCell::customHasInstance): |
| * runtime/JSCell.h: |
| (JSCell): |
| * runtime/JSObject.cpp: |
| (JSC::JSObject::hasInstance): |
| (JSC): |
| (JSC::JSObject::defaultHasInstance): |
| * runtime/JSObject.h: |
| (JSObject): |
| |
| 2012-09-21 Filip Pizlo <fpizlo@apple.com> |
| |
| Unreviewed, fix ARM build. |
| |
| * assembler/MacroAssemblerARMv7.h: |
| (JSC::MacroAssemblerARMv7::store8): |
| (MacroAssemblerARMv7): |
| * offlineasm/armv7.rb: |
| |
| 2012-09-21 Filip Pizlo <fpizlo@apple.com> |
| |
| REGRESSION (r128400): Opening Google Web Fonts page hangs or crashes |
| https://bugs.webkit.org/show_bug.cgi?id=97328 |
| |
| Reviewed by Mark Hahnenberg. |
| |
| It's a bad idea to emit stub code that reallocates property storage when we're in indexed |
| storage mode. DFGRepatch.cpp knew this and had the appropriate check in one of the places, |
| but it didn't have it in all of the places. |
| |
| This change also adds some more handy disassembly support, which I used to find the bug. |
| |
| * assembler/LinkBuffer.h: |
| (JSC): |
| * dfg/DFGRepatch.cpp: |
| (JSC::DFG::generateProtoChainAccessStub): |
| (JSC::DFG::tryCacheGetByID): |
| (JSC::DFG::tryBuildGetByIDList): |
| (JSC::DFG::emitPutReplaceStub): |
| (JSC::DFG::emitPutTransitionStub): |
| (JSC::DFG::tryCachePutByID): |
| * jit/JITStubRoutine.h: |
| (JSC): |
| |
| 2012-09-21 Filip Pizlo <fpizlo@apple.com> |
| |
| DFG CSE assumes that a holy PutByVal does not interfere with GetArrayLength, when it clearly does |
| https://bugs.webkit.org/show_bug.cgi?id=97373 |
| |
| Reviewed by Mark Hahnenberg. |
| |
| * dfg/DFGCSEPhase.cpp: |
| (JSC::DFG::CSEPhase::pureCSE): |
| (JSC::DFG::CSEPhase::getArrayLengthElimination): |
| (JSC::DFG::CSEPhase::putStructureStoreElimination): |
| (JSC::DFG::CSEPhase::performNodeCSE): |
| * dfg/DFGGraph.h: |
| (Graph): |
| |
| 2012-09-21 Chris Rogers <crogers@google.com> |
| |
| Add Web Audio support for deprecated/legacy APIs |
| https://bugs.webkit.org/show_bug.cgi?id=97050 |
| |
| Reviewed by Eric Carlson. |
| |
| * Configurations/FeatureDefines.xcconfig: |
| |
| 2012-09-21 Gavin Barraclough <barraclough@apple.com> |
| |
| Global Math object should be configurable but isn't |
| https://bugs.webkit.org/show_bug.cgi?id=55343 |
| |
| Reviewed by Oliver Hunt. |
| |
| This has no performance impact. |
| |
| * runtime/JSGlobalObject.cpp: |
| (JSC::JSGlobalObject::reset): |
| - Make 'Math' a regular property. |
| |
| 2012-09-21 Chao-ying Fu <fu@mips.com> |
| |
| Add MIPS or32 function |
| https://bugs.webkit.org/show_bug.cgi?id=97157 |
| |
| Reviewed by Gavin Barraclough. |
| |
| Add a missing or32 function. |
| |
| * assembler/MacroAssemblerMIPS.h: |
| (JSC::MacroAssemblerMIPS::or32): New function. |
| (MacroAssemblerMIPS): |
| |
| 2012-09-20 Filip Pizlo <fpizlo@apple.com> |
| |
| CHECK_ARRAY_CONSISTENCY isn't being used or tested, so we should remove it |
| https://bugs.webkit.org/show_bug.cgi?id=97260 |
| |
| Rubber stamped by Geoffrey Garen. |
| |
| Supporting it will become difficult as we add more indexing types. It makes more |
| sense to kill, especially since we don't appear to use it or test it, ever. |
| |
| * runtime/ArrayConventions.h: |
| (JSC): |
| * runtime/ArrayPrototype.cpp: |
| (JSC::arrayProtoFuncSplice): |
| * runtime/ArrayStorage.h: |
| (JSC::ArrayStorage::copyHeaderFromDuringGC): |
| (ArrayStorage): |
| * runtime/FunctionPrototype.cpp: |
| (JSC::functionProtoFuncBind): |
| * runtime/JSArray.cpp: |
| (JSC::createArrayButterflyInDictionaryIndexingMode): |
| (JSC::JSArray::setLength): |
| (JSC::JSArray::pop): |
| (JSC::JSArray::push): |
| (JSC::JSArray::sortNumeric): |
| (JSC::JSArray::sort): |
| (JSC::JSArray::compactForSorting): |
| * runtime/JSArray.h: |
| (JSArray): |
| (JSC::createArrayButterfly): |
| (JSC::JSArray::tryCreateUninitialized): |
| (JSC::constructArray): |
| * runtime/JSObject.cpp: |
| (JSC::JSObject::putByIndex): |
| (JSC::JSObject::createArrayStorage): |
| (JSC::JSObject::deletePropertyByIndex): |
| (JSC): |
| * runtime/JSObject.h: |
| (JSC::JSObject::initializeIndex): |
| (JSObject): |
| |
| 2012-09-20 Mark Lam <mark.lam@apple.com> |
| |
| Fixed a missing semicolon in the C++ llint backend. |
| https://bugs.webkit.org/show_bug.cgi?id=97252. |
| |
| Reviewed by Geoff Garen. |
| |
| * offlineasm/cloop.rb: |
| |
| 2012-09-20 Geoffrey Garen <ggaren@apple.com> |
| |
| Refactored the interpreter and JIT so they don't dictate closure layout |
| https://bugs.webkit.org/show_bug.cgi?id=97221 |
| |
| Reviewed by Oliver Hunt. |
| |
| Capture may change the location of an argument for space efficiency. This |
| patch removes static assumptions about argument location from the interpreter |
| and JIT. |
| |
| * bytecode/CodeBlock.h: |
| (JSC::CodeBlock::argumentIndexAfterCapture): |
| (JSC::ExecState::argumentAfterCapture): Factored out a helper function |
| so the compiler could share this logic. |
| |
| * bytecompiler/NodesCodegen.cpp: |
| (JSC::BracketAccessorNode::emitBytecode): Don't emit optimized bracket |
| access on arguments if a parameter has been captured by name. This case is |
| rare and, where I've seen it in the wild, the optimization mostly failed |
| anyway due to arguments escape, so I didn't feel like writing and testing |
| five copies of the code that would handle it in the baseline engines. |
| |
| The DFG can still synthesize this optimization even if we don't emit the |
| optimized bytecode for it. |
| |
| * dfg/DFGArgumentsSimplificationPhase.cpp: |
| (JSC::DFG::ArgumentsSimplificationPhase::run): |
| * dfg/DFGAssemblyHelpers.h: |
| (JSC::DFG::AssemblyHelpers::symbolTableFor): |
| (AssemblyHelpers): Use the right helper function to account for the fact |
| that a parameter may have been captured by name and moved. |
| |
| * dfg/DFGByteCodeParser.cpp: |
| (JSC::DFG::ByteCodeParser::parseBlock): ASSERT that we haven't inlined |
| a .apply on captured arguments. Once we do start inlining such things, |
| we'll need to do a little bit of math here to get them right. |
| |
| * dfg/DFGSpeculativeJIT32_64.cpp: |
| (JSC::DFG::SpeculativeJIT::compile): |
| * dfg/DFGSpeculativeJIT64.cpp: |
| (JSC::DFG::SpeculativeJIT::compile): Added support for bracket access on |
| an arguments object where arguments have also been captured by name. We |
| load the true index of the argument from a side vector. Arguments elision |
| is very powerful in the DFG, so I wanted to keep it working, even in this |
| rare case. |
| |
| * interpreter/Interpreter.cpp: |
| (JSC::loadVarargs): Use the right helper function to account for the fact |
| that a parameter may have been captured by name and moved. |
| |
| * jit/JITCall.cpp: |
| (JSC::JIT::compileLoadVarargs): |
| * jit/JITCall32_64.cpp: |
| (JSC::JIT::compileLoadVarargs): Don't use the inline copy loop if some |
| of our arguments have moved, since it would copy stale values. (We still |
| optimize the actual call, and elide the arguments object.) |
| |
| 2012-09-20 Gabor Rapcsanyi <rgabor@webkit.org> |
| |
| [Qt] r129045 broke the ARM build |
| https://bugs.webkit.org/show_bug.cgi?id=97195 |
| |
| Reviewed by Zoltan Herczeg. |
| |
| Implementing missing store8 function. |
| |
| * assembler/MacroAssemblerARM.h: |
| (JSC::MacroAssemblerARM::store8): |
| (MacroAssemblerARM): |
| |
| 2012-09-19 Geoffrey Garen <ggaren@apple.com> |
| |
| OSR exit sometimes neglects to create the arguments object |
| https://bugs.webkit.org/show_bug.cgi?id=97162 |
| |
| Reviewed by Filip Pizlo. |
| |
| No performance change. |
| |
| I don't know of any case where this is a real problem in TOT, but it |
| will become a problem if we start compiling eval, with, or catch, and/or |
| sometimes stop doing arguments optimizations in the bytecode. |
| |
| * dfg/DFGArgumentsSimplificationPhase.cpp: |
| (JSC::DFG::ArgumentsSimplificationPhase::run): Account for a |
| CreateArguments that has transformed into PhantomArguments. We used to |
| clear our reference to the CreateArguments node, but now we hold onto it, |
| so we need to account for it transforming. |
| |
| Don't replace a SetLocal(CreateArguments) with a SetLocal(JSValue()) |
| because that doesn't leave enough information behind for OSR exit to do |
| the right thing. Instead, maintain our reference to CreateArguments, and |
| rely on CreateArguments transforming into PhantomArguments after |
| optimization. SetLocal(PhantomArguments) is efficient, and it's a marker |
| for OSR exit to create the arguments object. |
| |
| Don't ASSERT that all PhantomArguments are unreferenced because we now |
| leave them in the graph as SetLocal(PhantomArguments), and that's harmless. |
| |
| * dfg/DFGArgumentsSimplificationPhase.h: |
| (NullableHashTraits): |
| (JSC::DFG::NullableHashTraits::emptyValue): Export our special hash table |
| for inline call frames so the OSR exit compiler can use it. |
| |
| * dfg/DFGOSRExitCompiler32_64.cpp: |
| (JSC::DFG::OSRExitCompiler::compileExit): |
| * dfg/DFGOSRExitCompiler64.cpp: |
| (JSC::DFG::OSRExitCompiler::compileExit): Don't load the 'arguments' |
| register to decide if we need to create the arguments object. Optimization |
| may have eliminated the initializing store to this register, in which |
| case we'll load garbage. Instead, use the global knowledge that all call |
| frames that optimized out 'arguments' now need to create it, and use a hash |
| table to make sure we do so only once per call frame. |
| |
| * dfg/DFGSpeculativeJIT64.cpp: |
| (JSC::DFG::SpeculativeJIT::compile): SetLocal(PhantomArguments) is unique |
| because we haven't just changed a value's format or elided a load or store; |
| instead, we've replaced an object with JSValue(). We could try to account |
| for this in a general way, but for now it's a special-case optimization, |
| so we give it a specific OSR hint instead. |
| |
| 2012-09-19 Filip Pizlo <fpizlo@apple.com> |
| |
| REGRESSION(r128802): It made some JS tests crash |
| https://bugs.webkit.org/show_bug.cgi?id=97001 |
| |
| Reviewed by Mark Hahnenberg. |
| |
| * runtime/JSGlobalObject.cpp: |
| (JSC::JSGlobalObject::visitChildren): |
| |
| 2012-09-19 Filip Pizlo <fpizlo@apple.com> |
| |
| DFG should not assume that a ByVal access is generic just because it was unprofiled |
| https://bugs.webkit.org/show_bug.cgi?id=97088 |
| |
| Reviewed by Geoffrey Garen. |
| |
| We were not disambiguating between "Undecided" in the sense that the array profile |
| has no useful information versus "Undecided" in the sense that the array profile |
| knows that the access has not executed. That's an important distinction, since |
| the former form of "Undecided" means that we should consult value profiling, while |
| the latter means that we should force exit unless the value profiling indicates |
| that the access must be generic (base is not cell or property is not int). |
| |
| * dfg/DFGAbstractState.cpp: |
| (JSC::DFG::AbstractState::execute): |
| * dfg/DFGArrayMode.cpp: |
| (JSC::DFG::fromObserved): |
| (JSC::DFG::refineArrayMode): |
| (JSC::DFG::modeAlreadyChecked): |
| (JSC::DFG::modeToString): |
| * dfg/DFGArrayMode.h: |
| (JSC::DFG::canCSEStorage): |
| (JSC::DFG::modeIsSpecific): |
| (JSC::DFG::modeSupportsLength): |
| (JSC::DFG::benefitsFromStructureCheck): |
| |
| 2012-09-19 Filip Pizlo <fpizlo@apple.com> |
| |
| DFG should not emit PutByVal hole case unless it has to |
| https://bugs.webkit.org/show_bug.cgi?id=97080 |
| |
| Reviewed by Geoffrey Garen. |
| |
| This causes us to generate less code for typical PutByVal's. But if profiling tells us |
| that the hole case is being hit, we generate the same code as we would have generated |
| before. This seems like a slight speed-up across the board. |
| |
| * assembler/MacroAssemblerARMv7.h: |
| (JSC::MacroAssemblerARMv7::store8): |
| (MacroAssemblerARMv7): |
| * assembler/MacroAssemblerX86.h: |
| (MacroAssemblerX86): |
| (JSC::MacroAssemblerX86::store8): |
| * assembler/MacroAssemblerX86_64.h: |
| (MacroAssemblerX86_64): |
| (JSC::MacroAssemblerX86_64::store8): |
| * assembler/X86Assembler.h: |
| (X86Assembler): |
| (JSC::X86Assembler::movb_i8m): |
| * bytecode/ArrayProfile.h: |
| (JSC::ArrayProfile::ArrayProfile): |
| (JSC::ArrayProfile::addressOfMayStoreToHole): |
| (JSC::ArrayProfile::mayStoreToHole): |
| (ArrayProfile): |
| * dfg/DFGArrayMode.cpp: |
| (JSC::DFG::fromObserved): |
| (JSC::DFG::modeAlreadyChecked): |
| (JSC::DFG::modeToString): |
| * dfg/DFGArrayMode.h: |
| (DFG): |
| (JSC::DFG::mayStoreToHole): |
| * dfg/DFGSpeculativeJIT32_64.cpp: |
| (JSC::DFG::SpeculativeJIT::compile): |
| * dfg/DFGSpeculativeJIT64.cpp: |
| (JSC::DFG::SpeculativeJIT::compile): |
| * jit/JIT.h: |
| (JIT): |
| * jit/JITInlineMethods.h: |
| (JSC::JIT::emitArrayProfileStoreToHoleSpecialCase): |
| (JSC): |
| * jit/JITPropertyAccess.cpp: |
| (JSC::JIT::emit_op_put_by_val): |
| * jit/JITPropertyAccess32_64.cpp: |
| (JSC::JIT::emit_op_put_by_val): |
| * llint/LowLevelInterpreter32_64.asm: |
| * llint/LowLevelInterpreter64.asm: |
| |
| 2012-09-18 Filip Pizlo <fpizlo@apple.com> |
| |
| DFG should not call out to C++ every time that it tries to put to an object that doesn't yet have array storage |
| https://bugs.webkit.org/show_bug.cgi?id=96983 |
| |
| Reviewed by Oliver Hunt. |
| |
| Introduce more polymorphism into the DFG's array mode support. Use that to |
| introduce the notion of effectul array modes, where the check for the mode |
| will perform actions necessary to ensure that we have the mode we want, if |
| the object is not already in that mode. Also added profiling support for |
| checking if an object is of a type that would not allow us to create array |
| storage (like a typed array or a string for example). |
| |
| This is a ~2x speed-up on loops that transform an object that did not have |
| indexed storage into one that does. |
| |
| * JSCTypedArrayStubs.h: |
| (JSC): |
| * bytecode/ArrayProfile.cpp: |
| (JSC::ArrayProfile::computeUpdatedPrediction): |
| * bytecode/ArrayProfile.h: |
| (JSC::ArrayProfile::ArrayProfile): |
| (JSC::ArrayProfile::mayInterceptIndexedAccesses): |
| (ArrayProfile): |
| * dfg/DFGAbstractState.cpp: |
| (JSC::DFG::AbstractState::execute): |
| * dfg/DFGArrayMode.cpp: |
| (JSC::DFG::fromObserved): |
| (DFG): |
| (JSC::DFG::modeAlreadyChecked): |
| (JSC::DFG::modeToString): |
| * dfg/DFGArrayMode.h: |
| (DFG): |
| (JSC::DFG::modeUsesButterfly): |
| (JSC::DFG::isSlowPutAccess): |
| (JSC::DFG::benefitsFromStructureCheck): |
| (JSC::DFG::isEffectful): |
| * dfg/DFGByteCodeParser.cpp: |
| (JSC::DFG::ByteCodeParser::getArrayMode): |
| (JSC::DFG::ByteCodeParser::getArrayModeAndEmitChecks): |
| (JSC::DFG::ByteCodeParser::parseBlock): |
| * dfg/DFGCSEPhase.cpp: |
| (JSC::DFG::CSEPhase::getPropertyStorageLoadElimination): |
| * dfg/DFGFixupPhase.cpp: |
| (JSC::DFG::FixupPhase::fixupNode): |
| (JSC::DFG::FixupPhase::checkArray): |
| * dfg/DFGGraph.h: |
| (JSC::DFG::Graph::byValIsPure): |
| * dfg/DFGNode.h: |
| (JSC::DFG::Node::hasArrayMode): |
| * dfg/DFGNodeType.h: |
| (DFG): |
| * dfg/DFGOperations.cpp: |
| * dfg/DFGOperations.h: |
| * dfg/DFGPredictionPropagationPhase.cpp: |
| (JSC::DFG::PredictionPropagationPhase::propagate): |
| * dfg/DFGSpeculativeJIT.cpp: |
| (JSC::DFG::SpeculativeJIT::checkArray): |
| (JSC::DFG::SpeculativeJIT::arrayify): |
| (DFG): |
| * dfg/DFGSpeculativeJIT.h: |
| (SpeculativeJIT): |
| * dfg/DFGSpeculativeJIT32_64.cpp: |
| (JSC::DFG::SpeculativeJIT::compile): |
| * dfg/DFGSpeculativeJIT64.cpp: |
| (JSC::DFG::SpeculativeJIT::compile): |
| * runtime/Arguments.h: |
| (Arguments): |
| * runtime/JSNotAnObject.h: |
| (JSNotAnObject): |
| * runtime/JSObject.h: |
| (JSObject): |
| (JSC::JSObject::ensureArrayStorage): |
| * runtime/JSString.h: |
| (JSC::JSString::createStructure): |
| |
| 2012-09-18 Filip Pizlo <fpizlo@apple.com> |
| |
| Include PhantomArguments in DFGDisassembly |
| https://bugs.webkit.org/show_bug.cgi?id=97043 |
| |
| Reviewed by Geoffrey Garen. |
| |
| * dfg/DFGNode.h: |
| (JSC::DFG::Node::willHaveCodeGenOrOSR): |
| |
| 2012-09-18 Filip Pizlo <fpizlo@apple.com> |
| |
| REGRESSION(r128802): It made some JS tests crash |
| https://bugs.webkit.org/show_bug.cgi?id=97001 |
| |
| Reviewed by Mark Hahnenberg. |
| |
| IndexingHeaderInlineMethods was incorrectly assuming that if the HasArrayStorage bit is clear, then that means that indexing payload capacity is zero. |
| |
| * runtime/IndexingHeaderInlineMethods.h: |
| (JSC::IndexingHeader::preCapacity): |
| (JSC::IndexingHeader::indexingPayloadSizeInBytes): |
| |
| 2012-09-18 Mark Hahnenberg <mhahnenberg@apple.com> |
| |
| Use WTF::HasTrivialDestructor instead of compiler-specific versions in JSC::NeedsDestructor |
| https://bugs.webkit.org/show_bug.cgi?id=96980 |
| |
| Reviewed by Benjamin Poulain. |
| |
| * runtime/JSCell.h: |
| (JSC): |
| (NeedsDestructor): |
| |
| 2012-09-18 Filip Pizlo <fpizlo@apple.com> |
| |
| DFGOperations doesn't use NativeCallFrameTracer in enough places |
| https://bugs.webkit.org/show_bug.cgi?id=96987 |
| |
| Reviewed by Mark Hahnenberg. |
| |
| Anything that can GC should use it. |
| |
| * dfg/DFGOperations.cpp: |
| |
| 2012-09-18 Mark Lam <mark.lam@apple.com> |
| |
| Not reviewed. Attempt at greening the WinCairo bot. Touching |
| LowLevelInterpreter.asm to trigger a rebuild of LLIntDesiredOffsets. |
| https://bugs.webkit.org/show_bug.cgi?id=96992. |
| |
| * llint/LowLevelInterpreter.asm: |
| |
| 2012-09-18 Peter Gal <galpeter@inf.u-szeged.hu> |
| |
| [Qt] REGRESSION(r128790): It broke the ARM build |
| https://bugs.webkit.org/show_bug.cgi?id=96968 |
| |
| Reviewed by Filip Pizlo. |
| |
| Implement the missing or32 method in the MacroAssemblerARM.h. |
| |
| * assembler/MacroAssemblerARM.h: |
| (JSC::MacroAssemblerARM::or32): |
| (MacroAssemblerARM): |
| |
| 2012-09-18 Mark Lam <mark.lam@apple.com> |
| |
| Fix for WinCairo builds. |
| https://bugs.webkit.org/show_bug.cgi?id=96992. |
| |
| Reviewed by Filip Pizlo. |
| |
| Adding additional vcproj build targets in LLIntDesiredOffsets.vcproj, |
| LLIntOffsetsExtractor.vcproj, and LLIntAssembly.vcproj to match those |
| in jsc.vcproj. |
| |
| * JavaScriptCore.vcproj/LLIntAssembly/LLIntAssembly.vcproj: |
| * JavaScriptCore.vcproj/LLIntDesiredOffsets/LLIntDesiredOffsets.vcproj: |
| * JavaScriptCore.vcproj/LLIntOffsetsExtractor/LLIntOffsetsExtractor.vcproj: |
| * JavaScriptCore.vcproj/LLIntOffsetsExtractor/LLIntOffsetsExtractorCommon.vsprops: Added property svn:eol-style. |
| * JavaScriptCore.vcproj/LLIntOffsetsExtractor/LLIntOffsetsExtractorDebug.vsprops: Added property svn:eol-style. |
| * JavaScriptCore.vcproj/LLIntOffsetsExtractor/LLIntOffsetsExtractorDebugAll.vsprops: Added. |
| * JavaScriptCore.vcproj/LLIntOffsetsExtractor/LLIntOffsetsExtractorDebugCairoCFLite.vsprops: Added. |
| * JavaScriptCore.vcproj/LLIntOffsetsExtractor/LLIntOffsetsExtractorProduction.vsprops: Added. |
| * JavaScriptCore.vcproj/LLIntOffsetsExtractor/LLIntOffsetsExtractorRelease.vsprops: Added property svn:eol-style. |
| * JavaScriptCore.vcproj/LLIntOffsetsExtractor/LLIntOffsetsExtractorReleaseCairoCFLite.vsprops: Added. |
| * JavaScriptCore.vcproj/LLIntOffsetsExtractor/LLIntOffsetsExtractorReleasePGO.vsprops: Added. |
| |
| 2012-09-18 Filip Pizlo <fpizlo@apple.com> |
| |
| Unreviewed, fix sloppy English in comment. |
| |
| * runtime/JSGlobalObject.cpp: |
| (JSC): |
| |
| 2012-09-17 Csaba Osztrogonác <ossy@webkit.org> |
| |
| Unreviewed, rolling out r128826 and r128813. |
| |
| * API/JSCallbackConstructor.cpp: |
| (JSC): |
| (JSC::JSCallbackConstructor::JSCallbackConstructor): |
| * API/JSCallbackConstructor.h: |
| (JSCallbackConstructor): |
| * API/JSCallbackObject.cpp: |
| (JSC): |
| (JSC::::createStructure): |
| * API/JSCallbackObject.h: |
| (JSC::JSCallbackObject::create): |
| (JSCallbackObject): |
| * API/JSClassRef.cpp: |
| (OpaqueJSClass::prototype): |
| * API/JSObjectRef.cpp: |
| (JSObjectMake): |
| (JSObjectGetPrivate): |
| (JSObjectSetPrivate): |
| (JSObjectGetPrivateProperty): |
| (JSObjectSetPrivateProperty): |
| (JSObjectDeletePrivateProperty): |
| * API/JSValueRef.cpp: |
| (JSValueIsObjectOfClass): |
| * API/JSWeakObjectMapRefPrivate.cpp: |
| * GNUmakefile.list.am: |
| * JSCTypedArrayStubs.h: |
| (JSC): |
| * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: |
| * JavaScriptCore.xcodeproj/project.pbxproj: |
| * dfg/DFGSpeculativeJIT.h: |
| (JSC::DFG::SpeculativeJIT::emitAllocateBasicJSObject): |
| (JSC::DFG::SpeculativeJIT::emitAllocateJSFinalObject): |
| * heap/Heap.cpp: |
| (JSC::Heap::isSafeToSweepStructures): |
| (JSC): |
| * heap/Heap.h: |
| (JSC::Heap::allocatorForObjectWithDestructor): |
| (Heap): |
| (JSC::Heap::allocateWithDestructor): |
| (JSC::Heap::allocateStructure): |
| (JSC): |
| * heap/IncrementalSweeper.cpp: |
| (JSC::IncrementalSweeper::IncrementalSweeper): |
| (JSC::IncrementalSweeper::sweepNextBlock): |
| (JSC::IncrementalSweeper::startSweeping): |
| (JSC::IncrementalSweeper::willFinishSweeping): |
| (JSC::IncrementalSweeper::structuresCanBeSwept): |
| (JSC): |
| * heap/IncrementalSweeper.h: |
| (IncrementalSweeper): |
| * heap/MarkedAllocator.cpp: |
| (JSC::MarkedAllocator::tryAllocateHelper): |
| (JSC::MarkedAllocator::allocateBlock): |
| * heap/MarkedAllocator.h: |
| (JSC::MarkedAllocator::cellsNeedDestruction): |
| (JSC::MarkedAllocator::onlyContainsStructures): |
| (MarkedAllocator): |
| (JSC::MarkedAllocator::MarkedAllocator): |
| (JSC::MarkedAllocator::init): |
| * heap/MarkedBlock.cpp: |
| (JSC::MarkedBlock::create): |
| (JSC::MarkedBlock::MarkedBlock): |
| (JSC): |
| (JSC::MarkedBlock::specializedSweep): |
| (JSC::MarkedBlock::sweep): |
| (JSC::MarkedBlock::sweepHelper): |
| * heap/MarkedBlock.h: |
| (JSC): |
| (MarkedBlock): |
| (JSC::MarkedBlock::cellsNeedDestruction): |
| (JSC::MarkedBlock::onlyContainsStructures): |
| * heap/MarkedSpace.cpp: |
| (JSC::MarkedSpace::MarkedSpace): |
| (JSC::MarkedSpace::resetAllocators): |
| (JSC::MarkedSpace::canonicalizeCellLivenessData): |
| (JSC::MarkedSpace::isPagedOut): |
| (JSC::MarkedSpace::freeBlock): |
| * heap/MarkedSpace.h: |
| (MarkedSpace): |
| (Subspace): |
| (JSC::MarkedSpace::allocatorFor): |
| (JSC::MarkedSpace::destructorAllocatorFor): |
| (JSC::MarkedSpace::allocateWithDestructor): |
| (JSC::MarkedSpace::allocateStructure): |
| (JSC::MarkedSpace::forEachBlock): |
| * heap/SlotVisitor.cpp: |
| * jit/JIT.h: |
| * jit/JITInlineMethods.h: |
| (JSC::JIT::emitAllocateBasicJSObject): |
| (JSC::JIT::emitAllocateJSFinalObject): |
| (JSC::JIT::emitAllocateJSArray): |
| * jsc.cpp: |
| (GlobalObject::create): |
| * runtime/Arguments.cpp: |
| (JSC): |
| * runtime/Arguments.h: |
| (Arguments): |
| (JSC::Arguments::Arguments): |
| * runtime/ErrorPrototype.cpp: |
| (JSC): |
| * runtime/Executable.h: |
| * runtime/InternalFunction.cpp: |
| (JSC): |
| (JSC::InternalFunction::InternalFunction): |
| * runtime/InternalFunction.h: |
| (InternalFunction): |
| * runtime/JSCell.h: |
| (JSC): |
| (JSC::allocateCell): |
| * runtime/JSDestructibleObject.h: Removed. |
| * runtime/JSGlobalObject.cpp: |
| (JSC::JSGlobalObject::reset): |
| (JSC): |
| * runtime/JSGlobalObject.h: |
| (JSGlobalObject): |
| (JSC::JSGlobalObject::createRareDataIfNeeded): |
| (JSC::JSGlobalObject::create): |
| * runtime/JSGlobalThis.h: |
| (JSGlobalThis): |
| (JSC::JSGlobalThis::JSGlobalThis): |
| * runtime/JSPropertyNameIterator.h: |
| * runtime/JSScope.cpp: |
| (JSC): |
| * runtime/JSString.h: |
| (JSC): |
| * runtime/JSWrapperObject.h: |
| (JSWrapperObject): |
| (JSC::JSWrapperObject::JSWrapperObject): |
| * runtime/MathObject.cpp: |
| (JSC): |
| * runtime/NameInstance.h: |
| (NameInstance): |
| * runtime/RegExp.h: |
| * runtime/RegExpObject.cpp: |
| (JSC): |
| * runtime/SparseArrayValueMap.h: |
| * runtime/Structure.h: |
| (JSC::Structure): |
| (JSC::JSCell::classInfo): |
| (JSC): |
| * runtime/StructureChain.h: |
| * runtime/SymbolTable.h: |
| * testRegExp.cpp: |
| (GlobalObject::create): |
| |
| 2012-09-17 Geoffrey Garen <ggaren@apple.com> |
| |
| Refactored the arguments object so it doesn't dictate closure layout |
| https://bugs.webkit.org/show_bug.cgi?id=96955 |
| |
| Reviewed by Oliver Hunt. |
| |
| * bytecode/CodeBlock.h: |
| (JSC::ExecState::argumentAfterCapture): Helper function for accessing an |
| argument that has been moved for capture. |
| |
| * bytecompiler/BytecodeGenerator.cpp: |
| (JSC::BytecodeGenerator::BytecodeGenerator): Generate metadata for arguments |
| that are captured. We don't move any arguments yet, but we do use this |
| metadata to tell the arguments object if an argument is stored in the |
| activation. |
| |
| * dfg/DFGOperations.cpp: |
| * dfg/DFGSpeculativeJIT.cpp: |
| (JSC::DFG::SpeculativeJIT::compileGetByValOnArguments): |
| (JSC::DFG::SpeculativeJIT::compileGetArgumentsLength): |
| * dfg/DFGSpeculativeJIT64.cpp: |
| (JSC::DFG::SpeculativeJIT::compile): Updated for the arguments object not |
| malloc'ing a separate backing store, and for a rename from deletedArguments |
| to slowArguments. |
| |
| * interpreter/CallFrame.h: |
| (ExecState): |
| * interpreter/Interpreter.cpp: |
| (JSC::Interpreter::unwindCallFrame): |
| (JSC::Interpreter::privateExecute): |
| * jit/JITStubs.cpp: |
| (JSC::DEFINE_STUB_FUNCTION): |
| * llint/LLIntSlowPaths.cpp: |
| (JSC::LLInt::LLINT_SLOW_PATH_DECL): Updated for small interface changes. |
| |
| * runtime/Arguments.cpp: |
| (JSC::Arguments::visitChildren): |
| (JSC::Arguments::copyToArguments): |
| (JSC::Arguments::fillArgList): |
| (JSC::Arguments::getOwnPropertySlotByIndex): |
| (JSC::Arguments::createStrictModeCallerIfNecessary): |
| (JSC::Arguments::createStrictModeCalleeIfNecessary): |
| (JSC::Arguments::getOwnPropertySlot): |
| (JSC::Arguments::getOwnPropertyDescriptor): |
| (JSC::Arguments::getOwnPropertyNames): |
| (JSC::Arguments::putByIndex): |
| (JSC::Arguments::put): |
| (JSC::Arguments::deletePropertyByIndex): |
| (JSC::Arguments::deleteProperty): |
| (JSC::Arguments::defineOwnProperty): |
| (JSC::Arguments::tearOff): Moved all data inline into the object, for speed, |
| and refactored all internal argument accesses to use helper functions, so |
| we can change the implementation without changing lots of code. |
| |
| (JSC::Arguments::didTearOffActivation): This function needs to account |
| for arguments that were moved by the activation object. We do this accounting |
| through a side vector that tells us where our arguments will be in the |
| activation. |
| |
| (JSC::Arguments::tearOffForInlineCallFrame): |
| * runtime/Arguments.h: |
| (Arguments): |
| (JSC::Arguments::length): |
| (JSC::Arguments::isTornOff): |
| (JSC::Arguments::Arguments): |
| (JSC::Arguments::allocateSlowArguments): |
| (JSC::Arguments::tryDeleteArgument): |
| (JSC::Arguments::trySetArgument): |
| (JSC::Arguments::tryGetArgument): |
| (JSC::Arguments::isDeletedArgument): |
| (JSC::Arguments::isArgument): |
| (JSC::Arguments::argument): |
| (JSC::Arguments::finishCreation): |
| |
| * runtime/JSActivation.h: |
| (JSC::JSActivation::create): |
| (JSActivation): |
| (JSC::JSActivation::captureStart): |
| (JSC::JSActivation::storageSize): |
| (JSC::JSActivation::registerOffset): |
| (JSC::JSActivation::isValid): The activation object is no longer responsible |
| for copying extra arguments provided by the caller. The argumnents object |
| does this instead. This means we can allocate and initialize an activation |
| without worrying about the call frame's argument count. |
| |
| * runtime/SymbolTable.h: |
| (JSC::SlowArgument::SlowArgument): |
| (SlowArgument): |
| (JSC): |
| (JSC::SharedSymbolTable::parameterCount): |
| (SharedSymbolTable): |
| (JSC::SharedSymbolTable::slowArguments): |
| (JSC::SharedSymbolTable::setSlowArguments): Added data structures to back |
| the algorithms above. |
| |
| 2012-09-17 Filip Pizlo <fpizlo@apple.com> |
| |
| 32-bit LLInt get_by_val does vector length checks incorrectly |
| https://bugs.webkit.org/show_bug.cgi?id=96893 |
| <rdar://problem/12311678> |
| |
| Reviewed by Mark Hahnenberg. |
| |
| * llint/LowLevelInterpreter32_64.asm: |
| |
| 2012-09-17 Filip Pizlo <fpizlo@apple.com> |
| |
| We don't have a bad enough time if an object's prototype chain crosses global objects |
| https://bugs.webkit.org/show_bug.cgi?id=96962 |
| |
| Reviewed by Geoffrey Garen. |
| |
| * runtime/JSGlobalObject.cpp: |
| (JSC): |
| |
| 2012-09-17 Filip Pizlo <fpizlo@apple.com> |
| |
| Unreviewed, fix a broken assertion in offlineasm. |
| |
| * offlineasm/armv7.rb: |
| * offlineasm/backends.rb: |
| |
| 2012-09-16 Mark Hahnenberg <mhahnenberg@apple.com> |
| |
| Delayed structure sweep can leak structures without bound |
| https://bugs.webkit.org/show_bug.cgi?id=96546 |
| |
| Reviewed by Gavin Barraclough. |
| |
| This patch gets rid of the separate Structure allocator in the MarkedSpace and adds two new destructor-only |
| allocators. We now have separate allocators for our three types of objects: those objects with no destructors, |
| those objects with destructors and with immortal structures, and those objects with destructors that don't have |
| immortal structures. All of the objects of the third type (destructors without immortal structures) now |
| inherit from a new class named JSDestructibleObject (which in turn is a subclass of JSNonFinalObject), which stores |
| the ClassInfo for these classes at a fixed offset for safe retrieval during sweeping/destruction. |
| |
| * API/JSCallbackConstructor.cpp: Use JSDestructibleObject for JSCallbackConstructor. |
| (JSC): |
| (JSC::JSCallbackConstructor::JSCallbackConstructor): |
| * API/JSCallbackConstructor.h: |
| (JSCallbackConstructor): |
| * API/JSCallbackObject.cpp: Inherit from JSDestructibleObject for normal JSCallbackObjects and use a finalizer for |
| JSCallbackObject<JSGlobalObject>, since JSGlobalObject also uses a finalizer. |
| (JSC): |
| (JSC::::create): We need to move the create function for JSCallbackObject<JSGlobalObject> out of line so we can add |
| the finalizer for it. We don't want to add the finalizer is something like finishCreation in case somebody decides |
| to subclass this. We use this same technique for many other subclasses of JSGlobalObject. |
| (JSC::::createStructure): |
| * API/JSCallbackObject.h: |
| (JSCallbackObject): |
| (JSC): |
| * API/JSClassRef.cpp: Change all the JSCallbackObject<JSNonFinalObject> to use JSDestructibleObject instead. |
| (OpaqueJSClass::prototype): |
| * API/JSObjectRef.cpp: Ditto. |
| (JSObjectMake): |
| (JSObjectGetPrivate): |
| (JSObjectSetPrivate): |
| (JSObjectGetPrivateProperty): |
| (JSObjectSetPrivateProperty): |
| (JSObjectDeletePrivateProperty): |
| * API/JSValueRef.cpp: Ditto. |
| (JSValueIsObjectOfClass): |
| * API/JSWeakObjectMapRefPrivate.cpp: Ditto. |
| * JSCTypedArrayStubs.h: |
| (JSC): |
| * JavaScriptCore.xcodeproj/project.pbxproj: |
| * dfg/DFGSpeculativeJIT.h: Use the proper allocator type when doing inline allocation in the DFG. |
| (JSC::DFG::SpeculativeJIT::emitAllocateBasicJSObject): |
| (JSC::DFG::SpeculativeJIT::emitAllocateJSFinalObject): |
| * heap/Heap.cpp: |
| (JSC): |
| * heap/Heap.h: Add accessors for the various types of allocators now. Also remove the isSafeToSweepStructures function |
| since it's always safe to sweep Structures now. |
| (JSC::Heap::allocatorForObjectWithNormalDestructor): |
| (JSC::Heap::allocatorForObjectWithImmortalStructureDestructor): |
| (Heap): |
| (JSC::Heap::allocateWithNormalDestructor): |
| (JSC): |
| (JSC::Heap::allocateWithImmortalStructureDestructor): |
| * heap/IncrementalSweeper.cpp: Remove all the logic to detect when it's safe to sweep Structures from the |
| IncrementalSweeper since it's always safe to sweep Structures now. |
| (JSC::IncrementalSweeper::IncrementalSweeper): |
| (JSC::IncrementalSweeper::sweepNextBlock): |
| (JSC::IncrementalSweeper::startSweeping): |
| (JSC::IncrementalSweeper::willFinishSweeping): |
| (JSC): |
| * heap/IncrementalSweeper.h: |
| (IncrementalSweeper): |
| * heap/MarkedAllocator.cpp: Remove the logic that was preventing us from sweeping Structures if it wasn't safe. Add |
| tracking of the specific destructor type of allocator. |
| (JSC::MarkedAllocator::tryAllocateHelper): |
| (JSC::MarkedAllocator::allocateBlock): |
| * heap/MarkedAllocator.h: |
| (JSC::MarkedAllocator::destructorType): |
| (MarkedAllocator): |
| (JSC::MarkedAllocator::MarkedAllocator): |
| (JSC::MarkedAllocator::init): |
| * heap/MarkedBlock.cpp: Add all the destructor type stuff to MarkedBlocks so that we do the right thing when sweeping. |
| We also use the stored destructor type to determine the right thing to do in all JSCell::classInfo() calls. |
| (JSC::MarkedBlock::create): |
| (JSC::MarkedBlock::MarkedBlock): |
| (JSC): |
| (JSC::MarkedBlock::specializedSweep): |
| (JSC::MarkedBlock::sweep): |
| (JSC::MarkedBlock::sweepHelper): |
| * heap/MarkedBlock.h: |
| (JSC): |
| (JSC::MarkedBlock::allocator): |
| (JSC::MarkedBlock::destructorType): |
| * heap/MarkedSpace.cpp: Add the new destructor allocators to MarkedSpace. |
| (JSC::MarkedSpace::MarkedSpace): |
| (JSC::MarkedSpace::resetAllocators): |
| (JSC::MarkedSpace::canonicalizeCellLivenessData): |
| (JSC::MarkedSpace::isPagedOut): |
| (JSC::MarkedSpace::freeBlock): |
| * heap/MarkedSpace.h: |
| (MarkedSpace): |
| (JSC::MarkedSpace::immortalStructureDestructorAllocatorFor): |
| (JSC::MarkedSpace::normalDestructorAllocatorFor): |
| (JSC::MarkedSpace::allocateWithImmortalStructureDestructor): |
| (JSC::MarkedSpace::allocateWithNormalDestructor): |
| (JSC::MarkedSpace::forEachBlock): |
| * heap/SlotVisitor.cpp: Add include because the symbol was needed in an inlined function. |
| * jit/JIT.h: Make sure we use the correct allocator when doing inline allocations in the baseline JIT. |
| * jit/JITInlineMethods.h: |
| (JSC::JIT::emitAllocateBasicJSObject): |
| (JSC::JIT::emitAllocateJSFinalObject): |
| (JSC::JIT::emitAllocateJSArray): |
| * jsc.cpp: |
| (GlobalObject::create): Add finalizer here since JSGlobalObject needs to use a finalizer instead of inheriting from |
| JSDestructibleObject. |
| * runtime/Arguments.cpp: Inherit from JSDestructibleObject. |
| (JSC): |
| * runtime/Arguments.h: |
| (Arguments): |
| (JSC::Arguments::Arguments): |
| * runtime/ErrorPrototype.cpp: Added an assert to make sure we have a trivial destructor. |
| (JSC): |
| * runtime/Executable.h: Indicate that all of the Executable* classes have immortal Structures. |
| (JSC): |
| * runtime/InternalFunction.cpp: Inherit from JSDestructibleObject. |
| (JSC): |
| (JSC::InternalFunction::InternalFunction): |
| * runtime/InternalFunction.h: |
| (InternalFunction): |
| * runtime/JSCell.h: Added the NEEDS_DESTRUCTOR macro to make it easier for classes to indicate that instead of being |
| allocated in a destructor MarkedAllocator that they will handle their destruction themselves through the |
| use of a finalizer. |
| (JSC): |
| (HasImmortalStructure): New template to help us determine at compile-time if a particular class |
| should be allocated in the immortal structure MarkedAllocator. The default value is false. In order |
| to be allocated in the immortal structure allocator, classes must specialize this template. Also added |
| a macro to make it easier for classes to specialize the template. |
| (JSC::allocateCell): Use the appropriate allocator depending on the destructor type. |
| * runtime/JSDestructibleObject.h: Added. New class that stores the ClassInfo of any subclass so that it can be |
| accessed safely when the object is being destroyed. |
| (JSC): |
| (JSDestructibleObject): |
| (JSC::JSDestructibleObject::classInfo): |
| (JSC::JSDestructibleObject::JSDestructibleObject): |
| (JSC::JSCell::classInfo): Checks the current MarkedBlock to see where it should get the ClassInfo from so that it's always safe. |
| * runtime/JSGlobalObject.cpp: JSGlobalObject now uses a finalizer instead of a destructor so that it can avoid forcing all |
| of its relatives in the inheritance hierarchy (e.g. JSScope) to use destructors as well. |
| (JSC::JSGlobalObject::reset): |
| * runtime/JSGlobalObject.h: |
| (JSGlobalObject): |
| (JSC::JSGlobalObject::createRareDataIfNeeded): Since we always create a finalizer now, we don't have to worry about adding one |
| for the m_rareData field when it's created. |
| (JSC::JSGlobalObject::create): |
| (JSC): |
| * runtime/JSGlobalThis.h: Inherit from JSDestructibleObject. |
| (JSGlobalThis): |
| (JSC::JSGlobalThis::JSGlobalThis): |
| * runtime/JSPropertyNameIterator.h: Has an immortal Structure. |
| (JSC): |
| * runtime/JSScope.cpp: |
| (JSC): |
| * runtime/JSString.h: Has an immortal Structure. |
| (JSC): |
| * runtime/JSWrapperObject.h: Inherit from JSDestructibleObject. |
| (JSWrapperObject): |
| (JSC::JSWrapperObject::JSWrapperObject): |
| * runtime/MathObject.cpp: Cleaning up some of the inheritance stuff. |
| (JSC): |
| * runtime/NameInstance.h: Inherit from JSDestructibleObject. |
| (NameInstance): |
| * runtime/RegExp.h: Has immortal Structure. |
| (JSC): |
| * runtime/RegExpObject.cpp: Inheritance cleanup. |
| (JSC): |
| * runtime/SparseArrayValueMap.h: Has immortal Structure. |
| (JSC): |
| * runtime/Structure.h: Has immortal Structure. |
| (JSC): |
| * runtime/StructureChain.h: Ditto. |
| (JSC): |
| * runtime/SymbolTable.h: Ditto. |
| (SharedSymbolTable): |
| (JSC): |
| |
| 2012-09-17 Filip Pizlo <fpizlo@apple.com> |
| |
| If a prototype has indexed setters and its instances have indexed storage, then all put_by_val's should have a bad time |
| https://bugs.webkit.org/show_bug.cgi?id=96596 |
| |
| Reviewed by Gavin Barraclough. |
| |
| Added comprehensive support for accessors and read-only indexed properties on the |
| prototype chain. This is done without any performance regression on benchmarks that |
| we're aware of, by having the entire VM's strategy with respect to arrays tilted |
| heavily in favor of: |
| |
| - The prototype chain of JSArrays never having any accessors or read-only indexed |
| properties. If that changes, you're going to have a bad time. |
| |
| - Prototypes of non-JSArray objects either having no indexed accessors or read-only |
| indexed properties, or, having those indexed accessor thingies inserted before |
| any instance object (i.e. object with that prototype as its prototype) is created. |
| If you add indexed accessors or read-only indexed properties to an object that is |
| already used as a prototype, you're going to have a bad time. |
| |
| See below for the exact definition of having a bad time. |
| |
| Put another way, "fair" uses of indexed accessors and read-only indexed properties |
| are: |
| |
| - Put indexed accessors and read-only indexed properties on an object that is never |
| used as a prototype. This will slow down accesses to that object, but will not |
| have any effect on any other object. |
| |
| - Put those indexed accessor thingies on an object before it is used as a prototype |
| and then start instantiating objects that claim that object as their prototype. |
| This will slightly slow down indexed stores to the instance objects, and greatly |
| slow down all indexed accesses to the prototype, but will have no other effect. |
| |
| In short, "fair" uses only affect the object itself and any instance objects. But |
| if you start using indexed accessors in more eclectic ways, you're going to have |
| a bad time. |
| |
| Specifically, if an object that may be used as a prototype has an indexed accessor |
| added, the VM performs a whole-heap scan to find all objects that belong to the |
| same global object as the prototype you modified. If any of those objects has |
| indexed storage, their indexed storage is put into slow-put mode, just as if their |
| prototype chain had indexed accessors. This will happen even for objects that do |
| not currently have indexed accessors in their prototype chain. As well, all JSArray |
| allocations are caused to create arrays with slow-put storage, and all future |
| allocations of indexed storage for non-JSArray objects are also flipped to slow-put |
| mode. Note there are two aspects to having a bad time: (i) the whole-heap scan and |
| (ii) the poisoning of all indexed storage in the entire global object. (i) is |
| necessary for correctness. If we detect that an object that may be used as a |
| prototype has had an indexed accessor or indexed read-only property inserted into |
| it, then we need to ensure that henceforth all instances of that object inspect |
| the prototype chain whenever an indexed hole is stored to. But by default, indexed |
| stores do no such checking because doing so would be unnecessarily slow. So, we must |
| find all instances of the affected object and flip them into a different array |
| storage mode that omits all hole optimizations. Since prototypes never keep a list |
| of instance objects, the only way to find those objects is a whole-heap scan. But |
| (i) alone would be a potential disaster, if a program frequently allocated an |
| object without indexed accessors, then allocated a bunch of objects that used that |
| one as their prototype, and then added indexed accessors to the prototype. So, to |
| prevent massive heap scan storms in such awkward programs, having a bad time also |
| implies (ii): henceforth *all* objects belonging to that global object will use |
| slow put indexed storage, so that we don't ever have to scan the heap again. Note |
| that here we are using the global object as just an approximation of a program |
| module; it may be worth investigating in the future if other approximations can be |
| used instead. |
| |
| * bytecode/ArrayProfile.h: |
| (JSC): |
| (JSC::arrayModeFromStructure): |
| * dfg/DFGAbstractState.cpp: |
| (JSC::DFG::AbstractState::execute): |
| * dfg/DFGArrayMode.cpp: |
| (JSC::DFG::fromObserved): |
| (JSC::DFG::modeAlreadyChecked): |
| (JSC::DFG::modeToString): |
| * dfg/DFGArrayMode.h: |
| (DFG): |
| (JSC::DFG::isSlowPutAccess): |
| * dfg/DFGSpeculativeJIT.cpp: |
| (JSC::DFG::SpeculativeJIT::checkArray): |
| * dfg/DFGSpeculativeJIT32_64.cpp: |
| (JSC::DFG::SpeculativeJIT::compile): |
| * dfg/DFGSpeculativeJIT64.cpp: |
| (JSC::DFG::SpeculativeJIT::compile): |
| * jit/JIT.h: |
| * jit/JITInlineMethods.h: |
| (JSC::JIT::emitAllocateJSArray): |
| * jit/JITOpcodes.cpp: |
| (JSC::JIT::emit_op_new_array): |
| * runtime/ArrayPrototype.cpp: |
| (JSC::ArrayPrototype::finishCreation): |
| (JSC::arrayProtoFuncSort): |
| * runtime/IndexingType.h: |
| (JSC): |
| (JSC::hasIndexedProperties): |
| (JSC::hasIndexingHeader): |
| (JSC::hasArrayStorage): |
| (JSC::shouldUseSlowPut): |
| * runtime/JSArray.cpp: |
| (JSC::JSArray::pop): |
| (JSC::JSArray::push): |
| (JSC::JSArray::fillArgList): |
| (JSC::JSArray::copyToArguments): |
| * runtime/JSArray.h: |
| (JSC::JSArray::createStructure): |
| * runtime/JSGlobalObject.cpp: |
| (JSC::JSGlobalObject::JSGlobalObject): |
| (JSC::JSGlobalObject::reset): |
| (JSC): |
| (JSC::JSGlobalObject::haveABadTime): |
| * runtime/JSGlobalObject.h: |
| (JSGlobalObject): |
| (JSC::JSGlobalObject::addressOfArrayStructure): |
| (JSC::JSGlobalObject::havingABadTimeWatchpoint): |
| (JSC::JSGlobalObject::isHavingABadTime): |
| * runtime/JSObject.cpp: |
| (JSC::JSObject::visitButterfly): |
| (JSC::JSObject::getOwnPropertySlotByIndex): |
| (JSC::JSObject::put): |
| (JSC::JSObject::putByIndex): |
| (JSC::JSObject::enterDictionaryIndexingMode): |
| (JSC::JSObject::notifyPresenceOfIndexedAccessors): |
| (JSC): |
| (JSC::JSObject::createArrayStorage): |
| (JSC::JSObject::ensureArrayStorageExistsAndEnterDictionaryIndexingMode): |
| (JSC::JSObject::switchToSlowPutArrayStorage): |
| (JSC::JSObject::setPrototype): |
| (JSC::JSObject::resetInheritorID): |
| (JSC::JSObject::inheritorID): |
| (JSC::JSObject::allowsAccessFrom): |
| (JSC::JSObject::deletePropertyByIndex): |
| (JSC::JSObject::getOwnPropertyNames): |
| (JSC::JSObject::unwrappedGlobalObject): |
| (JSC::JSObject::notifyUsedAsPrototype): |
| (JSC::JSObject::createInheritorID): |
| (JSC::JSObject::defineOwnIndexedProperty): |
| (JSC::JSObject::attemptToInterceptPutByIndexOnHoleForPrototype): |
| (JSC::JSObject::attemptToInterceptPutByIndexOnHole): |
| (JSC::JSObject::putByIndexBeyondVectorLength): |
| (JSC::JSObject::putDirectIndexBeyondVectorLength): |
| (JSC::JSObject::getNewVectorLength): |
| (JSC::JSObject::getOwnPropertyDescriptor): |
| * runtime/JSObject.h: |
| (JSC::JSObject::mayBeUsedAsPrototype): |
| (JSObject): |
| (JSC::JSObject::mayInterceptIndexedAccesses): |
| (JSC::JSObject::getArrayLength): |
| (JSC::JSObject::getVectorLength): |
| (JSC::JSObject::canGetIndexQuickly): |
| (JSC::JSObject::getIndexQuickly): |
| (JSC::JSObject::canSetIndexQuickly): |
| (JSC::JSObject::setIndexQuickly): |
| (JSC::JSObject::initializeIndex): |
| (JSC::JSObject::completeInitialization): |
| (JSC::JSObject::inSparseIndexingMode): |
| (JSC::JSObject::arrayStorage): |
| (JSC::JSObject::arrayStorageOrNull): |
| (JSC::JSObject::ensureArrayStorage): |
| (JSC): |
| (JSC::JSValue::putByIndex): |
| * runtime/JSValue.cpp: |
| (JSC::JSValue::putToPrimitive): |
| (JSC::JSValue::putToPrimitiveByIndex): |
| (JSC): |
| * runtime/JSValue.h: |
| (JSValue): |
| * runtime/ObjectPrototype.cpp: |
| (JSC::ObjectPrototype::finishCreation): |
| * runtime/SparseArrayValueMap.cpp: |
| (JSC::SparseArrayValueMap::putEntry): |
| (JSC::SparseArrayEntry::put): |
| (JSC): |
| * runtime/SparseArrayValueMap.h: |
| (JSC): |
| (SparseArrayEntry): |
| * runtime/Structure.cpp: |
| (JSC::Structure::anyObjectInChainMayInterceptIndexedAccesses): |
| (JSC): |
| (JSC::Structure::suggestedIndexingTransition): |
| * runtime/Structure.h: |
| (Structure): |
| (JSC::Structure::mayInterceptIndexedAccesses): |
| * runtime/StructureTransitionTable.h: |
| (JSC::newIndexingType): |
| |
| 2012-09-17 Filip Pizlo <fpizlo@apple.com> |
| |
| Array profiling has convergence issues |
| https://bugs.webkit.org/show_bug.cgi?id=96891 |
| |
| Reviewed by Gavin Barraclough. |
| |
| Now each array profiling site merges in the indexing type it observed into |
| the m_observedArrayModes bitset. The ArrayProfile also uses this to detect |
| cases where the structure must have gone polymorphic (if the bitset is |
| polymorphic then the structure must be). This achieves something like the |
| best of both worlds: on the one hand, we get a probabilistic structure that |
| we can use to optimize the monomorphic structure case, but on the other hand, |
| we get an accurate view of the set of types that were encountered. |
| |
| * assembler/MacroAssemblerARMv7.h: |
| (JSC::MacroAssemblerARMv7::or32): |
| (MacroAssemblerARMv7): |
| * assembler/MacroAssemblerX86.h: |
| (JSC::MacroAssemblerX86::or32): |
| (MacroAssemblerX86): |
| * assembler/MacroAssemblerX86_64.h: |
| (JSC::MacroAssemblerX86_64::or32): |
| (MacroAssemblerX86_64): |
| * assembler/X86Assembler.h: |
| (X86Assembler): |
| (JSC::X86Assembler::orl_rm): |
| * bytecode/ArrayProfile.cpp: |
| (JSC::ArrayProfile::computeUpdatedPrediction): |
| * bytecode/ArrayProfile.h: |
| (JSC::ArrayProfile::addressOfArrayModes): |
| (JSC::ArrayProfile::structureIsPolymorphic): |
| * jit/JIT.h: |
| (JIT): |
| * jit/JITInlineMethods.h: |
| (JSC): |
| (JSC::JIT::emitArrayProfilingSite): |
| * jit/JITPropertyAccess.cpp: |
| (JSC::JIT::emit_op_get_by_val): |
| (JSC::JIT::emit_op_put_by_val): |
| (JSC::JIT::privateCompilePatchGetArrayLength): |
| * jit/JITPropertyAccess32_64.cpp: |
| (JSC::JIT::emit_op_get_by_val): |
| (JSC::JIT::emit_op_put_by_val): |
| (JSC::JIT::privateCompilePatchGetArrayLength): |
| * llint/LowLevelInterpreter.asm: |
| * llint/LowLevelInterpreter32_64.asm: |
| * llint/LowLevelInterpreter64.asm: |
| |
| 2012-09-17 Mark Lam <mark.lam@apple.com> |
| |
| Not reviewed. Added svn:eol-style native to unbreak some build bots. |
| https://bugs.webkit.org/show_bug.cgi?id=96175. |
| |
| * JavaScriptCore.vcproj/LLIntAssembly/LLIntAssembly.vcproj: Added property svn:eol-style. |
| * JavaScriptCore.vcproj/LLIntDesiredOffsets/LLIntDesiredOffsets.vcproj: Added property svn:eol-style. |
| * JavaScriptCore.vcproj/LLIntOffsetsExtractor/LLIntOffsetsExtractor.vcproj: Added property svn:eol-style. |
| |
| 2012-09-16 Mark Lam <mark.lam@apple.com> |
| |
| Added MSVC project changes to enable building the llint. |
| https://bugs.webkit.org/show_bug.cgi?id=96175. |
| |
| Reviewed by Geoff Garen. |
| |
| This only adds the ability to build the llint, but currently, only the |
| C++ backend is supported. By default, the Windows port will remain |
| running with the baseline JIT. The llint will not be enabled. |
| |
| * JavaScriptCore.vcproj/JavaScriptCore.sln: |
| * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: |
| * JavaScriptCore.vcproj/LLIntAssembly: Added. |
| * JavaScriptCore.vcproj/LLIntAssembly/LLIntAssembly.make: Added. |
| * JavaScriptCore.vcproj/LLIntAssembly/LLIntAssembly.vcproj: Added. |
| * JavaScriptCore.vcproj/LLIntAssembly/build-LLIntAssembly.sh: Added. |
| * JavaScriptCore.vcproj/LLIntDesiredOffsets: Added. |
| * JavaScriptCore.vcproj/LLIntDesiredOffsets/LLIntDesiredOffsets.make: Added. |
| * JavaScriptCore.vcproj/LLIntDesiredOffsets/LLIntDesiredOffsets.vcproj: Added. |
| * JavaScriptCore.vcproj/LLIntDesiredOffsets/build-LLIntDesiredOffsets.sh: Added. |
| * JavaScriptCore.vcproj/LLIntOffsetsExtractor: Added. |
| * JavaScriptCore.vcproj/LLIntOffsetsExtractor/LLIntOffsetsExtractor.vcproj: Added. |
| * JavaScriptCore.vcproj/LLIntOffsetsExtractor/LLIntOffsetsExtractorCommon.vsprops: Added. |
| * JavaScriptCore.vcproj/LLIntOffsetsExtractor/LLIntOffsetsExtractorDebug.vsprops: Added. |
| * JavaScriptCore.vcproj/LLIntOffsetsExtractor/LLIntOffsetsExtractorRelease.vsprops: Added. |
| |
| 2012-09-16 Filip Pizlo <fpizlo@apple.com> |
| |
| JSObject.cpp and JSArray.cpp have inconsistent tests for the invalid array index case |
| https://bugs.webkit.org/show_bug.cgi?id=96878 |
| |
| Reviewed by Sam Weinig. |
| |
| Removed the uses of UNLIKELY() because I don't believe they are buying us anything, |
| since we're already on the slow path. Also found other places where we're testing for |
| the invalid array index case using unusual predicates rather than just using |
| MAX_ARRAY_INDEX. With this change, I believe that all of our tests for invalid |
| array indices (i.e. indices that should be treated as non-indexed properties) |
| uniformly use MAX_ARRAY_INDEX and PropertyName::NotAnIndex. |
| |
| * runtime/JSArray.cpp: |
| (JSC::JSArray::push): |
| * runtime/JSObject.cpp: |
| (JSC::JSObject::putByIndex): |
| (JSC::JSObject::defineOwnIndexedProperty): |
| |
| 2012-09-15 Filip Pizlo <fpizlo@apple.com> |
| |
| Following the Butterfly refactoring, the comment for lastArraySize was not updated |
| https://bugs.webkit.org/show_bug.cgi?id=96877 |
| |
| Reviewed by Sam Weinig. |
| |
| * runtime/JSObject.cpp: |
| (JSC): |
| |
| 2012-09-15 Mark Lam <mark.lam@apple.com> |
| |
| Fixed JSLock to use the platform abstraction for Mutex instead of |
| depending on pthreads. |
| https://bugs.webkit.org/show_bug.cgi?id=96858. |
| |
| Reviewed by Filip Pizlo. |
| |
| This fixes a synchronization problem on the Windows port and makes |
| it more reliable when running the layout tests. |
| |
| * runtime/InitializeThreading.cpp: |
| (JSC::initializeThreadingOnce): |
| * runtime/JSLock.cpp: |
| (JSC): |
| (JSC::GlobalJSLock::GlobalJSLock): |
| (JSC::GlobalJSLock::~GlobalJSLock): |
| (JSC::GlobalJSLock::initialize): |
| * runtime/JSLock.h: |
| (GlobalJSLock): |
| (JSLock): |
| |
| 2012-09-15 Filip Pizlo <fpizlo@apple.com> |
| |
| Structure check hoisting fails to consider the possibility of conflicting checks on the source of the first assignment to the hoisted variable |
| https://bugs.webkit.org/show_bug.cgi?id=96872 |
| |
| Reviewed by Oliver Hunt. |
| |
| This does a few related things: |
| |
| - It turns off the use of ForceOSRExit for sure-to-fail CheckStructures, because |
| I noticed that this would sometimes happen for a ForwardCheckStructure. The |
| problem is that ForceOSRExit exits backwards, not forwards. Since the code that |
| led to those ForceOSRExit's being inserted was written out of paranoia rather |
| than need, I removed it. Specifically, I removed the m_isValid = false code |
| for CheckStructure/StructureTransitionWatchpoint in AbstractState. |
| |
| - If a structure check causes a structure set to go empty, we don't want a |
| PutStructure to revive the set. It should instead be smart enough to realize |
| that an empty set implies that the code can't execute. This was the only "bug" |
| that the use of m_isValid = false was preventing. |
| |
| - Finally, the main change: structure check hoisting looks at the source of the |
| SetLocals on structure-check-hoistable variables and ensures that the source |
| is not checked with a conflicting structure. This is O(n^2) but it does not |
| show up at all in performance tests. |
| |
| The first two parts of this change were auxiliary bugs that were revealed by |
| the structure check hoister doing bad things. |
| |
| * dfg/DFGAbstractState.cpp: |
| (JSC::DFG::AbstractState::initialize): |
| (JSC::DFG::AbstractState::execute): |
| * dfg/DFGStructureCheckHoistingPhase.cpp: |
| (JSC::DFG::StructureCheckHoistingPhase::run): |
| |
| 2012-09-14 Filip Pizlo <fpizlo@apple.com> |
| |
| All of the things in SparseArrayValueMap should be out-of-line |
| https://bugs.webkit.org/show_bug.cgi?id=96854 |
| |
| Reviewed by Andy Estes. |
| |
| Those inline methods were buying us nothing. |
| |
| * GNUmakefile.list.am: |
| * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: |
| * JavaScriptCore.xcodeproj/project.pbxproj: |
| * runtime/JSArray.cpp: |
| * runtime/JSGlobalData.cpp: |
| * runtime/JSObject.cpp: |
| * runtime/RegExpMatchesArray.cpp: |
| * runtime/SparseArrayValueMap.cpp: |
| (JSC::SparseArrayValueMap::SparseArrayValueMap): |
| (JSC): |
| (JSC::SparseArrayValueMap::~SparseArrayValueMap): |
| (JSC::SparseArrayValueMap::finishCreation): |
| (JSC::SparseArrayValueMap::create): |
| (JSC::SparseArrayValueMap::destroy): |
| (JSC::SparseArrayValueMap::createStructure): |
| (JSC::SparseArrayValueMap::add): |
| (JSC::SparseArrayValueMap::putEntry): |
| (JSC::SparseArrayValueMap::putDirect): |
| (JSC::SparseArrayEntry::get): |
| (JSC::SparseArrayEntry::getNonSparseMode): |
| (JSC::SparseArrayValueMap::visitChildren): |
| * runtime/SparseArrayValueMapInlineMethods.h: Removed. |
| |
| 2012-09-14 Mike West <mkwst@chromium.org> |
| |
| JSC should throw a more descriptive exception when blocking 'eval' via CSP. |
| https://bugs.webkit.org/show_bug.cgi?id=94331 |
| |
| Reviewed by Geoffrey Garen. |
| |
| Unless explicitly whitelisted, the 'script-src' Content Security Policy |
| directive blocks 'eval' and 'eval'-like constructs such as |
| 'new Function()'. When 'eval' is encountered in code, an 'EvalError' is |
| thrown, but the associated message is poor: "Eval is disabled" doesn't |
| give developers enough information about why their code isn't behaving |
| as expected. |
| |
| This patch adds an 'errorMessage' parameter to the JavaScriptCore method |
| used to disable 'eval'; ContentSecurityPolicy has the opportunity to |
| pass in a more detailed and descriptive error that contains more context |
| for the developer. |
| |
| * runtime/Executable.cpp: |
| (JSC::EvalExecutable::compileInternal): |
| Drop the hard-coded "Eval is disabled" error message in favor of |
| reading the error message off the global object. |
| * runtime/FunctionConstructor.cpp: |
| (JSC::FunctionConstructor::getCallData): |
| Drop the hard-coded "Function constructor is disabled" error message |
| in favor of reading the error message off the global object. |
| * runtime/JSGlobalObject.h: |
| (JSGlobalObject): |
| (JSC::JSGlobalObject::evalEnabled): |
| Making this accessor method const. |
| (JSC::JSGlobalObject::evalDisabledErrorMessage): |
| Accessor for the error message set via 'setEvalDisabled'. |
| (JSC::JSGlobalObject::setEvalEnabled): |
| Adding an 'errorMessage' parameter which is stored on the global |
| object, and used when exceptions are thrown. |
| |
| 2012-09-14 Filip Pizlo <fpizlo@apple.com> |
| |
| bbc homepage crashes immediately |
| https://bugs.webkit.org/show_bug.cgi?id=96812 |
| <rdar://problem/12081386> |
| |
| Reviewed by Oliver Hunt. |
| |
| If you use the old storage pointer to write to space you thought was newly allocated, |
| you're going to have a bad time. |
| |
| * runtime/JSArray.cpp: |
| (JSC::JSArray::unshiftCount): |
| |
| 2012-09-14 Adam Barth <abarth@webkit.org> |
| |
| Remove webkitPostMessage |
| https://bugs.webkit.org/show_bug.cgi?id=96577 |
| |
| Reviewed by Ojan Vafai. |
| |
| Add ENABLE_LEGACY_VENDOR_PREFIXES flag. |
| |
| * Configurations/FeatureDefines.xcconfig: |
| |
| 2012-09-14 Tor Arne Vestbø <tor.arne.vestbo@nokia.com> |
| |
| [Qt] Make force_static_libs_as_shared work on Mac OS |
| |
| We had to move a few LIBS += around that were in the wrong place, |
| and not caught when everything was just linked into the final |
| QtWebKit library. |
| |
| Reviewed by Simon Hausmann. |
| |
| * jsc.pro: No need for AppKit, we get it from WTF.pri |
| |
| 2012-09-14 Kevin Funk <kevin.funk@kdab.com> |
| |
| Fix interpreter build |
| https://bugs.webkit.org/show_bug.cgi?id=96617 |
| |
| Reviewed by Simon Hausmann. |
| |
| Make compile. |
| |
| * interpreter/Interpreter.cpp: |
| |
| 2012-09-14 Parth Patel <parpatel@rim.com> |
| |
| [BlackBerry] Switching from Slogger to Slogger2 requires changes in CMakeList of |
| webkit in order to include libraries of slog2 |
| https://bugs.webkit.org/show_bug.cgi?id=96391 |
| |
| Reviewed by Yong Li. |
| |
| Changes in Cmake files of JavaScriptCore of webkit to include slog2 libs in build |
| files of webkit in response to switching from Slogger to Slogger2. |
| |
| * shell/PlatformBlackBerry.cmake: |
| |
| 2012-09-14 Mark Hahnenberg <mhahnenberg@apple.com> |
| |
| Remove the Zapped BlockState |
| https://bugs.webkit.org/show_bug.cgi?id=96708 |
| |
| Reviewed by Geoffrey Garen. |
| |
| The Zapped block state is rather confusing. It indicates that a block is in one of two different states that we |
| can't tell the difference between: |
| |
| 1) I have run all destructors of things that are zapped, and I have not allocated any more objects. This block |
| is ready for reclaiming if you so choose. |
| 2) I have run all the destructors of things that are zapped, but I have allocated more stuff since then, so it |
| is not safe to reclaim this block. |
| |
| This state adds a lot of complexity to our state transition model for MarkedBlocks. We should get rid of it. |
| We can replace this state by making sure mark bits represent all of the liveness information we need when running |
| our conservative stack scan. Instead of zapping the free list when canonicalizing cell liveness data prior to |
| a conservative scan, we can instead mark all objects in the block except for those in the free list. This should |
| incur no performance penalty since we're doing it on a very small O(1) number of blocks at the beginning of the collection. |
| |
| For the time being we still need to use zapping to determine whether we have run an object's destructor or not. |
| |
| * heap/MarkedAllocator.cpp: |
| (JSC::MarkedAllocator::tryAllocateHelper): Renaming stuff. |
| * heap/MarkedAllocator.h: Renamed zapFreeList to canonicalizeCellLivenessData to match. |
| (MarkedAllocator): |
| (JSC::MarkedAllocator::canonicalizeCellLivenessData): Same as old zapFreeList, but just call canonicalize instead. |
| * heap/MarkedBlock.cpp: |
| (JSC::MarkedBlock::specializedSweep): Remove the check for Zapped block stuff. Also change the block state to Marked |
| instead of Zapped if we're not producing a FreeList since that's the only other state that really makes any sense. |
| (JSC::MarkedBlock::sweepHelper): Remove Zapped related code. |
| (SetAllMarksFunctor): Functor to set all the mark bits in the block since there's not a simple function to call on |
| the Bitmap itself. |
| (JSC::SetAllMarksFunctor::operator()): |
| (JSC): |
| (JSC::MarkedBlock::canonicalizeCellLivenessData): Remove all the stuff for Zapped. For FreeListed, set all the mark bits |
| and then clear the ones for the objects in the FreeList. This ensures that only the things that were in the FreeList |
| are considered to be dead by the conservative scan, just like if we were to have zapped the FreeList like before. |
| * heap/MarkedBlock.h: |
| (MarkedBlock): |
| (JSC::MarkedBlock::clearMarked): Add function to clear individual mark bits, since we need that functionality now. |
| (JSC): |
| (JSC::MarkedBlock::isLive): Remove code for Zapped stuff. Marked handles all interesting cases now. |
| (JSC::MarkedBlock::forEachCell): Add new iterator function that iterates over all cells in the block, regardless of |
| whether they're live or a dead. |
| * heap/MarkedSpace.cpp: |
| (JSC::MarkedSpace::canonicalizeCellLivenessData): Change to call the renamed canonicalize function. |
| |
| 2012-09-13 Kevin Funk <kevin.funk@kdab.com> |
| |
| Make compile with both OS(WINCE) and PLATFORM(QT) support |
| https://bugs.webkit.org/show_bug.cgi?id=95536 |
| |
| Reviewed by Simon Hausmann. |
| |
| Do not link against advapi32 on wince |
| |
| * jsc.pro: |
| |
| 2012-09-13 Geoffrey Garen <ggaren@apple.com> |
| |
| Refactored the DFG to make fewer assumptions about variable capture |
| https://bugs.webkit.org/show_bug.cgi?id=96680 |
| |
| Reviewed by Gavin Barraclough. |
| |
| A variable capture optimization patch I'm working on broke DFG |
| correctness and the arguments simplification optimization phase, so I've |
| refactored both to make fewer assumptions about variable capture. |
| |
| * bytecode/CodeBlock.h: |
| (JSC::CodeBlock::isCaptured): This is the new One True Way to find out |
| if a variable was captured. This gives us a single point of maintenance |
| as we chagne capture behavior. |
| |
| * dfg/DFGAbstractState.cpp: |
| (JSC::DFG::AbstractState::clobberCapturedVars): Don't assume that captured |
| variables have any particular location. Instead, ask the One True Function. |
| |
| * dfg/DFGArgumentsSimplificationPhase.cpp: |
| (JSC::DFG::ArgumentsSimplificationPhase::run): |
| (JSC::DFG::ArgumentsSimplificationPhase::observeProperArgumentsUse): |
| (JSC::DFG::ArgumentsSimplificationPhase::isOKToOptimize): Mechanical |
| changes to separate being captured from being 'arguments'. What used |
| to be |
| if (captured) |
| if (arguments) |
| x |
| y |
| is now |
| if (arguments) |
| x |
| y |
| else if (captured) |
| y |
| |
| * dfg/DFGByteCodeParser.cpp: |
| (JSC::DFG::ByteCodeParser::getLocal): |
| (JSC::DFG::ByteCodeParser::setLocal): |
| (JSC::DFG::ByteCodeParser::getArgument): |
| (JSC::DFG::ByteCodeParser::setArgument): |
| (JSC::DFG::ByteCodeParser::flushDirect): |
| (JSC::DFG::ByteCodeParser::parseBlock): |
| (JSC::DFG::ByteCodeParser::InlineStackEntry::InlineStackEntry): |
| * dfg/DFGSpeculativeJIT.cpp: |
| (JSC::DFG::SpeculativeJIT::compile): Use the One True Function. |
| |
| 2012-09-13 Benjamin Poulain <bpoulain@apple.com> |
| |
| Improve the SourceProvider hierarchy |
| https://bugs.webkit.org/show_bug.cgi?id=95635 |
| |
| Reviewed by Geoffrey Garen. |
| |
| SourceProvider was designed to have subclasses magically handling the data without |
| decoding all of it. The virtual methods length() and getRange() were based |
| on these assumptions. |
| |
| In practice, the magic was in our head, there is no implementation that takes |
| advantage of that. |
| |
| SourceProvider is modified to adopt WebCore's ScriptSourceProvider::source() and base |
| everything on it. |
| The code using SourceProvider is also simplified. |
| |
| * interpreter/Interpreter.cpp: |
| (JSC::appendSourceToError): Keep a reference to the string instead of querying it for |
| each time it is used. |
| * parser/Lexer.cpp: |
| (JSC::::setCode): |
| (JSC::::sourceCode): |
| * parser/Parser.h: |
| (JSC::parse): |
| * parser/SourceCode.h: |
| (JSC::SourceCode::SourceCode): |
| (JSC::SourceCode::subExpression): |
| * parser/SourceProvider.h: |
| (SourceProvider): |
| (JSC::SourceProvider::getRange): |
| |
| 2012-09-13 Filip Pizlo <fpizlo@apple.com> |
| |
| DFG: Dead GetButterfly's shouldn't be subject to CSE |
| https://bugs.webkit.org/show_bug.cgi?id=96707 |
| <rdar://problem/12296311> |
| |
| Reviewed by Oliver Hunt. |
| |
| There were a number of cases of this that creeped into the CSE: it would |
| match something even though it was dead. |
| |
| * dfg/DFGCSEPhase.cpp: |
| (JSC::DFG::CSEPhase::getPropertyStorageLoadElimination): |
| (JSC::DFG::CSEPhase::checkArrayElimination): |
| (JSC::DFG::CSEPhase::getIndexedPropertyStorageLoadElimination): |
| (JSC::DFG::CSEPhase::getScopeChainLoadElimination): |
| (JSC::DFG::CSEPhase::getLocalLoadElimination): |
| |
| 2012-09-13 Oliver Hunt <oliver@apple.com> |
| |
| Make global const initialisation explicit in the bytecode |
| https://bugs.webkit.org/show_bug.cgi?id=96711 |
| |
| Reviewed by Gavin Barraclough. |
| |
| Added op_init_global_const to make initialisation of global const |
| fields explicit. This will help us keep correct semantics in the |
| upcoming variable resolution refactoring. |
| |
| * bytecode/CodeBlock.cpp: |
| (JSC::CodeBlock::dump): |
| * bytecode/Opcode.h: |
| (JSC): |
| (JSC::padOpcodeName): |
| * bytecompiler/BytecodeGenerator.cpp: |
| (JSC::BytecodeGenerator::emitInitGlobalConst): |
| (JSC): |
| * bytecompiler/BytecodeGenerator.h: |
| (BytecodeGenerator): |
| * bytecompiler/NodesCodegen.cpp: |
| (JSC::ConstDeclNode::emitCodeSingle): |
| * dfg/DFGByteCodeParser.cpp: |
| (JSC::DFG::ByteCodeParser::parseBlock): |
| * dfg/DFGCapabilities.h: |
| (JSC::DFG::canCompileOpcode): |
| * interpreter/Interpreter.cpp: |
| (JSC::Interpreter::privateExecute): |
| * jit/JIT.cpp: |
| (JSC::JIT::privateCompileMainPass): |
| (JSC::JIT::privateCompileSlowCases): |
| * llint/LowLevelInterpreter32_64.asm: |
| * llint/LowLevelInterpreter64.asm: |
| |
| 2012-09-13 Mark Hahnenberg <mhahnenberg@apple.com> |
| |
| Rename forEachCell to forEachLiveCell |
| https://bugs.webkit.org/show_bug.cgi?id=96685 |
| |
| Reviewed by Oliver Hunt. |
| |
| forEachCell actually only iterates over live cells. We should rename it to |
| reflect what it actually does. This is also helpful because we want to add a new |
| forEachCell that actually does iterate each and every cell in a MarkedBlock |
| regardless of whether or not it is live. |
| |
| * debugger/Debugger.cpp: |
| (JSC::Debugger::recompileAllJSFunctions): |
| * heap/Heap.cpp: |
| (JSC::Heap::globalObjectCount): |
| (JSC::Heap::objectTypeCounts): |
| * heap/MarkedBlock.h: |
| (MarkedBlock): |
| (JSC::MarkedBlock::forEachLiveCell): |
| * heap/MarkedSpace.h: |
| (MarkedSpace): |
| (JSC::MarkedSpace::forEachLiveCell): |
| * runtime/JSGlobalData.cpp: |
| (JSC::JSGlobalData::releaseExecutableMemory): |
| |
| 2012-09-13 Filip Pizlo <fpizlo@apple.com> |
| |
| [Qt][Win] REGRESSION(r128400): It broke the build |
| https://bugs.webkit.org/show_bug.cgi?id=96617 |
| |
| Reviewed by Simon Hausmann. |
| |
| Changed "JSC::Array" to "JSC::ArrayClass" because it's not used often enough |
| for the brevity to be beneficial, and because "Array" causes too much namespace |
| pollution. |
| |
| * runtime/IndexingType.h: |
| (JSC): |
| * runtime/JSArray.cpp: |
| (JSC::JSArray::pop): |
| (JSC::JSArray::push): |
| (JSC::JSArray::sortNumeric): |
| (JSC::JSArray::sort): |
| (JSC::JSArray::fillArgList): |
| (JSC::JSArray::copyToArguments): |
| (JSC::JSArray::compactForSorting): |
| * runtime/JSObject.cpp: |
| (JSC::JSObject::getOwnPropertySlotByIndex): |
| (JSC::JSObject::putByIndex): |
| (JSC::JSObject::ensureArrayStorageExistsAndEnterDictionaryIndexingMode): |
| (JSC::JSObject::deletePropertyByIndex): |
| (JSC::JSObject::getOwnPropertyNames): |
| (JSC::JSObject::putByIndexBeyondVectorLength): |
| (JSC::JSObject::putDirectIndexBeyondVectorLength): |
| (JSC::JSObject::getNewVectorLength): |
| (JSC::JSObject::getOwnPropertyDescriptor): |
| * runtime/JSObject.h: |
| (JSC::JSObject::getArrayLength): |
| (JSC::JSObject::getVectorLength): |
| (JSC::JSObject::canGetIndexQuickly): |
| (JSC::JSObject::canSetIndexQuickly): |
| (JSC::JSObject::inSparseIndexingMode): |
| (JSC::JSObject::ensureArrayStorage): |
| |
| 2012-09-13 Filip Pizlo <fpizlo@apple.com> |
| |
| Testing whether indexing type is ArrayWithArrayStorage should not compare against ArrayWithArrayStorage |
| https://bugs.webkit.org/show_bug.cgi?id=96611 |
| |
| Reviewed by Gavin Barraclough. |
| |
| * dfg/DFGRepatch.cpp: |
| (JSC::DFG::tryCacheGetByID): |
| * dfg/DFGSpeculativeJIT.cpp: |
| (JSC::DFG::SpeculativeJIT::checkArray): |
| * jit/JITPropertyAccess.cpp: |
| (JSC::JIT::privateCompilePatchGetArrayLength): |
| * jit/JITPropertyAccess32_64.cpp: |
| (JSC::JIT::privateCompilePatchGetArrayLength): |
| * llint/LowLevelInterpreter32_64.asm: |
| * llint/LowLevelInterpreter64.asm: |
| |
| 2012-09-09 Filip Pizlo <fpizlo@apple.com> |
| |
| JSC should have property butterflies |
| https://bugs.webkit.org/show_bug.cgi?id=91933 |
| |
| Reviewed by Geoffrey Garen. |
| |
| This changes the JSC object model. Previously, all objects had fast lookup for |
| named properties. Integer indexed properties were only fast if you used a |
| JSArray. With this change, all objects have fast indexed properties. This is |
| accomplished without any space overhead by using a bidirectional object layout, |
| aka butterflies. Each JSObject has a m_butterfly pointer where previously it |
| had a m_outOfLineStorage pointer. To the left of the location pointed to by |
| m_butterfly, we place all named out-of-line properties. To the right, we place |
| all indexed properties along with indexing meta-data. Though, some indexing |
| meta-data is placed in the 8-byte word immediately left of the pointed-to |
| location; this is in anticipation of the indexing meta-data being small enough |
| in the common case that m_butterfly always points to the first indexed |
| property. |
| |
| This is performance neutral, except on tests that use indexed properties on |
| plain objects, where the speed-up is in excess of an order of magnitude. |
| |
| One notable aspect of what this change brings is that it allows indexing |
| storage to morph over time. Currently this is only used to allow all non-array |
| objects to start out without any indexed storage. But it could be used for |
| some kinds of array type inference in the future. |
| |
| * API/JSCallbackObject.h: |
| (JSCallbackObject): |
| * API/JSCallbackObjectFunctions.h: |
| (JSC::::getOwnPropertySlotByIndex): |
| (JSC): |
| (JSC::::getOwnNonIndexPropertyNames): |
| * API/JSObjectRef.cpp: |
| * CMakeLists.txt: |
| * GNUmakefile.list.am: |
| * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.def: |
| * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: |
| * JavaScriptCore.xcodeproj/project.pbxproj: |
| * Target.pri: |
| * bytecode/ArrayProfile.h: |
| (JSC): |
| (JSC::arrayModeFromStructure): |
| * bytecompiler/BytecodeGenerator.cpp: |
| (JSC::BytecodeGenerator::emitDirectPutById): |
| * dfg/DFGAbstractState.cpp: |
| (JSC::DFG::AbstractState::execute): |
| * dfg/DFGAdjacencyList.h: |
| (JSC::DFG::AdjacencyList::AdjacencyList): |
| (AdjacencyList): |
| * dfg/DFGArrayMode.cpp: |
| (JSC::DFG::fromObserved): |
| (JSC::DFG::modeAlreadyChecked): |
| (JSC::DFG::modeToString): |
| * dfg/DFGArrayMode.h: |
| (DFG): |
| (JSC::DFG::modeUsesButterfly): |
| (JSC::DFG::modeIsJSArray): |
| (JSC::DFG::isInBoundsAccess): |
| (JSC::DFG::modeSupportsLength): |
| * dfg/DFGByteCodeParser.cpp: |
| (JSC::DFG::ByteCodeParser::handleGetByOffset): |
| (JSC::DFG::ByteCodeParser::parseBlock): |
| * dfg/DFGCSEPhase.cpp: |
| (JSC::DFG::CSEPhase::getPropertyStorageLoadElimination): |
| (JSC::DFG::CSEPhase::performNodeCSE): |
| * dfg/DFGFixupPhase.cpp: |
| (JSC::DFG::FixupPhase::fixupNode): |
| (JSC::DFG::FixupPhase::addNode): |
| (FixupPhase): |
| (JSC::DFG::FixupPhase::checkArray): |
| * dfg/DFGGraph.h: |
| (JSC::DFG::Graph::byValIsPure): |
| * dfg/DFGNode.h: |
| (JSC::DFG::Node::Node): |
| (Node): |
| * dfg/DFGNodeType.h: |
| (DFG): |
| * dfg/DFGOperations.cpp: |
| (JSC::DFG::putByVal): |
| * dfg/DFGOperations.h: |
| * dfg/DFGPredictionPropagationPhase.cpp: |
| (JSC::DFG::PredictionPropagationPhase::propagate): |
| * dfg/DFGRepatch.cpp: |
| (JSC::DFG::generateProtoChainAccessStub): |
| (JSC::DFG::tryCacheGetByID): |
| (JSC::DFG::tryBuildGetByIDList): |
| (JSC::DFG::emitPutReplaceStub): |
| (JSC::DFG::emitPutTransitionStub): |
| (JSC::DFG::tryBuildPutByIdList): |
| * dfg/DFGSpeculativeJIT.cpp: |
| (JSC::DFG::SpeculativeJIT::checkArray): |
| (JSC::DFG::SpeculativeJIT::compileGetIndexedPropertyStorage): |
| (JSC::DFG::SpeculativeJIT::compileGetArrayLength): |
| (JSC::DFG::SpeculativeJIT::compileAllocatePropertyStorage): |
| (JSC::DFG::SpeculativeJIT::compileReallocatePropertyStorage): |
| * dfg/DFGSpeculativeJIT.h: |
| (JSC::DFG::SpeculativeJIT::callOperation): |
| (JSC::DFG::SpeculativeJIT::emitAllocateBasicJSObject): |
| * dfg/DFGSpeculativeJIT32_64.cpp: |
| (JSC::DFG::SpeculativeJIT::cachedGetById): |
| (JSC::DFG::SpeculativeJIT::cachedPutById): |
| (JSC::DFG::SpeculativeJIT::compile): |
| * dfg/DFGSpeculativeJIT64.cpp: |
| (JSC::DFG::SpeculativeJIT::cachedGetById): |
| (JSC::DFG::SpeculativeJIT::cachedPutById): |
| (JSC::DFG::SpeculativeJIT::compile): |
| * dfg/DFGStructureCheckHoistingPhase.cpp: |
| (JSC::DFG::StructureCheckHoistingPhase::run): |
| * heap/CopiedSpace.h: |
| (CopiedSpace): |
| * jit/JIT.h: |
| * jit/JITInlineMethods.h: |
| (JSC::JIT::emitAllocateBasicJSObject): |
| (JSC::JIT::emitAllocateBasicStorage): |
| (JSC::JIT::emitAllocateJSArray): |
| * jit/JITOpcodes.cpp: |
| (JSC::JIT::emit_op_new_array): |
| (JSC::JIT::emitSlow_op_new_array): |
| * jit/JITPropertyAccess.cpp: |
| (JSC::JIT::emit_op_get_by_val): |
| (JSC::JIT::compileGetDirectOffset): |
| (JSC::JIT::emit_op_put_by_val): |
| (JSC::JIT::compileGetByIdHotPath): |
| (JSC::JIT::emit_op_put_by_id): |
| (JSC::JIT::compilePutDirectOffset): |
| (JSC::JIT::privateCompilePatchGetArrayLength): |
| * jit/JITPropertyAccess32_64.cpp: |
| (JSC::JIT::emit_op_get_by_val): |
| (JSC::JIT::emit_op_put_by_val): |
| (JSC::JIT::compileGetByIdHotPath): |
| (JSC::JIT::emit_op_put_by_id): |
| (JSC::JIT::compilePutDirectOffset): |
| (JSC::JIT::compileGetDirectOffset): |
| (JSC::JIT::privateCompilePatchGetArrayLength): |
| * jit/JITStubs.cpp: |
| (JSC::DEFINE_STUB_FUNCTION): |
| * jsc.cpp: |
| * llint/LLIntSlowPaths.cpp: |
| (JSC::LLInt::LLINT_SLOW_PATH_DECL): |
| * llint/LowLevelInterpreter.asm: |
| * llint/LowLevelInterpreter32_64.asm: |
| * llint/LowLevelInterpreter64.asm: |
| * runtime/Arguments.cpp: |
| (JSC::Arguments::deletePropertyByIndex): |
| (JSC::Arguments::defineOwnProperty): |
| * runtime/ArrayConstructor.cpp: |
| * runtime/ArrayConventions.h: Added. |
| (JSC): |
| (JSC::isDenseEnoughForVector): |
| (JSC::indexingHeaderForArray): |
| (JSC::baseIndexingHeaderForArray): |
| * runtime/ArrayPrototype.cpp: |
| (JSC::ArrayPrototype::create): |
| (JSC): |
| (JSC::ArrayPrototype::ArrayPrototype): |
| (JSC::arrayProtoFuncToString): |
| (JSC::arrayProtoFuncJoin): |
| (JSC::arrayProtoFuncSort): |
| (JSC::arrayProtoFuncFilter): |
| (JSC::arrayProtoFuncMap): |
| (JSC::arrayProtoFuncEvery): |
| (JSC::arrayProtoFuncForEach): |
| (JSC::arrayProtoFuncSome): |
| (JSC::arrayProtoFuncReduce): |
| (JSC::arrayProtoFuncReduceRight): |
| * runtime/ArrayPrototype.h: |
| (ArrayPrototype): |
| (JSC::ArrayPrototype::createStructure): |
| * runtime/ArrayStorage.h: Added. |
| (JSC): |
| (ArrayStorage): |
| (JSC::ArrayStorage::ArrayStorage): |
| (JSC::ArrayStorage::from): |
| (JSC::ArrayStorage::butterfly): |
| (JSC::ArrayStorage::indexingHeader): |
| (JSC::ArrayStorage::length): |
| (JSC::ArrayStorage::setLength): |
| (JSC::ArrayStorage::vectorLength): |
| (JSC::ArrayStorage::setVectorLength): |
| (JSC::ArrayStorage::copyHeaderFromDuringGC): |
| (JSC::ArrayStorage::inSparseMode): |
| (JSC::ArrayStorage::lengthOffset): |
| (JSC::ArrayStorage::vectorLengthOffset): |
| (JSC::ArrayStorage::numValuesInVectorOffset): |
| (JSC::ArrayStorage::vectorOffset): |
| (JSC::ArrayStorage::indexBiasOffset): |
| (JSC::ArrayStorage::sparseMapOffset): |
| (JSC::ArrayStorage::sizeFor): |
| * runtime/Butterfly.h: Added. |
| (JSC): |
| (Butterfly): |
| (JSC::Butterfly::Butterfly): |
| (JSC::Butterfly::totalSize): |
| (JSC::Butterfly::fromBase): |
| (JSC::Butterfly::offsetOfIndexingHeader): |
| (JSC::Butterfly::offsetOfPublicLength): |
| (JSC::Butterfly::offsetOfVectorLength): |
| (JSC::Butterfly::indexingHeader): |
| (JSC::Butterfly::propertyStorage): |
| (JSC::Butterfly::indexingPayload): |
| (JSC::Butterfly::arrayStorage): |
| (JSC::Butterfly::offsetOfPropertyStorage): |
| (JSC::Butterfly::indexOfPropertyStorage): |
| (JSC::Butterfly::base): |
| * runtime/ButterflyInlineMethods.h: Added. |
| (JSC): |
| (JSC::Butterfly::createUninitialized): |
| (JSC::Butterfly::create): |
| (JSC::Butterfly::createUninitializedDuringCollection): |
| (JSC::Butterfly::base): |
| (JSC::Butterfly::growPropertyStorage): |
| (JSC::Butterfly::growArrayRight): |
| (JSC::Butterfly::resizeArray): |
| (JSC::Butterfly::unshift): |
| (JSC::Butterfly::shift): |
| * runtime/ClassInfo.h: |
| (MethodTable): |
| (JSC): |
| * runtime/IndexingHeader.h: Added. |
| (JSC): |
| (IndexingHeader): |
| (JSC::IndexingHeader::offsetOfIndexingHeader): |
| (JSC::IndexingHeader::offsetOfPublicLength): |
| (JSC::IndexingHeader::offsetOfVectorLength): |
| (JSC::IndexingHeader::IndexingHeader): |
| (JSC::IndexingHeader::vectorLength): |
| (JSC::IndexingHeader::setVectorLength): |
| (JSC::IndexingHeader::publicLength): |
| (JSC::IndexingHeader::setPublicLength): |
| (JSC::IndexingHeader::from): |
| (JSC::IndexingHeader::fromEndOf): |
| (JSC::IndexingHeader::propertyStorage): |
| (JSC::IndexingHeader::arrayStorage): |
| (JSC::IndexingHeader::butterfly): |
| * runtime/IndexingHeaderInlineMethods.h: Added. |
| (JSC): |
| (JSC::IndexingHeader::preCapacity): |
| (JSC::IndexingHeader::indexingPayloadSizeInBytes): |
| * runtime/IndexingType.h: Added. |
| (JSC): |
| (JSC::hasIndexingHeader): |
| * runtime/JSActivation.cpp: |
| (JSC::JSActivation::JSActivation): |
| (JSC::JSActivation::visitChildren): |
| (JSC::JSActivation::getOwnNonIndexPropertyNames): |
| * runtime/JSActivation.h: |
| (JSActivation): |
| (JSC::JSActivation::tearOff): |
| * runtime/JSArray.cpp: |
| (JSC): |
| (JSC::createArrayButterflyInDictionaryIndexingMode): |
| (JSC::JSArray::setLengthWritable): |
| (JSC::JSArray::defineOwnProperty): |
| (JSC::JSArray::getOwnPropertySlot): |
| (JSC::JSArray::getOwnPropertyDescriptor): |
| (JSC::JSArray::put): |
| (JSC::JSArray::deleteProperty): |
| (JSC::JSArray::getOwnNonIndexPropertyNames): |
| (JSC::JSArray::unshiftCountSlowCase): |
| (JSC::JSArray::setLength): |
| (JSC::JSArray::pop): |
| (JSC::JSArray::push): |
| (JSC::JSArray::shiftCount): |
| (JSC::JSArray::unshiftCount): |
| (JSC::JSArray::sortNumeric): |
| (JSC::JSArray::sort): |
| (JSC::JSArray::fillArgList): |
| (JSC::JSArray::copyToArguments): |
| (JSC::JSArray::compactForSorting): |
| * runtime/JSArray.h: |
| (JSC): |
| (JSArray): |
| (JSC::JSArray::JSArray): |
| (JSC::JSArray::length): |
| (JSC::JSArray::createStructure): |
| (JSC::JSArray::isLengthWritable): |
| (JSC::createArrayButterfly): |
| (JSC::JSArray::create): |
| (JSC::JSArray::tryCreateUninitialized): |
| * runtime/JSBoundFunction.cpp: |
| (JSC::boundFunctionCall): |
| (JSC::boundFunctionConstruct): |
| (JSC::JSBoundFunction::finishCreation): |
| * runtime/JSCell.cpp: |
| (JSC::JSCell::getOwnNonIndexPropertyNames): |
| (JSC): |
| * runtime/JSCell.h: |
| (JSCell): |
| * runtime/JSFunction.cpp: |
| (JSC::JSFunction::getOwnPropertySlot): |
| (JSC::JSFunction::getOwnPropertyDescriptor): |
| (JSC::JSFunction::getOwnNonIndexPropertyNames): |
| (JSC::JSFunction::defineOwnProperty): |
| * runtime/JSFunction.h: |
| (JSFunction): |
| * runtime/JSGlobalData.cpp: |
| (JSC::JSGlobalData::JSGlobalData): |
| * runtime/JSGlobalData.h: |
| (JSGlobalData): |
| * runtime/JSGlobalObject.cpp: |
| (JSC::JSGlobalObject::reset): |
| * runtime/JSONObject.cpp: |
| (JSC::Stringifier::Holder::appendNextProperty): |
| (JSC::Walker::walk): |
| * runtime/JSObject.cpp: |
| (JSC): |
| (JSC::JSObject::visitButterfly): |
| (JSC::JSObject::visitChildren): |
| (JSC::JSFinalObject::visitChildren): |
| (JSC::JSObject::getOwnPropertySlotByIndex): |
| (JSC::JSObject::put): |
| (JSC::JSObject::putByIndex): |
| (JSC::JSObject::enterDictionaryIndexingModeWhenArrayStorageAlreadyExists): |
| (JSC::JSObject::enterDictionaryIndexingMode): |
| (JSC::JSObject::createArrayStorage): |
| (JSC::JSObject::createInitialArrayStorage): |
| (JSC::JSObject::ensureArrayStorageExistsAndEnterDictionaryIndexingMode): |
| (JSC::JSObject::putDirectAccessor): |
| (JSC::JSObject::deleteProperty): |
| (JSC::JSObject::deletePropertyByIndex): |
| (JSC::JSObject::getOwnPropertyNames): |
| (JSC::JSObject::getOwnNonIndexPropertyNames): |
| (JSC::JSObject::preventExtensions): |
| (JSC::JSObject::fillGetterPropertySlot): |
| (JSC::JSObject::putIndexedDescriptor): |
| (JSC::JSObject::defineOwnIndexedProperty): |
| (JSC::JSObject::allocateSparseIndexMap): |
| (JSC::JSObject::deallocateSparseIndexMap): |
| (JSC::JSObject::putByIndexBeyondVectorLengthWithArrayStorage): |
| (JSC::JSObject::putByIndexBeyondVectorLength): |
| (JSC::JSObject::putDirectIndexBeyondVectorLengthWithArrayStorage): |
| (JSC::JSObject::putDirectIndexBeyondVectorLength): |
| (JSC::JSObject::getNewVectorLength): |
| (JSC::JSObject::increaseVectorLength): |
| (JSC::JSObject::checkIndexingConsistency): |
| (JSC::JSObject::growOutOfLineStorage): |
| (JSC::JSObject::getOwnPropertyDescriptor): |
| (JSC::putDescriptor): |
| (JSC::JSObject::putDirectMayBeIndex): |
| (JSC::JSObject::defineOwnNonIndexProperty): |
| (JSC::JSObject::defineOwnProperty): |
| (JSC::JSObject::getOwnPropertySlotSlow): |
| * runtime/JSObject.h: |
| (JSC::JSObject::getArrayLength): |
| (JSObject): |
| (JSC::JSObject::getVectorLength): |
| (JSC::JSObject::putDirectIndex): |
| (JSC::JSObject::canGetIndexQuickly): |
| (JSC::JSObject::getIndexQuickly): |
| (JSC::JSObject::canSetIndexQuickly): |
| (JSC::JSObject::setIndexQuickly): |
| (JSC::JSObject::initializeIndex): |
| (JSC::JSObject::completeInitialization): |
| (JSC::JSObject::inSparseIndexingMode): |
| (JSC::JSObject::butterfly): |
| (JSC::JSObject::outOfLineStorage): |
| (JSC::JSObject::offsetForLocation): |
| (JSC::JSObject::indexingShouldBeSparse): |
| (JSC::JSObject::butterflyOffset): |
| (JSC::JSObject::butterflyAddress): |
| (JSC::JSObject::arrayStorage): |
| (JSC::JSObject::arrayStorageOrZero): |
| (JSC::JSObject::ensureArrayStorage): |
| (JSC::JSObject::checkIndexingConsistency): |
| (JSC::JSNonFinalObject::JSNonFinalObject): |
| (JSC): |
| (JSC::JSObject::setButterfly): |
| (JSC::JSObject::setButterflyWithoutChangingStructure): |
| (JSC::JSObject::JSObject): |
| (JSC::JSObject::inlineGetOwnPropertySlot): |
| (JSC::JSObject::putDirectInternal): |
| (JSC::JSObject::setStructureAndReallocateStorageIfNecessary): |
| (JSC::JSObject::putDirectWithoutTransition): |
| (JSC::offsetInButterfly): |
| (JSC::offsetRelativeToPatchedStorage): |
| (JSC::indexRelativeToBase): |
| (JSC::offsetRelativeToBase): |
| * runtime/JSPropertyNameIterator.cpp: |
| (JSC::JSPropertyNameIterator::create): |
| * runtime/JSSymbolTableObject.cpp: |
| (JSC::JSSymbolTableObject::getOwnNonIndexPropertyNames): |
| * runtime/JSSymbolTableObject.h: |
| (JSSymbolTableObject): |
| * runtime/JSTypeInfo.h: |
| (JSC): |
| (JSC::TypeInfo::interceptsGetOwnPropertySlotByIndexEvenWhenLengthIsNotZero): |
| (JSC::TypeInfo::overridesGetPropertyNames): |
| * runtime/LiteralParser.cpp: |
| (JSC::::parse): |
| * runtime/ObjectConstructor.cpp: |
| * runtime/ObjectPrototype.cpp: |
| (JSC::ObjectPrototype::ObjectPrototype): |
| (JSC): |
| * runtime/ObjectPrototype.h: |
| (ObjectPrototype): |
| * runtime/PropertyOffset.h: |
| (JSC::offsetInOutOfLineStorage): |
| * runtime/PropertyStorage.h: Added. |
| (JSC): |
| * runtime/PutDirectIndexMode.h: Added. |
| (JSC): |
| * runtime/RegExpMatchesArray.cpp: |
| (JSC::RegExpMatchesArray::RegExpMatchesArray): |
| (JSC): |
| (JSC::RegExpMatchesArray::create): |
| (JSC::RegExpMatchesArray::finishCreation): |
| * runtime/RegExpMatchesArray.h: |
| (RegExpMatchesArray): |
| (JSC::RegExpMatchesArray::createStructure): |
| * runtime/RegExpObject.cpp: |
| (JSC::RegExpObject::getOwnNonIndexPropertyNames): |
| * runtime/RegExpObject.h: |
| (RegExpObject): |
| * runtime/Reject.h: Added. |
| (JSC): |
| (JSC::reject): |
| * runtime/SparseArrayValueMap.cpp: Added. |
| (JSC): |
| * runtime/SparseArrayValueMap.h: Added. |
| (JSC): |
| (SparseArrayEntry): |
| (JSC::SparseArrayEntry::SparseArrayEntry): |
| (SparseArrayValueMap): |
| (JSC::SparseArrayValueMap::sparseMode): |
| (JSC::SparseArrayValueMap::setSparseMode): |
| (JSC::SparseArrayValueMap::lengthIsReadOnly): |
| (JSC::SparseArrayValueMap::setLengthIsReadOnly): |
| (JSC::SparseArrayValueMap::find): |
| (JSC::SparseArrayValueMap::remove): |
| (JSC::SparseArrayValueMap::notFound): |
| (JSC::SparseArrayValueMap::isEmpty): |
| (JSC::SparseArrayValueMap::contains): |
| (JSC::SparseArrayValueMap::size): |
| (JSC::SparseArrayValueMap::begin): |
| (JSC::SparseArrayValueMap::end): |
| * runtime/SparseArrayValueMapInlineMethods.h: Added. |
| (JSC): |
| (JSC::SparseArrayValueMap::SparseArrayValueMap): |
| (JSC::SparseArrayValueMap::~SparseArrayValueMap): |
| (JSC::SparseArrayValueMap::finishCreation): |
| (JSC::SparseArrayValueMap::create): |
| (JSC::SparseArrayValueMap::destroy): |
| (JSC::SparseArrayValueMap::createStructure): |
| (JSC::SparseArrayValueMap::add): |
| (JSC::SparseArrayValueMap::putEntry): |
| (JSC::SparseArrayValueMap::putDirect): |
| (JSC::SparseArrayEntry::get): |
| (JSC::SparseArrayEntry::getNonSparseMode): |
| (JSC::SparseArrayValueMap::visitChildren): |
| * runtime/StorageBarrier.h: Removed. |
| * runtime/StringObject.cpp: |
| (JSC::StringObject::putByIndex): |
| (JSC): |
| (JSC::StringObject::deletePropertyByIndex): |
| * runtime/StringObject.h: |
| (StringObject): |
| * runtime/StringPrototype.cpp: |
| * runtime/Structure.cpp: |
| (JSC::Structure::Structure): |
| (JSC::Structure::materializePropertyMap): |
| (JSC::Structure::nonPropertyTransition): |
| (JSC): |
| * runtime/Structure.h: |
| (Structure): |
| (JSC::Structure::indexingType): |
| (JSC::Structure::indexingTypeIncludingHistory): |
| (JSC::Structure::indexingTypeOffset): |
| (JSC::Structure::create): |
| * runtime/StructureTransitionTable.h: |
| (JSC): |
| (JSC::toAttributes): |
| (JSC::newIndexingType): |
| (JSC::StructureTransitionTable::Hash::hash): |
| * tests/mozilla/js1_6/Array/regress-304828.js: |
| |
| 2012-09-12 Mark Lam <mark.lam@apple.com> |
| |
| Refactor Opcodes to distinguish between core and extension opcodes. |
| https://bugs.webkit.org/show_bug.cgi?id=96466. |
| |
| Reviewed by Filip Pizlo. |
| |
| * bytecode/Opcode.h: |
| (JSC): Added FOR_EACH_CORE_OPCODE_ID() macro. |
| * llint/LowLevelInterpreter.h: |
| (JSC): Auto-generate llint opcode aliases using the |
| FOR_EACH_CORE_OPCODE_ID() macro. |
| |
| 2012-09-11 Geoffrey Garen <ggaren@apple.com> |
| |
| Second step to fixing the Windows build: Add new symbols. |
| |
| * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.def: |
| |
| 2012-09-11 Geoffrey Garen <ggaren@apple.com> |
| |
| First step to fixing the Windows build: Remove old symbols. |
| |
| * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.def: |
| |
| 2012-09-11 Geoffrey Garen <ggaren@apple.com> |
| |
| Don't allocate a backing store just for a function's name |
| https://bugs.webkit.org/show_bug.cgi?id=96468 |
| |
| Reviewed by Oliver Hunt. |
| |
| Treat function.name like function.length etc., and use a custom getter. |
| This saves space in closures. |
| |
| * debugger/DebuggerCallFrame.cpp: |
| (JSC::DebuggerCallFrame::functionName): |
| * debugger/DebuggerCallFrame.h: |
| (DebuggerCallFrame): Updated for interface change. |
| |
| * runtime/Executable.h: |
| (JSC::JSFunction::JSFunction): Do a little inlining. |
| |
| * runtime/JSFunction.cpp: |
| (JSC::JSFunction::finishCreation): Gone now. That's the point of the patch. |
| |
| (JSC::JSFunction::name): |
| (JSC::JSFunction::displayName): |
| (JSC::JSFunction::nameGetter): |
| (JSC::JSFunction::getOwnPropertySlot): |
| (JSC::JSFunction::getOwnPropertyDescriptor): |
| (JSC::JSFunction::getOwnPropertyNames): |
| (JSC::JSFunction::put): |
| (JSC::JSFunction::deleteProperty): |
| (JSC::JSFunction::defineOwnProperty): Added custom accessors for .name |
| just like .length and others. |
| |
| * runtime/JSFunction.h: |
| (JSC::JSFunction::create): |
| (JSFunction): Updated for interface changes. |
| |
| 2012-09-11 Mark Hahnenberg <mhahnenberg@apple.com> |
| |
| IncrementalSweeper should not sweep/free Zapped blocks |
| https://bugs.webkit.org/show_bug.cgi?id=96464 |
| |
| Reviewed by Filip Pizlo. |
| |
| This is not beneficial in terms of performance because there isn't any way a block can emerge |
| in the Zapped state from a call to Heap::collect() unless we run an eager sweep on it, in which |
| case we've already run all the destructors we possibly can. This also causes bugs since we don't |
| take zapped-ness into account when determining whether or not a block is empty to free it. The |
| incremental sweeper can then accidentally free blocks that it thinks are empty but are in fact |
| zapped with still-live objects in them. |
| |
| * heap/MarkedBlock.h: |
| (JSC::MarkedBlock::needsSweeping): It is only valid to sweep a block if it is in the Marked state. |
| |
| 2012-09-11 Geoffrey Garen <ggaren@apple.com> |
| |
| JSActivation should inline allocate its registers, and eliminate |
| 'arguments' registers in the common case |
| https://bugs.webkit.org/show_bug.cgi?id=96427 |
| |
| Reviewed by Filip Pizlo. |
| |
| This cuts the size class for simple closures down to 64 bytes. |
| |
| * bytecompiler/BytecodeGenerator.cpp: |
| (JSC::BytecodeGenerator::BytecodeGenerator): Set the usesNonStrictEval |
| flag, which is new. Use a more specific test for whether a function |
| uses 'arguments', so we can avoid allocating, initializing, and tearing |
| off those registers in the common case. Distinguish between capturing |
| arguments and not, so we can avoid allocating space for arguments in |
| the torn-off object. |
| |
| We can make this even more general in the future, with some bytecode |
| generator refactoring. |
| |
| (JSC::BytecodeGenerator::resolve): Updated for new interface. |
| |
| * bytecompiler/BytecodeGenerator.h: |
| (BytecodeGenerator): |
| (JSC::BytecodeGenerator::symbolTable): Updated some types. |
| |
| * heap/Heap.cpp: |
| (JSC::Heap::isValidAllocation): Allow large allocations, now that they |
| are both supported and used. |
| |
| * heap/Heap.h: |
| (Heap): Added a new form of allocateCell that specifies the full size |
| of the allocation, to allow for extra space on the end. |
| |
| * interpreter/CallFrame.h: |
| (JSC::ExecState::argumentOffset): |
| (JSC::ExecState::argumentOffsetIncludingThis): |
| * interpreter/Interpreter.cpp: |
| (JSC::Interpreter::unwindCallFrame): Refactored this code to be more |
| specific about tearing off 'arguments' vs activations. This is something |
| I forgot in my last patch, and it is required now that we can have |
| acitvations without 'arguments' registers. |
| |
| * runtime/Arguments.h: |
| (JSC::Arguments::setRegisters): No need for setRegisters anymore because |
| the activation object's storage doesn't change. |
| |
| * runtime/JSActivation.cpp: |
| (JSC::JSActivation::JSActivation): Initialize our storage manually because |
| it's not declared to the C++ compiler. |
| |
| (JSC::JSActivation::visitChildren): No copyAndAppend because our storage |
| is not out-of-line anymore. |
| |
| (JSC::JSActivation::symbolTableGet): |
| (JSC::JSActivation::symbolTablePut): |
| (JSC::JSActivation::getOwnPropertyNames): |
| (JSC::JSActivation::symbolTablePutWithAttributes): |
| (JSC::JSActivation::getOwnPropertySlot): |
| (JSC::JSActivation::getOwnPropertyDescriptor): |
| (JSC::JSActivation::argumentsGetter): Refactored isTornOff() testing to |
| avoid using a data member and to avoid hard-coding any offset assumptions. |
| |
| * runtime/JSActivation.h: |
| (JSC): |
| (JSActivation): |
| (JSC::JSActivation::create): |
| (JSC::JSActivation::isDynamicScope): |
| (JSC::JSActivation::captureStart): |
| (JSC::JSActivation::storageSize): |
| (JSC::JSActivation::storageSizeInBytes): |
| (JSC::JSActivation::registerOffset): |
| (JSC::JSActivation::tearOff): |
| (JSC::JSActivation::isTornOff): |
| (JSC::JSActivation::storage): |
| (JSC::JSActivation::allocationSize): |
| (JSC::JSActivation::isValid): New helper functions for doing the math |
| on our inline storage. Note that in the "AllOfTheThings" tear-off case, |
| the number of things is not known at compile time, so we store the |
| number in the argument count register. We can't just copy the raw contents |
| of the register beacuse we need a value that is safe for precise marking, |
| and the value in the register file has an invalid tag. |
| |
| * runtime/JSCell.h: |
| (JSC::allocateCell): New function for allocating with extra storage |
| on the end. |
| |
| * runtime/JSSymbolTableObject.h: |
| (JSC::JSSymbolTableObject::JSSymbolTableObject): |
| (JSC::JSSymbolTableObject::finishCreation): |
| * runtime/JSVariableObject.h: |
| (JSC::JSVariableObject::JSVariableObject): |
| (JSVariableObject): Make it easier for subclasses to use their symbol |
| tables during construction, by passing the table as a constructor argument. |
| |
| * runtime/SymbolTable.h: |
| (JSC::SharedSymbolTable::usesNonStrictEval): |
| (JSC::SharedSymbolTable::setUsesNonStrictEval): |
| (SharedSymbolTable): |
| (JSC::SharedSymbolTable::captureMode): |
| (JSC::SharedSymbolTable::setCaptureMode): |
| (JSC::SharedSymbolTable::captureStart): |
| (JSC::SharedSymbolTable::setCaptureStart): |
| (JSC::SharedSymbolTable::captureEnd): |
| (JSC::SharedSymbolTable::setCaptureEnd): |
| (JSC::SharedSymbolTable::parameterCountIncludingThis): |
| (JSC::SharedSymbolTable::setParameterCountIncludingThis): |
| (JSC::SharedSymbolTable::SharedSymbolTable): Added data members to more |
| precisely describe what kind of capture is in play, and to avoid having |
| data members in the activation. We expect N activations per symbol table, |
| so this can be a big savings in heavy closure usage. |
| |
| 2012-09-11 Ryuan Choi <ryuan.choi@samsung.com> |
| |
| Fix build break with LLINT on 32bit machine after r128219 |
| https://bugs.webkit.org/show_bug.cgi?id=96461 |
| |
| Unreviewed build fix. |
| |
| * llint/LowLevelInterpreter32_64.asm: Fixed typo. |
| |
| 2012-09-11 Michael Saboff <msaboff@apple.com> |
| |
| Build fixed for http://trac.webkit.org/changeset/128243 |
| |
| Rubber stamped by Stephanie Lewis. |
| |
| Added missing include file needed by 96422. |
| |
| * icu/unicode/unorm2.h: Added. |
| |
| 2012-09-11 Michael Saboff <msaboff@apple.com> |
| |
| Build fixed for http://trac.webkit.org/changeset/128243 |
| |
| Rubber stamped by Stephanie Lewis. |
| |
| Added missing include file needed by 96422. |
| |
| * icu/unicode/ptypes.h: Added. |
| |
| 2012-09-11 Michael Saboff <msaboff@apple.com> |
| |
| Update ICU header files to more recent version |
| https://bugs.webkit.org/show_bug.cgi?id=96422 |
| |
| Reviewed by Geoff Garen. |
| |
| Updated ICU header files to 4.6.1. Modifications made as part of the merge are: |
| platform.h - Changed ifndef / define / endif for U_HAVE_UINT8_T, U_HAVE_UINT16_T, U_HAVE_UINT32_T, |
| U_HAVE_UINT64_T, U_IS_BIG_ENDIAN and U_ENABLE_TRACING to match the existing platform.h |
| putil.h (line 132) - Changes defined(U_WINDOWS) to defined(WIN32) || defined(OS2) to match existing putil.h |
| ustring.h (line 945) - Wrapped macro argument cs with { (const UChar *)cs } to match existing ustring.h |
| utypes.h (line 545) - Changed defined(U_WINDOWS) to defined(WIN32) to match existing utypes.h |
| |
| * icu/unicode/localpointer.h: Added. |
| * icu/unicode/parseerr.h: |
| * icu/unicode/platform.h: |
| * icu/unicode/putil.h: |
| * icu/unicode/uchar.h: |
| * icu/unicode/ucnv.h: |
| * icu/unicode/ucnv_err.h: |
| * icu/unicode/ucol.h: |
| * icu/unicode/uconfig.h: |
| * icu/unicode/uenum.h: |
| * icu/unicode/uiter.h: |
| * icu/unicode/uloc.h: |
| * icu/unicode/umachine.h: |
| * icu/unicode/unorm.h: |
| * icu/unicode/urename.h: |
| * icu/unicode/uscript.h: |
| * icu/unicode/uset.h: |
| * icu/unicode/ustring.h: |
| * icu/unicode/utf.h: |
| * icu/unicode/utf16.h: |
| * icu/unicode/utf8.h: |
| * icu/unicode/utypes.h: |
| * icu/unicode/uvernum.h: Added. |
| * icu/unicode/uversion.h: |
| |
| 2012-09-11 Matt Lilek <mrl@apple.com> |
| |
| OS X port should compile with newer versions of clang |
| https://bugs.webkit.org/show_bug.cgi?id=96434 |
| |
| m_identIsVarDecl is unused - remove it. |
| |
| Reviewed by Anders Carlsson. |
| |
| * parser/NodeConstructors.h: |
| (JSC::ForInNode::ForInNode): |
| * parser/Nodes.h: |
| (ForInNode): |
| |
| 2012-09-11 Filip Pizlo <fpizlo@apple.com> |
| |
| LLInt should optimize and profile array length accesses |
| https://bugs.webkit.org/show_bug.cgi?id=96417 |
| |
| Reviewed by Oliver Hunt. |
| |
| This fixes the following hole in our array profiling strategy, where the array |
| is large (more than 1000 elements): |
| |
| for (var i = 0; i < array.length; ++i) ... |
| |
| The peeled use of array.length (in the array prologue) will execute only once |
| before DFG optimization kicks in from the loop's OSR point. Since it executed |
| only once, it executed in the LLInt. And prior to this patch, the LLInt did |
| not profile array.length accesses - so the DFG will assume, based on the lack |
| of profiling, that the access is in fact not an access to the JSArray length |
| property. That could then impede our ability to hoist the array structure |
| check, and may make us pessimistic in other ways as well, since the generic |
| GetById used for the array length access will be viewed as a side-effecting |
| operation. |
| |
| * bytecode/CodeBlock.cpp: |
| (JSC::CodeBlock::printGetByIdCacheStatus): |
| (JSC::CodeBlock::finalizeUnconditionally): |
| * bytecode/GetByIdStatus.cpp: |
| (JSC::GetByIdStatus::computeFromLLInt): |
| * dfg/DFGByteCodeParser.cpp: |
| (JSC::DFG::ByteCodeParser::parseBlock): |
| * dfg/DFGCapabilities.h: |
| (JSC::DFG::canCompileOpcode): |
| * dfg/DFGFixupPhase.cpp: |
| (JSC::DFG::FixupPhase::fixupNode): |
| * jit/JIT.cpp: |
| (JSC::JIT::privateCompileMainPass): |
| (JSC::JIT::privateCompileSlowCases): |
| * llint/LLIntSlowPaths.cpp: |
| (JSC::LLInt::LLINT_SLOW_PATH_DECL): |
| * llint/LowLevelInterpreter.asm: |
| * llint/LowLevelInterpreter32_64.asm: |
| * llint/LowLevelInterpreter64.asm: |
| |
| 2012-09-11 Raphael Kubo da Costa <rakuco@webkit.org> |
| |
| [EFL] Rewrite the EFL-related Find modules |
| https://bugs.webkit.org/show_bug.cgi?id=95237 |
| |
| Reviewed by Kenneth Rohde Christiansen. |
| |
| * CMakeLists.txt: Stop setting the LINK_FLAGS property. |
| * PlatformEfl.cmake: Ditto. |
| * shell/PlatformEfl.cmake: Ditto. |
| |
| 2012-09-11 Raphael Kubo da Costa <rakuco@webkit.org> |
| |
| [EFL] Unreviewed build fix after r128065. |
| |
| * CMakeLists.txt: Link against WTF for FastMalloc symbols, which |
| are needed when building with SYSTEM_MALLOC off. |
| |
| 2012-09-10 Mark Hahnenberg <mhahnenberg@apple.com> |
| |
| Remove m_classInfo from JSCell |
| https://bugs.webkit.org/show_bug.cgi?id=96311 |
| |
| Reviewed by Oliver Hunt. |
| |
| Now that no one is using the ClassInfo in JSCell, we can remove it for the greater good. This is a 1.5% win on v8v7 and |
| a 1.7% win on kraken, and is an overall performance progression. |
| |
| * dfg/DFGSpeculativeJIT.h: |
| (JSC::DFG::SpeculativeJIT::emitAllocateBasicJSObject): Had to rearrange the order of when we take things off the free list |
| and when we store the Structure in the object because we would clobber the free list otherwise. This made it not okay for |
| the structure argument and the scratch register to alias one another. Also removed the store of the ClassInfo pointer in the |
| object. Yay! |
| (SpeculativeJIT): |
| * dfg/DFGSpeculativeJIT32_64.cpp: Since it's no longer okay for for the scratch register and structure register to alias |
| one another as stated above, had to add an extra temporary for passing the Structure. |
| (JSC::DFG::SpeculativeJIT::compile): |
| * dfg/DFGSpeculativeJIT64.cpp: Ditto. |
| (JSC::DFG::SpeculativeJIT::compile): |
| * jit/JITInlineMethods.h: |
| (JSC::JIT::emitAllocateBasicJSObject): Similar changes to DFG's inline allocation except that it removed the object from |
| the free list first, so no changes were necessary there. |
| * llint/LowLevelInterpreter.asm: Change the constants for amount of inline storage to match PropertyOffset.h and remove |
| the store of the ClassInfo pointer during inline allocation. |
| * llint/LowLevelInterpreter32_64.asm: |
| * llint/LowLevelInterpreter64.asm: |
| * runtime/JSCell.h: Remove the m_classInfo field and associated methods. |
| (JSCell): |
| * runtime/JSObject.h: |
| (JSObject): |
| * runtime/PropertyOffset.h: Expand the number of inline storage properties to take up the extra space that we're freeing |
| with the removal of the ClassInfo pointer. |
| (JSC): |
| * runtime/Structure.h: |
| (JSC): |
| (JSC::JSCell::JSCell): |
| (JSC::JSCell::finishCreation): |
| |
| 2012-09-10 Geoffrey Garen <ggaren@apple.com> |
| |
| Added large allocation support to MarkedSpace |
| https://bugs.webkit.org/show_bug.cgi?id=96214 |
| |
| Originally reviewed by Oliver Hunt, then I added a design revision by |
| suggested by Phil Pizlo. |
| |
| I expanded the imprecise size classes to cover up to 32KB, then added |
| an mmap-based allocator for everything bigger. There's a lot of tuning |
| we could do in these size classes, but currently they're almost |
| completely unused, so I haven't done any tuning. |
| |
| Subtle point: the large allocator is a degenerate case of our free list |
| logic. Its list only ever contains zero or one items. |
| |
| * heap/Heap.h: |
| (JSC::Heap::allocateStructure): Pipe in size information. |
| |
| * heap/MarkedAllocator.cpp: |
| (JSC::MarkedAllocator::tryAllocateHelper): Handle the case where we |
| find a free item in the sweep list but the item isn't big enough. This |
| can happen in the large allocator because it mixes sizes. |
| |
| (JSC::MarkedAllocator::tryAllocate): |
| (JSC::MarkedAllocator::allocateSlowCase): More piping. |
| |
| (JSC::MarkedAllocator::allocateBlock): Handle the oversize case. |
| |
| (JSC::MarkedAllocator::addBlock): I moved the call to didAddBlock here |
| because it made more sense. |
| |
| * heap/MarkedAllocator.h: |
| (MarkedAllocator): |
| (JSC::MarkedAllocator::allocate): |
| * heap/MarkedSpace.cpp: |
| (JSC::MarkedSpace::MarkedSpace): |
| (JSC::MarkedSpace::resetAllocators): |
| (JSC::MarkedSpace::canonicalizeCellLivenessData): |
| (JSC::MarkedSpace::isPagedOut): |
| (JSC::MarkedSpace::freeBlock): |
| * heap/MarkedSpace.h: |
| (MarkedSpace): |
| (JSC::MarkedSpace::allocatorFor): |
| (JSC::MarkedSpace::destructorAllocatorFor): |
| (JSC::MarkedSpace::allocateWithoutDestructor): |
| (JSC::MarkedSpace::allocateWithDestructor): |
| (JSC::MarkedSpace::allocateStructure): |
| (JSC::MarkedSpace::forEachBlock): |
| * runtime/Structure.h: |
| (JSC::Structure): More piping. |
| |
| 2012-09-10 Geoffrey Garen <ggaren@apple.com> |
| |
| Try to fix the Windows (32-bit) build. |
| |
| * jit/JITOpcodes.cpp: |
| (JSC::JIT::emit_op_tear_off_arguments): |
| * jit/JITOpcodes32_64.cpp: |
| (JSC::JIT::emit_op_tear_off_arguments): Get operands 1 and 2, not 1 and 1. :( |
| |
| Also took this opportunity to rename to indicate that these values are |
| not destinations anymore. |
| |
| 2012-09-10 Geoffrey Garen <ggaren@apple.com> |
| |
| DFG misses arguments tear-off for function.arguments if 'arguments' is used |
| https://bugs.webkit.org/show_bug.cgi?id=96227 |
| |
| Reviewed by Gavin Barraclough. |
| |
| We've decided not to allow function.arguments to alias the local |
| 'arguments' object, or a local var or function named 'arguments'. |
| Aliasing complicates the implementation (cf, this bug) and can produce |
| surprising behavior for web programmers. |
| |
| Eliminating the aliasing has the side-effect of fixing this bug. |
| |
| The compatibilty story: function.arguments is deprecated, was never |
| specified, and throws an exception in strict mode, so we expect it to |
| disappear over time. Firefox does not alias to 'arguments'; Chrome |
| does, but not if you use eval or with; IE does; Safari did. |
| |
| * dfg/DFGByteCodeParser.cpp: Noticed a little cleanup while verifying |
| this code. Use the CodeBlock method for better encapsulation. |
| |
| * interpreter/Interpreter.cpp: |
| (JSC::Interpreter::retrieveArgumentsFromVMCode): Behavior change: don't |
| alias. |
| |
| * tests/mozilla/js1_4/Functions/function-001.js: |
| (TestFunction_4): Updated test expectations for changed behavior. |
| |
| 2012-09-10 Filip Pizlo <fpizlo@apple.com> |
| |
| offlineasm has some impossible to implement, and unused, instructions |
| https://bugs.webkit.org/show_bug.cgi?id=96310 |
| |
| Reviewed by Mark Hahnenberg. |
| |
| * offlineasm/armv7.rb: |
| * offlineasm/instructions.rb: |
| * offlineasm/x86.rb: |
| |
| 2012-09-09 Geoffrey Garen <ggaren@apple.com> |
| |
| Refactored op_tear_off* to support activations that don't allocate space for 'arguments' |
| https://bugs.webkit.org/show_bug.cgi?id=96231 |
| |
| Reviewed by Gavin Barraclough. |
| |
| This is a step toward smaller activations. |
| |
| As a side-effect, this patch eliminates a load and branch from the hot path |
| of activation tear-off by moving it to the cold path of arguments tear-off. Our |
| optimizing assumptions are that activations are common and that reifying the |
| arguments object is less common. |
| |
| * bytecode/CodeBlock.cpp: |
| (JSC::CodeBlock::dump): |
| * bytecode/Opcode.h: |
| (JSC::padOpcodeName): Updated for new opcode lengths. |
| |
| * bytecompiler/BytecodeGenerator.cpp: |
| (JSC::BytecodeGenerator::BytecodeGenerator): |
| (JSC::BytecodeGenerator::addConstantValue): Added support for JSValue() |
| in the bytecode, which we use when we have 'arguments' but no activation. |
| |
| (JSC::BytecodeGenerator::emitReturn): Always emit tear_off_arguments |
| if we've allocated the arguments registers. This allows tear_off_activation |
| not to worry about the arguments object anymore. |
| |
| Also, pass the activation and arguments values directly to these opcodes |
| instead of requiring the opcodes to infer the values through special |
| registers. This gives us more flexibility to move or eliminate registers. |
| |
| * dfg/DFGArgumentsSimplificationPhase.cpp: |
| (JSC::DFG::ArgumentsSimplificationPhase::run): |
| * dfg/DFGByteCodeParser.cpp: |
| (JSC::DFG::ByteCodeParser::parseBlock): |
| * dfg/DFGNode.h: |
| (Node): Updated for new opcode lengths. |
| |
| * dfg/DFGOperations.cpp: Activation tear-off doesn't worry about the |
| arguments object anymore. If 'arguments' is in use and reified, it's |
| responsible for aliasing back to the activation object in tear_off_arguments. |
| |
| * dfg/DFGOperations.h: |
| * dfg/DFGSpeculativeJIT.h: |
| (JSC::DFG::SpeculativeJIT::callOperation): |
| (SpeculativeJIT): |
| * dfg/DFGSpeculativeJIT32_64.cpp: |
| (JSC::DFG::SpeculativeJIT::compile): |
| * dfg/DFGSpeculativeJIT64.cpp: |
| (JSC::DFG::SpeculativeJIT::compile): Don't pass the arguments object to |
| activation tear-off; do pass the activation object to arguments tear-off. |
| |
| * interpreter/Interpreter.cpp: |
| (JSC::Interpreter::privateExecute): Ditto. |
| |
| * jit/JITOpcodes.cpp: |
| (JSC::JIT::emit_op_tear_off_activation): |
| (JSC::JIT::emit_op_tear_off_arguments): |
| * jit/JITOpcodes32_64.cpp: |
| (JSC::JIT::emit_op_tear_off_activation): |
| (JSC::JIT::emit_op_tear_off_arguments): |
| * jit/JITStubs.cpp: |
| (JSC::DEFINE_STUB_FUNCTION): |
| * llint/LLIntSlowPaths.cpp: |
| (JSC::LLInt::LLINT_SLOW_PATH_DECL): |
| * llint/LowLevelInterpreter32_64.asm: |
| * llint/LowLevelInterpreter64.asm: Same change in a few more execution engines. |
| |
| 2012-09-10 Patrick Gansterer <paroga@webkit.org> |
| |
| [JSC] Use StringBuilder::appendNumber() instead of String::number() |
| https://bugs.webkit.org/show_bug.cgi?id=96236 |
| |
| Reviewed by Benjamin Poulain. |
| |
| * API/JSContextRef.cpp: |
| (JSContextCreateBacktrace): |
| |
| 2012-09-06 Mark Hahnenberg <mhahnenberg@apple.com> |
| |
| Combine MarkStack and SlotVisitor into single class |
| https://bugs.webkit.org/show_bug.cgi?id=96043 |
| |
| Reviewed by Geoff Garen. |
| |
| Move all of MarkStack into SlotVisitor. The remaining stuff in MarkStack.cpp actually has to do |
| with MarkStack management/allocation. Cleaned up a few of the header files while I was at it. |
| |
| * CMakeLists.txt: |
| * GNUmakefile.list.am: |
| * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: |
| * JavaScriptCore.xcodeproj/project.pbxproj: |
| * Target.pri: |
| * bytecode/CodeBlock.cpp: |
| * dfg/DFGCommon.h: |
| * heap/GCThreadSharedData.cpp: |
| * heap/GCThreadSharedData.h: |
| (GCThreadSharedData): |
| * heap/HeapRootVisitor.h: |
| * heap/MarkStack.cpp: |
| (JSC): |
| * heap/MarkStack.h: |
| (JSC): |
| (MarkStackSegment): |
| (JSC::MarkStackSegment::data): |
| (JSC::MarkStackSegment::capacityFromSize): |
| (JSC::MarkStackSegment::sizeFromCapacity): |
| (MarkStackSegmentAllocator): |
| (MarkStackArray): |
| * heap/MarkStackInlineMethods.h: |
| (JSC::MarkStackArray::postIncTop): |
| (JSC): |
| (JSC::MarkStackArray::preDecTop): |
| (JSC::MarkStackArray::setTopForFullSegment): |
| (JSC::MarkStackArray::setTopForEmptySegment): |
| (JSC::MarkStackArray::top): |
| (JSC::MarkStackArray::validatePrevious): |
| (JSC::MarkStackArray::append): |
| (JSC::MarkStackArray::canRemoveLast): |
| (JSC::MarkStackArray::removeLast): |
| (JSC::MarkStackArray::isEmpty): |
| (JSC::MarkStackArray::size): |
| * heap/SlotVisitor.cpp: Added. |
| (JSC): |
| (JSC::SlotVisitor::SlotVisitor): |
| (JSC::SlotVisitor::~SlotVisitor): |
| (JSC::SlotVisitor::setup): |
| (JSC::SlotVisitor::reset): |
| (JSC::SlotVisitor::append): |
| (JSC::visitChildren): |
| (JSC::SlotVisitor::donateKnownParallel): |
| (JSC::SlotVisitor::drain): |
| (JSC::SlotVisitor::drainFromShared): |
| (JSC::SlotVisitor::mergeOpaqueRoots): |
| (JSC::SlotVisitor::startCopying): |
| (JSC::SlotVisitor::allocateNewSpaceSlow): |
| (JSC::SlotVisitor::allocateNewSpaceOrPin): |
| (JSC::JSString::tryHashConstLock): |
| (JSC::JSString::releaseHashConstLock): |
| (JSC::JSString::shouldTryHashConst): |
| (JSC::SlotVisitor::internalAppend): |
| (JSC::SlotVisitor::copyAndAppend): |
| (JSC::SlotVisitor::doneCopying): |
| (JSC::SlotVisitor::harvestWeakReferences): |
| (JSC::SlotVisitor::finalizeUnconditionalFinalizers): |
| (JSC::SlotVisitor::validate): |
| * heap/SlotVisitor.h: |
| (JSC): |
| (SlotVisitor): |
| (JSC::SlotVisitor::sharedData): |
| (JSC::SlotVisitor::isEmpty): |
| (JSC::SlotVisitor::visitCount): |
| (JSC::SlotVisitor::resetChildCount): |
| (JSC::SlotVisitor::childCount): |
| (JSC::SlotVisitor::incrementChildCount): |
| (ParallelModeEnabler): |
| (JSC::ParallelModeEnabler::ParallelModeEnabler): |
| (JSC::ParallelModeEnabler::~ParallelModeEnabler): |
| * heap/SlotVisitorInlineMethods.h: |
| (JSC::SlotVisitor::append): |
| (JSC): |
| (JSC::SlotVisitor::appendUnbarrieredPointer): |
| (JSC::SlotVisitor::appendUnbarrieredValue): |
| (JSC::SlotVisitor::internalAppend): |
| (JSC::SlotVisitor::addWeakReferenceHarvester): |
| (JSC::SlotVisitor::addUnconditionalFinalizer): |
| (JSC::SlotVisitor::addOpaqueRoot): |
| (JSC::SlotVisitor::containsOpaqueRoot): |
| (JSC::SlotVisitor::opaqueRootCount): |
| (JSC::SlotVisitor::mergeOpaqueRootsIfNecessary): |
| (JSC::SlotVisitor::mergeOpaqueRootsIfProfitable): |
| (JSC::SlotVisitor::donate): |
| (JSC::SlotVisitor::donateAndDrain): |
| * jit/JITWriteBarrier.h: |
| (JSC::SlotVisitor::append): |
| * jit/JumpReplacementWatchpoint.cpp: |
| * runtime/JSCell.h: |
| * runtime/Structure.h: |
| (JSC::SlotVisitor::internalAppend): |
| * runtime/WriteBarrier.h: |
| (JSC): |
| (JSC::SlotVisitor::append): |
| (JSC::SlotVisitor::appendValues): |
| * yarr/YarrJIT.cpp: |
| |
| 2012-09-10 Hojong Han <hojong.han@samsung.com> |
| |
| [EFL] JIT memory usage is not retrieved |
| https://bugs.webkit.org/show_bug.cgi?id=96095 |
| |
| Reviewed by Geoffrey Garen. |
| |
| Fill JITBytes for EFL port. |
| |
| * runtime/MemoryStatistics.cpp: |
| (JSC::globalMemoryStatistics): |
| |
| 2012-09-10 Thiago Marcos P. Santos <thiago.santos@intel.com> |
| |
| [CMake][EFL] Enable the LLInt |
| https://bugs.webkit.org/show_bug.cgi?id=92682 |
| |
| Reviewed by Csaba Osztrogonác. |
| |
| Generate the headers needed by LLint when LLint is enabled. |
| |
| * CMakeLists.txt: |
| |
| 2012-09-10 Carlos Garcia Campos <cgarcia@igalia.com> |
| |
| Unreviewed. Fix make distcheck. |
| |
| * GNUmakefile.list.am: Add missing files. |
| |
| 2012-09-09 Mark Lam <mark.lam@apple.com> |
| |
| Fixed a few llint C++ interpreter bugs. |
| https://bugs.webkit.org/show_bug.cgi?id=96127. |
| |
| Reviewed by Geoffrey Garen. |
| |
| * llint/LLIntCLoop.h: |
| CLoop::execute()'s bootstrapOpcodeId does not need a default |
| value. There is no case when this function is called without |
| that parameter being specified. |
| * llint/LowLevelInterpreter.asm: |
| Moved the dispatchAfterCall() call to where it is needed. |
| For the C_LOOP back-end, it generates unreachable code. |
| * llint/LowLevelInterpreter.cpp: |
| #include <wtf/Assertions.h> because LLIntAssembly.h needs it. |
| (JSC): |
| Fixed bug in SIGN_BIT32() macro. |
| Placate a MSVC warning for t0, and t1 being uninitialized. |
| (JSC::CLoop::execute): |
| The bootstrapOpcodeId arg should always be specified. |
| MSVC doesn't like UNUSED_PARAM() for labels. Switch to using |
| the new UNUSED_LABEL() macro. |
| * offlineasm/cloop.rb: |
| * offlineasm/generate_offset_extractor.rb: |
| Resolved a compiler warning found via MSVC. |
| |
| 2012-09-09 Patrick Gansterer <paroga@webkit.org> |
| |
| Add StringBuilder::appendNumber() and use it |
| https://bugs.webkit.org/show_bug.cgi?id=96030 |
| |
| Reviewed by Eric Seidel. |
| |
| Also fix a bunch of append() vs. appendLiteral() issues in the surrounding code. |
| |
| * API/JSContextRef.cpp: |
| (JSContextCreateBacktrace): |
| * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.def: |
| * interpreter/Interpreter.h: |
| (JSC::StackFrame::toString): |
| |
| 2012-09-09 Patrick Gansterer <paroga@webkit.org> |
| |
| Make the String initialization on the function side of String::number() |
| https://bugs.webkit.org/show_bug.cgi?id=95940 |
| |
| Reviewed by Benjamin Poulain. |
| |
| * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.def: |
| |
| 2012-09-09 Geoffrey Garen <ggaren@apple.com> |
| |
| Rolled out <http://trac.webkit.org/changeset/127939> because it broke |
| fast/js/named-function-expression.html. |
| |
| Refactored bytecode generator initialization to support moving captured vars around |
| https://bugs.webkit.org/show_bug.cgi?id=96159 |
| |
| Reviewed by Gavin Barraclough. |
| |
| 2012-09-08 Csaba Osztrogonác <ossy@webkit.org> |
| |
| LLInt buildfix for case sensitive filesystems |
| https://bugs.webkit.org/show_bug.cgi?id=96099 |
| |
| Reviewed by Michael Saboff. |
| |
| * llint/LowLevelInterpreter.cpp: Fix filenames. |
| |
| 2012-09-07 Benjamin Poulain <bpoulain@apple.com> |
| |
| Rename the ustring() accessor to string() |
| https://bugs.webkit.org/show_bug.cgi?id=95919 |
| |
| Reviewed by Geoffrey Garen. |
| |
| Rename ustring() to string() to make the accessor name more logical after |
| r127191. |
| |
| * API/JSBase.cpp: |
| (JSEvaluateScript): |
| (JSCheckScriptSyntax): |
| * API/JSObjectRef.cpp: |
| (JSObjectMakeFunctionWithCallback): |
| (JSObjectMakeFunction): |
| (JSObjectCopyPropertyNames): |
| * API/JSProfilerPrivate.cpp: |
| (JSStartProfiling): |
| (JSEndProfiling): |
| * API/JSValueRef.cpp: |
| (JSValueMakeString): |
| (JSValueMakeFromJSONString): |
| * API/OpaqueJSString.cpp: |
| (OpaqueJSString::string): |
| * API/OpaqueJSString.h: |
| (OpaqueJSString): |
| * bytecode/CodeBlock.cpp: |
| (JSC::idName): |
| (JSC::CodeBlock::dump): |
| * bytecompiler/BytecodeGenerator.cpp: |
| (JSC::BytecodeGenerator::emitLoad): |
| (JSC::BytecodeGenerator::addStringConstant): |
| * bytecompiler/NodesCodegen.cpp: |
| (JSC::RegExpNode::emitBytecode): |
| (JSC::processClauseList): |
| * dfg/DFGGraph.cpp: |
| (JSC::DFG::Graph::dump): |
| * interpreter/Interpreter.cpp: |
| (JSC::Interpreter::privateExecute): |
| * jit/JITStubs.cpp: |
| (JSC::DEFINE_STUB_FUNCTION): |
| * jsc.cpp: |
| (GlobalObject::addFunction): |
| (GlobalObject::addConstructableFunction): |
| * llint/LLIntSlowPaths.cpp: |
| (JSC::LLInt::LLINT_SLOW_PATH_DECL): |
| * parser/ASTBuilder.h: |
| (JSC::ASTBuilder::createRegExp): |
| * parser/Parser.cpp: |
| (JSC::::parsePrimaryExpression): |
| * parser/Parser.h: |
| (JSC::Scope::declareVariable): |
| (JSC::Scope::declareParameter): |
| (JSC::Scope::useVariable): |
| * parser/SyntaxChecker.h: |
| (JSC::SyntaxChecker::createRegExp): |
| * runtime/ExceptionHelpers.cpp: |
| (JSC::createUndefinedVariableError): |
| * runtime/Executable.cpp: |
| (JSC::FunctionExecutable::paramString): |
| * runtime/Executable.h: |
| (JSC::FunctionExecutable::finishCreation): |
| * runtime/FunctionPrototype.cpp: |
| (JSC::FunctionPrototype::addFunctionProperties): |
| * runtime/Identifier.h: |
| (JSC::Identifier::string): |
| * runtime/JSFunction.cpp: |
| (JSC::JSFunction::calculatedDisplayName): |
| * runtime/JSGlobalObject.cpp: |
| (JSC::JSGlobalObject::reset): |
| * runtime/JSONObject.cpp: |
| (JSC::PropertyNameForFunctionCall::value): |
| (JSC::Stringifier::Holder::appendNextProperty): |
| (JSC::Walker::walk): |
| * runtime/JSPropertyNameIterator.h: |
| (JSC::JSPropertyNameIterator::finishCreation): |
| * runtime/JSScope.cpp: |
| (JSC::JSScope::resolveBase): |
| * runtime/JSString.h: |
| (JSC::inlineJSValueNotStringtoString): |
| * runtime/LiteralParser.cpp: |
| (JSC::::parse): |
| * runtime/ObjectConstructor.cpp: |
| (JSC::ObjectConstructor::finishCreation): |
| (JSC::objectConstructorGetOwnPropertyNames): |
| (JSC::objectConstructorKeys): |
| * runtime/RegExpConstructor.cpp: |
| (JSC::RegExpConstructor::finishCreation): |
| |
| 2012-09-07 Gavin Barraclough <barraclough@apple.com> |
| |
| CALLFRAME_OFFSET and EXCEPTION_OFFSET are same in ctiTrampoline on ARM Thumb2 |
| https://bugs.webkit.org/show_bug.cgi?id=82013 |
| |
| Reviewed by Geoff Garen. |
| |
| Neither of these values need to be stored. At all. |
| |
| * jit/JITStubs.cpp: |
| (JSC): |
| (JSC::ctiTrampoline): |
| (JSC::JITThunks::JITThunks): |
| - Nothing to see here. Move along. |
| |
| 2012-09-07 Sheriff Bot <webkit.review.bot@gmail.com> |
| |
| Unreviewed, rolling out r127938. |
| http://trac.webkit.org/changeset/127938 |
| https://bugs.webkit.org/show_bug.cgi?id=96166 |
| |
| It broke the build (Requested by smfr on #webkit). |
| |
| * llint/LowLevelInterpreter.cpp: |
| (JSC): |
| (JSC::CLoop::execute): |
| * offlineasm/cloop.rb: |
| |
| 2012-09-07 Geoffrey Garen <ggaren@apple.com> |
| |
| Refactored bytecode generator initialization to support moving captured vars around |
| https://bugs.webkit.org/show_bug.cgi?id=96159 |
| |
| Reviewed by Gavin Barraclough. |
| |
| This patch separates the stages of allocating registers, declaring identifiers |
| in the symbol table, and initializing registers, so you can change |
| allocation decisions without breaking the world. |
| |
| * bytecompiler/BytecodeGenerator.cpp: |
| (JSC::BytecodeGenerator::BytecodeGenerator): Call a set of helper functions |
| instead of inlining all the code, to help clarity. |
| |
| (JSC::BytecodeGenerator::allocateCapturedVars): |
| (JSC::BytecodeGenerator::allocateUncapturedVars): |
| (JSC::BytecodeGenerator::allocateActivationVar): |
| (JSC::BytecodeGenerator::allocateArgumentsVars): |
| (JSC::BytecodeGenerator::allocateCalleeVarUndeclared): |
| (JSC::BytecodeGenerator::declareParameters): |
| (JSC::BytecodeGenerator::declareCallee): |
| (JSC::BytecodeGenerator::initCalleeVar): |
| (JSC::BytecodeGenerator::initArgumentsVars): |
| (JSC::BytecodeGenerator::initActivationVar): |
| (JSC::BytecodeGenerator::initThisParameter): |
| (JSC::BytecodeGenerator::initFunctionDeclarations): |
| (JSC::BytecodeGenerator::declareParameter): |
| (JSC::BytecodeGenerator::createLazyRegisterIfNecessary): |
| (JSC::BytecodeGenerator::createActivationIfNecessary): Factored these |
| helper functions out from pre-existing code. |
| |
| * bytecompiler/BytecodeGenerator.h: |
| (BytecodeGenerator): |
| * parser/ASTBuilder.h: |
| (JSC::ASTBuilder::createFuncDeclStatement): |
| (JSC::ASTBuilder::addVar): |
| * parser/Nodes.h: |
| (JSC::DeclarationStacks::VarDeclaration::VarDeclaration): |
| (VarDeclaration): |
| (JSC::DeclarationStacks::FunctionDeclaration::FunctionDeclaration): |
| (FunctionDeclaration): Declaration stacks get a little more data now, |
| to support allocating registers before putting things in the symbol |
| table. I'm convinced that we should eventually just expand the symbol |
| table to understand these things. |
| |
| 2012-09-07 Mark Lam <mark.lam@apple.com> |
| |
| Fix a llint C++ interpreter bugs. |
| https://bugs.webkit.org/show_bug.cgi?id=96127. |
| |
| Reviewed by Filip Pizlo. |
| |
| * llint/LowLevelInterpreter.cpp: |
| (JSC): |
| (JSC::CLoop::execute): |
| * offlineasm/cloop.rb: |
| |
| 2012-09-07 Gavin Barraclough <barraclough@apple.com> |
| |
| Object.prototype.__define{G,S}etter__ with non-callable second parameter should throw TypeError instead of SyntaxError |
| https://bugs.webkit.org/show_bug.cgi?id=93873 |
| |
| Reviewed by Sam Weinig. |
| |
| * runtime/ObjectPrototype.cpp: |
| (JSC::objectProtoFuncDefineGetter): |
| - throw TypeError instead of SyntaxError |
| (JSC::objectProtoFuncDefineSetter): |
| - throw TypeError instead of SyntaxError |
| |
| 2012-09-06 Mark Hahnenberg <mhahnenberg@apple.com> |
| |
| JSC should have a zombie mode |
| https://bugs.webkit.org/show_bug.cgi?id=96047 |
| |
| Reviewed by Geoffrey Garen. |
| |
| To aid clients of JSC while they are debugging memory issues, we should add a zombie |
| mode that scribbles into objects in the MarkedSpace after they are found to be dead |
| to prevent a sort of "use after free" situation. As a first cut we should support a |
| mode that just scribbles on objects prior to their being reused (i.e. while they are |
| "zombies") and a mode in which, in addition to scribbling on zombies, once an object |
| has been marked its mark bit will never be cleared, thus giving us "immortal" zombies. |
| |
| These two modes will be enabled through the use of environment variables. For now these |
| will be "JSZombieEnabled" and "JSImmortalZombieEnabled". Setting them to any value will |
| result in the use of the appropriate mode. |
| |
| * heap/Heap.cpp: |
| (JSC::Heap::collect): Zombifies dead objects at the end of collection if zombie mode is enabled. |
| (ZombifyCellFunctor): |
| (JSC::ZombifyCellFunctor::ZombifyCellFunctor): Sets marked bits for dead objects if in immortal mode and writes 0xbbadbeef into them. |
| (JSC::ZombifyCellFunctor::operator()): |
| (JSC): |
| (ZombifyBlockFunctor): |
| (JSC::ZombifyBlockFunctor::operator()): |
| (JSC::Heap::zombifyDeadObjects): Eagerly sweeps so that we don't write garbage into an object before it |
| is finalized/destroyed. |
| * heap/Heap.h: |
| (Heap): |
| * heap/MarkedBlock.h: |
| (MarkedBlock): |
| (JSC::MarkedBlock::forEachDeadCell): Used to iterate over dead cells at the end of collection if zombie mode is enabled. |
| (JSC): |
| * runtime/Options.cpp: |
| (JSC::Options::initialize): |
| * runtime/Options.h: |
| (JSC): |
| |
| 2012-09-05 Geoffrey Garen <ggaren@apple.com> |
| |
| Rolled back in <http://trac.webkit.org/changeset/127698> with a fix for |
| fast/dom/HTMLScriptElement/script-reexecution-pretty-diff.html, which |
| is to make sure that function declarations don't put their names in scope. |
| |
| Reviewed by Gavin Barraclough. |
| |
| Named functions should not allocate scope objects for their names |
| https://bugs.webkit.org/show_bug.cgi?id=95659 |
| |
| Reviewed by Oliver Hunt. |
| |
| 2012-09-06 Michael Saboff <msaboff@apple.com> |
| |
| 16 bit JSRopeString up converts an 8 bit fibers to 16 bits during resolution |
| https://bugs.webkit.org/show_bug.cgi?id=95810 |
| |
| Reviewed by Benjamin Poulain. |
| |
| Added 8 bit path that copies the contents of an 8 bit fiber to the 16 bit buffer |
| when resolving a 16 bit rope. |
| |
| * runtime/JSString.cpp: |
| (JSC::JSRopeString::resolveRopeSlowCase): |
| |
| 2012-09-06 Gavin Barraclough <barraclough@apple.com> |
| |
| JS test suite puts incorrect limitations on Function.toString() |
| https://bugs.webkit.org/show_bug.cgi?id=3975 |
| |
| Reviewed by Geoff Garen. |
| |
| The result of function toString is implementation defined; |
| these test cases were looking for specific whitespace formatting |
| that matches mozilla's, and for redundant braces to be inserted |
| around if/else blocks. Stop that. |
| |
| * tests/mozilla/expected.html: |
| * tests/mozilla/js1_2/function/tostring-1.js: |
| (simplify): |
| - reduce whitespace differences |
| * tests/mozilla/js1_2/function/tostring-2.js: |
| (simplify): |
| - reduce whitespace differences |
| (TestOr): |
| (TestAnd): |
| - added braces to match expected output |
| |
| 2012-09-06 Yuqiang Xian <yuqiang.xian@intel.com> |
| |
| Performance regressions on 32-bit platforms with revisions 125637 and 126387 |
| https://bugs.webkit.org/show_bug.cgi?id=95953 |
| |
| Reviewed by Filip Pizlo. |
| |
| * jit/JITPropertyAccess32_64.cpp: |
| (JSC::JIT::emit_op_get_by_val): Fix the typo. |
| |
| 2012-09-05 Geoffrey Garen <ggaren@apple.com> |
| |
| Rolled out <http://trac.webkit.org/changeset/127698> because it broke |
| fast/dom/HTMLScriptElement/script-reexecution-pretty-diff.html |
| |
| Named functions should not allocate scope objects for their names |
| https://bugs.webkit.org/show_bug.cgi?id=95659 |
| |
| Reviewed by Oliver Hunt. |
| |
| 2012-09-06 Mark Lam <mark.lam@apple.com> |
| |
| Renamed useYarrJIT() option to useRegExpJIT(). Also fixed regression in |
| which inadvertantly allows the ASM llint to use the baseline JIT when |
| useRegExpJIT() is true. |
| https://bugs.webkit.org/show_bug.cgi?id=95918. |
| |
| Reviewed by Geoffrey Garen. |
| |
| * runtime/JSGlobalData.cpp: |
| (JSC::enableAssembler): |
| (JSC::JSGlobalData::JSGlobalData): |
| * runtime/JSGlobalData.h: |
| (JSC::JSGlobalData::canUseJIT): |
| (JSC::JSGlobalData::canUseRegExpJIT): |
| (JSGlobalData): |
| * runtime/Options.cpp: |
| (JSC::Options::initialize): |
| * runtime/Options.h: |
| (JSC): |
| |
| 2012-09-06 Patrick Gansterer <paroga@webkit.org> |
| |
| Build fix for Interpreter after r127698. |
| |
| * interpreter/Interpreter.cpp: |
| (JSC::Interpreter::privateExecute): |
| |
| 2012-09-05 Geoffrey Garen <ggaren@apple.com> |
| |
| Named functions should not allocate scope objects for their names |
| https://bugs.webkit.org/show_bug.cgi?id=95659 |
| |
| Reviewed by Oliver Hunt. |
| |
| In most cases, we can merge a function expression's name into its symbol |
| table. This reduces memory footprint per closure from three objects |
| (function + activation + name scope) to two (function + activation), |
| speeds up closure allocation, and speeds up recursive calls. |
| |
| In the case of a named function expression that contains a non-strict |
| eval, the rules are so bat-poop crazy that I don't know how to model |
| them without an extra object. Since functions now default to not having |
| such an object, this case needs to allocate the object on function |
| entry. |
| |
| Therefore, this patch makes the slow case a bit slower so the fast case |
| can be faster and more memory-efficient. (Note that the slow case already |
| allocates an activation on entry, and until recently also allocated a |
| scope chain node on entry, so adding one allocation on entry shouldn't |
| break the bank.) |
| |
| * bytecode/CodeBlock.cpp: |
| (JSC::CodeBlock::CodeBlock): Caught a missed initializer. No behavior change. |
| |
| * bytecompiler/BytecodeGenerator.cpp: |
| (JSC::BytecodeGenerator::BytecodeGenerator): Put the callee in static scope |
| during compilation so it doesn't need to be in dynamic scope at runtime. |
| |
| (JSC::BytecodeGenerator::resolveCallee): |
| (JSC::BytecodeGenerator::addCallee): Helper functions for either statically |
| resolving the callee or adding a dynamic scope that will resolve to it, |
| depending on whether you're in the fast path. |
| |
| We move the callee into a var location if it's captured because activations |
| prefer to have contiguous ranges of captured variables. |
| |
| * bytecompiler/BytecodeGenerator.h: |
| (JSC::BytecodeGenerator::registerFor): |
| (BytecodeGenerator): |
| |
| * dfg/DFGOperations.cpp: |
| * interpreter/Interpreter.cpp: |
| (JSC::Interpreter::privateExecute): |
| * jit/JITStubs.cpp: |
| (JSC::DEFINE_STUB_FUNCTION): |
| * llint/LLIntSlowPaths.cpp: |
| (JSC::LLInt::LLINT_SLOW_PATH_DECL): This is the point of the patch: remove |
| one allocation in the case of a named function expression. |
| |
| * parser/Parser.cpp: |
| (JSC::::Parser): |
| * parser/Parser.h: |
| (JSC::Scope::declareCallee): |
| (Scope): |
| (Parser): |
| (JSC::parse): |
| * runtime/Executable.cpp: |
| (JSC::EvalExecutable::compileInternal): |
| (JSC::ProgramExecutable::checkSyntax): |
| (JSC::ProgramExecutable::compileInternal): |
| (JSC::FunctionExecutable::produceCodeBlockFor): |
| (JSC::FunctionExecutable::fromGlobalCode): Pipe the callee's name through |
| the parser so we get accurate information on whether the callee was captured. |
| |
| (JSC::FunctionExecutable::FunctionExecutable): |
| (JSC::EvalExecutable::compileInternal): |
| (JSC::ProgramExecutable::checkSyntax): |
| (JSC::ProgramExecutable::compileInternal): |
| (JSC::FunctionExecutable::produceCodeBlockFor): |
| (JSC::FunctionExecutable::fromGlobalCode): |
| * runtime/Executable.h: |
| (JSC::FunctionExecutable::create): |
| (FunctionExecutable): |
| (JSC::FunctionExecutable::finishCreation): I had to refactor function |
| creation to support the following function constructor quirk: the function |
| gets a name, but its name is not in lexical scope. |
| |
| To simplify this, FunctionExecutable now automatically extracts all the |
| data it needs from the parsed node. The special "fromGlobalCode" path |
| used by the function constructor creates an anonymous function, and then |
| quirkily sets the value used by the .name property to be non-null, even |
| though the parsed name is null. |
| |
| * runtime/JSNameScope.h: |
| (JSC::JSNameScope::create): |
| (JSC::JSNameScope::JSNameScope): Added support for explicitly specifying |
| your container scope. The compiler uses this for named function expressions. |
| |
| 2012-09-05 Gavin Barraclough <barraclough@apple.com> |
| |
| a = data[a]++; sets the wrong key in data |
| https://bugs.webkit.org/show_bug.cgi?id=91270 |
| |
| Reviewed by Oliver Hunt. |
| |
| Postfix inc/dec is unsafely using finalDestination, can trample base/subscript prior to the result being put. |
| |
| * bytecompiler/NodesCodegen.cpp: |
| (JSC::PostfixNode::emitResolve): |
| - Remove redundant parens. |
| (JSC::PostfixNode::emitBracket): |
| (JSC::PostfixNode::emitDot): |
| - Refactored to use tempDestination instead of finalDestination. |
| (JSC::PrefixNode::emitBracket): |
| (JSC::PrefixNode::emitDot): |
| - Should be using emitPreIncOrDec. |
| |
| 2012-09-05 Gavin Barraclough <barraclough@apple.com> |
| |
| Bug, assignment within subscript of prefix/postfix increment of bracket access |
| https://bugs.webkit.org/show_bug.cgi?id=95913 |
| |
| Reviewed by Oliver Hunt. |
| |
| javascript:alert((function(){ var a = { x:1 }; var b = { x:1 }; a[a=b,"x"]++; return a.x; })()) |
| |
| * bytecompiler/NodesCodegen.cpp: |
| (JSC::PostfixNode::emitBracket): |
| (JSC::PrefixNode::emitBracket): |
| - Should check for assigments in the subscript when loading the base. |
| * parser/Nodes.h: |
| (JSC::BracketAccessorNode::subscriptHasAssignments): |
| (BracketAccessorNode): |
| - Used by emitBracket methods. |
| |
| 2012-09-05 Gavin Barraclough <barraclough@apple.com> |
| |
| Merge prefix/postfix nodes |
| https://bugs.webkit.org/show_bug.cgi?id=95898 |
| |
| Reviewed by Geoff Garen. |
| |
| Simplify the AST. |
| This will also mean we have access to m_subscriptHasAssignments when generating a prefix/postfix op applied to a bracket access. |
| |
| * bytecompiler/NodesCodegen.cpp: |
| (JSC::PostfixNode::emitResolve): |
| - was PostfixResolveNode::emitBytecode |
| (JSC::PostfixNode::emitBracket): |
| - was PostfixBracketNode::emitBytecode |
| (JSC::PostfixNode::emitDot): |
| - was PostfixDotNode::emitBytecode |
| (JSC::PostfixNode::emitBytecode): |
| - was PostfixErrorNode::emitBytecode, call resolve/bracket/dot version as appropriate. |
| (JSC::PrefixNode::emitResolve): |
| - was PrefixResolveNode::emitBytecode |
| (JSC::PrefixNode::emitBracket): |
| - was PrefixBracketNode::emitBytecode |
| (JSC::PrefixNode::emitDot): |
| - was PrefixDotNode::emitBytecode |
| (JSC::PrefixNode::emitBytecode): |
| - was PrefixErrorNode::emitBytecode, call resolve/bracket/dot version as appropriate. |
| * parser/ASTBuilder.h: |
| (JSC::ASTBuilder::makePrefixNode): |
| - Just makes a PrefixNode! |
| (JSC::ASTBuilder::makePostfixNode): |
| - Just makes a PostfixNode! |
| * parser/NodeConstructors.h: |
| (JSC::PostfixNode::PostfixNode): |
| - Added, merge of PostfixResolveNode/PostfixBracketNode/PostfixDotNode/PostfixErrorNode. |
| (JSC::PrefixNode::PrefixNode): |
| - Added, merge of PrefixResolveNode/PrefixBracketNode/PrefixDotNode/PrefixErrorNode. |
| * parser/Nodes.h: |
| (PostfixNode): |
| - Added, merge of PostfixResolveNode/PostfixBracketNode/PostfixDotNode/PostfixErrorNode. |
| (PrefixNode): |
| - Added, merge of PrefixResolveNode/PrefixBracketNode/PrefixDotNode/PrefixErrorNode. |
| |
| 2012-09-05 Mark Hahnenberg <mhahnenberg@apple.com> |
| |
| Remove use of JSCell::classInfoOffset() from tryCacheGetByID |
| https://bugs.webkit.org/show_bug.cgi?id=95860 |
| |
| Reviewed by Oliver Hunt. |
| |
| We should just do the indirection through the Structure instead. |
| |
| * dfg/DFGRepatch.cpp: |
| (JSC::DFG::tryCacheGetByID): |
| |
| 2012-09-05 Geoffrey Garen <ggaren@apple.com> |
| |
| Throw exceptions when assigning to const in strict mode |
| https://bugs.webkit.org/show_bug.cgi?id=95894 |
| |
| Reviewed by Oliver Hunt. |
| |
| Currently, this never happens; but it will start happening once the |
| callee is a local const register. In this patch, there's no change in |
| behavior. |
| |
| * bytecompiler/BytecodeGenerator.cpp: |
| (JSC::BytecodeGenerator::emitReadOnlyExceptionIfNeeded): Helper function |
| for doing the throwing. |
| * bytecompiler/BytecodeGenerator.h: |
| |
| * bytecompiler/NodesCodegen.cpp: |
| (JSC::PostfixResolveNode::emitBytecode): |
| (JSC::PrefixResolveNode::emitBytecode): |
| (JSC::ReadModifyResolveNode::emitBytecode): |
| (JSC::AssignResolveNode::emitBytecode): Call the helper function. |
| |
| 2012-09-05 Geoffrey Garen <ggaren@apple.com> |
| |
| Refactored callee access in the DFG to support it in the general case |
| https://bugs.webkit.org/show_bug.cgi?id=95887 |
| |
| Reviewed by Phil Pizlo and Gavin Barraclough. |
| |
| To support named function expressions, the DFG needs to understand the |
| callee register being used in arbitrary expressions, and not just |
| create_this. |
| |
| * dfg/DFGByteCodeParser.cpp: |
| (JSC::DFG::ByteCodeParser::getDirect): |
| (JSC::DFG::ByteCodeParser::getCallee): Remap access to the callee register |
| into a GetCallee node. Otherwise, we get confused and think we have a |
| negatively indexed argument. |
| |
| (ByteCodeParser): |
| (JSC::DFG::ByteCodeParser::InlineStackEntry::remapOperand): Inlining also |
| needs to remap, but to the callee in the inline frame, and not the caller's |
| callee. |
| |
| (JSC::DFG::ByteCodeParser::parseBlock): Since we support the callee in |
| the general case now, there's no need to handle it in a special way for |
| create_this. |
| |
| 2012-09-05 Mark Hahnenberg <mhahnenberg@apple.com> |
| |
| Remove use of JSCell::classInfoOffset() from virtualForThunkGenerator |
| https://bugs.webkit.org/show_bug.cgi?id=95821 |
| |
| Reviewed by Oliver Hunt. |
| |
| We can replace the load of the ClassInfo from the object with a load from the Structure. |
| |
| * dfg/DFGThunks.cpp: |
| (JSC::DFG::virtualForThunkGenerator): |
| |
| 2012-09-05 Benjamin Poulain <bpoulain@apple.com> |
| |
| Fix the uses of String::operator+=() for Mac |
| https://bugs.webkit.org/show_bug.cgi?id=95818 |
| |
| Reviewed by Dan Bernstein. |
| |
| * jsc.cpp: |
| (functionJSCStack): Use StringBuilder to create the stack dump, it is faster |
| and avoid String::operator+=(). |
| |
| * parser/Parser.h: |
| (JSC::Parser::updateErrorMessageSpecialCase): |
| (JSC::Parser::updateErrorMessage): |
| (JSC::Parser::updateErrorWithNameAndMessage): |
| Use the String operators (and makeString) to concatenate the strings. |
| |
| 2012-09-05 Gabor Rapcsanyi <rgabor@webkit.org> |
| |
| DFG JIT doesn't work properly on ARM hardfp |
| https://bugs.webkit.org/show_bug.cgi?id=95684 |
| |
| Reviewed by Filip Pizlo. |
| |
| Add hardfp support to DFG JIT. The patch is created with the |
| help of Zoltan Herczeg. |
| |
| * dfg/DFGCCallHelpers.h: |
| (CCallHelpers): |
| (JSC::DFG::CCallHelpers::setupArguments): |
| * dfg/DFGFPRInfo.h: |
| (FPRInfo): |
| * dfg/DFGSpeculativeJIT.h: |
| (SpeculativeJIT): |
| (JSC::DFG::SpeculativeJIT::appendCallWithExceptionCheckSetResult): |
| (JSC::DFG::SpeculativeJIT::appendCallSetResult): |
| |
| 2012-09-04 Mark Lam <mark.lam@apple.com> |
| |
| Allow the YarrJIT to use the assembler even when useJIT() is false. |
| Introduce the useYarrJIT() option. |
| https://bugs.webkit.org/show_bug.cgi?id=95809. |
| |
| Reviewed by Geoffrey Garen. |
| |
| * runtime/JSGlobalData.cpp: |
| (JSC::enableAssembler): |
| * runtime/Options.cpp: |
| (JSC::Options::initialize): |
| * runtime/Options.h: |
| (JSC): |
| |
| 2012-09-04 Gavin Barraclough <barraclough@apple.com> |
| |
| inc/dec behave incorrectly operating on a resolved const |
| https://bugs.webkit.org/show_bug.cgi?id=95815 |
| |
| Reviewed by Geoff Garen. |
| |
| There are two bugs here. |
| |
| (1) When the value being incremented is const, and the result is ignored, we assume this cannot be observed, and emit no code. |
| However if the value being incremented is not a primitive & has a valueOf conversion, then this should be being called. |
| |
| (2) In the case of a pre-increment of a const value where the result is not ignored, we'll move +/-1 to the destination, then |
| add the resolved const value being incremented to this. This is problematic if the destination is a local, and the const |
| value being incremented has a valueOf conversion that throws - the destination will be modified erroneously. Instead, we |
| need to use a temporary location. |
| |
| * bytecompiler/NodesCodegen.cpp: |
| (JSC::PostfixResolveNode::emitBytecode): |
| (JSC::PrefixResolveNode::emitBytecode): |
| - always at least perform a toNumber conversion, use tempDestination when reducing inc/dec to an add +/-1. |
| |
| 2012-09-04 Filip Pizlo <fpizlo@apple.com> |
| |
| DFG GetByVal for JSArrays shouldn't OSR exit every time that the index is out of bound |
| https://bugs.webkit.org/show_bug.cgi?id=95717 |
| |
| Reviewed by Oliver Hunt. |
| |
| Rolling back in after fixing the negative index case. |
| |
| Make GetByVal for JSArrayOutOfBounds do meaningful things. The profiling was already |
| there so we should just use it! |
| |
| * bytecode/DFGExitProfile.h: |
| (JSC::DFG::exitKindToString): |
| * dfg/DFGAbstractState.cpp: |
| (JSC::DFG::AbstractState::execute): |
| * dfg/DFGOperations.cpp: |
| * dfg/DFGOperations.h: |
| * dfg/DFGSpeculativeJIT.h: |
| (JSC::DFG::SpeculativeJIT::callOperation): |
| * dfg/DFGSpeculativeJIT32_64.cpp: |
| (JSC::DFG::SpeculativeJIT::compile): |
| * dfg/DFGSpeculativeJIT64.cpp: |
| (JSC::DFG::SpeculativeJIT::compile): |
| |
| 2012-09-04 Sheriff Bot <webkit.review.bot@gmail.com> |
| |
| Unreviewed, rolling out r127503. |
| http://trac.webkit.org/changeset/127503 |
| https://bugs.webkit.org/show_bug.cgi?id=95788 |
| |
| broke some tests (fast/js/dfg-negative-array-index, fast/js |
| /dfg-put-by-val-setter-then-get-by-val) (Requested by thorton |
| on #webkit). |
| |
| * bytecode/DFGExitProfile.h: |
| (JSC::DFG::exitKindToString): |
| * dfg/DFGAbstractState.cpp: |
| (JSC::DFG::AbstractState::execute): |
| * dfg/DFGOperations.cpp: |
| * dfg/DFGOperations.h: |
| * dfg/DFGSpeculativeJIT.h: |
| (JSC::DFG::SpeculativeJIT::callOperation): |
| * dfg/DFGSpeculativeJIT32_64.cpp: |
| (JSC::DFG::SpeculativeJIT::compile): |
| * dfg/DFGSpeculativeJIT64.cpp: |
| (JSC::DFG::SpeculativeJIT::compile): |
| |
| 2012-09-04 Benjamin Poulain <bpoulain@apple.com> |
| |
| Improve JSC use of Strings after the UString->String change |
| https://bugs.webkit.org/show_bug.cgi?id=95633 |
| |
| Reviewed by Geoffrey Garen. |
| |
| This patch improve the use of strings in the JSC runtime. |
| |
| The initialization of Identifier is left for future patches. |
| |
| The improvements are the following: |
| -5% faster to raise one of the modified exception. |
| -3 times faster to execute Boolean::toString() |
| |
| Most of the changes are just about using the new methods |
| for string literals. |
| |
| With the changes, the binary on x86_64 gets 176 bytes smaller. |
| |
| * API/JSCallbackObjectFunctions.h: |
| (JSC::::staticFunctionGetter): |
| (JSC::::callbackGetter): |
| * API/JSContextRef.cpp: |
| (JSContextCreateBacktrace): |
| * API/JSObjectRef.cpp: |
| (JSObjectMakeFunctionWithCallback): |
| * bytecode/CodeBlock.cpp: |
| (JSC::valueToSourceString): |
| (JSC::CodeBlock::nameForRegister): |
| * interpreter/Interpreter.cpp: |
| (JSC::Interpreter::addStackTraceIfNecessary): |
| * runtime/ArrayConstructor.cpp: |
| (JSC::constructArrayWithSizeQuirk): |
| * runtime/ArrayPrototype.cpp: |
| (JSC::shift): |
| (JSC::unshift): |
| (JSC::arrayProtoFuncPop): |
| (JSC::arrayProtoFuncReverse): |
| * runtime/BooleanPrototype.cpp: |
| (JSC::booleanProtoFuncToString): Instead of instanciating new strings, reuse the |
| keywords available in SmallStrings. Avoiding the creation of the JSString and StringImpl |
| makes the method significantly faster. |
| |
| * runtime/DateConversion.cpp: |
| (JSC::formatDateTime): |
| * runtime/DatePrototype.cpp: |
| (JSC::formatLocaleDate): |
| (JSC::formateDateInstance): |
| (JSC::dateProtoFuncToISOString): |
| Change the way we use snprintf() for clarity and performance. |
| |
| Instead of allocating one extra byte to put a zero "just in case", we use the size returned |
| by snprintf(). |
| To prevent any overflow from a programming mistake, we explicitely test for overflow and |
| return an empty string. |
| |
| (JSC::dateProtoFuncToJSON): |
| * runtime/Error.cpp: |
| (JSC::createNotEnoughArgumentsError): |
| (JSC::throwTypeError): |
| (JSC::throwSyntaxError): |
| * runtime/Error.h: |
| (JSC::StrictModeTypeErrorFunction::create): |
| * runtime/ErrorPrototype.cpp: |
| (JSC::ErrorPrototype::finishCreation): |
| (JSC::errorProtoFuncToString): |
| Using a null String is correct because (8) uses jsString(), (9) tests for a length of 0. |
| |
| * runtime/ExceptionHelpers.cpp: |
| (JSC::InterruptedExecutionError::defaultValue): |
| (JSC::TerminatedExecutionError::defaultValue): |
| (JSC::createStackOverflowError): |
| (JSC::createOutOfMemoryError): |
| * runtime/Executable.cpp: |
| (JSC::EvalExecutable::compileInternal): |
| (JSC::FunctionExecutable::paramString): |
| * runtime/FunctionConstructor.cpp: |
| (JSC::constructFunction): |
| (JSC::constructFunctionSkippingEvalEnabledCheck): |
| * runtime/FunctionPrototype.h: |
| (JSC::FunctionPrototype::create): |
| Using a null String for the name is correct because InternalFunction uses jsString() |
| to create the name value. |
| |
| * runtime/InternalFunction.cpp: |
| (JSC::InternalFunction::finishCreation): |
| There is no need to create an empty string for a null string, jsString() handle both |
| cases as empty JSString. |
| |
| * runtime/JSArray.cpp: |
| (JSC::reject): |
| (JSC::SparseArrayValueMap::put): |
| (JSC::JSArray::put): |
| (JSC::JSArray::putByIndexBeyondVectorLength): |
| (JSC::JSArray::putDirectIndexBeyondVectorLength): |
| (JSC::JSArray::setLength): |
| (JSC::JSArray::pop): |
| (JSC::JSArray::push): |
| * runtime/JSFunction.cpp: |
| (JSC::JSFunction::finishCreation): Same issue as InternalFunction::finishCreation. |
| |
| (JSC::JSFunction::callerGetter): |
| (JSC::JSFunction::defineOwnProperty): |
| * runtime/JSGlobalData.cpp: |
| (JSC::enableAssembler): Use CFSTR() instead of CFStringCreateWithCString(). |
| CFStringCreateWithCString() copy the content and may choose to decode the data. |
| CFSTR() is much more efficient. |
| |
| * runtime/JSGlobalObject.cpp: |
| (JSC::JSGlobalObject::reset): |
| JSFunction uses jsString() to create the name, we can use null strings instead |
| of creating empty strings. |
| |
| (JSC::JSGlobalObject::createThrowTypeError): ditto. |
| * runtime/JSGlobalObjectFunctions.cpp: |
| (JSC::encode): |
| (JSC::decode): |
| (JSC::globalFuncEval): |
| * runtime/JSONObject.cpp: |
| (JSC::Stringifier::appendStringifiedValue): |
| (JSC::Stringifier::Holder::appendNextProperty): |
| (JSC::JSONProtoFuncParse): |
| (JSC::JSONProtoFuncStringify): |
| * runtime/JSObject.cpp: |
| (JSC::JSObject::put): |
| (JSC::JSObject::defaultValue): |
| (JSC::JSObject::hasInstance): |
| (JSC::JSObject::defineOwnProperty): |
| * runtime/JSString.cpp: |
| Return an empty JSString to avoid the creation of a temporary empty String. |
| |
| (JSC::JSRopeString::getIndexSlowCase): |
| * runtime/JSString.h: |
| (JSC): Remove the versions of jsNontrivialString() taking a char*. All the callers |
| have been replaced by calls using ASCIILiteral. |
| |
| * runtime/JSValue.cpp: |
| (JSC::JSValue::putToPrimitive): |
| * runtime/LiteralParser.cpp: |
| (JSC::::Lexer::lex): |
| (JSC::::Lexer::lexString): |
| (JSC::::Lexer::lexNumber): |
| (JSC::::parse): |
| * runtime/LiteralParser.h: |
| (JSC::LiteralParser::getErrorMessage): |
| * runtime/NumberPrototype.cpp: |
| (JSC::numberProtoFuncToExponential): |
| (JSC::numberProtoFuncToFixed): |
| (JSC::numberProtoFuncToPrecision): |
| (JSC::numberProtoFuncToString): |
| * runtime/ObjectConstructor.cpp: |
| (JSC::objectConstructorGetPrototypeOf): |
| (JSC::objectConstructorGetOwnPropertyDescriptor): |
| (JSC::objectConstructorGetOwnPropertyNames): |
| (JSC::objectConstructorKeys): |
| (JSC::toPropertyDescriptor): |
| (JSC::objectConstructorDefineProperty): |
| (JSC::objectConstructorDefineProperties): |
| (JSC::objectConstructorCreate): |
| (JSC::objectConstructorSeal): |
| (JSC::objectConstructorFreeze): |
| (JSC::objectConstructorPreventExtensions): |
| (JSC::objectConstructorIsSealed): |
| (JSC::objectConstructorIsFrozen): |
| (JSC::objectConstructorIsExtensible): |
| * runtime/ObjectPrototype.cpp: |
| (JSC::objectProtoFuncDefineGetter): |
| (JSC::objectProtoFuncDefineSetter): |
| (JSC::objectProtoFuncToString): |
| * runtime/RegExpConstructor.cpp: |
| (JSC::constructRegExp): |
| * runtime/RegExpObject.cpp: |
| (JSC::reject): |
| (JSC::regExpObjectSource): |
| * runtime/RegExpPrototype.cpp: |
| (JSC::regExpProtoFuncCompile): |
| * runtime/StringObject.cpp: |
| (JSC::StringObject::defineOwnProperty): |
| * runtime/StringPrototype.cpp: |
| (JSC::jsSpliceSubstrings): |
| (JSC::jsSpliceSubstringsWithSeparators): |
| |
| 2012-09-04 Filip Pizlo <fpizlo@apple.com> |
| |
| DFG GetByVal for JSArrays shouldn't OSR exit every time that the index is out of bound |
| https://bugs.webkit.org/show_bug.cgi?id=95717 |
| |
| Reviewed by Oliver Hunt. |
| |
| Make GetByVal for JSArrayOutOfBounds do meaningful things. The profiling was already |
| there so we should just use it! |
| |
| * bytecode/DFGExitProfile.h: |
| (JSC::DFG::exitKindToString): |
| * dfg/DFGAbstractState.cpp: |
| (JSC::DFG::AbstractState::execute): |
| * dfg/DFGOperations.cpp: |
| * dfg/DFGOperations.h: |
| * dfg/DFGSpeculativeJIT.h: |
| (JSC::DFG::SpeculativeJIT::callOperation): |
| * dfg/DFGSpeculativeJIT32_64.cpp: |
| (JSC::DFG::SpeculativeJIT::compile): |
| * dfg/DFGSpeculativeJIT64.cpp: |
| (JSC::DFG::SpeculativeJIT::compile): |
| |
| 2012-09-04 Zoltan Horvath <zoltan@webkit.org> |
| |
| Extend the coverage of the Custom Allocation Framework in WTF and in JavaScriptCore |
| https://bugs.webkit.org/show_bug.cgi?id=95737 |
| |
| Reviewed by Eric Seidel. |
| |
| Add WTF_MAKE_FAST_ALLOCATED macro to the following class declarations because these are instantiated by operator new. |
| |
| * wtf/CryptographicallyRandomNumber.cpp: CryptographicallyRandomNumber is instantiated at wtf/CryptographicallyRandomNumber.cpp:162. |
| |
| * heap/MachineStackMarker.cpp: |
| (MachineThreads::Thread): Thread is instantiated at heap/MachineStackMarker.cpp:196. |
| * jit/ExecutableAllocatorFixedVMPool.cpp: |
| (FixedVMPoolExecutableAllocator): FixedVMPoolExecutableAllocator is instantiated at jit/ExecutableAllocatorFixedVMPool.cpp:111 |
| * parser/SourceProviderCache.h: |
| (SourceProviderCache): SourceProviderCache is instantiated at parser/SourceProvider.h:49. |
| * parser/SourceProviderCacheItem.h: |
| (SourceProviderCacheItem): SourceProviderCacheItem is instantiated at parser/Parser.cpp:843. |
| * runtime/GCActivityCallback.h: |
| (GCActivityCallback): GCActivityCallback is instantiated at runtime/GCActivityCallback.h:96. |
| * tools/CodeProfile.h: |
| (CodeProfile): CodeProfile is instantiated at JavaScriptCore/tools/CodeProfiling.cpp:140. |
| |
| 2012-09-04 Mark Hahnenberg <mhahnenberg@apple.com> |
| |
| Remove uses of ClassInfo from SpeculativeJIT::compileObjectOrOtherLogicalNot |
| https://bugs.webkit.org/show_bug.cgi?id=95510 |
| |
| Reviewed by Oliver Hunt. |
| |
| More refactoring to get rid of ClassInfo checks in the DFG. |
| |
| * dfg/DFGAbstractState.cpp: |
| (JSC::DFG::AbstractState::execute): |
| * dfg/DFGSpeculativeJIT.h: |
| (SpeculativeJIT): |
| * dfg/DFGSpeculativeJIT32_64.cpp: |
| (JSC::DFG::SpeculativeJIT::compileNonStringCellOrOtherLogicalNot): |
| (JSC::DFG::SpeculativeJIT::compileLogicalNot): |
| * dfg/DFGSpeculativeJIT64.cpp: |
| (JSC::DFG::SpeculativeJIT::compileNonStringCellOrOtherLogicalNot): |
| (JSC::DFG::SpeculativeJIT::compileLogicalNot): |
| |
| 2012-09-03 Patrick Gansterer <paroga@webkit.org> |
| |
| Unreviewed. Build fix for ENABLE(CLASSIC_INTERPRETER) after r127393. |
| |
| * interpreter/Interpreter.h: |
| |
| 2012-09-02 Geoffrey Garen <ggaren@apple.com> |
| |
| Fixed failures seen on Linux bots. |
| |
| * jit/JITOpcodes.cpp: |
| (JSC::JIT::emit_op_push_with_scope): |
| * jit/JITOpcodes32_64.cpp: |
| (JSC::JIT::emit_op_push_with_scope): |
| * jit/JITStubs.cpp: |
| (JSC::DEFINE_STUB_FUNCTION): |
| * jit/JITStubs.h: push_*_scope doesn't have a destination operand anymore. |
| Accordingly, update these places in the baseline JIT, which I missed in my last patch. |
| |
| 2012-09-02 Geoffrey Garen <ggaren@apple.com> |
| |
| Refactored scope chain opcodes to support optimization for named function expressions |
| https://bugs.webkit.org/show_bug.cgi?id=95658 |
| |
| Reviewed by Sam Weinig. |
| |
| Renamed |
| push_scope => push_with_scope |
| push_new_scope => push_name_scope |
| to clarify the difference between them. |
| |
| Changed push_with_scope and push_name_scope not to save the new scope in |
| a temporary register, since doing so made optimization harder. |
| |
| (The old behavior was a hold-over from when the scope chain wasn't |
| a GC object, and wouldn't be marked otherwise. Now, the scope chain is |
| marked because it is a GC object pointed to by the call frame.) |
| |
| Changed push_name_scope to accept an operand specifying the attributes |
| for the named property, instead of assuming DontDelete, because a named |
| function expression needs ReadOnly|DontDelete. |
| |
| * bytecompiler/BytecodeGenerator.cpp: |
| (JSC::BytecodeGenerator::highestUsedRegister): Removed this function, |
| which used to be related to preserving saved scope object temporaries, |
| because it had no callers. |
| |
| 2012-09-01 Geoffrey Garen <ggaren@apple.com> |
| |
| Rolled back out a piece of <http://trac.webkit.org/changeset/127293> |
| because it broke inspector tests on Windows. |
| |
| Shrink activation objects by half |
| https://bugs.webkit.org/show_bug.cgi?id=95591 |
| |
| Reviewed by Sam Weinig. |
| |
| 2012-09-01 Mark Lam <mark.lam@apple.com> |
| |
| LLInt C loop backend. |
| https://bugs.webkit.org/show_bug.cgi?id=91052. |
| |
| Reviewed by Filip Pizlo. |
| |
| * JavaScriptCore.xcodeproj/project.pbxproj: |
| * bytecode/CodeBlock.cpp: |
| (JSC::CodeBlock::dump): |
| (JSC::CodeBlock::bytecodeOffset): |
| * interpreter/Interpreter.cpp: |
| (JSC::Interpreter::execute): |
| (JSC::Interpreter::executeCall): |
| (JSC::Interpreter::executeConstruct): |
| (JSC): |
| * interpreter/Interpreter.h: |
| * jit/JITStubs.h: |
| (JITStackFrame): |
| (JSC): |
| * llint/LLIntCLoop.cpp: Added. |
| (JSC): |
| (LLInt): |
| (JSC::LLInt::CLoop::initialize): |
| (JSC::LLInt::CLoop::catchRoutineFor): |
| (JSC::LLInt::CLoop::hostCodeEntryFor): |
| (JSC::LLInt::CLoop::jsCodeEntryWithArityCheckFor): |
| (JSC::LLInt::CLoop::jsCodeEntryFor): |
| * llint/LLIntCLoop.h: Added. |
| (JSC): |
| (LLInt): |
| (CLoop): |
| * llint/LLIntData.cpp: |
| (JSC::LLInt::initialize): |
| * llint/LLIntData.h: |
| (JSC): |
| * llint/LLIntOfflineAsmConfig.h: |
| * llint/LLIntOpcode.h: |
| * llint/LLIntThunks.cpp: |
| (LLInt): |
| * llint/LowLevelInterpreter.asm: |
| * llint/LowLevelInterpreter.cpp: |
| (LLInt): |
| (JSC::LLInt::Ints2Double): |
| (JSC): |
| (JSC::CLoop::execute): |
| * llint/LowLevelInterpreter.h: |
| (JSC): |
| * llint/LowLevelInterpreter32_64.asm: |
| * llint/LowLevelInterpreter64.asm: |
| * offlineasm/asm.rb: |
| * offlineasm/backends.rb: |
| * offlineasm/cloop.rb: Added. |
| * offlineasm/instructions.rb: |
| * runtime/Executable.h: |
| (ExecutableBase): |
| (JSC::ExecutableBase::hostCodeEntryFor): |
| (JSC::ExecutableBase::jsCodeEntryFor): |
| (JSC::ExecutableBase::jsCodeWithArityCheckEntryFor): |
| (JSC::ExecutableBase::catchRoutineFor): |
| (NativeExecutable): |
| * runtime/JSValue.h: |
| (JSC): |
| (LLInt): |
| (JSValue): |
| * runtime/JSValueInlineMethods.h: |
| (JSC): |
| (JSC::JSValue::JSValue): |
| * runtime/Options.cpp: |
| (JSC::Options::initialize): |
| |
| 2012-09-01 Geoffrey Garen <ggaren@apple.com> |
| |
| Rolled back in a piece of <http://trac.webkit.org/changeset/127293>. |
| |
| Shrink activation objects by half |
| https://bugs.webkit.org/show_bug.cgi?id=95591 |
| |
| Reviewed by Sam Weinig. |
| |
| * runtime/JSActivation.h: |
| (JSActivation): |
| |
| 2012-09-01 Geoffrey Garen <ggaren@apple.com> |
| |
| Rolled back in a piece of <http://trac.webkit.org/changeset/127293>. |
| |
| Shrink activation objects by half |
| https://bugs.webkit.org/show_bug.cgi?id=95591 |
| |
| Reviewed by Sam Weinig. |
| |
| * runtime/JSActivation.cpp: |
| (JSC::JSActivation::JSActivation): |
| * runtime/JSGlobalObject.cpp: |
| (JSC::JSGlobalObject::JSGlobalObject): |
| (JSC::JSGlobalObject::setGlobalThis): |
| (JSC): |
| (JSC::JSGlobalObject::visitChildren): |
| * runtime/JSGlobalObject.h: |
| (JSGlobalObject): |
| (JSC::JSScope::globalThis): |
| (JSC): |
| (JSC::JSGlobalObject::globalThis): |
| * runtime/JSNameScope.h: |
| (JSC::JSNameScope::JSNameScope): |
| * runtime/JSScope.cpp: |
| (JSC::JSScope::visitChildren): |
| * runtime/JSScope.h: |
| (JSScope): |
| (JSC::JSScope::JSScope): |
| (JSC::JSScope::globalObject): |
| (JSC::JSScope::globalData): |
| * runtime/JSSegmentedVariableObject.h: |
| (JSC::JSSegmentedVariableObject::JSSegmentedVariableObject): |
| * runtime/JSSymbolTableObject.h: |
| (JSC::JSSymbolTableObject::JSSymbolTableObject): |
| * runtime/JSVariableObject.h: |
| (JSC::JSVariableObject::JSVariableObject): |
| * runtime/JSWithScope.h: |
| (JSC::JSWithScope::JSWithScope): |
| * runtime/StrictEvalActivation.cpp: |
| (JSC::StrictEvalActivation::StrictEvalActivation): |
| |
| 2012-09-01 Geoffrey Garen <ggaren@apple.com> |
| |
| Rolled back out a piece of <http://trac.webkit.org/changeset/127293> |
| because it broke Window inspector tests. |
| |
| Shrink activation objects by half |
| https://bugs.webkit.org/show_bug.cgi?id=95591 |
| |
| Reviewed by Sam Weinig. |
| |
| * runtime/JSActivation.h: |
| (JSActivation): |
| |
| 2012-08-31 Filip Pizlo <fpizlo@apple.com> |
| |
| Unreviewed, attempt to fix Windows, take two. |
| |
| * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.def: |
| |
| 2012-08-31 Filip Pizlo <fpizlo@apple.com> |
| |
| Unreviewed, attempt to fix Windows. |
| |
| * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.def: |
| |
| 2012-08-31 Filip Pizlo <fpizlo@apple.com> |
| |
| JSArray::putDirectIndex should by default behave like JSObject::putDirect |
| https://bugs.webkit.org/show_bug.cgi?id=95630 |
| |
| Reviewed by Gavin Barraclough. |
| |
| * interpreter/Interpreter.cpp: |
| (JSC::Interpreter::privateExecute): |
| * jit/JITStubs.cpp: |
| (JSC::DEFINE_STUB_FUNCTION): |
| * jsc.cpp: |
| (GlobalObject::finishCreation): |
| * llint/LLIntSlowPaths.cpp: |
| (JSC::LLInt::LLINT_SLOW_PATH_DECL): |
| * runtime/JSArray.cpp: |
| (JSC::SparseArrayValueMap::putDirect): |
| (JSC::JSArray::defineOwnNumericProperty): |
| (JSC::JSArray::putDirectIndexBeyondVectorLength): |
| * runtime/JSArray.h: |
| (SparseArrayValueMap): |
| (JSArray): |
| (JSC::JSArray::putDirectIndex): |
| * runtime/JSONObject.cpp: |
| (JSC::Walker::walk): |
| * runtime/RegExpMatchesArray.cpp: |
| (JSC::RegExpMatchesArray::reifyAllProperties): |
| (JSC::RegExpMatchesArray::reifyMatchProperty): |
| * runtime/StringPrototype.cpp: |
| (JSC::splitStringByOneCharacterImpl): |
| (JSC::stringProtoFuncSplit): |
| |
| 2012-08-31 Geoffrey Garen <ggaren@apple.com> |
| |
| Rolled back in a piece of <http://trac.webkit.org/changeset/127293>. |
| |
| Shrink activation objects by half |
| https://bugs.webkit.org/show_bug.cgi?id=95591 |
| |
| Reviewed by Sam Weinig. |
| |
| * runtime/JSGlobalData.cpp: |
| (JSC::JSGlobalData::JSGlobalData): |
| * runtime/JSGlobalData.h: |
| (JSGlobalData): |
| * runtime/JSNameScope.h: |
| (JSC::JSNameScope::JSNameScope): |
| * runtime/JSWithScope.h: |
| (JSC::JSWithScope::JSWithScope): |
| * runtime/StrictEvalActivation.cpp: |
| (JSC::StrictEvalActivation::StrictEvalActivation): |
| |
| 2012-08-31 Geoffrey Garen <ggaren@apple.com> |
| |
| Rolled back in a piece of <http://trac.webkit.org/changeset/127293>. |
| |
| Shrink activation objects by half |
| https://bugs.webkit.org/show_bug.cgi?id=95591 |
| |
| Reviewed by Sam Weinig. |
| |
| * dfg/DFGAbstractState.cpp: |
| (JSC::DFG::AbstractState::execute): |
| * jit/JITOpcodes.cpp: |
| (JSC::JIT::emit_op_resolve_global_dynamic): |
| * llint/LowLevelInterpreter32_64.asm: |
| * llint/LowLevelInterpreter64.asm: |
| * runtime/JSActivation.cpp: |
| (JSC::JSActivation::JSActivation): |
| * runtime/JSGlobalData.cpp: |
| (JSC::JSGlobalData::JSGlobalData): |
| * runtime/JSGlobalData.h: |
| (JSGlobalData): |
| * runtime/JSGlobalObject.cpp: |
| (JSC::JSGlobalObject::reset): |
| (JSC::JSGlobalObject::visitChildren): |
| * runtime/JSGlobalObject.h: |
| (JSGlobalObject): |
| (JSC::JSGlobalObject::withScopeStructure): |
| (JSC::JSGlobalObject::strictEvalActivationStructure): |
| (JSC::JSGlobalObject::activationStructure): |
| (JSC::JSGlobalObject::nameScopeStructure): |
| |
| 2012-08-31 Mark Hahnenberg <mhahnenberg@apple.com> |
| |
| Remove use of ClassInfo in SpeculativeJIT::emitBranch |
| https://bugs.webkit.org/show_bug.cgi?id=95623 |
| |
| Reviewed by Filip Pizlo. |
| |
| * dfg/DFGAbstractState.cpp: |
| (JSC::DFG::AbstractState::execute): |
| * dfg/DFGSpeculativeJIT.h: |
| (SpeculativeJIT): |
| * dfg/DFGSpeculativeJIT32_64.cpp: |
| (JSC::DFG::SpeculativeJIT::emitNonStringCellOrOtherBranch): |
| (JSC::DFG::SpeculativeJIT::emitBranch): |
| * dfg/DFGSpeculativeJIT64.cpp: |
| (JSC::DFG::SpeculativeJIT::emitNonStringCellOrOtherBranch): |
| (JSC::DFG::SpeculativeJIT::emitBranch): |
| |
| 2012-08-31 Geoffrey Garen <ggaren@apple.com> |
| |
| Rolled back in a piece of <http://trac.webkit.org/changeset/127293>. |
| |
| Shrink activation objects by half |
| https://bugs.webkit.org/show_bug.cgi?id=95591 |
| |
| Reviewed by Sam Weinig. |
| |
| * heap/MarkedBlock.cpp: |
| (JSC::MarkedBlock::MarkedBlock): |
| * heap/MarkedBlock.h: |
| (MarkedBlock): |
| (JSC::MarkedBlock::globalData): |
| (JSC): |
| * heap/WeakSet.cpp: |
| (JSC::WeakSet::addAllocator): |
| * heap/WeakSet.h: |
| (WeakSet): |
| (JSC::WeakSet::WeakSet): |
| (JSC::WeakSet::globalData): |
| * runtime/JSGlobalData.h: |
| (JSC::WeakSet::heap): |
| (JSC): |
| |
| 2012-08-31 Mark Lam <mark.lam@apple.com> |
| |
| Refactor LLInt and supporting code in preparation for the C Loop backend. |
| https://bugs.webkit.org/show_bug.cgi?id=95531. |
| |
| Reviewed by Filip Pizlo. |
| |
| * bytecode/GetByIdStatus.cpp: |
| (JSC::GetByIdStatus::computeFromLLInt): |
| * bytecode/PutByIdStatus.cpp: |
| (JSC::PutByIdStatus::computeFromLLInt): |
| * jit/JITExceptions.cpp: |
| (JSC::genericThrow): Use ExecutableBase::catchRoutineFor() to fetch |
| fetch the catch routine for a thrown exception. This will allow |
| us to redefine that for the C loop later, and still keep this |
| code readable. |
| * llint/LLIntOfflineAsmConfig.h: Moved ASM macros to |
| LowLevelInterpreter.cpp which is the only place they are used. This |
| will make it more convenient to redefine them for the C loop later. |
| * llint/LLIntSlowPaths.cpp: |
| (JSC::LLInt::setUpCall): Use ExecutableBase's hostCodeEntry() |
| jsCodeEntryFor(), and jsCodeWithArityCheckEntryFor() for computing |
| the entry points to functions being called. |
| * llint/LLIntSlowPaths.h: |
| (SlowPathReturnType): |
| (JSC::LLInt::encodeResult): |
| (LLInt): |
| (JSC::LLInt::decodeResult): Added. Needed by LLInt C Loop later. |
| * llint/LowLevelInterpreter.asm: |
| * llint/LowLevelInterpreter.cpp: |
| * llint/LowLevelInterpreter32_64.asm: |
| * llint/LowLevelInterpreter64.asm: |
| * offlineasm/asm.rb: Disambiguate between opcodes and other labels. |
| * offlineasm/config.rb: |
| * runtime/Executable.h: |
| (JSC::ExecutableBase::hostCodeEntryFor): Added. |
| (ExecutableBase): |
| (JSC::ExecutableBase::jsCodeEntryFor): Added. |
| (JSC::ExecutableBase::jsCodeWithArityCheckEntryFor): Added. |
| (JSC::ExecutableBase::catchRoutineFor): Added. |
| * runtime/JSValueInlineMethods.h: |
| (JSC): |
| |
| 2012-08-31 Tony Chang <tony@chromium.org> |
| |
| Remove ENABLE_CSS3_FLEXBOX compile time flag |
| https://bugs.webkit.org/show_bug.cgi?id=95382 |
| |
| Reviewed by Ojan Vafai. |
| |
| Everyone is already enabling this by default and the spec has stablized. |
| |
| * Configurations/FeatureDefines.xcconfig: |
| |
| 2012-08-31 Geoffrey Garen <ggaren@apple.com> |
| |
| Not reviewed. |
| |
| Rolled out http://trac.webkit.org/changeset/127293 because it broke |
| inspector tests on Windows. |
| |
| Shrink activation objects by half |
| https://bugs.webkit.org/show_bug.cgi?id=95591 |
| |
| Reviewed by Sam Weinig. |
| |
| 2012-08-31 Geoffrey Garen <ggaren@apple.com> |
| |
| Shrink activation objects by half |
| https://bugs.webkit.org/show_bug.cgi?id=95591 |
| |
| Reviewed by Sam Weinig. |
| |
| Removed the global object, global data, and global this pointers from |
| JSScope, and changed an int to a bitfield. This gets the JSActivation |
| class down to 64 bytes, which in practice cuts it in half by getting it |
| out of the 128 byte size class. |
| |
| Now, it's one extra indirection to get these pointers. These pointers |
| aren't accessed by JIT code, so I thought there would be no cost to the |
| extra indirection. However, some C++-heavy SunSpider tests regressed a |
| bit in an early version of the patch, which added even more indirection. |
| This suggests that calls to exec->globalData() and/or exec->lexicalGlobalObject() |
| are common and probably duplicated in lots of places, and could stand |
| further optimization in C++. |
| |
| * dfg/DFGAbstractState.cpp: |
| (JSC::DFG::AbstractState::execute): Test against the specific activation |
| for our global object, since there's no VM-shared activation structure |
| anymore. This is guaranteed to have the same success rate as the old test |
| because activation scope is fixed at compile time. |
| |
| * heap/MarkedBlock.cpp: |
| (JSC::MarkedBlock::MarkedBlock): |
| * heap/MarkedBlock.h: |
| (JSC::MarkedBlock::globalData): |
| * heap/WeakSet.cpp: |
| (JSC::WeakSet::addAllocator): |
| * heap/WeakSet.h: |
| (WeakSet): |
| (JSC::WeakSet::WeakSet): |
| (JSC::WeakSet::globalData): Store a JSGlobalData* instead of a Heap* |
| because JSGlobalData->Heap is just a constant fold in the addressing |
| mode, while Heap->JSGlobalData is an extra pointer dereference. (These |
| objects should eventually just merge.) |
| |
| * jit/JITOpcodes.cpp: |
| (JSC::JIT::emit_op_resolve_global_dynamic): See DFGAbstractState.cpp. |
| |
| * llint/LowLevelInterpreter32_64.asm: |
| * llint/LowLevelInterpreter64.asm: Load the activation structure from |
| the code block instead of the global data because the structure is not |
| VM-shared anymore. (See DFGAbstractState.cpp.) |
| |
| * runtime/JSActivation.cpp: |
| (JSC::JSActivation::JSActivation): |
| * runtime/JSActivation.h: |
| (JSActivation): This is the point of the patch: Remove the data. |
| |
| * runtime/JSGlobalData.cpp: |
| (JSC::JSGlobalData::JSGlobalData): |
| * runtime/JSGlobalData.h: |
| (JSGlobalData): No longer VM-shared. (See DFGAbstractState.cpp.) |
| |
| (JSC::WeakSet::heap): (See WeakSet.h.) |
| |
| * runtime/JSGlobalObject.cpp: |
| (JSC::JSGlobalObject::JSGlobalObject): |
| (JSC::JSGlobalObject::setGlobalThis): |
| (JSC::JSGlobalObject::reset): |
| (JSC::JSGlobalObject::visitChildren): |
| * runtime/JSGlobalObject.h: |
| (JSGlobalObject): |
| (JSC::JSGlobalObject::withScopeStructure): |
| (JSC::JSGlobalObject::strictEvalActivationStructure): |
| (JSC::JSGlobalObject::activationStructure): |
| (JSC::JSGlobalObject::nameScopeStructure): |
| (JSC::JSScope::globalThis): |
| (JSC::JSGlobalObject::globalThis): Data that used to be in the JSScope |
| class goes here now, so it's not duplicated across all activations. |
| |
| * runtime/JSNameScope.h: |
| (JSC::JSNameScope::JSNameScope): |
| * runtime/JSScope.cpp: |
| (JSC::JSScope::visitChildren): This is the point of the patch: Remove the data. |
| |
| * runtime/JSScope.h: |
| (JSScope): |
| (JSC::JSScope::JSScope): |
| (JSC::JSScope::globalObject): |
| (JSC::JSScope::globalData): |
| * runtime/JSSegmentedVariableObject.h: |
| (JSC::JSSegmentedVariableObject::JSSegmentedVariableObject): |
| * runtime/JSSymbolTableObject.h: |
| (JSC::JSSymbolTableObject::JSSymbolTableObject): |
| * runtime/JSVariableObject.h: |
| (JSC::JSVariableObject::JSVariableObject): |
| * runtime/JSWithScope.h: |
| (JSC::JSWithScope::JSWithScope): |
| * runtime/StrictEvalActivation.cpp: |
| (JSC::StrictEvalActivation::StrictEvalActivation): Simplified now that |
| we don't need to pass so much data to JSScope. |
| |
| 2012-08-31 Patrick Gansterer <paroga@webkit.org> |
| |
| Build fix for WinCE after r127191. |
| |
| * bytecode/JumpTable.h: |
| |
| 2012-08-30 Filip Pizlo <fpizlo@apple.com> |
| |
| ASSERTION FAILURE in JSC::JSGlobalData::float32ArrayDescriptor when running fast/js/dfg-float64array.html |
| https://bugs.webkit.org/show_bug.cgi?id=95398 |
| |
| Reviewed by Mark Hahnenberg. |
| |
| Trying to get the build failure to be a bit more informative. |
| |
| * runtime/JSGlobalData.h: |
| (JSGlobalData): |
| |
| 2012-08-30 Geoffrey Garen <ggaren@apple.com> |
| |
| Try to fix the Qt build: add some #includes that, for some reason, only the Qt linker requires. |
| |
| * runtime/BooleanObject.cpp: |
| * runtime/ErrorInstance.cpp: |
| * runtime/NameInstance.cpp: |
| |
| 2012-08-30 Geoffrey Garen <ggaren@apple.com> |
| |
| Fix the Qt build: Removed a now-dead variable. |
| |
| * interpreter/Interpreter.cpp: |
| (JSC::Interpreter::execute): |
| |
| 2012-08-30 Benjamin Poulain <bpoulain@apple.com> |
| |
| Ambiguous operator[] after r127191 on some compiler |
| https://bugs.webkit.org/show_bug.cgi?id=95509 |
| |
| Reviewed by Simon Fraser. |
| |
| On some compilers, the operator[] conflicts with the Obj-C++ operators. This attempts to solve |
| the issue. |
| |
| * runtime/JSString.h: |
| (JSC::jsSingleCharacterSubstring): |
| (JSC::jsString): |
| (JSC::jsSubstring8): |
| (JSC::jsSubstring): |
| (JSC::jsOwnedString): |
| |
| 2012-08-30 Geoffrey Garen <ggaren@apple.com> |
| |
| Try to fix the Qt build: Remove the inline keyword at the declaration |
| site. |
| |
| The Qt compiler seems to be confused, complaining about these functions |
| not being defined in a translation unit, even though no generated code |
| in the unit calls these functions. Maybe removing the keyword at the |
| declaration site will change its mind. |
| |
| This shouldn't change the inlining decision at all: the definition is |
| still inline. |
| |
| * interpreter/CallFrame.h: |
| (ExecState): |
| |
| 2012-08-30 Geoffrey Garen <ggaren@apple.com> |
| |
| Undo Qt build fix guess, since it breaks other builds. |
| |
| * runtime/JSArray.h: |
| |
| 2012-08-30 Geoffrey Garen <ggaren@apple.com> |
| |
| Try to fix the Qt build: add an #include to JSArray.h, since |
| it's included by some of the files Qt complains about, and |
| some of is functions call the functions Qt complains about. |
| |
| * runtime/JSArray.h: |
| |
| 2012-08-30 Geoffrey Garen <ggaren@apple.com> |
| |
| Second step toward fixing the Windows build: Add new symbols. |
| |
| * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.def: |
| |
| 2012-08-30 Geoffrey Garen <ggaren@apple.com> |
| |
| Try to fix the Qt build: add an #include. |
| |
| * bytecode/GetByIdStatus.cpp: |
| |
| 2012-08-30 Geoffrey Garen <ggaren@apple.com> |
| |
| First step toward fixing the Windows build: Remove old symbols. |
| |
| * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.def: |
| |
| 2012-08-30 Geoffrey Garen <ggaren@apple.com> |
| |
| Use one object instead of two for closures, eliminating ScopeChainNode |
| https://bugs.webkit.org/show_bug.cgi?id=95501 |
| |
| Reviewed by Filip Pizlo. |
| |
| This patch removes ScopeChainNode, and moves all the data and related |
| functions that used to be in ScopeChainNode into JSScope. |
| |
| Most of this patch is mechanical changes to use a JSScope* where we used |
| to use a ScopeChainNode*. I've only specifically commented about items |
| that were non-mechanical. |
| |
| * runtime/Completion.cpp: |
| (JSC::evaluate): |
| * runtime/Completion.h: Don't require an explicit scope chain argument |
| when evaluating code. Clients never wanted anything other than the |
| global scope, and other arbitrary scopes probably wouldn't work |
| correctly, anyway. |
| |
| * runtime/JSScope.cpp: |
| * runtime/JSScope.h: |
| (JSC::JSScope::JSScope): JSScope now requires the data we used to pass to |
| ScopeChainNode, so it can link itself into the scope chain correctly. |
| |
| * runtime/JSWithScope.h: |
| (JSC::JSWithScope::create): |
| (JSC::JSWithScope::JSWithScope): JSWithScope gets an extra constructor |
| for specifically supplying your own scope chain. The DOM needs this |
| interface for setting up the scope chain for certain event handlers. |
| Other clients always just push the JSWithScope to the head of the current |
| scope chain. |
| |
| 2012-08-30 Mark Lam <mark.lam@apple.com> |
| |
| Render unto #ifdef's that which belong to them. |
| https://bugs.webkit.org/show_bug.cgi?id=95482. |
| |
| Reviewed by Filip Pizlo. |
| |
| Refining / disambiguating between #ifdefs and adding some. For |
| example, ENABLE(JIT) is conflated with ENABLE(LLINT) in some places. |
| Also, we need to add ENABLE(COMPUTED_GOTO_OPCODES) to indicate that we |
| want interpreted opcodes to use COMPUTED GOTOs apart from ENABLE(LLINT) |
| and ENABLE(COMPUTED_GOTO_CLASSIC_INTERPRETER). Also cleaned up #ifdefs |
| in certain places which were previously incorrect. |
| |
| * bytecode/CodeBlock.cpp: |
| (JSC): |
| (JSC::CodeBlock::bytecodeOffset): |
| * bytecode/CodeBlock.h: |
| (CodeBlock): |
| * bytecode/Opcode.h: |
| (JSC::padOpcodeName): |
| * config.h: |
| * dfg/DFGOperations.cpp: |
| * interpreter/AbstractPC.cpp: |
| (JSC::AbstractPC::AbstractPC): |
| * interpreter/CallFrame.h: |
| (ExecState): |
| * interpreter/Interpreter.cpp: |
| (JSC::Interpreter::~Interpreter): |
| (JSC::Interpreter::initialize): |
| (JSC::Interpreter::isOpcode): |
| (JSC::Interpreter::unwindCallFrame): |
| (JSC::getLineNumberForCallFrame): |
| (JSC::getCallerInfo): |
| (JSC::Interpreter::execute): |
| (JSC::Interpreter::executeCall): |
| (JSC::Interpreter::executeConstruct): |
| (JSC::Interpreter::privateExecute): |
| * interpreter/Interpreter.h: |
| (JSC::Interpreter::getOpcode): |
| (JSC::Interpreter::getOpcodeID): |
| (Interpreter): |
| * jit/HostCallReturnValue.h: |
| * jit/JITCode.h: |
| (JITCode): |
| * jit/JITExceptions.cpp: |
| * jit/JITExceptions.h: |
| * jit/JSInterfaceJIT.h: |
| * llint/LLIntData.h: |
| (JSC::LLInt::getOpcode): |
| * llint/LLIntEntrypoints.cpp: |
| (JSC::LLInt::getFunctionEntrypoint): |
| (JSC::LLInt::getEvalEntrypoint): |
| (JSC::LLInt::getProgramEntrypoint): |
| * llint/LLIntOffsetsExtractor.cpp: |
| (JSC::LLIntOffsetsExtractor::dummy): |
| * llint/LLIntSlowPaths.cpp: |
| (LLInt): |
| * runtime/JSGlobalData.cpp: |
| (JSC): |
| |
| 2012-08-30 JungJik Lee <jungjik.lee@samsung.com> |
| |
| [EFL][WK2] Add WebMemorySampler feature. |
| https://bugs.webkit.org/show_bug.cgi?id=91214 |
| |
| Reviewed by Kenneth Rohde Christiansen. |
| |
| WebMemorySampler collects Javascript stack and JIT memory usage in globalMemoryStatistics. |
| |
| * PlatformEfl.cmake: |
| |
| 2012-08-30 Benjamin Poulain <bpoulain@apple.com> |
| |
| Replace JSC::UString by WTF::String |
| https://bugs.webkit.org/show_bug.cgi?id=95271 |
| |
| Reviewed by Geoffrey Garen. |
| |
| Having JSC::UString and WTF::String increase the complexity of working on WebKit, and |
| add useless conversions in the bindings. It also cause some code bloat. |
| |
| The performance advantages of UString have been ported over in previous patches. This patch |
| is the last step: getting rid of UString. |
| |
| In addition to the simplified code, this also reduce the binary size by 15kb on x86_64. |
| |
| * API/OpaqueJSString.cpp: |
| (OpaqueJSString::ustring): |
| * runtime/Identifier.h: |
| (JSC::Identifier::ustring): |
| To avoid changing everything at once, the function named ustring() were kept as is. They |
| will be renamed in a follow up patch. |
| |
| * runtime/JSString.h: |
| (JSC::JSString::string): |
| (JSC::JSValue::toWTFString): |
| (JSC::inlineJSValueNotStringtoString): |
| (JSC::JSValue::toWTFStringInline): |
| Since JSValue::toString() already exist (and return the JSString), the direct accessor is renamed |
| to ::toWTFString(). We may change ::string() to ::jsString() and ::toWTFString() to ::toString() |
| in the future. |
| |
| * runtime/StringPrototype.cpp: |
| (JSC::substituteBackreferencesSlow): Replace the use of UString::getCharacters<>() by String::getCharactersWithUpconvert<>(). |
| |
| 2012-08-24 Mark Hahnenberg <mhahnenberg@apple.com> |
| |
| Remove uses of ClassInfo in StrictEq and CompareEq in the DFG |
| https://bugs.webkit.org/show_bug.cgi?id=93401 |
| |
| Reviewed by Filip Pizlo. |
| |
| Another incremental step in removing the dependence on ClassInfo pointers in object headers. |
| |
| * bytecode/SpeculatedType.h: |
| (JSC::isCellOrOtherSpeculation): |
| (JSC): |
| * dfg/DFGAbstractState.cpp: Updated the CFA to reflect the changes to the backend. |
| (JSC::DFG::AbstractState::execute): |
| * dfg/DFGNode.h: |
| (Node): |
| (JSC::DFG::Node::shouldSpeculateString): Added this new function since it was conspicuously absent. |
| (JSC::DFG::Node::shouldSpeculateNonStringCellOrOther): Also add this function for use in the CFA. |
| * dfg/DFGSpeculativeJIT.cpp: Refactored how we handle CompareEq and CompareStrictEq in the DFG. We now just |
| check for Strings by comparing the object's Structure to the global Structure for strings. We only |
| check for MasqueradesAsUndefined if the watchpoint has fired. These changes allow us to remove our |
| uses of the ClassInfo pointer for compiling these nodes. |
| (JSC::DFG::SpeculativeJIT::compilePeepHoleObjectEquality): |
| (JSC::DFG::SpeculativeJIT::compilePeepHoleBranch): |
| (JSC::DFG::SpeculativeJIT::compare): |
| (JSC::DFG::SpeculativeJIT::compileStrictEq): |
| * dfg/DFGSpeculativeJIT.h: |
| (SpeculativeJIT): |
| * dfg/DFGSpeculativeJIT32_64.cpp: Same changes for 32 bit as for 64 bit. |
| (JSC::DFG::SpeculativeJIT::compileObjectEquality): |
| (JSC::DFG::SpeculativeJIT::compileObjectToObjectOrOtherEquality): |
| (JSC::DFG::SpeculativeJIT::compilePeepHoleObjectToObjectOrOtherEquality): |
| * dfg/DFGSpeculativeJIT64.cpp: |
| (JSC::DFG::SpeculativeJIT::compileObjectEquality): |
| (JSC::DFG::SpeculativeJIT::compileObjectToObjectOrOtherEquality): |
| (JSC::DFG::SpeculativeJIT::compilePeepHoleObjectToObjectOrOtherEquality): |
| |
| 2012-08-30 Yong Li <yoli@rim.com> |
| |
| [BlackBerry] Implement IncrementalSweeper for PLATFORM(BLACKBERRY) |
| https://bugs.webkit.org/show_bug.cgi?id=95469 |
| |
| Reviewed by Rob Buis. |
| |
| RIM PR# 200595. |
| Share most code with USE(CF) and implement timer-related methods |
| for PLATFORM(BLACKBERRY). |
| |
| * heap/IncrementalSweeper.cpp: |
| (JSC): |
| (JSC::IncrementalSweeper::IncrementalSweeper): |
| (JSC::IncrementalSweeper::create): |
| (JSC::IncrementalSweeper::scheduleTimer): |
| (JSC::IncrementalSweeper::cancelTimer): |
| (JSC::IncrementalSweeper::doSweep): |
| * heap/IncrementalSweeper.h: |
| (IncrementalSweeper): |
| |
| 2012-08-30 Mark Lam <mark.lam@apple.com> |
| |
| Fix broken classic intrpreter build. |
| https://bugs.webkit.org/show_bug.cgi?id=95484. |
| |
| Reviewed by Filip Pizlo. |
| |
| * interpreter/Interpreter.cpp: |
| (JSC::Interpreter::privateExecute): |
| |
| 2012-08-30 Byungwoo Lee <bw80.lee@samsung.com> |
| |
| Build warning : -Wsign-compare on DFGByteCodeParser.cpp. |
| https://bugs.webkit.org/show_bug.cgi?id=95418 |
| |
| Reviewed by Filip Pizlo. |
| |
| There is a build warning '-Wsign-compare' on |
| findArgumentPositionForLocal() in DFGByteCodeParser.cpp. |
| |
| For removing this warning, casting statement is added explicitly. |
| |
| * dfg/DFGByteCodeParser.cpp: |
| (JSC::DFG::ByteCodeParser::findArgumentPositionForLocal): |
| (JSC::DFG::ByteCodeParser::findArgumentPosition): |
| |
| 2012-08-30 Yong Li <yoli@rim.com> |
| |
| [BlackBerry] Set timer client on platform timer used in HeapTimer |
| https://bugs.webkit.org/show_bug.cgi?id=95464 |
| |
| Reviewed by Rob Buis. |
| |
| Otherwise the timer won't work. |
| |
| * heap/HeapTimer.cpp: |
| (JSC::HeapTimer::HeapTimer): |
| |
| 2012-08-30 Julien BRIANCEAU <jbrianceau@nds.com> |
| |
| [sh4] Add missing implementation for JavaScriptCore JIT |
| https://bugs.webkit.org/show_bug.cgi?id=95452 |
| |
| Reviewed by Oliver Hunt. |
| |
| * assembler/MacroAssemblerSH4.h: |
| (JSC::MacroAssemblerSH4::isCompactPtrAlignedAddressOffset): |
| (MacroAssemblerSH4): |
| (JSC::MacroAssemblerSH4::add32): |
| (JSC::MacroAssemblerSH4::convertibleLoadPtr): |
| * assembler/SH4Assembler.h: |
| (JSC::SH4Assembler::labelIgnoringWatchpoints): |
| (SH4Assembler): |
| (JSC::SH4Assembler::replaceWithLoad): |
| (JSC::SH4Assembler::replaceWithAddressComputation): |
| |
| 2012-08-30 Charles Wei <charles.wei@torchmobile.com.cn> |
| |
| [BlackBerry] Eliminate build warnings |
| https://bugs.webkit.org/show_bug.cgi?id=95338 |
| |
| Reviewed by Filip Pizlo. |
| |
| static_cast to the same type to eliminate the build time warnings. |
| |
| * assembler/AssemblerBufferWithConstantPool.h: |
| (JSC::AssemblerBufferWithConstantPool::flushWithoutBarrier): |
| * assembler/MacroAssemblerARM.h: |
| (JSC::MacroAssemblerARM::branch32): |
| |
| 2012-08-29 Mark Hahnenberg <mhahnenberg@apple.com> |
| |
| Remove use of ClassInfo from compileGetByValOnArguments and compileGetArgumentsLength |
| https://bugs.webkit.org/show_bug.cgi?id=95131 |
| |
| Reviewed by Filip Pizlo. |
| |
| * dfg/DFGSpeculativeJIT.cpp: |
| (JSC::DFG::SpeculativeJIT::compileGetByValOnArguments): We don't need this speculation check. We can replace it |
| with an assert to guarantee this. |
| |
| 2012-08-29 Mark Lam <mark.lam@apple.com> |
| |
| Refactoring LLInt::Data. |
| https://bugs.webkit.org/show_bug.cgi?id=95316. |
| |
| Reviewed by Geoff Garen. |
| |
| This change allows its opcodeMap to be easily queried from any function |
| without needing to go through a GlobalData object. It also introduces |
| the LLInt::getCodePtr() methods that will be used by the LLInt C loop |
| later to redefine how llint symbols (opcodes and trampoline glue |
| labels) get resolved. |
| |
| * assembler/MacroAssemblerCodeRef.h: |
| (MacroAssemblerCodePtr): |
| (JSC::MacroAssemblerCodePtr::createLLIntCodePtr): |
| (MacroAssemblerCodeRef): |
| (JSC::MacroAssemblerCodeRef::createLLIntCodeRef): |
| * bytecode/CodeBlock.cpp: |
| (JSC::CodeBlock::adjustPCIfAtCallSite): |
| (JSC::CodeBlock::bytecodeOffset): |
| * bytecode/Opcode.h: |
| Remove the 'const' to simplify things and avoid having to do |
| additional casts and #ifdefs in many places. |
| * bytecode/ResolveGlobalStatus.cpp: |
| (JSC::computeForLLInt): |
| * bytecompiler/BytecodeGenerator.cpp: |
| (JSC::BytecodeGenerator::generate): |
| * interpreter/Interpreter.cpp: |
| (JSC::Interpreter::initialize): |
| * interpreter/Interpreter.h: |
| (Interpreter): |
| * jit/JITExceptions.cpp: |
| (JSC::genericThrow): |
| * llint/LLIntData.cpp: |
| (LLInt): |
| (JSC::LLInt::initialize): |
| * llint/LLIntData.h: |
| (JSC): |
| (LLInt): |
| (Data): |
| (JSC::LLInt::exceptionInstructions): |
| (JSC::LLInt::opcodeMap): |
| (JSC::LLInt::getOpcode): |
| (JSC::LLInt::getCodePtr): |
| (JSC::LLInt::Data::performAssertions): |
| * llint/LLIntExceptions.cpp: |
| (JSC::LLInt::returnToThrowForThrownException): |
| (JSC::LLInt::returnToThrow): |
| (JSC::LLInt::callToThrow): |
| * llint/LLIntSlowPaths.cpp: |
| (JSC::LLInt::LLINT_SLOW_PATH_DECL): |
| (JSC::LLInt::handleHostCall): |
| * runtime/InitializeThreading.cpp: |
| (JSC::initializeThreadingOnce): Initialize the singleton LLInt data. |
| * runtime/JSGlobalData.cpp: |
| (JSC::JSGlobalData::JSGlobalData): |
| * runtime/JSGlobalData.h: |
| (JSGlobalData): Removed the now unneeded LLInt::Data instance in |
| JSGlobalData. |
| * runtime/JSValue.h: |
| (JSValue): |
| |
| 2012-08-29 Gavin Barraclough <barraclough@apple.com> |
| |
| PutById uses DataLabel32, not DataLabelCompact |
| https://bugs.webkit.org/show_bug.cgi?id=95245 |
| |
| Reviewed by Geoff Garen. |
| |
| JIT::resetPatchPutById calls the the wrong thing on x86-64 – this is moot right now, |
| since they currently both do the same thing, but if we were to ever make compact mean |
| 8-bit this could be a real problem. Also, relying on the object still being in eax |
| on entry to the transition stub isn't very robust - added nonArgGPR1 to at least make |
| this explicit. |
| |
| * jit/JITPropertyAccess.cpp: |
| (JSC::JIT::emitSlow_op_put_by_id): |
| - copy regT0 to nonArgGPR1 |
| (JSC::JIT::privateCompilePutByIdTransition): |
| - DataLabelCompact -> DataLabel32 |
| (JSC::JIT::resetPatchPutById): |
| - reload regT0 from nonArgGPR1 |
| * jit/JSInterfaceJIT.h: |
| (JSInterfaceJIT): |
| - added nonArgGPR1 |
| |
| 2012-08-28 Yong Li <yoli@rim.com> |
| |
| ExecutableAllocator should be destructed after Heap |
| https://bugs.webkit.org/show_bug.cgi?id=95244 |
| |
| Reviewed by Rob Buis. |
| |
| RIM PR# 199364. |
| Make ExecutableAllocator the first member in JSGlobalData. |
| Existing Web Worker tests can show the issue. |
| |
| * runtime/JSGlobalData.cpp: |
| (JSC::JSGlobalData::JSGlobalData): |
| * runtime/JSGlobalData.h: |
| (JSGlobalData): |
| |
| 2012-08-29 Geoffrey Garen <ggaren@apple.com> |
| |
| Try to fix the Windows build. |
| |
| * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.def: Export! |
| |
| 2012-08-28 Geoffrey Garen <ggaren@apple.com> |
| |
| Introduced JSWithScope, making all scope objects subclasses of JSScope |
| https://bugs.webkit.org/show_bug.cgi?id=95295 |
| |
| Reviewed by Filip Pizlo. |
| |
| This is a step toward removing ScopeChainNode. With a uniform representation |
| for objects in the scope chain, we can move data from ScopeChainNode |
| into JSScope. |
| |
| * CMakeLists.txt: |
| * GNUmakefile.list.am: |
| * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: |
| * JavaScriptCore.xcodeproj/project.pbxproj: |
| * Target.pri: Build! |
| |
| * interpreter/Interpreter.cpp: |
| (JSC::Interpreter::privateExecute): |
| * jit/JITStubs.cpp: |
| (JSC::DEFINE_STUB_FUNCTION): |
| * llint/LLIntSlowPaths.cpp: |
| (JSC::LLInt::LLINT_SLOW_PATH_DECL): Use an explicit JSWithScope object |
| for 'with' statements. Since 'with' can put any object in the scope |
| chain, we'll need an adapter object to hold the data ScopeChainNode |
| currently holds. |
| |
| (JSGlobalData): Support for JSWithScope. |
| |
| * runtime/JSScope.cpp: |
| (JSC::JSScope::objectAtScope): |
| * runtime/JSScope.h: Check for and unwrap JSWithScope. |
| |
| * runtime/JSType.h: Support for JSWithScope. |
| |
| * runtime/StrictEvalActivation.cpp: |
| (JSC::StrictEvalActivation::StrictEvalActivation): |
| * runtime/StrictEvalActivation.h: |
| (StrictEvalActivation): Inherit from JSScope, to make the scope chain uniform. |
| |
| * runtime/JSWithScope.cpp: Added. |
| (JSC::JSWithScope::visitChildren): |
| * runtime/JSWithScope.h: Added. |
| (JSWithScope): |
| (JSC::JSWithScope::create): |
| (JSC::JSWithScope::object): |
| (JSC::JSWithScope::createStructure): |
| (JSC::JSWithScope::JSWithScope): New adapter object. Since this object |
| is never exposed to scripts, it doesn't need any meaningful implementation |
| of property access or other callbacks. |
| |
| 2012-08-29 Patrick Gansterer <paroga@webkit.org> |
| |
| Unreviewed. Build fix for !ENABLE(JIT) after r126962. |
| |
| * interpreter/Interpreter.cpp: |
| (JSC::Interpreter::privateExecute): |
| |
| 2012-08-28 Geoffrey Garen <ggaren@apple.com> |
| |
| Added JSScope::objectInScope(), and refactored callers to use it |
| https://bugs.webkit.org/show_bug.cgi?id=95281 |
| |
| Reviewed by Gavin Barraclough. |
| |
| This is a step toward removing ScopeChainNode. We need a layer of |
| indirection so that 'with' scopes can proxy for an object. |
| JSScope::objectInScope() will be that layer. |
| |
| * bytecode/EvalCodeCache.h: |
| (JSC::EvalCodeCache::tryGet): |
| (JSC::EvalCodeCache::getSlow): |
| * bytecompiler/BytecodeGenerator.cpp: |
| (JSC::BytecodeGenerator::resolve): |
| (JSC::BytecodeGenerator::resolveConstDecl): . vs -> |
| |
| * interpreter/Interpreter.cpp: |
| (JSC::Interpreter::unwindCallFrame): |
| (JSC::Interpreter::execute): |
| * runtime/JSScope.cpp: |
| (JSC::JSScope::resolve): |
| (JSC::JSScope::resolveSkip): |
| (JSC::JSScope::resolveGlobalDynamic): |
| (JSC::JSScope::resolveBase): |
| (JSC::JSScope::resolveWithBase): |
| (JSC::JSScope::resolveWithThis): Added JSScope::objectAtScope() calls. |
| |
| * runtime/JSScope.h: |
| (JSScope): |
| (JSC::JSScope::objectAtScope): |
| (JSC): |
| (ScopeChainIterator): |
| (JSC::ScopeChainIterator::ScopeChainIterator): |
| (JSC::ScopeChainIterator::get): |
| (JSC::ScopeChainIterator::operator->): |
| (JSC::ScopeChainIterator::operator++): |
| (JSC::ScopeChainIterator::operator==): |
| (JSC::ScopeChainIterator::operator!=): |
| (JSC::ScopeChainNode::begin): |
| (JSC::ScopeChainNode::end): I moved ScopeChainIterator to this file |
| to resolve a circular #include problem. Eventually, I'll probably rename |
| it to JSScope::iterator, so I think it belongs here. |
| |
| * runtime/ScopeChain.cpp: |
| (JSC::ScopeChainNode::print): |
| (JSC::ScopeChainNode::localDepth): . vs -> |
| |
| * runtime/ScopeChain.h: |
| (ScopeChainNode): I made the 'object' data member private because it's |
| no longer safe to access -- you need to call JSScope::objectAtScope() |
| instead. |
| |
| The JITs need to be friends because of the private declaration. |
| |
| Subtly, JIT/LLInt code is correct without any changes because JIT/LLInt |
| code never compiles direct access to a with scope. |
| |
| 2012-08-28 Mark Lam <mark.lam@apple.com> |
| |
| Adding support for adding LLInt opcode extensions. This will be needed |
| by the LLInt C loop interpreter later. |
| https://bugs.webkit.org/show_bug.cgi?id=95277. |
| |
| Reviewed by Geoffrey Garen. |
| |
| * JavaScriptCore.xcodeproj/project.pbxproj: |
| * bytecode/Opcode.h: |
| * llint/LLIntOpcode.h: Added. |
| * llint/LowLevelInterpreter.h: |
| |
| 2012-08-28 Gavin Barraclough <barraclough@apple.com> |
| |
| Rolled out r126928, this broke stuff :'-( |
| |
| * jit/JITPropertyAccess.cpp: |
| (JSC::JIT::privateCompilePutByIdTransition): |
| (JSC::JIT::resetPatchPutById): |
| |
| 2012-08-28 Gavin Barraclough <barraclough@apple.com> |
| |
| PutById uses DataLabel32, not DataLabelCompact |
| https://bugs.webkit.org/show_bug.cgi?id=95245 |
| |
| Reviewed by Geoff Garen. |
| |
| JIT::resetPatchPutById calls the the wrong thing on x86-64 – this is moot right now, |
| since they currently both do the same thing, but if we were to ever make compact mean |
| 8-bit this could be a real problem. Also, don't rely on the object still being in eax |
| on entry to the transition stub – this isn't very robust. |
| |
| * jit/JITPropertyAccess.cpp: |
| (JSC::JIT::privateCompilePutByIdTransition): |
| - DataLabelCompact -> DataLabel32 |
| (JSC::JIT::resetPatchPutById): |
| - reload regT0 from the stack |
| |
| 2012-08-28 Sheriff Bot <webkit.review.bot@gmail.com> |
| |
| Unreviewed, rolling out r126914. |
| http://trac.webkit.org/changeset/126914 |
| https://bugs.webkit.org/show_bug.cgi?id=95239 |
| |
| it breaks everything and fixes nothing (Requested by pizlo on |
| #webkit). |
| |
| * API/JSCallbackObject.h: |
| (JSC::JSCallbackObjectData::JSPrivatePropertyMap::getPrivateProperty): |
| (JSC::JSCallbackObjectData::JSPrivatePropertyMap::setPrivateProperty): |
| (JSC::JSCallbackObjectData::JSPrivatePropertyMap::visitChildren): |
| * API/JSCallbackObjectFunctions.h: |
| (JSC::::getOwnPropertyNames): |
| * API/JSClassRef.cpp: |
| (OpaqueJSClass::~OpaqueJSClass): |
| (OpaqueJSClassContextData::OpaqueJSClassContextData): |
| (OpaqueJSClass::contextData): |
| * bytecode/CodeBlock.cpp: |
| (JSC::CodeBlock::dump): |
| (JSC::EvalCodeCache::visitAggregate): |
| (JSC::CodeBlock::nameForRegister): |
| * bytecode/JumpTable.h: |
| (JSC::StringJumpTable::offsetForValue): |
| (JSC::StringJumpTable::ctiForValue): |
| * bytecode/LazyOperandValueProfile.cpp: |
| (JSC::LazyOperandValueProfileParser::getIfPresent): |
| * bytecode/SamplingTool.cpp: |
| (JSC::SamplingTool::dump): |
| * bytecompiler/BytecodeGenerator.cpp: |
| (JSC::BytecodeGenerator::addVar): |
| (JSC::BytecodeGenerator::addGlobalVar): |
| (JSC::BytecodeGenerator::addConstant): |
| (JSC::BytecodeGenerator::addConstantValue): |
| (JSC::BytecodeGenerator::emitLoad): |
| (JSC::BytecodeGenerator::addStringConstant): |
| (JSC::BytecodeGenerator::emitLazyNewFunction): |
| * bytecompiler/NodesCodegen.cpp: |
| (JSC::PropertyListNode::emitBytecode): |
| * debugger/Debugger.cpp: |
| * dfg/DFGArgumentsSimplificationPhase.cpp: |
| (JSC::DFG::ArgumentsSimplificationPhase::run): |
| (JSC::DFG::ArgumentsSimplificationPhase::observeBadArgumentsUse): |
| (JSC::DFG::ArgumentsSimplificationPhase::observeProperArgumentsUse): |
| (JSC::DFG::ArgumentsSimplificationPhase::isOKToOptimize): |
| (JSC::DFG::ArgumentsSimplificationPhase::removeArgumentsReferencingPhantomChild): |
| * dfg/DFGAssemblyHelpers.cpp: |
| (JSC::DFG::AssemblyHelpers::decodedCodeMapFor): |
| * dfg/DFGByteCodeCache.h: |
| (JSC::DFG::ByteCodeCache::~ByteCodeCache): |
| (JSC::DFG::ByteCodeCache::get): |
| * dfg/DFGByteCodeParser.cpp: |
| (JSC::DFG::ByteCodeParser::cellConstant): |
| (JSC::DFG::ByteCodeParser::InlineStackEntry::InlineStackEntry): |
| * dfg/DFGStructureCheckHoistingPhase.cpp: |
| (JSC::DFG::StructureCheckHoistingPhase::run): |
| (JSC::DFG::StructureCheckHoistingPhase::noticeStructureCheck): |
| (JSC::DFG::StructureCheckHoistingPhase::noticeClobber): |
| * heap/Heap.cpp: |
| (JSC::Heap::markProtectedObjects): |
| * heap/Heap.h: |
| (JSC::Heap::forEachProtectedCell): |
| * heap/JITStubRoutineSet.cpp: |
| (JSC::JITStubRoutineSet::markSlow): |
| (JSC::JITStubRoutineSet::deleteUnmarkedJettisonedStubRoutines): |
| * heap/MarkStack.cpp: |
| (JSC::MarkStack::internalAppend): |
| * heap/Weak.h: |
| (JSC::weakRemove): |
| * jit/JIT.cpp: |
| (JSC::JIT::privateCompile): |
| * jit/JITStubs.cpp: |
| (JSC::JITThunks::ctiStub): |
| * parser/Parser.cpp: |
| (JSC::::parseStrictObjectLiteral): |
| * profiler/Profile.cpp: |
| (JSC::functionNameCountPairComparator): |
| (JSC::Profile::debugPrintDataSampleStyle): |
| * runtime/Identifier.cpp: |
| (JSC::Identifier::add): |
| * runtime/JSActivation.cpp: |
| (JSC::JSActivation::getOwnPropertyNames): |
| (JSC::JSActivation::symbolTablePutWithAttributes): |
| * runtime/JSArray.cpp: |
| (JSC::SparseArrayValueMap::put): |
| (JSC::SparseArrayValueMap::putDirect): |
| (JSC::SparseArrayValueMap::visitChildren): |
| (JSC::JSArray::enterDictionaryMode): |
| (JSC::JSArray::defineOwnNumericProperty): |
| (JSC::JSArray::getOwnPropertySlotByIndex): |
| (JSC::JSArray::getOwnPropertyDescriptor): |
| (JSC::JSArray::putByIndexBeyondVectorLength): |
| (JSC::JSArray::putDirectIndexBeyondVectorLength): |
| (JSC::JSArray::deletePropertyByIndex): |
| (JSC::JSArray::getOwnPropertyNames): |
| (JSC::JSArray::setLength): |
| (JSC::JSArray::sort): |
| (JSC::JSArray::compactForSorting): |
| (JSC::JSArray::checkConsistency): |
| * runtime/JSSymbolTableObject.cpp: |
| (JSC::JSSymbolTableObject::getOwnPropertyNames): |
| * runtime/JSSymbolTableObject.h: |
| (JSC::symbolTableGet): |
| (JSC::symbolTablePut): |
| (JSC::symbolTablePutWithAttributes): |
| * runtime/RegExpCache.cpp: |
| (JSC::RegExpCache::invalidateCode): |
| * runtime/WeakGCMap.h: |
| (JSC::WeakGCMap::clear): |
| (JSC::WeakGCMap::set): |
| * tools/ProfileTreeNode.h: |
| (JSC::ProfileTreeNode::sampleChild): |
| (JSC::ProfileTreeNode::childCount): |
| (JSC::ProfileTreeNode::dumpInternal): |
| (JSC::ProfileTreeNode::compareEntries): |
| |
| 2012-08-28 Filip Pizlo <fpizlo@apple.com> |
| |
| LLInt should not rely on ordering of global labels |
| https://bugs.webkit.org/show_bug.cgi?id=95221 |
| |
| Reviewed by Oliver Hunt. |
| |
| * llint/LowLevelInterpreter.asm: |
| * llint/LowLevelInterpreter32_64.asm: |
| * llint/LowLevelInterpreter64.asm: |
| |
| 2012-08-28 Caio Marcelo de Oliveira Filho <caio.oliveira@openbossa.org> |
| |
| Rename first/second to key/value in HashMap iterators |
| https://bugs.webkit.org/show_bug.cgi?id=82784 |
| |
| Reviewed by Eric Seidel. |
| |
| * API/JSCallbackObject.h: |
| (JSC::JSCallbackObjectData::JSPrivatePropertyMap::getPrivateProperty): |
| (JSC::JSCallbackObjectData::JSPrivatePropertyMap::setPrivateProperty): |
| (JSC::JSCallbackObjectData::JSPrivatePropertyMap::visitChildren): |
| * API/JSCallbackObjectFunctions.h: |
| (JSC::::getOwnPropertyNames): |
| * API/JSClassRef.cpp: |
| (OpaqueJSClass::~OpaqueJSClass): |
| (OpaqueJSClassContextData::OpaqueJSClassContextData): |
| (OpaqueJSClass::contextData): |
| * bytecode/CodeBlock.cpp: |
| (JSC::CodeBlock::dump): |
| (JSC::EvalCodeCache::visitAggregate): |
| (JSC::CodeBlock::nameForRegister): |
| * bytecode/JumpTable.h: |
| (JSC::StringJumpTable::offsetForValue): |
| (JSC::StringJumpTable::ctiForValue): |
| * bytecode/LazyOperandValueProfile.cpp: |
| (JSC::LazyOperandValueProfileParser::getIfPresent): |
| * bytecode/SamplingTool.cpp: |
| (JSC::SamplingTool::dump): |
| * bytecompiler/BytecodeGenerator.cpp: |
| (JSC::BytecodeGenerator::addVar): |
| (JSC::BytecodeGenerator::addGlobalVar): |
| (JSC::BytecodeGenerator::addConstant): |
| (JSC::BytecodeGenerator::addConstantValue): |
| (JSC::BytecodeGenerator::emitLoad): |
| (JSC::BytecodeGenerator::addStringConstant): |
| (JSC::BytecodeGenerator::emitLazyNewFunction): |
| * bytecompiler/NodesCodegen.cpp: |
| (JSC::PropertyListNode::emitBytecode): |
| * debugger/Debugger.cpp: |
| * dfg/DFGArgumentsSimplificationPhase.cpp: |
| (JSC::DFG::ArgumentsSimplificationPhase::run): |
| (JSC::DFG::ArgumentsSimplificationPhase::observeBadArgumentsUse): |
| (JSC::DFG::ArgumentsSimplificationPhase::observeProperArgumentsUse): |
| (JSC::DFG::ArgumentsSimplificationPhase::isOKToOptimize): |
| (JSC::DFG::ArgumentsSimplificationPhase::removeArgumentsReferencingPhantomChild): |
| * dfg/DFGAssemblyHelpers.cpp: |
| (JSC::DFG::AssemblyHelpers::decodedCodeMapFor): |
| * dfg/DFGByteCodeCache.h: |
| (JSC::DFG::ByteCodeCache::~ByteCodeCache): |
| (JSC::DFG::ByteCodeCache::get): |
| * dfg/DFGByteCodeParser.cpp: |
| (JSC::DFG::ByteCodeParser::cellConstant): |
| (JSC::DFG::ByteCodeParser::InlineStackEntry::InlineStackEntry): |
| * dfg/DFGStructureCheckHoistingPhase.cpp: |
| (JSC::DFG::StructureCheckHoistingPhase::run): |
| (JSC::DFG::StructureCheckHoistingPhase::noticeStructureCheck): |
| (JSC::DFG::StructureCheckHoistingPhase::noticeClobber): |
| * heap/Heap.cpp: |
| (JSC::Heap::markProtectedObjects): |
| * heap/Heap.h: |
| (JSC::Heap::forEachProtectedCell): |
| * heap/JITStubRoutineSet.cpp: |
| (JSC::JITStubRoutineSet::markSlow): |
| (JSC::JITStubRoutineSet::deleteUnmarkedJettisonedStubRoutines): |
| * heap/MarkStack.cpp: |
| (JSC::MarkStack::internalAppend): |
| * heap/Weak.h: |
| (JSC::weakRemove): |
| * jit/JIT.cpp: |
| (JSC::JIT::privateCompile): |
| * jit/JITStubs.cpp: |
| (JSC::JITThunks::ctiStub): |
| * parser/Parser.cpp: |
| (JSC::::parseStrictObjectLiteral): |
| * profiler/Profile.cpp: |
| (JSC::functionNameCountPairComparator): |
| (JSC::Profile::debugPrintDataSampleStyle): |
| * runtime/Identifier.cpp: |
| (JSC::Identifier::add): |
| * runtime/JSActivation.cpp: |
| (JSC::JSActivation::getOwnPropertyNames): |
| (JSC::JSActivation::symbolTablePutWithAttributes): |
| * runtime/JSArray.cpp: |
| (JSC::SparseArrayValueMap::put): |
| (JSC::SparseArrayValueMap::putDirect): |
| (JSC::SparseArrayValueMap::visitChildren): |
| (JSC::JSArray::enterDictionaryMode): |
| (JSC::JSArray::defineOwnNumericProperty): |
| (JSC::JSArray::getOwnPropertySlotByIndex): |
| (JSC::JSArray::getOwnPropertyDescriptor): |
| (JSC::JSArray::putByIndexBeyondVectorLength): |
| (JSC::JSArray::putDirectIndexBeyondVectorLength): |
| (JSC::JSArray::deletePropertyByIndex): |
| (JSC::JSArray::getOwnPropertyNames): |
| (JSC::JSArray::setLength): |
| (JSC::JSArray::sort): |
| (JSC::JSArray::compactForSorting): |
| (JSC::JSArray::checkConsistency): |
| * runtime/JSSymbolTableObject.cpp: |
| (JSC::JSSymbolTableObject::getOwnPropertyNames): |
| * runtime/JSSymbolTableObject.h: |
| (JSC::symbolTableGet): |
| (JSC::symbolTablePut): |
| (JSC::symbolTablePutWithAttributes): |
| * runtime/RegExpCache.cpp: |
| (JSC::RegExpCache::invalidateCode): |
| * runtime/WeakGCMap.h: |
| (JSC::WeakGCMap::clear): |
| (JSC::WeakGCMap::set): |
| * tools/ProfileTreeNode.h: |
| (JSC::ProfileTreeNode::sampleChild): |
| (JSC::ProfileTreeNode::childCount): |
| (JSC::ProfileTreeNode::dumpInternal): |
| (JSC::ProfileTreeNode::compareEntries): |
| |
| 2012-08-28 Geoffrey Garen <ggaren@apple.com> |
| |
| GCC warning in JSActivation is causing Mac EWS errors |
| https://bugs.webkit.org/show_bug.cgi?id=95103 |
| |
| Reviewed by Sam Weinig. |
| |
| Try to fix a strict aliasing violation by using bitwise_cast. The |
| union in the cast should signal to the compiler that aliasing between |
| types is happening. |
| |
| * runtime/JSActivation.cpp: |
| (JSC::JSActivation::visitChildren): |
| |
| 2012-08-28 Geoffrey Garen <ggaren@apple.com> |
| |
| Build fix: svn add two files I forgot in my last patch. |
| |
| 2012-08-27 Geoffrey Garen <ggaren@apple.com> |
| |
| Refactored and consolidated variable resolution functions |
| https://bugs.webkit.org/show_bug.cgi?id=95166 |
| |
| Reviewed by Filip Pizlo. |
| |
| This patch does a few things: |
| |
| (1) Introduces a new class, JSScope, which is the base class for all |
| objects that represent a scope in the scope chain. |
| |
| (2) Refactors and consolidates duplicate implementations of variable |
| resolution into the JSScope class. |
| |
| (3) Renames JSStaticScopeObject to JSNameScope because, as distinct from |
| something like a 'let' scope, JSStaticScopeObject only has storage for a |
| single name. |
| |
| These changes makes logical sense to me as-is. I will also use them in an |
| upcoming optimization. |
| |
| * CMakeLists.txt: |
| * GNUmakefile.list.am: |
| * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: |
| * JavaScriptCore.xcodeproj/project.pbxproj: |
| * Target.pri: Build! |
| |
| * bytecode/CodeBlock.cpp: |
| (JSC): Build fix for LLInt-only builds. |
| |
| * bytecode/GlobalResolveInfo.h: |
| (GlobalResolveInfo): Use PropertyOffset to be consistent with other parts |
| of the engine. |
| |
| * bytecompiler/NodesCodegen.cpp: |
| * dfg/DFGOperations.cpp: Use the shared code in JSScope instead of rolling |
| our own. |
| |
| * interpreter/Interpreter.cpp: |
| (JSC::Interpreter::execute): |
| (JSC::Interpreter::createExceptionScope): |
| (JSC::Interpreter::privateExecute): |
| * interpreter/Interpreter.h: Use the shared code in JSScope instead of rolling |
| our own. |
| |
| * jit/JITStubs.cpp: |
| (JSC::DEFINE_STUB_FUNCTION): Use the shared code in JSScope instead of rolling |
| our own. |
| |
| * llint/LLIntSlowPaths.cpp: |
| (JSC::LLInt::LLINT_SLOW_PATH_DECL): |
| (LLInt): Use the shared code in JSScope instead of rolling our own. Note |
| that one of these slow paths calls the wrong helper function. I left it |
| that way to avoid a behavior change in a refactoring patch. |
| |
| * parser/Nodes.cpp: Updated for rename. |
| |
| * runtime/CommonSlowPaths.h: |
| (CommonSlowPaths): Removed resolve slow paths because were duplicative. |
| |
| * runtime/JSGlobalData.cpp: |
| (JSC::JSGlobalData::JSGlobalData): |
| * runtime/JSGlobalData.h: |
| (JSGlobalData): Updated for renames. |
| |
| * runtime/JSNameScope.cpp: Copied from Source/JavaScriptCore/runtime/JSStaticScopeObject.cpp. |
| (JSC): |
| (JSC::JSNameScope::visitChildren): |
| (JSC::JSNameScope::toThisObject): |
| (JSC::JSNameScope::put): |
| (JSC::JSNameScope::getOwnPropertySlot): |
| * runtime/JSNameScope.h: Copied from Source/JavaScriptCore/runtime/JSStaticScopeObject.h. |
| (JSC): |
| (JSC::JSNameScope::create): |
| (JSC::JSNameScope::createStructure): |
| (JSNameScope): |
| (JSC::JSNameScope::JSNameScope): |
| (JSC::JSNameScope::isDynamicScope): Used do-webcore-rename script here. |
| It is fabulous! |
| |
| * runtime/JSObject.h: |
| (JSObject): |
| (JSC::JSObject::isNameScopeObject): More rename. |
| |
| * runtime/JSScope.cpp: Added. |
| (JSC): |
| (JSC::JSScope::isDynamicScope): |
| (JSC::JSScope::resolve): |
| (JSC::JSScope::resolveSkip): |
| (JSC::JSScope::resolveGlobal): |
| (JSC::JSScope::resolveGlobalDynamic): |
| (JSC::JSScope::resolveBase): |
| (JSC::JSScope::resolveWithBase): |
| (JSC::JSScope::resolveWithThis): |
| * runtime/JSScope.h: Added. |
| (JSC): |
| (JSScope): |
| (JSC::JSScope::JSScope): All the code here is a port from the |
| Interpreter.cpp implementations of this functionality. |
| |
| * runtime/JSStaticScopeObject.cpp: Removed. |
| * runtime/JSStaticScopeObject.h: Removed. |
| |
| * runtime/JSSymbolTableObject.cpp: |
| (JSC): |
| * runtime/JSSymbolTableObject.h: |
| (JSSymbolTableObject): |
| * runtime/JSType.h: Updated for rename. |
| |
| * runtime/Operations.h: |
| (JSC::resolveBase): Removed because it was duplicative. |
| |
| 2012-08-28 Alban Browaeys <prahal@yahoo.com> |
| |
| [GTK] LLint build fails with -g -02 |
| https://bugs.webkit.org/show_bug.cgi?id=90098 |
| |
| Reviewed by Filip Pizlo. |
| |
| Avoid duplicate offsets for llint, discarding them. |
| |
| * offlineasm/offsets.rb: |
| |
| 2012-08-27 Sheriff Bot <webkit.review.bot@gmail.com> |
| |
| Unreviewed, rolling out r126836. |
| http://trac.webkit.org/changeset/126836 |
| https://bugs.webkit.org/show_bug.cgi?id=95163 |
| |
| Broke all Apple ports, EFL, and Qt. (Requested by tkent on |
| #webkit). |
| |
| * API/JSCallbackObject.h: |
| (JSC::JSCallbackObjectData::JSPrivatePropertyMap::getPrivateProperty): |
| (JSC::JSCallbackObjectData::JSPrivatePropertyMap::setPrivateProperty): |
| (JSC::JSCallbackObjectData::JSPrivatePropertyMap::visitChildren): |
| * API/JSCallbackObjectFunctions.h: |
| (JSC::::getOwnPropertyNames): |
| * API/JSClassRef.cpp: |
| (OpaqueJSClass::~OpaqueJSClass): |
| (OpaqueJSClassContextData::OpaqueJSClassContextData): |
| (OpaqueJSClass::contextData): |
| * bytecode/CodeBlock.cpp: |
| (JSC::CodeBlock::dump): |
| (JSC::EvalCodeCache::visitAggregate): |
| (JSC::CodeBlock::nameForRegister): |
| * bytecode/JumpTable.h: |
| (JSC::StringJumpTable::offsetForValue): |
| (JSC::StringJumpTable::ctiForValue): |
| * bytecode/LazyOperandValueProfile.cpp: |
| (JSC::LazyOperandValueProfileParser::getIfPresent): |
| * bytecode/SamplingTool.cpp: |
| (JSC::SamplingTool::dump): |
| * bytecompiler/BytecodeGenerator.cpp: |
| (JSC::BytecodeGenerator::addVar): |
| (JSC::BytecodeGenerator::addGlobalVar): |
| (JSC::BytecodeGenerator::addConstant): |
| (JSC::BytecodeGenerator::addConstantValue): |
| (JSC::BytecodeGenerator::emitLoad): |
| (JSC::BytecodeGenerator::addStringConstant): |
| (JSC::BytecodeGenerator::emitLazyNewFunction): |
| * bytecompiler/NodesCodegen.cpp: |
| (JSC::PropertyListNode::emitBytecode): |
| * debugger/Debugger.cpp: |
| * dfg/DFGArgumentsSimplificationPhase.cpp: |
| (JSC::DFG::ArgumentsSimplificationPhase::run): |
| (JSC::DFG::ArgumentsSimplificationPhase::observeBadArgumentsUse): |
| (JSC::DFG::ArgumentsSimplificationPhase::observeProperArgumentsUse): |
| (JSC::DFG::ArgumentsSimplificationPhase::isOKToOptimize): |
| (JSC::DFG::ArgumentsSimplificationPhase::removeArgumentsReferencingPhantomChild): |
| * dfg/DFGAssemblyHelpers.cpp: |
| (JSC::DFG::AssemblyHelpers::decodedCodeMapFor): |
| * dfg/DFGByteCodeCache.h: |
| (JSC::DFG::ByteCodeCache::~ByteCodeCache): |
| (JSC::DFG::ByteCodeCache::get): |
| * dfg/DFGByteCodeParser.cpp: |
| (JSC::DFG::ByteCodeParser::cellConstant): |
| (JSC::DFG::ByteCodeParser::InlineStackEntry::InlineStackEntry): |
| * dfg/DFGStructureCheckHoistingPhase.cpp: |
| (JSC::DFG::StructureCheckHoistingPhase::run): |
| (JSC::DFG::StructureCheckHoistingPhase::noticeStructureCheck): |
| (JSC::DFG::StructureCheckHoistingPhase::noticeClobber): |
| * heap/Heap.cpp: |
| (JSC::Heap::markProtectedObjects): |
| * heap/Heap.h: |
| (JSC::Heap::forEachProtectedCell): |
| * heap/JITStubRoutineSet.cpp: |
| (JSC::JITStubRoutineSet::markSlow): |
| (JSC::JITStubRoutineSet::deleteUnmarkedJettisonedStubRoutines): |
| * heap/MarkStack.cpp: |
| (JSC::MarkStack::internalAppend): |
| * heap/Weak.h: |
| (JSC::weakRemove): |
| * jit/JIT.cpp: |
| (JSC::JIT::privateCompile): |
| * jit/JITStubs.cpp: |
| (JSC::JITThunks::ctiStub): |
| * parser/Parser.cpp: |
| (JSC::::parseStrictObjectLiteral): |
| * profiler/Profile.cpp: |
| (JSC::functionNameCountPairComparator): |
| (JSC::Profile::debugPrintDataSampleStyle): |
| * runtime/Identifier.cpp: |
| (JSC::Identifier::add): |
| * runtime/JSActivation.cpp: |
| (JSC::JSActivation::getOwnPropertyNames): |
| (JSC::JSActivation::symbolTablePutWithAttributes): |
| * runtime/JSArray.cpp: |
| (JSC::SparseArrayValueMap::put): |
| (JSC::SparseArrayValueMap::putDirect): |
| (JSC::SparseArrayValueMap::visitChildren): |
| (JSC::JSArray::enterDictionaryMode): |
| (JSC::JSArray::defineOwnNumericProperty): |
| (JSC::JSArray::getOwnPropertySlotByIndex): |
| (JSC::JSArray::getOwnPropertyDescriptor): |
| (JSC::JSArray::putByIndexBeyondVectorLength): |
| (JSC::JSArray::putDirectIndexBeyondVectorLength): |
| (JSC::JSArray::deletePropertyByIndex): |
| (JSC::JSArray::getOwnPropertyNames): |
| (JSC::JSArray::setLength): |
| (JSC::JSArray::sort): |
| (JSC::JSArray::compactForSorting): |
| (JSC::JSArray::checkConsistency): |
| * runtime/JSSymbolTableObject.cpp: |
| (JSC::JSSymbolTableObject::getOwnPropertyNames): |
| * runtime/JSSymbolTableObject.h: |
| (JSC::symbolTableGet): |
| (JSC::symbolTablePut): |
| (JSC::symbolTablePutWithAttributes): |
| * runtime/RegExpCache.cpp: |
| (JSC::RegExpCache::invalidateCode): |
| * runtime/WeakGCMap.h: |
| (JSC::WeakGCMap::clear): |
| (JSC::WeakGCMap::set): |
| * tools/ProfileTreeNode.h: |
| (JSC::ProfileTreeNode::sampleChild): |
| (JSC::ProfileTreeNode::childCount): |
| (JSC::ProfileTreeNode::dumpInternal): |
| (JSC::ProfileTreeNode::compareEntries): |
| |
| 2012-08-27 Caio Marcelo de Oliveira Filho <caio.oliveira@openbossa.org> |
| |
| Rename first/second to key/value in HashMap iterators |
| https://bugs.webkit.org/show_bug.cgi?id=82784 |
| |
| Reviewed by Eric Seidel. |
| |
| * API/JSCallbackObject.h: |
| (JSC::JSCallbackObjectData::JSPrivatePropertyMap::getPrivateProperty): |
| (JSC::JSCallbackObjectData::JSPrivatePropertyMap::setPrivateProperty): |
| (JSC::JSCallbackObjectData::JSPrivatePropertyMap::visitChildren): |
| * API/JSCallbackObjectFunctions.h: |
| (JSC::::getOwnPropertyNames): |
| * API/JSClassRef.cpp: |
| (OpaqueJSClass::~OpaqueJSClass): |
| (OpaqueJSClassContextData::OpaqueJSClassContextData): |
| (OpaqueJSClass::contextData): |
| * bytecode/CodeBlock.cpp: |
| (JSC::CodeBlock::dump): |
| (JSC::EvalCodeCache::visitAggregate): |
| (JSC::CodeBlock::nameForRegister): |
| * bytecode/JumpTable.h: |
| (JSC::StringJumpTable::offsetForValue): |
| (JSC::StringJumpTable::ctiForValue): |
| * bytecode/LazyOperandValueProfile.cpp: |
| (JSC::LazyOperandValueProfileParser::getIfPresent): |
| * bytecode/SamplingTool.cpp: |
| (JSC::SamplingTool::dump): |
| * bytecompiler/BytecodeGenerator.cpp: |
| (JSC::BytecodeGenerator::addVar): |
| (JSC::BytecodeGenerator::addGlobalVar): |
| (JSC::BytecodeGenerator::addConstant): |
| (JSC::BytecodeGenerator::addConstantValue): |
| (JSC::BytecodeGenerator::emitLoad): |
| (JSC::BytecodeGenerator::addStringConstant): |
| (JSC::BytecodeGenerator::emitLazyNewFunction): |
| * bytecompiler/NodesCodegen.cpp: |
| (JSC::PropertyListNode::emitBytecode): |
| * debugger/Debugger.cpp: |
| * dfg/DFGArgumentsSimplificationPhase.cpp: |
| (JSC::DFG::ArgumentsSimplificationPhase::run): |
| (JSC::DFG::ArgumentsSimplificationPhase::observeBadArgumentsUse): |
| (JSC::DFG::ArgumentsSimplificationPhase::observeProperArgumentsUse): |
| (JSC::DFG::ArgumentsSimplificationPhase::isOKToOptimize): |
| (JSC::DFG::ArgumentsSimplificationPhase::removeArgumentsReferencingPhantomChild): |
| * dfg/DFGAssemblyHelpers.cpp: |
| (JSC::DFG::AssemblyHelpers::decodedCodeMapFor): |
| * dfg/DFGByteCodeCache.h: |
| (JSC::DFG::ByteCodeCache::~ByteCodeCache): |
| (JSC::DFG::ByteCodeCache::get): |
| * dfg/DFGByteCodeParser.cpp: |
| (JSC::DFG::ByteCodeParser::cellConstant): |
| (JSC::DFG::ByteCodeParser::InlineStackEntry::InlineStackEntry): |
| * dfg/DFGStructureCheckHoistingPhase.cpp: |
| (JSC::DFG::StructureCheckHoistingPhase::run): |
| (JSC::DFG::StructureCheckHoistingPhase::noticeStructureCheck): |
| (JSC::DFG::StructureCheckHoistingPhase::noticeClobber): |
| * heap/Heap.cpp: |
| (JSC::Heap::markProtectedObjects): |
| * heap/Heap.h: |
| (JSC::Heap::forEachProtectedCell): |
| * heap/JITStubRoutineSet.cpp: |
| (JSC::JITStubRoutineSet::markSlow): |
| (JSC::JITStubRoutineSet::deleteUnmarkedJettisonedStubRoutines): |
| * heap/MarkStack.cpp: |
| (JSC::MarkStack::internalAppend): |
| * heap/Weak.h: |
| (JSC::weakRemove): |
| * jit/JIT.cpp: |
| (JSC::JIT::privateCompile): |
| * jit/JITStubs.cpp: |
| (JSC::JITThunks::ctiStub): |
| * parser/Parser.cpp: |
| (JSC::::parseStrictObjectLiteral): |
| * profiler/Profile.cpp: |
| (JSC::functionNameCountPairComparator): |
| (JSC::Profile::debugPrintDataSampleStyle): |
| * runtime/Identifier.cpp: |
| (JSC::Identifier::add): |
| * runtime/JSActivation.cpp: |
| (JSC::JSActivation::getOwnPropertyNames): |
| (JSC::JSActivation::symbolTablePutWithAttributes): |
| * runtime/JSArray.cpp: |
| (JSC::SparseArrayValueMap::put): |
| (JSC::SparseArrayValueMap::putDirect): |
| (JSC::SparseArrayValueMap::visitChildren): |
| (JSC::JSArray::enterDictionaryMode): |
| (JSC::JSArray::defineOwnNumericProperty): |
| (JSC::JSArray::getOwnPropertySlotByIndex): |
| (JSC::JSArray::getOwnPropertyDescriptor): |
| (JSC::JSArray::putByIndexBeyondVectorLength): |
| (JSC::JSArray::putDirectIndexBeyondVectorLength): |
| (JSC::JSArray::deletePropertyByIndex): |
| (JSC::JSArray::getOwnPropertyNames): |
| (JSC::JSArray::setLength): |
| (JSC::JSArray::sort): |
| (JSC::JSArray::compactForSorting): |
| (JSC::JSArray::checkConsistency): |
| * runtime/JSSymbolTableObject.cpp: |
| (JSC::JSSymbolTableObject::getOwnPropertyNames): |
| * runtime/JSSymbolTableObject.h: |
| (JSC::symbolTableGet): |
| (JSC::symbolTablePut): |
| (JSC::symbolTablePutWithAttributes): |
| * runtime/RegExpCache.cpp: |
| (JSC::RegExpCache::invalidateCode): |
| * runtime/WeakGCMap.h: |
| (JSC::WeakGCMap::clear): |
| (JSC::WeakGCMap::set): |
| * tools/ProfileTreeNode.h: |
| (JSC::ProfileTreeNode::sampleChild): |
| (JSC::ProfileTreeNode::childCount): |
| (JSC::ProfileTreeNode::dumpInternal): |
| (JSC::ProfileTreeNode::compareEntries): |
| |
| 2012-08-27 Filip Pizlo <fpizlo@apple.com> |
| |
| Structure check hoisting should abstain if the OSR entry's must-handle value for the respective variable has a different structure |
| https://bugs.webkit.org/show_bug.cgi?id=95141 |
| <rdar://problem/12170401> |
| |
| Reviewed by Mark Hahnenberg. |
| |
| * dfg/DFGStructureCheckHoistingPhase.cpp: |
| (JSC::DFG::StructureCheckHoistingPhase::run): |
| |
| 2012-08-27 Mark Hahnenberg <mhahnenberg@apple.com> |
| |
| Remove use of ClassInfo from SpeculativeJIT::compileGetByValOnArguments |
| https://bugs.webkit.org/show_bug.cgi?id=95131 |
| |
| Reviewed by Filip Pizlo. |
| |
| * dfg/DFGSpeculativeJIT.cpp: |
| (JSC::DFG::SpeculativeJIT::compileGetByValOnArguments): We don't need this speculation check. We can replace it |
| with an assert to guarantee this. |
| |
| 2012-08-27 Oliver Hunt <oliver@apple.com> |
| |
| Remove opcode definition autogen for now |
| https://bugs.webkit.org/show_bug.cgi?id=95148 |
| |
| Reviewed by Mark Hahnenberg. |
| |
| This isn't worth doing at the moment. |
| |
| * DerivedSources.make: |
| * JavaScriptCore.xcodeproj/project.pbxproj: |
| * bytecode/Opcode.h: |
| (JSC): |
| (JSC::padOpcodeName): |
| * bytecode/OpcodeDefinitions.h: Removed. |
| * bytecode/opcodes: Removed. |
| * opcode_definition_generator.py: Removed. |
| * opcode_generator.py: Removed. |
| * opcode_parser.py: Removed. |
| |
| 2012-08-27 Mark Hahnenberg <mhahnenberg@apple.com> |
| |
| Remove uses of TypedArray ClassInfo from SpeculativeJIT::checkArgumentTypes |
| https://bugs.webkit.org/show_bug.cgi?id=95112 |
| |
| Reviewed by Filip Pizlo. |
| |
| Removing these checks since we no longer need them. |
| |
| * dfg/DFGAbstractState.cpp: |
| (JSC::DFG::AbstractState::initialize): |
| * dfg/DFGSpeculativeJIT.cpp: |
| (JSC::DFG::SpeculativeJIT::checkArgumentTypes): |
| |
| 2012-08-27 Benjamin Poulain <benjamin@webkit.org> |
| |
| Add ECMAScript Number to String conversion to WTF::String |
| https://bugs.webkit.org/show_bug.cgi?id=95016 |
| |
| Reviewed by Geoffrey Garen. |
| |
| Rename UString::number(double) to UString::numberToStringECMAScript(double) to |
| differenciate it from the fixed-width conversion performed by String::number(). |
| |
| * parser/ParserArena.h: |
| (JSC::IdentifierArena::makeNumericIdentifier): |
| * runtime/JSONObject.cpp: |
| (JSC::Stringifier::appendStringifiedValue): |
| * runtime/NumberPrototype.cpp: |
| (JSC::numberProtoFuncToExponential): |
| (JSC::numberProtoFuncToFixed): |
| (JSC::numberProtoFuncToPrecision): |
| (JSC::numberProtoFuncToString): |
| * runtime/NumericStrings.h: |
| (JSC::NumericStrings::add): |
| * runtime/UString.cpp: |
| (JSC::UString::numberToStringECMAScript): |
| * runtime/UString.h: |
| (UString): |
| |
| 2012-08-27 Mikhail Pozdnyakov <mikhail.pozdnyakov@intel.com> |
| |
| Rename RegisterProtocolHandler API to NavigatorContentUtils |
| https://bugs.webkit.org/show_bug.cgi?id=94920 |
| |
| Reviewed by Adam Barth. |
| |
| ENABLE_REGISTER_PROTOCOL_HANDLER is renamed to ENABLE_NAVIGATOR_CONTENT_UTILS. |
| |
| * Configurations/FeatureDefines.xcconfig: |
| |
| 2012-08-26 Filip Pizlo <fpizlo@apple.com> |
| |
| Unreviewed, fix for builds without VALUE_PROFILING. I had forgotten that shouldEmitProfiling() |
| is designed to return true if DFG_JIT is disabled. I should be using canBeOptimized() instead. |
| |
| * jit/JITCall.cpp: |
| (JSC::JIT::compileOpCall): |
| * jit/JITCall32_64.cpp: |
| (JSC::JIT::compileOpCall): |
| |
| 2012-08-26 Geoffrey Garen <ggaren@apple.com> |
| |
| Don't allocate space for arguments and call frame if arguments aren't captured |
| https://bugs.webkit.org/show_bug.cgi?id=95024 |
| |
| Reviewed by Phil Pizlo. |
| |
| 27% on v8-real-earley. |
| |
| * runtime/JSActivation.h: |
| (JSC::JSActivation::registerOffset): The offset is zero if we're skipping |
| the arguments and call frame because "offset" means space reserved for |
| those things. |
| |
| (JSC::JSActivation::tearOff): Don't copy the scope chain and callee. We |
| don't need them for anything, and we're no longer guaranteed to have |
| space for them. |
| |
| 2012-08-26 Geoffrey Garen <ggaren@apple.com> |
| |
| Removed the NULL checks from visitChildren functions |
| https://bugs.webkit.org/show_bug.cgi?id=95021 |
| |
| Reviewed by Oliver Hunt. |
| |
| As of http://trac.webkit.org/changeset/126624, all values are NULL-checked |
| during GC, so explicit NULL checks aren't needed anymore. |
| |
| 2011-08-26 Geoffrey Garen <ggaren@apple.com> |
| |
| Removed a JSC-specific hack from the web inspector |
| https://bugs.webkit.org/show_bug.cgi?id=95033 |
| |
| Reviewed by Filip Pizlo. |
| |
| Added support for what the web inspector really wanted instead. |
| |
| * runtime/JSActivation.cpp: |
| (JSC::JSActivation::symbolTableGet): |
| (JSC::JSActivation::symbolTablePut): Added some explanation for these |
| checks, which were non-obvious to me. |
| |
| (JSC::JSActivation::getOwnPropertySlot): It's impossible to access the |
| arguments property of an activation after it's been torn off, since the |
| only way to tear off an activation is to instantiate a new function, |
| which has its own arguments property in scope. However, the inspector |
| get special access to activations, and may try to perform this access, |
| so we need a special guard to maintain coherence and avoid crashing in |
| case the activation optimized out the arguments property. |
| |
| * runtime/JSActivation.cpp: |
| (JSC::JSActivation::symbolTableGet): |
| (JSC::JSActivation::symbolTablePut): |
| (JSC::JSActivation::getOwnPropertyNames): |
| (JSC::JSActivation::getOwnPropertyDescriptor): Provide getOwnPropertyNames |
| and getOwnPropertyDescriptor implementations, to meet the web inspector's |
| needs. (User code can never call these.) |
| |
| 2012-08-24 Filip Pizlo <fpizlo@apple.com> |
| |
| Finally inlining should correctly track the catch context |
| https://bugs.webkit.org/show_bug.cgi?id=94986 |
| <rdar://problem/11753784> |
| |
| Reviewed by Sam Weinig. |
| |
| This fixes two behaviors: |
| |
| 1) Throwing from a finally block. Previously, we would seem to reenter the finally |
| block - though only once. |
| |
| 2) Executing a finally block from some nested context, for example due to a |
| 'continue', 'break', or 'return' in the try. This would execute the finally |
| block in the context of of the try block, which could lead to either scope depth |
| mismatches or reexecutions of the finally block on throw, similarly to (1) but |
| for different reasons. |
| |
| * bytecompiler/BytecodeGenerator.cpp: |
| (JSC): |
| (JSC::BytecodeGenerator::pushFinallyContext): |
| (JSC::BytecodeGenerator::emitComplexJumpScopes): |
| (JSC::BytecodeGenerator::pushTry): |
| (JSC::BytecodeGenerator::popTryAndEmitCatch): |
| * bytecompiler/BytecodeGenerator.h: |
| (FinallyContext): |
| (TryData): |
| (JSC): |
| (TryContext): |
| (TryRange): |
| (BytecodeGenerator): |
| * bytecompiler/NodesCodegen.cpp: |
| (JSC::TryNode::emitBytecode): |
| |
| 2012-08-26 Filip Pizlo <fpizlo@apple.com> |
| |
| Array type checks and storage accesses should be uniformly represented and available to CSE |
| https://bugs.webkit.org/show_bug.cgi?id=95013 |
| |
| Reviewed by Oliver Hunt. |
| |
| This uniformly breaks up all array accesses into up to three parts: |
| |
| 1) The type check, using a newly introduced CheckArray node, in addition to possibly |
| a CheckStructure node. We were already inserting the CheckStructure prior to this |
| patch. The CheckArray node will be automatically eliminated if the thing it was |
| checking for had already been checked for, either intentionally (a CheckStructure |
| inserted based on the array profile of this access) or accidentally (some checks, |
| typically a CheckStructure, inserted for some unrelated operations). The |
| CheckArray node may not be inserted if the array type is non-specific (Generic or |
| ForceExit). |
| |
| 2) The storage load using GetIndexedPropertyStorage. Previously, this only worked for |
| GetByVal. Now it works for all array accesses. The storage load may not be |
| inserted if the mode of array access does not permit CSE of storage loads (like |
| non-specific modes or Arguments). |
| |
| 3) The access itself: one of GetByVal, PutByVal, PutByValAlias, ArrayPush, ArrayPop, |
| GetArrayLength, StringCharAt, or StringCharCodeAt. |
| |
| This means that the type check can be subjected to CSE even if the CFA isn't smart |
| enough to reason about it (yet!). It also means that the storage load can always be |
| subjected to CSE; previously CSE on storage load only worked for array loads and not |
| other forms of access. Finally, it removes the bizarre behavior that |
| GetIndexedPropertyStorage previously had: previously, it was responsible for the type |
| check in some cases, but not others; this made reasoning about the CFA really |
| confusing. |
| |
| This change also disables late refinement of array mode, since I decided that |
| supporting that feature is both confusing and likely unprofitable. The array modes are |
| now locked in in the first fixup run after prediction propagation. Of course, |
| refinements from Generic to something else would not have been a problem; we could |
| reenable those if we thought we really needed to. |
| |
| * dfg/DFGAbstractState.cpp: |
| (JSC::DFG::AbstractState::execute): |
| * dfg/DFGArgumentsSimplificationPhase.cpp: |
| (JSC::DFG::ArgumentsSimplificationPhase::run): |
| * dfg/DFGArrayMode.cpp: |
| (JSC::DFG::fromStructure): |
| (DFG): |
| (JSC::DFG::refineArrayMode): |
| * dfg/DFGArrayMode.h: |
| (DFG): |
| (JSC::DFG::modeIsJSArray): |
| (JSC::DFG::lengthNeedsStorage): |
| (JSC::DFG::modeIsSpecific): |
| (JSC::DFG::modeSupportsLength): |
| * dfg/DFGByteCodeParser.cpp: |
| (JSC::DFG::ByteCodeParser::ByteCodeParser): |
| (JSC::DFG::ByteCodeParser::getArrayMode): |
| (ByteCodeParser): |
| (JSC::DFG::ByteCodeParser::getArrayModeAndEmitChecks): |
| (JSC::DFG::ByteCodeParser::handleIntrinsic): |
| (JSC::DFG::ByteCodeParser::parseBlock): |
| * dfg/DFGCFGSimplificationPhase.cpp: |
| (JSC::DFG::CFGSimplificationPhase::mergeBlocks): |
| * dfg/DFGCSEPhase.cpp: |
| (JSC::DFG::CSEPhase::CSEPhase): |
| (JSC::DFG::CSEPhase::checkStructureElimination): |
| (CSEPhase): |
| (JSC::DFG::CSEPhase::checkArrayElimination): |
| (JSC::DFG::CSEPhase::getIndexedPropertyStorageLoadElimination): |
| (JSC::DFG::CSEPhase::performNodeCSE): |
| (JSC::DFG::performCSE): |
| * dfg/DFGCSEPhase.h: |
| (DFG): |
| * dfg/DFGCommon.h: |
| * dfg/DFGConstantFoldingPhase.cpp: |
| (JSC::DFG::ConstantFoldingPhase::foldConstants): |
| * dfg/DFGDriver.cpp: |
| (JSC::DFG::compile): |
| * dfg/DFGFixupPhase.cpp: |
| (JSC::DFG::FixupPhase::fixupNode): |
| (JSC::DFG::FixupPhase::checkArray): |
| (FixupPhase): |
| (JSC::DFG::FixupPhase::blessArrayOperation): |
| * dfg/DFGGraph.cpp: |
| (JSC::DFG::Graph::Graph): |
| (DFG): |
| (JSC::DFG::Graph::dump): |
| (JSC::DFG::Graph::collectGarbage): |
| * dfg/DFGGraph.h: |
| (Graph): |
| (JSC::DFG::Graph::vote): |
| (JSC::DFG::Graph::substitute): |
| * dfg/DFGNode.h: |
| (JSC::DFG::Node::hasArrayMode): |
| (JSC::DFG::Node::setArrayMode): |
| * dfg/DFGNodeType.h: |
| (DFG): |
| * dfg/DFGOperations.cpp: |
| * dfg/DFGPhase.h: |
| (DFG): |
| * dfg/DFGPredictionPropagationPhase.cpp: |
| (JSC::DFG::PredictionPropagationPhase::propagate): |
| (JSC::DFG::PredictionPropagationPhase::mergeDefaultFlags): |
| * dfg/DFGSpeculativeJIT.cpp: |
| (JSC::DFG::SpeculativeJIT::checkArray): |
| (JSC::DFG::SpeculativeJIT::useChildren): |
| (JSC::DFG::SpeculativeJIT::compilePutByValForIntTypedArray): |
| (JSC::DFG::SpeculativeJIT::compilePutByValForFloatTypedArray): |
| (JSC::DFG::SpeculativeJIT::compileGetIndexedPropertyStorage): |
| (JSC::DFG::SpeculativeJIT::compileGetArrayLength): |
| * dfg/DFGSpeculativeJIT.h: |
| (SpeculativeJIT): |
| * dfg/DFGSpeculativeJIT32_64.cpp: |
| (JSC::DFG::SpeculativeJIT::compile): |
| * dfg/DFGSpeculativeJIT64.cpp: |
| (JSC::DFG::SpeculativeJIT::compile): |
| * dfg/DFGStructureCheckHoistingPhase.cpp: |
| (JSC::DFG::StructureCheckHoistingPhase::run): |
| |
| 2012-08-26 Filip Pizlo <fpizlo@apple.com> |
| |
| DFGGraph.h has a bogus comment about the nature of StorageAccessData |
| https://bugs.webkit.org/show_bug.cgi?id=95035 |
| |
| Reviewed by Oliver Hunt. |
| |
| The comment is both wrong (storage access instructions don't reference CheckStructure) |
| and highly redundant: of course it's the case that two structures may have the same |
| identifier. Our interference analyses currently don't care about this and make the |
| conservative assumptions when necessary (same identifier, same object -> must be same |
| property; same identifier, may be same object -> may be the same property). Better to |
| remove the bogus comment since the code that operates over this data structure is |
| fairly self-explanatory already. |
| |
| * dfg/DFGGraph.h: |
| (StorageAccessData): |
| |
| 2012-08-25 Geoffrey Garen <ggaren@apple.com> |
| |
| Try a little harder to fix the Linux build. |
| |
| * runtime/JSActivation.cpp: |
| * runtime/JSActivation.h: |
| |
| 2012-08-25 Geoffrey Garen <ggaren@apple.com> |
| |
| Try to fix the Linux build. |
| |
| * runtime/JSActivation.cpp: |
| |
| 2012-08-25 Geoffrey Garen <ggaren@apple.com> |
| |
| Don't use malloc / destructors for activation objects |
| https://bugs.webkit.org/show_bug.cgi?id=94897 |
| |
| Reviewed by Oliver Hunt. |
| |
| 65% faster on v8-real-earley. |
| |
| Lots of boilerplate here, but the jist is this: |
| |
| (1) Use CopiedSpace instead of malloc to allocate the activation's |
| backing store. |
| |
| (2) Use MarkedSpace instead of ref-counting to allocate the symbol table. |
| |
| (3) ==> No more destructor. |
| |
| * bytecode/CodeBlock.cpp: |
| (JSC::CodeBlock::CodeBlock): |
| (JSC::CodeBlock::stronglyVisitStrongReferences): |
| * bytecode/CodeBlock.h: |
| (JSC::CodeBlock::symbolTable): |
| (CodeBlock): |
| (JSC::GlobalCodeBlock::GlobalCodeBlock): |
| (JSC::FunctionCodeBlock::FunctionCodeBlock): |
| (FunctionCodeBlock): SymbolTable is a GC object now, so it gets a write |
| barrier and visit calls instead of ref-counting. I changed all CodeBlocks |
| to use shared symbol tables because the distinction between shared and |
| unshared hurt my head. |
| |
| * bytecompiler/BytecodeGenerator.cpp: |
| (JSC::BytecodeGenerator::resolve): |
| (JSC::BytecodeGenerator::resolveConstDecl): |
| (JSC::BytecodeGenerator::emitPutStaticVar): |
| * dfg/DFGByteCodeParser.cpp: |
| (JSC::DFG::ByteCodeParser::parseBlock): |
| * dfg/DFGSpeculativeJIT32_64.cpp: |
| (JSC::DFG::SpeculativeJIT::compile): |
| * dfg/DFGSpeculativeJIT64.cpp: |
| (JSC::DFG::SpeculativeJIT::compile): Sometimes, a period just wants |
| to be an arrow. And then C++ is there to accommodate. |
| |
| * jit/JITDriver.h: |
| (JSC::jitCompileFunctionIfAppropriate): |
| * runtime/Arguments.h: |
| (ArgumentsData): |
| (JSC::Arguments::setRegisters): |
| (Arguments): |
| (JSC::Arguments::argument): |
| (JSC::Arguments::finishCreation): |
| * runtime/Executable.cpp: |
| (JSC::FunctionExecutable::FunctionExecutable): |
| (JSC::ProgramExecutable::compileInternal): |
| (JSC::FunctionExecutable::compileForCallInternal): |
| (JSC::FunctionExecutable::compileForConstructInternal): |
| (JSC::FunctionExecutable::visitChildren): |
| * runtime/Executable.h: |
| (JSC::FunctionExecutable::symbolTable): |
| (FunctionExecutable): |
| * runtime/ExecutionHarness.h: |
| (JSC::prepareFunctionForExecution): I changed from WriteBarrier to |
| WriteBarrierBase so activations could reuse StorageBarrier and PropertyStorage. |
| |
| * runtime/JSActivation.cpp: |
| (JSC::JSActivation::JSActivation): |
| (JSC::JSActivation::finishCreation): Allocate the symbol table here, |
| after we're fully constructed, to avoid GC during initialization. |
| |
| (JSC::JSActivation::visitChildren): |
| (JSC::JSActivation::symbolTableGet): |
| (JSC::JSActivation::symbolTablePut): |
| (JSC::JSActivation::getOwnPropertyNames): |
| (JSC::JSActivation::symbolTablePutWithAttributes): |
| * runtime/JSActivation.h: |
| (JSC::JSActivation::create): |
| (JSActivation): |
| (JSC::JSActivation::registerOffset): |
| (JSC): |
| (JSC::JSActivation::registerArraySize): |
| (JSC::JSActivation::registerArraySizeInBytes): |
| (JSC::JSActivation::tearOff): Tear-off zero-initializes all uncopied |
| registers. This makes it safe to copyAndAppend the full buffer in |
| visitChildren, without any extra checks. |
| |
| * runtime/JSCell.h: |
| (JSCell): Moved a shared default set of flags into this base class, so |
| I could use it in a few places. |
| |
| * runtime/JSGlobalData.cpp: |
| (JSC::JSGlobalData::JSGlobalData): |
| * runtime/JSGlobalData.h: |
| (JSGlobalData): New structure for symbol tables. |
| |
| * runtime/JSGlobalObject.cpp: |
| (JSC::JSGlobalObject::JSGlobalObject): |
| (JSC::JSGlobalObject::addStaticGlobals): |
| * runtime/JSGlobalObject.h: |
| (JSGlobalObject): |
| (JSC::JSGlobalObject::symbolTableHasProperty): We don't need an inline |
| symbol table -- JSSymbolTableObject will GC allocate one for us. |
| |
| * runtime/JSObject.h: |
| (JSObject): |
| * runtime/JSSegmentedVariableObject.h: |
| (JSC::JSSegmentedVariableObject::JSSegmentedVariableObject): |
| * runtime/JSStaticScopeObject.cpp: |
| (JSC): |
| (JSC::JSStaticScopeObject::visitChildren): NULL check our register store |
| because finishCreation allocates an object now, so we may get marked |
| before we've assigned to our register store. |
| |
| * runtime/JSStaticScopeObject.h: |
| (JSC::JSStaticScopeObject::finishCreation): |
| (JSC::JSStaticScopeObject::JSStaticScopeObject): |
| (JSStaticScopeObject): No more destructor for this object, either, since |
| it no longer embeds a hash table. |
| |
| * runtime/JSSymbolTableObject.cpp: |
| (JSC::JSSymbolTableObject::visitChildren): |
| (JSC::JSSymbolTableObject::deleteProperty): |
| (JSC::JSSymbolTableObject::getOwnPropertyNames): |
| * runtime/JSSymbolTableObject.h: |
| (JSC::JSSymbolTableObject::symbolTable): |
| (JSSymbolTableObject): |
| (JSC::JSSymbolTableObject::JSSymbolTableObject): |
| (JSC::JSSymbolTableObject::finishCreation): |
| (JSC::symbolTableGet): |
| (JSC::symbolTablePut): |
| (JSC::symbolTablePutWithAttributes): SymbolTableObject allocates a symbol |
| table automatically if one isn't provided. (Activations provide their |
| own, which they get from compiled code.) |
| |
| * runtime/JSVariableObject.cpp: |
| (JSC): |
| * runtime/JSVariableObject.h: |
| (JSC::JSVariableObject::registerAt): |
| (JSC::JSVariableObject::addressOfRegisters): |
| (JSVariableObject): |
| (JSC::JSVariableObject::JSVariableObject): |
| (JSC::JSVariableObject::finishCreation): Removed a bunch of obsolete code. |
| Activations manage their registers directly now. |
| |
| * runtime/StorageBarrier.h: |
| (StorageBarrier): |
| (JSC::StorageBarrier::operator!): |
| |
| * runtime/SymbolTable.cpp: |
| (JSC): |
| (JSC::SharedSymbolTable::destroy): |
| * runtime/SymbolTable.h: |
| (JSC::SharedSymbolTable::create): |
| (SharedSymbolTable): |
| (JSC::SharedSymbolTable::createStructure): |
| (JSC::SharedSymbolTable::SharedSymbolTable): Boilerplat code to |
| make shared symbol table GC-allocated. |
| |
| 2012-08-25 Filip Pizlo <fpizlo@apple.com> |
| |
| op_call should have ArrayProfiling for the benefit of array intrinsics |
| https://bugs.webkit.org/show_bug.cgi?id=95014 |
| |
| Reviewed by Sam Weinig. |
| |
| This is a performance-neutral change that just adds the profiling but does not |
| use it, yet. If in the future we wanted to make this kind of profiling cheaper |
| we could move it into specialized thunks for the relevant array intrinsics, but |
| I figure that if this much simpler change gives us what we need without any |
| discernable performance penalty then that's for the best. |
| |
| * bytecompiler/BytecodeGenerator.cpp: |
| (JSC::BytecodeGenerator::emitCall): |
| * jit/JITCall.cpp: |
| (JSC::JIT::compileOpCall): |
| * jit/JITCall32_64.cpp: |
| (JSC::JIT::compileOpCall): |
| * llint/LowLevelInterpreter.asm: |
| * llint/LowLevelInterpreter32_64.asm: |
| * llint/LowLevelInterpreter64.asm: |
| |
| 2012-08-25 Filip Pizlo <fpizlo@apple.com> |
| |
| The redundant phi elimination phase is not used and should be removed |
| https://bugs.webkit.org/show_bug.cgi?id=95006 |
| |
| Reviewed by Dan Bernstein. |
| |
| Just removing dead code. |
| |
| * CMakeLists.txt: |
| * GNUmakefile.list.am: |
| * JavaScriptCore.xcodeproj/project.pbxproj: |
| * Target.pri: |
| * dfg/DFGDriver.cpp: |
| * dfg/DFGRedundantPhiEliminationPhase.cpp: Removed. |
| * dfg/DFGRedundantPhiEliminationPhase.h: Removed. |
| |
| 2012-08-24 Benjamin Poulain <bpoulain@apple.com> |
| |
| Unify Number to StringImpl conversion |
| https://bugs.webkit.org/show_bug.cgi?id=94879 |
| |
| Reviewed by Geoffrey Garen. |
| |
| * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.def: |
| * runtime/UString.cpp: |
| * runtime/UString.h: |
| (JSC::UString::number): |
| Update UString to directly use the common NumberToString implementation. |
| |
| 2012-08-24 Oliver Hunt <oliver@apple.com> |
| |
| Always null check cells before marking |
| https://bugs.webkit.org/show_bug.cgi?id=94968 |
| |
| Reviewed by Geoffrey Garen. |
| |
| Originally we tried to minimise null checks by only null checking values |
| that we knew could be null, however given that we can't ever guarantee |
| when a GC will happen, we're better off just always assuming that a null |
| check will be necessary. This results in a much less fragile code base |
| as we can add GC allocations to object initialisers without having to |
| subsequently worry about whether the object we are initialising will need |
| to add a bunch of null checks in its visitChildren implementation. |
| |
| * heap/MarkStack.cpp: |
| (JSC::MarkStack::internalAppend): |
| * heap/MarkStackInlineMethods.h: |
| (JSC::MarkStack::append): |
| (JSC::MarkStack::appendUnbarrieredPointer): |
| * runtime/Structure.h: |
| (JSC::MarkStack::internalAppend): |
| |
| 2012-08-23 Oliver Hunt <oliver@apple.com> |
| |
| Autogenerate Opcode definitions |
| https://bugs.webkit.org/show_bug.cgi?id=94840 |
| |
| Reviewed by Gavin Barraclough. |
| |
| Start the process of autogenerating the code emission for the bytecode. |
| We'll just start with automatic generation of the list of Opcodes as that |
| requires the actual definition of the opcodes, and the logic for parsing |
| them. |
| |
| Due to some rather annoying dependency cycles, this initial version has |
| the OpcodeDefinitions.h file checked into the tree, although with some |
| work I hope to be able to fix that. |
| |
| * DerivedSources.make: |
| * JavaScriptCore.xcodeproj/project.pbxproj: |
| * bytecode/Opcode.h: |
| Include OpcodeDefinitions.h as our definitive source of info |
| about the opcodes. |
| * bytecode/OpcodeDefinitions.h: Added. |
| Autogenerated file |
| * bytecode/opcodes: Added. |
| The new opcode definition file |
| * opcode_definition_generator.py: Added. |
| (generateOpcodeDefinition): |
| (generate): |
| Module that generates the content for OpcodeDefinitions.h |
| * opcode_generator.py: Added. |
| (printUsage): |
| (main): |
| Driver script |
| * opcode_parser.py: Added. |
| Simple parser for the opcode definitions. |
| |
| 2011-08-23 Geoffrey Garen <ggaren@apple.com> |
| |
| Unreviewed, rolling out r126505. |
| http://trac.webkit.org/changeset/126505 |
| https://bugs.webkit.org/show_bug.cgi?id=94840 |
| |
| Caused testapi to crash on launch |
| |
| * DerivedSources.make: |
| * JavaScriptCore.xcodeproj/project.pbxproj: |
| * bytecode/Opcode.h: |
| (JSC): |
| (JSC::padOpcodeName): |
| * bytecode/OpcodeDefinitions.h: Removed. |
| * bytecode/opcodes: Removed. |
| * opcode_definition_generator.py: Removed. |
| * opcode_generator.py: Removed. |
| * opcode_parser.py: Removed. |
| |
| 2012-08-23 Oliver Hunt <oliver@apple.com> |
| |
| Autogenerate Opcode definitions |
| https://bugs.webkit.org/show_bug.cgi?id=94840 |
| |
| Reviewed by Gavin Barraclough. |
| |
| Start the process of autogenerating the code emission for the bytecode. |
| We'll just start with automatic generation of the list of Opcodes as that |
| requires the actual definition of the opcodes, and the logic for parsing |
| them. |
| |
| Due to some rather annoying dependency cycles, this initial version has |
| the OpcodeDefinitions.h file checked into the tree, although with some |
| work I hope to be able to fix that. |
| |
| * DerivedSources.make: |
| * JavaScriptCore.xcodeproj/project.pbxproj: |
| * bytecode/Opcode.h: |
| Include OpcodeDefinitions.h as our definitive source of info |
| about the opcodes. |
| * bytecode/OpcodeDefinitions.h: Added. |
| Autogenerated file |
| * bytecode/opcodes: Added. |
| The new opcode definition file |
| * opcode_definition_generator.py: Added. |
| (generateOpcodeDefinition): |
| (generate): |
| Module that generates the content for OpcodeDefinitions.h |
| * opcode_generator.py: Added. |
| (printUsage): |
| (main): |
| Driver script |
| * opcode_parser.py: Added. |
| Simple parser for the opcode definitions. |
| |
| 2012-08-23 Mark Hahnenberg <mhahnenberg@apple.com> |
| |
| Change behavior of MasqueradesAsUndefined to better accommodate DFG changes |
| https://bugs.webkit.org/show_bug.cgi?id=93884 |
| |
| Reviewed by Filip Pizlo. |
| |
| With some upcoming changes to the DFG to remove uses of ClassInfo, we will be changing the behavior of |
| MasqueradesAsUndefined. In order to make this change consistent across all of our execution engines, |
| we will make this change to MasqueradesAsUndefined as a separate patch. After this patch, MasqueradesAsUndefined |
| objects will only masquerade as undefined in their original context (i.e. their original JSGlobalObject). |
| For example, if an object that masquerades as undefined in frame A is passed to frame B, it will not |
| masquerade as undefined within frame B, but it will continue to masquerade in frame A. |
| |
| There are two primary changes that are taking place here. One is to thread the ExecState* through |
| JSValue::toBoolean and JSCell::toBoolean so that JSCell::toBoolean can check the object's |
| JSGlobalObject to compare it to the lexical JSGlobalObject of the currently running code. If the two |
| are distinct, then the object cannot MasqueradeAsUndefined. |
| |
| The other change is to perform this comparison of JSGlobalObjects everywhere where the MasqueradesAsUndefined |
| flag in the Structure is checked. For C++ code, this check has been factored into its own function in |
| Structure::masqueradesAsUndefined. We only perform this check in the DFG if the current JSGlobalObject has |
| had a MasqueradesAsUndefined object allocated within its context. This conditional compilation is managed |
| through the use of a WatchpointSet in each JSGlobalObject and alternate create() functions for JS DOM wrappers |
| that are MasqueradesAsUndefined. |
| |
| * API/JSValueRef.cpp: |
| (JSValueToBoolean): |
| * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.def: |
| * bytecode/Watchpoint.h: |
| (WatchpointSet): |
| * debugger/DebuggerCallFrame.h: |
| (JSC::DebuggerCallFrame::callFrame): |
| * dfg/DFGAbstractState.cpp: |
| (JSC::DFG::AbstractState::execute): |
| * dfg/DFGCFGSimplificationPhase.cpp: |
| (JSC::DFG::CFGSimplificationPhase::run): |
| * dfg/DFGOperations.cpp: |
| * dfg/DFGOperations.h: |
| * dfg/DFGSpeculativeJIT32_64.cpp: |
| (JSC::DFG::SpeculativeJIT::nonSpeculativeNonPeepholeCompareNull): |
| (JSC::DFG::SpeculativeJIT::nonSpeculativePeepholeBranchNull): |
| (JSC::DFG::SpeculativeJIT::compile): |
| * dfg/DFGSpeculativeJIT64.cpp: |
| (JSC::DFG::SpeculativeJIT::nonSpeculativeNonPeepholeCompareNull): |
| (JSC::DFG::SpeculativeJIT::nonSpeculativePeepholeBranchNull): |
| (JSC::DFG::SpeculativeJIT::compile): |
| * interpreter/Interpreter.cpp: |
| (JSC::Interpreter::privateExecute): |
| * jit/JITOpcodes.cpp: |
| (JSC::JIT::emit_op_is_undefined): |
| (JSC::JIT::emit_op_jeq_null): |
| (JSC::JIT::emit_op_jneq_null): |
| (JSC::JIT::emit_op_eq_null): |
| (JSC::JIT::emit_op_neq_null): |
| * jit/JITOpcodes32_64.cpp: |
| (JSC::JIT::emit_op_is_undefined): |
| (JSC::JIT::emit_op_jeq_null): |
| (JSC::JIT::emit_op_jneq_null): |
| (JSC::JIT::emit_op_eq_null): |
| (JSC::JIT::emit_op_neq_null): |
| * jit/JITStubs.cpp: |
| (JSC::DEFINE_STUB_FUNCTION): |
| * llint/LLIntSlowPaths.cpp: |
| (JSC::LLInt::LLINT_SLOW_PATH_DECL): |
| * llint/LowLevelInterpreter32_64.asm: |
| * llint/LowLevelInterpreter64.asm: |
| * runtime/ArrayPrototype.cpp: |
| (JSC::arrayProtoFuncFilter): |
| (JSC::arrayProtoFuncEvery): |
| (JSC::arrayProtoFuncSome): |
| * runtime/BooleanConstructor.cpp: |
| (JSC::constructBoolean): |
| (JSC::callBooleanConstructor): |
| * runtime/JSCell.h: |
| (JSCell): |
| * runtime/JSGlobalObject.cpp: |
| (JSC::JSGlobalObject::JSGlobalObject): |
| * runtime/JSGlobalObject.h: |
| (JSGlobalObject): |
| (JSC::JSGlobalObject::masqueradesAsUndefinedWatchpoint): |
| * runtime/JSString.h: |
| (JSC::JSCell::toBoolean): |
| (JSC::JSValue::toBoolean): |
| * runtime/JSValue.h: |
| * runtime/ObjectConstructor.cpp: |
| (JSC::toPropertyDescriptor): |
| * runtime/Operations.cpp: |
| (JSC::jsTypeStringForValue): |
| (JSC::jsIsObjectType): |
| * runtime/Operations.h: |
| (JSC): |
| (JSC::JSValue::equalSlowCaseInline): |
| * runtime/RegExpConstructor.cpp: |
| (JSC::setRegExpConstructorMultiline): |
| * runtime/RegExpPrototype.cpp: |
| (JSC::regExpProtoFuncToString): |
| * runtime/Structure.h: |
| (Structure): |
| (JSC::Structure::globalObjectOffset): |
| (JSC::Structure::masqueradesAsUndefined): |
| (JSC): |
| |
| 2012-08-23 Mark Rowe <mrowe@apple.com> |
| |
| Make JavaScriptCore build with the latest version of clang. |
| |
| Reviewed by Dan Bernstein. |
| |
| * heap/MachineStackMarker.cpp: |
| (JSC::MachineThreads::MachineThreads): The m_heap member is only used within |
| assertions, so guard its initialization with !ASSERT_DISABLED. |
| * heap/MachineStackMarker.h: |
| (MachineThreads): Ditto for its declaration. |
| * jit/JITStubCall.h: |
| (JSC::JITStubCall::JITStubCall): The m_returnType member is only used within |
| assertions or if we're using JSVALUE32_64, so guard its uses with the appropriate |
| #if. |
| (JITStubCall): Ditto. |
| |
| 2012-08-23 Christophe Dumez <christophe.dumez@intel.com> |
| |
| Serialization of JavaScript values does not appear to respect new HTML5 Structured Clone semantics |
| https://bugs.webkit.org/show_bug.cgi?id=65292 |
| |
| Reviewed by Oliver Hunt. |
| |
| Add function to construct a StringObject from a JSValue. |
| Similar functions already exist for NumberObject and |
| BooleanObject for example. |
| |
| Export several symbols so address linking errors in |
| WebCore. |
| |
| * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.def: |
| * runtime/BooleanObject.h: |
| (BooleanObject): |
| * runtime/NumberObject.h: |
| (NumberObject): |
| (JSC): |
| * runtime/StringObject.cpp: |
| (JSC::constructString): |
| (JSC): |
| * runtime/StringObject.h: |
| (JSC): |
| |
| 2012-08-22 Filip Pizlo <fpizlo@apple.com> |
| |
| Array accesses should remember what kind of array they are predicted to access |
| https://bugs.webkit.org/show_bug.cgi?id=94448 |
| |
| Reviewed by Gavin Barraclough. |
| |
| Introduced the notion of DFG::Array::Mode, stored in node.arrayMode(), which allows nodes |
| to remember how they decided to access arrays. This permits the bytecode parser to "lock in" |
| the mode of access if it has profiling at its disposal, and it also allows the prediction |
| propagator to do a fixup of the array mode later in the optimization fixpoint. |
| |
| This patch adds a healthy amount of new capability (specifically the ability of the parser |
| to lock in an array mode regardless of type predictions) and it also blows away a lot of |
| messy code. |
| |
| * CMakeLists.txt: |
| * GNUmakefile.list.am: |
| * JavaScriptCore.xcodeproj/project.pbxproj: |
| * Target.pri: |
| * dfg/DFGAbstractState.cpp: |
| (JSC::DFG::AbstractState::execute): |
| * dfg/DFGArgumentsSimplificationPhase.cpp: |
| (JSC::DFG::ArgumentsSimplificationPhase::run): |
| * dfg/DFGArrayMode.cpp: Added. |
| (DFG): |
| (JSC::DFG::fromObserved): |
| (JSC::DFG::refineArrayMode): |
| (JSC::DFG::modeAlreadyChecked): |
| (JSC::DFG::modeToString): |
| * dfg/DFGArrayMode.h: Added. |
| (DFG): |
| (JSC::DFG::canCSEStorage): |
| (JSC::DFG::modeForPut): |
| (JSC::DFG::modesCompatibleForStorageLoad): |
| (JSC::DFG::modeSupportsLength): |
| * dfg/DFGByteCodeParser.cpp: |
| (ByteCodeParser): |
| (JSC::DFG::ByteCodeParser::getArrayModeWithoutOSRExit): |
| (JSC::DFG::ByteCodeParser::getArrayMode): |
| (JSC::DFG::ByteCodeParser::handleIntrinsic): |
| (JSC::DFG::ByteCodeParser::parseBlock): |
| * dfg/DFGCSEPhase.cpp: |
| (JSC::DFG::CSEPhase::getByValLoadElimination): |
| (JSC::DFG::CSEPhase::checkStructureLoadElimination): |
| (JSC::DFG::CSEPhase::structureTransitionWatchpointElimination): |
| (JSC::DFG::CSEPhase::getByOffsetLoadElimination): |
| (JSC::DFG::CSEPhase::putByOffsetStoreElimination): |
| (JSC::DFG::CSEPhase::getPropertyStorageLoadElimination): |
| (JSC::DFG::CSEPhase::performNodeCSE): |
| * dfg/DFGFixupPhase.cpp: |
| (JSC::DFG::FixupPhase::fixupNode): |
| * dfg/DFGGraph.cpp: |
| (JSC::DFG::Graph::dump): |
| * dfg/DFGGraph.h: |
| (JSC::DFG::Graph::byValIsPure): |
| (JSC::DFG::Graph::clobbersWorld): |
| * dfg/DFGNode.h: |
| (JSC::DFG::Node::hasArrayMode): |
| (Node): |
| (JSC::DFG::Node::arrayMode): |
| (JSC::DFG::Node::setArrayMode): |
| * dfg/DFGNodeType.h: |
| (DFG): |
| * dfg/DFGPredictionPropagationPhase.cpp: |
| (JSC::DFG::PredictionPropagationPhase::propagate): |
| * dfg/DFGSpeculativeJIT.cpp: |
| (JSC::DFG::SpeculativeJIT::typedArrayDescriptor): |
| (DFG): |
| (JSC::DFG::SpeculativeJIT::speculateArray): |
| (JSC::DFG::SpeculativeJIT::compileGetByValOnString): |
| (JSC::DFG::SpeculativeJIT::compileGetByValOnIntTypedArray): |
| (JSC::DFG::SpeculativeJIT::compilePutByValForIntTypedArray): |
| (JSC::DFG::SpeculativeJIT::compileGetByValOnFloatTypedArray): |
| (JSC::DFG::SpeculativeJIT::compilePutByValForFloatTypedArray): |
| (JSC::DFG::SpeculativeJIT::compileGetIndexedPropertyStorage): |
| (JSC::DFG::SpeculativeJIT::compileGetArrayLength): |
| * dfg/DFGSpeculativeJIT.h: |
| (SpeculativeJIT): |
| * dfg/DFGSpeculativeJIT32_64.cpp: |
| (JSC::DFG::SpeculativeJIT::compile): |
| * dfg/DFGSpeculativeJIT64.cpp: |
| (JSC::DFG::SpeculativeJIT::compile): |
| * dfg/DFGStructureCheckHoistingPhase.cpp: |
| (JSC::DFG::StructureCheckHoistingPhase::run): |
| |
| 2012-08-22 Geoffrey Garen <ggaren@apple.com> |
| |
| ThreadRestrictionVerifier should be opt-in, not opt-out |
| https://bugs.webkit.org/show_bug.cgi?id=94761 |
| |
| Reviewed by Mark Hahnenberg. |
| |
| Removed explicit calls to disable the verifier, since it's off by default now. |
| |
| * parser/SourceProvider.h: |
| (JSC::SourceProvider::SourceProvider): |
| (SourceProvider): |
| * runtime/SymbolTable.h: |
| (JSC::SharedSymbolTable::SharedSymbolTable): |
| |
| 2012-08-22 Mark Hahnenberg <mhahnenberg@apple.com> |
| |
| Separate MarkStackThreadSharedData from MarkStack |
| https://bugs.webkit.org/show_bug.cgi?id=94294 |
| |
| Reviewed by Filip Pizlo. |
| |
| MarkStackThreadSharedData is soon going to have data to allow for a parallel copying |
| mode too, so to separate our concerns we should split it out into its own set of files |
| and rename it to GCThreadSharedData. For now this is purely a cosmetic refactoring. |
| |
| * CMakeLists.txt: |
| * GNUmakefile.list.am: |
| * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: |
| * JavaScriptCore.xcodeproj/project.pbxproj: |
| * Target.pri: |
| * heap/GCThreadSharedData.cpp: Added. |
| (JSC): |
| (JSC::GCThreadSharedData::resetChildren): |
| (JSC::GCThreadSharedData::childVisitCount): |
| (JSC::GCThreadSharedData::markingThreadMain): |
| (JSC::GCThreadSharedData::markingThreadStartFunc): |
| (JSC::GCThreadSharedData::GCThreadSharedData): |
| (JSC::GCThreadSharedData::~GCThreadSharedData): |
| (JSC::GCThreadSharedData::reset): |
| * heap/GCThreadSharedData.h: Added. |
| (JSC): |
| (GCThreadSharedData): |
| * heap/Heap.h: |
| (Heap): |
| * heap/ListableHandler.h: |
| (ListableHandler): |
| * heap/MarkStack.cpp: |
| (JSC::MarkStack::MarkStack): |
| (JSC::MarkStack::~MarkStack): |
| * heap/MarkStack.h: |
| (JSC): |
| (MarkStack): |
| (JSC::MarkStack::sharedData): |
| * heap/MarkStackInlineMethods.h: Added. |
| (JSC): |
| (JSC::MarkStack::append): |
| (JSC::MarkStack::appendUnbarrieredPointer): |
| (JSC::MarkStack::appendUnbarrieredValue): |
| (JSC::MarkStack::internalAppend): |
| (JSC::MarkStack::addWeakReferenceHarvester): |
| (JSC::MarkStack::addUnconditionalFinalizer): |
| (JSC::MarkStack::addOpaqueRoot): |
| (JSC::MarkStack::containsOpaqueRoot): |
| (JSC::MarkStack::opaqueRootCount): |
| * heap/SlotVisitor.h: |
| (JSC): |
| (SlotVisitor): |
| (JSC::SlotVisitor::SlotVisitor): |
| |
| 2012-08-22 Gabor Ballabas <gaborb@inf.u-szeged.hu> |
| |
| Fix JSC build when DFG-JIT is disabled |
| https://bugs.webkit.org/show_bug.cgi?id=94694 |
| |
| Reviewed by Csaba Osztrogonác. |
| |
| Adding an appropriate guard for fixing the build. |
| |
| * bytecode/ResolveGlobalStatus.cpp: |
| (JSC): |
| |
| 2012-08-21 Mark Lam <mark.lam@apple.com> |
| |
| Introducing the VMInspector for VM debugging use. |
| https://bugs.webkit.org/show_bug.cgi?id=94613. |
| |
| Reviewed by Filip Pizlo. |
| |
| Adding some utility functions for debugging the VM. This code is |
| presently #ifdef'd out by default. |
| |
| * CMakeLists.txt: |
| * GNUmakefile.list.am: |
| * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: |
| * JavaScriptCore.xcodeproj/project.pbxproj: |
| * interpreter/CallFrame.h: |
| (ExecState): |
| * interpreter/VMInspector.cpp: Added. |
| (JSC): |
| (JSC::VMInspector::getTypeName): |
| (JSC::VMInspector::dumpFrame0): |
| (JSC::VMInspector::dumpFrame): |
| (JSC::VMInspector::countFrames): |
| * interpreter/VMInspector.h: Added. |
| (JSC): |
| (VMInspector): |
| |
| 2012-08-21 Filip Pizlo <fpizlo@apple.com> |
| |
| A patchable GetById right after a watchpoint should have the appropriate nop padding |
| https://bugs.webkit.org/show_bug.cgi?id=94635 |
| |
| Reviewed by Mark Hahnenberg. |
| |
| * assembler/AbstractMacroAssembler.h: |
| (JSC::AbstractMacroAssembler::padBeforePatch): |
| (AbstractMacroAssembler): |
| * assembler/MacroAssemblerARMv7.h: |
| (JSC::MacroAssemblerARMv7::load32WithCompactAddressOffsetPatch): |
| (JSC::MacroAssemblerARMv7::moveWithPatch): |
| (JSC::MacroAssemblerARMv7::patchableJump): |
| * assembler/MacroAssemblerX86.h: |
| (JSC::MacroAssemblerX86::moveWithPatch): |
| (JSC::MacroAssemblerX86::branchPtrWithPatch): |
| (JSC::MacroAssemblerX86::storePtrWithPatch): |
| * assembler/MacroAssemblerX86Common.h: |
| (JSC::MacroAssemblerX86Common::load32WithAddressOffsetPatch): |
| (JSC::MacroAssemblerX86Common::load32WithCompactAddressOffsetPatch): |
| (JSC::MacroAssemblerX86Common::loadCompactWithAddressOffsetPatch): |
| (JSC::MacroAssemblerX86Common::store32WithAddressOffsetPatch): |
| * assembler/MacroAssemblerX86_64.h: |
| (JSC::MacroAssemblerX86_64::loadPtrWithAddressOffsetPatch): |
| (JSC::MacroAssemblerX86_64::loadPtrWithCompactAddressOffsetPatch): |
| (JSC::MacroAssemblerX86_64::storePtrWithAddressOffsetPatch): |
| (JSC::MacroAssemblerX86_64::moveWithPatch): |
| * jit/JumpReplacementWatchpoint.cpp: |
| (JSC::JumpReplacementWatchpoint::fireInternal): |
| |
| 2012-08-20 Mark Lam <mark.lam@apple.com> |
| |
| Fix broken non-JIT build. |
| https://bugs.webkit.org/show_bug.cgi?id=94564. |
| |
| Reviewed by Filip Pizlo. |
| |
| Added some UNUSED_PARAM() macros to make the compiler happy. |
| |
| * runtime/Executable.cpp: |
| (JSC::EvalExecutable::compileInternal): |
| (JSC::ProgramExecutable::compileInternal): |
| (JSC::FunctionExecutable::compileForCallInternal): |
| (JSC::FunctionExecutable::compileForConstructInternal): |
| |
| 2012-08-20 Mark Lam <mark.lam@apple.com> |
| |
| Fixed erroneous line number for LLint frame when throwing exceptions. |
| https://bugs.webkit.org/show_bug.cgi?id=94051. |
| |
| Reviewed by Filip Pizlo. |
| |
| For LLInt frames, before throwing an exception, adjust the PC from the |
| return PC back to the call PC if we are indeed at a call site. |
| |
| * bytecode/CodeBlock.cpp: |
| (JSC::CodeBlock::adjustPCIfAtCallSite): |
| (JSC): |
| (JSC::CodeBlock::bytecodeOffset): |
| * bytecode/CodeBlock.h: |
| (CodeBlock): |
| * llint/LLIntExceptions.cpp: |
| (JSC::LLInt::fixupPCforExceptionIfNeeded): |
| (LLInt): |
| (JSC::LLInt::interpreterThrowInCaller): |
| (JSC::LLInt::returnToThrow): |
| (JSC::LLInt::callToThrow): |
| |
| 2012-08-20 Filip Pizlo <fpizlo@apple.com> |
| |
| fast/js/dfg-peephole-compare-final-object-to-final-object-or-other-when-both-proven-final-object.html on 32-bit |
| https://bugs.webkit.org/show_bug.cgi?id=94538 |
| |
| Reviewed by Mark Hahnenberg. |
| |
| * dfg/DFGSpeculativeJIT32_64.cpp: |
| (JSC::DFG::SpeculativeJIT::compilePeepHoleObjectToObjectOrOtherEquality): |
| |
| 2012-08-20 Filip Pizlo <fpizlo@apple.com> |
| |
| fast/js/dfg-compare-final-object-to-final-object-or-other-when-both-proven-final-object.html crashes on 32-bit |
| https://bugs.webkit.org/show_bug.cgi?id=94026 |
| |
| Reviewed by Mark Hahnenberg. |
| |
| * dfg/DFGSpeculativeJIT32_64.cpp: |
| (JSC::DFG::SpeculativeJIT::compileObjectToObjectOrOtherEquality): |
| |
| 2012-08-19 Filip Pizlo <fpizlo@apple.com> |
| |
| The relationship between abstract values and structure transition watchpoints should be rationalized |
| https://bugs.webkit.org/show_bug.cgi?id=94205 |
| |
| Reviewed by Geoffrey Garen. |
| |
| This patch does a number of things related to the handling of the abstract values |
| arrising from values with structures known to be watchpointable: |
| |
| - This rationalizes the relationship between the structure that we know an object |
| to have *right now* based on having executed a check against that structure, and |
| the structure that we know the object could have *in the future* based on a type |
| check executed in the past over a structure that was watchpointable. |
| |
| - We use the above to assert that structure transition watchpoints are being used |
| soundly. |
| |
| - We use the above to strength reduce CheckStructure into StructureTransitionWatchpoint |
| whenever possible. |
| |
| - This rationalizes the handling of CFA over constants that appeared in the bytecode. |
| If at compile-time the constant has a watchpointable structure, then we can prove |
| what structures it may have in the future. The analysis uses this to both assert |
| that structure transition watchpoints are being used correctly, and to find |
| opportunities for using them more aggressively. |
| |
| The net effect of all of these changes is that OSR entry should work more smoothly. |
| It may also be a slight win due to strength reductions, though most of those strength |
| reductions would have already been done by the parser and the structure check hoister. |
| |
| * GNUmakefile.list.am: |
| * JavaScriptCore.xcodeproj/project.pbxproj: |
| * dfg/DFGAbstractState.cpp: |
| (JSC::DFG::AbstractState::beginBasicBlock): |
| (JSC::DFG::AbstractState::execute): |
| * dfg/DFGAbstractValue.h: |
| (DFG): |
| (JSC::DFG::AbstractValue::clear): |
| (JSC::DFG::AbstractValue::isClear): |
| (JSC::DFG::AbstractValue::makeTop): |
| (JSC::DFG::AbstractValue::clobberStructures): |
| (JSC::DFG::AbstractValue::isTop): |
| (JSC::DFG::AbstractValue::setFuturePossibleStructure): |
| (AbstractValue): |
| (JSC::DFG::AbstractValue::filterFuturePossibleStructure): |
| (JSC::DFG::AbstractValue::setMostSpecific): |
| (JSC::DFG::AbstractValue::set): |
| (JSC::DFG::AbstractValue::operator==): |
| (JSC::DFG::AbstractValue::merge): |
| (JSC::DFG::AbstractValue::filter): |
| (JSC::DFG::AbstractValue::filterValueByType): |
| (JSC::DFG::AbstractValue::validateType): |
| (JSC::DFG::AbstractValue::validate): |
| (JSC::DFG::AbstractValue::checkConsistency): |
| (JSC::DFG::AbstractValue::dump): |
| * dfg/DFGArgumentsSimplificationPhase.cpp: |
| (JSC::DFG::ArgumentsSimplificationPhase::run): |
| * dfg/DFGCSEPhase.cpp: |
| (JSC::DFG::CSEPhase::checkStructureLoadElimination): |
| (JSC::DFG::CSEPhase::structureTransitionWatchpointElimination): |
| (JSC::DFG::CSEPhase::performNodeCSE): |
| * dfg/DFGConstantFoldingPhase.cpp: |
| (JSC::DFG::ConstantFoldingPhase::foldConstants): |
| * dfg/DFGNode.h: |
| (JSC::DFG::Node::convertToStructureTransitionWatchpoint): |
| (Node): |
| (JSC::DFG::Node::hasStructure): |
| * dfg/DFGNodeType.h: |
| (DFG): |
| * dfg/DFGOSREntry.cpp: |
| (JSC::DFG::prepareOSREntry): |
| * dfg/DFGPredictionPropagationPhase.cpp: |
| (JSC::DFG::PredictionPropagationPhase::propagate): |
| * dfg/DFGSpeculativeJIT.cpp: |
| (JSC::DFG::SpeculativeJIT::convertLastOSRExitToForward): |
| (JSC::DFG::SpeculativeJIT::forwardSpeculationWatchpoint): |
| (DFG): |
| (JSC::DFG::SpeculativeJIT::speculationWatchpointWithConditionalDirection): |
| (JSC::DFG::SpeculativeJIT::forwardSpeculationCheck): |
| (JSC::DFG::SpeculativeJIT::speculateArray): |
| * dfg/DFGSpeculativeJIT.h: |
| (SpeculativeJIT): |
| * dfg/DFGSpeculativeJIT32_64.cpp: |
| (JSC::DFG::SpeculativeJIT::compile): |
| * dfg/DFGSpeculativeJIT64.cpp: |
| (JSC::DFG::SpeculativeJIT::compile): |
| * dfg/DFGStructureAbstractValue.h: Added. |
| (DFG): |
| (StructureAbstractValue): |
| (JSC::DFG::StructureAbstractValue::StructureAbstractValue): |
| (JSC::DFG::StructureAbstractValue::clear): |
| (JSC::DFG::StructureAbstractValue::makeTop): |
| (JSC::DFG::StructureAbstractValue::top): |
| (JSC::DFG::StructureAbstractValue::add): |
| (JSC::DFG::StructureAbstractValue::addAll): |
| (JSC::DFG::StructureAbstractValue::contains): |
| (JSC::DFG::StructureAbstractValue::isSubsetOf): |
| (JSC::DFG::StructureAbstractValue::doesNotContainAnyOtherThan): |
| (JSC::DFG::StructureAbstractValue::isSupersetOf): |
| (JSC::DFG::StructureAbstractValue::filter): |
| (JSC::DFG::StructureAbstractValue::isClear): |
| (JSC::DFG::StructureAbstractValue::isTop): |
| (JSC::DFG::StructureAbstractValue::isClearOrTop): |
| (JSC::DFG::StructureAbstractValue::isNeitherClearNorTop): |
| (JSC::DFG::StructureAbstractValue::size): |
| (JSC::DFG::StructureAbstractValue::at): |
| (JSC::DFG::StructureAbstractValue::operator[]): |
| (JSC::DFG::StructureAbstractValue::last): |
| (JSC::DFG::StructureAbstractValue::speculationFromStructures): |
| (JSC::DFG::StructureAbstractValue::hasSingleton): |
| (JSC::DFG::StructureAbstractValue::singleton): |
| (JSC::DFG::StructureAbstractValue::operator==): |
| (JSC::DFG::StructureAbstractValue::dump): |
| (JSC::DFG::StructureAbstractValue::topValue): |
| * dfg/DFGStructureCheckHoistingPhase.cpp: |
| (JSC::DFG::StructureCheckHoistingPhase::run): |
| |
| 2012-08-17 Filip Pizlo <fpizlo@apple.com> |
| |
| The current state of the call frame should be taken into account in the DFG for both predictions and proofs |
| https://bugs.webkit.org/show_bug.cgi?id=94412 |
| |
| Reviewed by Geoffrey Garen. |
| |
| This ensures that no matter how smart the DFG gets, it'll always know through |
| which entrypoint OSR will try to enter, and with which values it will attempt |
| to do so. For prologue OSR, this has no effect other than adding the current |
| arguments to the argument predictions. For loop OSR, this makes our treatment |
| of the loop slightly more conservative - just conservative enough to ensure |
| that OSR succeeds. |
| |
| * bytecode/CodeBlock.cpp: |
| (JSC::ProgramCodeBlock::compileOptimized): |
| (JSC::EvalCodeBlock::compileOptimized): |
| (JSC::FunctionCodeBlock::compileOptimized): |
| * bytecode/CodeBlock.h: |
| (CodeBlock): |
| (ProgramCodeBlock): |
| (EvalCodeBlock): |
| (FunctionCodeBlock): |
| * dfg/DFGAbstractState.cpp: |
| (JSC::DFG::AbstractState::initialize): |
| * dfg/DFGAbstractValue.h: |
| (JSC::DFG::AbstractValue::setMostSpecific): |
| (AbstractValue): |
| * dfg/DFGByteCodeParser.cpp: |
| (JSC::DFG::ByteCodeParser::fixVariableAccessPredictions): |
| (JSC::DFG::ByteCodeParser::parse): |
| * dfg/DFGDriver.cpp: |
| (JSC::DFG::compile): |
| (JSC::DFG::tryCompile): |
| (JSC::DFG::tryCompileFunction): |
| * dfg/DFGDriver.h: |
| (DFG): |
| (JSC::DFG::tryCompile): |
| (JSC::DFG::tryCompileFunction): |
| * dfg/DFGGraph.h: |
| (JSC::DFG::Graph::Graph): |
| (Graph): |
| * jit/JITDriver.h: |
| (JSC::jitCompileIfAppropriate): |
| (JSC::jitCompileFunctionIfAppropriate): |
| * jit/JITStubs.cpp: |
| (JSC::DEFINE_STUB_FUNCTION): |
| * runtime/Executable.cpp: |
| (JSC::EvalExecutable::compileOptimized): |
| (JSC::EvalExecutable::compileInternal): |
| (JSC::ProgramExecutable::compileOptimized): |
| (JSC::ProgramExecutable::compileInternal): |
| (JSC::FunctionExecutable::compileOptimizedForCall): |
| (JSC::FunctionExecutable::compileOptimizedForConstruct): |
| (JSC::FunctionExecutable::compileForCallInternal): |
| (JSC::FunctionExecutable::compileForConstructInternal): |
| * runtime/Executable.h: |
| (EvalExecutable): |
| (ProgramExecutable): |
| (FunctionExecutable): |
| (JSC::FunctionExecutable::compileOptimizedFor): |
| * runtime/ExecutionHarness.h: |
| (JSC::prepareForExecution): |
| (JSC::prepareFunctionForExecution): |
| |
| 2012-08-17 Filip Pizlo <fpizlo@apple.com> |
| |
| DFG CSE should be more honest about when it changed the IR |
| https://bugs.webkit.org/show_bug.cgi?id=94408 |
| |
| Reviewed by Geoffrey Garen. |
| |
| The CSE phase now always returns true if it changed the IR. |
| |
| * dfg/DFGCSEPhase.cpp: |
| (JSC::DFG::CSEPhase::setReplacement): |
| (JSC::DFG::CSEPhase::eliminate): |
| (JSC::DFG::CSEPhase::performNodeCSE): |
| |
| 2012-08-17 Filip Pizlo <fpizlo@apple.com> |
| |
| DFG is still too pessimistic about what constitutes a side-effect on array accesses |
| https://bugs.webkit.org/show_bug.cgi?id=94309 |
| |
| Reviewed by Geoffrey Garen. |
| |
| This change means that even if structure transition watchpoints are not used for |
| hoisting of clobbered structure checks, we still retain good performance on the |
| benchmarks we care about. That's important, since butterflies will likely make |
| most array structures not watchpointable. |
| |
| * dfg/DFGAbstractState.cpp: |
| (JSC::DFG::AbstractState::execute): |
| * dfg/DFGStructureCheckHoistingPhase.cpp: |
| (JSC::DFG::StructureCheckHoistingPhase::run): |
| |
| 2012-08-17 Milian Wolff <milian.wolff@kdab.com> |
| |
| [Qt] QNX build fails due to ctype usage in system headers |
| https://bugs.webkit.org/show_bug.cgi?id=93849 |
| |
| Reviewed by Simon Hausmann. |
| |
| Move the check for whether DisallowCType should be active or not |
| to the DisallowCType.h header. This way, we can update the list |
| of platforms or OSes which do not work with this header in a |
| central place. All users can now safely include the header |
| and do not need to place custom guards around it. |
| |
| * config.h: |
| |
| 2012-08-16 Simon Hausmann <simon.hausmann@nokia.com> |
| |
| [Qt] Replace use of internal Weak smart pointer with JSWeakObjectMap |
| https://bugs.webkit.org/show_bug.cgi?id=93872 |
| |
| Reviewed by Kenneth Rohde Christiansen. |
| |
| * Target.pri: Add missing JSWeakObjectMap file to build. |
| |
| 2012-08-16 Filip Pizlo <fpizlo@apple.com> |
| |
| Structure check hoisting should be less expensive |
| https://bugs.webkit.org/show_bug.cgi?id=94201 |
| |
| Reviewed by Mark Hahnenberg. |
| |
| This appears like a broad win on short-running programs. |
| |
| * dfg/DFGArgumentsSimplificationPhase.cpp: |
| (JSC::DFG::ArgumentsSimplificationPhase::run): |
| * dfg/DFGCSEPhase.cpp: |
| (JSC::DFG::CSEPhase::performNodeCSE): |
| * dfg/DFGDriver.cpp: |
| (JSC::DFG::compile): |
| * dfg/DFGGraph.h: |
| (JSC::DFG::Graph::compareAndSwap): |
| (Graph): |
| (JSC::DFG::Graph::substitute): |
| (JSC::DFG::Graph::substituteGetLocal): |
| * dfg/DFGStructureCheckHoistingPhase.cpp: |
| (JSC::DFG::StructureCheckHoistingPhase::run): |
| |
| 2012-08-16 Filip Pizlo <fpizlo@apple.com> |
| |
| All op_resolve_global instructions should end up in the list of global resolve instructions |
| https://bugs.webkit.org/show_bug.cgi?id=94247 |
| <rdar://problem/12103500> |
| |
| Reviewed by Mark Hahnenberg. |
| |
| * bytecompiler/BytecodeGenerator.cpp: |
| (JSC::BytecodeGenerator::emitResolveWithBase): |
| |
| 2012-08-15 Bruno de Oliveira Abinader <bruno.abinader@basyskom.com> |
| |
| [css3-text] Add CSS3 Text decoration compile flag |
| https://bugs.webkit.org/show_bug.cgi?id=93863 |
| |
| Reviewed by Julien Chaffraix. |
| |
| This patch handles the compile flag implementation, which will come disabled by |
| default, thus not exposing the CSS3 text decoration features to the web, unless |
| when explicitly enabling it with "--css3-text-decoration" build parameter. |
| |
| * Configurations/FeatureDefines.xcconfig: |
| |
| 2012-08-15 Sheriff Bot <webkit.review.bot@gmail.com> |
| |
| Unreviewed, rolling out r125687. |
| http://trac.webkit.org/changeset/125687 |
| https://bugs.webkit.org/show_bug.cgi?id=94147 |
| |
| It broke the whole world (Requested by Ossy_night on #webkit). |
| |
| * API/JSValueRef.cpp: |
| (JSValueToBoolean): |
| * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.def: |
| * bytecode/Watchpoint.h: |
| (WatchpointSet): |
| * debugger/DebuggerCallFrame.h: |
| * dfg/DFGAbstractState.cpp: |
| (JSC::DFG::AbstractState::execute): |
| * dfg/DFGCFGSimplificationPhase.cpp: |
| (JSC::DFG::CFGSimplificationPhase::run): |
| * dfg/DFGOperations.cpp: |
| * dfg/DFGOperations.h: |
| * dfg/DFGSpeculativeJIT32_64.cpp: |
| (JSC::DFG::SpeculativeJIT::nonSpeculativeNonPeepholeCompareNull): |
| (JSC::DFG::SpeculativeJIT::nonSpeculativePeepholeBranchNull): |
| (JSC::DFG::SpeculativeJIT::compile): |
| * dfg/DFGSpeculativeJIT64.cpp: |
| (JSC::DFG::SpeculativeJIT::nonSpeculativeNonPeepholeCompareNull): |
| (JSC::DFG::SpeculativeJIT::nonSpeculativePeepholeBranchNull): |
| (JSC::DFG::SpeculativeJIT::compile): |
| * interpreter/Interpreter.cpp: |
| (JSC::Interpreter::privateExecute): |
| * jit/JITOpcodes.cpp: |
| (JSC::JIT::emit_op_is_undefined): |
| (JSC::JIT::emit_op_jeq_null): |
| (JSC::JIT::emit_op_jneq_null): |
| (JSC::JIT::emit_op_eq_null): |
| (JSC::JIT::emit_op_neq_null): |
| * jit/JITOpcodes32_64.cpp: |
| (JSC::JIT::emit_op_is_undefined): |
| (JSC::JIT::emit_op_jeq_null): |
| (JSC::JIT::emit_op_jneq_null): |
| (JSC::JIT::emit_op_eq_null): |
| (JSC::JIT::emit_op_neq_null): |
| * jit/JITStubs.cpp: |
| (JSC::DEFINE_STUB_FUNCTION): |
| * llint/LLIntSlowPaths.cpp: |
| (JSC::LLInt::LLINT_SLOW_PATH_DECL): |
| * llint/LowLevelInterpreter32_64.asm: |
| * llint/LowLevelInterpreter64.asm: |
| * runtime/ArrayPrototype.cpp: |
| (JSC::arrayProtoFuncFilter): |
| (JSC::arrayProtoFuncEvery): |
| (JSC::arrayProtoFuncSome): |
| * runtime/BooleanConstructor.cpp: |
| (JSC::constructBoolean): |
| (JSC::callBooleanConstructor): |
| * runtime/JSCell.h: |
| (JSCell): |
| * runtime/JSGlobalObject.cpp: |
| (JSC::JSGlobalObject::JSGlobalObject): |
| * runtime/JSGlobalObject.h: |
| (JSGlobalObject): |
| * runtime/JSString.h: |
| (JSC::JSCell::toBoolean): |
| (JSC::JSValue::toBoolean): |
| * runtime/JSValue.h: |
| * runtime/ObjectConstructor.cpp: |
| (JSC::toPropertyDescriptor): |
| * runtime/Operations.cpp: |
| (JSC::jsTypeStringForValue): |
| (JSC::jsIsObjectType): |
| * runtime/Operations.h: |
| (JSC): |
| (JSC::JSValue::equalSlowCaseInline): |
| * runtime/RegExpConstructor.cpp: |
| (JSC::setRegExpConstructorMultiline): |
| * runtime/RegExpPrototype.cpp: |
| (JSC::regExpProtoFuncToString): |
| * runtime/Structure.h: |
| |
| 2012-08-15 Gabor Ballabas <gaborb@inf.u-szeged.hu> |
| |
| Buildfix after r125541 |
| https://bugs.webkit.org/show_bug.cgi?id=94097 |
| |
| Reviewed by Filip Pizlo. |
| |
| r125541 has broken the traditional ARM port build of JSC. |
| |
| * assembler/MacroAssemblerARM.h: |
| (JSC::MacroAssemblerARM::neg32): |
| (JSC::MacroAssemblerARM::xor32): |
| |
| 2012-08-14 Mark Hahnenberg <mhahnenberg@apple.com> |
| |
| Change behavior of MasqueradesAsUndefined to better accommodate DFG changes |
| https://bugs.webkit.org/show_bug.cgi?id=93884 |
| |
| Reviewed by Geoffrey Garen. |
| |
| With some upcoming changes to the DFG to remove uses of ClassInfo, we will be changing the behavior of |
| MasqueradesAsUndefined. In order to make this change consistent across all of our execution engines, |
| we will make this change to MasqueradesAsUndefined as a separate patch. After this patch, MasqueradesAsUndefined |
| objects will only masquerade as undefined in their original context (i.e. their original JSGlobalObject). |
| For example, if an object that masquerades as undefined in frame A is passed to frame B, it will not |
| masquerade as undefined within frame B, but it will continue to masquerade in frame A. |
| |
| There are two primary changes that are taking place here. One is to thread the ExecState* through |
| JSValue::toBoolean and JSCell::toBoolean so that JSCell::toBoolean can check the object's |
| JSGlobalObject to compare it to the lexical JSGlobalObject of the currently running code. If the two |
| are distinct, then the object cannot MasqueradeAsUndefined. |
| |
| The other change is to perform this comparison of JSGlobalObjects everywhere where the MasqueradesAsUndefined |
| flag in the Structure is checked. For C++ code, this check has been factored into its own function in |
| Structure::masqueradesAsUndefined. We only perform this check in the DFG if the current JSGlobalObject has |
| had a MasqueradesAsUndefined object allocated within its context. This conditional compilation is managed |
| through the use of a WatchpointSet in each JSGlobalObject and alternate create() functions for JS DOM wrappers |
| that are MasqueradesAsUndefined. |
| |
| * API/JSValueRef.cpp: |
| (JSValueToBoolean): |
| * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.def: |
| * bytecode/Watchpoint.h: |
| (WatchpointSet): |
| * debugger/DebuggerCallFrame.h: |
| (JSC::DebuggerCallFrame::callFrame): |
| * dfg/DFGAbstractState.cpp: |
| (JSC::DFG::AbstractState::execute): |
| * dfg/DFGCFGSimplificationPhase.cpp: |
| (JSC::DFG::CFGSimplificationPhase::run): |
| * dfg/DFGOperations.cpp: |
| * dfg/DFGOperations.h: |
| * dfg/DFGSpeculativeJIT32_64.cpp: |
| (JSC::DFG::SpeculativeJIT::nonSpeculativeNonPeepholeCompareNull): |
| (JSC::DFG::SpeculativeJIT::nonSpeculativePeepholeBranchNull): |
| (JSC::DFG::SpeculativeJIT::compile): |
| * dfg/DFGSpeculativeJIT64.cpp: |
| (JSC::DFG::SpeculativeJIT::nonSpeculativeNonPeepholeCompareNull): |
| (JSC::DFG::SpeculativeJIT::nonSpeculativePeepholeBranchNull): |
| (JSC::DFG::SpeculativeJIT::compile): |
| * interpreter/Interpreter.cpp: |
| (JSC::Interpreter::privateExecute): |
| * jit/JITOpcodes.cpp: |
| (JSC::JIT::emit_op_is_undefined): |
| (JSC::JIT::emit_op_jeq_null): |
| (JSC::JIT::emit_op_jneq_null): |
| (JSC::JIT::emit_op_eq_null): |
| (JSC::JIT::emit_op_neq_null): |
| * jit/JITOpcodes32_64.cpp: |
| (JSC::JIT::emit_op_is_undefined): |
| (JSC::JIT::emit_op_jeq_null): |
| (JSC::JIT::emit_op_jneq_null): |
| (JSC::JIT::emit_op_eq_null): |
| (JSC::JIT::emit_op_neq_null): |
| * jit/JITStubs.cpp: |
| (JSC::DEFINE_STUB_FUNCTION): |
| * llint/LLIntSlowPaths.cpp: |
| (JSC::LLInt::LLINT_SLOW_PATH_DECL): |
| * llint/LowLevelInterpreter32_64.asm: |
| * llint/LowLevelInterpreter64.asm: |
| * runtime/ArrayPrototype.cpp: |
| (JSC::arrayProtoFuncFilter): |
| (JSC::arrayProtoFuncEvery): |
| (JSC::arrayProtoFuncSome): |
| * runtime/BooleanConstructor.cpp: |
| (JSC::constructBoolean): |
| (JSC::callBooleanConstructor): |
| * runtime/JSCell.h: |
| (JSCell): |
| * runtime/JSGlobalObject.cpp: |
| (JSC::JSGlobalObject::JSGlobalObject): |
| * runtime/JSGlobalObject.h: |
| (JSGlobalObject): |
| (JSC::JSGlobalObject::masqueradesAsUndefinedWatchpoint): |
| * runtime/JSString.h: |
| (JSC::JSCell::toBoolean): |
| (JSC::JSValue::toBoolean): |
| * runtime/JSValue.h: |
| * runtime/ObjectConstructor.cpp: |
| (JSC::toPropertyDescriptor): |
| * runtime/Operations.cpp: |
| (JSC::jsTypeStringForValue): |
| (JSC::jsIsObjectType): |
| * runtime/Operations.h: |
| (JSC): |
| (JSC::JSValue::equalSlowCaseInline): |
| * runtime/RegExpConstructor.cpp: |
| (JSC::setRegExpConstructorMultiline): |
| * runtime/RegExpPrototype.cpp: |
| (JSC::regExpProtoFuncToString): |
| * runtime/Structure.h: |
| (Structure): |
| (JSC::Structure::globalObjectOffset): |
| (JSC::Structure::masqueradesAsUndefined): |
| (JSC): |
| |
| 2012-08-14 Filip Pizlo <fpizlo@apple.com> |
| |
| Unreviewed, build fix for !ENABLE(DFG_JIT) |
| |
| * jit/JITPropertyAccess.cpp: |
| (JSC::JIT::emit_op_get_by_val): |
| (JSC::JIT::emit_op_put_by_val): |
| (JSC::JIT::privateCompilePatchGetArrayLength): |
| * jit/JITPropertyAccess32_64.cpp: |
| (JSC::JIT::emit_op_get_by_val): |
| (JSC::JIT::emit_op_put_by_val): |
| (JSC::JIT::privateCompilePatchGetArrayLength): |
| * llint/LowLevelInterpreter32_64.asm: |
| * llint/LowLevelInterpreter64.asm: |
| |
| 2012-08-13 Filip Pizlo <fpizlo@apple.com> |
| |
| Array checks should use the structure, not the class info |
| https://bugs.webkit.org/show_bug.cgi?id=93150 |
| |
| Reviewed by Mark Hahnenberg. |
| |
| This changes all array checks used in array accesses (get, put, get length, |
| push, pop) to use the structure, not the class info. Additionally, these |
| checks in the LLInt and baseline JIT record the structure in an ArrayProfile, |
| so that the DFG can know exactly what structure to check for. |
| |
| * CMakeLists.txt: |
| * GNUmakefile.list.am: |
| * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: |
| * JavaScriptCore.xcodeproj/project.pbxproj: |
| * Target.pri: |
| * bytecode/ArrayProfile.cpp: Added. |
| (JSC): |
| (JSC::ArrayProfile::computeUpdatedPrediction): |
| * bytecode/ArrayProfile.h: Added. |
| (JSC): |
| (JSC::arrayModeFromStructure): |
| (ArrayProfile): |
| (JSC::ArrayProfile::ArrayProfile): |
| (JSC::ArrayProfile::bytecodeOffset): |
| (JSC::ArrayProfile::addressOfLastSeenStructure): |
| (JSC::ArrayProfile::observeStructure): |
| (JSC::ArrayProfile::expectedStructure): |
| (JSC::ArrayProfile::structureIsPolymorphic): |
| (JSC::ArrayProfile::hasDefiniteStructure): |
| (JSC::ArrayProfile::observedArrayModes): |
| * bytecode/CodeBlock.cpp: |
| (JSC::CodeBlock::dump): |
| (JSC::CodeBlock::getArrayProfile): |
| (JSC): |
| (JSC::CodeBlock::getOrAddArrayProfile): |
| (JSC::CodeBlock::updateAllPredictionsAndCountLiveness): |
| * bytecode/CodeBlock.h: |
| (JSC::CodeBlock::executionEntryCount): |
| (JSC::CodeBlock::numberOfArrayProfiles): |
| (JSC::CodeBlock::arrayProfiles): |
| (JSC::CodeBlock::addArrayProfile): |
| (CodeBlock): |
| * bytecode/Instruction.h: |
| (JSC): |
| (JSC::Instruction::Instruction): |
| * bytecode/Opcode.h: |
| (JSC): |
| (JSC::padOpcodeName): |
| * bytecompiler/BytecodeGenerator.cpp: |
| (JSC::BytecodeGenerator::emitGetArgumentByVal): |
| (JSC::BytecodeGenerator::emitGetByVal): |
| (JSC::BytecodeGenerator::emitPutByVal): |
| * dfg/DFGAbstractState.cpp: |
| (JSC::DFG::AbstractState::initialize): |
| (JSC::DFG::AbstractState::execute): |
| * dfg/DFGAbstractValue.h: |
| (JSC::DFG::StructureAbstractValue::hasSingleton): |
| (StructureAbstractValue): |
| (JSC::DFG::StructureAbstractValue::singleton): |
| * dfg/DFGArgumentsSimplificationPhase.cpp: |
| (JSC::DFG::ArgumentsSimplificationPhase::run): |
| * dfg/DFGByteCodeParser.cpp: |
| (JSC::DFG::ByteCodeParser::parseBlock): |
| * dfg/DFGFixupPhase.cpp: |
| (JSC::DFG::FixupPhase::fixupNode): |
| * dfg/DFGSpeculativeJIT.cpp: |
| (JSC::DFG::SpeculativeJIT::speculateArray): |
| (DFG): |
| (JSC::DFG::SpeculativeJIT::compile): |
| (JSC::DFG::SpeculativeJIT::checkArgumentTypes): |
| (JSC::DFG::SpeculativeJIT::compileGetIndexedPropertyStorage): |
| * dfg/DFGSpeculativeJIT.h: |
| (SpeculativeJIT): |
| * dfg/DFGSpeculativeJIT32_64.cpp: |
| (JSC::DFG::SpeculativeJIT::compile): |
| * dfg/DFGSpeculativeJIT64.cpp: |
| (JSC::DFG::SpeculativeJIT::compile): |
| * dfg/DFGStructureCheckHoistingPhase.cpp: |
| (JSC::DFG::StructureCheckHoistingPhase::run): |
| * jit/JITPropertyAccess.cpp: |
| (JSC::JIT::emit_op_get_by_val): |
| (JSC::JIT::emit_op_put_by_val): |
| (JSC::JIT::privateCompilePatchGetArrayLength): |
| * jit/JITPropertyAccess32_64.cpp: |
| (JSC::JIT::emit_op_get_by_val): |
| (JSC::JIT::emit_op_put_by_val): |
| (JSC::JIT::privateCompilePatchGetArrayLength): |
| * llint/LLIntOffsetsExtractor.cpp: |
| * llint/LowLevelInterpreter32_64.asm: |
| * llint/LowLevelInterpreter64.asm: |
| * runtime/Structure.h: |
| (Structure): |
| (JSC::Structure::classInfoOffset): |
| |
| 2012-08-14 Gabor Ballabas <gaborb@inf.u-szeged.hu> |
| |
| Rename functions in the ARM port of DFG-JIT for better code readability. |
| https://bugs.webkit.org/show_bug.cgi?id=93609 |
| |
| Reviewed by Zoltan Herczeg. |
| |
| Rename functions in the ARM port of DFG-JIT for better code |
| readability, and for following the WebKit coding style |
| wherever it is possible. |
| |
| * assembler/ARMAssembler.cpp: |
| (JSC::ARMAssembler::genInt): |
| (JSC::ARMAssembler::getImm): |
| (JSC::ARMAssembler::moveImm): |
| (JSC::ARMAssembler::encodeComplexImm): |
| (JSC::ARMAssembler::dataTransfer32): |
| (JSC::ARMAssembler::baseIndexTransfer32): |
| (JSC::ARMAssembler::dataTransfer16): |
| (JSC::ARMAssembler::baseIndexTransfer16): |
| (JSC::ARMAssembler::dataTransferFloat): |
| (JSC::ARMAssembler::baseIndexTransferFloat): |
| * assembler/ARMAssembler.h: |
| (JSC::ARMAssembler::bitAnd): |
| (JSC::ARMAssembler::bitAnds): |
| (JSC::ARMAssembler::eor): |
| (JSC::ARMAssembler::eors): |
| (JSC::ARMAssembler::sub): |
| (JSC::ARMAssembler::subs): |
| (JSC::ARMAssembler::rsb): |
| (JSC::ARMAssembler::rsbs): |
| (JSC::ARMAssembler::add): |
| (JSC::ARMAssembler::adds): |
| (JSC::ARMAssembler::adc): |
| (JSC::ARMAssembler::adcs): |
| (JSC::ARMAssembler::sbc): |
| (JSC::ARMAssembler::sbcs): |
| (JSC::ARMAssembler::rsc): |
| (JSC::ARMAssembler::rscs): |
| (JSC::ARMAssembler::tst): |
| (JSC::ARMAssembler::teq): |
| (JSC::ARMAssembler::cmp): |
| (JSC::ARMAssembler::cmn): |
| (JSC::ARMAssembler::orr): |
| (JSC::ARMAssembler::orrs): |
| (JSC::ARMAssembler::mov): |
| (JSC::ARMAssembler::movw): |
| (JSC::ARMAssembler::movt): |
| (JSC::ARMAssembler::movs): |
| (JSC::ARMAssembler::bic): |
| (JSC::ARMAssembler::bics): |
| (JSC::ARMAssembler::mvn): |
| (JSC::ARMAssembler::mvns): |
| (JSC::ARMAssembler::mul): |
| (JSC::ARMAssembler::muls): |
| (JSC::ARMAssembler::mull): |
| (JSC::ARMAssembler::vmov_f64): |
| (JSC::ARMAssembler::vadd_f64): |
| (JSC::ARMAssembler::vdiv_f64): |
| (JSC::ARMAssembler::vsub_f64): |
| (JSC::ARMAssembler::vmul_f64): |
| (JSC::ARMAssembler::vcmp_f64): |
| (JSC::ARMAssembler::vsqrt_f64): |
| (JSC::ARMAssembler::vabs_f64): |
| (JSC::ARMAssembler::vneg_f64): |
| (JSC::ARMAssembler::ldrImmediate): |
| (JSC::ARMAssembler::ldrUniqueImmediate): |
| (JSC::ARMAssembler::dtrUp): |
| (JSC::ARMAssembler::dtrUpRegister): |
| (JSC::ARMAssembler::dtrDown): |
| (JSC::ARMAssembler::dtrDownRegister): |
| (JSC::ARMAssembler::halfDtrUp): |
| (JSC::ARMAssembler::halfDtrUpRegister): |
| (JSC::ARMAssembler::halfDtrDown): |
| (JSC::ARMAssembler::halfDtrDownRegister): |
| (JSC::ARMAssembler::doubleDtrUp): |
| (JSC::ARMAssembler::doubleDtrDown): |
| (JSC::ARMAssembler::push): |
| (JSC::ARMAssembler::pop): |
| (JSC::ARMAssembler::poke): |
| (JSC::ARMAssembler::peek): |
| (JSC::ARMAssembler::vmov_vfp64): |
| (JSC::ARMAssembler::vmov_arm64): |
| (JSC::ARMAssembler::vmov_vfp32): |
| (JSC::ARMAssembler::vmov_arm32): |
| (JSC::ARMAssembler::vcvt_f64_s32): |
| (JSC::ARMAssembler::vcvt_s32_f64): |
| (JSC::ARMAssembler::vcvt_u32_f64): |
| (JSC::ARMAssembler::vcvt_f64_f32): |
| (JSC::ARMAssembler::vcvt_f32_f64): |
| (JSC::ARMAssembler::clz): |
| (JSC::ARMAssembler::lslRegister): |
| (JSC::ARMAssembler::lsrRegister): |
| (JSC::ARMAssembler::asrRegister): |
| (JSC::ARMAssembler::align): |
| (JSC::ARMAssembler::loadBranchTarget): |
| (JSC::ARMAssembler::vmov): |
| * assembler/MacroAssemblerARM.cpp: |
| (JSC::MacroAssemblerARM::load32WithUnalignedHalfWords): |
| * assembler/MacroAssemblerARM.h: |
| (JSC::MacroAssemblerARM::add32): |
| (JSC::MacroAssemblerARM::and32): |
| (JSC::MacroAssemblerARM::lshift32): |
| (JSC::MacroAssemblerARM::mul32): |
| (JSC::MacroAssemblerARM::or32): |
| (JSC::MacroAssemblerARM::rshift32): |
| (JSC::MacroAssemblerARM::urshift32): |
| (JSC::MacroAssemblerARM::sub32): |
| (JSC::MacroAssemblerARM::xor32): |
| (JSC::MacroAssemblerARM::countLeadingZeros32): |
| (JSC::MacroAssemblerARM::convertibleLoadPtr): |
| (JSC::MacroAssemblerARM::load32WithAddressOffsetPatch): |
| (JSC::MacroAssemblerARM::load32WithCompactAddressOffsetPatch): |
| (JSC::MacroAssemblerARM::store32WithAddressOffsetPatch): |
| (JSC::MacroAssemblerARM::store32): |
| (JSC::MacroAssemblerARM::pop): |
| (JSC::MacroAssemblerARM::push): |
| (JSC::MacroAssemblerARM::move): |
| (JSC::MacroAssemblerARM::swap): |
| (JSC::MacroAssemblerARM::branch32): |
| (JSC::MacroAssemblerARM::branchTest32): |
| (JSC::MacroAssemblerARM::mull32): |
| (JSC::MacroAssemblerARM::branchSub32): |
| (JSC::MacroAssemblerARM::compare32): |
| (JSC::MacroAssemblerARM::test32): |
| (JSC::MacroAssemblerARM::load32): |
| (JSC::MacroAssemblerARM::relativeTableJump): |
| (JSC::MacroAssemblerARM::moveWithPatch): |
| (JSC::MacroAssemblerARM::loadDouble): |
| (JSC::MacroAssemblerARM::moveDouble): |
| (JSC::MacroAssemblerARM::addDouble): |
| (JSC::MacroAssemblerARM::divDouble): |
| (JSC::MacroAssemblerARM::subDouble): |
| (JSC::MacroAssemblerARM::mulDouble): |
| (JSC::MacroAssemblerARM::sqrtDouble): |
| (JSC::MacroAssemblerARM::absDouble): |
| (JSC::MacroAssemblerARM::negateDouble): |
| (JSC::MacroAssemblerARM::convertInt32ToDouble): |
| (JSC::MacroAssemblerARM::convertFloatToDouble): |
| (JSC::MacroAssemblerARM::convertDoubleToFloat): |
| (JSC::MacroAssemblerARM::branchDouble): |
| (JSC::MacroAssemblerARM::branchTruncateDoubleToInt32): |
| (JSC::MacroAssemblerARM::branchTruncateDoubleToUint32): |
| (JSC::MacroAssemblerARM::truncateDoubleToInt32): |
| (JSC::MacroAssemblerARM::truncateDoubleToUint32): |
| (JSC::MacroAssemblerARM::branchConvertDoubleToInt32): |
| (JSC::MacroAssemblerARM::branchDoubleNonZero): |
| (JSC::MacroAssemblerARM::branchDoubleZeroOrNaN): |
| |
| 2012-08-13 Simon Hausmann <simon.hausmann@nokia.com> |
| |
| Unreviewed, rolling out r125444. |
| http://trac.webkit.org/changeset/125444 |
| https://bugs.webkit.org/show_bug.cgi?id=93872 |
| |
| Broke some tests |
| |
| * Target.pri: |
| |
| 2012-08-13 Simon Hausmann <simon.hausmann@nokia.com> |
| |
| [Qt] Replace use of internal Weak smart pointer with JSWeakObjectMap |
| https://bugs.webkit.org/show_bug.cgi?id=93872 |
| |
| Reviewed by Kenneth Rohde Christiansen. |
| |
| * Target.pri: Add missing JSWeakObjectMap file to build. |
| |
| 2012-08-13 Raphael Kubo da Costa <rakuco@webkit.org> |
| |
| [CMake] Remove glib-related Find modules and write single new one instead. |
| https://bugs.webkit.org/show_bug.cgi?id=93786 |
| |
| Reviewed by Rob Buis. |
| |
| * shell/PlatformEfl.cmake: Use GLIB_* instead of Glib_*. |
| |
| 2012-08-12 Allan Sandfeld Jensen <allan.jensen@nokia.com> |
| |
| Doesn't build with ENABLE_JIT=0 |
| https://bugs.webkit.org/show_bug.cgi?id=85042 |
| |
| Reviewed by Eric Seidel. |
| |
| Include headers without which CallFrame.h does not build, and |
| fix gcc warning about comparing unsigned int with 0. |
| |
| * dfg/DFGDriver.cpp: |
| * interpreter/Interpreter.cpp: |
| (JSC::Interpreter::isOpcode): |
| |
| 2012-08-10 Yong Li <yoli@rim.com> |
| |
| [BlackBerry] GCActivityCallback should always schedule GC even allocated bytes is a small number |
| https://bugs.webkit.org/show_bug.cgi?id=93650 |
| |
| Reviewed by Rob Buis. |
| |
| Even a small number of allocated JS objects could hold expensive resources. |
| |
| * runtime/GCActivityCallbackBlackBerry.cpp: |
| (JSC::DefaultGCActivityCallback::didAllocate): |
| |
| 2012-08-09 Yong Li <yoli@rim.com> |
| |
| [QNX] Implement getCPUTime() for OS(QNX) |
| https://bugs.webkit.org/show_bug.cgi?id=93516 |
| |
| Reviewed by George Staikos. |
| |
| Implement getCPUTime() with CLOCK_THREAD_CPUTIME_ID so it will tell |
| exactly how long the current thread has spent without being impacted |
| by other things. |
| |
| * runtime/TimeoutChecker.cpp: |
| (JSC::getCPUTime): |
| |
| 2012-08-08 Shane Stephens <shanestephens@google.com> |
| |
| Compile flag for CSS Hierarchies |
| https://bugs.webkit.org/show_bug.cgi?id=92433 |
| |
| Reviewed by Tony Chang. |
| |
| * Configurations/FeatureDefines.xcconfig: |
| |
| 2012-08-08 Benjamin Poulain <bpoulain@apple.com> |
| |
| Use char* instead of LChar* for the public interface of String construction from literals |
| https://bugs.webkit.org/show_bug.cgi?id=93402 |
| |
| Reviewed by Michael Saboff. |
| |
| Update JSC' Identifier to use StringImpl::createFromLiteral with a char*. |
| |
| * runtime/Identifier.cpp: |
| (JSC::IdentifierASCIIStringTranslator::translate): |
| |
| 2012-08-08 Patrick Gansterer <paroga@webkit.org> |
| |
| Remove ce_time.(cpp|h) from list of source files |
| https://bugs.webkit.org/show_bug.cgi?id=93446 |
| |
| Reviewed by Simon Hausmann. |
| |
| r125004 removed the last dependency on functions defined in ce_time.cpp. |
| |
| * Target.pri: |
| |
| 2012-08-08 Patrick Gansterer <paroga@webkit.org> |
| |
| [WIN] Use GetTimeZoneInformation() for getting the timezone name |
| https://bugs.webkit.org/show_bug.cgi?id=91936 |
| |
| Reviewed by Ryosuke Niwa. |
| |
| The MS CRT implementation of strftime calls the same functions in the background. |
| Using them directly avoids the overhead of parsing the format string and removes |
| the dependency on strftime() for WinCE where this function does not exist. |
| |
| * runtime/DateConversion.cpp: |
| (JSC::formatTime): |
| |
| 2012-08-07 Gabor Ballabas <gaborb@inf.u-szeged.hu> |
| |
| Refactor magic numbers in the ARM port of DFG-JIT |
| https://bugs.webkit.org/show_bug.cgi?id=93348 |
| |
| Reviewed by Eric Seidel. |
| |
| Introduce new names for hard-coded magic numbers. |
| Refactor constant with confusing names to more descriptive ones. |
| |
| * assembler/ARMAssembler.cpp: |
| (JSC::ARMAssembler::patchConstantPoolLoad): |
| (JSC::ARMAssembler::getOp2): |
| (JSC::ARMAssembler::genInt): |
| (JSC::ARMAssembler::getImm): |
| (JSC::ARMAssembler::moveImm): |
| (JSC::ARMAssembler::encodeComplexImm): |
| (JSC::ARMAssembler::dataTransfer32): |
| (JSC::ARMAssembler::dataTransfer16): |
| (JSC::ARMAssembler::dataTransferFloat): |
| (JSC::ARMAssembler::executableCopy): |
| * assembler/ARMAssembler.h: |
| (JSC::ARMAssembler::emitInstruction): |
| (JSC::ARMAssembler::ands_r): |
| (JSC::ARMAssembler::eors_r): |
| (JSC::ARMAssembler::subs_r): |
| (JSC::ARMAssembler::rsbs_r): |
| (JSC::ARMAssembler::adds_r): |
| (JSC::ARMAssembler::adcs_r): |
| (JSC::ARMAssembler::sbcs_r): |
| (JSC::ARMAssembler::rscs_r): |
| (JSC::ARMAssembler::tst_r): |
| (JSC::ARMAssembler::teq_r): |
| (JSC::ARMAssembler::cmp_r): |
| (JSC::ARMAssembler::cmn_r): |
| (JSC::ARMAssembler::orrs_r): |
| (JSC::ARMAssembler::movs_r): |
| (JSC::ARMAssembler::bics_r): |
| (JSC::ARMAssembler::mvns_r): |
| (JSC::ARMAssembler::muls_r): |
| (JSC::ARMAssembler::ldr_imm): |
| (JSC::ARMAssembler::ldr_un_imm): |
| (JSC::ARMAssembler::dtr_u): |
| (JSC::ARMAssembler::dtr_ur): |
| (JSC::ARMAssembler::dtr_dr): |
| (JSC::ARMAssembler::dtrh_u): |
| (JSC::ARMAssembler::dtrh_ur): |
| (JSC::ARMAssembler::fdtr_u): |
| (JSC::ARMAssembler::push_r): |
| (JSC::ARMAssembler::pop_r): |
| (JSC::ARMAssembler::getLdrImmAddress): |
| (JSC::ARMAssembler::getLdrImmAddressOnPool): |
| (JSC::ARMAssembler::patchConstantPoolLoad): |
| (JSC::ARMAssembler::repatchCompact): |
| (JSC::ARMAssembler::replaceWithJump): |
| (JSC::ARMAssembler::replaceWithLoad): |
| (JSC::ARMAssembler::replaceWithAddressComputation): |
| (JSC::ARMAssembler::getOp2Byte): |
| (JSC::ARMAssembler::getOp2Half): |
| (JSC::ARMAssembler::getImm16Op2): |
| (JSC::ARMAssembler::placeConstantPoolBarrier): |
| (JSC::ARMAssembler::getConditionalField): |
| * assembler/MacroAssemblerARM.cpp: |
| (JSC::MacroAssemblerARM::load32WithUnalignedHalfWords): |
| * assembler/MacroAssemblerARM.h: |
| (JSC::MacroAssemblerARM::and32): |
| (JSC::MacroAssemblerARM::branch32): |
| (JSC::MacroAssemblerARM::branchTest32): |
| (JSC::MacroAssemblerARM::branchTruncateDoubleToInt32): |
| |
| 2012-08-07 Benjamin Poulain <benjamin@webkit.org> |
| |
| Use the initialization from literal for JSC's Identifiers |
| https://bugs.webkit.org/show_bug.cgi?id=93193 |
| |
| Reviewed by Geoffrey Garen. |
| |
| This patches modify Identifier ot take advantage of the new initialization from literal. |
| |
| In addition to the memory savings (~600bytes per instance), this gives us a 2% speed |
| improvement on CommonIdentifiers on average. |
| |
| * runtime/CommonIdentifiers.cpp: |
| (JSC::CommonIdentifiers::CommonIdentifiers): |
| Null and empty strings are forbidden for literal initialization. Use the most efficient constructors |
| instead of a literal. |
| |
| * runtime/Identifier.cpp: |
| (IdentifierASCIIStringTranslator): |
| Rename IdentifierCStringTranslator to IdentifierASCIIStringTranslator to make the text encoding |
| explicit. |
| (JSC::IdentifierASCIIStringTranslator::hash): |
| (JSC::IdentifierASCIIStringTranslator::equal): |
| (JSC::IdentifierASCIIStringTranslator::translate): Use the fast initialization from literal. |
| (JSC::Identifier::add): |
| * runtime/Identifier.h: |
| (JSC::Identifier::Identifier): |
| |
| 2012-08-07 Simon Hausmann <simon.hausmann@nokia.com> |
| |
| [Qt][Win] Remove pthreads linkage |
| |
| Reviewed by Csaba Osztrogonác. |
| |
| After r124823 linkage to pthreads is not needed anymore for the Windows |
| build. |
| |
| * JavaScriptCore.pri: |
| |
| 2012-08-07 Gabor Ballabas <gaborb@inf.u-szeged.hu> |
| |
| Refactor emit*Inst functions and introduce toARMWord functions in DFG-JIT's traditional ARM port |
| https://bugs.webkit.org/show_bug.cgi?id=93266 |
| |
| Reviewed by Csaba Osztrogonác. |
| |
| First part of a bigger refactoring issue trying to make traditional |
| ARM DFG-JIT port easier to read and understand. |
| |
| |
| * assembler/ARMAssembler.h: |
| (JSC::ARMAssembler::emitInstruction): |
| (JSC::ARMAssembler::emitDoublePrecisionInstruction): |
| (JSC::ARMAssembler::emitSinglePrecisionInstruction): |
| (JSC::ARMAssembler::and_r): |
| (JSC::ARMAssembler::ands_r): |
| (JSC::ARMAssembler::eor_r): |
| (JSC::ARMAssembler::eors_r): |
| (JSC::ARMAssembler::sub_r): |
| (JSC::ARMAssembler::subs_r): |
| (JSC::ARMAssembler::rsb_r): |
| (JSC::ARMAssembler::rsbs_r): |
| (JSC::ARMAssembler::add_r): |
| (JSC::ARMAssembler::adds_r): |
| (JSC::ARMAssembler::adc_r): |
| (JSC::ARMAssembler::adcs_r): |
| (JSC::ARMAssembler::sbc_r): |
| (JSC::ARMAssembler::sbcs_r): |
| (JSC::ARMAssembler::rsc_r): |
| (JSC::ARMAssembler::rscs_r): |
| (JSC::ARMAssembler::tst_r): |
| (JSC::ARMAssembler::teq_r): |
| (JSC::ARMAssembler::cmp_r): |
| (JSC::ARMAssembler::cmn_r): |
| (JSC::ARMAssembler::orr_r): |
| (JSC::ARMAssembler::orrs_r): |
| (JSC::ARMAssembler::mov_r): |
| (JSC::ARMAssembler::movw_r): |
| (JSC::ARMAssembler::movt_r): |
| (JSC::ARMAssembler::movs_r): |
| (JSC::ARMAssembler::bic_r): |
| (JSC::ARMAssembler::bics_r): |
| (JSC::ARMAssembler::mvn_r): |
| (JSC::ARMAssembler::mvns_r): |
| (JSC::ARMAssembler::mul_r): |
| (JSC::ARMAssembler::muls_r): |
| (JSC::ARMAssembler::mull_r): |
| (JSC::ARMAssembler::vmov_f64_r): |
| (JSC::ARMAssembler::vadd_f64_r): |
| (JSC::ARMAssembler::vdiv_f64_r): |
| (JSC::ARMAssembler::vsub_f64_r): |
| (JSC::ARMAssembler::vmul_f64_r): |
| (JSC::ARMAssembler::vcmp_f64_r): |
| (JSC::ARMAssembler::vsqrt_f64_r): |
| (JSC::ARMAssembler::vabs_f64_r): |
| (JSC::ARMAssembler::vneg_f64_r): |
| (JSC::ARMAssembler::ldr_imm): |
| (JSC::ARMAssembler::ldr_un_imm): |
| (JSC::ARMAssembler::dtr_u): |
| (JSC::ARMAssembler::dtr_ur): |
| (JSC::ARMAssembler::dtr_d): |
| (JSC::ARMAssembler::dtr_dr): |
| (JSC::ARMAssembler::dtrh_u): |
| (JSC::ARMAssembler::dtrh_ur): |
| (JSC::ARMAssembler::dtrh_d): |
| (JSC::ARMAssembler::dtrh_dr): |
| (JSC::ARMAssembler::fdtr_u): |
| (JSC::ARMAssembler::fdtr_d): |
| (JSC::ARMAssembler::push_r): |
| (JSC::ARMAssembler::pop_r): |
| (JSC::ARMAssembler::vmov_vfp64_r): |
| (JSC::ARMAssembler::vmov_arm64_r): |
| (JSC::ARMAssembler::vmov_vfp32_r): |
| (JSC::ARMAssembler::vmov_arm32_r): |
| (JSC::ARMAssembler::vcvt_f64_s32_r): |
| (JSC::ARMAssembler::vcvt_s32_f64_r): |
| (JSC::ARMAssembler::vcvt_u32_f64_r): |
| (JSC::ARMAssembler::vcvt_f64_f32_r): |
| (JSC::ARMAssembler::vcvt_f32_f64_r): |
| (JSC::ARMAssembler::vmrs_apsr): |
| (JSC::ARMAssembler::clz_r): |
| (JSC::ARMAssembler::bx): |
| (JSC::ARMAssembler::blx): |
| (JSC::ARMAssembler::linkJump): |
| (JSC::ARMAssembler::toARMWord): |
| (ARMAssembler): |
| |
| 2012-08-06 Patrick Gansterer <paroga@webkit.org> |
| |
| [WIN] Remove dependency on pthread from MachineStackMarker |
| https://bugs.webkit.org/show_bug.cgi?id=68429 |
| |
| Reviewed by Geoffrey Garen. |
| |
| Windows has no support for calling a destructor for thread specific data. |
| Since we need more control over creating and deleting thread specific keys |
| we can not simply extend WTF::ThreadSpecific with this functionality. |
| |
| All thread specific keys created via the new API get stored in a list. |
| After a thread function finished we iterate over this list and call |
| the registered destructor for every item if needed. |
| |
| * heap/MachineStackMarker.cpp: Use the new functions instead of pthread directly. |
| (JSC::MachineThreads::~MachineThreads): |
| (JSC::MachineThreads::makeUsableFromMultipleThreads): |
| (JSC::MachineThreads::addCurrentThread): |
| * heap/MachineStackMarker.h: |
| (MachineThreads): |
| |
| 2012-08-06 Patrick Gansterer <paroga@webkit.org> |
| |
| Unify JSC date and time formating functions |
| https://bugs.webkit.org/show_bug.cgi?id=92282 |
| |
| Reviewed by Geoffrey Garen. |
| |
| Replace the existing functions for formating GregorianDateTime |
| with one single function. This removes some code duplications |
| in DatePrototype and is a preperation to fix encoding issues, |
| since we can add UChar* values to the resulting string now. |
| |
| * runtime/DateConstructor.cpp: |
| (JSC::callDate): |
| * runtime/DateConversion.cpp: |
| (JSC::formatDateTime): |
| * runtime/DateConversion.h: |
| (JSC): |
| * runtime/DatePrototype.cpp: |
| (JSC::formateDateInstance): |
| (JSC::dateProtoFuncToString): |
| (JSC::dateProtoFuncToUTCString): |
| (JSC::dateProtoFuncToDateString): |
| (JSC::dateProtoFuncToTimeString): |
| (JSC::dateProtoFuncToGMTString): |
| |
| 2012-08-06 Carlos Garcia Campos <cgarcia@igalia.com> |
| |
| Unreviewed. Fix make distcheck. |
| |
| * GNUmakefile.list.am: Add missing header file. |
| |
| 2012-08-05 Peter Wang <peter.wang@torchmobile.com.cn> |
| |
| Web Inspector: [JSC] implement setting breakpoints by line:column |
| https://bugs.webkit.org/show_bug.cgi?id=53003 |
| |
| Reviewed by Geoffrey Garen. |
| |
| Add a counter to Lexer to record the column info of each Token. Add a column parameter to |
| op_debug, cti_op_debug, and _llint_op_debug byte-code command. |
| |
| * bytecode/CodeBlock.cpp: |
| (JSC::CodeBlock::dump): |
| * bytecode/Opcode.h: |
| (JSC): |
| (JSC::padOpcodeName): |
| * bytecompiler/BytecodeGenerator.cpp: |
| (JSC::BytecodeGenerator::resolve): |
| (JSC::BytecodeGenerator::emitDebugHook): |
| * bytecompiler/BytecodeGenerator.h: |
| (BytecodeGenerator): |
| * bytecompiler/NodesCodegen.cpp: |
| (JSC::ArrayNode::toArgumentList): |
| (JSC::ApplyFunctionCallDotNode::emitBytecode): |
| (JSC::ConstStatementNode::emitBytecode): |
| (JSC::EmptyStatementNode::emitBytecode): |
| (JSC::DebuggerStatementNode::emitBytecode): |
| (JSC::ExprStatementNode::emitBytecode): |
| (JSC::VarStatementNode::emitBytecode): |
| (JSC::IfNode::emitBytecode): |
| (JSC::IfElseNode::emitBytecode): |
| (JSC::DoWhileNode::emitBytecode): |
| (JSC::WhileNode::emitBytecode): |
| (JSC::ForNode::emitBytecode): |
| (JSC::ForInNode::emitBytecode): |
| (JSC::ContinueNode::emitBytecode): |
| (JSC::BreakNode::emitBytecode): |
| (JSC::ReturnNode::emitBytecode): |
| (JSC::WithNode::emitBytecode): |
| (JSC::SwitchNode::emitBytecode): |
| (JSC::LabelNode::emitBytecode): |
| (JSC::ThrowNode::emitBytecode): |
| (JSC::TryNode::emitBytecode): |
| (JSC::ProgramNode::emitBytecode): |
| (JSC::EvalNode::emitBytecode): |
| (JSC::FunctionBodyNode::emitBytecode): |
| * debugger/Debugger.h: |
| * interpreter/Interpreter.cpp: |
| (JSC::Interpreter::unwindCallFrame): |
| (JSC::Interpreter::throwException): |
| (JSC::Interpreter::debug): |
| (JSC::Interpreter::privateExecute): |
| * interpreter/Interpreter.h: |
| (Interpreter): |
| * jit/JITOpcodes.cpp: |
| (JSC::JIT::emit_op_debug): |
| * jit/JITOpcodes32_64.cpp: |
| (JSC::JIT::emit_op_debug): |
| * jit/JITStubs.cpp: |
| (JSC::DEFINE_STUB_FUNCTION): |
| * llint/LLIntSlowPaths.cpp: |
| (JSC::LLInt::LLINT_SLOW_PATH_DECL): |
| * llint/LowLevelInterpreter.asm: |
| * parser/ASTBuilder.h: |
| (ASTBuilder): |
| (JSC::ASTBuilder::createCommaExpr): |
| (JSC::ASTBuilder::createLogicalNot): |
| (JSC::ASTBuilder::createUnaryPlus): |
| (JSC::ASTBuilder::createVoid): |
| (JSC::ASTBuilder::thisExpr): |
| (JSC::ASTBuilder::createResolve): |
| (JSC::ASTBuilder::createObjectLiteral): |
| (JSC::ASTBuilder::createArray): |
| (JSC::ASTBuilder::createNumberExpr): |
| (JSC::ASTBuilder::createString): |
| (JSC::ASTBuilder::createBoolean): |
| (JSC::ASTBuilder::createNull): |
| (JSC::ASTBuilder::createBracketAccess): |
| (JSC::ASTBuilder::createDotAccess): |
| (JSC::ASTBuilder::createRegExp): |
| (JSC::ASTBuilder::createNewExpr): |
| (JSC::ASTBuilder::createConditionalExpr): |
| (JSC::ASTBuilder::createAssignResolve): |
| (JSC::ASTBuilder::createFunctionExpr): |
| (JSC::ASTBuilder::createFunctionBody): |
| (JSC::ASTBuilder::createGetterOrSetterProperty): |
| (JSC::ASTBuilder::createArgumentsList): |
| (JSC::ASTBuilder::createPropertyList): |
| (JSC::ASTBuilder::createFuncDeclStatement): |
| (JSC::ASTBuilder::createBlockStatement): |
| (JSC::ASTBuilder::createExprStatement): |
| (JSC::ASTBuilder::createIfStatement): |
| (JSC::ASTBuilder::createForLoop): |
| (JSC::ASTBuilder::createForInLoop): |
| (JSC::ASTBuilder::createEmptyStatement): |
| (JSC::ASTBuilder::createVarStatement): |
| (JSC::ASTBuilder::createReturnStatement): |
| (JSC::ASTBuilder::createBreakStatement): |
| (JSC::ASTBuilder::createContinueStatement): |
| (JSC::ASTBuilder::createTryStatement): |
| (JSC::ASTBuilder::createSwitchStatement): |
| (JSC::ASTBuilder::createWhileStatement): |
| (JSC::ASTBuilder::createDoWhileStatement): |
| (JSC::ASTBuilder::createLabelStatement): |
| (JSC::ASTBuilder::createWithStatement): |
| (JSC::ASTBuilder::createThrowStatement): |
| (JSC::ASTBuilder::createDebugger): |
| (JSC::ASTBuilder::createConstStatement): |
| (JSC::ASTBuilder::appendConstDecl): |
| (JSC::ASTBuilder::combineCommaNodes): |
| (JSC::ASTBuilder::appendBinaryOperation): |
| (JSC::ASTBuilder::createAssignment): |
| (JSC::ASTBuilder::createNumber): |
| (JSC::ASTBuilder::makeTypeOfNode): |
| (JSC::ASTBuilder::makeDeleteNode): |
| (JSC::ASTBuilder::makeNegateNode): |
| (JSC::ASTBuilder::makeBitwiseNotNode): |
| (JSC::ASTBuilder::makeMultNode): |
| (JSC::ASTBuilder::makeDivNode): |
| (JSC::ASTBuilder::makeModNode): |
| (JSC::ASTBuilder::makeAddNode): |
| (JSC::ASTBuilder::makeSubNode): |
| (JSC::ASTBuilder::makeLeftShiftNode): |
| (JSC::ASTBuilder::makeRightShiftNode): |
| (JSC::ASTBuilder::makeURightShiftNode): |
| (JSC::ASTBuilder::makeBitOrNode): |
| (JSC::ASTBuilder::makeBitAndNode): |
| (JSC::ASTBuilder::makeBitXOrNode): |
| (JSC::ASTBuilder::makeFunctionCallNode): |
| (JSC::ASTBuilder::makeBinaryNode): |
| (JSC::ASTBuilder::makeAssignNode): |
| (JSC::ASTBuilder::makePrefixNode): |
| (JSC::ASTBuilder::makePostfixNode): |
| * parser/Lexer.cpp: |
| (JSC::::setCode): |
| (JSC::::internalShift): |
| (JSC::::shift): |
| (JSC::::lex): |
| * parser/Lexer.h: |
| (Lexer): |
| (JSC::Lexer::currentColumnNumber): |
| (JSC::::lexExpectIdentifier): |
| * parser/NodeConstructors.h: |
| (JSC::Node::Node): |
| (JSC::ExpressionNode::ExpressionNode): |
| (JSC::StatementNode::StatementNode): |
| (JSC::NullNode::NullNode): |
| (JSC::BooleanNode::BooleanNode): |
| (JSC::NumberNode::NumberNode): |
| (JSC::StringNode::StringNode): |
| (JSC::RegExpNode::RegExpNode): |
| (JSC::ThisNode::ThisNode): |
| (JSC::ResolveNode::ResolveNode): |
| (JSC::ArrayNode::ArrayNode): |
| (JSC::PropertyListNode::PropertyListNode): |
| (JSC::ObjectLiteralNode::ObjectLiteralNode): |
| (JSC::BracketAccessorNode::BracketAccessorNode): |
| (JSC::DotAccessorNode::DotAccessorNode): |
| (JSC::ArgumentListNode::ArgumentListNode): |
| (JSC::NewExprNode::NewExprNode): |
| (JSC::EvalFunctionCallNode::EvalFunctionCallNode): |
| (JSC::FunctionCallValueNode::FunctionCallValueNode): |
| (JSC::FunctionCallResolveNode::FunctionCallResolveNode): |
| (JSC::FunctionCallBracketNode::FunctionCallBracketNode): |
| (JSC::FunctionCallDotNode::FunctionCallDotNode): |
| (JSC::CallFunctionCallDotNode::CallFunctionCallDotNode): |
| (JSC::ApplyFunctionCallDotNode::ApplyFunctionCallDotNode): |
| (JSC::PrePostResolveNode::PrePostResolveNode): |
| (JSC::PostfixResolveNode::PostfixResolveNode): |
| (JSC::PostfixBracketNode::PostfixBracketNode): |
| (JSC::PostfixDotNode::PostfixDotNode): |
| (JSC::PostfixErrorNode::PostfixErrorNode): |
| (JSC::DeleteResolveNode::DeleteResolveNode): |
| (JSC::DeleteBracketNode::DeleteBracketNode): |
| (JSC::DeleteDotNode::DeleteDotNode): |
| (JSC::DeleteValueNode::DeleteValueNode): |
| (JSC::VoidNode::VoidNode): |
| (JSC::TypeOfResolveNode::TypeOfResolveNode): |
| (JSC::TypeOfValueNode::TypeOfValueNode): |
| (JSC::PrefixResolveNode::PrefixResolveNode): |
| (JSC::PrefixBracketNode::PrefixBracketNode): |
| (JSC::PrefixDotNode::PrefixDotNode): |
| (JSC::PrefixErrorNode::PrefixErrorNode): |
| (JSC::UnaryOpNode::UnaryOpNode): |
| (JSC::UnaryPlusNode::UnaryPlusNode): |
| (JSC::NegateNode::NegateNode): |
| (JSC::BitwiseNotNode::BitwiseNotNode): |
| (JSC::LogicalNotNode::LogicalNotNode): |
| (JSC::BinaryOpNode::BinaryOpNode): |
| (JSC::MultNode::MultNode): |
| (JSC::DivNode::DivNode): |
| (JSC::ModNode::ModNode): |
| (JSC::AddNode::AddNode): |
| (JSC::SubNode::SubNode): |
| (JSC::LeftShiftNode::LeftShiftNode): |
| (JSC::RightShiftNode::RightShiftNode): |
| (JSC::UnsignedRightShiftNode::UnsignedRightShiftNode): |
| (JSC::LessNode::LessNode): |
| (JSC::GreaterNode::GreaterNode): |
| (JSC::LessEqNode::LessEqNode): |
| (JSC::GreaterEqNode::GreaterEqNode): |
| (JSC::ThrowableBinaryOpNode::ThrowableBinaryOpNode): |
| (JSC::InstanceOfNode::InstanceOfNode): |
| (JSC::InNode::InNode): |
| (JSC::EqualNode::EqualNode): |
| (JSC::NotEqualNode::NotEqualNode): |
| (JSC::StrictEqualNode::StrictEqualNode): |
| (JSC::NotStrictEqualNode::NotStrictEqualNode): |
| (JSC::BitAndNode::BitAndNode): |
| (JSC::BitOrNode::BitOrNode): |
| (JSC::BitXOrNode::BitXOrNode): |
| (JSC::LogicalOpNode::LogicalOpNode): |
| (JSC::ConditionalNode::ConditionalNode): |
| (JSC::ReadModifyResolveNode::ReadModifyResolveNode): |
| (JSC::AssignResolveNode::AssignResolveNode): |
| (JSC::ReadModifyBracketNode::ReadModifyBracketNode): |
| (JSC::AssignBracketNode::AssignBracketNode): |
| (JSC::AssignDotNode::AssignDotNode): |
| (JSC::ReadModifyDotNode::ReadModifyDotNode): |
| (JSC::AssignErrorNode::AssignErrorNode): |
| (JSC::CommaNode::CommaNode): |
| (JSC::ConstStatementNode::ConstStatementNode): |
| (JSC::EmptyStatementNode::EmptyStatementNode): |
| (JSC::DebuggerStatementNode::DebuggerStatementNode): |
| (JSC::ExprStatementNode::ExprStatementNode): |
| (JSC::VarStatementNode::VarStatementNode): |
| (JSC::IfNode::IfNode): |
| (JSC::IfElseNode::IfElseNode): |
| (JSC::DoWhileNode::DoWhileNode): |
| (JSC::WhileNode::WhileNode): |
| (JSC::ForNode::ForNode): |
| (JSC::ContinueNode::ContinueNode): |
| (JSC::BreakNode::BreakNode): |
| (JSC::ReturnNode::ReturnNode): |
| (JSC::WithNode::WithNode): |
| (JSC::LabelNode::LabelNode): |
| (JSC::ThrowNode::ThrowNode): |
| (JSC::TryNode::TryNode): |
| (JSC::FuncExprNode::FuncExprNode): |
| (JSC::FuncDeclNode::FuncDeclNode): |
| (JSC::SwitchNode::SwitchNode): |
| (JSC::ConstDeclNode::ConstDeclNode): |
| (JSC::BlockNode::BlockNode): |
| (JSC::ForInNode::ForInNode): |
| * parser/Nodes.cpp: |
| (JSC::StatementNode::setLoc): |
| (JSC): |
| (JSC::ScopeNode::ScopeNode): |
| (JSC::ProgramNode::ProgramNode): |
| (JSC::ProgramNode::create): |
| (JSC::EvalNode::EvalNode): |
| (JSC::EvalNode::create): |
| (JSC::FunctionBodyNode::FunctionBodyNode): |
| (JSC::FunctionBodyNode::create): |
| * parser/Nodes.h: |
| (Node): |
| (JSC::Node::columnNo): |
| (ExpressionNode): |
| (StatementNode): |
| (JSC::StatementNode::column): |
| (NullNode): |
| (BooleanNode): |
| (NumberNode): |
| (StringNode): |
| (RegExpNode): |
| (ThisNode): |
| (ResolveNode): |
| (ArrayNode): |
| (PropertyListNode): |
| (ObjectLiteralNode): |
| (BracketAccessorNode): |
| (DotAccessorNode): |
| (ArgumentListNode): |
| (NewExprNode): |
| (EvalFunctionCallNode): |
| (FunctionCallValueNode): |
| (FunctionCallResolveNode): |
| (FunctionCallBracketNode): |
| (FunctionCallDotNode): |
| (CallFunctionCallDotNode): |
| (ApplyFunctionCallDotNode): |
| (PrePostResolveNode): |
| (PostfixResolveNode): |
| (PostfixBracketNode): |
| (PostfixDotNode): |
| (PostfixErrorNode): |
| (DeleteResolveNode): |
| (DeleteBracketNode): |
| (DeleteDotNode): |
| (DeleteValueNode): |
| (VoidNode): |
| (TypeOfResolveNode): |
| (TypeOfValueNode): |
| (PrefixResolveNode): |
| (PrefixBracketNode): |
| (PrefixDotNode): |
| (PrefixErrorNode): |
| (UnaryOpNode): |
| (UnaryPlusNode): |
| (NegateNode): |
| (BitwiseNotNode): |
| (LogicalNotNode): |
| (BinaryOpNode): |
| (MultNode): |
| (DivNode): |
| (ModNode): |
| (AddNode): |
| (SubNode): |
| (LeftShiftNode): |
| (RightShiftNode): |
| (UnsignedRightShiftNode): |
| (LessNode): |
| (GreaterNode): |
| (LessEqNode): |
| (GreaterEqNode): |
| (ThrowableBinaryOpNode): |
| (InstanceOfNode): |
| (InNode): |
| (EqualNode): |
| (NotEqualNode): |
| (StrictEqualNode): |
| (NotStrictEqualNode): |
| (BitAndNode): |
| (BitOrNode): |
| (BitXOrNode): |
| (LogicalOpNode): |
| (ConditionalNode): |
| (ReadModifyResolveNode): |
| (AssignResolveNode): |
| (ReadModifyBracketNode): |
| (AssignBracketNode): |
| (AssignDotNode): |
| (ReadModifyDotNode): |
| (AssignErrorNode): |
| (CommaNode): |
| (ConstDeclNode): |
| (ConstStatementNode): |
| (BlockNode): |
| (EmptyStatementNode): |
| (DebuggerStatementNode): |
| (ExprStatementNode): |
| (VarStatementNode): |
| (IfNode): |
| (IfElseNode): |
| (DoWhileNode): |
| (WhileNode): |
| (ForNode): |
| (ForInNode): |
| (ContinueNode): |
| (BreakNode): |
| (ReturnNode): |
| (WithNode): |
| (LabelNode): |
| (ThrowNode): |
| (TryNode): |
| (ScopeNode): |
| (ProgramNode): |
| (EvalNode): |
| (FunctionBodyNode): |
| (FuncExprNode): |
| (FuncDeclNode): |
| (SwitchNode): |
| * parser/Parser.cpp: |
| (JSC::::parseSourceElements): |
| (JSC::::parseVarDeclaration): |
| (JSC::::parseConstDeclaration): |
| (JSC::::parseDoWhileStatement): |
| (JSC::::parseWhileStatement): |
| (JSC::::parseVarDeclarationList): |
| (JSC::::parseConstDeclarationList): |
| (JSC::::parseForStatement): |
| (JSC::::parseBreakStatement): |
| (JSC::::parseContinueStatement): |
| (JSC::::parseReturnStatement): |
| (JSC::::parseThrowStatement): |
| (JSC::::parseWithStatement): |
| (JSC::::parseSwitchStatement): |
| (JSC::::parseTryStatement): |
| (JSC::::parseDebuggerStatement): |
| (JSC::::parseBlockStatement): |
| (JSC::::parseStatement): |
| (JSC::::parseFunctionBody): |
| (JSC::::parseFunctionInfo): |
| (JSC::::parseFunctionDeclaration): |
| (JSC::::parseExpressionOrLabelStatement): |
| (JSC::::parseExpressionStatement): |
| (JSC::::parseIfStatement): |
| (JSC::::parseExpression): |
| (JSC::::parseAssignmentExpression): |
| (JSC::::parseConditionalExpression): |
| (JSC::::parseBinaryExpression): |
| (JSC::::parseProperty): |
| (JSC::::parseObjectLiteral): |
| (JSC::::parseStrictObjectLiteral): |
| (JSC::::parseArrayLiteral): |
| (JSC::::parsePrimaryExpression): |
| (JSC::::parseArguments): |
| (JSC::::parseMemberExpression): |
| (JSC::::parseUnaryExpression): |
| * parser/Parser.h: |
| (JSC::Parser::next): |
| (JSC::Parser::nextExpectIdentifier): |
| (JSC::Parser::tokenStart): |
| (JSC::Parser::tokenLine): |
| (JSC::Parser::tokenEnd): |
| (JSC::Parser::tokenLocation): |
| (Parser): |
| (JSC::Parser::getTokenName): |
| (JSC::::parse): |
| * parser/ParserTokens.h: |
| (JSC::JSTokenLocation::JSTokenLocation): |
| (JSTokenLocation): |
| (JSToken): |
| * parser/SourceProviderCacheItem.h: |
| (JSC::SourceProviderCacheItem::closeBraceToken): |
| * parser/SyntaxChecker.h: |
| (JSC::SyntaxChecker::makeFunctionCallNode): |
| (JSC::SyntaxChecker::createCommaExpr): |
| (JSC::SyntaxChecker::makeAssignNode): |
| (JSC::SyntaxChecker::makePrefixNode): |
| (JSC::SyntaxChecker::makePostfixNode): |
| (JSC::SyntaxChecker::makeTypeOfNode): |
| (JSC::SyntaxChecker::makeDeleteNode): |
| (JSC::SyntaxChecker::makeNegateNode): |
| (JSC::SyntaxChecker::makeBitwiseNotNode): |
| (JSC::SyntaxChecker::createLogicalNot): |
| (JSC::SyntaxChecker::createUnaryPlus): |
| (JSC::SyntaxChecker::createVoid): |
| (JSC::SyntaxChecker::thisExpr): |
| (JSC::SyntaxChecker::createResolve): |
| (JSC::SyntaxChecker::createObjectLiteral): |
| (JSC::SyntaxChecker::createArray): |
| (JSC::SyntaxChecker::createNumberExpr): |
| (JSC::SyntaxChecker::createString): |
| (JSC::SyntaxChecker::createBoolean): |
| (JSC::SyntaxChecker::createNull): |
| (JSC::SyntaxChecker::createBracketAccess): |
| (JSC::SyntaxChecker::createDotAccess): |
| (JSC::SyntaxChecker::createRegExp): |
| (JSC::SyntaxChecker::createNewExpr): |
| (JSC::SyntaxChecker::createConditionalExpr): |
| (JSC::SyntaxChecker::createAssignResolve): |
| (JSC::SyntaxChecker::createFunctionExpr): |
| (JSC::SyntaxChecker::createFunctionBody): |
| (JSC::SyntaxChecker::createArgumentsList): |
| (JSC::SyntaxChecker::createPropertyList): |
| (JSC::SyntaxChecker::createFuncDeclStatement): |
| (JSC::SyntaxChecker::createBlockStatement): |
| (JSC::SyntaxChecker::createExprStatement): |
| (JSC::SyntaxChecker::createIfStatement): |
| (JSC::SyntaxChecker::createForLoop): |
| (JSC::SyntaxChecker::createForInLoop): |
| (JSC::SyntaxChecker::createEmptyStatement): |
| (JSC::SyntaxChecker::createVarStatement): |
| (JSC::SyntaxChecker::createReturnStatement): |
| (JSC::SyntaxChecker::createBreakStatement): |
| (JSC::SyntaxChecker::createContinueStatement): |
| (JSC::SyntaxChecker::createTryStatement): |
| (JSC::SyntaxChecker::createSwitchStatement): |
| (JSC::SyntaxChecker::createWhileStatement): |
| (JSC::SyntaxChecker::createWithStatement): |
| (JSC::SyntaxChecker::createDoWhileStatement): |
| (JSC::SyntaxChecker::createLabelStatement): |
| (JSC::SyntaxChecker::createThrowStatement): |
| (JSC::SyntaxChecker::createDebugger): |
| (JSC::SyntaxChecker::createConstStatement): |
| (JSC::SyntaxChecker::appendConstDecl): |
| (JSC::SyntaxChecker::createGetterOrSetterProperty): |
| (JSC::SyntaxChecker::combineCommaNodes): |
| (JSC::SyntaxChecker::operatorStackPop): |
| |
| 2012-08-03 Filip Pizlo <fpizlo@apple.com> |
| |
| Crashes in dfgBuildPutByIdList when clicking on just about anything on Google Maps |
| https://bugs.webkit.org/show_bug.cgi?id=92691 |
| |
| Reviewed by Mark Hahnenberg. |
| |
| The state of the stubs was changing after we determined the type (by virtue of the slow path |
| function that was called), since the get or put (in this case put) could cause arbitrary |
| side effects. Perhaps a full-blown fix would be to eliminate our reliance of the slow path |
| function to determine what to do, but an easier fix for now is to have the slow path give up |
| if its assumptions were invalidated by a side effect. |
| |
| * dfg/DFGOperations.cpp: |
| * jit/JITStubs.cpp: |
| (JSC::DEFINE_STUB_FUNCTION): |
| |
| 2012-08-03 Filip Pizlo <fpizlo@apple.com> |
| |
| DFG handling of get_by_id should always inject a ForceOSRExit node if there is no prediction |
| https://bugs.webkit.org/show_bug.cgi?id=93162 |
| |
| Reviewed by Mark Hahnenberg. |
| |
| This simplifies the DFG IR by ensuring that all nodes that use value profiles will be preceded |
| by a ForceOSRExit if the value profile had no data. |
| |
| * dfg/DFGByteCodeParser.cpp: |
| (JSC::DFG::ByteCodeParser::parseBlock): |
| |
| 2012-08-03 Filip Pizlo <fpizlo@apple.com> |
| |
| DFG::StructureCheckHoistingPhase keeps a Node& around for too long |
| https://bugs.webkit.org/show_bug.cgi?id=93157 |
| |
| Reviewed by Mark Hahnenberg. |
| |
| * dfg/DFGStructureCheckHoistingPhase.cpp: |
| (JSC::DFG::StructureCheckHoistingPhase::run): |
| |
| 2012-08-02 Patrick Gansterer <paroga@webkit.org> |
| |
| Move getLocalTime() as static inline function to DateMath |
| https://bugs.webkit.org/show_bug.cgi?id=92955 |
| |
| Reviewed by Ryosuke Niwa. |
| |
| getCurrentLocalTime() and getLocalTime() has been superseded with the |
| GregorianDateTime class. So we can move it into DateMath.cpp as an static inline |
| function. This allows us to remove the dependecy on time() and localtime() |
| for Windows CE, where this functions require the ce_time library to work. |
| |
| * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.def: |
| |
| 2012-08-02 Filip Pizlo <fpizlo@apple.com> |
| |
| ASSERTION FAILED: at(m_compileIndex).canExit() || m_isCheckingArgumentTypes |
| https://bugs.webkit.org/show_bug.cgi?id=91074 |
| |
| Reviewed by Mark Hahnenberg. |
| |
| Fixes a bug where the speculative JIT was performing an unnecessary speculation that the |
| CFA had proven shouldn't be performed, leading to asserts that a node should not have |
| exit sites. This is a debug-only assert with no release symptom - we were just emitting |
| a check that was not reachable. |
| |
| Also found, and fixed, a bug where structure check hoisting was slightly confusing the |
| CFA by inserting GetLocal's into the graph. CSE would clean the GetLocal's up, which |
| would make the backend happy - but the CFA would produce subtly wrong results. |
| |
| * bytecode/SpeculatedType.h: |
| (JSC::isOtherOrEmptySpeculation): |
| (JSC): |
| * dfg/DFGDriver.cpp: |
| (JSC::DFG::compile): |
| * dfg/DFGGraph.cpp: |
| (JSC::DFG::Graph::dump): |
| * dfg/DFGSpeculativeJIT64.cpp: |
| (JSC::DFG::SpeculativeJIT::compileObjectToObjectOrOtherEquality): |
| (JSC::DFG::SpeculativeJIT::compilePeepHoleObjectToObjectOrOtherEquality): |
| |
| 2012-08-02 Filip Pizlo <fpizlo@apple.com> |
| |
| Unreviewed, build fix for DFG_ENABLE(DEBUG_PROPAGATION_VERBOSE). |
| |
| * dfg/DFGStructureCheckHoistingPhase.cpp: |
| (JSC::DFG::StructureCheckHoistingPhase::run): |
| |
| 2012-08-01 Mark Hahnenberg <mhahnenberg@apple.com> |
| |
| Remove all uses of ClassInfo for JSStrings in JIT code |
| https://bugs.webkit.org/show_bug.cgi?id=92935 |
| |
| Reviewed by Geoffrey Garen. |
| |
| This is the first step in removing our dependence on in-object ClassInfo pointers |
| in JIT code. Most of the changes are to check the Structure, which is unique for |
| JSString primitives. |
| |
| * bytecode/SpeculatedType.cpp: |
| (JSC::speculationFromClassInfo): |
| (JSC::speculationFromStructure): Changed to check the TypeInfo in the Structure |
| since there wasn't a JSGlobalData immediately available to grab the JSString |
| Structure out of. |
| * dfg/DFGSpeculativeJIT.cpp: |
| (JSC::DFG::SpeculativeJIT::compileGetIndexedPropertyStorage): |
| * dfg/DFGSpeculativeJIT32_64.cpp: |
| (JSC::DFG::SpeculativeJIT::compile): |
| * dfg/DFGSpeculativeJIT64.cpp: |
| (JSC::DFG::SpeculativeJIT::compile): |
| * jit/JITInlineMethods.h: |
| (JSC::JIT::emitLoadCharacterString): |
| * jit/JITOpcodes.cpp: |
| (JSC::JIT::privateCompileCTIMachineTrampolines): |
| (JSC::JIT::emit_op_to_primitive): |
| (JSC::JIT::emit_op_convert_this): |
| * jit/JITOpcodes32_64.cpp: |
| (JSC::JIT::privateCompileCTIMachineTrampolines): |
| (JSC::JIT::emit_op_to_primitive): |
| (JSC::JIT::emitSlow_op_eq): |
| (JSC::JIT::emitSlow_op_neq): |
| (JSC::JIT::compileOpStrictEq): |
| (JSC::JIT::emit_op_convert_this): |
| * jit/JITPropertyAccess.cpp: |
| (JSC::JIT::stringGetByValStubGenerator): |
| (JSC::JIT::emitSlow_op_get_by_val): |
| * jit/JITPropertyAccess32_64.cpp: |
| (JSC::JIT::stringGetByValStubGenerator): |
| (JSC::JIT::emitSlow_op_get_by_val): |
| * jit/SpecializedThunkJIT.h: |
| (JSC::SpecializedThunkJIT::loadJSStringArgument): |
| * jit/ThunkGenerators.cpp: |
| (JSC::stringCharLoad): |
| (JSC::charCodeAtThunkGenerator): |
| (JSC::charAtThunkGenerator): |
| |
| 2012-08-02 Filip Pizlo <fpizlo@apple.com> |
| |
| Unreviewed, missed a style goof in the previous patch: "NodeIndex nodeIndex" |
| in a method signature is painfully redundant. |
| |
| * dfg/DFGSpeculativeJIT.h: |
| (SpeculativeJIT): |
| |
| 2012-08-02 Filip Pizlo <fpizlo@apple.com> |
| |
| DFGSpeculativeJIT.h has too many inline method bodies |
| https://bugs.webkit.org/show_bug.cgi?id=92957 |
| |
| Reviewed by Antti Koivisto. |
| |
| * dfg/DFGSpeculativeJIT.cpp: |
| (JSC::DFG::SpeculativeJIT::speculationCheck): |
| (DFG): |
| (JSC::DFG::SpeculativeJIT::speculationWatchpoint): |
| (JSC::DFG::SpeculativeJIT::forwardSpeculationCheck): |
| (JSC::DFG::SpeculativeJIT::speculationCheckWithConditionalDirection): |
| (JSC::DFG::SpeculativeJIT::terminateSpeculativeExecution): |
| (JSC::DFG::SpeculativeJIT::terminateSpeculativeExecutionWithConditionalDirection): |
| * dfg/DFGSpeculativeJIT.h: |
| (SpeculativeJIT): |
| |
| 2012-08-01 Sheriff Bot <webkit.review.bot@gmail.com> |
| |
| Unreviewed, rolling out r124406. |
| http://trac.webkit.org/changeset/124406 |
| https://bugs.webkit.org/show_bug.cgi?id=92951 |
| |
| it set the Mac bots on fire (Requested by pizlo on #webkit). |
| |
| * bytecode/Opcode.h: |
| (JSC): |
| (JSC::padOpcodeName): |
| * bytecompiler/BytecodeGenerator.cpp: |
| (JSC::BytecodeGenerator::emitDebugHook): |
| * bytecompiler/BytecodeGenerator.h: |
| (BytecodeGenerator): |
| * bytecompiler/NodesCodegen.cpp: |
| (JSC::ArrayNode::toArgumentList): |
| (JSC::ApplyFunctionCallDotNode::emitBytecode): |
| (JSC::ConditionalNode::emitBytecode): |
| (JSC::ConstStatementNode::emitBytecode): |
| (JSC::EmptyStatementNode::emitBytecode): |
| (JSC::DebuggerStatementNode::emitBytecode): |
| (JSC::ExprStatementNode::emitBytecode): |
| (JSC::VarStatementNode::emitBytecode): |
| (JSC::IfNode::emitBytecode): |
| (JSC::IfElseNode::emitBytecode): |
| (JSC::DoWhileNode::emitBytecode): |
| (JSC::WhileNode::emitBytecode): |
| (JSC::ForNode::emitBytecode): |
| (JSC::ForInNode::emitBytecode): |
| (JSC::ContinueNode::emitBytecode): |
| (JSC::BreakNode::emitBytecode): |
| (JSC::ReturnNode::emitBytecode): |
| (JSC::WithNode::emitBytecode): |
| (JSC::SwitchNode::emitBytecode): |
| (JSC::LabelNode::emitBytecode): |
| (JSC::ThrowNode::emitBytecode): |
| (JSC::TryNode::emitBytecode): |
| (JSC::ProgramNode::emitBytecode): |
| (JSC::EvalNode::emitBytecode): |
| (JSC::FunctionBodyNode::emitBytecode): |
| * debugger/Debugger.h: |
| * interpreter/Interpreter.cpp: |
| (JSC::Interpreter::unwindCallFrame): |
| (JSC::Interpreter::throwException): |
| (JSC::Interpreter::debug): |
| * interpreter/Interpreter.h: |
| (Interpreter): |
| * jit/JITOpcodes.cpp: |
| (JSC::JIT::emit_op_debug): |
| * jit/JITOpcodes32_64.cpp: |
| (JSC::JIT::emit_op_debug): |
| * jit/JITStubs.cpp: |
| (JSC::DEFINE_STUB_FUNCTION): |
| * llint/LLIntSlowPaths.cpp: |
| (JSC::LLInt::LLINT_SLOW_PATH_DECL): |
| * parser/ASTBuilder.h: |
| (ASTBuilder): |
| (JSC::ASTBuilder::createCommaExpr): |
| (JSC::ASTBuilder::createLogicalNot): |
| (JSC::ASTBuilder::createUnaryPlus): |
| (JSC::ASTBuilder::createVoid): |
| (JSC::ASTBuilder::thisExpr): |
| (JSC::ASTBuilder::createResolve): |
| (JSC::ASTBuilder::createObjectLiteral): |
| (JSC::ASTBuilder::createArray): |
| (JSC::ASTBuilder::createNumberExpr): |
| (JSC::ASTBuilder::createString): |
| (JSC::ASTBuilder::createBoolean): |
| (JSC::ASTBuilder::createNull): |
| (JSC::ASTBuilder::createBracketAccess): |
| (JSC::ASTBuilder::createDotAccess): |
| (JSC::ASTBuilder::createRegExp): |
| (JSC::ASTBuilder::createNewExpr): |
| (JSC::ASTBuilder::createConditionalExpr): |
| (JSC::ASTBuilder::createAssignResolve): |
| (JSC::ASTBuilder::createFunctionExpr): |
| (JSC::ASTBuilder::createFunctionBody): |
| (JSC::ASTBuilder::createGetterOrSetterProperty): |
| (JSC::ASTBuilder::createArgumentsList): |
| (JSC::ASTBuilder::createPropertyList): |
| (JSC::ASTBuilder::createFuncDeclStatement): |
| (JSC::ASTBuilder::createBlockStatement): |
| (JSC::ASTBuilder::createExprStatement): |
| (JSC::ASTBuilder::createIfStatement): |
| (JSC::ASTBuilder::createForLoop): |
| (JSC::ASTBuilder::createForInLoop): |
| (JSC::ASTBuilder::createEmptyStatement): |
| (JSC::ASTBuilder::createVarStatement): |
| (JSC::ASTBuilder::createReturnStatement): |
| (JSC::ASTBuilder::createBreakStatement): |
| (JSC::ASTBuilder::createContinueStatement): |
| (JSC::ASTBuilder::createTryStatement): |
| (JSC::ASTBuilder::createSwitchStatement): |
| (JSC::ASTBuilder::createWhileStatement): |
| (JSC::ASTBuilder::createDoWhileStatement): |
| (JSC::ASTBuilder::createLabelStatement): |
| (JSC::ASTBuilder::createWithStatement): |
| (JSC::ASTBuilder::createThrowStatement): |
| (JSC::ASTBuilder::createDebugger): |
| (JSC::ASTBuilder::createConstStatement): |
| (JSC::ASTBuilder::appendConstDecl): |
| (JSC::ASTBuilder::combineCommaNodes): |
| (JSC::ASTBuilder::appendBinaryOperation): |
| (JSC::ASTBuilder::createAssignment): |
| (JSC::ASTBuilder::createNumber): |
| (JSC::ASTBuilder::makeTypeOfNode): |
| (JSC::ASTBuilder::makeDeleteNode): |
| (JSC::ASTBuilder::makeNegateNode): |
| (JSC::ASTBuilder::makeBitwiseNotNode): |
| (JSC::ASTBuilder::makeMultNode): |
| (JSC::ASTBuilder::makeDivNode): |
| (JSC::ASTBuilder::makeModNode): |
| (JSC::ASTBuilder::makeAddNode): |
| (JSC::ASTBuilder::makeSubNode): |
| (JSC::ASTBuilder::makeLeftShiftNode): |
| (JSC::ASTBuilder::makeRightShiftNode): |
| (JSC::ASTBuilder::makeURightShiftNode): |
| (JSC::ASTBuilder::makeBitOrNode): |
| (JSC::ASTBuilder::makeBitAndNode): |
| (JSC::ASTBuilder::makeBitXOrNode): |
| (JSC::ASTBuilder::makeFunctionCallNode): |
| (JSC::ASTBuilder::makeBinaryNode): |
| (JSC::ASTBuilder::makeAssignNode): |
| (JSC::ASTBuilder::makePrefixNode): |
| (JSC::ASTBuilder::makePostfixNode): |
| * parser/Lexer.cpp: |
| (JSC::::setCode): |
| (JSC::::internalShift): |
| (JSC::::shift): |
| (JSC::::lex): |
| * parser/Lexer.h: |
| (Lexer): |
| (JSC::::lexExpectIdentifier): |
| * parser/NodeConstructors.h: |
| (JSC::Node::Node): |
| (JSC::ExpressionNode::ExpressionNode): |
| (JSC::StatementNode::StatementNode): |
| (JSC::NullNode::NullNode): |
| (JSC::BooleanNode::BooleanNode): |
| (JSC::NumberNode::NumberNode): |
| (JSC::StringNode::StringNode): |
| (JSC::RegExpNode::RegExpNode): |
| (JSC::ThisNode::ThisNode): |
| (JSC::ResolveNode::ResolveNode): |
| (JSC::ArrayNode::ArrayNode): |
| (JSC::PropertyListNode::PropertyListNode): |
| (JSC::ObjectLiteralNode::ObjectLiteralNode): |
| (JSC::BracketAccessorNode::BracketAccessorNode): |
| (JSC::DotAccessorNode::DotAccessorNode): |
| (JSC::ArgumentListNode::ArgumentListNode): |
| (JSC::NewExprNode::NewExprNode): |
| (JSC::EvalFunctionCallNode::EvalFunctionCallNode): |
| (JSC::FunctionCallValueNode::FunctionCallValueNode): |
| (JSC::FunctionCallResolveNode::FunctionCallResolveNode): |
| (JSC::FunctionCallBracketNode::FunctionCallBracketNode): |
| (JSC::FunctionCallDotNode::FunctionCallDotNode): |
| (JSC::CallFunctionCallDotNode::CallFunctionCallDotNode): |
| (JSC::ApplyFunctionCallDotNode::ApplyFunctionCallDotNode): |
| (JSC::PrePostResolveNode::PrePostResolveNode): |
| (JSC::PostfixResolveNode::PostfixResolveNode): |
| (JSC::PostfixBracketNode::PostfixBracketNode): |
| (JSC::PostfixDotNode::PostfixDotNode): |
| (JSC::PostfixErrorNode::PostfixErrorNode): |
| (JSC::DeleteResolveNode::DeleteResolveNode): |
| (JSC::DeleteBracketNode::DeleteBracketNode): |
| (JSC::DeleteDotNode::DeleteDotNode): |
| (JSC::DeleteValueNode::DeleteValueNode): |
| (JSC::VoidNode::VoidNode): |
| (JSC::TypeOfResolveNode::TypeOfResolveNode): |
| (JSC::TypeOfValueNode::TypeOfValueNode): |
| (JSC::PrefixResolveNode::PrefixResolveNode): |
| (JSC::PrefixBracketNode::PrefixBracketNode): |
| (JSC::PrefixDotNode::PrefixDotNode): |
| (JSC::PrefixErrorNode::PrefixErrorNode): |
| (JSC::UnaryOpNode::UnaryOpNode): |
| (JSC::UnaryPlusNode::UnaryPlusNode): |
| (JSC::NegateNode::NegateNode): |
| (JSC::BitwiseNotNode::BitwiseNotNode): |
| (JSC::LogicalNotNode::LogicalNotNode): |
| (JSC::BinaryOpNode::BinaryOpNode): |
| (JSC::MultNode::MultNode): |
| (JSC::DivNode::DivNode): |
| (JSC::ModNode::ModNode): |
| (JSC::AddNode::AddNode): |
| (JSC::SubNode::SubNode): |
| (JSC::LeftShiftNode::LeftShiftNode): |
| (JSC::RightShiftNode::RightShiftNode): |
| (JSC::UnsignedRightShiftNode::UnsignedRightShiftNode): |
| (JSC::LessNode::LessNode): |
| (JSC::GreaterNode::GreaterNode): |
| (JSC::LessEqNode::LessEqNode): |
| (JSC::GreaterEqNode::GreaterEqNode): |
| (JSC::ThrowableBinaryOpNode::ThrowableBinaryOpNode): |
| (JSC::InstanceOfNode::InstanceOfNode): |
| (JSC::InNode::InNode): |
| (JSC::EqualNode::EqualNode): |
| (JSC::NotEqualNode::NotEqualNode): |
| (JSC::StrictEqualNode::StrictEqualNode): |
| (JSC::NotStrictEqualNode::NotStrictEqualNode): |
| (JSC::BitAndNode::BitAndNode): |
| (JSC::BitOrNode::BitOrNode): |
| (JSC::BitXOrNode::BitXOrNode): |
| (JSC::LogicalOpNode::LogicalOpNode): |
| (JSC::ConditionalNode::ConditionalNode): |
| (JSC::ReadModifyResolveNode::ReadModifyResolveNode): |
| (JSC::AssignResolveNode::AssignResolveNode): |
| (JSC::ReadModifyBracketNode::ReadModifyBracketNode): |
| (JSC::AssignBracketNode::AssignBracketNode): |
| (JSC::AssignDotNode::AssignDotNode): |
| (JSC::ReadModifyDotNode::ReadModifyDotNode): |
| (JSC::AssignErrorNode::AssignErrorNode): |
| (JSC::CommaNode::CommaNode): |
| (JSC::ConstStatementNode::ConstStatementNode): |
| (JSC::EmptyStatementNode::EmptyStatementNode): |
| (JSC::DebuggerStatementNode::DebuggerStatementNode): |
| (JSC::ExprStatementNode::ExprStatementNode): |
| (JSC::VarStatementNode::VarStatementNode): |
| (JSC::IfNode::IfNode): |
| (JSC::IfElseNode::IfElseNode): |
| (JSC::DoWhileNode::DoWhileNode): |
| (JSC::WhileNode::WhileNode): |
| (JSC::ForNode::ForNode): |
| (JSC::ContinueNode::ContinueNode): |
| (JSC::BreakNode::BreakNode): |
| (JSC::ReturnNode::ReturnNode): |
| (JSC::WithNode::WithNode): |
| (JSC::LabelNode::LabelNode): |
| (JSC::ThrowNode::ThrowNode): |
| (JSC::TryNode::TryNode): |
| (JSC::FuncExprNode::FuncExprNode): |
| (JSC::FuncDeclNode::FuncDeclNode): |
| (JSC::SwitchNode::SwitchNode): |
| (JSC::ConstDeclNode::ConstDeclNode): |
| (JSC::BlockNode::BlockNode): |
| (JSC::ForInNode::ForInNode): |
| * parser/Nodes.cpp: |
| (JSC): |
| (JSC::StatementNode::setLoc): |
| (JSC::ScopeNode::ScopeNode): |
| (JSC::ProgramNode::ProgramNode): |
| (JSC::ProgramNode::create): |
| (JSC::EvalNode::EvalNode): |
| (JSC::EvalNode::create): |
| (JSC::FunctionBodyNode::FunctionBodyNode): |
| (JSC::FunctionBodyNode::create): |
| * parser/Nodes.h: |
| (Node): |
| (ExpressionNode): |
| (StatementNode): |
| (NullNode): |
| (BooleanNode): |
| (NumberNode): |
| (StringNode): |
| (RegExpNode): |
| (ThisNode): |
| (ResolveNode): |
| (ArrayNode): |
| (PropertyListNode): |
| (ObjectLiteralNode): |
| (BracketAccessorNode): |
| (DotAccessorNode): |
| (ArgumentListNode): |
| (NewExprNode): |
| (EvalFunctionCallNode): |
| (FunctionCallValueNode): |
| (FunctionCallResolveNode): |
| (FunctionCallBracketNode): |
| (FunctionCallDotNode): |
| (CallFunctionCallDotNode): |
| (ApplyFunctionCallDotNode): |
| (PrePostResolveNode): |
| (PostfixResolveNode): |
| (PostfixBracketNode): |
| (PostfixDotNode): |
| (PostfixErrorNode): |
| (DeleteResolveNode): |
| (DeleteBracketNode): |
| (DeleteDotNode): |
| (DeleteValueNode): |
| (VoidNode): |
| (TypeOfResolveNode): |
| (TypeOfValueNode): |
| (PrefixResolveNode): |
| (PrefixBracketNode): |
| (PrefixDotNode): |
| (PrefixErrorNode): |
| (UnaryOpNode): |
| (UnaryPlusNode): |
| (NegateNode): |
| (BitwiseNotNode): |
| (LogicalNotNode): |
| (BinaryOpNode): |
| (MultNode): |
| (DivNode): |
| (ModNode): |
| (AddNode): |
| (SubNode): |
| (LeftShiftNode): |
| (RightShiftNode): |
| (UnsignedRightShiftNode): |
| (LessNode): |
| (GreaterNode): |
| (LessEqNode): |
| (GreaterEqNode): |
| (ThrowableBinaryOpNode): |
| (InstanceOfNode): |
| (InNode): |
| (EqualNode): |
| (NotEqualNode): |
| (StrictEqualNode): |
| (NotStrictEqualNode): |
| (BitAndNode): |
| (BitOrNode): |
| (BitXOrNode): |
| (LogicalOpNode): |
| (ConditionalNode): |
| (ReadModifyResolveNode): |
| (AssignResolveNode): |
| (ReadModifyBracketNode): |
| (AssignBracketNode): |
| (AssignDotNode): |
| (ReadModifyDotNode): |
| (AssignErrorNode): |
| (CommaNode): |
| (ConstDeclNode): |
| (ConstStatementNode): |
| (BlockNode): |
| (EmptyStatementNode): |
| (DebuggerStatementNode): |
| (ExprStatementNode): |
| (VarStatementNode): |
| (IfNode): |
| (IfElseNode): |
| (DoWhileNode): |
| (WhileNode): |
| (ForNode): |
| (ForInNode): |
| (ContinueNode): |
| (BreakNode): |
| (ReturnNode): |
| (WithNode): |
| (LabelNode): |
| (ThrowNode): |
| (TryNode): |
| (ScopeNode): |
| (ProgramNode): |
| (EvalNode): |
| (FunctionBodyNode): |
| (FuncExprNode): |
| (FuncDeclNode): |
| (SwitchNode): |
| * parser/Parser.cpp: |
| (JSC::::parseSourceElements): |
| (JSC::::parseVarDeclaration): |
| (JSC::::parseConstDeclaration): |
| (JSC::::parseDoWhileStatement): |
| (JSC::::parseWhileStatement): |
| (JSC::::parseVarDeclarationList): |
| (JSC::::parseConstDeclarationList): |
| (JSC::::parseForStatement): |
| (JSC::::parseBreakStatement): |
| (JSC::::parseContinueStatement): |
| (JSC::::parseReturnStatement): |
| (JSC::::parseThrowStatement): |
| (JSC::::parseWithStatement): |
| (JSC::::parseSwitchStatement): |
| (JSC::::parseTryStatement): |
| (JSC::::parseDebuggerStatement): |
| (JSC::::parseBlockStatement): |
| (JSC::::parseStatement): |
| (JSC::::parseFunctionBody): |
| (JSC::::parseFunctionInfo): |
| (JSC::::parseFunctionDeclaration): |
| (JSC::::parseExpressionOrLabelStatement): |
| (JSC::::parseExpressionStatement): |
| (JSC::::parseIfStatement): |
| (JSC::::parseExpression): |
| (JSC::::parseAssignmentExpression): |
| (JSC::::parseConditionalExpression): |
| (JSC::::parseBinaryExpression): |
| (JSC::::parseProperty): |
| (JSC::::parseObjectLiteral): |
| (JSC::::parseStrictObjectLiteral): |
| (JSC::::parseArrayLiteral): |
| (JSC::::parsePrimaryExpression): |
| (JSC::::parseArguments): |
| (JSC::::parseMemberExpression): |
| (JSC::::parseUnaryExpression): |
| * parser/Parser.h: |
| (JSC::Parser::next): |
| (JSC::Parser::nextExpectIdentifier): |
| (JSC::Parser::tokenStart): |
| (JSC::Parser::tokenLine): |
| (JSC::Parser::tokenEnd): |
| (JSC::Parser::getTokenName): |
| (JSC::::parse): |
| * parser/ParserTokens.h: |
| (JSC::JSTokenInfo::JSTokenInfo): |
| (JSTokenInfo): |
| (JSToken): |
| * parser/SourceProviderCacheItem.h: |
| (JSC::SourceProviderCacheItem::closeBraceToken): |
| * parser/SyntaxChecker.h: |
| (JSC::SyntaxChecker::makeFunctionCallNode): |
| (JSC::SyntaxChecker::createCommaExpr): |
| (JSC::SyntaxChecker::makeAssignNode): |
| (JSC::SyntaxChecker::makePrefixNode): |
| (JSC::SyntaxChecker::makePostfixNode): |
| (JSC::SyntaxChecker::makeTypeOfNode): |
| (JSC::SyntaxChecker::makeDeleteNode): |
| (JSC::SyntaxChecker::makeNegateNode): |
| (JSC::SyntaxChecker::makeBitwiseNotNode): |
| (JSC::SyntaxChecker::createLogicalNot): |
| (JSC::SyntaxChecker::createUnaryPlus): |
| (JSC::SyntaxChecker::createVoid): |
| (JSC::SyntaxChecker::thisExpr): |
| (JSC::SyntaxChecker::createResolve): |
| (JSC::SyntaxChecker::createObjectLiteral): |
| (JSC::SyntaxChecker::createArray): |
| (JSC::SyntaxChecker::createNumberExpr): |
| (JSC::SyntaxChecker::createString): |
| (JSC::SyntaxChecker::createBoolean): |
| (JSC::SyntaxChecker::createNull): |
| (JSC::SyntaxChecker::createBracketAccess): |
| (JSC::SyntaxChecker::createDotAccess): |
| (JSC::SyntaxChecker::createRegExp): |
| (JSC::SyntaxChecker::createNewExpr): |
| (JSC::SyntaxChecker::createConditionalExpr): |
| (JSC::SyntaxChecker::createAssignResolve): |
| (JSC::SyntaxChecker::createFunctionExpr): |
| (JSC::SyntaxChecker::createFunctionBody): |
| (JSC::SyntaxChecker::createArgumentsList): |
| (JSC::SyntaxChecker::createPropertyList): |
| (JSC::SyntaxChecker::createFuncDeclStatement): |
| (JSC::SyntaxChecker::createBlockStatement): |
| (JSC::SyntaxChecker::createExprStatement): |
| (JSC::SyntaxChecker::createIfStatement): |
| (JSC::SyntaxChecker::createForLoop): |
| (JSC::SyntaxChecker::createForInLoop): |
| (JSC::SyntaxChecker::createEmptyStatement): |
| (JSC::SyntaxChecker::createVarStatement): |
| (JSC::SyntaxChecker::createReturnStatement): |
| (JSC::SyntaxChecker::createBreakStatement): |
| (JSC::SyntaxChecker::createContinueStatement): |
| (JSC::SyntaxChecker::createTryStatement): |
| (JSC::SyntaxChecker::createSwitchStatement): |
| (JSC::SyntaxChecker::createWhileStatement): |
| (JSC::SyntaxChecker::createWithStatement): |
| (JSC::SyntaxChecker::createDoWhileStatement): |
| (JSC::SyntaxChecker::createLabelStatement): |
| (JSC::SyntaxChecker::createThrowStatement): |
| (JSC::SyntaxChecker::createDebugger): |
| (JSC::SyntaxChecker::createConstStatement): |
| (JSC::SyntaxChecker::appendConstDecl): |
| (JSC::SyntaxChecker::createGetterOrSetterProperty): |
| (JSC::SyntaxChecker::combineCommaNodes): |
| (JSC::SyntaxChecker::operatorStackPop): |
| |
| 2012-08-01 Peter Wang <peter.wang@torchmobile.com.cn> |
| |
| Web Inspector: [JSC] implement setting breakpoints by line:column |
| https://bugs.webkit.org/show_bug.cgi?id=53003 |
| |
| Reviewed by Geoffrey Garen. |
| |
| Add a counter in lexer to record the column of each token. Debugger will use column info |
| in "Pretty Print" debug mode of Inspector. |
| |
| * bytecode/Opcode.h: |
| (JSC): |
| (JSC::padOpcodeName): |
| * bytecompiler/BytecodeGenerator.cpp: |
| (JSC::BytecodeGenerator::emitDebugHook): |
| * bytecompiler/BytecodeGenerator.h: |
| (BytecodeGenerator): |
| * bytecompiler/NodesCodegen.cpp: |
| (JSC::ArrayNode::toArgumentList): |
| (JSC::ApplyFunctionCallDotNode::emitBytecode): |
| (JSC::ConditionalNode::emitBytecode): |
| (JSC::ConstStatementNode::emitBytecode): |
| (JSC::EmptyStatementNode::emitBytecode): |
| (JSC::DebuggerStatementNode::emitBytecode): |
| (JSC::ExprStatementNode::emitBytecode): |
| (JSC::VarStatementNode::emitBytecode): |
| (JSC::IfNode::emitBytecode): |
| (JSC::IfElseNode::emitBytecode): |
| (JSC::DoWhileNode::emitBytecode): |
| (JSC::WhileNode::emitBytecode): |
| (JSC::ForNode::emitBytecode): |
| (JSC::ForInNode::emitBytecode): |
| (JSC::ContinueNode::emitBytecode): |
| (JSC::BreakNode::emitBytecode): |
| (JSC::ReturnNode::emitBytecode): |
| (JSC::WithNode::emitBytecode): |
| (JSC::SwitchNode::emitBytecode): |
| (JSC::LabelNode::emitBytecode): |
| (JSC::ThrowNode::emitBytecode): |
| (JSC::TryNode::emitBytecode): |
| (JSC::ProgramNode::emitBytecode): |
| (JSC::EvalNode::emitBytecode): |
| (JSC::FunctionBodyNode::emitBytecode): |
| * debugger/Debugger.h: |
| * interpreter/Interpreter.cpp: |
| (JSC::Interpreter::unwindCallFrame): |
| (JSC::Interpreter::throwException): |
| (JSC::Interpreter::debug): |
| * interpreter/Interpreter.h: |
| (Interpreter): |
| * jit/JITOpcodes.cpp: |
| (JSC::JIT::emit_op_debug): |
| * jit/JITOpcodes32_64.cpp: |
| (JSC::JIT::emit_op_debug): |
| * jit/JITStubs.cpp: |
| (JSC::DEFINE_STUB_FUNCTION): |
| * llint/LLIntSlowPaths.cpp: |
| (JSC::LLInt::LLINT_SLOW_PATH_DECL): |
| * parser/ASTBuilder.h: |
| (ASTBuilder): |
| (JSC::ASTBuilder::createCommaExpr): |
| (JSC::ASTBuilder::createLogicalNot): |
| (JSC::ASTBuilder::createUnaryPlus): |
| (JSC::ASTBuilder::createVoid): |
| (JSC::ASTBuilder::thisExpr): |
| (JSC::ASTBuilder::createResolve): |
| (JSC::ASTBuilder::createObjectLiteral): |
| (JSC::ASTBuilder::createArray): |
| (JSC::ASTBuilder::createNumberExpr): |
| (JSC::ASTBuilder::createString): |
| (JSC::ASTBuilder::createBoolean): |
| (JSC::ASTBuilder::createNull): |
| (JSC::ASTBuilder::createBracketAccess): |
| (JSC::ASTBuilder::createDotAccess): |
| (JSC::ASTBuilder::createRegExp): |
| (JSC::ASTBuilder::createNewExpr): |
| (JSC::ASTBuilder::createConditionalExpr): |
| (JSC::ASTBuilder::createAssignResolve): |
| (JSC::ASTBuilder::createFunctionExpr): |
| (JSC::ASTBuilder::createFunctionBody): |
| (JSC::ASTBuilder::createGetterOrSetterProperty): |
| (JSC::ASTBuilder::createArgumentsList): |
| (JSC::ASTBuilder::createPropertyList): |
| (JSC::ASTBuilder::createFuncDeclStatement): |
| (JSC::ASTBuilder::createBlockStatement): |
| (JSC::ASTBuilder::createExprStatement): |
| (JSC::ASTBuilder::createIfStatement): |
| (JSC::ASTBuilder::createForLoop): |
| (JSC::ASTBuilder::createForInLoop): |
| (JSC::ASTBuilder::createEmptyStatement): |
| (JSC::ASTBuilder::createVarStatement): |
| (JSC::ASTBuilder::createReturnStatement): |
| (JSC::ASTBuilder::createBreakStatement): |
| (JSC::ASTBuilder::createContinueStatement): |
| (JSC::ASTBuilder::createTryStatement): |
| (JSC::ASTBuilder::createSwitchStatement): |
| (JSC::ASTBuilder::createWhileStatement): |
| (JSC::ASTBuilder::createDoWhileStatement): |
| (JSC::ASTBuilder::createLabelStatement): |
| (JSC::ASTBuilder::createWithStatement): |
| (JSC::ASTBuilder::createThrowStatement): |
| (JSC::ASTBuilder::createDebugger): |
| (JSC::ASTBuilder::createConstStatement): |
| (JSC::ASTBuilder::appendConstDecl): |
| (JSC::ASTBuilder::combineCommaNodes): |
| (JSC::ASTBuilder::appendBinaryOperation): |
| (JSC::ASTBuilder::createAssignment): |
| (JSC::ASTBuilder::createNumber): |
| (JSC::ASTBuilder::makeTypeOfNode): |
| (JSC::ASTBuilder::makeDeleteNode): |
| (JSC::ASTBuilder::makeNegateNode): |
| (JSC::ASTBuilder::makeBitwiseNotNode): |
| (JSC::ASTBuilder::makeMultNode): |
| (JSC::ASTBuilder::makeDivNode): |
| (JSC::ASTBuilder::makeModNode): |
| (JSC::ASTBuilder::makeAddNode): |
| (JSC::ASTBuilder::makeSubNode): |
| (JSC::ASTBuilder::makeLeftShiftNode): |
| (JSC::ASTBuilder::makeRightShiftNode): |
| (JSC::ASTBuilder::makeURightShiftNode): |
| (JSC::ASTBuilder::makeBitOrNode): |
| (JSC::ASTBuilder::makeBitAndNode): |
| (JSC::ASTBuilder::makeBitXOrNode): |
| (JSC::ASTBuilder::makeFunctionCallNode): |
| (JSC::ASTBuilder::makeBinaryNode): |
| (JSC::ASTBuilder::makeAssignNode): |
| (JSC::ASTBuilder::makePrefixNode): |
| (JSC::ASTBuilder::makePostfixNode): |
| * parser/Lexer.cpp: |
| (JSC::::setCode): |
| (JSC::::internalShift): |
| (JSC::::shift): |
| (JSC::::lex): |
| * parser/Lexer.h: |
| (Lexer): |
| (JSC::Lexer::currentColumnNumber): |
| (JSC::::lexExpectIdentifier): |
| * parser/NodeConstructors.h: |
| (JSC::Node::Node): |
| (JSC::ExpressionNode::ExpressionNode): |
| (JSC::StatementNode::StatementNode): |
| (JSC::NullNode::NullNode): |
| (JSC::BooleanNode::BooleanNode): |
| (JSC::NumberNode::NumberNode): |
| (JSC::StringNode::StringNode): |
| (JSC::RegExpNode::RegExpNode): |
| (JSC::ThisNode::ThisNode): |
| (JSC::ResolveNode::ResolveNode): |
| (JSC::ArrayNode::ArrayNode): |
| (JSC::PropertyListNode::PropertyListNode): |
| (JSC::ObjectLiteralNode::ObjectLiteralNode): |
| (JSC::BracketAccessorNode::BracketAccessorNode): |
| (JSC::DotAccessorNode::DotAccessorNode): |
| (JSC::ArgumentListNode::ArgumentListNode): |
| (JSC::NewExprNode::NewExprNode): |
| (JSC::EvalFunctionCallNode::EvalFunctionCallNode): |
| (JSC::FunctionCallValueNode::FunctionCallValueNode): |
| (JSC::FunctionCallResolveNode::FunctionCallResolveNode): |
| (JSC::FunctionCallBracketNode::FunctionCallBracketNode): |
| (JSC::FunctionCallDotNode::FunctionCallDotNode): |
| (JSC::CallFunctionCallDotNode::CallFunctionCallDotNode): |
| (JSC::ApplyFunctionCallDotNode::ApplyFunctionCallDotNode): |
| (JSC::PrePostResolveNode::PrePostResolveNode): |
| (JSC::PostfixResolveNode::PostfixResolveNode): |
| (JSC::PostfixBracketNode::PostfixBracketNode): |
| (JSC::PostfixDotNode::PostfixDotNode): |
| (JSC::PostfixErrorNode::PostfixErrorNode): |
| (JSC::DeleteResolveNode::DeleteResolveNode): |
| (JSC::DeleteBracketNode::DeleteBracketNode): |
| (JSC::DeleteDotNode::DeleteDotNode): |
| (JSC::DeleteValueNode::DeleteValueNode): |
| (JSC::VoidNode::VoidNode): |
| (JSC::TypeOfResolveNode::TypeOfResolveNode): |
| (JSC::TypeOfValueNode::TypeOfValueNode): |
| (JSC::PrefixResolveNode::PrefixResolveNode): |
| (JSC::PrefixBracketNode::PrefixBracketNode): |
| (JSC::PrefixDotNode::PrefixDotNode): |
| (JSC::PrefixErrorNode::PrefixErrorNode): |
| (JSC::UnaryOpNode::UnaryOpNode): |
| (JSC::UnaryPlusNode::UnaryPlusNode): |
| (JSC::NegateNode::NegateNode): |
| (JSC::BitwiseNotNode::BitwiseNotNode): |
| (JSC::LogicalNotNode::LogicalNotNode): |
| (JSC::BinaryOpNode::BinaryOpNode): |
| (JSC::MultNode::MultNode): |
| (JSC::DivNode::DivNode): |
| (JSC::ModNode::ModNode): |
| (JSC::AddNode::AddNode): |
| (JSC::SubNode::SubNode): |
| (JSC::LeftShiftNode::LeftShiftNode): |
| (JSC::RightShiftNode::RightShiftNode): |
| (JSC::UnsignedRightShiftNode::UnsignedRightShiftNode): |
| (JSC::LessNode::LessNode): |
| (JSC::GreaterNode::GreaterNode): |
| (JSC::LessEqNode::LessEqNode): |
| (JSC::GreaterEqNode::GreaterEqNode): |
| (JSC::ThrowableBinaryOpNode::ThrowableBinaryOpNode): |
| (JSC::InstanceOfNode::InstanceOfNode): |
| (JSC::InNode::InNode): |
| (JSC::EqualNode::EqualNode): |
| (JSC::NotEqualNode::NotEqualNode): |
| (JSC::StrictEqualNode::StrictEqualNode): |
| (JSC::NotStrictEqualNode::NotStrictEqualNode): |
| (JSC::BitAndNode::BitAndNode): |
| (JSC::BitOrNode::BitOrNode): |
| (JSC::BitXOrNode::BitXOrNode): |
| (JSC::LogicalOpNode::LogicalOpNode): |
| (JSC::ConditionalNode::ConditionalNode): |
| (JSC::ReadModifyResolveNode::ReadModifyResolveNode): |
| (JSC::AssignResolveNode::AssignResolveNode): |
| (JSC::ReadModifyBracketNode::ReadModifyBracketNode): |
| (JSC::AssignBracketNode::AssignBracketNode): |
| (JSC::AssignDotNode::AssignDotNode): |
| (JSC::ReadModifyDotNode::ReadModifyDotNode): |
| (JSC::AssignErrorNode::AssignErrorNode): |
| (JSC::CommaNode::CommaNode): |
| (JSC::ConstStatementNode::ConstStatementNode): |
| (JSC::EmptyStatementNode::EmptyStatementNode): |
| (JSC::DebuggerStatementNode::DebuggerStatementNode): |
| (JSC::ExprStatementNode::ExprStatementNode): |
| (JSC::VarStatementNode::VarStatementNode): |
| (JSC::IfNode::IfNode): |
| (JSC::IfElseNode::IfElseNode): |
| (JSC::DoWhileNode::DoWhileNode): |
| (JSC::WhileNode::WhileNode): |
| (JSC::ForNode::ForNode): |
| (JSC::ContinueNode::ContinueNode): |
| (JSC::BreakNode::BreakNode): |
| (JSC::ReturnNode::ReturnNode): |
| (JSC::WithNode::WithNode): |
| (JSC::LabelNode::LabelNode): |
| (JSC::ThrowNode::ThrowNode): |
| (JSC::TryNode::TryNode): |
| (JSC::FuncExprNode::FuncExprNode): |
| (JSC::FuncDeclNode::FuncDeclNode): |
| (JSC::SwitchNode::SwitchNode): |
| (JSC::ConstDeclNode::ConstDeclNode): |
| (JSC::BlockNode::BlockNode): |
| (JSC::ForInNode::ForInNode): |
| * parser/Nodes.cpp: |
| (JSC::StatementNode::setLoc): |
| (JSC): |
| (JSC::ScopeNode::ScopeNode): |
| (JSC::ProgramNode::ProgramNode): |
| (JSC::ProgramNode::create): |
| (JSC::EvalNode::EvalNode): |
| (JSC::EvalNode::create): |
| (JSC::FunctionBodyNode::FunctionBodyNode): |
| (JSC::FunctionBodyNode::create): |
| * parser/Nodes.h: |
| (Node): |
| (JSC::Node::columnNo): |
| (ExpressionNode): |
| (StatementNode): |
| (JSC::StatementNode::column): |
| (NullNode): |
| (BooleanNode): |
| (NumberNode): |
| (StringNode): |
| (RegExpNode): |
| (ThisNode): |
| (ResolveNode): |
| (ArrayNode): |
| (PropertyListNode): |
| (ObjectLiteralNode): |
| (BracketAccessorNode): |
| (DotAccessorNode): |
| (ArgumentListNode): |
| (NewExprNode): |
| (EvalFunctionCallNode): |
| (FunctionCallValueNode): |
| (FunctionCallResolveNode): |
| (FunctionCallBracketNode): |
| (FunctionCallDotNode): |
| (CallFunctionCallDotNode): |
| (ApplyFunctionCallDotNode): |
| (PrePostResolveNode): |
| (PostfixResolveNode): |
| (PostfixBracketNode): |
| (PostfixDotNode): |
| (PostfixErrorNode): |
| (DeleteResolveNode): |
| (DeleteBracketNode): |
| (DeleteDotNode): |
| (DeleteValueNode): |
| (VoidNode): |
| (TypeOfResolveNode): |
| (TypeOfValueNode): |
| (PrefixResolveNode): |
| (PrefixBracketNode): |
| (PrefixDotNode): |
| (PrefixErrorNode): |
| (UnaryOpNode): |
| (UnaryPlusNode): |
| (NegateNode): |
| (BitwiseNotNode): |
| (LogicalNotNode): |
| (BinaryOpNode): |
| (MultNode): |
| (DivNode): |
| (ModNode): |
| (AddNode): |
| (SubNode): |
| (LeftShiftNode): |
| (RightShiftNode): |
| (UnsignedRightShiftNode): |
| (LessNode): |
| (GreaterNode): |
| (LessEqNode): |
| (GreaterEqNode): |
| (ThrowableBinaryOpNode): |
| (InstanceOfNode): |
| (InNode): |
| (EqualNode): |
| (NotEqualNode): |
| (StrictEqualNode): |
| (NotStrictEqualNode): |
| (BitAndNode): |
| (BitOrNode): |
| (BitXOrNode): |
| (LogicalOpNode): |
| (ConditionalNode): |
| (ReadModifyResolveNode): |
| (AssignResolveNode): |
| (ReadModifyBracketNode): |
| (AssignBracketNode): |
| (AssignDotNode): |
| (ReadModifyDotNode): |
| (AssignErrorNode): |
| (CommaNode): |
| (ConstDeclNode): |
| (ConstStatementNode): |
| (BlockNode): |
| (EmptyStatementNode): |
| (DebuggerStatementNode): |
| (ExprStatementNode): |
| (VarStatementNode): |
| (IfNode): |
| (IfElseNode): |
| (DoWhileNode): |
| (WhileNode): |
| (ForNode): |
| (ForInNode): |
| (ContinueNode): |
| (BreakNode): |
| (ReturnNode): |
| (WithNode): |
| (LabelNode): |
| (ThrowNode): |
| (TryNode): |
| (ScopeNode): |
| (ProgramNode): |
| (EvalNode): |
| (FunctionBodyNode): |
| (FuncExprNode): |
| (FuncDeclNode): |
| (SwitchNode): |
| * parser/Parser.cpp: |
| (JSC::::parseSourceElements): |
| (JSC::::parseVarDeclaration): |
| (JSC::::parseConstDeclaration): |
| (JSC::::parseDoWhileStatement): |
| (JSC::::parseWhileStatement): |
| (JSC::::parseVarDeclarationList): |
| (JSC::::parseConstDeclarationList): |
| (JSC::::parseForStatement): |
| (JSC::::parseBreakStatement): |
| (JSC::::parseContinueStatement): |
| (JSC::::parseReturnStatement): |
| (JSC::::parseThrowStatement): |
| (JSC::::parseWithStatement): |
| (JSC::::parseSwitchStatement): |
| (JSC::::parseTryStatement): |
| (JSC::::parseDebuggerStatement): |
| (JSC::::parseBlockStatement): |
| (JSC::::parseStatement): |
| (JSC::::parseFunctionBody): |
| (JSC::::parseFunctionInfo): |
| (JSC::::parseFunctionDeclaration): |
| (JSC::::parseExpressionOrLabelStatement): |
| (JSC::::parseExpressionStatement): |
| (JSC::::parseIfStatement): |
| (JSC::::parseExpression): |
| (JSC::::parseAssignmentExpression): |
| (JSC::::parseConditionalExpression): |
| (JSC::::parseBinaryExpression): |
| (JSC::::parseProperty): |
| (JSC::::parseObjectLiteral): |
| (JSC::::parseStrictObjectLiteral): |
| (JSC::::parseArrayLiteral): |
| (JSC::::parsePrimaryExpression): |
| (JSC::::parseArguments): |
| (JSC::::parseMemberExpression): |
| (JSC::::parseUnaryExpression): |
| * parser/Parser.h: |
| (JSC::Parser::next): |
| (JSC::Parser::nextExpectIdentifier): |
| (JSC::Parser::tokenStart): |
| (JSC::Parser::tokenLine): |
| (JSC::Parser::tokenEnd): |
| (JSC::Parser::tokenLocation): |
| (Parser): |
| (JSC::Parser::getTokenName): |
| (JSC::::parse): |
| * parser/ParserTokens.h: |
| (JSC::JSTokenLocation::JSTokenLocation): |
| (JSTokenLocation): |
| (JSToken): |
| * parser/SourceProviderCacheItem.h: |
| (JSC::SourceProviderCacheItem::closeBraceToken): |
| * parser/SyntaxChecker.h: |
| (JSC::SyntaxChecker::makeFunctionCallNode): |
| (JSC::SyntaxChecker::createCommaExpr): |
| (JSC::SyntaxChecker::makeAssignNode): |
| (JSC::SyntaxChecker::makePrefixNode): |
| (JSC::SyntaxChecker::makePostfixNode): |
| (JSC::SyntaxChecker::makeTypeOfNode): |
| (JSC::SyntaxChecker::makeDeleteNode): |
| (JSC::SyntaxChecker::makeNegateNode): |
| (JSC::SyntaxChecker::makeBitwiseNotNode): |
| (JSC::SyntaxChecker::createLogicalNot): |
| (JSC::SyntaxChecker::createUnaryPlus): |
| (JSC::SyntaxChecker::createVoid): |
| (JSC::SyntaxChecker::thisExpr): |
| (JSC::SyntaxChecker::createResolve): |
| (JSC::SyntaxChecker::createObjectLiteral): |
| (JSC::SyntaxChecker::createArray): |
| (JSC::SyntaxChecker::createNumberExpr): |
| (JSC::SyntaxChecker::createString): |
| (JSC::SyntaxChecker::createBoolean): |
| (JSC::SyntaxChecker::createNull): |
| (JSC::SyntaxChecker::createBracketAccess): |
| (JSC::SyntaxChecker::createDotAccess): |
| (JSC::SyntaxChecker::createRegExp): |
| (JSC::SyntaxChecker::createNewExpr): |
| (JSC::SyntaxChecker::createConditionalExpr): |
| (JSC::SyntaxChecker::createAssignResolve): |
| (JSC::SyntaxChecker::createFunctionExpr): |
| (JSC::SyntaxChecker::createFunctionBody): |
| (JSC::SyntaxChecker::createArgumentsList): |
| (JSC::SyntaxChecker::createPropertyList): |
| (JSC::SyntaxChecker::createFuncDeclStatement): |
| (JSC::SyntaxChecker::createBlockStatement): |
| (JSC::SyntaxChecker::createExprStatement): |
| (JSC::SyntaxChecker::createIfStatement): |
| (JSC::SyntaxChecker::createForLoop): |
| (JSC::SyntaxChecker::createForInLoop): |
| (JSC::SyntaxChecker::createEmptyStatement): |
| (JSC::SyntaxChecker::createVarStatement): |
| (JSC::SyntaxChecker::createReturnStatement): |
| (JSC::SyntaxChecker::createBreakStatement): |
| (JSC::SyntaxChecker::createContinueStatement): |
| (JSC::SyntaxChecker::createTryStatement): |
| (JSC::SyntaxChecker::createSwitchStatement): |
| (JSC::SyntaxChecker::createWhileStatement): |
| (JSC::SyntaxChecker::createWithStatement): |
| (JSC::SyntaxChecker::createDoWhileStatement): |
| (JSC::SyntaxChecker::createLabelStatement): |
| (JSC::SyntaxChecker::createThrowStatement): |
| (JSC::SyntaxChecker::createDebugger): |
| (JSC::SyntaxChecker::createConstStatement): |
| (JSC::SyntaxChecker::appendConstDecl): |
| (JSC::SyntaxChecker::createGetterOrSetterProperty): |
| (JSC::SyntaxChecker::combineCommaNodes): |
| (JSC::SyntaxChecker::operatorStackPop): |
| |
| 2012-08-01 Filip Pizlo <fpizlo@apple.com> |
| |
| DFG should hoist structure checks |
| https://bugs.webkit.org/show_bug.cgi?id=92696 |
| |
| Reviewed by Gavin Barraclough. |
| |
| This hoists structure checks in the same way that we would hoist array checks, but with added |
| complexity to cope with the fact that the structure of an object may change. This is handled |
| by performing a side effects analysis over the region in which the respective variable is |
| live. If a structure clobbering side effect may happen then we either hoist the structure |
| checks and fall back on structure transition watchpoints (if the watchpoint set is still |
| valid), or we avoid hoisting altogether. |
| |
| Doing this required teaching the CFA that we may have an expectation that an object has a |
| particular structure even after structure clobbering happens, in the sense that structure |
| proofs that were cobbered can be revived using watchpoints. CFA must know about this so that |
| OSR entry may know about it, since we cannot allow entry to happen if the variable has a |
| clobbered structure proof, will have a watchpoint to revive the proof, and the variable in |
| the baseline JIT has a completely unrelated structure. |
| |
| This is mostly performance neutral. |
| |
| * CMakeLists.txt: |
| * GNUmakefile.list.am: |
| * JavaScriptCore.xcodeproj/project.pbxproj: |
| * Target.pri: |
| * bytecode/ValueRecovery.h: |
| (JSC::ValueRecovery::isSet): |
| (JSC::ValueRecovery::operator!): |
| (ValueRecovery): |
| * dfg/DFGAbstractState.cpp: |
| (JSC::DFG::AbstractState::execute): |
| (JSC::DFG::AbstractState::clobberWorld): |
| (DFG): |
| (JSC::DFG::AbstractState::clobberCapturedVars): |
| * dfg/DFGAbstractState.h: |
| (AbstractState): |
| * dfg/DFGAbstractValue.h: |
| (JSC::DFG::AbstractValue::clear): |
| (JSC::DFG::AbstractValue::isClear): |
| (JSC::DFG::AbstractValue::makeTop): |
| (JSC::DFG::AbstractValue::isTop): |
| (JSC::DFG::AbstractValue::set): |
| (JSC::DFG::AbstractValue::operator==): |
| (JSC::DFG::AbstractValue::merge): |
| (JSC::DFG::AbstractValue::filter): |
| (JSC::DFG::AbstractValue::validate): |
| (JSC::DFG::AbstractValue::validateForEntry): |
| (AbstractValue): |
| (JSC::DFG::AbstractValue::checkConsistency): |
| (JSC::DFG::AbstractValue::dump): |
| * dfg/DFGByteCodeParser.cpp: |
| (JSC::DFG::ByteCodeParser::setLocal): |
| (JSC::DFG::ByteCodeParser::getArgument): |
| (JSC::DFG::ByteCodeParser::setArgument): |
| (JSC::DFG::ByteCodeParser::parseBlock): |
| (JSC::DFG::ByteCodeParser::fixVariableAccessSpeculations): |
| * dfg/DFGCSEPhase.cpp: |
| (JSC::DFG::CSEPhase::checkStructureLoadElimination): |
| (JSC::DFG::CSEPhase::structureTransitionWatchpointElimination): |
| (JSC::DFG::CSEPhase::putStructureStoreElimination): |
| (JSC::DFG::CSEPhase::getLocalLoadElimination): |
| (JSC::DFG::CSEPhase::performNodeCSE): |
| * dfg/DFGDriver.cpp: |
| (JSC::DFG::compile): |
| * dfg/DFGGraph.cpp: |
| (JSC::DFG::Graph::dump): |
| * dfg/DFGGraph.h: |
| (JSC::DFG::Graph::vote): |
| (Graph): |
| * dfg/DFGNode.h: |
| (JSC::DFG::Node::convertToStructureTransitionWatchpoint): |
| (Node): |
| (JSC::DFG::Node::hasStructureSet): |
| * dfg/DFGNodeType.h: |
| (DFG): |
| * dfg/DFGOSREntry.cpp: |
| (JSC::DFG::prepareOSREntry): |
| * dfg/DFGPredictionPropagationPhase.cpp: |
| (JSC::DFG::PredictionPropagationPhase::propagate): |
| (PredictionPropagationPhase): |
| (JSC::DFG::PredictionPropagationPhase::doRoundOfDoubleVoting): |
| * dfg/DFGSpeculativeJIT.h: |
| (SpeculativeJIT): |
| (JSC::DFG::SpeculativeJIT::forwardSpeculationCheck): |
| (JSC::DFG::SpeculativeJIT::speculationCheckWithConditionalDirection): |
| (JSC::DFG::SpeculativeJIT::terminateSpeculativeExecutionWithConditionalDirection): |
| (JSC::DFG::SpeculateCellOperand::SpeculateCellOperand): |
| (JSC::DFG::SpeculateCellOperand::gpr): |
| (SpeculateCellOperand): |
| * dfg/DFGSpeculativeJIT32_64.cpp: |
| (JSC::DFG::SpeculativeJIT::fillSpeculateCell): |
| (JSC::DFG::SpeculativeJIT::compile): |
| * dfg/DFGSpeculativeJIT64.cpp: |
| (JSC::DFG::SpeculativeJIT::fillSpeculateCell): |
| (JSC::DFG::SpeculativeJIT::compile): |
| * dfg/DFGStructureCheckHoistingPhase.cpp: Added. |
| (DFG): |
| (StructureCheckHoistingPhase): |
| (JSC::DFG::StructureCheckHoistingPhase::StructureCheckHoistingPhase): |
| (JSC::DFG::StructureCheckHoistingPhase::run): |
| (JSC::DFG::StructureCheckHoistingPhase::noticeStructureCheck): |
| (JSC::DFG::StructureCheckHoistingPhase::noticeClobber): |
| (JSC::DFG::StructureCheckHoistingPhase::clobber): |
| (CheckData): |
| (JSC::DFG::StructureCheckHoistingPhase::CheckData::CheckData): |
| (JSC::DFG::performStructureCheckHoisting): |
| * dfg/DFGStructureCheckHoistingPhase.h: Added. |
| (DFG): |
| * dfg/DFGVariableAccessData.h: |
| (VariableAccessData): |
| (JSC::DFG::VariableAccessData::VariableAccessData): |
| (JSC::DFG::VariableAccessData::mergeStructureCheckHoistingFailed): |
| (JSC::DFG::VariableAccessData::structureCheckHoistingFailed): |
| (JSC::DFG::VariableAccessData::clearVotes): |
| (JSC::DFG::VariableAccessData::vote): |
| (JSC::DFG::VariableAccessData::voteRatio): |
| (JSC::DFG::VariableAccessData::shouldUseDoubleFormatAccordingToVote): |
| * runtime/Options.h: |
| (JSC): |
| |
| 2012-08-01 Filip Pizlo <fpizlo@apple.com> |
| |
| DFG should distinguish between PutByVal's that clobber the world and ones that don't |
| https://bugs.webkit.org/show_bug.cgi?id=92923 |
| |
| Reviewed by Mark Hahnenberg. |
| |
| This is performance-neutral. I also confirmed that it's neutral if we make the |
| clobbering variant (PutByValSafe) clobber all knowledge of what is an array, |
| which should feed nicely into work on removing uses of ClassInfo. |
| |
| * bytecode/DFGExitProfile.h: |
| * dfg/DFGAbstractState.cpp: |
| (JSC::DFG::AbstractState::execute): |
| * dfg/DFGByteCodeParser.cpp: |
| (JSC::DFG::ByteCodeParser::parseBlock): |
| * dfg/DFGCSEPhase.cpp: |
| (JSC::DFG::CSEPhase::getByValLoadElimination): |
| (JSC::DFG::CSEPhase::checkStructureLoadElimination): |
| (JSC::DFG::CSEPhase::structureTransitionWatchpointElimination): |
| (JSC::DFG::CSEPhase::getByOffsetLoadElimination): |
| (JSC::DFG::CSEPhase::putByOffsetStoreElimination): |
| (JSC::DFG::CSEPhase::getPropertyStorageLoadElimination): |
| (JSC::DFG::CSEPhase::getIndexedPropertyStorageLoadElimination): |
| (JSC::DFG::CSEPhase::performNodeCSE): |
| * dfg/DFGFixupPhase.cpp: |
| (JSC::DFG::FixupPhase::fixupNode): |
| * dfg/DFGGraph.h: |
| (JSC::DFG::Graph::byValIsPure): |
| (JSC::DFG::Graph::clobbersWorld): |
| * dfg/DFGNodeType.h: |
| (DFG): |
| * dfg/DFGPredictionPropagationPhase.cpp: |
| (JSC::DFG::PredictionPropagationPhase::propagate): |
| * dfg/DFGSpeculativeJIT32_64.cpp: |
| (JSC::DFG::SpeculativeJIT::compile): |
| * dfg/DFGSpeculativeJIT64.cpp: |
| (JSC::DFG::SpeculativeJIT::compile): |
| |
| 2012-08-01 Jian Li <jianli@chromium.org> |
| |
| Add new CSS property "-webkit-widget-region" to expose dashboard region support for other port |
| https://bugs.webkit.org/show_bug.cgi?id=90298 |
| |
| Reviewed by Adam Barth. |
| |
| * Configurations/FeatureDefines.xcconfig: Add ENABLE_WIDGET_REGION define. |
| |
| 2012-08-01 Patrick Gansterer <paroga@webkit.org> |
| |
| Replace WTF::getCurrentLocalTime() with GregorianDateTime::setToCurrentLocalTime() |
| https://bugs.webkit.org/show_bug.cgi?id=92286 |
| |
| Reviewed by Geoffrey Garen. |
| |
| Add a method to GregorianDateTime to set its values to the current locale time. |
| Replacing all occurrences of getCurrentLocalTime with the new function allows |
| us to remove getCurrentLocalTime in a next step. |
| |
| * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.def: |
| |
| 2012-08-01 Mark Hahnenberg <mhahnenberg@apple.com> |
| |
| C++ code should get ClassInfo from the Structure |
| https://bugs.webkit.org/show_bug.cgi?id=92892 |
| |
| Reviewed by Geoffrey Garen. |
| |
| In our march to remove ClassInfo from our JSCell object headers, we can switch |
| C++ code over to grabbing the ClassInfo from the Structure since it is finally |
| safe to do so now that Structure access is safe during finalization/destruction. |
| The remaining JIT code changes can be done in a separate patch. |
| |
| * heap/MarkedBlock.cpp: |
| (JSC::MarkedBlock::callDestructor): We don't want to clear the Structure any more |
| since the Structure should still be valid at this point. |
| * heap/WeakSetInlines.h: |
| (JSC::WeakBlock::finalize): Ditto. |
| * runtime/JSCell.h: |
| (JSC): |
| * runtime/Structure.h: |
| (JSC::JSCell::classInfo): Move JSCell's classInfo() to Structure.h so it can be |
| inline. Use a different method of getting the JSCell's Structure based on |
| whether we're in GC_VALIDATION mode or not, since always using get() will cause |
| infinite recursion in GC_VALIDATION mode. |
| (JSC): |
| |
| 2012-07-31 Mark Hahnenberg <mhahnenberg@apple.com> |
| |
| MarkedBlock::sweep() should sweep another block if it can't sweep a Structure block |
| https://bugs.webkit.org/show_bug.cgi?id=92819 |
| |
| Reviewed by Geoffrey Garen. |
| |
| If we are forced to allocate a new block for Structures because we are unable to safely |
| sweep our pre-existing Structure blocks, we should sweep another random block so that we |
| can start sweeping Structure blocks sooner. |
| |
| * heap/IncrementalSweeper.cpp: |
| (JSC::IncrementalSweeper::doSweep): Change to use sweepNextBlock. |
| (JSC): |
| (JSC::IncrementalSweeper::sweepNextBlock): |
| * heap/IncrementalSweeper.h: |
| (IncrementalSweeper): |
| * heap/MarkedAllocator.cpp: |
| (JSC::MarkedAllocator::tryAllocateHelper): When we can't safely sweep |
| our Structure blocks, call sweepNextBlock instead. |
| |
| 2012-07-31 Sam Weinig <sam@webkit.org> |
| |
| Fix the Windows build. |
| |
| * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.def: |
| |
| 2012-07-31 Geoffrey Garen <ggaren@apple.com> |
| |
| Maybe fix the GCC build. |
| |
| * heap/HeapBlock.h: |
| (HeapBlock): Accommodate incorrect parsing in GCC. |
| |
| 2012-07-31 Sam Weinig <sam@webkit.org> |
| |
| Stop masking 8 bits off of the visited link hash. We need all the bits! |
| https://bugs.webkit.org/show_bug.cgi?id=92799 |
| |
| Reviewed by Anders Carlsson. |
| |
| * runtime/Identifier.cpp: |
| (JSC::IdentifierCStringTranslator::hash): |
| (JSC::IdentifierLCharFromUCharTranslator::hash): |
| * runtime/Identifier.h: |
| (JSC::IdentifierCharBufferTranslator::hash): |
| Update for new function names. |
| |
| 2012-07-31 Geoffrey Garen <ggaren@apple.com> |
| |
| Maybe break the Windows build. |
| |
| Reviewed by Anders Carlsson. |
| |
| Formally objected to by Sam Weinig. |
| |
| * heap/HeapBlock.h: |
| (HeapBlock): Try to slightly improve this because we don't want Windows to control our lives. |
| |
| 2012-07-30 Mark Hahnenberg <mhahnenberg@apple.com> |
| |
| Structures should be swept after all other objects |
| https://bugs.webkit.org/show_bug.cgi?id=92679 |
| |
| Reviewed by Filip Pizlo. |
| |
| In order to get rid of ClassInfo from our objects, we need to be able to safely get the |
| ClassInfo during the destruction of objects. We'd like to get the ClassInfo out of the |
| Structure, but currently it is not safe to do so because the order of destruction of objects |
| is not guaranteed to sweep objects before their corresponding Structure. We can fix this by |
| sweeping Structures after everything else. |
| |
| * heap/Heap.cpp: |
| (JSC::Heap::isSafeToSweepStructures): Add a function that checks if it is safe to sweep Structures. |
| If the Heap's IncrementalSweeper member is null, that means we're shutting down this VM and it is |
| safe to sweep structures since we'll always do Structures last anyways due to the ordering of |
| MarkedSpace::forEachBlock. |
| (JSC): |
| (JSC::Heap::didStartVMShutdown): Add this intermediate function to the Heap that ~JSGlobalData now |
| calls rather than calling the two HeapTimer objects individually. This allows the Heap to null out |
| these pointers after it has invalidated them to prevent accidental use-after-free in the sweep() |
| calls during lastChanceToFinalize(). |
| * heap/Heap.h: |
| (Heap): |
| * heap/HeapTimer.h: |
| (HeapTimer): |
| * heap/IncrementalSweeper.cpp: |
| (JSC::IncrementalSweeper::structuresCanBeSwept): Determines if it is currently safe to sweep Structures. |
| This decision is based on whether we have gotten to the end of the vector of blocks that need sweeping |
| the first time. |
| (JSC): |
| (JSC::IncrementalSweeper::doSweep): We add a second pass over the vector to sweep Structures after we |
| make our first pass. We now null out the slots as we sweep them so that we can quickly find the |
| Structures during the second pass. |
| (JSC::IncrementalSweeper::startSweeping): Initialize our new Structure sweeping index. |
| (JSC::IncrementalSweeper::willFinishSweeping): Callback that is called by MarkedSpace::sweep to notify |
| the IncrementalSweeper that we are going to sweep all of the remaining blocks in the Heap so it can |
| assume that everything is taken care of in the correct order. Since MarkedSpace::forEachBlock |
| iterates over the Structure blocks after all other blocks, the ordering property for sweeping Structures holds. |
| (JSC::IncrementalSweeper::IncrementalSweeper): Initialize Structure sweeping index. |
| * heap/IncrementalSweeper.h: Add declarations for new stuff. |
| (IncrementalSweeper): |
| * heap/MarkedAllocator.cpp: |
| (JSC::MarkedAllocator::tryAllocateHelper): We now check if the current block only contains structures and |
| if so and it isn't safe to sweep Structures according to the Heap, we just return early instead of doing |
| the normal lazy sweep. If this proves to be too much of a waste in the future we can add an extra clause that |
| will sweep some number of other blocks in place of the current block to mitigate the cost of the floating |
| Structure garbage. |
| (JSC::MarkedAllocator::addBlock): |
| * heap/MarkedAllocator.h: |
| (JSC::MarkedAllocator::zapFreeList): When we zap the free list in the MarkedAllocator, the current block is no |
| longer valid to allocate from, so we set the current block to null. |
| * heap/MarkedBlock.cpp: |
| (JSC::MarkedBlock::sweepHelper): Added a couple assertions to make sure that we weren't trying to sweep Structures |
| at an unsafe time. |
| * heap/MarkedSpace.cpp: |
| (JSC::MarkedSpace::sweep): Notify the IncrementalSweeper that the MarkedSpace will finish all currently remaining sweeping. |
| (JSC): |
| * heap/MarkedSpace.h: |
| (JSC): |
| * runtime/JSGlobalData.cpp: |
| (JSC::JSGlobalData::~JSGlobalData): Call the new Heap::didStartVMShutdown. |
| |
| 2012-07-31 Geoffrey Garen <ggaren@apple.com> |
| |
| Fix all the other builds I just broke. Maybe fix the Windows build. |
| |
| * heap/HeapBlock.h: |
| (HeapBlock): WTF? |
| |
| 2012-07-31 Geoffrey Garen <ggaren@apple.com> |
| |
| Maybe fix the Windows build. |
| |
| * heap/HeapBlock.h: |
| (HeapBlock): WTF? |
| |
| 2012-07-31 Geoffrey Garen <ggaren@apple.com> |
| |
| Maybe fix the Windows build. |
| |
| * heap/HeapBlock.h: |
| (HeapBlock): WTF? |
| |
| 2012-07-31 Geoffrey Garen <ggaren@apple.com> |
| |
| Removed some public data and casting from the Heap |
| https://bugs.webkit.org/show_bug.cgi?id=92777 |
| |
| Reviewed by Oliver Hunt. |
| |
| * heap/BlockAllocator.cpp: |
| (JSC::BlockAllocator::releaseFreeBlocks): |
| (JSC::BlockAllocator::blockFreeingThreadMain): Use the DeadBlock class |
| since HeapBlock is a template, and not a class, now. Call destroy() |
| instead of monkeying around with DeadBlock's internal data because |
| encapsulation is good. |
| |
| * heap/BlockAllocator.h: |
| (DeadBlock): Added a class to represent a dead block, since HeapBlock is |
| a template now, and can't be instantiated directly. |
| |
| (JSC::DeadBlock::DeadBlock): |
| (JSC::DeadBlock::create): |
| (BlockAllocator): |
| (JSC::BlockAllocator::allocate): |
| (JSC::BlockAllocator::deallocate): Use the DeadBlock class because |
| encapsulation is good. |
| |
| * heap/CopiedBlock.h: |
| (CopiedBlock::destroy): No need for a destroy() function, since we |
| inherit one now. |
| |
| (JSC::CopiedBlock::CopiedBlock): |
| (JSC::CopiedBlock::payloadEnd): |
| (JSC::CopiedBlock::capacity): Updated for some encapsulation inside |
| HeapBlock. |
| |
| * heap/CopiedSpace.cpp: |
| (JSC::CopiedSpace::~CopiedSpace): |
| (JSC::CopiedSpace::doneCopying): |
| (JSC::CopiedSpace::size): |
| (JSC::CopiedSpace::capacity): |
| (JSC::isBlockListPagedOut): Removed a bunch of casting. This is no longer |
| necessary, now that our list and its nodes have the right type. |
| |
| * heap/CopiedSpace.h: Use the right type in our data structures because |
| it improves clarity. |
| |
| * heap/CopiedSpaceInlineMethods.h: |
| (JSC::CopiedSpace::startedCopying): Use swap to avoid duplicating it. |
| |
| * heap/HeapBlock.h: |
| (HeapBlock): Made this a class template so we can return the right type |
| in linked list operations. Made our data private because encapsulation |
| is good. |
| |
| (JSC::HeapBlock::destroy): Since we know our type, we can also eliminate |
| duplicate destroy() functions in our subclasses. |
| |
| (JSC::HeapBlock::allocation): Added an accessor so we can hide our data. |
| By using const, this accessor prevents clients from accidentally deleting |
| our allocation. |
| |
| * heap/MarkedAllocator.cpp: |
| (JSC::MarkedAllocator::isPagedOut): |
| (JSC::MarkedAllocator::tryAllocateHelper): |
| (JSC::MarkedAllocator::removeBlock): Removed a bunch of casting. This is |
| no longer necessary, now that our list and its nodes have the right type. |
| |
| * heap/MarkedAllocator.h: |
| (MarkedAllocator): |
| (JSC::MarkedAllocator::reset): |
| (JSC::MarkedAllocator::forEachBlock): Use the right type, do less casting. |
| |
| * heap/MarkedBlock.cpp: |
| (JSC::MarkedBlock::destroy): Removed this function because our parent |
| class provides it for us now. |
| |
| (JSC::MarkedBlock::MarkedBlock): |
| * heap/MarkedBlock.h: |
| (MarkedBlock): |
| (JSC::MarkedBlock::capacity): Updated for encapsulation. |
| |
| 2012-07-31 Filip Pizlo <fpizlo@apple.com> |
| |
| DFG OSR exit profiling has unusual oversights |
| https://bugs.webkit.org/show_bug.cgi?id=92728 |
| |
| Reviewed by Geoffrey Garen. |
| |
| * dfg/DFGOSRExit.cpp: |
| (JSC::DFG::OSRExit::considerAddingAsFrequentExitSiteSlow): |
| * dfg/DFGSpeculativeJIT.h: |
| (JSC::DFG::SpeculativeJIT::speculationWatchpoint): |
| * dfg/DFGSpeculativeJIT32_64.cpp: |
| (JSC::DFG::SpeculativeJIT::compile): |
| * dfg/DFGSpeculativeJIT64.cpp: |
| (JSC::DFG::SpeculativeJIT::compile): |
| |
| 2012-07-31 Chao-ying Fu <fu@mips.com> |
| |
| Add MIPS add32 function |
| https://bugs.webkit.org/show_bug.cgi?id=91522 |
| |
| Reviewed by Oliver Hunt. |
| |
| Add isCompactPtrAlignedAddressOffset. |
| Add a new version of add32 that accepts AbsoluteAddress as inputs. |
| |
| * assembler/MacroAssemblerMIPS.h: |
| (JSC::MacroAssemblerMIPS::isCompactPtrAlignedAddressOffset): New. |
| (MacroAssemblerMIPS): |
| (JSC::MacroAssemblerMIPS::add32): Support AbsoluteAddress as inputs. |
| |
| 2012-07-30 Sheriff Bot <webkit.review.bot@gmail.com> |
| |
| Unreviewed, rolling out r124123. |
| http://trac.webkit.org/changeset/124123 |
| https://bugs.webkit.org/show_bug.cgi?id=92700 |
| |
| ASSERT crashes terminate webkit Layout tests (Requested by |
| msaboff on #webkit). |
| |
| * heap/Heap.cpp: |
| * heap/Heap.h: |
| (Heap): |
| * heap/IncrementalSweeper.cpp: |
| (JSC::IncrementalSweeper::doSweep): |
| (JSC::IncrementalSweeper::startSweeping): |
| (JSC::IncrementalSweeper::IncrementalSweeper): |
| (JSC): |
| * heap/IncrementalSweeper.h: |
| (IncrementalSweeper): |
| * heap/MarkedAllocator.cpp: |
| (JSC::MarkedAllocator::tryAllocateHelper): |
| (JSC::MarkedAllocator::addBlock): |
| * heap/MarkedAllocator.h: |
| (JSC::MarkedAllocator::zapFreeList): |
| * heap/MarkedBlock.cpp: |
| (JSC::MarkedBlock::sweepHelper): |
| * heap/MarkedSpace.cpp: |
| * heap/MarkedSpace.h: |
| (JSC::MarkedSpace::sweep): |
| (JSC): |
| * runtime/JSGlobalData.cpp: |
| (JSC::JSGlobalData::~JSGlobalData): |
| |
| 2012-07-30 Mark Hahnenberg <mhahnenberg@apple.com> |
| |
| Structures should be swept after all other objects |
| https://bugs.webkit.org/show_bug.cgi?id=92679 |
| |
| Reviewed by Filip Pizlo. |
| |
| In order to get rid of ClassInfo from our objects, we need to be able to safely get the |
| ClassInfo during the destruction of objects. We'd like to get the ClassInfo out of the |
| Structure, but currently it is not safe to do so because the order of destruction of objects |
| is not guaranteed to sweep objects before their corresponding Structure. We can fix this by |
| sweeping Structures after everything else. |
| |
| * heap/Heap.cpp: |
| (JSC::Heap::isSafeToSweepStructures): Add a function that checks if it is safe to sweep Structures. |
| If the Heap's IncrementalSweeper member is null, that means we're shutting down this VM and it is |
| safe to sweep structures since we'll always do Structures last anyways due to the ordering of |
| MarkedSpace::forEachBlock. |
| (JSC): |
| (JSC::Heap::didStartVMShutdown): Add this intermediate function to the Heap that ~JSGlobalData now |
| calls rather than calling the two HeapTimer objects individually. This allows the Heap to null out |
| these pointers after it has invalidated them to prevent accidental use-after-free in the sweep() |
| calls during lastChanceToFinalize(). |
| * heap/Heap.h: |
| (Heap): |
| * heap/HeapTimer.h: |
| (HeapTimer): |
| * heap/IncrementalSweeper.cpp: |
| (JSC::IncrementalSweeper::structuresCanBeSwept): Determines if it is currently safe to sweep Structures. |
| This decision is based on whether we have gotten to the end of the vector of blocks that need sweeping |
| the first time. |
| (JSC): |
| (JSC::IncrementalSweeper::doSweep): We add a second pass over the vector to sweep Structures after we |
| make our first pass. We now null out the slots as we sweep them so that we can quickly find the |
| Structures during the second pass. |
| (JSC::IncrementalSweeper::startSweeping): Initialize our new Structure sweeping index. |
| (JSC::IncrementalSweeper::willFinishSweeping): Callback that is called by MarkedSpace::sweep to notify |
| the IncrementalSweeper that we are going to sweep all of the remaining blocks in the Heap so it can |
| assume that everything is taken care of in the correct order. Since MarkedSpace::forEachBlock |
| iterates over the Structure blocks after all other blocks, the ordering property for sweeping Structures holds. |
| (JSC::IncrementalSweeper::IncrementalSweeper): Initialize Structure sweeping index. |
| * heap/IncrementalSweeper.h: Add declarations for new stuff. |
| (IncrementalSweeper): |
| * heap/MarkedAllocator.cpp: |
| (JSC::MarkedAllocator::tryAllocateHelper): We now check if the current block only contains structures and |
| if so and it isn't safe to sweep Structures according to the Heap, we just return early instead of doing |
| the normal lazy sweep. If this proves to be too much of a waste in the future we can add an extra clause that |
| will sweep some number of other blocks in place of the current block to mitigate the cost of the floating |
| Structure garbage. |
| (JSC::MarkedAllocator::addBlock): |
| * heap/MarkedAllocator.h: |
| (JSC::MarkedAllocator::zapFreeList): When we zap the free list in the MarkedAllocator, the current block is no |
| longer valid to allocate from, so we set the current block to null. |
| * heap/MarkedBlock.cpp: |
| (JSC::MarkedBlock::sweepHelper): Added a couple assertions to make sure that we weren't trying to sweep Structures |
| at an unsafe time. |
| * heap/MarkedSpace.cpp: |
| (JSC::MarkedSpace::sweep): Notify the IncrementalSweeper that the MarkedSpace will finish all currently remaining sweeping. |
| (JSC): |
| * heap/MarkedSpace.h: |
| (JSC): |
| * runtime/JSGlobalData.cpp: |
| (JSC::JSGlobalData::~JSGlobalData): Call the new Heap::didStartVMShutdown. |
| |
| 2012-07-29 Filip Pizlo <fpizlo@apple.com> |
| |
| PropertyNameArray::m_shouldCache is only assigned and never used |
| https://bugs.webkit.org/show_bug.cgi?id=92598 |
| |
| Reviewed by Dan Bernstein. |
| |
| * runtime/PropertyNameArray.h: |
| (JSC::PropertyNameArray::PropertyNameArray): |
| (PropertyNameArray): |
| |
| 2012-07-29 Rik Cabanier <cabanier@adobe.com> |
| |
| Add ENABLE_CSS_COMPOSITING flag |
| https://bugs.webkit.org/show_bug.cgi?id=92553 |
| |
| Reviewed by Dirk Schulze. |
| |
| Adds compiler flag CSS_COMPOSITING to build systems to enable CSS blending and compositing. See spec https://dvcs.w3.org/hg/FXTF/rawfile/tip/compositing/index.html |
| |
| * Configurations/FeatureDefines.xcconfig: |
| |
| 2012-07-27 Mark Hahnenberg <mhahnenberg@apple.com> |
| |
| Split functionality of MarkedAllocator::m_currentBlock |
| https://bugs.webkit.org/show_bug.cgi?id=92550 |
| |
| Reviewed by Filip Pizlo. |
| |
| MarkedAllocator::m_currentBlock serves two purposes right now; it indicates the block that is currently |
| being used for allocation and the beginning of the list of blocks that need to be swept. We should split |
| these two functionalities into two separate fields. |
| |
| * heap/MarkedAllocator.cpp: |
| (JSC::MarkedAllocator::tryAllocateHelper): Use m_blocksToSweep instead of m_currentBlock as the |
| initializer/reference of the loop. Only change m_currentBlock when we know what the result will be. |
| (JSC::MarkedAllocator::addBlock): When we add a new block we know that both m_blocksToSweep and |
| m_currentBlock are null. In order to preserve the invariant that m_currentBlock <= m_blocksToSweep, |
| we assign both of them to point to the new block. |
| (JSC::MarkedAllocator::removeBlock): We need a separate check to see if the block we're removing is |
| m_blocksToSweep and if so, advance it to the next block in the list. |
| * heap/MarkedAllocator.h: |
| (MarkedAllocator): Initialize m_blocksToSweep. |
| (JSC::MarkedAllocator::MarkedAllocator): |
| (JSC::MarkedAllocator::reset): We set m_blocksToSweep to be the head of our list. This function is called |
| at the end of a collection, so all of the blocks in our allocator need to be swept. We need to sweep a |
| block before we can start allocating, so m_currentBlock is set to null. We also set the freeList to |
| the empty FreeList to emphasize the fact that we can't start allocating until we do some sweeping. |
| |
| 2012-07-27 Mark Hahnenberg <mhahnenberg@apple.com> |
| |
| Increase inline storage for JSFinalObjects by one |
| https://bugs.webkit.org/show_bug.cgi?id=92526 |
| |
| Reviewed by Geoffrey Garen. |
| |
| Now that we've removed the inheritorID from objects, we can increase our inline storage for JSFinalObjects on |
| 64-bit platforms by 1. |
| |
| * llint/LowLevelInterpreter.asm: Change the constant. |
| * runtime/PropertyOffset.h: Change the constant. |
| (JSC): |
| |
| 2012-07-27 Jer Noble <jer.noble@apple.com> |
| |
| Support a rational time class for use by media elements. |
| https://bugs.webkit.org/show_bug.cgi?id=88787 |
| |
| Re-export WTF::MediaTime from JavaScriptCore. |
| |
| Reviewed by Eric Carlson. |
| |
| * JavaScriptCore.order: |
| * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.def: |
| |
| 2012-07-26 Filip Pizlo <fpizlo@apple.com> |
| |
| JSObject::reallocateStorageIfNecessary is neither used nor defined |
| https://bugs.webkit.org/show_bug.cgi?id=92417 |
| |
| Reviewed by Mark Rowe. |
| |
| * runtime/JSObject.h: |
| (JSObject): |
| |
| 2012-07-26 Mark Hahnenberg <mhahnenberg@apple.com> |
| |
| Allocate Structures in a separate part of the Heap |
| https://bugs.webkit.org/show_bug.cgi?id=92420 |
| |
| Reviewed by Filip Pizlo. |
| |
| To fix our issue with destruction/finalization of Structures before their objects, we can move Structures to a separate |
| part of the Heap that will be swept after all other objects. This first patch will just be separating Structures |
| out into their own separate MarkedAllocator. Everything else will behave identically. |
| |
| * heap/Heap.h: New function to allocate Structures in the Heap. |
| (Heap): |
| (JSC): |
| (JSC::Heap::allocateStructure): |
| * heap/MarkedAllocator.cpp: Pass whether or not we're allocated Structures to the MarkedBlock. |
| (JSC::MarkedAllocator::allocateBlock): |
| * heap/MarkedAllocator.h: Add tracking for whether or not we're allocating only Structures. |
| (JSC::MarkedAllocator::onlyContainsStructures): |
| (MarkedAllocator): |
| (JSC::MarkedAllocator::MarkedAllocator): |
| (JSC::MarkedAllocator::init): |
| * heap/MarkedBlock.cpp: Add tracking for whether or not we're allocating only Structures. We need this to be able to |
| distinguish the various MarkedBlock types in MarkedSpace::allocatorFor(MarkedBlock*). |
| (JSC::MarkedBlock::create): |
| (JSC::MarkedBlock::MarkedBlock): |
| * heap/MarkedBlock.h: |
| (MarkedBlock): |
| (JSC::MarkedBlock::onlyContainsStructures): |
| (JSC): |
| * heap/MarkedSpace.cpp: Include the new Structure allocator in all the places that all the other allocators are used/modified. |
| (JSC::MarkedSpace::MarkedSpace): |
| (JSC::MarkedSpace::resetAllocators): |
| (JSC::MarkedSpace::canonicalizeCellLivenessData): |
| (JSC::MarkedSpace::isPagedOut): |
| * heap/MarkedSpace.h: Add new MarkedAllocator just for Structures. |
| (MarkedSpace): |
| (JSC::MarkedSpace::allocatorFor): |
| (JSC::MarkedSpace::allocateStructure): |
| (JSC): |
| (JSC::MarkedSpace::forEachBlock): |
| * runtime/Structure.h: Move all of the functions that call allocateCell<Structure> down below the explicit template specialization |
| for allocateCell<Structure>. The new inline specialization for allocateCell directly calls the allocateStructure() function in the |
| Heap. |
| (Structure): |
| (JSC::Structure): |
| (JSC): |
| (JSC::Structure::create): |
| (JSC::Structure::createStructure): |
| |
| 2012-07-26 Filip Pizlo <fpizlo@apple.com> |
| |
| JSArray has methods that are neither used nor defined |
| https://bugs.webkit.org/show_bug.cgi?id=92416 |
| |
| Reviewed by Simon Fraser. |
| |
| * runtime/JSArray.h: |
| (JSArray): |
| |
| 2012-07-26 Zoltan Herczeg <zherczeg@webkit.org> |
| |
| [Qt][ARM]ARMAssembler needs buildfix afert r123417 |
| https://bugs.webkit.org/show_bug.cgi?id=92086 |
| |
| Reviewed by Csaba Osztrogonác. |
| |
| The ARM implementation of this should be optimized code path |
| is covered by a non-optimized code path. This patch fixes this, |
| and adds a new function which returns with the offset range. |
| |
| * assembler/ARMAssembler.h: |
| (JSC::ARMAssembler::readPointer): |
| (ARMAssembler): |
| (JSC::ARMAssembler::repatchInt32): |
| (JSC::ARMAssembler::repatchCompact): |
| * assembler/MacroAssemblerARM.h: |
| (MacroAssemblerARM): |
| (JSC::MacroAssemblerARM::isCompactPtrAlignedAddressOffset): |
| (JSC::MacroAssemblerARM::load32WithCompactAddressOffsetPatch): |
| |
| 2012-07-25 Mark Hahnenberg <mhahnenberg@apple.com> |
| |
| Build fix for 32-bit after r123682 |
| |
| * runtime/JSObject.h: Need to pad out JSObjects on 32-bit so that they're the correct size since |
| we only removed one 4-byte word and we need to be 8-byte aligned. |
| (JSObject): |
| |
| 2012-07-25 Filip Pizlo <fpizlo@apple.com> |
| |
| JSC GC object copying APIs should allow for greater flexibility |
| https://bugs.webkit.org/show_bug.cgi?id=92316 |
| |
| Reviewed by Mark Hahnenberg. |
| |
| It's now the case that visitChildren() methods can directly pin and allocate in new space during copying. |
| They can also do the copying and marking themselves. This new API is only used for JSObjects for now. |
| |
| * JavaScriptCore.xcodeproj/project.pbxproj: |
| * heap/MarkStack.cpp: |
| (JSC::SlotVisitor::allocateNewSpaceSlow): |
| (JSC::SlotVisitor::allocateNewSpaceOrPin): |
| (JSC): |
| (JSC::SlotVisitor::copyAndAppend): |
| * heap/MarkStack.h: |
| (MarkStack): |
| (JSC::MarkStack::appendUnbarrieredValue): |
| (JSC): |
| * heap/SlotVisitor.h: |
| * heap/SlotVisitorInlineMethods.h: Added. |
| (JSC): |
| (JSC::SlotVisitor::checkIfShouldCopyAndPinOtherwise): |
| (JSC::SlotVisitor::allocateNewSpace): |
| * runtime/JSObject.cpp: |
| (JSC::JSObject::visitOutOfLineStorage): |
| (JSC): |
| (JSC::JSObject::visitChildren): |
| (JSC::JSFinalObject::visitChildren): |
| * runtime/JSObject.h: |
| (JSObject): |
| |
| 2012-07-25 Mark Hahnenberg <mhahnenberg@apple.com> |
| |
| Remove JSObject::m_inheritorID |
| https://bugs.webkit.org/show_bug.cgi?id=88378 |
| |
| Reviewed by Filip Pizlo. |
| |
| This is rarely used, and not performance critical (the commonly accessed copy is cached on JSFunction), |
| and most objects don't need an inheritorID (this value is only used if the object is used as a prototype). |
| Instead use a private named value in the object's property storage. |
| |
| * dfg/DFGSpeculativeJIT.h: |
| (JSC::DFG::SpeculativeJIT::emitAllocateBasicJSObject): No need m_inheritorID to initialize! |
| * jit/JITInlineMethods.h: |
| (JSC::JIT::emitAllocateBasicJSObject): No need m_inheritorID to initialize! |
| * llint/LowLevelInterpreter.asm: No need m_inheritorID to initialize! |
| * runtime/JSGlobalData.h: |
| (JSGlobalData): Added private name 'm_inheritorIDKey'. |
| * runtime/JSGlobalThis.cpp: |
| (JSC::JSGlobalThis::setUnwrappedObject): resetInheritorID is now passed a JSGlobalData&. |
| * runtime/JSObject.cpp: |
| (JSC::JSObject::visitChildren): No m_inheritorID to be marked. |
| (JSC::JSFinalObject::visitChildren): No m_inheritorID to be marked. |
| (JSC::JSObject::createInheritorID): Store the newly created inheritorID in the property map. Make sure |
| it's got the DontEnum attribute!! |
| * runtime/JSObject.h: |
| (JSObject): |
| (JSC::JSObject::resetInheritorID): Remove the inheritorID from property storage. |
| (JSC): |
| (JSC::JSObject::inheritorID): Read the inheritorID from property storage. |
| |
| 2012-07-25 Caio Marcelo de Oliveira Filho <caio.oliveira@openbossa.org> |
| |
| Create a specialized pair for use in HashMap iterators |
| https://bugs.webkit.org/show_bug.cgi?id=92137 |
| |
| Reviewed by Ryosuke Niwa. |
| |
| Update a couple of sites that relied on the fact that "contents" of iterators were |
| std::pairs. |
| |
| * profiler/Profile.cpp: |
| (JSC): This code kept a vector of the pairs that were the "contents" of the iterators. This |
| is changed to use a KeyValuePair. We make use HashCount's ValueType (which represents only |
| the key) to get the proper key parameter for KeyValuePair. |
| * tools/ProfileTreeNode.h: |
| (ProfileTreeNode): Use HashMap::ValueType to declare the type of the contents of the hash |
| instead of declaring it manually. This will make use of the new KeyValuePair. |
| |
| 2012-07-25 Patrick Gansterer <paroga@webkit.org> |
| |
| REGRESSION(r123505): Date.getYear() returns the same as Date.getFullYear() |
| https://bugs.webkit.org/show_bug.cgi?id=92218 |
| |
| Reviewed by Csaba Osztrogonác. |
| |
| * runtime/DatePrototype.cpp: |
| (JSC::dateProtoFuncGetYear): Added the missing offset of 1900 to the return value. |
| |
| 2012-07-24 Filip Pizlo <fpizlo@apple.com> |
| |
| REGRESSION(r123417): It made tests assert/crash on 32 bit |
| https://bugs.webkit.org/show_bug.cgi?id=92088 |
| |
| Reviewed by Mark Hahnenberg. |
| |
| The pointer arithmetic was wrong, because negative numbers are hard to think about. |
| |
| * dfg/DFGRepatch.cpp: |
| (JSC::DFG::emitPutTransitionStub): |
| * dfg/DFGSpeculativeJIT.cpp: |
| (JSC::DFG::SpeculativeJIT::compileReallocatePropertyStorage): |
| |
| 2012-07-24 Patrick Gansterer <paroga@webkit.org> |
| |
| Store the full year in GregorianDateTime |
| https://bugs.webkit.org/show_bug.cgi?id=92067 |
| |
| Reviewed by Geoffrey Garen. |
| |
| Use the full year instead of the offset from year 1900 |
| for the year member variable of GregorianDateTime. |
| |
| * runtime/DateConstructor.cpp: |
| (JSC::constructDate): |
| (JSC::dateUTC): |
| * runtime/DateConversion.cpp: |
| (JSC::formatDate): |
| (JSC::formatDateUTCVariant): |
| * runtime/DatePrototype.cpp: |
| (JSC::formatLocaleDate): |
| (JSC::fillStructuresUsingDateArgs): |
| (JSC::dateProtoFuncToISOString): |
| (JSC::dateProtoFuncGetFullYear): |
| (JSC::dateProtoFuncGetUTCFullYear): |
| (JSC::dateProtoFuncSetYear): |
| * runtime/JSDateMath.cpp: |
| (JSC::gregorianDateTimeToMS): |
| (JSC::msToGregorianDateTime): |
| |
| 2012-07-24 Patrick Gansterer <paroga@webkit.org> |
| |
| [WIN] Build fix after r123417. |
| |
| * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.def: |
| |
| 2012-07-23 Patrick Gansterer <paroga@webkit.org> |
| |
| Move GregorianDateTime from JSC to WTF namespace |
| https://bugs.webkit.org/show_bug.cgi?id=91948 |
| |
| Reviewed by Geoffrey Garen. |
| |
| Moving GregorianDateTime into the WTF namespace allows us to us to |
| use it in WebCore too. The new class has the same behaviour as the |
| old struct. Only the unused timeZone member has been removed. |
| |
| * runtime/DateConstructor.cpp: |
| * runtime/DateConversion.cpp: |
| * runtime/DateConversion.h: |
| * runtime/DateInstance.h: |
| * runtime/DatePrototype.cpp: |
| * runtime/JSDateMath.cpp: |
| * runtime/JSDateMath.h: |
| |
| 2012-07-23 Filip Pizlo <fpizlo@apple.com> |
| |
| Property storage should grow in reverse address direction, to support butterflies |
| https://bugs.webkit.org/show_bug.cgi?id=91788 |
| |
| Reviewed by Geoffrey Garen. |
| |
| Changes property storage to grow to the left, and changes the property storage pointer to point |
| one 8-byte word (i.e. JSValue) to the right of the first value in the storage. |
| |
| Also improved debug support somewhat, by adding a describe() function to the jsc command-line, |
| and a slow mode of object access in LLInt. |
| |
| * assembler/ARMv7Assembler.h: |
| (JSC::ARMv7Assembler::repatchCompact): |
| * assembler/MacroAssemblerARMv7.h: |
| (MacroAssemblerARMv7): |
| (JSC::MacroAssemblerARMv7::isCompactPtrAlignedAddressOffset): |
| (JSC::MacroAssemblerARMv7::load32WithCompactAddressOffsetPatch): |
| * assembler/MacroAssemblerX86Common.h: |
| (JSC::MacroAssemblerX86Common::isCompactPtrAlignedAddressOffset): |
| (JSC::MacroAssemblerX86Common::repatchCompact): |
| * assembler/X86Assembler.h: |
| (JSC::X86Assembler::repatchCompact): |
| * bytecode/CodeBlock.cpp: |
| (JSC::dumpStructure): |
| * bytecode/GetByIdStatus.h: |
| (JSC::GetByIdStatus::GetByIdStatus): |
| * dfg/DFGOperations.cpp: |
| * dfg/DFGOperations.h: |
| * dfg/DFGRepatch.cpp: |
| (JSC::DFG::tryCacheGetByID): |
| (JSC::DFG::emitPutTransitionStub): |
| * dfg/DFGSpeculativeJIT.cpp: |
| (JSC::DFG::SpeculativeJIT::compileAllocatePropertyStorage): |
| (JSC::DFG::SpeculativeJIT::compileReallocatePropertyStorage): |
| * dfg/DFGSpeculativeJIT.h: |
| (JSC::DFG::SpeculativeJIT::callOperation): |
| * dfg/DFGSpeculativeJIT32_64.cpp: |
| (JSC::DFG::SpeculativeJIT::compile): |
| * dfg/DFGSpeculativeJIT64.cpp: |
| (JSC::DFG::SpeculativeJIT::compile): |
| * heap/ConservativeRoots.cpp: |
| (JSC::ConservativeRoots::genericAddPointer): |
| * heap/CopiedSpace.h: |
| (CopiedSpace): |
| * heap/CopiedSpaceInlineMethods.h: |
| (JSC::CopiedSpace::pinIfNecessary): |
| (JSC): |
| * jit/JITPropertyAccess.cpp: |
| (JSC::JIT::compileGetDirectOffset): |
| * jit/JITPropertyAccess32_64.cpp: |
| (JSC::JIT::compileGetDirectOffset): |
| * jit/JITStubs.cpp: |
| (JSC::JITThunks::tryCacheGetByID): |
| * jsc.cpp: |
| (GlobalObject::finishCreation): |
| (functionDescribe): |
| * llint/LLIntCommon.h: |
| * llint/LLIntSlowPaths.cpp: |
| (JSC::LLInt::LLINT_SLOW_PATH_DECL): |
| * llint/LowLevelInterpreter32_64.asm: |
| * llint/LowLevelInterpreter64.asm: |
| * runtime/JSObject.cpp: |
| (JSC::JSObject::visitChildren): |
| (JSC::JSFinalObject::visitChildren): |
| (JSC::JSObject::growOutOfLineStorage): |
| * runtime/JSObject.h: |
| (JSC::JSObject::getDirectLocation): |
| (JSC::JSObject::offsetForLocation): |
| * runtime/JSValue.h: |
| (JSValue): |
| * runtime/PropertyOffset.h: |
| (JSC::offsetInOutOfLineStorage): |
| |
| 2012-07-23 Filip Pizlo <fpizlo@apple.com> |
| |
| DFG is too aggressive in performing the specific value optimization on loads |
| https://bugs.webkit.org/show_bug.cgi?id=92034 |
| |
| Reviewed by Mark Hahnenberg. |
| |
| This ensures that we don't do optimizations based on a structure having a specific |
| value, if there is no way to detect that the value is despecified. This is the |
| case for dictionaries, since despecifying a value in a dictionary does not lead to |
| a transition and so cannot be caught by either structure checks or structure |
| transition watchpoints. |
| |
| * bytecode/GetByIdStatus.cpp: |
| (JSC::GetByIdStatus::computeFromLLInt): |
| (JSC::GetByIdStatus::computeForChain): |
| (JSC::GetByIdStatus::computeFor): |
| * bytecode/ResolveGlobalStatus.cpp: |
| (JSC::computeForStructure): |
| |
| 2012-07-23 Filip Pizlo <fpizlo@apple.com> |
| |
| REGRESSION(r123169): It made fast/js/dfg-inline-arguments-use-from-uninlined-code.html fail on 32 bit platforms |
| https://bugs.webkit.org/show_bug.cgi?id=92002 |
| |
| Reviewed by Mark Hahnenberg. |
| |
| In the process of changing the nature of local variable typing, I forgot to modify one of the places where |
| we glue the DFG's notion of variable prediction to the runtime's notion of variable tagging. |
| |
| * dfg/DFGSpeculativeJIT.cpp: |
| (JSC::DFG::SpeculativeJIT::compile): |
| |
| 2012-07-23 Simon Fraser <simon.fraser@apple.com> |
| |
| Part 2 of: Implement sticky positioning |
| https://bugs.webkit.org/show_bug.cgi?id=90046 |
| |
| Reviewed by Ojan Vafai. |
| |
| Turn on ENABLE_CSS_STICKY_POSITION. |
| |
| * Configurations/FeatureDefines.xcconfig: |
| |
| 2012-07-23 Patrick Gansterer <paroga@webkit.org> |
| |
| Move JSC::parseDate() from DateConversion to JSDateMath |
| https://bugs.webkit.org/show_bug.cgi?id=91982 |
| |
| Reviewed by Geoffrey Garen. |
| |
| Moveing this function into the other files removes the dependency |
| on JSC spcific classes in DateConversion.{cpp|h}. |
| |
| * runtime/DateConversion.cpp: |
| * runtime/DateConversion.h: |
| (JSC): |
| * runtime/JSDateMath.cpp: |
| (JSC::parseDate): |
| (JSC): |
| * runtime/JSDateMath.h: |
| (JSC): |
| |
| 2012-07-23 Simon Fraser <simon.fraser@apple.com> |
| |
| Part 1 of: Implement sticky positioning |
| https://bugs.webkit.org/show_bug.cgi?id=90046 |
| |
| Reviewed by Ojan Vafai. |
| |
| Add ENABLE_CSS_STICKY_POSITION, defaulting to off initially. |
| |
| Sort the ENABLE_CSS lines in the file. Make sure all the flags |
| are in FEATURE_DEFINES. |
| |
| * Configurations/FeatureDefines.xcconfig: |
| |
| 2012-07-23 Yong Li <yoli@rim.com> |
| |
| [BlackBerry] Implement GCActivityCallback with platform timer |
| https://bugs.webkit.org/show_bug.cgi?id=90175 |
| |
| Reviewed by Rob Buis. |
| |
| Use JSLock when performing GC to avoid assertions. |
| |
| * runtime/GCActivityCallbackBlackBerry.cpp: |
| (JSC::DefaultGCActivityCallback::doWork): |
| |
| 2012-07-23 Kent Tamura <tkent@chromium.org> |
| |
| Rename ENABLE_METER_TAG and ENABLE_PROGRESS_TAG to ENABLE_METER_ELEMENT and ENABLE_PROGRESS_ELEMENT respectively |
| https://bugs.webkit.org/show_bug.cgi?id=91941 |
| |
| Reviewed by Kentaro Hara. |
| |
| A flag name for an elmement should be ENABLE_*_ELEMENT. |
| |
| * Configurations/FeatureDefines.xcconfig: |
| |
| 2012-07-22 Kent Tamura <tkent@chromium.org> |
| |
| Rename ENABLE_DETAILS to ENABLE_DETAILS_ELEMENT |
| https://bugs.webkit.org/show_bug.cgi?id=91928 |
| |
| Reviewed by Kentaro Hara. |
| |
| A flag name for an elmement should be ENABLE_*_ELEMENT. |
| |
| * Configurations/FeatureDefines.xcconfig: |
| |
| 2012-07-21 Patrick Gansterer <paroga@webkit.org> |
| |
| [WIN] Use GetDateFormat and GetTimeFormat instead of strftime |
| https://bugs.webkit.org/show_bug.cgi?id=83436 |
| |
| Reviewed by Brent Fulgham. |
| |
| The MS CRT implementation of strftime calls the same two functions. |
| Using them directly avoids the overhead of parsing the format string and removes |
| the dependency on strftime() for WinCE where this function does not exist. |
| |
| * runtime/DatePrototype.cpp: |
| (JSC::formatLocaleDate): |
| |
| 2012-07-20 Kent Tamura <tkent@chromium.org> |
| |
| Rename ENABLE_DATALIST to ENABLE_DATALIST_ELEMENT |
| https://bugs.webkit.org/show_bug.cgi?id=91846 |
| |
| Reviewed by Kentaro Hara. |
| |
| A flag name for an elmement should be ENABLE_*_ELEMENT. |
| |
| * Configurations/FeatureDefines.xcconfig: |
| |
| 2012-07-20 Han Shen <shenhan@google.com> |
| |
| [Chromium] Compilation fails under gcc 4.7 |
| https://bugs.webkit.org/show_bug.cgi?id=90227 |
| |
| Reviewed by Tony Chang. |
| |
| Disable warnings about c++0x compatibility in gcc newer than 4.6. |
| |
| * JavaScriptCore.gyp/JavaScriptCore.gyp: |
| |
| 2012-07-18 Filip Pizlo <fpizlo@apple.com> |
| |
| DFG cell checks should be hoisted |
| https://bugs.webkit.org/show_bug.cgi?id=91717 |
| |
| Reviewed by Geoffrey Garen. |
| |
| The DFG has always had the policy of hoisting array and integer checks to |
| the point of variable assignment. Eventually, we added doubles and booleans |
| to the mix. But cells should really be part of this as well, particularly |
| for 32-bit where accessing a known-type variable is dramatically cheaper |
| than accessing a variable whose types is only predicted but otherwise |
| unproven. |
| |
| This appears to be a definite speed-up for V8 on 32-bit, a possible speed-up |
| for Kraken, and a possible slow-down for V8 on 64-bit (around 0.2% if at |
| all). Any slow-downs can, and should, be addressed by making the hoisting |
| logic cognizant of variables that are never used in a manner that requires |
| type checks, and by sinking argument checks to the point(s) of first use. |
| |
| To make this work I had to change some OSR machinery, and special-case the |
| type predictions of the 'this' argument for constructors. OSR exit normally |
| assumes that arguments are boxed, which happens to be true because the |
| type prediction used for check hoisting is LUB'd with the type of the |
| argument that was passed in - so either the arguments are always stored to |
| with the full tag+payload, or if only the payload is stored then the tag |
| matches whatever the caller would have set. But not so with the 'this' |
| argument for constructors, which is not initialized by the caller. We |
| could make this more precise by having argument types for OSR be inferred |
| using similar machinery to other locals, but I figured that for this patch |
| I should use the surgical fix. |
| |
| * assembler/MacroAssemblerX86_64.h: |
| (JSC::MacroAssemblerX86_64::branchTestPtr): |
| (MacroAssemblerX86_64): |
| * assembler/X86Assembler.h: |
| (JSC::X86Assembler::testq_rm): |
| (X86Assembler): |
| * dfg/DFGAbstractState.cpp: |
| (JSC::DFG::AbstractState::initialize): |
| (JSC::DFG::AbstractState::execute): |
| * dfg/DFGDriver.cpp: |
| (JSC::DFG::compile): |
| * dfg/DFGGraph.h: |
| (JSC::DFG::Graph::isCreatedThisArgument): |
| (Graph): |
| * dfg/DFGSpeculativeJIT.cpp: |
| (JSC::DFG::SpeculativeJIT::checkArgumentTypes): |
| * dfg/DFGSpeculativeJIT32_64.cpp: |
| (JSC::DFG::SpeculativeJIT::compile): |
| * dfg/DFGSpeculativeJIT64.cpp: |
| (JSC::DFG::SpeculativeJIT::compile): |
| * dfg/DFGValueSource.h: |
| (JSC::DFG::ValueSource::forSpeculation): |
| |
| 2012-07-19 Filip Pizlo <fpizlo@apple.com> |
| |
| Fast path of storage resize should be removed from property storage reallocation, since it is only useful for arrays |
| https://bugs.webkit.org/show_bug.cgi?id=91796 |
| |
| Reviewed by Geoffrey Garen. |
| |
| * dfg/DFGRepatch.cpp: |
| (JSC::DFG::emitPutTransitionStub): |
| * dfg/DFGSpeculativeJIT.cpp: |
| (JSC::DFG::SpeculativeJIT::compileReallocatePropertyStorage): |
| * runtime/JSObject.cpp: |
| (JSC::JSObject::growOutOfLineStorage): |
| |
| 2012-07-19 Mark Lam <mark.lam@apple.com> |
| |
| Bug fixes and enhancements for OfflineASM annotation system. |
| https://bugs.webkit.org/show_bug.cgi?id=91690 |
| |
| Reviewed by Filip Pizlo. |
| |
| * offlineasm/armv7.rb: added default handling of Instruction lower(). |
| * offlineasm/asm.rb: added more support for annotations and more pretty printing. |
| * offlineasm/ast.rb: added more support for annotations. |
| * offlineasm/config.rb: added $preferredCommentStartColumn, simplified $enableInstrAnnotations. |
| * offlineasm/parser.rb: added more support for annotations. |
| * offlineasm/transform.rb: added more support for annotations. |
| * offlineasm/x86.rb: added default handling of Instruction lower(). |
| |
| 2012-07-19 Patrick Gansterer <paroga@webkit.org> |
| |
| [WIN] Fix compilation of JSGlobalData.h with ENABLE(DFG_JIT) |
| https://bugs.webkit.org/show_bug.cgi?id=91243 |
| |
| Reviewed by Geoffrey Garen. |
| |
| Disable MSVC warning 4200 "zero-sized array in struct/union" for JSC::ScratchBuffer. |
| |
| * runtime/JSGlobalData.h: |
| (JSC): |
| |
| 2012-07-19 Mark Lam <mark.lam@apple.com> |
| |
| Fixed broken ENABLE_JIT=0 build. |
| https://bugs.webkit.org/show_bug.cgi?id=91725 |
| |
| Reviewed by Oliver Hunt. |
| |
| * bytecode/Watchpoint.cpp: |
| * heap/JITStubRoutineSet.h: |
| (JSC): |
| (JITStubRoutineSet): |
| (JSC::JITStubRoutineSet::JITStubRoutineSet): |
| (JSC::JITStubRoutineSet::~JITStubRoutineSet): |
| (JSC::JITStubRoutineSet::add): |
| (JSC::JITStubRoutineSet::clearMarks): |
| (JSC::JITStubRoutineSet::mark): |
| (JSC::JITStubRoutineSet::deleteUnmarkedJettisonedStubRoutines): |
| (JSC::JITStubRoutineSet::traceMarkedStubRoutines): |
| |
| 2012-07-19 Kristóf Kosztyó <kkristof@inf.u-szeged.hu> |
| |
| [Qt] Unreviewed buildfix after r123042. |
| |
| * interpreter/Interpreter.cpp: |
| (JSC::Interpreter::dumpRegisters): |
| |
| 2012-07-18 Filip Pizlo <fpizlo@apple.com> |
| |
| DFG should emit inline code for property storage (re)allocation |
| https://bugs.webkit.org/show_bug.cgi?id=91597 |
| |
| Reviewed by Oliver Hunt. |
| |
| This adds two new ops to the DFG IR: AllocatePropertyStorage and |
| ReallocatePropertyStorage. It enables these to interact properly with |
| CSE so that a GetPropertyStorage on something for which we have |
| obviously done a (Re)AllocatePropertyStorage will result in the |
| GetPropertyStorage being eliminated. Other than that, the code |
| emitted for these ops is identical to the code we were emitting in |
| the corresponding PutById stub. |
| |
| * dfg/DFGAbstractState.cpp: |
| (JSC::DFG::AbstractState::execute): |
| * dfg/DFGByteCodeParser.cpp: |
| (JSC::DFG::ByteCodeParser::parseBlock): |
| * dfg/DFGCSEPhase.cpp: |
| (JSC::DFG::CSEPhase::putStructureStoreElimination): |
| (JSC::DFG::CSEPhase::getPropertyStorageLoadElimination): |
| * dfg/DFGNode.h: |
| (JSC::DFG::Node::hasStructureTransitionData): |
| * dfg/DFGNodeType.h: |
| (DFG): |
| * dfg/DFGOperations.cpp: |
| * dfg/DFGOperations.h: |
| * dfg/DFGPredictionPropagationPhase.cpp: |
| (JSC::DFG::PredictionPropagationPhase::propagate): |
| * dfg/DFGSpeculativeJIT.cpp: |
| (JSC::DFG::SpeculativeJIT::compileAllocatePropertyStorage): |
| (DFG): |
| (JSC::DFG::SpeculativeJIT::compileReallocatePropertyStorage): |
| * dfg/DFGSpeculativeJIT.h: |
| (JSC::DFG::SpeculativeJIT::callOperation): |
| (SpeculativeJIT): |
| * dfg/DFGSpeculativeJIT32_64.cpp: |
| (JSC::DFG::SpeculativeJIT::compile): |
| * dfg/DFGSpeculativeJIT64.cpp: |
| (JSC::DFG::SpeculativeJIT::compile): |
| * runtime/Structure.cpp: |
| (JSC::nextOutOfLineStorageCapacity): |
| * runtime/Structure.h: |
| (JSC): |
| |
| 2012-07-16 Oliver Hunt <oliver@apple.com> |
| |
| dumpCallFrame is broken in ToT |
| https://bugs.webkit.org/show_bug.cgi?id=91444 |
| |
| Reviewed by Gavin Barraclough. |
| |
| Various changes have been made to the SF calling convention, but |
| dumpCallFrame has not been updated to reflect these changes. |
| That resulted in both bogus information, as well as numerous |
| assertions of sadness. |
| |
| This patch makes dumpCallFrame actually work again and adds the |
| wonderful feature of telling you the name of the variable that a |
| register reflects, or what value it contains. |
| |
| * bytecode/CodeBlock.cpp: |
| (JSC::CodeBlock::nameForRegister): |
| A really innefficient mechanism for finding the name of a local register. |
| This should only ever be used by debug code so this should be okay. |
| * bytecode/CodeBlock.h: |
| (CodeBlock): |
| * bytecompiler/BytecodeGenerator.cpp: |
| (JSC::BytecodeGenerator::generate): |
| Debug builds no longer throw away a functions symbol table, this allows |
| us to actually perform a register# to name mapping |
| * dfg/DFGJITCompiler.cpp: |
| (JSC::DFG::JITCompiler::link): |
| We weren't propogating the bytecode offset here leading to assertions |
| in debug builds when dumping bytecode of DFG compiled code. |
| * interpreter/Interpreter.cpp: |
| (JSC): |
| (JSC::Interpreter::dumpRegisters): |
| Rework to actually be correct. |
| (JSC::getCallerInfo): |
| Return the byteocde offset as well now, given we have to determine it |
| anyway. |
| (JSC::Interpreter::getStackTrace): |
| (JSC::Interpreter::retrieveCallerFromVMCode): |
| * interpreter/Interpreter.h: |
| (Interpreter): |
| * jsc.cpp: |
| (GlobalObject::finishCreation): |
| (functionDumpCallFrame): |
| Give debug builds of JSC a method for calling dumpCallFrame so we can |
| inspect a callframe without requiring us to break in a debugger. |
| |
| 2012-07-18 Filip Pizlo <fpizlo@apple.com> |
| |
| DFG 32-bit PutById transition stub storage reallocation case copies the first pointer of each JSValue instead of the whole JSValue |
| https://bugs.webkit.org/show_bug.cgi?id=91599 |
| |
| Reviewed by Geoffrey Garen. |
| |
| * dfg/DFGRepatch.cpp: |
| (JSC::DFG::emitPutTransitionStub): |
| |
| 2012-07-17 Filip Pizlo <fpizlo@apple.com> |
| |
| DFG 32-bit PutById transition stub passes the payload/tag arguments to a DFG operation in the wrong order |
| https://bugs.webkit.org/show_bug.cgi?id=91576 |
| |
| Reviewed by Gavin Barraclough. |
| |
| * dfg/DFGRepatch.cpp: |
| (JSC::DFG::emitPutTransitionStub): |
| |
| 2012-07-17 Filip Pizlo <fpizlo@apple.com> |
| |
| [Qt] REGRESSION(r122768, r122771): They broke jquery/data.html and inspector/elements/edit-dom-actions.html |
| https://bugs.webkit.org/show_bug.cgi?id=91476 |
| |
| Reviewed by Mark Hahnenberg. |
| |
| The 32-bit repatching code was not correctly adapted to the new world where there may not always |
| be an available scratch register. Fixed it by ensuring that the scratch register we select does |
| not overlap with the value tag. |
| |
| * dfg/DFGRepatch.cpp: |
| (JSC::DFG::generateProtoChainAccessStub): |
| (JSC::DFG::tryCacheGetByID): |
| (JSC::DFG::tryBuildGetByIDList): |
| (JSC::DFG::emitPutReplaceStub): |
| |
| 2012-07-17 Gabor Rapcsanyi <rgabor@webkit.org> |
| |
| Unreviewed buildfix from Zoltan Herczeg after 122768. |
| |
| * dfg/DFGCCallHelpers.h: |
| (JSC::DFG::CCallHelpers::setupArgumentsWithExecState): |
| (CCallHelpers): |
| |
| 2012-07-17 David Barr <davidbarr@chromium.org> |
| |
| Introduce ENABLE_CSS_IMAGE_ORIENTATION compile flag |
| https://bugs.webkit.org/show_bug.cgi?id=89055 |
| |
| Reviewed by Kent Tamura. |
| |
| The css3-images module is at candidate recommendation. |
| http://www.w3.org/TR/2012/CR-css3-images-20120417/#the-image-orientation |
| |
| Add a configuration option for CSS image-orientation support, disabling it by default. |
| |
| * Configurations/FeatureDefines.xcconfig: |
| |
| 2012-07-16 Filip Pizlo <fpizlo@apple.com> |
| |
| Unreviewed, roll out 122790 because it broke the Windows build. I'm not |
| sure what to do with exported symbols that are predicated on NDEBUG. |
| |
| * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.def: |
| * bytecode/CodeBlock.cpp: |
| (JSC): |
| * bytecode/CodeBlock.h: |
| (CodeBlock): |
| * bytecompiler/BytecodeGenerator.cpp: |
| (JSC::BytecodeGenerator::generate): |
| * dfg/DFGJITCompiler.cpp: |
| (JSC::DFG::JITCompiler::link): |
| * interpreter/Interpreter.cpp: |
| (JSC): |
| (JSC::Interpreter::dumpRegisters): |
| (JSC::getCallerInfo): |
| (JSC::Interpreter::getStackTrace): |
| (JSC::Interpreter::retrieveCallerFromVMCode): |
| * interpreter/Interpreter.h: |
| (Interpreter): |
| * jsc.cpp: |
| (GlobalObject::finishCreation): |
| |
| 2012-07-16 Oliver Hunt <oliver@apple.com> |
| |
| dumpCallFrame is broken in ToT |
| https://bugs.webkit.org/show_bug.cgi?id=91444 |
| |
| Reviewed by Gavin Barraclough. |
| |
| Various changes have been made to the SF calling convention, but |
| dumpCallFrame has not been updated to reflect these changes. |
| That resulted in both bogus information, as well as numerous |
| assertions of sadness. |
| |
| This patch makes dumpCallFrame actually work again and adds the |
| wonderful feature of telling you the name of the variable that a |
| register reflects, or what value it contains. |
| |
| * bytecode/CodeBlock.cpp: |
| (JSC::CodeBlock::nameForRegister): |
| A really innefficient mechanism for finding the name of a local register. |
| This should only ever be used by debug code so this should be okay. |
| * bytecode/CodeBlock.h: |
| (CodeBlock): |
| * bytecompiler/BytecodeGenerator.cpp: |
| (JSC::BytecodeGenerator::generate): |
| Debug builds no longer throw away a functions symbol table, this allows |
| us to actually perform a register# to name mapping |
| * dfg/DFGJITCompiler.cpp: |
| (JSC::DFG::JITCompiler::link): |
| We weren't propogating the bytecode offset here leading to assertions |
| in debug builds when dumping bytecode of DFG compiled code. |
| * interpreter/Interpreter.cpp: |
| (JSC): |
| (JSC::Interpreter::dumpRegisters): |
| Rework to actually be correct. |
| (JSC::getCallerInfo): |
| Return the byteocde offset as well now, given we have to determine it |
| anyway. |
| (JSC::Interpreter::getStackTrace): |
| (JSC::Interpreter::retrieveCallerFromVMCode): |
| * interpreter/Interpreter.h: |
| (Interpreter): |
| * jsc.cpp: |
| (GlobalObject::finishCreation): |
| (functionDumpCallFrame): |
| Give debug builds of JSC a method for calling dumpCallFrame so we can |
| inspect a callframe without requiring us to break in a debugger. |
| |
| 2012-07-16 Filip Pizlo <fpizlo@apple.com> |
| |
| Unreviewed, adding forgotten files. |
| |
| * dfg/DFGRegisterSet.h: Added. |
| (DFG): |
| (RegisterSet): |
| (JSC::DFG::RegisterSet::RegisterSet): |
| (JSC::DFG::RegisterSet::asPOD): |
| (JSC::DFG::RegisterSet::copyInfo): |
| (JSC::DFG::RegisterSet::set): |
| (JSC::DFG::RegisterSet::setGPRByIndex): |
| (JSC::DFG::RegisterSet::clear): |
| (JSC::DFG::RegisterSet::get): |
| (JSC::DFG::RegisterSet::getGPRByIndex): |
| (JSC::DFG::RegisterSet::getFreeGPR): |
| (JSC::DFG::RegisterSet::setFPRByIndex): |
| (JSC::DFG::RegisterSet::getFPRByIndex): |
| (JSC::DFG::RegisterSet::setByIndex): |
| (JSC::DFG::RegisterSet::getByIndex): |
| (JSC::DFG::RegisterSet::numberOfSetGPRs): |
| (JSC::DFG::RegisterSet::numberOfSetFPRs): |
| (JSC::DFG::RegisterSet::numberOfSetRegisters): |
| (JSC::DFG::RegisterSet::setBit): |
| (JSC::DFG::RegisterSet::clearBit): |
| (JSC::DFG::RegisterSet::getBit): |
| * dfg/DFGScratchRegisterAllocator.h: Added. |
| (DFG): |
| (ScratchRegisterAllocator): |
| (JSC::DFG::ScratchRegisterAllocator::ScratchRegisterAllocator): |
| (JSC::DFG::ScratchRegisterAllocator::lock): |
| (JSC::DFG::ScratchRegisterAllocator::allocateScratch): |
| (JSC::DFG::ScratchRegisterAllocator::allocateScratchGPR): |
| (JSC::DFG::ScratchRegisterAllocator::allocateScratchFPR): |
| (JSC::DFG::ScratchRegisterAllocator::didReuseRegisters): |
| (JSC::DFG::ScratchRegisterAllocator::preserveReusedRegistersByPushing): |
| (JSC::DFG::ScratchRegisterAllocator::restoreReusedRegistersByPopping): |
| (JSC::DFG::ScratchRegisterAllocator::desiredScratchBufferSize): |
| (JSC::DFG::ScratchRegisterAllocator::preserveUsedRegistersToScratchBuffer): |
| (JSC::DFG::ScratchRegisterAllocator::restoreUsedRegistersFromScratchBuffer): |
| |
| 2012-07-15 Filip Pizlo <fpizlo@apple.com> |
| |
| DFG PutById transition should handle storage allocation, and inline it |
| https://bugs.webkit.org/show_bug.cgi?id=91337 |
| |
| Reviewed by Oliver Hunt. |
| |
| This enables the patching of DFG PutById to handle the out-of-line storage |
| allocation case. Furthermore, it inlines out-of-line storage allocation (and |
| reallocation) into the generated stubs. |
| |
| To do this, this patch adds the ability to store the relevant register |
| allocation state (i.e. the set of in-use registers) in the structure stub |
| info so that the stub generation code can more flexibly select scratch |
| registers: sometimes it needs none, sometimes one - or sometimes up to |
| three. Moreover, to make the stub generation register allocation simple and |
| maintainable, this patch introduces a reusable scratch register allocator |
| class. This register allocator understands that some registers are in use by |
| the main path code and so must be spilled as necessary, other registers are |
| locked for use in the stub itself and so cannot even be spilled, while still |
| others may be allocated for scratch purposes. A scratch register that is |
| used must be spilled. If a register is locked, it cannot be used as a |
| scratch register. If a register is used, it can be used as a scratch |
| register so long as it is spilled. |
| |
| This is a sub-1% speed-up on V8 and neutral elsewhere. |
| |
| * GNUmakefile.list.am: |
| * JavaScriptCore.xcodeproj/project.pbxproj: |
| * assembler/MacroAssemblerCodeRef.h: |
| (FunctionPtr): |
| (JSC::FunctionPtr::FunctionPtr): |
| * bytecode/StructureStubInfo.h: |
| * dfg/DFGCCallHelpers.h: |
| (JSC::DFG::CCallHelpers::setupArgumentsWithExecState): |
| (CCallHelpers): |
| * dfg/DFGGPRInfo.h: |
| * dfg/DFGJITCompiler.cpp: |
| (JSC::DFG::JITCompiler::link): |
| * dfg/DFGJITCompiler.h: |
| (JSC::DFG::PropertyAccessRecord::PropertyAccessRecord): |
| (PropertyAccessRecord): |
| * dfg/DFGOperations.cpp: |
| * dfg/DFGOperations.h: |
| * dfg/DFGRegisterBank.h: |
| (JSC::DFG::RegisterBank::isInUse): |
| (RegisterBank): |
| * dfg/DFGRegisterSet.h: Added. |
| (DFG): |
| (RegisterSet): |
| (JSC::DFG::RegisterSet::RegisterSet): |
| (JSC::DFG::RegisterSet::asPOD): |
| (JSC::DFG::RegisterSet::copyInfo): |
| (JSC::DFG::RegisterSet::set): |
| (JSC::DFG::RegisterSet::setGPRByIndex): |
| (JSC::DFG::RegisterSet::clear): |
| (JSC::DFG::RegisterSet::get): |
| (JSC::DFG::RegisterSet::getGPRByIndex): |
| (JSC::DFG::RegisterSet::getFreeGPR): |
| (JSC::DFG::RegisterSet::setFPRByIndex): |
| (JSC::DFG::RegisterSet::getFPRByIndex): |
| (JSC::DFG::RegisterSet::setByIndex): |
| (JSC::DFG::RegisterSet::getByIndex): |
| (JSC::DFG::RegisterSet::numberOfSetGPRs): |
| (JSC::DFG::RegisterSet::numberOfSetFPRs): |
| (JSC::DFG::RegisterSet::numberOfSetRegisters): |
| (JSC::DFG::RegisterSet::setBit): |
| (JSC::DFG::RegisterSet::clearBit): |
| (JSC::DFG::RegisterSet::getBit): |
| * dfg/DFGRepatch.cpp: |
| (JSC::DFG::generateProtoChainAccessStub): |
| (JSC::DFG::tryCacheGetByID): |
| (JSC::DFG::tryBuildGetByIDList): |
| (JSC::DFG::emitPutReplaceStub): |
| (JSC::DFG::emitPutTransitionStub): |
| (JSC::DFG::tryCachePutByID): |
| (JSC::DFG::tryBuildPutByIdList): |
| * dfg/DFGScratchRegisterAllocator.h: Added. |
| (DFG): |
| (ScratchRegisterAllocator): |
| (JSC::DFG::ScratchRegisterAllocator::ScratchRegisterAllocator): |
| (JSC::DFG::ScratchRegisterAllocator::lock): |
| (JSC::DFG::ScratchRegisterAllocator::allocateScratch): |
| (JSC::DFG::ScratchRegisterAllocator::allocateScratchGPR): |
| (JSC::DFG::ScratchRegisterAllocator::allocateScratchFPR): |
| (JSC::DFG::ScratchRegisterAllocator::didReuseRegisters): |
| (JSC::DFG::ScratchRegisterAllocator::preserveReusedRegistersByPushing): |
| (JSC::DFG::ScratchRegisterAllocator::restoreReusedRegistersByPopping): |
| (JSC::DFG::ScratchRegisterAllocator::desiredScratchBufferSize): |
| (JSC::DFG::ScratchRegisterAllocator::preserveUsedRegistersToScratchBuffer): |
| (JSC::DFG::ScratchRegisterAllocator::restoreUsedRegistersFromScratchBuffer): |
| * dfg/DFGSpeculativeJIT.h: |
| (SpeculativeJIT): |
| (JSC::DFG::SpeculativeJIT::usedRegisters): |
| * dfg/DFGSpeculativeJIT32_64.cpp: |
| (JSC::DFG::SpeculativeJIT::cachedGetById): |
| (JSC::DFG::SpeculativeJIT::cachedPutById): |
| (JSC::DFG::SpeculativeJIT::compile): |
| * dfg/DFGSpeculativeJIT64.cpp: |
| (JSC::DFG::SpeculativeJIT::cachedGetById): |
| (JSC::DFG::SpeculativeJIT::cachedPutById): |
| (JSC::DFG::SpeculativeJIT::compile): |
| * heap/CopiedAllocator.h: |
| (CopiedAllocator): |
| (JSC::CopiedAllocator::fastPathShouldSucceed): |
| (JSC): |
| |
| 2012-07-16 Patrick Gansterer <paroga@webkit.org> |
| |
| Add dfg switch to create_jit_stubs script |
| https://bugs.webkit.org/show_bug.cgi?id=91256 |
| |
| Reviewed by Geoffrey Garen. |
| |
| * create_jit_stubs: Add a switch to enable or disable the generation of |
| stub functions in #if ENABLE(DFG_JIT) conditions. |
| |
| 2012-07-16 Gabor Rapcsanyi <rgabor@webkit.org> |
| |
| Unreviewed buildfix after r122729. Typo fix. |
| |
| * assembler/MacroAssemblerARM.h: |
| (JSC::MacroAssemblerARM::add32): |
| |
| 2012-07-16 Gabor Rapcsanyi <rgabor@webkit.org> |
| |
| Unreviewed buildfix from Zoltan Herczeg after r122677. |
| Implement missing add32 function to MacroAssemblerARM. |
| |
| * assembler/MacroAssemblerARM.h: |
| (JSC::MacroAssemblerARM::add32): |
| (MacroAssemblerARM): |
| |
| 2012-07-14 Filip Pizlo <fpizlo@apple.com> |
| |
| DFG PutByVal opcodes should accept more than 3 operands |
| https://bugs.webkit.org/show_bug.cgi?id=91332 |
| |
| Reviewed by Oliver Hunt. |
| |
| Turned PutByVal/PutByValAlias into var-arg nodes, so that we can give them |
| 4 or more operands in the future. |
| |
| * dfg/DFGAbstractState.cpp: |
| (JSC::DFG::AbstractState::execute): |
| * dfg/DFGByteCodeParser.cpp: |
| (JSC::DFG::ByteCodeParser::parseBlock): |
| * dfg/DFGCSEPhase.cpp: |
| (JSC::DFG::CSEPhase::getByValLoadElimination): |
| (JSC::DFG::CSEPhase::getIndexedPropertyStorageLoadElimination): |
| (JSC::DFG::CSEPhase::performNodeCSE): |
| * dfg/DFGFixupPhase.cpp: |
| (JSC::DFG::FixupPhase::fixupNode): |
| (JSC::DFG::FixupPhase::fixDoubleEdge): |
| * dfg/DFGGraph.h: |
| (JSC::DFG::Graph::byValIsPure): |
| (JSC::DFG::Graph::varArgNumChildren): |
| (Graph): |
| (JSC::DFG::Graph::numChildren): |
| (JSC::DFG::Graph::varArgChild): |
| (JSC::DFG::Graph::child): |
| * dfg/DFGNodeType.h: |
| (DFG): |
| * dfg/DFGPredictionPropagationPhase.cpp: |
| (JSC::DFG::PredictionPropagationPhase::propagate): |
| * dfg/DFGSpeculativeJIT.cpp: |
| (JSC::DFG::SpeculativeJIT::compilePutByValForIntTypedArray): |
| (JSC::DFG::SpeculativeJIT::compilePutByValForFloatTypedArray): |
| * dfg/DFGSpeculativeJIT32_64.cpp: |
| (JSC::DFG::SpeculativeJIT::compile): |
| * dfg/DFGSpeculativeJIT64.cpp: |
| (JSC::DFG::SpeculativeJIT::compile): |
| |
| 2012-07-14 Filip Pizlo <fpizlo@apple.com> |
| |
| Rationalize and optimize storage allocation |
| https://bugs.webkit.org/show_bug.cgi?id=91303 |
| |
| Reviewed by Oliver Hunt. |
| |
| This implements a backwards bump allocator for copied space storage |
| allocation, shown in pseudo-code below: |
| |
| pointer bump(size) { |
| pointer tmp = allocator->remaining; |
| tmp -= size; |
| if (tmp < 0) |
| fail; |
| allocator->remaining = tmp; |
| return allocator->payloadEnd - tmp - size; |
| } |
| |
| The advantage of this allocator is that it: |
| |
| - Only requires one comparison in the common case where size is known to |
| not be huge, and this comparison can be done by checking the sign bit |
| of the subtraction. |
| |
| - Can be implemented even when only one register is available. This |
| register is reused for both temporary storage during allocation and |
| for the result. |
| |
| - Preserves the behavior that memory in a block is filled in from lowest |
| address to highest address, which allows for a cheap reallocation fast |
| path. |
| |
| - Is resilient against the block used for allocation being the last one |
| in virtual memory, thereby otherwise leading to the risk of overflow |
| in the bump pointer, despite only doing one branch. |
| |
| In order to implement this allocator using the smallest possible chunk |
| of code, I refactored the copied space code so that all of the allocation |
| logic is in CopiedAllocator, and all of the state is in either |
| CopiedBlock or CopiedAllocator. This should make changing the allocation |
| fast path easier in the future. |
| |
| In order to do this, I needed to add some new assembler support, |
| particularly for various forms of add(address, register) and negPtr(). |
| |
| This is performance neutral. The purpose of this change is to facilitate |
| further inlining of storage allocation without having to reserve |
| additional registers or emit too much code. |
| |
| * assembler/MacroAssembler.h: |
| (JSC::MacroAssembler::addPtr): |
| (MacroAssembler): |
| (JSC::MacroAssembler::negPtr): |
| * assembler/MacroAssemblerARMv7.h: |
| (MacroAssemblerARMv7): |
| (JSC::MacroAssemblerARMv7::add32): |
| * assembler/MacroAssemblerX86.h: |
| (JSC::MacroAssemblerX86::add32): |
| (MacroAssemblerX86): |
| * assembler/MacroAssemblerX86_64.h: |
| (MacroAssemblerX86_64): |
| (JSC::MacroAssemblerX86_64::addPtr): |
| (JSC::MacroAssemblerX86_64::negPtr): |
| * assembler/X86Assembler.h: |
| (X86Assembler): |
| (JSC::X86Assembler::addl_mr): |
| (JSC::X86Assembler::addq_mr): |
| (JSC::X86Assembler::negq_r): |
| * heap/CopiedAllocator.h: |
| (CopiedAllocator): |
| (JSC::CopiedAllocator::isValid): |
| (JSC::CopiedAllocator::CopiedAllocator): |
| (JSC::CopiedAllocator::tryAllocate): |
| (JSC): |
| (JSC::CopiedAllocator::tryReallocate): |
| (JSC::CopiedAllocator::forceAllocate): |
| (JSC::CopiedAllocator::resetCurrentBlock): |
| (JSC::CopiedAllocator::setCurrentBlock): |
| (JSC::CopiedAllocator::currentCapacity): |
| * heap/CopiedBlock.h: |
| (CopiedBlock): |
| (JSC::CopiedBlock::create): |
| (JSC::CopiedBlock::zeroFillWilderness): |
| (JSC::CopiedBlock::CopiedBlock): |
| (JSC::CopiedBlock::payloadEnd): |
| (JSC): |
| (JSC::CopiedBlock::payloadCapacity): |
| (JSC::CopiedBlock::data): |
| (JSC::CopiedBlock::dataEnd): |
| (JSC::CopiedBlock::dataSize): |
| (JSC::CopiedBlock::wilderness): |
| (JSC::CopiedBlock::wildernessEnd): |
| (JSC::CopiedBlock::wildernessSize): |
| (JSC::CopiedBlock::size): |
| * heap/CopiedSpace.cpp: |
| (JSC::CopiedSpace::tryAllocateSlowCase): |
| (JSC::CopiedSpace::tryAllocateOversize): |
| (JSC::CopiedSpace::tryReallocate): |
| (JSC::CopiedSpace::doneFillingBlock): |
| (JSC::CopiedSpace::doneCopying): |
| * heap/CopiedSpace.h: |
| (CopiedSpace): |
| * heap/CopiedSpaceInlineMethods.h: |
| (JSC::CopiedSpace::startedCopying): |
| (JSC::CopiedSpace::allocateBlockForCopyingPhase): |
| (JSC::CopiedSpace::allocateBlock): |
| (JSC::CopiedSpace::tryAllocate): |
| (JSC): |
| * heap/MarkStack.cpp: |
| (JSC::SlotVisitor::startCopying): |
| (JSC::SlotVisitor::allocateNewSpace): |
| (JSC::SlotVisitor::doneCopying): |
| * heap/SlotVisitor.h: |
| (JSC::SlotVisitor::SlotVisitor): |
| * jit/JIT.h: |
| * jit/JITInlineMethods.h: |
| (JSC::JIT::emitAllocateBasicStorage): |
| (JSC::JIT::emitAllocateJSArray): |
| |
| 2012-07-13 Mark Lam <mark.lam@apple.com> |
| |
| OfflineASM Pretty printing and commenting enhancements. |
| https://bugs.webkit.org/show_bug.cgi?id=91281 |
| |
| Reviewed by Filip Pizlo. |
| |
| Added some minor pretty printing in the OfflineASM. |
| Also added infrastruture for adding multiple types of comments and |
| annotations with the ability to enable/disable them in the generated |
| output as desired. |
| |
| * GNUmakefile.list.am: add new file config.rb. |
| * llint/LLIntOfflineAsmConfig.h: |
| Added OFFLINE_ASM_BEGIN, OFFLINE_ASM_END, and OFFLINE_ASM_LOCAL_LABEL macros. |
| This will allow us to redefine these for other backends later. |
| * llint/LowLevelInterpreter32_64.asm: |
| Add a small example of instruction annotations for now. |
| * llint/LowLevelInterpreter64.asm: |
| Add a small example of instruction annotations for now. |
| * offlineasm/armv7.rb: Added handling of annotations. |
| * offlineasm/asm.rb: |
| Added machinery to dump the new comments and annotations. |
| Also added some indentations to make the output a little prettier. |
| * offlineasm/ast.rb: Added annotation field in class Instruction. |
| * offlineasm/backends.rb: |
| * offlineasm/config.rb: Added. |
| Currently only contains commenting options. This file is meant to be |
| a centralized place for build config values much like config.h for |
| JavaScriptCore. |
| * offlineasm/generate_offset_extractor.rb: |
| * offlineasm/instructions.rb: |
| * offlineasm/offsets.rb: |
| * offlineasm/opt.rb: |
| * offlineasm/parser.rb: Parse and record annotations. |
| * offlineasm/registers.rb: |
| * offlineasm/self_hash.rb: |
| * offlineasm/settings.rb: |
| * offlineasm/transform.rb: |
| * offlineasm/x86.rb: Added handling of annotations. |
| |
| 2012-07-13 Filip Pizlo <fpizlo@apple.com> |
| |
| ASSERTION FAILED: use.useKind() != DoubleUse |
| https://bugs.webkit.org/show_bug.cgi?id=91082 |
| |
| Reviewed by Geoffrey Garen. |
| |
| The implementation of Branch() was unwisely relying on register allocation state |
| to decide what speculations to perform. That's never correct. |
| |
| * dfg/DFGSpeculativeJIT32_64.cpp: |
| (JSC::DFG::SpeculativeJIT::compile): |
| * dfg/DFGSpeculativeJIT64.cpp: |
| (JSC::DFG::SpeculativeJIT::compile): |
| |
| 2012-07-13 Sheriff Bot <webkit.review.bot@gmail.com> |
| |
| Unreviewed, rolling out r122640. |
| http://trac.webkit.org/changeset/122640 |
| https://bugs.webkit.org/show_bug.cgi?id=91298 |
| |
| LLInt apparently does not expect to mark these (Requested by |
| olliej on #webkit). |
| |
| * bytecode/CodeBlock.cpp: |
| (JSC::CodeBlock::visitStructures): |
| (JSC::CodeBlock::stronglyVisitStrongReferences): |
| |
| 2012-07-13 Oliver Hunt <oliver@apple.com> |
| |
| LLInt fails to mark structures stored in the bytecode |
| https://bugs.webkit.org/show_bug.cgi?id=91296 |
| |
| Reviewed by Geoffrey Garen. |
| |
| LLInt stores structures in the bytecode, so we need to visit the appropriate |
| instructions as we would if we were running in the classic interpreter. |
| This requires adding additional checks for the LLInt specific opcodes, and |
| the lint specific variants of operand ordering. |
| |
| * bytecode/CodeBlock.cpp: |
| (JSC::CodeBlock::visitStructures): |
| (JSC::CodeBlock::stronglyVisitStrongReferences): |
| |
| 2012-07-13 Yong Li <yoli@rim.com> |
| |
| [BlackBerry] Implement GCActivityCallback with platform timer |
| https://bugs.webkit.org/show_bug.cgi?id=90175 |
| |
| Reviewed by Rob Buis. |
| |
| Implement GCActivityCallback and HeapTimer for BlackBerry port. |
| |
| * heap/HeapTimer.cpp: |
| (JSC): |
| (JSC::HeapTimer::HeapTimer): |
| (JSC::HeapTimer::~HeapTimer): |
| (JSC::HeapTimer::timerDidFire): |
| (JSC::HeapTimer::synchronize): |
| (JSC::HeapTimer::invalidate): |
| (JSC::HeapTimer::didStartVMShutdown): |
| * heap/HeapTimer.h: |
| (HeapTimer): |
| * runtime/GCActivityCallbackBlackBerry.cpp: |
| (JSC): |
| (JSC::DefaultGCActivityCallback::doWork): |
| (JSC::DefaultGCActivityCallback::didAllocate): |
| (JSC::DefaultGCActivityCallback::willCollect): |
| (JSC::DefaultGCActivityCallback::cancel): |
| |
| 2012-07-13 Patrick Gansterer <paroga@webkit.org> |
| |
| [WIN] Fix compilation of DFGRepatch.cpp |
| https://bugs.webkit.org/show_bug.cgi?id=91241 |
| |
| Reviewed by Geoffrey Garen. |
| |
| Use intptr_t instead of uintptr_t when calling CodeLocationCommon::dataLabelPtrAtOffset(int) |
| to fix MSVC "unary minus operator applied to unsigned type, result still unsigned" warning. |
| |
| * dfg/DFGRepatch.cpp: |
| (JSC::DFG::dfgResetGetByID): |
| (JSC::DFG::dfgResetPutByID): |
| |
| 2012-07-13 Patrick Gansterer <paroga@webkit.org> |
| |
| Fix ARM_TRADITIONAL JIT for COMPILER(MSVC) and COMPILER(RVCT) after r121885 |
| https://bugs.webkit.org/show_bug.cgi?id=91238 |
| |
| Reviewed by Zoltan Herczeg. |
| |
| r121885 changed the assembler instruction only for COMPILER(GCC). |
| Use the same instructions for the other compilers too. |
| |
| * jit/JITStubs.cpp: |
| (JSC::ctiTrampoline): |
| (JSC::ctiTrampolineEnd): |
| (JSC::ctiVMThrowTrampoline): |
| |
| 2012-07-12 Filip Pizlo <fpizlo@apple.com> |
| |
| DFG property access stubs should use structure transition watchpoints |
| https://bugs.webkit.org/show_bug.cgi?id=91135 |
| |
| Reviewed by Geoffrey Garen. |
| |
| This adds a Watchpoint subclass that will clear a structure stub (i.e. |
| a property access stub) when fired. The DFG stub generation code now |
| uses this optimization. |
| |
| * CMakeLists.txt: |
| * GNUmakefile.list.am: |
| * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: |
| * JavaScriptCore.xcodeproj/project.pbxproj: |
| * Target.pri: |
| * bytecode/CodeBlock.cpp: |
| (JSC): |
| (JSC::CodeBlock::finalizeUnconditionally): |
| (JSC::CodeBlock::resetStub): |
| (JSC::CodeBlock::resetStubInternal): |
| * bytecode/CodeBlock.h: |
| (JSC): |
| (CodeBlock): |
| * bytecode/StructureStubClearingWatchpoint.cpp: Added. |
| (JSC): |
| (JSC::StructureStubClearingWatchpoint::~StructureStubClearingWatchpoint): |
| (JSC::StructureStubClearingWatchpoint::push): |
| (JSC::StructureStubClearingWatchpoint::fireInternal): |
| (JSC::WatchpointsOnStructureStubInfo::~WatchpointsOnStructureStubInfo): |
| (JSC::WatchpointsOnStructureStubInfo::addWatchpoint): |
| (JSC::WatchpointsOnStructureStubInfo::ensureReferenceAndAddWatchpoint): |
| * bytecode/StructureStubClearingWatchpoint.h: Added. |
| (JSC): |
| (StructureStubClearingWatchpoint): |
| (JSC::StructureStubClearingWatchpoint::StructureStubClearingWatchpoint): |
| (WatchpointsOnStructureStubInfo): |
| (JSC::WatchpointsOnStructureStubInfo::WatchpointsOnStructureStubInfo): |
| (JSC::WatchpointsOnStructureStubInfo::codeBlock): |
| (JSC::WatchpointsOnStructureStubInfo::stubInfo): |
| * bytecode/StructureStubInfo.h: |
| (JSC::StructureStubInfo::reset): |
| (JSC::StructureStubInfo::addWatchpoint): |
| (StructureStubInfo): |
| * dfg/DFGRepatch.cpp: |
| (JSC::DFG::addStructureTransitionCheck): |
| (DFG): |
| (JSC::DFG::generateProtoChainAccessStub): |
| (JSC::DFG::emitPutTransitionStub): |
| * jit/JumpReplacementWatchpoint.h: |
| |
| 2012-07-12 Filip Pizlo <fpizlo@apple.com> |
| |
| DFG CFA may get overzealous in loops that have code that must exit |
| https://bugs.webkit.org/show_bug.cgi?id=91188 |
| |
| Reviewed by Gavin Barraclough. |
| |
| Ensure that if the CFA assumes that an operation must exit, then it will always exit |
| no matter what happens after. That's necessary to preserve soundness. |
| |
| Remove a broken fixup done by the DFG simplifier, where it was trying to say that the |
| variable-at-head was the first access in the second block in the merge, if the first |
| block did not read the variable. That's totally wrong, if the first block was in fact |
| doing a phantom read. I removed that fixup and instead hardened the rest of the |
| compiler. |
| |
| * dfg/DFGAbstractState.cpp: |
| (JSC::DFG::AbstractState::endBasicBlock): |
| * dfg/DFGBasicBlock.h: |
| (JSC::DFG::BasicBlock::BasicBlock): |
| (BasicBlock): |
| * dfg/DFGCFAPhase.cpp: |
| (JSC::DFG::CFAPhase::performBlockCFA): |
| * dfg/DFGCFGSimplificationPhase.cpp: |
| (JSC::DFG::CFGSimplificationPhase::mergeBlocks): |
| * dfg/DFGConstantFoldingPhase.cpp: |
| (JSC::DFG::ConstantFoldingPhase::ConstantFoldingPhase): |
| (JSC::DFG::ConstantFoldingPhase::run): |
| (ConstantFoldingPhase): |
| (JSC::DFG::ConstantFoldingPhase::foldConstants): |
| (JSC::DFG::ConstantFoldingPhase::paintUnreachableCode): |
| * dfg/DFGVariableEventStream.cpp: |
| (JSC::DFG::VariableEventStream::reconstruct): |
| |
| 2012-07-12 Allan Sandfeld Jensen <allan.jensen@nokia.com> |
| |
| [Qt] Implement MemoryUsageSupport |
| https://bugs.webkit.org/show_bug.cgi?id=91094 |
| |
| Reviewed by Adam Barth. |
| |
| Compile in MemoryStatistics so we can make use of the interface. |
| |
| * Target.pri: |
| |
| 2012-07-12 Csaba Osztrogonác <ossy@webkit.org> |
| |
| Remove dead code after r122392. |
| https://bugs.webkit.org/show_bug.cgi?id=91049 |
| |
| Reviewed by Filip Pizlo. |
| |
| * dfg/DFGSpeculativeJIT64.cpp: |
| (JSC::DFG::SpeculativeJIT::emitCall): |
| |
| 2012-07-11 Adenilson Cavalcanti <cavalcantii@gmail.com> |
| |
| Build fix + remove dead code |
| https://bugs.webkit.org/show_bug.cgi?id=91039 |
| |
| Reviewed by Filip Pizlo. |
| |
| An unused variable was breaking compilation (thanks to warnings being treated as errors). |
| |
| * dfg/DFGSpeculativeJIT32_64.cpp: |
| (JSC::DFG::SpeculativeJIT::emitCall): |
| |
| 2012-07-11 Mark Rowe <mrowe@apple.com> |
| |
| <http://webkit.org/b/91024> Build against the latest SDK when targeting older OS X versions. |
| |
| Reviewed by Dan Bernstein. |
| |
| The deployment target is already set to the version that we're targeting, and it's that setting |
| which determines which functionality from the SDK is available to us. |
| |
| * Configurations/Base.xcconfig: |
| |
| 2012-07-11 Filip Pizlo <fpizlo@apple.com> |
| |
| DFG should have fast virtual calls |
| https://bugs.webkit.org/show_bug.cgi?id=90924 |
| |
| Reviewed by Gavin Barraclough. |
| |
| Implements virtual call support in the style of the old JIT, with the |
| caveat that we still use the same slow path for both InternalFunction |
| calls and JSFunction calls. Also rationalized the way that our |
| CodeOrigin indices tie into exception checks (previously it was a |
| strange one-to-one mapping with fairly limited assertions; now it's a |
| one-to-many mapping for CodeOrigins to exception checks, respectively). |
| I also took the opportunity to clean up |
| CallLinkInfo::callReturnLocation, which previously was either a Call or |
| a NearCall. Now it's just a NearCall. As well, exceptions during slow |
| path call resolution are now handled by returning an exception throwing |
| thunk rather than returning null. And finally, I made a few things |
| public that were previously private-with-lots-of-friends, because I |
| truly despise the thought of listing each thunk generating function as |
| a friend of JSValue and friends. |
| |
| * bytecode/CallLinkInfo.cpp: |
| (JSC::CallLinkInfo::unlink): |
| * bytecode/CallLinkInfo.h: |
| (CallLinkInfo): |
| * bytecode/CodeOrigin.h: |
| (JSC::CodeOrigin::CodeOrigin): |
| (JSC::CodeOrigin::isSet): |
| * dfg/DFGAssemblyHelpers.h: |
| (JSC::DFG::AssemblyHelpers::AssemblyHelpers): |
| * dfg/DFGCCallHelpers.h: |
| (JSC::DFG::CCallHelpers::CCallHelpers): |
| * dfg/DFGGPRInfo.h: |
| (GPRInfo): |
| * dfg/DFGJITCompiler.cpp: |
| (JSC::DFG::JITCompiler::link): |
| (JSC::DFG::JITCompiler::compileFunction): |
| * dfg/DFGJITCompiler.h: |
| (JSC::DFG::CallBeginToken::CallBeginToken): |
| (JSC::DFG::CallBeginToken::~CallBeginToken): |
| (CallBeginToken): |
| (JSC::DFG::CallBeginToken::set): |
| (JSC::DFG::CallBeginToken::registerWithExceptionCheck): |
| (JSC::DFG::CallBeginToken::codeOrigin): |
| (JSC::DFG::CallExceptionRecord::CallExceptionRecord): |
| (CallExceptionRecord): |
| (JSC::DFG::JITCompiler::currentCodeOriginIndex): |
| (JITCompiler): |
| (JSC::DFG::JITCompiler::beginCall): |
| (JSC::DFG::JITCompiler::notifyCall): |
| (JSC::DFG::JITCompiler::prepareForExceptionCheck): |
| (JSC::DFG::JITCompiler::addExceptionCheck): |
| (JSC::DFG::JITCompiler::addFastExceptionCheck): |
| * dfg/DFGOperations.cpp: |
| * dfg/DFGRepatch.cpp: |
| (JSC::DFG::dfgLinkFor): |
| * dfg/DFGSpeculativeJIT.h: |
| (JSC::DFG::SpeculativeJIT::appendCallWithExceptionCheck): |
| * dfg/DFGSpeculativeJIT32_64.cpp: |
| (JSC::DFG::SpeculativeJIT::emitCall): |
| * dfg/DFGSpeculativeJIT64.cpp: |
| (JSC::DFG::SpeculativeJIT::emitCall): |
| * dfg/DFGThunks.cpp: |
| (JSC::DFG::emitPointerValidation): |
| (DFG): |
| (JSC::DFG::throwExceptionFromCallSlowPathGenerator): |
| (JSC::DFG::slowPathFor): |
| (JSC::DFG::linkForThunkGenerator): |
| (JSC::DFG::linkCallThunkGenerator): |
| (JSC::DFG::linkConstructThunkGenerator): |
| (JSC::DFG::virtualForThunkGenerator): |
| (JSC::DFG::virtualCallThunkGenerator): |
| (JSC::DFG::virtualConstructThunkGenerator): |
| * dfg/DFGThunks.h: |
| (DFG): |
| * jit/JIT.cpp: |
| (JSC::JIT::privateCompile): |
| (JSC::JIT::linkFor): |
| * runtime/Executable.h: |
| (ExecutableBase): |
| (JSC::ExecutableBase::offsetOfJITCodeFor): |
| (JSC::ExecutableBase::offsetOfNumParametersFor): |
| * runtime/JSValue.h: |
| (JSValue): |
| |
| 2012-07-11 Filip Pizlo <fpizlo@apple.com> |
| |
| Accidentally used the wrong license (3-clause instead of 2-clause) in some |
| files I just committed. |
| |
| Rubber stamped by Oliver Hunt. |
| |
| * bytecode/Watchpoint.cpp: |
| * bytecode/Watchpoint.h: |
| * jit/JumpReplacementWatchpoint.cpp: |
| * jit/JumpReplacementWatchpoint.h: |
| |
| 2012-07-11 Filip Pizlo <fpizlo@apple.com> |
| |
| Watchpoints and jump replacement should be decoupled |
| https://bugs.webkit.org/show_bug.cgi?id=91016 |
| |
| Reviewed by Oliver Hunt. |
| |
| * CMakeLists.txt: |
| * GNUmakefile.list.am: |
| * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: |
| * JavaScriptCore.xcodeproj/project.pbxproj: |
| * Target.pri: |
| * assembler/AbstractMacroAssembler.h: |
| (JSC): |
| (Label): |
| * bytecode/CodeBlock.h: |
| (JSC::CodeBlock::appendWatchpoint): |
| (JSC::CodeBlock::watchpoint): |
| (DFGData): |
| * bytecode/Watchpoint.cpp: |
| (JSC): |
| * bytecode/Watchpoint.h: |
| (JSC::Watchpoint::Watchpoint): |
| (Watchpoint): |
| (JSC::Watchpoint::fire): |
| * dfg/DFGSpeculativeJIT.h: |
| (JSC::DFG::SpeculativeJIT::speculationWatchpoint): |
| * jit/JumpReplacementWatchpoint.cpp: Added. |
| (JSC): |
| (JSC::JumpReplacementWatchpoint::correctLabels): |
| (JSC::JumpReplacementWatchpoint::fireInternal): |
| * jit/JumpReplacementWatchpoint.h: Added. |
| (JSC): |
| (JumpReplacementWatchpoint): |
| (JSC::JumpReplacementWatchpoint::JumpReplacementWatchpoint): |
| (JSC::JumpReplacementWatchpoint::setDestination): |
| |
| 2012-07-11 Kevin Ollivier <kevino@theolliviers.com> |
| |
| [wx] Unreviewed build fix. Don't try to build udis86_itab.c since it's included by |
| another file. |
| |
| * wscript: |
| |
| 2012-07-11 Chao-ying Fu <fu@mips.com> |
| |
| Add MIPS convertibleLoadPtr and other functions |
| https://bugs.webkit.org/show_bug.cgi?id=90714 |
| |
| Reviewed by Oliver Hunt. |
| |
| * assembler/MIPSAssembler.h: |
| (JSC::MIPSAssembler::labelIgnoringWatchpoints): |
| (MIPSAssembler): |
| (JSC::MIPSAssembler::replaceWithLoad): |
| (JSC::MIPSAssembler::replaceWithAddressComputation): |
| * assembler/MacroAssemblerMIPS.h: |
| (JSC::MacroAssemblerMIPS::convertibleLoadPtr): |
| (MacroAssemblerMIPS): |
| |
| 2012-07-11 Anders Carlsson <andersca@apple.com> |
| |
| Add -Wtautological-compare and -Wsign-compare warning flags |
| https://bugs.webkit.org/show_bug.cgi?id=90994 |
| |
| Reviewed by Mark Rowe. |
| |
| * Configurations/Base.xcconfig: |
| |
| 2012-07-11 Benjamin Poulain <bpoulain@apple.com> |
| |
| Simplify the copying of JSC ARMv7's LinkRecord |
| https://bugs.webkit.org/show_bug.cgi?id=90930 |
| |
| Reviewed by Filip Pizlo. |
| |
| The class LinkRecord is used by value everywhere in ARMv7Assembler. The compiler uses |
| memmove() to move the objects. |
| |
| The problem is memmove() is overkill for this object, moving the value can be done with |
| 3 load-store. This patch adds an operator= to the class doing more efficient copying. |
| This reduces the link time by 19%. |
| |
| * assembler/ARMv7Assembler.h: |
| (JSC::ARMv7Assembler::LinkRecord::LinkRecord): |
| (JSC::ARMv7Assembler::LinkRecord::operator=): |
| (JSC::ARMv7Assembler::LinkRecord::from): |
| (JSC::ARMv7Assembler::LinkRecord::setFrom): |
| (JSC::ARMv7Assembler::LinkRecord::to): |
| (JSC::ARMv7Assembler::LinkRecord::type): |
| (JSC::ARMv7Assembler::LinkRecord::linkType): |
| (JSC::ARMv7Assembler::LinkRecord::setLinkType): |
| (JSC::ARMv7Assembler::LinkRecord::condition): |
| |
| 2012-07-11 Andy Wingo <wingo@igalia.com> |
| |
| jsc: Parse options before creating global data |
| https://bugs.webkit.org/show_bug.cgi?id=90975 |
| |
| Reviewed by Filip Pizlo. |
| |
| This patch moves the options parsing in "jsc" before the creation |
| of the JSGlobalData, so that --useJIT=no has a chance to take |
| effect. |
| |
| * jsc.cpp: |
| (CommandLine::parseArguments): Refactor to be a class, and take |
| argc and argv as constructor arguments. |
| (jscmain): Move arg parsing before JSGlobalData creation. |
| |
| 2012-07-10 Filip Pizlo <fpizlo@apple.com> |
| |
| REGRESSION(r122166): It made 170 tests crash on 32 bit platforms |
| https://bugs.webkit.org/show_bug.cgi?id=90852 |
| |
| Reviewed by Zoltan Herczeg. |
| |
| If we can't use the range filter, we should still make sure that the |
| address is remotely sane, otherwise the hashtables will assert. |
| |
| * jit/JITStubRoutine.h: |
| (JSC::JITStubRoutine::passesFilter): |
| |
| 2012-07-10 Filip Pizlo <fpizlo@apple.com> |
| |
| DFG recompilation heuristics should be based on count, not rate |
| https://bugs.webkit.org/show_bug.cgi?id=90146 |
| |
| Reviewed by Oliver Hunt. |
| |
| Rolling r121511 back in after fixing the DFG's interpretation of op_div |
| profiling, with Gavin's rubber stamp. |
| |
| This removes a bunch of code that was previously trying to prevent spurious |
| reoptimizations if a large enough majority of executions of a code block did |
| not result in OSR exit. It turns out that this code was purely harmful. This |
| patch removes all of that logic and replaces it with a dead-simple |
| heuristic: if you exit more than N times (where N is an exponential function |
| of the number of times the code block has already been recompiled) then we |
| will recompile. |
| |
| This appears to be a broad ~1% win on many benchmarks large and small. |
| |
| * bytecode/CodeBlock.cpp: |
| (JSC::CodeBlock::CodeBlock): |
| * bytecode/CodeBlock.h: |
| (JSC::CodeBlock::couldTakeSpecialFastCase): |
| (CodeBlock): |
| (JSC::CodeBlock::osrExitCounter): |
| (JSC::CodeBlock::countOSRExit): |
| (JSC::CodeBlock::addressOfOSRExitCounter): |
| (JSC::CodeBlock::offsetOfOSRExitCounter): |
| (JSC::CodeBlock::adjustedExitCountThreshold): |
| (JSC::CodeBlock::exitCountThresholdForReoptimization): |
| (JSC::CodeBlock::exitCountThresholdForReoptimizationFromLoop): |
| (JSC::CodeBlock::shouldReoptimizeNow): |
| (JSC::CodeBlock::shouldReoptimizeFromLoopNow): |
| * bytecode/ExecutionCounter.cpp: |
| (JSC::ExecutionCounter::setThreshold): |
| * bytecode/ExecutionCounter.h: |
| (ExecutionCounter): |
| (JSC::ExecutionCounter::clippedThreshold): |
| * dfg/DFGByteCodeParser.cpp: |
| (JSC::DFG::ByteCodeParser::makeDivSafe): |
| * dfg/DFGJITCompiler.cpp: |
| (JSC::DFG::JITCompiler::compileBody): |
| * dfg/DFGOSRExit.cpp: |
| (JSC::DFG::OSRExit::considerAddingAsFrequentExitSiteSlow): |
| * dfg/DFGOSRExitCompiler.cpp: |
| (JSC::DFG::OSRExitCompiler::handleExitCounts): |
| * dfg/DFGOperations.cpp: |
| * jit/JITStubs.cpp: |
| (JSC::DEFINE_STUB_FUNCTION): |
| * runtime/Options.h: |
| (JSC): |
| |
| 2012-07-09 Matt Falkenhagen <falken@chromium.org> |
| |
| Add ENABLE_DIALOG_ELEMENT and skeleton files |
| https://bugs.webkit.org/show_bug.cgi?id=90521 |
| |
| Reviewed by Kent Tamura. |
| |
| * Configurations/FeatureDefines.xcconfig: |
| |
| 2012-07-09 Filip Pizlo <fpizlo@apple.com> |
| |
| Unreviewed, roll out http://trac.webkit.org/changeset/121511 |
| It made in-browser V8v7 10% slower. |
| |
| * bytecode/CodeBlock.cpp: |
| (JSC::CodeBlock::CodeBlock): |
| * bytecode/CodeBlock.h: |
| (CodeBlock): |
| (JSC::CodeBlock::countSpeculationSuccess): |
| (JSC::CodeBlock::countSpeculationFailure): |
| (JSC::CodeBlock::speculativeSuccessCounter): |
| (JSC::CodeBlock::speculativeFailCounter): |
| (JSC::CodeBlock::forcedOSRExitCounter): |
| (JSC::CodeBlock::addressOfSpeculativeSuccessCounter): |
| (JSC::CodeBlock::addressOfSpeculativeFailCounter): |
| (JSC::CodeBlock::addressOfForcedOSRExitCounter): |
| (JSC::CodeBlock::offsetOfSpeculativeSuccessCounter): |
| (JSC::CodeBlock::offsetOfSpeculativeFailCounter): |
| (JSC::CodeBlock::offsetOfForcedOSRExitCounter): |
| (JSC::CodeBlock::largeFailCountThreshold): |
| (JSC::CodeBlock::largeFailCountThresholdForLoop): |
| (JSC::CodeBlock::shouldReoptimizeNow): |
| (JSC::CodeBlock::shouldReoptimizeFromLoopNow): |
| * bytecode/ExecutionCounter.cpp: |
| (JSC::ExecutionCounter::setThreshold): |
| * bytecode/ExecutionCounter.h: |
| (ExecutionCounter): |
| * dfg/DFGJITCompiler.cpp: |
| (JSC::DFG::JITCompiler::compileBody): |
| * dfg/DFGOSRExit.cpp: |
| (JSC::DFG::OSRExit::considerAddingAsFrequentExitSiteSlow): |
| * dfg/DFGOSRExitCompiler.cpp: |
| (JSC::DFG::OSRExitCompiler::handleExitCounts): |
| * dfg/DFGOperations.cpp: |
| * jit/JITStubs.cpp: |
| (JSC::DEFINE_STUB_FUNCTION): |
| * runtime/Options.h: |
| (JSC): |
| |
| 2012-07-09 Filip Pizlo <fpizlo@apple.com> |
| |
| DFG may get stuck in an infinite fix point if it constant folds a mispredicted node |
| https://bugs.webkit.org/show_bug.cgi?id=90829 |
| <rdar://problem/11823843> |
| |
| Reviewed by Oliver Hunt. |
| |
| If a node is shown to have been mispredicted during CFA, then don't allow constant |
| folding to make the graph even more degenerate. Instead, pull back on constant folding |
| and allow the normal OSR machinery to fix our profiling so that a future recompilation |
| doesn't see the same mistake. |
| |
| * dfg/DFGAbstractState.cpp: |
| (JSC::DFG::AbstractState::execute): |
| * dfg/DFGAbstractState.h: |
| (JSC::DFG::AbstractState::trySetConstant): |
| (AbstractState): |
| * dfg/DFGPhase.h: |
| (JSC::DFG::Phase::name): |
| (Phase): |
| (JSC::DFG::runAndLog): |
| (DFG): |
| (JSC::DFG::runPhase): |
| |
| 2012-07-09 Filip Pizlo <fpizlo@apple.com> |
| |
| It should be possible to jettison JIT stub routines even if they are currently running |
| https://bugs.webkit.org/show_bug.cgi?id=90731 |
| |
| Reviewed by Gavin Barraclough. |
| |
| This gives the GC awareness of all JIT-generated stubs for inline caches. That |
| means that if you want to delete a JIT-generated stub, you don't have to worry |
| about whether or not it is currently running: if there is a chance that it might |
| be, the GC will kindly defer deletion until non-running-ness is proved. |
| |
| * CMakeLists.txt: |
| * GNUmakefile.list.am: |
| * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: |
| * JavaScriptCore.xcodeproj/project.pbxproj: |
| * Target.pri: |
| * bytecode/Instruction.h: |
| (JSC): |
| (PolymorphicStubInfo): |
| (JSC::PolymorphicAccessStructureList::PolymorphicStubInfo::set): |
| (JSC::PolymorphicAccessStructureList::PolymorphicAccessStructureList): |
| * bytecode/PolymorphicPutByIdList.cpp: |
| (JSC::PutByIdAccess::fromStructureStubInfo): |
| * bytecode/PolymorphicPutByIdList.h: |
| (JSC::PutByIdAccess::transition): |
| (JSC::PutByIdAccess::replace): |
| (JSC::PutByIdAccess::stubRoutine): |
| (PutByIdAccess): |
| (JSC::PolymorphicPutByIdList::currentSlowPathTarget): |
| * bytecode/StructureStubInfo.h: |
| (JSC::StructureStubInfo::reset): |
| * dfg/DFGRepatch.cpp: |
| (JSC::DFG::generateProtoChainAccessStub): |
| (JSC::DFG::tryCacheGetByID): |
| (JSC::DFG::tryBuildGetByIDList): |
| (JSC::DFG::tryBuildGetByIDProtoList): |
| (JSC::DFG::emitPutReplaceStub): |
| (JSC::DFG::emitPutTransitionStub): |
| (JSC::DFG::tryCachePutByID): |
| (JSC::DFG::tryBuildPutByIdList): |
| * heap/ConservativeRoots.cpp: |
| (JSC): |
| (DummyMarkHook): |
| (JSC::DummyMarkHook::mark): |
| (JSC::ConservativeRoots::add): |
| (CompositeMarkHook): |
| (JSC::CompositeMarkHook::CompositeMarkHook): |
| (JSC::CompositeMarkHook::mark): |
| * heap/ConservativeRoots.h: |
| (JSC): |
| (ConservativeRoots): |
| * heap/Heap.cpp: |
| (JSC::Heap::markRoots): |
| (JSC::Heap::deleteUnmarkedCompiledCode): |
| * heap/Heap.h: |
| (JSC): |
| (Heap): |
| * heap/JITStubRoutineSet.cpp: Added. |
| (JSC): |
| (JSC::JITStubRoutineSet::JITStubRoutineSet): |
| (JSC::JITStubRoutineSet::~JITStubRoutineSet): |
| (JSC::JITStubRoutineSet::add): |
| (JSC::JITStubRoutineSet::clearMarks): |
| (JSC::JITStubRoutineSet::markSlow): |
| (JSC::JITStubRoutineSet::deleteUnmarkedJettisonedStubRoutines): |
| (JSC::JITStubRoutineSet::traceMarkedStubRoutines): |
| * heap/JITStubRoutineSet.h: Added. |
| (JSC): |
| (JITStubRoutineSet): |
| (JSC::JITStubRoutineSet::mark): |
| * heap/MachineStackMarker.h: |
| (JSC): |
| * interpreter/RegisterFile.cpp: |
| (JSC::RegisterFile::gatherConservativeRoots): |
| * interpreter/RegisterFile.h: |
| (JSC): |
| * jit/ExecutableAllocator.cpp: |
| (JSC::DemandExecutableAllocator::DemandExecutableAllocator): |
| * jit/ExecutableAllocator.h: |
| (JSC): |
| * jit/ExecutableAllocatorFixedVMPool.cpp: |
| (JSC): |
| (JSC::FixedVMPoolExecutableAllocator::FixedVMPoolExecutableAllocator): |
| * jit/GCAwareJITStubRoutine.cpp: Added. |
| (JSC): |
| (JSC::GCAwareJITStubRoutine::GCAwareJITStubRoutine): |
| (JSC::GCAwareJITStubRoutine::~GCAwareJITStubRoutine): |
| (JSC::GCAwareJITStubRoutine::observeZeroRefCount): |
| (JSC::GCAwareJITStubRoutine::deleteFromGC): |
| (JSC::GCAwareJITStubRoutine::markRequiredObjectsInternal): |
| (JSC::MarkingGCAwareJITStubRoutineWithOneObject::MarkingGCAwareJITStubRoutineWithOneObject): |
| (JSC::MarkingGCAwareJITStubRoutineWithOneObject::~MarkingGCAwareJITStubRoutineWithOneObject): |
| (JSC::MarkingGCAwareJITStubRoutineWithOneObject::markRequiredObjectsInternal): |
| (JSC::createJITStubRoutine): |
| * jit/GCAwareJITStubRoutine.h: Added. |
| (JSC): |
| (GCAwareJITStubRoutine): |
| (JSC::GCAwareJITStubRoutine::markRequiredObjects): |
| (MarkingGCAwareJITStubRoutineWithOneObject): |
| * jit/JITPropertyAccess.cpp: |
| (JSC::JIT::privateCompilePutByIdTransition): |
| (JSC::JIT::privateCompilePatchGetArrayLength): |
| (JSC::JIT::privateCompileGetByIdProto): |
| (JSC::JIT::privateCompileGetByIdSelfList): |
| (JSC::JIT::privateCompileGetByIdProtoList): |
| (JSC::JIT::privateCompileGetByIdChainList): |
| (JSC::JIT::privateCompileGetByIdChain): |
| * jit/JITPropertyAccess32_64.cpp: |
| (JSC::JIT::privateCompilePutByIdTransition): |
| (JSC::JIT::privateCompilePatchGetArrayLength): |
| (JSC::JIT::privateCompileGetByIdProto): |
| (JSC::JIT::privateCompileGetByIdSelfList): |
| (JSC::JIT::privateCompileGetByIdProtoList): |
| (JSC::JIT::privateCompileGetByIdChainList): |
| (JSC::JIT::privateCompileGetByIdChain): |
| * jit/JITStubRoutine.cpp: Added. |
| (JSC): |
| (JSC::JITStubRoutine::~JITStubRoutine): |
| (JSC::JITStubRoutine::observeZeroRefCount): |
| * jit/JITStubRoutine.h: Added. |
| (JSC): |
| (JITStubRoutine): |
| (JSC::JITStubRoutine::JITStubRoutine): |
| (JSC::JITStubRoutine::createSelfManagedRoutine): |
| (JSC::JITStubRoutine::code): |
| (JSC::JITStubRoutine::asCodePtr): |
| (JSC::JITStubRoutine::ref): |
| (JSC::JITStubRoutine::deref): |
| (JSC::JITStubRoutine::startAddress): |
| (JSC::JITStubRoutine::endAddress): |
| (JSC::JITStubRoutine::addressStep): |
| (JSC::JITStubRoutine::canPerformRangeFilter): |
| (JSC::JITStubRoutine::filteringStartAddress): |
| (JSC::JITStubRoutine::filteringExtentSize): |
| (JSC::JITStubRoutine::passesFilter): |
| * jit/JITStubs.cpp: |
| (JSC::DEFINE_STUB_FUNCTION): |
| (JSC::getPolymorphicAccessStructureListSlot): |
| |
| 2012-07-09 Sheriff Bot <webkit.review.bot@gmail.com> |
| |
| Unreviewed, rolling out r122107. |
| http://trac.webkit.org/changeset/122107 |
| https://bugs.webkit.org/show_bug.cgi?id=90794 |
| |
| Build failure on Mac debug bots (Requested by falken_ on |
| #webkit). |
| |
| * Configurations/FeatureDefines.xcconfig: |
| |
| 2012-07-09 Matt Falkenhagen <falken@chromium.org> |
| |
| Add ENABLE_DIALOG_ELEMENT and skeleton files |
| https://bugs.webkit.org/show_bug.cgi?id=90521 |
| |
| Reviewed by Kent Tamura. |
| |
| * Configurations/FeatureDefines.xcconfig: |
| |
| 2012-07-08 Ryosuke Niwa <rniwa@webkit.org> |
| |
| gcc build fix after r121925. |
| |
| * runtime/JSObject.h: |
| (JSC::JSFinalObject::finishCreation): |
| |
| 2012-07-08 Zoltan Herczeg <zherczeg@webkit.org> |
| |
| [Qt][ARM] Implementing missing macro assembler instructions after r121925 |
| https://bugs.webkit.org/show_bug.cgi?id=90657 |
| |
| Reviewed by Csaba Osztrogonác. |
| |
| Implementing convertibleLoadPtr, replaceWithLoad and |
| replaceWithAddressComputation. |
| |
| * assembler/ARMAssembler.h: |
| (JSC::ARMAssembler::replaceWithLoad): |
| (ARMAssembler): |
| (JSC::ARMAssembler::replaceWithAddressComputation): |
| * assembler/MacroAssemblerARM.h: |
| (JSC::MacroAssemblerARM::convertibleLoadPtr): |
| (MacroAssemblerARM): |
| |
| 2012-07-06 Filip Pizlo <fpizlo@apple.com> |
| |
| WebKit Version 5.1.7 (6534.57.2, r121935): Double-click no longer works on OpenStreetMap |
| https://bugs.webkit.org/show_bug.cgi?id=90703 |
| |
| Reviewed by Michael Saboff. |
| |
| It turns out that in my object model refactoring, I managed to fix get_by_pname in all |
| execution engines except 64-bit baseline JIT. |
| |
| * jit/JITPropertyAccess.cpp: |
| (JSC::JIT::emit_op_get_by_pname): |
| |
| 2012-07-06 Pravin D <pravind.2k4@gmail.com> |
| |
| Build Error on Qt Linux build |
| https://bugs.webkit.org/show_bug.cgi?id=90699 |
| |
| Reviewed by Laszlo Gombos. |
| |
| * parser/Parser.cpp: |
| (JSC::::parseForStatement): |
| Removed unused boolean variable as this was causing build error on Qt Linux. |
| |
| 2012-07-06 Nuno Lopes <nlopes@apple.com> |
| |
| Fix build with recent clang. |
| https://bugs.webkit.org/show_bug.cgi?id=90634 |
| |
| Reviewed by Oliver Hunt. |
| |
| * jit/SpecializedThunkJIT.h: |
| (JSC::SpecializedThunkJIT::SpecializedThunkJIT): |
| (SpecializedThunkJIT): |
| * jit/ThunkGenerators.cpp: |
| (JSC::charCodeAtThunkGenerator): |
| (JSC::charAtThunkGenerator): |
| (JSC::fromCharCodeThunkGenerator): |
| (JSC::sqrtThunkGenerator): |
| (JSC::floorThunkGenerator): |
| (JSC::ceilThunkGenerator): |
| (JSC::roundThunkGenerator): |
| (JSC::expThunkGenerator): |
| (JSC::logThunkGenerator): |
| (JSC::absThunkGenerator): |
| (JSC::powThunkGenerator): |
| * parser/ASTBuilder.h: |
| (JSC::ASTBuilder::createAssignResolve): |
| (JSC::ASTBuilder::createForLoop): |
| (JSC::ASTBuilder::createForInLoop): |
| (JSC::ASTBuilder::makeAssignNode): |
| (JSC::ASTBuilder::makePrefixNode): |
| (JSC::ASTBuilder::makePostfixNode): |
| * parser/NodeConstructors.h: |
| (JSC::PostfixErrorNode::PostfixErrorNode): |
| (JSC::PrefixErrorNode::PrefixErrorNode): |
| (JSC::AssignResolveNode::AssignResolveNode): |
| (JSC::AssignErrorNode::AssignErrorNode): |
| (JSC::ForNode::ForNode): |
| (JSC::ForInNode::ForInNode): |
| * parser/Nodes.h: |
| (FunctionCallResolveNode): |
| (PostfixErrorNode): |
| (PrefixErrorNode): |
| (ReadModifyResolveNode): |
| (AssignResolveNode): |
| (AssignErrorNode): |
| (ForNode): |
| (ForInNode): |
| * parser/Parser.cpp: |
| (JSC::::parseVarDeclarationList): |
| (JSC::::parseForStatement): |
| * parser/SyntaxChecker.h: |
| (JSC::SyntaxChecker::createAssignResolve): |
| (JSC::SyntaxChecker::createForLoop): |
| |
| 2012-07-06 Zoltan Herczeg <zherczeg@webkit.org> |
| |
| [Qt][ARM] REGRESSION(r121885): It broke 30 jsc tests, 500+ layout tests |
| https://bugs.webkit.org/show_bug.cgi?id=90656 |
| |
| Reviewed by Csaba Osztrogonác. |
| |
| Typo fixes. |
| |
| * assembler/MacroAssemblerARM.cpp: |
| (JSC::MacroAssemblerARM::load32WithUnalignedHalfWords): |
| Rename getOp2Byte() -> getOp2Half() |
| * assembler/MacroAssemblerARMv7.h: |
| (JSC::MacroAssemblerARMv7::convertibleLoadPtr): |
| Add a necessary space. |
| * jit/JITStubs.cpp: |
| (JSC): |
| Revert INLINE_ARM_FUNCTION macro. |
| |
| 2012-07-05 Filip Pizlo <fpizlo@apple.com> |
| |
| REGRESSION(r121925): It broke 5 sputnik tests on x86 platforms |
| https://bugs.webkit.org/show_bug.cgi?id=90658 |
| |
| Reviewed by Zoltan Herczeg. |
| |
| Under the new object model, out-of-line property accesses such as those |
| in ResolveGlobal must account for the fact that the offset to the Kth |
| property is represented by K + inlineStorageCapacity. Hence, the property |
| loads in ResolveGlobal must have an additional -inlineStorageCapacity * |
| sizeof(JSValue) offset. |
| |
| * dfg/DFGSpeculativeJIT32_64.cpp: |
| (JSC::DFG::SpeculativeJIT::compile): |
| |
| 2012-07-05 Csaba Osztrogonác <ossy@webkit.org> |
| |
| [Qt] Unreviewed 64 bit buildfix after r121925. |
| |
| * bytecode/PutByIdStatus.cpp: |
| (JSC::PutByIdStatus::computeFromLLInt): |
| |
| 2012-07-05 Michael Saboff <msaboff@apple.com> |
| |
| JSString::tryHashConstLock() fails to get exclusive lock |
| https://bugs.webkit.org/show_bug.cgi?id=90639 |
| |
| Reviewed by Oliver Hunt. |
| |
| Added check that the string is already locked even before compare and swap. |
| |
| * heap/MarkStack.cpp: |
| (JSC::JSString::tryHashConstLock): |
| |
| 2012-07-04 Filip Pizlo <fpizlo@apple.com> |
| |
| Inline property storage should not be wasted when it is exhausted |
| https://bugs.webkit.org/show_bug.cgi?id=90347 |
| |
| Reviewed by Gavin Barraclough. |
| |
| Previously, if we switched an object from using inline storage to out-of-line |
| storage, we would abandon the inline storage. This would have two main implications: |
| (i) all accesses to the object, even for properties that were previously in inline |
| storage, must now take an extra indirection; and (ii) we waste a non-trivial amount |
| of space since we must allocate additional out-of-line storage to hold properties |
| that would have fit in the inline storage. There's also the copying cost when |
| switching to out-of-line storage - we must copy all inline properties into ouf-of-line |
| storage. |
| |
| This patch changes the way that object property storage works so that we can use both |
| inline and out-of-line storage concurrently. This is accomplished by introducing a |
| new notion of property offset. This PropertyOffset is a 32-bit signed integer and it |
| behaves as follows: |
| |
| offset == -1: invalid offset, indicating a property that does not exist. |
| |
| 0 <= offset <= inlineStorageCapacity: offset into inline storage. |
| |
| inlineStorageCapacity < offset: offset into out-of-line storage. |
| |
| Because non-final objects don't have inline storage, the only valid PropertyOffsets |
| for those objects' properties are -1 or > inlineStorageCapacity. |
| |
| This now means that the decision to use inline or out-of-line storage for an access is |
| made based on the offset, rather than the structure. It also means that any access |
| where the offset is a variable must have an extra branch, unless the type of the |
| object is also known (if it's known to be a non-final object then we can just assert |
| that the offset is >= inlineStorageCapacity). |
| |
| This looks like a big Kraken speed-up and a slight V8 speed-up. |
| |
| * GNUmakefile.list.am: |
| * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.def: |
| * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: |
| * JavaScriptCore.xcodeproj/project.pbxproj: |
| * assembler/ARMv7Assembler.h: |
| (ARMv7Assembler): |
| (JSC::ARMv7Assembler::ldrWide8BitImmediate): |
| (JSC::ARMv7Assembler::replaceWithLoad): |
| (JSC::ARMv7Assembler::replaceWithAddressComputation): |
| * assembler/AbstractMacroAssembler.h: |
| (AbstractMacroAssembler): |
| (ConvertibleLoadLabel): |
| (JSC::AbstractMacroAssembler::ConvertibleLoadLabel::ConvertibleLoadLabel): |
| (JSC::AbstractMacroAssembler::ConvertibleLoadLabel::isSet): |
| (JSC::AbstractMacroAssembler::labelIgnoringWatchpoints): |
| (JSC::AbstractMacroAssembler::replaceWithLoad): |
| (JSC::AbstractMacroAssembler::replaceWithAddressComputation): |
| * assembler/CodeLocation.h: |
| (JSC): |
| (CodeLocationCommon): |
| (CodeLocationConvertibleLoad): |
| (JSC::CodeLocationConvertibleLoad::CodeLocationConvertibleLoad): |
| (JSC::CodeLocationCommon::convertibleLoadAtOffset): |
| * assembler/LinkBuffer.cpp: |
| (JSC::LinkBuffer::finalizeCodeWithDisassembly): |
| * assembler/LinkBuffer.h: |
| (LinkBuffer): |
| (JSC::LinkBuffer::locationOf): |
| * assembler/MacroAssemblerARMv7.h: |
| (MacroAssemblerARMv7): |
| (JSC::MacroAssemblerARMv7::convertibleLoadPtr): |
| * assembler/MacroAssemblerX86.h: |
| (JSC::MacroAssemblerX86::convertibleLoadPtr): |
| (MacroAssemblerX86): |
| * assembler/MacroAssemblerX86_64.h: |
| (JSC::MacroAssemblerX86_64::convertibleLoadPtr): |
| (MacroAssemblerX86_64): |
| * assembler/RepatchBuffer.h: |
| (RepatchBuffer): |
| (JSC::RepatchBuffer::replaceWithLoad): |
| (JSC::RepatchBuffer::replaceWithAddressComputation): |
| (JSC::RepatchBuffer::setLoadInstructionIsActive): |
| * assembler/X86Assembler.h: |
| (JSC::X86Assembler::replaceWithLoad): |
| (X86Assembler): |
| (JSC::X86Assembler::replaceWithAddressComputation): |
| * bytecode/CodeBlock.cpp: |
| (JSC::CodeBlock::printGetByIdOp): |
| (JSC::CodeBlock::dump): |
| (JSC::CodeBlock::finalizeUnconditionally): |
| * bytecode/GetByIdStatus.cpp: |
| (JSC::GetByIdStatus::computeFromLLInt): |
| (JSC::GetByIdStatus::computeForChain): |
| (JSC::GetByIdStatus::computeFor): |
| * bytecode/GetByIdStatus.h: |
| (JSC::GetByIdStatus::GetByIdStatus): |
| (JSC::GetByIdStatus::offset): |
| (GetByIdStatus): |
| * bytecode/Opcode.h: |
| (JSC): |
| (JSC::padOpcodeName): |
| * bytecode/PutByIdStatus.cpp: |
| (JSC::PutByIdStatus::computeFromLLInt): |
| (JSC::PutByIdStatus::computeFor): |
| * bytecode/PutByIdStatus.h: |
| (JSC::PutByIdStatus::PutByIdStatus): |
| (JSC::PutByIdStatus::offset): |
| (PutByIdStatus): |
| * bytecode/ResolveGlobalStatus.cpp: |
| (JSC): |
| (JSC::computeForStructure): |
| * bytecode/ResolveGlobalStatus.h: |
| (JSC::ResolveGlobalStatus::ResolveGlobalStatus): |
| (JSC::ResolveGlobalStatus::offset): |
| (ResolveGlobalStatus): |
| * bytecode/StructureSet.h: |
| (StructureSet): |
| * bytecode/StructureStubInfo.h: |
| * dfg/DFGByteCodeParser.cpp: |
| (ByteCodeParser): |
| (JSC::DFG::ByteCodeParser::handleGetByOffset): |
| (JSC::DFG::ByteCodeParser::handleGetById): |
| (JSC::DFG::ByteCodeParser::parseBlock): |
| * dfg/DFGCapabilities.h: |
| (JSC::DFG::canCompileOpcode): |
| * dfg/DFGJITCompiler.cpp: |
| (JSC::DFG::JITCompiler::link): |
| * dfg/DFGJITCompiler.h: |
| (JSC::DFG::PropertyAccessRecord::PropertyAccessRecord): |
| (PropertyAccessRecord): |
| * dfg/DFGRepatch.cpp: |
| (JSC::DFG::dfgRepatchByIdSelfAccess): |
| (JSC::DFG::generateProtoChainAccessStub): |
| (JSC::DFG::tryCacheGetByID): |
| (JSC::DFG::tryBuildGetByIDList): |
| (JSC::DFG::tryBuildGetByIDProtoList): |
| (JSC::DFG::emitPutReplaceStub): |
| (JSC::DFG::emitPutTransitionStub): |
| (JSC::DFG::tryCachePutByID): |
| (JSC::DFG::tryBuildPutByIdList): |
| * dfg/DFGSpeculativeJIT.h: |
| (JSC::DFG::SpeculativeJIT::emitAllocateBasicJSObject): |
| * dfg/DFGSpeculativeJIT32_64.cpp: |
| (JSC::DFG::SpeculativeJIT::cachedGetById): |
| (JSC::DFG::SpeculativeJIT::cachedPutById): |
| (JSC::DFG::SpeculativeJIT::compile): |
| * dfg/DFGSpeculativeJIT64.cpp: |
| (JSC::DFG::SpeculativeJIT::cachedGetById): |
| (JSC::DFG::SpeculativeJIT::cachedPutById): |
| (JSC::DFG::SpeculativeJIT::compile): |
| * heap/MarkStack.cpp: |
| (JSC::visitChildren): |
| * interpreter/Interpreter.cpp: |
| (JSC::Interpreter::tryCacheGetByID): |
| (JSC::Interpreter::privateExecute): |
| * jit/JIT.cpp: |
| (JSC::JIT::privateCompileMainPass): |
| (JSC::JIT::privateCompileSlowCases): |
| (JSC::PropertyStubCompilationInfo::copyToStubInfo): |
| * jit/JIT.h: |
| (JSC::PropertyStubCompilationInfo::PropertyStubCompilationInfo): |
| (JSC::JIT::compileGetByIdProto): |
| (JSC::JIT::compileGetByIdSelfList): |
| (JSC::JIT::compileGetByIdProtoList): |
| (JSC::JIT::compileGetByIdChainList): |
| (JSC::JIT::compileGetByIdChain): |
| (JSC::JIT::compilePutByIdTransition): |
| (JIT): |
| * jit/JITInlineMethods.h: |
| (JSC::JIT::emitAllocateBasicJSObject): |
| * jit/JITOpcodes.cpp: |
| (JSC::JIT::emit_op_resolve_global): |
| * jit/JITOpcodes32_64.cpp: |
| (JSC::JIT::emit_op_resolve_global): |
| * jit/JITPropertyAccess.cpp: |
| (JSC::JIT::compileGetDirectOffset): |
| (JSC::JIT::emit_op_method_check): |
| (JSC::JIT::compileGetByIdHotPath): |
| (JSC::JIT::emit_op_put_by_id): |
| (JSC::JIT::compilePutDirectOffset): |
| (JSC::JIT::privateCompilePutByIdTransition): |
| (JSC::JIT::patchGetByIdSelf): |
| (JSC::JIT::patchPutByIdReplace): |
| (JSC::JIT::privateCompileGetByIdProto): |
| (JSC::JIT::privateCompileGetByIdSelfList): |
| (JSC::JIT::privateCompileGetByIdProtoList): |
| (JSC::JIT::privateCompileGetByIdChainList): |
| (JSC::JIT::privateCompileGetByIdChain): |
| * jit/JITPropertyAccess32_64.cpp: |
| (JSC::JIT::emit_op_method_check): |
| (JSC::JIT::compileGetByIdHotPath): |
| (JSC::JIT::emit_op_put_by_id): |
| (JSC::JIT::compilePutDirectOffset): |
| (JSC::JIT::compileGetDirectOffset): |
| (JSC::JIT::privateCompilePutByIdTransition): |
| (JSC::JIT::patchGetByIdSelf): |
| (JSC::JIT::patchPutByIdReplace): |
| (JSC::JIT::privateCompileGetByIdProto): |
| (JSC::JIT::privateCompileGetByIdSelfList): |
| (JSC::JIT::privateCompileGetByIdProtoList): |
| (JSC::JIT::privateCompileGetByIdChainList): |
| (JSC::JIT::privateCompileGetByIdChain): |
| (JSC::JIT::emit_op_get_by_pname): |
| * jit/JITStubs.cpp: |
| (JSC::JITThunks::tryCacheGetByID): |
| (JSC::DEFINE_STUB_FUNCTION): |
| * llint/LLIntSlowPaths.cpp: |
| (JSC::LLInt::LLINT_SLOW_PATH_DECL): |
| * llint/LowLevelInterpreter.asm: |
| * llint/LowLevelInterpreter32_64.asm: |
| * llint/LowLevelInterpreter64.asm: |
| * offlineasm/x86.rb: |
| * runtime/JSGlobalObject.h: |
| (JSGlobalObject): |
| (JSC::JSGlobalObject::functionNameOffset): |
| * runtime/JSObject.cpp: |
| (JSC::JSObject::visitChildren): |
| (JSC): |
| (JSC::JSFinalObject::visitChildren): |
| (JSC::JSObject::put): |
| (JSC::JSObject::deleteProperty): |
| (JSC::JSObject::getPropertySpecificValue): |
| (JSC::JSObject::removeDirect): |
| (JSC::JSObject::growOutOfLineStorage): |
| (JSC::JSObject::getOwnPropertyDescriptor): |
| * runtime/JSObject.h: |
| (JSObject): |
| (JSC::JSObject::getDirect): |
| (JSC::JSObject::getDirectLocation): |
| (JSC::JSObject::hasInlineStorage): |
| (JSC::JSObject::inlineStorageUnsafe): |
| (JSC::JSObject::inlineStorage): |
| (JSC::JSObject::outOfLineStorage): |
| (JSC::JSObject::locationForOffset): |
| (JSC::JSObject::offsetForLocation): |
| (JSC::JSObject::getDirectOffset): |
| (JSC::JSObject::putDirectOffset): |
| (JSC::JSObject::putUndefinedAtDirectOffset): |
| (JSC::JSObject::addressOfOutOfLineStorage): |
| (JSC::JSObject::finishCreation): |
| (JSC::JSNonFinalObject::JSNonFinalObject): |
| (JSC::JSNonFinalObject::finishCreation): |
| (JSFinalObject): |
| (JSC::JSFinalObject::finishCreation): |
| (JSC::JSFinalObject::JSFinalObject): |
| (JSC::JSObject::offsetOfOutOfLineStorage): |
| (JSC::JSObject::setOutOfLineStorage): |
| (JSC::JSObject::JSObject): |
| (JSC): |
| (JSC::JSCell::fastGetOwnProperty): |
| (JSC::JSObject::putDirectInternal): |
| (JSC::JSObject::setStructureAndReallocateStorageIfNecessary): |
| (JSC::JSObject::putDirectWithoutTransition): |
| (JSC::offsetRelativeToPatchedStorage): |
| (JSC::indexRelativeToBase): |
| (JSC::offsetRelativeToBase): |
| * runtime/JSPropertyNameIterator.cpp: |
| (JSC::JSPropertyNameIterator::create): |
| * runtime/JSPropertyNameIterator.h: |
| (JSPropertyNameIterator): |
| (JSC::JSPropertyNameIterator::getOffset): |
| (JSC::JSPropertyNameIterator::finishCreation): |
| * runtime/JSValue.cpp: |
| (JSC::JSValue::putToPrimitive): |
| * runtime/Operations.h: |
| (JSC::normalizePrototypeChain): |
| * runtime/Options.cpp: |
| (JSC): |
| (JSC::Options::initialize): |
| * runtime/PropertyMapHashTable.h: |
| (PropertyMapEntry): |
| (JSC::PropertyMapEntry::PropertyMapEntry): |
| (PropertyTable): |
| (JSC::PropertyTable::PropertyTable): |
| (JSC::PropertyTable::getDeletedOffset): |
| (JSC::PropertyTable::addDeletedOffset): |
| (JSC::PropertyTable::nextOffset): |
| (JSC): |
| (JSC::PropertyTable::sizeInMemory): |
| * runtime/PropertyOffset.h: Added. |
| (JSC): |
| (JSC::checkOffset): |
| (JSC::validateOffset): |
| (JSC::isValidOffset): |
| (JSC::isInlineOffset): |
| (JSC::isOutOfLineOffset): |
| (JSC::offsetInInlineStorage): |
| (JSC::offsetInOutOfLineStorage): |
| (JSC::offsetInRespectiveStorage): |
| (JSC::numberOfOutOfLineSlotsForLastOffset): |
| (JSC::numberOfSlotsForLastOffset): |
| (JSC::nextPropertyOffsetFor): |
| (JSC::firstPropertyOffsetFor): |
| * runtime/PropertySlot.h: |
| (JSC::PropertySlot::cachedOffset): |
| (JSC::PropertySlot::setValue): |
| (JSC::PropertySlot::setCacheableGetterSlot): |
| (JSC::PropertySlot::clearOffset): |
| * runtime/PutPropertySlot.h: |
| (JSC::PutPropertySlot::setExistingProperty): |
| (JSC::PutPropertySlot::setNewProperty): |
| (JSC::PutPropertySlot::cachedOffset): |
| (PutPropertySlot): |
| * runtime/Structure.cpp: |
| (JSC::Structure::Structure): |
| (JSC::Structure::materializePropertyMap): |
| (JSC::nextOutOfLineStorageCapacity): |
| (JSC::Structure::growOutOfLineCapacity): |
| (JSC::Structure::suggestedNewOutOfLineStorageCapacity): |
| (JSC::Structure::addPropertyTransitionToExistingStructure): |
| (JSC::Structure::addPropertyTransition): |
| (JSC::Structure::removePropertyTransition): |
| (JSC::Structure::flattenDictionaryStructure): |
| (JSC::Structure::addPropertyWithoutTransition): |
| (JSC::Structure::removePropertyWithoutTransition): |
| (JSC::Structure::copyPropertyTableForPinning): |
| (JSC::Structure::get): |
| (JSC::Structure::putSpecificValue): |
| (JSC::Structure::remove): |
| * runtime/Structure.h: |
| (Structure): |
| (JSC::Structure::putWillGrowOutOfLineStorage): |
| (JSC::Structure::previousID): |
| (JSC::Structure::outOfLineCapacity): |
| (JSC::Structure::outOfLineSizeForKnownFinalObject): |
| (JSC::Structure::outOfLineSizeForKnownNonFinalObject): |
| (JSC::Structure::outOfLineSize): |
| (JSC::Structure::hasInlineStorage): |
| (JSC::Structure::inlineCapacity): |
| (JSC::Structure::inlineSizeForKnownFinalObject): |
| (JSC::Structure::inlineSize): |
| (JSC::Structure::totalStorageSize): |
| (JSC::Structure::totalStorageCapacity): |
| (JSC::Structure::firstValidOffset): |
| (JSC::Structure::lastValidOffset): |
| (JSC::Structure::isValidOffset): |
| (JSC::Structure::isEmpty): |
| (JSC::Structure::transitionCount): |
| (JSC::Structure::get): |
| |
| 2012-07-05 Oliver Hunt <oliver@apple.com> |
| |
| JSObjectCallAsFunction should thisConvert the provided thisObject |
| https://bugs.webkit.org/show_bug.cgi?id=90628 |
| |
| Reviewed by Gavin Barraclough. |
| |
| Perform this conversion on the provided this object. |
| |
| * API/JSObjectRef.cpp: |
| (JSObjectCallAsFunction): |
| |
| 2012-07-05 Zoltan Herczeg <zherczeg@webkit.org> |
| |
| [Qt] Unreviewed buildfix after r121886. Typo fix. |
| |
| * assembler/MacroAssemblerARM.cpp: |
| (JSC::MacroAssemblerARM::load32WithUnalignedHalfWords): |
| |
| 2012-07-05 Zoltan Herczeg <zherczeg@webkit.org> |
| |
| Port DFG JIT to traditional ARM |
| https://bugs.webkit.org/show_bug.cgi?id=90198 |
| |
| Reviewed by Filip Pizlo. |
| |
| This patch contains the macro assembler part of the |
| DFG JIT support on ARM systems with fixed 32 bit instruction |
| width. A large amount of old code was refactored, and the ARMv4 |
| or lower support is removed from the macro assembler. |
| |
| Sunspider is improved by 8%, and V8 is 92%. |
| |
| * assembler/ARMAssembler.cpp: |
| (JSC::ARMAssembler::dataTransfer32): |
| (JSC::ARMAssembler::baseIndexTransfer32): |
| (JSC): |
| (JSC::ARMAssembler::dataTransfer16): |
| (JSC::ARMAssembler::baseIndexTransfer16): |
| (JSC::ARMAssembler::dataTransferFloat): |
| (JSC::ARMAssembler::baseIndexTransferFloat): |
| (JSC::ARMAssembler::executableCopy): |
| * assembler/ARMAssembler.h: |
| (JSC::ARMAssembler::ARMAssembler): |
| (JSC::ARMAssembler::emitInst): |
| (JSC::ARMAssembler::vmov_f64_r): |
| (ARMAssembler): |
| (JSC::ARMAssembler::vabs_f64_r): |
| (JSC::ARMAssembler::vneg_f64_r): |
| (JSC::ARMAssembler::ldr_imm): |
| (JSC::ARMAssembler::ldr_un_imm): |
| (JSC::ARMAssembler::dtr_u): |
| (JSC::ARMAssembler::dtr_ur): |
| (JSC::ARMAssembler::dtr_d): |
| (JSC::ARMAssembler::dtr_dr): |
| (JSC::ARMAssembler::dtrh_u): |
| (JSC::ARMAssembler::dtrh_ur): |
| (JSC::ARMAssembler::dtrh_d): |
| (JSC::ARMAssembler::dtrh_dr): |
| (JSC::ARMAssembler::fdtr_u): |
| (JSC::ARMAssembler::fdtr_d): |
| (JSC::ARMAssembler::push_r): |
| (JSC::ARMAssembler::pop_r): |
| (JSC::ARMAssembler::poke_r): |
| (JSC::ARMAssembler::peek_r): |
| (JSC::ARMAssembler::vmov_vfp64_r): |
| (JSC::ARMAssembler::vmov_arm64_r): |
| (JSC::ARMAssembler::vmov_vfp32_r): |
| (JSC::ARMAssembler::vmov_arm32_r): |
| (JSC::ARMAssembler::vcvt_u32_f64_r): |
| (JSC::ARMAssembler::vcvt_f64_f32_r): |
| (JSC::ARMAssembler::vcvt_f32_f64_r): |
| (JSC::ARMAssembler::clz_r): |
| (JSC::ARMAssembler::bkpt): |
| (JSC::ARMAssembler::bx): |
| (JSC::ARMAssembler::blx): |
| (JSC::ARMAssembler::labelIgnoringWatchpoints): |
| (JSC::ARMAssembler::labelForWatchpoint): |
| (JSC::ARMAssembler::label): |
| (JSC::ARMAssembler::getLdrImmAddress): |
| (JSC::ARMAssembler::replaceWithJump): |
| (JSC::ARMAssembler::maxJumpReplacementSize): |
| (JSC::ARMAssembler::getOp2Byte): |
| (JSC::ARMAssembler::getOp2Half): |
| (JSC::ARMAssembler::RM): |
| (JSC::ARMAssembler::RS): |
| (JSC::ARMAssembler::RD): |
| (JSC::ARMAssembler::RN): |
| * assembler/AssemblerBufferWithConstantPool.h: |
| (JSC::AssemblerBufferWithConstantPool::ensureSpaceForAnyInstruction): |
| * assembler/MacroAssemblerARM.cpp: |
| (JSC::MacroAssemblerARM::load32WithUnalignedHalfWords): |
| * assembler/MacroAssemblerARM.h: |
| (JSC::MacroAssemblerARM::add32): |
| (MacroAssemblerARM): |
| (JSC::MacroAssemblerARM::and32): |
| (JSC::MacroAssemblerARM::lshift32): |
| (JSC::MacroAssemblerARM::mul32): |
| (JSC::MacroAssemblerARM::neg32): |
| (JSC::MacroAssemblerARM::rshift32): |
| (JSC::MacroAssemblerARM::urshift32): |
| (JSC::MacroAssemblerARM::xor32): |
| (JSC::MacroAssemblerARM::load8): |
| (JSC::MacroAssemblerARM::load8Signed): |
| (JSC::MacroAssemblerARM::load16): |
| (JSC::MacroAssemblerARM::load16Signed): |
| (JSC::MacroAssemblerARM::load32): |
| (JSC::MacroAssemblerARM::load32WithAddressOffsetPatch): |
| (JSC::MacroAssemblerARM::store32WithAddressOffsetPatch): |
| (JSC::MacroAssemblerARM::store8): |
| (JSC::MacroAssemblerARM::store16): |
| (JSC::MacroAssemblerARM::store32): |
| (JSC::MacroAssemblerARM::move): |
| (JSC::MacroAssemblerARM::jump): |
| (JSC::MacroAssemblerARM::branchAdd32): |
| (JSC::MacroAssemblerARM::mull32): |
| (JSC::MacroAssemblerARM::branchMul32): |
| (JSC::MacroAssemblerARM::nearCall): |
| (JSC::MacroAssemblerARM::compare32): |
| (JSC::MacroAssemblerARM::test32): |
| (JSC::MacroAssemblerARM::sub32): |
| (JSC::MacroAssemblerARM::call): |
| (JSC::MacroAssemblerARM::loadFloat): |
| (JSC::MacroAssemblerARM::loadDouble): |
| (JSC::MacroAssemblerARM::storeFloat): |
| (JSC::MacroAssemblerARM::storeDouble): |
| (JSC::MacroAssemblerARM::moveDouble): |
| (JSC::MacroAssemblerARM::addDouble): |
| (JSC::MacroAssemblerARM::divDouble): |
| (JSC::MacroAssemblerARM::subDouble): |
| (JSC::MacroAssemblerARM::mulDouble): |
| (JSC::MacroAssemblerARM::absDouble): |
| (JSC::MacroAssemblerARM::negateDouble): |
| (JSC::MacroAssemblerARM::convertInt32ToDouble): |
| (JSC::MacroAssemblerARM::convertFloatToDouble): |
| (JSC::MacroAssemblerARM::convertDoubleToFloat): |
| (JSC::MacroAssemblerARM::branchTruncateDoubleToInt32): |
| (JSC::MacroAssemblerARM::branchTruncateDoubleToUint32): |
| (JSC::MacroAssemblerARM::truncateDoubleToInt32): |
| (JSC::MacroAssemblerARM::truncateDoubleToUint32): |
| (JSC::MacroAssemblerARM::branchConvertDoubleToInt32): |
| (JSC::MacroAssemblerARM::branchDoubleNonZero): |
| (JSC::MacroAssemblerARM::branchDoubleZeroOrNaN): |
| (JSC::MacroAssemblerARM::invert): |
| (JSC::MacroAssemblerARM::replaceWithJump): |
| (JSC::MacroAssemblerARM::maxJumpReplacementSize): |
| (JSC::MacroAssemblerARM::call32): |
| * assembler/SH4Assembler.h: |
| (JSC::SH4Assembler::label): |
| * dfg/DFGAssemblyHelpers.h: |
| (JSC::DFG::AssemblyHelpers::debugCall): |
| (JSC::DFG::AssemblyHelpers::boxDouble): |
| (JSC::DFG::AssemblyHelpers::unboxDouble): |
| * dfg/DFGCCallHelpers.h: |
| (CCallHelpers): |
| (JSC::DFG::CCallHelpers::setupArguments): |
| * dfg/DFGFPRInfo.h: |
| (DFG): |
| * dfg/DFGGPRInfo.h: |
| (DFG): |
| (GPRInfo): |
| * dfg/DFGOperations.cpp: |
| (JSC): |
| * dfg/DFGSpeculativeJIT.h: |
| (SpeculativeJIT): |
| (JSC::DFG::SpeculativeJIT::appendCallWithExceptionCheckSetResult): |
| (JSC::DFG::SpeculativeJIT::appendCallSetResult): |
| * jit/JITStubs.cpp: |
| (JSC): |
| * jit/JITStubs.h: |
| (JITStackFrame): |
| * jit/JSInterfaceJIT.h: |
| (JSInterfaceJIT): |
| |
| 2012-07-04 Anthony Scian <ascian@rim.com> |
| |
| Web Inspector [JSC]: Implement ScriptCallStack::stackTrace |
| https://bugs.webkit.org/show_bug.cgi?id=40118 |
| |
| Reviewed by Yong Li. |
| |
| Added member functions to expose function name, urlString, and line #. |
| Refactored toString to make use of these member functions to reduce |
| duplicated code for future maintenance. |
| |
| Manually tested refactoring of toString by tracing thrown exceptions. |
| |
| * interpreter/Interpreter.h: |
| (JSC::StackFrame::toString): |
| (JSC::StackFrame::friendlySourceURL): |
| (JSC::StackFrame::friendlyFunctionName): |
| (JSC::StackFrame::friendlyLineNumber): |
| |
| 2012-07-04 Andy Wingo <wingo@igalia.com> |
| |
| [GTK] Enable parallel GC |
| https://bugs.webkit.org/show_bug.cgi?id=90568 |
| |
| Reviewed by Martin Robinson. |
| |
| * runtime/Options.cpp: Include <algorithm.h> for std::min. |
| |
| 2012-07-04 John Mellor <johnme@chromium.org> |
| |
| Text Autosizing: Add compile flag and runtime setting |
| https://bugs.webkit.org/show_bug.cgi?id=87394 |
| |
| This patch renames Font Boosting to Text Autosizing. |
| |
| Reviewed by Adam Barth. |
| |
| * Configurations/FeatureDefines.xcconfig: |
| |
| 2012-07-03 Michael Saboff <msaboff@apple.com> |
| |
| Enh: Hash Const JSString in Backing Stores to Save Memory |
| https://bugs.webkit.org/show_bug.cgi?id=86024 |
| |
| Reviewed by Oliver Hunt. |
| |
| During garbage collection, each marking thread keeps a HashMap of |
| strings. While visiting via MarkStack::copyAndAppend(), we check to |
| see if the string we are visiting is already in the HashMap. If not |
| we add it. If so, we change the reference to the current string we're |
| visiting to the prior string. |
| |
| To reduce the performance impact of this change, two throttles have |
| ben added. 1) We only try hash consting if a significant number of new |
| strings have been created since the last hash const. Currently this is |
| set at 100 strings. 2) If a string is unique at the end of a marking |
| it will not be checked during further GC phases. In some cases this |
| won't catch all duplicates, but we are trying to catch the growth of |
| duplicate strings. |
| |
| * heap/Heap.cpp: |
| (JSC::Heap::markRoots): |
| * heap/MarkStack.cpp: |
| (JSC::MarkStackThreadSharedData::resetChildren): |
| (JSC::MarkStackThreadSharedData::MarkStackThreadSharedData): |
| (JSC::MarkStackThreadSharedData::reset): |
| (JSC::MarkStack::setup): Check to see if enough strings have been created |
| to hash const. |
| (JSC::MarkStack::reset): Added call to clear m_uniqueStrings. |
| (JSC::JSString::tryHashConstLock): New method to lock JSString for |
| hash consting. |
| (JSC::JSString::releaseHashConstLock): New unlock method. |
| (JSC::JSString::shouldTryHashConst): Set of checks to see if we should |
| try to hash const the string. |
| (JSC::MarkStack::internalAppend): New method that performs the hash consting. |
| (JSC::SlotVisitor::copyAndAppend): Changed to call the new hash |
| consting internalAppend(). |
| * heap/MarkStack.h: |
| (MarkStackThreadSharedData): |
| (MarkStack): |
| * runtime/JSGlobalData.cpp: |
| (JSC::JSGlobalData::JSGlobalData): |
| * runtime/JSGlobalData.h: |
| (JSGlobalData): |
| (JSC::JSGlobalData::haveEnoughNewStringsToHashConst): |
| (JSC::JSGlobalData::resetNewStringsSinceLastHashConst): |
| * runtime/JSString.h: |
| (JSString): Changed from using bool flags to using an unsigned |
| m_flags field. This works better with the weakCompareAndSwap in |
| JSString::tryHashConstLock(). Changed the 8bitness setting and |
| checking to use new accessors. |
| (JSC::JSString::JSString): |
| (JSC::JSString::finishCreation): |
| (JSC::JSString::is8Bit): Updated for new m_flags. |
| (JSC::JSString::setIs8Bit): New setter. |
| New hash const flags accessors: |
| (JSC::JSString::isHashConstSingleton): |
| (JSC::JSString::clearHashConstSingleton): |
| (JSC::JSString::setHashConstSingleton): |
| (JSC::JSRopeString::finishCreation): |
| (JSC::JSRopeString::append): |
| |
| 2012-07-03 Tony Chang <tony@chromium.org> |
| |
| [chromium] Unreviewed, update .gitignore to handle VS2010 files. |
| |
| * JavaScriptCore.gyp/.gitignore: |
| |
| 2012-07-03 Mark Lam <mark.lam@apple.com> |
| |
| Add ability to symbolically set and dump JSC VM options. |
| See comments in runtime/Options.h for details on how the options work. |
| https://bugs.webkit.org/show_bug.cgi?id=90420 |
| |
| Reviewed by Filip Pizlo. |
| |
| * assembler/LinkBuffer.cpp: |
| (JSC::LinkBuffer::finalizeCodeWithDisassembly): |
| * assembler/LinkBuffer.h: |
| (JSC): |
| * bytecode/CodeBlock.cpp: |
| (JSC::CodeBlock::shouldOptimizeNow): |
| * bytecode/CodeBlock.h: |
| (JSC::CodeBlock::likelyToTakeSlowCase): |
| (JSC::CodeBlock::couldTakeSlowCase): |
| (JSC::CodeBlock::likelyToTakeSpecialFastCase): |
| (JSC::CodeBlock::likelyToTakeDeepestSlowCase): |
| (JSC::CodeBlock::likelyToTakeAnySlowCase): |
| (JSC::CodeBlock::jitAfterWarmUp): |
| (JSC::CodeBlock::jitSoon): |
| (JSC::CodeBlock::reoptimizationRetryCounter): |
| (JSC::CodeBlock::countReoptimization): |
| (JSC::CodeBlock::counterValueForOptimizeAfterWarmUp): |
| (JSC::CodeBlock::counterValueForOptimizeAfterLongWarmUp): |
| (JSC::CodeBlock::optimizeSoon): |
| (JSC::CodeBlock::exitCountThresholdForReoptimization): |
| (JSC::CodeBlock::exitCountThresholdForReoptimizationFromLoop): |
| * bytecode/ExecutionCounter.h: |
| (JSC::ExecutionCounter::clippedThreshold): |
| * dfg/DFGByteCodeParser.cpp: |
| (JSC::DFG::ByteCodeParser::handleInlining): |
| * dfg/DFGCapabilities.h: |
| (JSC::DFG::mightCompileEval): |
| (JSC::DFG::mightCompileProgram): |
| (JSC::DFG::mightCompileFunctionForCall): |
| (JSC::DFG::mightCompileFunctionForConstruct): |
| (JSC::DFG::mightInlineFunctionForCall): |
| (JSC::DFG::mightInlineFunctionForConstruct): |
| * dfg/DFGCommon.h: |
| (JSC::DFG::shouldShowDisassembly): |
| * dfg/DFGDriver.cpp: |
| (JSC::DFG::compile): |
| * dfg/DFGOSRExit.cpp: |
| (JSC::DFG::OSRExit::considerAddingAsFrequentExitSiteSlow): |
| * dfg/DFGVariableAccessData.h: |
| (JSC::DFG::VariableAccessData::shouldUseDoubleFormatAccordingToVote): |
| * heap/MarkStack.cpp: |
| (JSC::MarkStackSegmentAllocator::allocate): |
| (JSC::MarkStackSegmentAllocator::shrinkReserve): |
| (JSC::MarkStackArray::MarkStackArray): |
| (JSC::MarkStackThreadSharedData::MarkStackThreadSharedData): |
| (JSC::SlotVisitor::donateKnownParallel): |
| (JSC::SlotVisitor::drain): |
| (JSC::SlotVisitor::drainFromShared): |
| * heap/MarkStack.h: |
| (JSC::MarkStack::mergeOpaqueRootsIfProfitable): |
| (JSC::MarkStack::addOpaqueRoot): |
| * heap/SlotVisitor.h: |
| (JSC::SlotVisitor::donate): |
| * jit/JIT.cpp: |
| (JSC::JIT::emitOptimizationCheck): |
| * jsc.cpp: |
| (printUsageStatement): |
| (parseArguments): |
| * runtime/InitializeThreading.cpp: |
| (JSC::initializeThreadingOnce): |
| * runtime/JSGlobalData.cpp: |
| (JSC::enableAssembler): |
| * runtime/JSGlobalObject.cpp: |
| (JSC::JSGlobalObject::JSGlobalObject): |
| * runtime/Options.cpp: |
| (JSC): |
| (JSC::overrideOptionWithHeuristic): |
| (JSC::Options::initialize): |
| (JSC::Options::setOption): |
| (JSC::Options::dumpAllOptions): |
| (JSC::Options::dumpOption): |
| * runtime/Options.h: |
| (JSC): |
| (Options): |
| (EntryInfo): |
| |
| 2012-07-03 Jocelyn Turcotte <jocelyn.turcotte@nokia.com> Joel Dillon <joel.dillon@codethink.co.uk> |
| |
| [Qt][Win] Fix broken QtWebKit5.lib linking |
| https://bugs.webkit.org/show_bug.cgi?id=88321 |
| |
| Reviewed by Kenneth Rohde Christiansen. |
| |
| The goal is to have different ports build systems define STATICALLY_LINKED_WITH_WTF |
| when building JavaScriptCore, if both are packaged in the same DLL, instead |
| of relying on the code to handle this. |
| The effects of BUILDING_* and STATICALLY_LINKED_WITH_* are currently the same |
| except for a check in Source/JavaScriptCore/config.h. |
| |
| Keeping the old way for the WX port as requested by the port's contributors. |
| For non-Windows ports there is no difference between IMPORT and EXPORT, no |
| change is needed. |
| |
| * API/JSBase.h: |
| JS symbols shouldn't be included by WTF objects anymore. Remove the export when BUILDING_WTF. |
| * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCoreCommon.vsprops: |
| Make sure that JavaScriptCore uses import symbols of WTF for the Win port. |
| * runtime/JSExportMacros.h: |
| |
| 2012-07-02 Filip Pizlo <fpizlo@apple.com> |
| |
| DFG OSR exit value recoveries should be computed lazily |
| https://bugs.webkit.org/show_bug.cgi?id=82155 |
| |
| Reviewed by Gavin Barraclough. |
| |
| This change aims to reduce one aspect of DFG compile times: the fact |
| that we currently compute the value recoveries for each local and |
| argument on every speculation check. We compile many speculation checks, |
| so this can add up quick. The strategy that this change takes is to |
| have the DFG save just enough information about how the compiler is |
| choosing to represent state, that the DFG::OSRExitCompiler can reify |
| the value recoveries lazily. |
| |
| This appears to be an 0.3% SunSpider speed-up and is neutral elsewhere. |
| |
| I also took the opportunity to fix the sampling regions profiler (it |
| was missing an export macro) and to put in more sampling regions in |
| the DFG (which are disabled so long as ENABLE(SAMPLING_REGIONS) is |
| false). |
| |
| * CMakeLists.txt: |
| * GNUmakefile.list.am: |
| * JavaScriptCore.xcodeproj/project.pbxproj: |
| * Target.pri: |
| * bytecode/CodeBlock.cpp: |
| (JSC): |
| (JSC::CodeBlock::shrinkDFGDataToFit): |
| * bytecode/CodeBlock.h: |
| (CodeBlock): |
| (JSC::CodeBlock::minifiedDFG): |
| (JSC::CodeBlock::variableEventStream): |
| (DFGData): |
| * bytecode/Operands.h: |
| (JSC::Operands::hasOperand): |
| (Operands): |
| (JSC::Operands::size): |
| (JSC::Operands::at): |
| (JSC::Operands::operator[]): |
| (JSC::Operands::isArgument): |
| (JSC::Operands::isVariable): |
| (JSC::Operands::argumentForIndex): |
| (JSC::Operands::variableForIndex): |
| (JSC::Operands::operandForIndex): |
| (JSC): |
| (JSC::dumpOperands): |
| * bytecode/SamplingTool.h: |
| (SamplingRegion): |
| * dfg/DFGByteCodeParser.cpp: |
| (JSC::DFG::parse): |
| * dfg/DFGCFAPhase.cpp: |
| (JSC::DFG::performCFA): |
| * dfg/DFGCSEPhase.cpp: |
| (JSC::DFG::performCSE): |
| * dfg/DFGFixupPhase.cpp: |
| (JSC::DFG::performFixup): |
| * dfg/DFGGenerationInfo.h: |
| (JSC::DFG::GenerationInfo::GenerationInfo): |
| (JSC::DFG::GenerationInfo::initConstant): |
| (JSC::DFG::GenerationInfo::initInteger): |
| (JSC::DFG::GenerationInfo::initJSValue): |
| (JSC::DFG::GenerationInfo::initCell): |
| (JSC::DFG::GenerationInfo::initBoolean): |
| (JSC::DFG::GenerationInfo::initDouble): |
| (JSC::DFG::GenerationInfo::initStorage): |
| (GenerationInfo): |
| (JSC::DFG::GenerationInfo::noticeOSRBirth): |
| (JSC::DFG::GenerationInfo::use): |
| (JSC::DFG::GenerationInfo::spill): |
| (JSC::DFG::GenerationInfo::setSpilled): |
| (JSC::DFG::GenerationInfo::fillJSValue): |
| (JSC::DFG::GenerationInfo::fillCell): |
| (JSC::DFG::GenerationInfo::fillInteger): |
| (JSC::DFG::GenerationInfo::fillBoolean): |
| (JSC::DFG::GenerationInfo::fillDouble): |
| (JSC::DFG::GenerationInfo::fillStorage): |
| (JSC::DFG::GenerationInfo::appendFill): |
| (JSC::DFG::GenerationInfo::appendSpill): |
| * dfg/DFGJITCompiler.cpp: |
| (JSC::DFG::JITCompiler::link): |
| (JSC::DFG::JITCompiler::compile): |
| (JSC::DFG::JITCompiler::compileFunction): |
| * dfg/DFGMinifiedGraph.h: Added. |
| (DFG): |
| (MinifiedGraph): |
| (JSC::DFG::MinifiedGraph::MinifiedGraph): |
| (JSC::DFG::MinifiedGraph::at): |
| (JSC::DFG::MinifiedGraph::append): |
| (JSC::DFG::MinifiedGraph::prepareAndShrink): |
| (JSC::DFG::MinifiedGraph::setOriginalGraphSize): |
| (JSC::DFG::MinifiedGraph::originalGraphSize): |
| * dfg/DFGMinifiedNode.cpp: Added. |
| (DFG): |
| (JSC::DFG::MinifiedNode::fromNode): |
| * dfg/DFGMinifiedNode.h: Added. |
| (DFG): |
| (JSC::DFG::belongsInMinifiedGraph): |
| (MinifiedNode): |
| (JSC::DFG::MinifiedNode::MinifiedNode): |
| (JSC::DFG::MinifiedNode::index): |
| (JSC::DFG::MinifiedNode::op): |
| (JSC::DFG::MinifiedNode::hasChild1): |
| (JSC::DFG::MinifiedNode::child1): |
| (JSC::DFG::MinifiedNode::hasConstant): |
| (JSC::DFG::MinifiedNode::hasConstantNumber): |
| (JSC::DFG::MinifiedNode::constantNumber): |
| (JSC::DFG::MinifiedNode::hasWeakConstant): |
| (JSC::DFG::MinifiedNode::weakConstant): |
| (JSC::DFG::MinifiedNode::getIndex): |
| (JSC::DFG::MinifiedNode::compareByNodeIndex): |
| (JSC::DFG::MinifiedNode::hasChild): |
| * dfg/DFGNode.h: |
| (Node): |
| * dfg/DFGOSRExit.cpp: |
| (JSC::DFG::OSRExit::OSRExit): |
| * dfg/DFGOSRExit.h: |
| (OSRExit): |
| * dfg/DFGOSRExitCompiler.cpp: |
| * dfg/DFGOSRExitCompiler.h: |
| (OSRExitCompiler): |
| * dfg/DFGOSRExitCompiler32_64.cpp: |
| (JSC::DFG::OSRExitCompiler::compileExit): |
| * dfg/DFGOSRExitCompiler64.cpp: |
| (JSC::DFG::OSRExitCompiler::compileExit): |
| * dfg/DFGPredictionPropagationPhase.cpp: |
| (JSC::DFG::performPredictionPropagation): |
| * dfg/DFGRedundantPhiEliminationPhase.cpp: |
| (JSC::DFG::performRedundantPhiElimination): |
| * dfg/DFGSpeculativeJIT.cpp: |
| (JSC::DFG::SpeculativeJIT::SpeculativeJIT): |
| (DFG): |
| (JSC::DFG::SpeculativeJIT::fillStorage): |
| (JSC::DFG::SpeculativeJIT::noticeOSRBirth): |
| (JSC::DFG::SpeculativeJIT::compileMovHint): |
| (JSC::DFG::SpeculativeJIT::compile): |
| (JSC::DFG::SpeculativeJIT::computeValueRecoveryFor): |
| * dfg/DFGSpeculativeJIT.h: |
| (DFG): |
| (JSC::DFG::SpeculativeJIT::use): |
| (SpeculativeJIT): |
| (JSC::DFG::SpeculativeJIT::spill): |
| (JSC::DFG::SpeculativeJIT::speculationCheck): |
| (JSC::DFG::SpeculativeJIT::forwardSpeculationCheck): |
| (JSC::DFG::SpeculativeJIT::recordSetLocal): |
| * dfg/DFGSpeculativeJIT32_64.cpp: |
| (JSC::DFG::SpeculativeJIT::fillInteger): |
| (JSC::DFG::SpeculativeJIT::fillDouble): |
| (JSC::DFG::SpeculativeJIT::fillJSValue): |
| (JSC::DFG::SpeculativeJIT::fillSpeculateIntInternal): |
| (JSC::DFG::SpeculativeJIT::fillSpeculateDouble): |
| (JSC::DFG::SpeculativeJIT::fillSpeculateCell): |
| (JSC::DFG::SpeculativeJIT::fillSpeculateBoolean): |
| (JSC::DFG::SpeculativeJIT::compile): |
| * dfg/DFGSpeculativeJIT64.cpp: |
| (JSC::DFG::SpeculativeJIT::fillInteger): |
| (JSC::DFG::SpeculativeJIT::fillDouble): |
| (JSC::DFG::SpeculativeJIT::fillJSValue): |
| (JSC::DFG::SpeculativeJIT::fillSpeculateIntInternal): |
| (JSC::DFG::SpeculativeJIT::fillSpeculateDouble): |
| (JSC::DFG::SpeculativeJIT::fillSpeculateCell): |
| (JSC::DFG::SpeculativeJIT::fillSpeculateBoolean): |
| (JSC::DFG::SpeculativeJIT::compile): |
| * dfg/DFGValueRecoveryOverride.h: Added. |
| (DFG): |
| (ValueRecoveryOverride): |
| (JSC::DFG::ValueRecoveryOverride::ValueRecoveryOverride): |
| * dfg/DFGValueSource.cpp: Added. |
| (DFG): |
| (JSC::DFG::ValueSource::dump): |
| * dfg/DFGValueSource.h: Added. |
| (DFG): |
| (JSC::DFG::dataFormatToValueSourceKind): |
| (JSC::DFG::valueSourceKindToDataFormat): |
| (JSC::DFG::isInRegisterFile): |
| (ValueSource): |
| (JSC::DFG::ValueSource::ValueSource): |
| (JSC::DFG::ValueSource::forPrediction): |
| (JSC::DFG::ValueSource::forDataFormat): |
| (JSC::DFG::ValueSource::isSet): |
| (JSC::DFG::ValueSource::kind): |
| (JSC::DFG::ValueSource::isInRegisterFile): |
| (JSC::DFG::ValueSource::dataFormat): |
| (JSC::DFG::ValueSource::valueRecovery): |
| (JSC::DFG::ValueSource::nodeIndex): |
| (JSC::DFG::ValueSource::nodeIndexFromKind): |
| (JSC::DFG::ValueSource::kindFromNodeIndex): |
| * dfg/DFGVariableEvent.cpp: Added. |
| (DFG): |
| (JSC::DFG::VariableEvent::dump): |
| (JSC::DFG::VariableEvent::dumpFillInfo): |
| (JSC::DFG::VariableEvent::dumpSpillInfo): |
| * dfg/DFGVariableEvent.h: Added. |
| (DFG): |
| (VariableEvent): |
| (JSC::DFG::VariableEvent::VariableEvent): |
| (JSC::DFG::VariableEvent::reset): |
| (JSC::DFG::VariableEvent::fillGPR): |
| (JSC::DFG::VariableEvent::fillPair): |
| (JSC::DFG::VariableEvent::fillFPR): |
| (JSC::DFG::VariableEvent::spill): |
| (JSC::DFG::VariableEvent::death): |
| (JSC::DFG::VariableEvent::setLocal): |
| (JSC::DFG::VariableEvent::movHint): |
| (JSC::DFG::VariableEvent::kind): |
| (JSC::DFG::VariableEvent::nodeIndex): |
| (JSC::DFG::VariableEvent::dataFormat): |
| (JSC::DFG::VariableEvent::gpr): |
| (JSC::DFG::VariableEvent::tagGPR): |
| (JSC::DFG::VariableEvent::payloadGPR): |
| (JSC::DFG::VariableEvent::fpr): |
| (JSC::DFG::VariableEvent::virtualRegister): |
| (JSC::DFG::VariableEvent::operand): |
| (JSC::DFG::VariableEvent::variableRepresentation): |
| * dfg/DFGVariableEventStream.cpp: Added. |
| (DFG): |
| (JSC::DFG::VariableEventStream::logEvent): |
| (MinifiedGenerationInfo): |
| (JSC::DFG::MinifiedGenerationInfo::MinifiedGenerationInfo): |
| (JSC::DFG::MinifiedGenerationInfo::update): |
| (JSC::DFG::VariableEventStream::reconstruct): |
| * dfg/DFGVariableEventStream.h: Added. |
| (DFG): |
| (VariableEventStream): |
| (JSC::DFG::VariableEventStream::appendAndLog): |
| * dfg/DFGVirtualRegisterAllocationPhase.cpp: |
| (JSC::DFG::performVirtualRegisterAllocation): |
| |
| 2012-07-02 Filip Pizlo <fpizlo@apple.com> |
| |
| DFG::ArgumentsSimplificationPhase should assert that the PhantomArguments nodes it creates are not shouldGenerate() |
| https://bugs.webkit.org/show_bug.cgi?id=90407 |
| |
| Reviewed by Mark Hahnenberg. |
| |
| * dfg/DFGArgumentsSimplificationPhase.cpp: |
| (JSC::DFG::ArgumentsSimplificationPhase::run): |
| |
| 2012-07-02 Gavin Barraclough <barraclough@apple.com> |
| |
| Array.prototype.pop should throw if property is not configurable |
| https://bugs.webkit.org/show_bug.cgi?id=75788 |
| |
| Rubber Stamped by Oliver Hunt. |
| |
| No real bug here any more, but the error we throw sometimes has a misleading message. |
| |
| * runtime/JSArray.cpp: |
| (JSC::JSArray::pop): |
| |
| 2012-06-29 Filip Pizlo <fpizlo@apple.com> |
| |
| JSObject wastes too much memory on unused property slots |
| https://bugs.webkit.org/show_bug.cgi?id=90255 |
| |
| Reviewed by Mark Hahnenberg. |
| |
| Rolling back in after applying a simple fix: it appears that |
| JSObject::setStructureAndReallocateStorageIfNecessary() was allocating more |
| property storage than necessary. Fixing this appears to resolve the crash. |
| |
| This does a few things: |
| |
| - JSNonFinalObject no longer has inline property storage. |
| |
| - Initial out-of-line property storage size is 4 slots for JSNonFinalObject, |
| or 2x the inline storage for JSFinalObject. |
| |
| - Property storage is only reallocated if it needs to be. Previously, we |
| would reallocate the property storage on any transition where the original |
| structure said shouldGrowProperyStorage(), but this led to spurious |
| reallocations when doing transitionless property adds and there are |
| deleted property slots available. That in turn led to crashes, because we |
| would switch to out-of-line storage even if the capacity matched the |
| criteria for inline storage. |
| |
| - Inline JSFunction allocation is killed off because we don't have a good |
| way of inlining property storage allocation. This didn't hurt performance. |
| Killing off code is better than fixing it if that code wasn't doing any |
| good. |
| |
| This looks like a 1% progression on V8. |
| |
| * interpreter/Interpreter.cpp: |
| (JSC::Interpreter::privateExecute): |
| * jit/JIT.cpp: |
| (JSC::JIT::privateCompileSlowCases): |
| * jit/JIT.h: |
| * jit/JITInlineMethods.h: |
| (JSC::JIT::emitAllocateBasicJSObject): |
| (JSC): |
| * jit/JITOpcodes.cpp: |
| (JSC::JIT::emit_op_new_func): |
| (JSC): |
| (JSC::JIT::emit_op_new_func_exp): |
| * runtime/JSFunction.cpp: |
| (JSC::JSFunction::finishCreation): |
| * runtime/JSObject.h: |
| (JSC::JSObject::isUsingInlineStorage): |
| (JSObject): |
| (JSC::JSObject::finishCreation): |
| (JSC): |
| (JSC::JSNonFinalObject::hasInlineStorage): |
| (JSNonFinalObject): |
| (JSC::JSNonFinalObject::JSNonFinalObject): |
| (JSC::JSNonFinalObject::finishCreation): |
| (JSC::JSFinalObject::hasInlineStorage): |
| (JSC::JSFinalObject::finishCreation): |
| (JSC::JSObject::offsetOfInlineStorage): |
| (JSC::JSObject::setPropertyStorage): |
| (JSC::Structure::inlineStorageCapacity): |
| (JSC::Structure::isUsingInlineStorage): |
| (JSC::JSObject::putDirectInternal): |
| (JSC::JSObject::setStructureAndReallocateStorageIfNecessary): |
| (JSC::JSObject::putDirectWithoutTransition): |
| * runtime/Structure.cpp: |
| (JSC::Structure::Structure): |
| (JSC::nextPropertyStorageCapacity): |
| (JSC): |
| (JSC::Structure::growPropertyStorageCapacity): |
| (JSC::Structure::suggestedNewPropertyStorageSize): |
| * runtime/Structure.h: |
| (JSC::Structure::putWillGrowPropertyStorage): |
| (Structure): |
| |
| 2012-06-29 Filip Pizlo <fpizlo@apple.com> |
| |
| Webkit crashes in DFG on Google Docs when creating a new document |
| https://bugs.webkit.org/show_bug.cgi?id=90209 |
| |
| Reviewed by Gavin Barraclough. |
| |
| Don't attempt to short-circuit Phantom(GetLocal) if the GetLocal is for a |
| captured variable. |
| |
| * dfg/DFGCFGSimplificationPhase.cpp: |
| (JSC::DFG::CFGSimplificationPhase::mergeBlocks): |
| |
| 2012-06-30 Zan Dobersek <zandobersek@gmail.com> |
| |
| Unreviewed, rolling out r121605. |
| http://trac.webkit.org/changeset/121605 |
| https://bugs.webkit.org/show_bug.cgi?id=90336 |
| |
| Changes caused flaky crashes in sputnik/Unicode tests on Apple |
| WK1 and GTK Linux builders |
| |
| * interpreter/Interpreter.cpp: |
| (JSC::Interpreter::privateExecute): |
| * jit/JIT.cpp: |
| (JSC::JIT::privateCompileSlowCases): |
| * jit/JIT.h: |
| * jit/JITInlineMethods.h: |
| (JSC::JIT::emitAllocateBasicJSObject): |
| (JSC::JIT::emitAllocateJSFinalObject): |
| (JSC): |
| (JSC::JIT::emitAllocateJSFunction): |
| * jit/JITOpcodes.cpp: |
| (JSC::JIT::emit_op_new_func): |
| (JSC::JIT::emitSlow_op_new_func): |
| (JSC): |
| (JSC::JIT::emit_op_new_func_exp): |
| (JSC::JIT::emitSlow_op_new_func_exp): |
| * runtime/JSFunction.cpp: |
| (JSC::JSFunction::finishCreation): |
| * runtime/JSObject.h: |
| (JSC::JSObject::isUsingInlineStorage): |
| (JSObject): |
| (JSC::JSObject::finishCreation): |
| (JSC): |
| (JSNonFinalObject): |
| (JSC::JSNonFinalObject::JSNonFinalObject): |
| (JSC::JSNonFinalObject::finishCreation): |
| (JSFinalObject): |
| (JSC::JSFinalObject::finishCreation): |
| (JSC::JSObject::offsetOfInlineStorage): |
| (JSC::JSObject::setPropertyStorage): |
| (JSC::Structure::isUsingInlineStorage): |
| (JSC::JSObject::putDirectInternal): |
| (JSC::JSObject::putDirectWithoutTransition): |
| (JSC::JSObject::transitionTo): |
| * runtime/Structure.cpp: |
| (JSC::Structure::Structure): |
| (JSC): |
| (JSC::Structure::growPropertyStorageCapacity): |
| (JSC::Structure::suggestedNewPropertyStorageSize): |
| * runtime/Structure.h: |
| (JSC::Structure::shouldGrowPropertyStorage): |
| (JSC::Structure::propertyStorageSize): |
| |
| 2012-06-29 Mark Hahnenberg <mhahnenberg@apple.com> |
| |
| Remove warning about protected values when the Heap is being destroyed |
| https://bugs.webkit.org/show_bug.cgi?id=90302 |
| |
| Reviewed by Geoffrey Garen. |
| |
| Having to do book-keeping about whether values allocated from a certain |
| VM are or are not protected makes the JSC API much more difficult to use |
| correctly. Clients should be able to throw an entire VM away and not have |
| to worry about unprotecting all of the values that they protected earlier. |
| |
| * heap/Heap.cpp: |
| (JSC::Heap::lastChanceToFinalize): |
| |
| 2012-06-29 Filip Pizlo <fpizlo@apple.com> |
| |
| JSObject wastes too much memory on unused property slots |
| https://bugs.webkit.org/show_bug.cgi?id=90255 |
| |
| Reviewed by Mark Hahnenberg. |
| |
| This does a few things: |
| |
| - JSNonFinalObject no longer has inline property storage. |
| |
| - Initial out-of-line property storage size is 4 slots for JSNonFinalObject, |
| or 2x the inline storage for JSFinalObject. |
| |
| - Property storage is only reallocated if it needs to be. Previously, we |
| would reallocate the property storage on any transition where the original |
| structure said shouldGrowProperyStorage(), but this led to spurious |
| reallocations when doing transitionless property adds and there are |
| deleted property slots available. That in turn led to crashes, because we |
| would switch to out-of-line storage even if the capacity matched the |
| criteria for inline storage. |
| |
| - Inline JSFunction allocation is killed off because we don't have a good |
| way of inlining property storage allocation. This didn't hurt performance. |
| Killing off code is better than fixing it if that code wasn't doing any |
| good. |
| |
| This looks like a 1% progression on V8. |
| |
| * interpreter/Interpreter.cpp: |
| (JSC::Interpreter::privateExecute): |
| * jit/JIT.cpp: |
| (JSC::JIT::privateCompileSlowCases): |
| * jit/JIT.h: |
| * jit/JITInlineMethods.h: |
| (JSC::JIT::emitAllocateBasicJSObject): |
| (JSC): |
| * jit/JITOpcodes.cpp: |
| (JSC::JIT::emit_op_new_func): |
| (JSC): |
| (JSC::JIT::emit_op_new_func_exp): |
| * runtime/JSFunction.cpp: |
| (JSC::JSFunction::finishCreation): |
| * runtime/JSObject.h: |
| (JSC::JSObject::isUsingInlineStorage): |
| (JSObject): |
| (JSC::JSObject::finishCreation): |
| (JSC): |
| (JSC::JSNonFinalObject::hasInlineStorage): |
| (JSNonFinalObject): |
| (JSC::JSNonFinalObject::JSNonFinalObject): |
| (JSC::JSNonFinalObject::finishCreation): |
| (JSC::JSFinalObject::hasInlineStorage): |
| (JSC::JSFinalObject::finishCreation): |
| (JSC::JSObject::offsetOfInlineStorage): |
| (JSC::JSObject::setPropertyStorage): |
| (JSC::Structure::inlineStorageCapacity): |
| (JSC::Structure::isUsingInlineStorage): |
| (JSC::JSObject::putDirectInternal): |
| (JSC::JSObject::setStructureAndReallocateStorageIfNecessary): |
| (JSC::JSObject::putDirectWithoutTransition): |
| * runtime/Structure.cpp: |
| (JSC::Structure::Structure): |
| (JSC::nextPropertyStorageCapacity): |
| (JSC): |
| (JSC::Structure::growPropertyStorageCapacity): |
| (JSC::Structure::suggestedNewPropertyStorageSize): |
| * runtime/Structure.h: |
| (JSC::Structure::putWillGrowPropertyStorage): |
| (Structure): |
| |
| 2012-06-28 Filip Pizlo <fpizlo@apple.com> |
| |
| DFG recompilation heuristics should be based on count, not rate |
| https://bugs.webkit.org/show_bug.cgi?id=90146 |
| |
| Reviewed by Oliver Hunt. |
| |
| This removes a bunch of code that was previously trying to prevent spurious |
| reoptimizations if a large enough majority of executions of a code block did |
| not result in OSR exit. It turns out that this code was purely harmful. This |
| patch removes all of that logic and replaces it with a dead-simple |
| heuristic: if you exit more than N times (where N is an exponential function |
| of the number of times the code block has already been recompiled) then we |
| will recompile. |
| |
| This appears to be a broad ~1% win on many benchmarks large and small. |
| |
| * bytecode/CodeBlock.cpp: |
| (JSC::CodeBlock::CodeBlock): |
| * bytecode/CodeBlock.h: |
| (JSC::CodeBlock::osrExitCounter): |
| (JSC::CodeBlock::countOSRExit): |
| (CodeBlock): |
| (JSC::CodeBlock::addressOfOSRExitCounter): |
| (JSC::CodeBlock::offsetOfOSRExitCounter): |
| (JSC::CodeBlock::adjustedExitCountThreshold): |
| (JSC::CodeBlock::exitCountThresholdForReoptimization): |
| (JSC::CodeBlock::exitCountThresholdForReoptimizationFromLoop): |
| (JSC::CodeBlock::shouldReoptimizeNow): |
| (JSC::CodeBlock::shouldReoptimizeFromLoopNow): |
| * bytecode/ExecutionCounter.cpp: |
| (JSC::ExecutionCounter::setThreshold): |
| * bytecode/ExecutionCounter.h: |
| (ExecutionCounter): |
| (JSC::ExecutionCounter::clippedThreshold): |
| * dfg/DFGJITCompiler.cpp: |
| (JSC::DFG::JITCompiler::compileBody): |
| * dfg/DFGOSRExit.cpp: |
| (JSC::DFG::OSRExit::considerAddingAsFrequentExitSiteSlow): |
| * dfg/DFGOSRExitCompiler.cpp: |
| (JSC::DFG::OSRExitCompiler::handleExitCounts): |
| * dfg/DFGOperations.cpp: |
| * jit/JITStubs.cpp: |
| (JSC::DEFINE_STUB_FUNCTION): |
| * runtime/Options.cpp: |
| (Options): |
| (JSC::Options::initializeOptions): |
| * runtime/Options.h: |
| (Options): |
| |
| 2012-06-28 Mark Lam <mark.lam@apple.com> |
| |
| Adding a commenting utility to record BytecodeGenerator comments |
| with opcodes that are emitted. Presently, the comments can only |
| be constant strings. Adding comments for opcodes is optional. |
| If a comment is added, the comment will be printed following the |
| opcode when CodeBlock::dump() is called. |
| |
| This utility is disabled by default, and is only meant for VM |
| development purposes. It should not be enabled for product builds. |
| |
| To enable this utility, set ENABLE_BYTECODE_COMMENTS in CodeBlock.h |
| to 1. |
| |
| https://bugs.webkit.org/show_bug.cgi?id=90095 |
| |
| Reviewed by Geoffrey Garen. |
| |
| * GNUmakefile.list.am: |
| * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: |
| * JavaScriptCore.xcodeproj/project.pbxproj: |
| * bytecode/CodeBlock.cpp: |
| (JSC::CodeBlock::dumpBytecodeCommentAndNewLine): Dumps the comment. |
| (JSC): |
| (JSC::CodeBlock::printUnaryOp): Add comment dumps. |
| (JSC::CodeBlock::printBinaryOp): Add comment dumps. |
| (JSC::CodeBlock::printConditionalJump): Add comment dumps. |
| (JSC::CodeBlock::printCallOp): Add comment dumps. |
| (JSC::CodeBlock::printPutByIdOp): Add comment dumps. |
| (JSC::CodeBlock::dump): Add comment dumps. |
| (JSC::CodeBlock::CodeBlock): |
| (JSC::CodeBlock::commentForBytecodeOffset): |
| Finds the comment for an opcode if available. |
| (JSC::CodeBlock::dumpBytecodeComments): |
| For debugging whether comments are collected. |
| It is not being called anywhere. |
| * bytecode/CodeBlock.h: |
| (CodeBlock): |
| (JSC::CodeBlock::bytecodeComments): |
| * bytecode/Comment.h: Added. |
| (JSC): |
| (Comment): |
| * bytecompiler/BytecodeGenerator.cpp: |
| (JSC::BytecodeGenerator::BytecodeGenerator): |
| (JSC::BytecodeGenerator::emitOpcode): Calls emitComment(). |
| (JSC): |
| (JSC::BytecodeGenerator::emitComment): Adds comment to CodeBlock. |
| (JSC::BytecodeGenerator::prependComment): |
| Registers a comment for emitComemnt() to use later. |
| * bytecompiler/BytecodeGenerator.h: |
| (BytecodeGenerator): |
| (JSC::BytecodeGenerator::emitComment): |
| (JSC::BytecodeGenerator::prependComment): |
| These are inlined versions of these functions that nullify them |
| when ENABLE_BYTECODE_COMMENTS is 0. |
| (JSC::BytecodeGenerator::comments): |
| |
| 2012-06-28 Oliver Hunt <oliver@apple.com> |
| |
| 32bit DFG incorrectly claims an fpr is fillable even if it has not been proven double |
| https://bugs.webkit.org/show_bug.cgi?id=90127 |
| |
| Reviewed by Filip Pizlo. |
| |
| The 32-bit version of fillSpeculateDouble doesn't handle Number->fpr loads |
| correctly. This patch fixes this by killing the fill info in the GenerationInfo |
| when the spillFormat doesn't guarantee the value is a double. |
| |
| * dfg/DFGSpeculativeJIT32_64.cpp: |
| (JSC::DFG::SpeculativeJIT::fillSpeculateDouble): |
| |
| 2012-06-28 Kent Tamura <tkent@chromium.org> |
| |
| Classify form control states by their owner forms |
| https://bugs.webkit.org/show_bug.cgi?id=89950 |
| |
| Reviewed by Hajime Morita. |
| |
| * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.def: |
| Expose WTF::StringBuilder::canShrink() |
| |
| 2012-06-27 Michael Saboff <msaboff@apple.com> |
| |
| [Win] jscore-tests flakey |
| https://bugs.webkit.org/show_bug.cgi?id=88118 |
| |
| Reviewed by Jessie Berlin. |
| |
| jsDriver.pl on windows intermittently doesn't get the returned value from jsc, |
| instead it gets 126. Added a new option to jsc (-x) which prints the exit |
| code before exiting. jsDriver.pl uses this option on Windows and parses the |
| exit code output for the exit code, removing it before comparing the actual |
| and expected outputs. Filed a follow on "FIXME" defect: |
| [WIN] Intermittent failure for jsc return value to propagate through jsDriver.pl |
| https://bugs.webkit.org/show_bug.cgi?id=90119 |
| |
| * jsc.cpp: |
| (CommandLine::CommandLine): |
| (CommandLine): |
| (printUsageStatement): |
| (parseArguments): |
| (jscmain): |
| * tests/mozilla/jsDriver.pl: |
| (execute_tests): |
| |
| 2012-06-27 Sheriff Bot <webkit.review.bot@gmail.com> |
| |
| Unreviewed, rolling out r121359. |
| http://trac.webkit.org/changeset/121359 |
| https://bugs.webkit.org/show_bug.cgi?id=90115 |
| |
| Broke many inspector tests (Requested by jpfau on #webkit). |
| |
| * interpreter/Interpreter.h: |
| (JSC::StackFrame::toString): |
| |
| 2012-06-27 Filip Pizlo <fpizlo@apple.com> |
| |
| Javascript SHA-512 gives wrong hash on second and subsequent runs unless Web Inspector Javascript Debugging is on |
| https://bugs.webkit.org/show_bug.cgi?id=90053 |
| <rdar://problem/11764613> |
| |
| Reviewed by Mark Hahnenberg. |
| |
| The problem is that the code was assuming that the recovery should be Undefined if the source of |
| the SetLocal was !shouldGenerate(). But that's wrong, since the DFG optimizer may skip around a |
| UInt32ToNumber node (hence making it !shouldGenerate()) and keep the source of that node alive. |
| In that case we should base the recovery on the source of the UInt32ToNumber. The logic for this |
| was already in place but the fast check for !shouldGenerate() broke it. |
| |
| * dfg/DFGSpeculativeJIT.cpp: |
| (JSC::DFG::SpeculativeJIT::computeValueRecoveryFor): |
| |
| 2012-06-27 Filip Pizlo <fpizlo@apple.com> |
| |
| DFG disassembly should be easier to read |
| https://bugs.webkit.org/show_bug.cgi?id=90106 |
| |
| Reviewed by Mark Hahnenberg. |
| |
| Did a few things: |
| |
| - Options::showDFGDisassembly now shows OSR exit disassembly as well. |
| |
| - Phi node dumping doesn't attempt to do line wrapping since it just made the dump harder |
| to read. |
| |
| - DFG graph disassembly view shows a few additional node types that turn out to be |
| essential for understanding OSR exits. |
| |
| Put together, these changes reinforce the philosophy that anything needed for computing |
| OSR exit is just as important as the machine code itself. Of course, we still don't take |
| that philosophy to its full extreme - for example Phantom nodes are not dumped. We may |
| revisit that in the future. |
| |
| * assembler/LinkBuffer.cpp: |
| (JSC::LinkBuffer::finalizeCodeWithDisassembly): |
| * assembler/LinkBuffer.h: |
| (JSC): |
| * dfg/DFGDisassembler.cpp: |
| (JSC::DFG::Disassembler::dump): |
| * dfg/DFGGraph.cpp: |
| (JSC::DFG::Graph::dumpBlockHeader): |
| * dfg/DFGNode.h: |
| (JSC::DFG::Node::willHaveCodeGenOrOSR): |
| * dfg/DFGOSRExitCompiler.cpp: |
| * jit/JIT.cpp: |
| (JSC::JIT::privateCompile): |
| |
| 2012-06-25 Mark Hahnenberg <mhahnenberg@apple.com> |
| |
| JSLock should be per-JSGlobalData |
| https://bugs.webkit.org/show_bug.cgi?id=89123 |
| |
| Reviewed by Geoffrey Garen. |
| |
| * API/APIShims.h: |
| (APIEntryShimWithoutLock): |
| (JSC::APIEntryShimWithoutLock::APIEntryShimWithoutLock): Added an extra parameter to the constructor to |
| determine whether we should ref the JSGlobalData or not. We want to ref all the time except for in the |
| HeapTimer class because timerDidFire could run after somebody has started to tear down that particular |
| JSGlobalData, so we wouldn't want to resurrect the ref count of that JSGlobalData from 0 back to 1 after |
| its destruction has begun. |
| (JSC::APIEntryShimWithoutLock::~APIEntryShimWithoutLock): |
| (JSC::APIEntryShim::APIEntryShim): |
| (APIEntryShim): |
| (JSC::APIEntryShim::~APIEntryShim): |
| (JSC::APIEntryShim::init): Factored out common initialization code for the various APIEntryShim constructors. |
| Also moved the timeoutChecker stop and start here because we need to start after we've grabbed the API lock |
| and before we've released it, which can only done in APIEntryShim. |
| (JSC::APICallbackShim::~APICallbackShim): We no longer need to synchronize here. |
| * API/JSContextRef.cpp: |
| (JSGlobalContextCreate): |
| (JSGlobalContextCreateInGroup): |
| (JSGlobalContextRelease): |
| (JSContextCreateBacktrace): |
| * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.def: |
| * heap/CopiedSpace.cpp: |
| (JSC::CopiedSpace::tryAllocateSlowCase): |
| * heap/Heap.cpp: |
| (JSC::Heap::protect): |
| (JSC::Heap::unprotect): |
| (JSC::Heap::collect): |
| (JSC::Heap::setActivityCallback): |
| (JSC::Heap::activityCallback): |
| (JSC::Heap::sweeper): |
| * heap/Heap.h: Changed m_activityCallback and m_sweeper to be raw pointers rather than OwnPtrs because they |
| are now responsible for their own lifetime. Also changed the order of declaration of the GCActivityCallback |
| and the IncrementalSweeper to make sure they're the last things that get initialized during construction to |
| prevent any issues with uninitialized memory in the JSGlobalData/Heap they might care about. |
| (Heap): |
| * heap/HeapTimer.cpp: Refactored to allow for thread-safe operation and shutdown. |
| (JSC::HeapTimer::~HeapTimer): |
| (JSC::HeapTimer::invalidate): |
| (JSC): |
| (JSC::HeapTimer::didStartVMShutdown): Called at the beginning of ~JSGlobalData. If we're on the same thread |
| that the HeapTimer is running on, we kill the HeapTimer ourselves. If not, then we set some state in the |
| HeapTimer and schedule it to fire immediately so that it can notice and kill itself. |
| (JSC::HeapTimer::timerDidFire): We grab our mutex and check our JSGlobalData pointer. If it has been zero-ed |
| out, then we know the VM has started to shutdown and we should kill ourselves. Otherwise, grab the APIEntryShim, |
| but without ref-ing the JSGlobalData (we don't want to bring the JSGlobalData's ref-count from 0 to 1) in case |
| we were interrupted between releasing our mutex and trying to grab the APILock. |
| * heap/HeapTimer.h: |
| (HeapTimer): |
| * heap/IncrementalSweeper.cpp: |
| (JSC::IncrementalSweeper::doWork): We no longer need the API shim here since HeapTimer::timerDidFire handles |
| all of that for us. |
| (JSC::IncrementalSweeper::create): |
| * heap/IncrementalSweeper.h: |
| (IncrementalSweeper): |
| * heap/MarkedAllocator.cpp: |
| (JSC::MarkedAllocator::allocateSlowCase): |
| * heap/WeakBlock.cpp: |
| (JSC::WeakBlock::reap): |
| * jsc.cpp: |
| (functionGC): |
| (functionReleaseExecutableMemory): |
| (jscmain): |
| * runtime/Completion.cpp: |
| (JSC::checkSyntax): |
| (JSC::evaluate): |
| * runtime/GCActivityCallback.h: |
| (DefaultGCActivityCallback): |
| (JSC::DefaultGCActivityCallback::create): |
| * runtime/JSGlobalData.cpp: |
| (JSC::JSGlobalData::JSGlobalData): |
| (JSC::JSGlobalData::~JSGlobalData): Signals to the two HeapTimers (GCActivityCallback and IncrementalSweeper) |
| that the VM has started shutting down. It then waits until the HeapTimer is done with whatever activity |
| it needs to do before continuing with any further destruction. Also asserts that we do not currently hold the |
| APILock because this could potentially cause deadlock when we try to signal to the HeapTimers using their mutexes. |
| (JSC::JSGlobalData::sharedInstance): Protect the initialization for the shared instance with the GlobalJSLock. |
| (JSC::JSGlobalData::sharedInstanceInternal): |
| * runtime/JSGlobalData.h: Change to be ThreadSafeRefCounted so that we don't have to worry about refing and |
| de-refing JSGlobalDatas on separate threads since we don't do it that often anyways. |
| (JSGlobalData): |
| (JSC::JSGlobalData::apiLock): |
| * runtime/JSGlobalObject.cpp: |
| (JSC::JSGlobalObject::~JSGlobalObject): |
| (JSC::JSGlobalObject::init): |
| * runtime/JSLock.cpp: |
| (JSC): |
| (JSC::GlobalJSLock::GlobalJSLock): For accessing the shared instance. |
| (JSC::GlobalJSLock::~GlobalJSLock): |
| (JSC::JSLockHolder::JSLockHolder): MutexLocker for JSLock. Also refs the JSGlobalData to keep it alive so that |
| it can successfully unlock it later without it disappearing from underneath it. |
| (JSC::JSLockHolder::~JSLockHolder): |
| (JSC::JSLock::JSLock): |
| (JSC::JSLock::~JSLock): |
| (JSC::JSLock::lock): Uses the spin lock for guarding the lock count and owner thread fields. Uses the mutex for |
| actually waiting for long periods. |
| (JSC::JSLock::unlock): |
| (JSC::JSLock::currentThreadIsHoldingLock): |
| (JSC::JSLock::dropAllLocks): |
| (JSC::JSLock::dropAllLocksUnconditionally): |
| (JSC::JSLock::grabAllLocks): |
| (JSC::JSLock::DropAllLocks::DropAllLocks): |
| (JSC::JSLock::DropAllLocks::~DropAllLocks): |
| * runtime/JSLock.h: |
| (JSC): |
| (GlobalJSLock): |
| (JSLockHolder): |
| (JSLock): |
| (DropAllLocks): |
| * runtime/WeakGCMap.h: |
| (JSC::WeakGCMap::set): |
| * testRegExp.cpp: |
| (realMain): |
| |
| 2012-06-27 Filip Pizlo <fpizlo@apple.com> |
| |
| x86 disassembler confuses immediates with addresses |
| https://bugs.webkit.org/show_bug.cgi?id=90099 |
| |
| Reviewed by Mark Hahnenberg. |
| |
| Prepend "$" to immediates to disambiguate between immediates and addresses. This is in |
| accordance with the gas and AT&T syntax. |
| |
| * disassembler/udis86/udis86_syn-att.c: |
| (gen_operand): |
| |
| 2012-06-27 Filip Pizlo <fpizlo@apple.com> |
| |
| Add a comment clarifying Options::showDisassembly versus Options::showDFGDisassembly. |
| |
| Rubber stamped by Mark Hahnenberg. |
| |
| * runtime/Options.cpp: |
| (JSC::Options::initializeOptions): |
| |
| 2012-06-27 Anthony Scian <ascian@rim.com> |
| |
| Web Inspector [JSC]: Implement ScriptCallStack::stackTrace |
| https://bugs.webkit.org/show_bug.cgi?id=40118 |
| |
| Reviewed by Yong Li. |
| |
| Added member functions to expose function name, urlString, and line #. |
| Refactored toString to make use of these member functions to reduce |
| duplicated code for future maintenance. |
| |
| Manually tested refactoring of toString by tracing thrown exceptions. |
| |
| * interpreter/Interpreter.h: |
| (StackFrame): |
| (JSC::StackFrame::toString): |
| (JSC::StackFrame::friendlySourceURL): |
| (JSC::StackFrame::friendlyFunctionName): |
| (JSC::StackFrame::friendlyLineNumber): |
| |
| 2012-06-27 Oswald Buddenhagen <oswald.buddenhagen@nokia.com> |
| |
| [Qt] Remove redundant c++11 warning suppression code |
| |
| This is already handled in default_post. |
| |
| Reviewed by Tor Arne Vestbø. |
| |
| * Target.pri: |
| |
| 2012-06-26 Tor Arne Vestbø <tor.arne.vestbo@nokia.com> |
| |
| [Qt] Add missing heades to HEADERS |
| |
| For JavaScriptCore there aren't any Qt specific files, so we include all |
| headers for easy editing in Qt Creator. |
| |
| Reviewed by Simon Hausmann. |
| |
| * Target.pri: |
| |
| 2012-06-26 Dominic Cooney <dominicc@chromium.org> |
| |
| [Chromium] Remove unused build scripts and empty folders for JavaScriptCore w/ gyp |
| https://bugs.webkit.org/show_bug.cgi?id=90029 |
| |
| Reviewed by Adam Barth. |
| |
| * gyp: Removed. |
| * gyp/generate-derived-sources.sh: Removed. |
| * gyp/generate-dtrace-header.sh: Removed. |
| * gyp/run-if-exists.sh: Removed. |
| * gyp/update-info-plist.sh: Removed. |
| |
| 2012-06-26 Geoffrey Garen <ggaren@apple.com> |
| |
| Reduced (but did not eliminate) use of "berzerker GC" |
| https://bugs.webkit.org/show_bug.cgi?id=89237 |
| |
| Reviewed by Gavin Barraclough. |
| |
| (PART 2) |
| |
| This part turns off "berzerker GC" and turns on incremental shrinking. |
| |
| * heap/IncrementalSweeper.cpp: |
| (JSC::IncrementalSweeper::doSweep): Free or shrink after sweeping to |
| maintain the behavior we used to get from the occasional berzerker GC, |
| which would run all finalizers and then free or shrink all blocks |
| synchronously. |
| |
| * heap/MarkedBlock.h: |
| (JSC::MarkedBlock::needsSweeping): Sweep zapped blocks, too. It's always |
| safe to sweep a zapped block (that's the point of zapping), and it's |
| sometimes profitable. For example, consider this case: Block A does some |
| allocation (transitioning Block A from Marked to FreeListed), then GC |
| happens (transitioning Block A to Zapped), then all objects in Block A |
| are free, then the incremental sweeper visits Block A. If we skipped |
| Zapped blocks, we'd skip Block A, even though it would be profitable to |
| run its destructors and free its memory. |
| |
| * runtime/GCActivityCallback.cpp: |
| (JSC::DefaultGCActivityCallback::doWork): Don't sweep eagerly; we'll do |
| this incrementally. |
| |
| 2012-06-26 Filip Pizlo <fpizlo@apple.com> |
| |
| DFG PutByValAlias is too aggressive |
| https://bugs.webkit.org/show_bug.cgi?id=90026 |
| <rdar://problem/11751830> |
| |
| Reviewed by Gavin Barraclough. |
| |
| For CSE on normal arrays, we now treat PutByVal as impure. This does not appear to affect |
| performance by much. |
| |
| For CSE on typed arrays, we fix PutByValAlias by making GetByVal speculate that the access |
| is within bounds. This also has the effect of making our out-of-bounds handling consistent |
| with WebCore. |
| |
| * dfg/DFGCSEPhase.cpp: |
| (JSC::DFG::CSEPhase::performNodeCSE): |
| * dfg/DFGGraph.h: |
| (JSC::DFG::Graph::byValIsPure): |
| (JSC::DFG::Graph::clobbersWorld): |
| * dfg/DFGNodeType.h: |
| (DFG): |
| * dfg/DFGSpeculativeJIT.cpp: |
| (JSC::DFG::SpeculativeJIT::compileGetByValOnIntTypedArray): |
| (JSC::DFG::SpeculativeJIT::compileGetByValOnFloatTypedArray): |
| |
| 2012-06-26 Yong Li <yoli@rim.com> |
| |
| [BlackBerry] Add JSC statistics into about:memory |
| https://bugs.webkit.org/show_bug.cgi?id=89779 |
| |
| Reviewed by Rob Buis. |
| |
| Fix non-JIT build on BlackBerry broken by r121196. |
| |
| * runtime/MemoryStatistics.cpp: |
| (JSC::globalMemoryStatistics): |
| |
| 2012-06-25 Filip Pizlo <fpizlo@apple.com> |
| |
| DFG::operationNewArray is unnecessarily slow, and may use the wrong array |
| prototype when inlined |
| https://bugs.webkit.org/show_bug.cgi?id=89821 |
| |
| Reviewed by Geoffrey Garen. |
| |
| Fixes all array allocations to use the right structure, and hence the right prototype. Adds |
| inlining of new Array(...) with a non-zero number of arguments. Optimizes allocations of |
| empty arrays. |
| |
| * dfg/DFGAbstractState.cpp: |
| (JSC::DFG::AbstractState::execute): |
| * dfg/DFGByteCodeParser.cpp: |
| (JSC::DFG::ByteCodeParser::handleConstantInternalFunction): |
| * dfg/DFGCCallHelpers.h: |
| (JSC::DFG::CCallHelpers::setupArgumentsWithExecState): |
| (CCallHelpers): |
| * dfg/DFGNodeType.h: |
| (DFG): |
| * dfg/DFGOperations.cpp: |
| * dfg/DFGOperations.h: |
| * dfg/DFGPredictionPropagationPhase.cpp: |
| (JSC::DFG::PredictionPropagationPhase::propagate): |
| * dfg/DFGSpeculativeJIT.h: |
| (JSC::DFG::SpeculativeJIT::callOperation): |
| * dfg/DFGSpeculativeJIT32_64.cpp: |
| (JSC::DFG::SpeculativeJIT::compile): |
| * dfg/DFGSpeculativeJIT64.cpp: |
| (JSC::DFG::SpeculativeJIT::compile): |
| * runtime/JSArray.h: |
| (JSC): |
| (JSC::constructArray): |
| * runtime/JSGlobalObject.h: |
| (JSC): |
| (JSC::constructArray): |
| |
| 2012-06-26 Filip Pizlo <fpizlo@apple.com> |
| |
| New fast/js/dfg-store-unexpected-value-into-argument-and-osr-exit.html fails on 32 bit |
| https://bugs.webkit.org/show_bug.cgi?id=89953 |
| |
| Reviewed by Zoltan Herczeg. |
| |
| DFG 32-bit JIT was confused about the difference between a predicted type and a |
| proven type. This is easy to get confused about, since a local that is predicted int32 |
| almost always means that the local must be an int32 since speculations are hoisted to |
| stores to locals. But that is less likely to be the case for arguments, where there is |
| an additional least-upper-bounding step: any store to an argument with a weird type |
| may force the argument to be any type. |
| |
| This patch basically duplicates the functionality in DFGSpeculativeJIT64.cpp for |
| GetLocal: the decision of whether to load a local as an int32 (or as an array, or as |
| a boolean) is made based on the AbstractValue::m_type, which is a type proof, rather |
| than the VariableAccessData::prediction(), which is a predicted type. |
| |
| * dfg/DFGSpeculativeJIT32_64.cpp: |
| (JSC::DFG::SpeculativeJIT::compile): |
| |
| 2012-06-25 Filip Pizlo <fpizlo@apple.com> |
| |
| JSC should try to make profiling deterministic because otherwise reproducing failures is |
| nearly impossible |
| https://bugs.webkit.org/show_bug.cgi?id=89940 |
| |
| Rubber stamped by Gavin Barraclough. |
| |
| This rolls out the part of http://trac.webkit.org/changeset/121215 that introduced randomness |
| into the system. Now, instead of randomizing the tier-up threshold, we always set it to an |
| artificially low (and statically predetermined!) value. This gives most of the benefit of |
| threshold randomization without actually making the system behave completely differently on |
| each invocation. |
| |
| * bytecode/ExecutionCounter.cpp: |
| (JSC::ExecutionCounter::setThreshold): |
| * runtime/Options.cpp: |
| (Options): |
| (JSC::Options::initializeOptions): |
| * runtime/Options.h: |
| (Options): |
| |
| 2012-06-22 Filip Pizlo <fpizlo@apple.com> |
| |
| Value profiling should use tier-up threshold randomization to get more coverage |
| https://bugs.webkit.org/show_bug.cgi?id=89802 |
| |
| Reviewed by Gavin Barraclough. |
| |
| This patch causes both LLInt and Baseline JIT code to take the OSR slow path several |
| times before actually doing OSR. If we take the OSR slow path before the execution |
| count threshold is reached, then we just call CodeBlock::updateAllPredictions() to |
| compute the current latest least-upper-bound SpecType of all values seen in each |
| ValueProfile. |
| |
| * bytecode/CodeBlock.cpp: |
| (JSC::CodeBlock::stronglyVisitStrongReferences): |
| (JSC::CodeBlock::updateAllPredictionsAndCountLiveness): |
| (JSC): |
| (JSC::CodeBlock::updateAllPredictions): |
| (JSC::CodeBlock::shouldOptimizeNow): |
| * bytecode/CodeBlock.h: |
| (JSC::CodeBlock::llintExecuteCounter): |
| (JSC::CodeBlock::jitExecuteCounter): |
| (CodeBlock): |
| (JSC::CodeBlock::updateAllPredictions): |
| * bytecode/ExecutionCounter.cpp: |
| (JSC::ExecutionCounter::setThreshold): |
| (JSC::ExecutionCounter::status): |
| (JSC): |
| * bytecode/ExecutionCounter.h: |
| (JSC::ExecutionCounter::count): |
| (ExecutionCounter): |
| * dfg/DFGAbstractState.cpp: |
| (JSC::DFG::AbstractState::execute): |
| * dfg/DFGOperations.cpp: |
| * dfg/DFGSpeculativeJIT.cpp: |
| (JSC::DFG::SpeculativeJIT::compile): |
| * jit/JITStubs.cpp: |
| (JSC::DEFINE_STUB_FUNCTION): |
| * llint/LLIntSlowPaths.cpp: |
| (JSC::LLInt::jitCompileAndSetHeuristics): |
| (JSC::LLInt::entryOSR): |
| (JSC::LLInt::LLINT_SLOW_PATH_DECL): |
| * runtime/JSGlobalObject.cpp: |
| (JSC::JSGlobalObject::JSGlobalObject): |
| (JSC): |
| * runtime/JSGlobalObject.h: |
| (JSGlobalObject): |
| (JSC::JSGlobalObject::weakRandomInteger): |
| * runtime/Options.cpp: |
| (Options): |
| (JSC::Options::initializeOptions): |
| * runtime/Options.h: |
| (Options): |
| * runtime/WeakRandom.h: |
| (WeakRandom): |
| (JSC::WeakRandom::seedUnsafe): |
| |
| 2012-06-25 Yong Li <yoli@rim.com> |
| |
| [BlackBerry] Add JSC statistics into about:memory |
| https://bugs.webkit.org/show_bug.cgi?id=89779 |
| |
| Reviewed by Rob Buis. |
| |
| Add MemoryStatistics.cpp into build, and fill JITBytes for BlackBerry port. |
| |
| * PlatformBlackBerry.cmake: |
| * runtime/MemoryStatistics.cpp: |
| (JSC::globalMemoryStatistics): |
| |
| 2012-06-23 Sheriff Bot <webkit.review.bot@gmail.com> |
| |
| Unreviewed, rolling out r121058. |
| http://trac.webkit.org/changeset/121058 |
| https://bugs.webkit.org/show_bug.cgi?id=89809 |
| |
| Patch causes plugins tests to crash in GTK debug builds |
| (Requested by zdobersek on #webkit). |
| |
| * API/APIShims.h: |
| (JSC::APIEntryShimWithoutLock::APIEntryShimWithoutLock): |
| (JSC::APIEntryShimWithoutLock::~APIEntryShimWithoutLock): |
| (APIEntryShimWithoutLock): |
| (JSC::APIEntryShim::APIEntryShim): |
| (APIEntryShim): |
| (JSC::APICallbackShim::~APICallbackShim): |
| * API/JSContextRef.cpp: |
| (JSGlobalContextCreate): |
| (JSGlobalContextCreateInGroup): |
| (JSGlobalContextRelease): |
| (JSContextCreateBacktrace): |
| * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.def: |
| * heap/CopiedSpace.cpp: |
| (JSC::CopiedSpace::tryAllocateSlowCase): |
| * heap/Heap.cpp: |
| (JSC::Heap::protect): |
| (JSC::Heap::unprotect): |
| (JSC::Heap::collect): |
| (JSC::Heap::setActivityCallback): |
| (JSC::Heap::activityCallback): |
| (JSC::Heap::sweeper): |
| * heap/Heap.h: |
| (Heap): |
| * heap/HeapTimer.cpp: |
| (JSC::HeapTimer::~HeapTimer): |
| (JSC::HeapTimer::invalidate): |
| (JSC::HeapTimer::timerDidFire): |
| (JSC): |
| * heap/HeapTimer.h: |
| (HeapTimer): |
| * heap/IncrementalSweeper.cpp: |
| (JSC::IncrementalSweeper::doWork): |
| (JSC::IncrementalSweeper::create): |
| * heap/IncrementalSweeper.h: |
| (IncrementalSweeper): |
| * heap/MarkedAllocator.cpp: |
| (JSC::MarkedAllocator::allocateSlowCase): |
| * heap/WeakBlock.cpp: |
| (JSC::WeakBlock::reap): |
| * jsc.cpp: |
| (functionGC): |
| (functionReleaseExecutableMemory): |
| (jscmain): |
| * runtime/Completion.cpp: |
| (JSC::checkSyntax): |
| (JSC::evaluate): |
| * runtime/GCActivityCallback.h: |
| (DefaultGCActivityCallback): |
| (JSC::DefaultGCActivityCallback::create): |
| * runtime/JSGlobalData.cpp: |
| (JSC::JSGlobalData::JSGlobalData): |
| (JSC::JSGlobalData::~JSGlobalData): |
| (JSC::JSGlobalData::sharedInstance): |
| (JSC::JSGlobalData::sharedInstanceInternal): |
| * runtime/JSGlobalData.h: |
| (JSGlobalData): |
| * runtime/JSGlobalObject.cpp: |
| (JSC::JSGlobalObject::~JSGlobalObject): |
| (JSC::JSGlobalObject::init): |
| * runtime/JSLock.cpp: |
| (JSC): |
| (JSC::createJSLockCount): |
| (JSC::JSLock::lockCount): |
| (JSC::setLockCount): |
| (JSC::JSLock::JSLock): |
| (JSC::JSLock::lock): |
| (JSC::JSLock::unlock): |
| (JSC::JSLock::currentThreadIsHoldingLock): |
| (JSC::JSLock::DropAllLocks::DropAllLocks): |
| (JSC::JSLock::DropAllLocks::~DropAllLocks): |
| * runtime/JSLock.h: |
| (JSC): |
| (JSLock): |
| (JSC::JSLock::JSLock): |
| (JSC::JSLock::~JSLock): |
| (DropAllLocks): |
| * runtime/WeakGCMap.h: |
| (JSC::WeakGCMap::set): |
| * testRegExp.cpp: |
| (realMain): |
| |
| 2012-06-22 Alexandru Chiculita <achicu@adobe.com> |
| |
| [CSS Shaders] Re-enable the CSS Shaders compile time flag on Safari Mac |
| https://bugs.webkit.org/show_bug.cgi?id=89781 |
| |
| Reviewed by Dean Jackson. |
| |
| Added ENABLE_CSS_SHADERS flag as enabled by default on Safari for Mac. |
| |
| * Configurations/FeatureDefines.xcconfig: |
| |
| 2012-06-22 Filip Pizlo <fpizlo@apple.com> |
| |
| DFG tier-up should happen in prologues, not epilogues |
| https://bugs.webkit.org/show_bug.cgi?id=89752 |
| |
| Reviewed by Geoffrey Garen. |
| |
| This change has two outcomes: |
| |
| 1) Slightly reduces the likelihood that a function will be optimized both |
| standalone and via inlining. Previously, if you had a call sequence like foo() |
| calls bar() exactly once, and nobody else calls bar(), then bar() would get |
| optimized first (because it returns first) and then foo() gets optimized. If foo() |
| can inline bar() then that means that bar() gets optimized twice. But now, if we |
| optimize in prologues, then foo() will be optimized first. If it inlines bar(), |
| that means that there will no longer be any calls to bar(). |
| |
| 2) It lets us kill some code in JITStubs. Epilogue tier-up was very different from |
| loop tier-up, since epilogue tier-up should not attempt OSR. But prologue tier-up |
| requires OSR (albeit really easy OSR since it's the top of the compilation unit), |
| so it becomes just like loop tier-up. As a result, we now have one optimization |
| hook (cti_optimize) instead of two (cti_optimize_from_loop and |
| cti_optimize_from_ret). |
| |
| As a consequence of not having an optimization check in epilogues, the OSR exit |
| code must now trigger reoptimization itself instead of just signaling the epilogue |
| check to fire. |
| |
| This also adds the ability to count the number of DFG compilations, which was |
| useful for debugging this patch and might be useful for other things in the future. |
| |
| * bytecode/CodeBlock.cpp: |
| (JSC::CodeBlock::reoptimize): |
| (JSC): |
| * bytecode/CodeBlock.h: |
| (CodeBlock): |
| * dfg/DFGByteCodeParser.cpp: |
| (JSC::DFG::ByteCodeParser::parseCodeBlock): |
| * dfg/DFGDriver.cpp: |
| (DFG): |
| (JSC::DFG::getNumCompilations): |
| (JSC::DFG::compile): |
| * dfg/DFGDriver.h: |
| (DFG): |
| * dfg/DFGOSRExitCompiler.cpp: |
| (JSC::DFG::OSRExitCompiler::handleExitCounts): |
| * dfg/DFGOperations.cpp: |
| * dfg/DFGOperations.h: |
| * jit/JIT.cpp: |
| (JSC::JIT::emitOptimizationCheck): |
| * jit/JIT.h: |
| * jit/JITCall32_64.cpp: |
| (JSC::JIT::emit_op_ret): |
| (JSC::JIT::emit_op_ret_object_or_this): |
| * jit/JITOpcodes.cpp: |
| (JSC::JIT::emit_op_ret): |
| (JSC::JIT::emit_op_ret_object_or_this): |
| (JSC::JIT::emit_op_enter): |
| * jit/JITOpcodes32_64.cpp: |
| (JSC::JIT::emit_op_enter): |
| * jit/JITStubs.cpp: |
| (JSC::DEFINE_STUB_FUNCTION): |
| * jit/JITStubs.h: |
| |
| 2012-06-20 Mark Hahnenberg <mhahnenberg@apple.com> |
| |
| JSLock should be per-JSGlobalData |
| https://bugs.webkit.org/show_bug.cgi?id=89123 |
| |
| Reviewed by Gavin Barraclough. |
| |
| * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.def: |
| * API/APIShims.h: |
| (APIEntryShimWithoutLock): |
| (JSC::APIEntryShimWithoutLock::APIEntryShimWithoutLock): Added an extra parameter to the constructor to |
| determine whether we should ref the JSGlobalData or not. We want to ref all the time except for in the |
| HeapTimer class because timerDidFire could run after somebody has started to tear down that particular |
| JSGlobalData, so we wouldn't want to resurrect the ref count of that JSGlobalData from 0 back to 1 after |
| its destruction has begun. |
| (JSC::APIEntryShimWithoutLock::~APIEntryShimWithoutLock): Now derefs if it also refed. |
| (JSC::APIEntryShim::APIEntryShim): |
| (APIEntryShim): |
| (JSC::APIEntryShim::~APIEntryShim): |
| (JSC::APIEntryShim::init): Factored out common initialization code for the various APIEntryShim constructors. |
| Also moved the timeoutChecker stop and start here because we need to start after we've grabbed the API lock |
| and before we've released it, which can only done in APIEntryShim. |
| (JSC::APICallbackShim::~APICallbackShim): We no longer need to synchronize here. |
| * API/JSContextRef.cpp: |
| (JSGlobalContextCreate): |
| (JSGlobalContextCreateInGroup): |
| (JSGlobalContextRelease): |
| (JSContextCreateBacktrace): |
| * heap/CopiedSpace.cpp: |
| (JSC::CopiedSpace::tryAllocateSlowCase): |
| * heap/Heap.cpp: |
| (JSC::Heap::protect): |
| (JSC::Heap::unprotect): |
| (JSC::Heap::collect): |
| (JSC::Heap::setActivityCallback): |
| (JSC::Heap::activityCallback): |
| (JSC::Heap::sweeper): |
| * heap/Heap.h: Changed m_activityCallback and m_sweeper to be raw pointers rather than OwnPtrs because they |
| are now responsible for their own lifetime. Also changed the order of declaration of the GCActivityCallback |
| and the IncrementalSweeper to make sure they're the last things that get initialized during construction to |
| prevent any issues with uninitialized memory in the JSGlobalData/Heap they might care about. |
| (Heap): |
| * heap/HeapTimer.cpp: Refactored to allow for thread-safe operation and shutdown. |
| (JSC::HeapTimer::~HeapTimer): |
| (JSC::HeapTimer::invalidate): |
| (JSC): |
| (JSC::HeapTimer::didStartVMShutdown): Called at the beginning of ~JSGlobalData. If we're on the same thread |
| that the HeapTimer is running on, we kill the HeapTimer ourselves. If not, then we set some state in the |
| HeapTimer and schedule it to fire immediately so that it can notice and kill itself. |
| (JSC::HeapTimer::timerDidFire): We grab our mutex and check our JSGlobalData pointer. If it has been zero-ed |
| out, then we know the VM has started to shutdown and we should kill ourselves. Otherwise, grab the APIEntryShim, |
| but without ref-ing the JSGlobalData (we don't want to bring the JSGlobalData's ref-count from 0 to 1) in case |
| we were interrupted between releasing our mutex and trying to grab the APILock. |
| * heap/HeapTimer.h: |
| (HeapTimer): |
| * heap/IncrementalSweeper.cpp: |
| (JSC::IncrementalSweeper::doWork): We no longer need the API shim here since HeapTimer::timerDidFire handles |
| all of that for us. |
| (JSC::IncrementalSweeper::create): |
| * heap/IncrementalSweeper.h: |
| (IncrementalSweeper): |
| * heap/MarkedAllocator.cpp: |
| (JSC::MarkedAllocator::allocateSlowCase): |
| * heap/WeakBlock.cpp: |
| (JSC::WeakBlock::reap): |
| * jsc.cpp: |
| (functionGC): |
| (functionReleaseExecutableMemory): |
| (jscmain): |
| * runtime/Completion.cpp: |
| (JSC::checkSyntax): |
| (JSC::evaluate): |
| * runtime/GCActivityCallback.h: |
| (DefaultGCActivityCallback): |
| (JSC::DefaultGCActivityCallback::create): |
| * runtime/JSGlobalData.cpp: |
| (JSC::JSGlobalData::JSGlobalData): |
| (JSC::JSGlobalData::~JSGlobalData): Signals to the two HeapTimers (GCActivityCallback and IncrementalSweeper) |
| that the VM has started shutting down. It then waits until the HeapTimer is done with whatever activity |
| it needs to do before continuing with any further destruction. Also asserts that we do not currently hold the |
| APILock because this could potentially cause deadlock when we try to signal to the HeapTimers using their mutexes. |
| (JSC::JSGlobalData::sharedInstance): Protect the initialization for the shared instance with the GlobalJSLock. |
| (JSC::JSGlobalData::sharedInstanceInternal): |
| * runtime/JSGlobalData.h: Change to be ThreadSafeRefCounted so that we don't have to worry about refing and |
| de-refing JSGlobalDatas on separate threads since we don't do it that often anyways. |
| (JSGlobalData): |
| (JSC::JSGlobalData::apiLock): |
| * runtime/JSGlobalObject.cpp: |
| (JSC::JSGlobalObject::~JSGlobalObject): |
| (JSC::JSGlobalObject::init): |
| * runtime/JSLock.cpp: |
| (JSC): |
| (JSC::GlobalJSLock::GlobalJSLock): For accessing the shared instance. |
| (JSC::GlobalJSLock::~GlobalJSLock): |
| (JSC::JSLockHolder::JSLockHolder): MutexLocker for JSLock. Also refs the JSGlobalData to keep it alive so that |
| it can successfully unlock it later without it disappearing from underneath it. |
| (JSC::JSLockHolder::~JSLockHolder): |
| (JSC::JSLock::JSLock): |
| (JSC::JSLock::~JSLock): |
| (JSC::JSLock::lock): Uses the spin lock for guarding the lock count and owner thread fields. Uses the mutex for |
| actually waiting for long periods. |
| (JSC::JSLock::unlock): |
| (JSC::JSLock::currentThreadIsHoldingLock): |
| (JSC::JSLock::dropAllLocks): |
| (JSC::JSLock::dropAllLocksUnconditionally): |
| (JSC::JSLock::grabAllLocks): |
| (JSC::JSLock::DropAllLocks::DropAllLocks): |
| (JSC::JSLock::DropAllLocks::~DropAllLocks): |
| * runtime/JSLock.h: |
| (JSC): |
| (GlobalJSLock): |
| (JSLockHolder): |
| (JSLock): |
| (DropAllLocks): |
| * runtime/WeakGCMap.h: |
| (JSC::WeakGCMap::set): |
| * testRegExp.cpp: |
| (realMain): |
| |
| 2012-06-22 Peter Beverloo <peter@chromium.org> |
| |
| [Chromium] Disable c++0x compatibility warnings in JavaScriptCore.gyp when building for Android |
| https://bugs.webkit.org/show_bug.cgi?id=88853 |
| |
| Reviewed by Steve Block. |
| |
| The Android exclusions were necessary to fix a gyp generation error, as |
| the gcc_version variable wasn't being defined for Android. Remove these |
| exceptions when Chromium is able to define the gcc_version variable. |
| |
| * JavaScriptCore.gyp/JavaScriptCore.gyp: |
| |
| 2012-06-21 Filip Pizlo <fpizlo@apple.com> |
| |
| op_resolve_global should not prevent DFG inlining |
| https://bugs.webkit.org/show_bug.cgi?id=89726 |
| |
| Reviewed by Gavin Barraclough. |
| |
| * bytecode/CodeBlock.cpp: |
| (JSC::CodeBlock::CodeBlock): |
| (JSC::CodeBlock::shrinkToFit): |
| * bytecode/GlobalResolveInfo.h: |
| (JSC::GlobalResolveInfo::GlobalResolveInfo): |
| (GlobalResolveInfo): |
| * dfg/DFGByteCodeParser.cpp: |
| (JSC::DFG::ByteCodeParser::InlineStackEntry::InlineStackEntry): |
| * dfg/DFGCapabilities.h: |
| (JSC::DFG::canInlineOpcode): |
| * dfg/DFGOperations.cpp: |
| * dfg/DFGOperations.h: |
| * dfg/DFGSpeculativeJIT.h: |
| (JSC::DFG::SpeculativeJIT::callOperation): |
| * dfg/DFGSpeculativeJIT32_64.cpp: |
| (JSC::DFG::SpeculativeJIT::compile): |
| * dfg/DFGSpeculativeJIT64.cpp: |
| (JSC::DFG::SpeculativeJIT::compile): |
| |
| 2012-06-20 Filip Pizlo <fpizlo@apple.com> |
| |
| DFG should inline 'new Array()' |
| https://bugs.webkit.org/show_bug.cgi?id=89632 |
| |
| Reviewed by Geoffrey Garen. |
| |
| This adds support for treating InternalFunction like intrinsics. The code |
| to do so is actually quite clean, so I don't feel bad about perpetuating |
| the InternalFunction vs. JSFunction-with-NativeExecutable dichotomy. |
| |
| Currently this newfound power is only used to inline 'new Array()'. |
| |
| * dfg/DFGByteCodeParser.cpp: |
| (ByteCodeParser): |
| (JSC::DFG::ByteCodeParser::handleCall): |
| (JSC::DFG::ByteCodeParser::handleConstantInternalFunction): |
| (DFG): |
| * dfg/DFGGraph.h: |
| (JSC::DFG::Graph::isInternalFunctionConstant): |
| (JSC::DFG::Graph::valueOfInternalFunctionConstant): |
| |
| 2012-06-21 Mark Hahnenberg <mhahnenberg@apple.com> |
| |
| Adding copyrights to new files. |
| |
| * heap/HeapTimer.cpp: |
| * heap/HeapTimer.h: |
| * heap/IncrementalSweeper.cpp: |
| * heap/IncrementalSweeper.h: |
| |
| 2012-06-21 Arnaud Renevier <arno@renevier.net> |
| |
| make sure headers are included only once per file |
| https://bugs.webkit.org/show_bug.cgi?id=88922 |
| |
| Reviewed by Alexey Proskuryakov. |
| |
| * bytecode/CodeBlock.h: |
| * heap/MachineStackMarker.cpp: |
| * runtime/JSVariableObject.h: |
| |
| 2012-06-21 Ryuan Choi <ryuan.choi@gmail.com> |
| |
| [EFL][WK2] Make WebKit2/Efl headers and resources installable. |
| https://bugs.webkit.org/show_bug.cgi?id=88207 |
| |
| Reviewed by Chang Shu. |
| |
| * shell/CMakeLists.txt: Use ${EXEC_INSTALL_DIR} instead of hardcoding "bin" |
| |
| 2012-06-20 Geoffrey Garen <ggaren@apple.com> |
| |
| Reduced (but did not eliminate) use of "berzerker GC" |
| https://bugs.webkit.org/show_bug.cgi?id=89237 |
| |
| Reviewed by Gavin Barraclough. |
| |
| (PART 1) |
| |
| This patch turned out to be crashy, so I'm landing the non-crashy bits |
| first. |
| |
| This part is pre-requisite refactoring. I didn't actually turn off |
| "berzerker GC" or turn on incremental shrinking. |
| |
| * heap/MarkedAllocator.cpp: |
| (JSC::MarkedAllocator::removeBlock): Make sure to clear the free list when |
| we throw away the block we're currently allocating out of. Otherwise, we'll |
| allocate out of a stale free list. |
| |
| * heap/MarkedSpace.cpp: |
| (JSC::Free::Free): |
| (JSC::Free::operator()): |
| (JSC::Free::returnValue): Refactored this functor to use a shared helper |
| function, so we can share our implementation with the incremental sweeper. |
| |
| Also changed to freeing individual blocks immediately instead of linking |
| them into a list for later freeing. This makes the programming interface |
| simpler, and it's slightly more efficient to boot. |
| |
| (JSC::MarkedSpace::~MarkedSpace): Updated for rename. |
| |
| (JSC::MarkedSpace::freeBlock): |
| (JSC::MarkedSpace::freeOrShrinkBlock): New helper functions to share behavior |
| with the incremental sweeper. |
| |
| (JSC::MarkedSpace::shrink): Updated for new functor behavior. |
| |
| * heap/MarkedSpace.h: Statically typed languages are awesome. |
| |
| 2012-06-20 Filip Pizlo <fpizlo@apple.com> |
| |
| DFG should optimize ResolveGlobal |
| https://bugs.webkit.org/show_bug.cgi?id=89617 |
| |
| Reviewed by Oliver Hunt. |
| |
| This adds inlining of ResolveGlobal accesses that are known monomorphic. It also |
| adds the specific function optimization to ResolveGlobal, when it is inlined. And, |
| it makes internal functions act like specific functions, since that will be the |
| most common use-case of this optimization. |
| |
| This is only a slighy speed-up (sub 1%), since we don't yet do the obvious thing |
| with this optimization, which is to completely inline common "globally resolved" |
| function and constructor calls, like "new Array()". |
| |
| * CMakeLists.txt: |
| * GNUmakefile.list.am: |
| * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.def: |
| * JavaScriptCore.xcodeproj/project.pbxproj: |
| * Target.pri: |
| * bytecode/CodeBlock.cpp: |
| (JSC::CodeBlock::globalResolveInfoForBytecodeOffset): |
| * bytecode/CodeBlock.h: |
| (CodeBlock): |
| (JSC::CodeBlock::numberOfGlobalResolveInfos): |
| * bytecode/GlobalResolveInfo.h: |
| (JSC::getGlobalResolveInfoBytecodeOffset): |
| (JSC): |
| * bytecode/ResolveGlobalStatus.cpp: Added. |
| (JSC): |
| (JSC::computeForStructure): |
| (JSC::computeForLLInt): |
| (JSC::ResolveGlobalStatus::computeFor): |
| * bytecode/ResolveGlobalStatus.h: Added. |
| (JSC): |
| (ResolveGlobalStatus): |
| (JSC::ResolveGlobalStatus::ResolveGlobalStatus): |
| (JSC::ResolveGlobalStatus::state): |
| (JSC::ResolveGlobalStatus::isSet): |
| (JSC::ResolveGlobalStatus::operator!): |
| (JSC::ResolveGlobalStatus::isSimple): |
| (JSC::ResolveGlobalStatus::takesSlowPath): |
| (JSC::ResolveGlobalStatus::structure): |
| (JSC::ResolveGlobalStatus::offset): |
| (JSC::ResolveGlobalStatus::specificValue): |
| * dfg/DFGByteCodeParser.cpp: |
| (ByteCodeParser): |
| (JSC::DFG::ByteCodeParser::handleGetByOffset): |
| (DFG): |
| (JSC::DFG::ByteCodeParser::handleGetById): |
| (JSC::DFG::ByteCodeParser::parseBlock): |
| * runtime/JSObject.cpp: |
| (JSC::getCallableObjectSlow): |
| (JSC): |
| (JSC::JSObject::put): |
| (JSC::JSObject::putDirectVirtual): |
| (JSC::JSObject::putDirectAccessor): |
| * runtime/JSObject.h: |
| (JSC): |
| (JSC::getCallableObject): |
| (JSC::JSObject::putOwnDataProperty): |
| (JSC::JSObject::putDirect): |
| (JSC::JSObject::putDirectWithoutTransition): |
| |
| 2012-06-20 Filip Pizlo <fpizlo@apple.com> |
| |
| Functions on global objects should be specializable |
| https://bugs.webkit.org/show_bug.cgi?id=89615 |
| |
| Reviewed by Oliver Hunt. |
| |
| I tested to see if this brought back the bug in https://bugs.webkit.org/show_bug.cgi?id=33343, |
| and it didn't. Bug 33343 was the reason why we disabled global object function specialization |
| to begin with. So I'm guessing this is safe. |
| |
| * runtime/JSGlobalObject.cpp: |
| (JSC::JSGlobalObject::init): |
| |
| 2012-06-20 Filip Pizlo <fpizlo@apple.com> |
| |
| build-webkit failure due to illegal 32-bit integer constants in code |
| generated by offlineasm |
| https://bugs.webkit.org/show_bug.cgi?id=89347 |
| |
| Reviewed by Geoffrey Garen. |
| |
| The offending constants are the magic numbers used by offlineasm to find |
| offsets in the generated machine code. Added code to turn them into what |
| the C++ compiler will believe to be valid 32-bit values. |
| |
| * offlineasm/offsets.rb: |
| |
| 2012-06-19 Geoffrey Garen <ggaren@apple.com> |
| |
| Made the incremental sweeper more aggressive |
| https://bugs.webkit.org/show_bug.cgi?id=89527 |
| |
| Reviewed by Oliver Hunt. |
| |
| This is a pre-requisite to getting rid of "berzerker GC" because we need |
| the sweeper to reclaim memory in a timely fashion, or we'll see a memory |
| footprint regression. |
| |
| * heap/IncrementalSweeper.h: |
| * heap/IncrementalSweeper.cpp: |
| (JSC::IncrementalSweeper::scheduleTimer): Since the time slice is predictable, |
| no need to use a data member to record it. |
| |
| (JSC::IncrementalSweeper::doSweep): Sweep as many blocks as we can in a |
| small time slice. This is better than sweeping only one block per timer |
| fire because that strategy has a heavy timer overhead, and artificially |
| delays memory reclamation. |
| |
| 2012-06-20 Filip Pizlo <fpizlo@apple.com> |
| |
| DFG should be able to print disassembly interleaved with the IR |
| https://bugs.webkit.org/show_bug.cgi?id=89551 |
| |
| Reviewed by Geoffrey Garen. |
| |
| This change also removes running Dominators unconditionally on every DFG |
| compile. Dominators are designed to be computed on-demand, and currently |
| the only demand is graph dumps. |
| |
| * CMakeLists.txt: |
| * GNUmakefile.list.am: |
| * JavaScriptCore.xcodeproj/project.pbxproj: |
| * Target.pri: |
| * assembler/ARMv7Assembler.h: |
| (JSC::ARMv7Assembler::labelIgnoringWatchpoints): |
| (ARMv7Assembler): |
| * assembler/AbstractMacroAssembler.h: |
| (AbstractMacroAssembler): |
| (JSC::AbstractMacroAssembler::labelIgnoringWatchpoints): |
| * assembler/X86Assembler.h: |
| (X86Assembler): |
| (JSC::X86Assembler::labelIgnoringWatchpoints): |
| * dfg/DFGCommon.h: |
| (JSC::DFG::shouldShowDisassembly): |
| (DFG): |
| * dfg/DFGDisassembler.cpp: Added. |
| (DFG): |
| (JSC::DFG::Disassembler::Disassembler): |
| (JSC::DFG::Disassembler::dump): |
| (JSC::DFG::Disassembler::dumpDisassembly): |
| * dfg/DFGDisassembler.h: Added. |
| (DFG): |
| (Disassembler): |
| (JSC::DFG::Disassembler::setStartOfCode): |
| (JSC::DFG::Disassembler::setForBlock): |
| (JSC::DFG::Disassembler::setForNode): |
| (JSC::DFG::Disassembler::setEndOfMainPath): |
| (JSC::DFG::Disassembler::setEndOfCode): |
| * dfg/DFGDriver.cpp: |
| (JSC::DFG::compile): |
| * dfg/DFGGraph.cpp: |
| (JSC::DFG::Graph::dumpCodeOrigin): |
| (JSC::DFG::Graph::amountOfNodeWhiteSpace): |
| (DFG): |
| (JSC::DFG::Graph::printNodeWhiteSpace): |
| (JSC::DFG::Graph::dump): |
| (JSC::DFG::Graph::dumpBlockHeader): |
| * dfg/DFGGraph.h: |
| * dfg/DFGJITCompiler.cpp: |
| (JSC::DFG::JITCompiler::JITCompiler): |
| (DFG): |
| (JSC::DFG::JITCompiler::compile): |
| (JSC::DFG::JITCompiler::compileFunction): |
| * dfg/DFGJITCompiler.h: |
| (JITCompiler): |
| (JSC::DFG::JITCompiler::setStartOfCode): |
| (JSC::DFG::JITCompiler::setForBlock): |
| (JSC::DFG::JITCompiler::setForNode): |
| (JSC::DFG::JITCompiler::setEndOfMainPath): |
| (JSC::DFG::JITCompiler::setEndOfCode): |
| * dfg/DFGNode.h: |
| (Node): |
| (JSC::DFG::Node::willHaveCodeGen): |
| * dfg/DFGNodeFlags.cpp: |
| (JSC::DFG::nodeFlagsAsString): |
| * dfg/DFGSpeculativeJIT.cpp: |
| (JSC::DFG::SpeculativeJIT::compile): |
| * dfg/DFGSpeculativeJIT.h: |
| (SpeculativeJIT): |
| * runtime/Options.cpp: |
| (Options): |
| (JSC::Options::initializeOptions): |
| * runtime/Options.h: |
| (Options): |
| |
| 2012-06-19 Filip Pizlo <fpizlo@apple.com> |
| |
| JSC should be able to show disassembly for all generated JIT code |
| https://bugs.webkit.org/show_bug.cgi?id=89536 |
| |
| Reviewed by Gavin Barraclough. |
| |
| Now instead of doing linkBuffer.finalizeCode(), you do |
| FINALIZE_CODE(linkBuffer, (... explanation ...)). FINALIZE_CODE() then |
| prints your explanation and the disassembled code, if |
| Options::showDisassembly is set to true. |
| |
| * CMakeLists.txt: |
| * GNUmakefile.list.am: |
| * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: |
| * JavaScriptCore.xcodeproj/project.pbxproj: |
| * Target.pri: |
| * assembler/LinkBuffer.cpp: Added. |
| (JSC): |
| (JSC::LinkBuffer::finalizeCodeWithoutDisassembly): |
| (JSC::LinkBuffer::finalizeCodeWithDisassembly): |
| (JSC::LinkBuffer::linkCode): |
| (JSC::LinkBuffer::performFinalization): |
| (JSC::LinkBuffer::dumpLinkStatistics): |
| (JSC::LinkBuffer::dumpCode): |
| * assembler/LinkBuffer.h: |
| (LinkBuffer): |
| (JSC): |
| * assembler/MacroAssemblerCodeRef.h: |
| (JSC::MacroAssemblerCodeRef::tryToDisassemble): |
| (MacroAssemblerCodeRef): |
| * dfg/DFGJITCompiler.cpp: |
| (JSC::DFG::JITCompiler::compile): |
| (JSC::DFG::JITCompiler::compileFunction): |
| * dfg/DFGOSRExitCompiler.cpp: |
| * dfg/DFGRepatch.cpp: |
| (JSC::DFG::generateProtoChainAccessStub): |
| (JSC::DFG::tryCacheGetByID): |
| (JSC::DFG::tryBuildGetByIDList): |
| (JSC::DFG::emitPutReplaceStub): |
| (JSC::DFG::emitPutTransitionStub): |
| * dfg/DFGThunks.cpp: |
| (JSC::DFG::osrExitGenerationThunkGenerator): |
| * disassembler/Disassembler.h: |
| (JSC): |
| (JSC::tryToDisassemble): |
| * disassembler/UDis86Disassembler.cpp: |
| (JSC::tryToDisassemble): |
| * jit/JIT.cpp: |
| (JSC::JIT::privateCompile): |
| * jit/JITCode.h: |
| (JSC::JITCode::tryToDisassemble): |
| * jit/JITOpcodes.cpp: |
| (JSC::JIT::privateCompileCTIMachineTrampolines): |
| * jit/JITOpcodes32_64.cpp: |
| (JSC::JIT::privateCompileCTIMachineTrampolines): |
| (JSC::JIT::privateCompileCTINativeCall): |
| * jit/JITPropertyAccess.cpp: |
| (JSC::JIT::stringGetByValStubGenerator): |
| (JSC::JIT::privateCompilePutByIdTransition): |
| (JSC::JIT::privateCompilePatchGetArrayLength): |
| (JSC::JIT::privateCompileGetByIdProto): |
| (JSC::JIT::privateCompileGetByIdSelfList): |
| (JSC::JIT::privateCompileGetByIdProtoList): |
| (JSC::JIT::privateCompileGetByIdChainList): |
| (JSC::JIT::privateCompileGetByIdChain): |
| * jit/JITPropertyAccess32_64.cpp: |
| (JSC::JIT::stringGetByValStubGenerator): |
| (JSC::JIT::privateCompilePutByIdTransition): |
| (JSC::JIT::privateCompilePatchGetArrayLength): |
| (JSC::JIT::privateCompileGetByIdProto): |
| (JSC::JIT::privateCompileGetByIdSelfList): |
| (JSC::JIT::privateCompileGetByIdProtoList): |
| (JSC::JIT::privateCompileGetByIdChainList): |
| (JSC::JIT::privateCompileGetByIdChain): |
| * jit/SpecializedThunkJIT.h: |
| (JSC::SpecializedThunkJIT::finalize): |
| * jit/ThunkGenerators.cpp: |
| (JSC::charCodeAtThunkGenerator): |
| (JSC::charAtThunkGenerator): |
| (JSC::fromCharCodeThunkGenerator): |
| (JSC::sqrtThunkGenerator): |
| (JSC::floorThunkGenerator): |
| (JSC::ceilThunkGenerator): |
| (JSC::roundThunkGenerator): |
| (JSC::expThunkGenerator): |
| (JSC::logThunkGenerator): |
| (JSC::absThunkGenerator): |
| (JSC::powThunkGenerator): |
| * llint/LLIntThunks.cpp: |
| (JSC::LLInt::generateThunkWithJumpTo): |
| (JSC::LLInt::functionForCallEntryThunkGenerator): |
| (JSC::LLInt::functionForConstructEntryThunkGenerator): |
| (JSC::LLInt::functionForCallArityCheckThunkGenerator): |
| (JSC::LLInt::functionForConstructArityCheckThunkGenerator): |
| (JSC::LLInt::evalEntryThunkGenerator): |
| (JSC::LLInt::programEntryThunkGenerator): |
| * runtime/Options.cpp: |
| (Options): |
| (JSC::Options::initializeOptions): |
| * runtime/Options.h: |
| (Options): |
| * yarr/YarrJIT.cpp: |
| (JSC::Yarr::YarrGenerator::compile): |
| |
| 2012-06-19 Mark Hahnenberg <mhahnenberg@apple.com> |
| |
| [Qt][Mac] REGRESSION(r120742): It broke the build |
| https://bugs.webkit.org/show_bug.cgi?id=89516 |
| |
| Reviewed by Geoffrey Garen. |
| |
| Removing GCActivityCallbackCF.cpp because it doesn't mesh well with cross-platform |
| code on Darwin (e.g. Qt). We now use plain ol' vanilla ifdefs to handle platforms |
| without CF support. These if-defs will probably disappear in the future when we |
| use cross-platform timers in HeapTimer. |
| |
| * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: |
| * JavaScriptCore.xcodeproj/project.pbxproj: |
| * runtime/GCActivityCallback.cpp: |
| (JSC): |
| (JSC::DefaultGCActivityCallback::DefaultGCActivityCallback): |
| (JSC::DefaultGCActivityCallback::doWork): |
| (JSC::DefaultGCActivityCallback::scheduleTimer): |
| (JSC::DefaultGCActivityCallback::cancelTimer): |
| (JSC::DefaultGCActivityCallback::didAllocate): |
| (JSC::DefaultGCActivityCallback::willCollect): |
| (JSC::DefaultGCActivityCallback::cancel): |
| * runtime/GCActivityCallbackCF.cpp: Removed. |
| |
| 2012-06-19 Filip Pizlo <fpizlo@apple.com> |
| |
| DFG CFA forgets to notify subsequent phases of found constants if it proves LogicalNot to be a constant |
| https://bugs.webkit.org/show_bug.cgi?id=89511 |
| <rdar://problem/11700089> |
| |
| Reviewed by Geoffrey Garen. |
| |
| * dfg/DFGAbstractState.cpp: |
| (JSC::DFG::AbstractState::execute): |
| |
| 2012-06-19 Mark Lam <mark.lam@apple.com> |
| |
| CodeBlock::needsCallReturnIndices() is no longer needed. |
| https://bugs.webkit.org/show_bug.cgi?id=89490 |
| |
| Reviewed by Geoffrey Garen. |
| |
| * bytecode/CodeBlock.h: |
| (JSC::CodeBlock::needsCallReturnIndices): removed. |
| * dfg/DFGJITCompiler.cpp: |
| (JSC::DFG::JITCompiler::link): |
| * jit/JIT.cpp: |
| (JSC::JIT::privateCompile): |
| |
| 2012-06-19 Filip Pizlo <fpizlo@apple.com> |
| |
| Unreviewed, try to fix Windows build. |
| |
| * JavaScriptCore.vcproj/JavaScriptCore/copy-files.cmd: |
| |
| 2012-06-17 Filip Pizlo <fpizlo@apple.com> |
| |
| It should be possible to look at disassembly |
| https://bugs.webkit.org/show_bug.cgi?id=89319 |
| |
| Reviewed by Sam Weinig. |
| |
| This imports the udis86 disassembler library. The library is placed |
| behind an abstraction in disassembler/Disassembler.h, so that we can |
| in the future use other disassemblers (for other platforms) whenever |
| appropriate. As a first step, the disassembler is being invoked for |
| DFG verbose dumps. |
| |
| If we ever want to merge a new version of udis86 in the future, I've |
| made notes about changes I made to the library in |
| disassembler/udis86/differences.txt. |
| |
| * CMakeLists.txt: |
| * DerivedSources.make: |
| * GNUmakefile.list.am: |
| * JavaScriptCore.pri: |
| * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: |
| * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCoreCommon.vsprops: |
| * JavaScriptCore.xcodeproj/project.pbxproj: |
| * dfg/DFGJITCompiler.cpp: |
| (JSC::DFG::JITCompiler::compile): |
| (JSC::DFG::JITCompiler::compileFunction): |
| * disassembler: Added. |
| * disassembler/Disassembler.h: Added. |
| (JSC): |
| (JSC::tryToDisassemble): |
| * disassembler/UDis86Disassembler.cpp: Added. |
| (JSC): |
| (JSC::tryToDisassemble): |
| * disassembler/udis86: Added. |
| * disassembler/udis86/differences.txt: Added. |
| * disassembler/udis86/itab.py: Added. |
| (UdItabGenerator): |
| (UdItabGenerator.__init__): |
| (UdItabGenerator.toGroupId): |
| (UdItabGenerator.genLookupTable): |
| (UdItabGenerator.genLookupTableList): |
| (UdItabGenerator.genInsnTable): |
| (genItabH): |
| (genItabH.UD_ITAB_H): |
| (genItabC): |
| (genItab): |
| (main): |
| * disassembler/udis86/optable.xml: Added. |
| * disassembler/udis86/ud_opcode.py: Added. |
| (UdOpcodeTables): |
| (UdOpcodeTables.sizeOfTable): |
| (UdOpcodeTables.nameOfTable): |
| (UdOpcodeTables.updateTable): |
| (UdOpcodeTables.Insn): |
| (UdOpcodeTables.Insn.__init__): |
| (UdOpcodeTables.Insn.__init__.opcode): |
| (UdOpcodeTables.parse): |
| (UdOpcodeTables.addInsnDef): |
| (UdOpcodeTables.print_table): |
| (UdOpcodeTables.print_tree): |
| * disassembler/udis86/ud_optable.py: Added. |
| (UdOptableXmlParser): |
| (UdOptableXmlParser.parseDef): |
| (UdOptableXmlParser.parse): |
| (printFn): |
| (parse): |
| (main): |
| * disassembler/udis86/udis86.c: Added. |
| (ud_init): |
| (ud_disassemble): |
| (ud_set_mode): |
| (ud_set_vendor): |
| (ud_set_pc): |
| (ud): |
| (ud_insn_asm): |
| (ud_insn_off): |
| (ud_insn_hex): |
| (ud_insn_ptr): |
| (ud_insn_len): |
| * disassembler/udis86/udis86.h: Added. |
| * disassembler/udis86/udis86_decode.c: Added. |
| (eff_adr_mode): |
| (ud_lookup_mnemonic): |
| (decode_prefixes): |
| (modrm): |
| (resolve_operand_size): |
| (resolve_mnemonic): |
| (decode_a): |
| (decode_gpr): |
| (resolve_gpr64): |
| (resolve_gpr32): |
| (resolve_reg): |
| (decode_imm): |
| (decode_modrm_reg): |
| (decode_modrm_rm): |
| (decode_o): |
| (decode_operand): |
| (decode_operands): |
| (clear_insn): |
| (resolve_mode): |
| (gen_hex): |
| (decode_insn): |
| (decode_3dnow): |
| (decode_ssepfx): |
| (decode_ext): |
| (decode_opcode): |
| (ud_decode): |
| * disassembler/udis86/udis86_decode.h: Added. |
| (ud_itab_entry_operand): |
| (ud_itab_entry): |
| (ud_lookup_table_list_entry): |
| (sse_pfx_idx): |
| (mode_idx): |
| (modrm_mod_idx): |
| (vendor_idx): |
| (is_group_ptr): |
| (group_idx): |
| * disassembler/udis86/udis86_extern.h: Added. |
| * disassembler/udis86/udis86_input.c: Added. |
| (inp_buff_hook): |
| (inp_file_hook): |
| (ud): |
| (ud_set_user_opaque_data): |
| (ud_get_user_opaque_data): |
| (ud_set_input_buffer): |
| (ud_set_input_file): |
| (ud_input_skip): |
| (ud_input_end): |
| (ud_inp_next): |
| (ud_inp_back): |
| (ud_inp_peek): |
| (ud_inp_move): |
| (ud_inp_uint8): |
| (ud_inp_uint16): |
| (ud_inp_uint32): |
| (ud_inp_uint64): |
| * disassembler/udis86/udis86_input.h: Added. |
| * disassembler/udis86/udis86_itab_holder.c: Added. |
| * disassembler/udis86/udis86_syn-att.c: Added. |
| (opr_cast): |
| (gen_operand): |
| (ud_translate_att): |
| * disassembler/udis86/udis86_syn-intel.c: Added. |
| (opr_cast): |
| (gen_operand): |
| (ud_translate_intel): |
| * disassembler/udis86/udis86_syn.c: Added. |
| * disassembler/udis86/udis86_syn.h: Added. |
| (mkasm): |
| * disassembler/udis86/udis86_types.h: Added. |
| (ud_operand): |
| (ud): |
| * jit/JITCode.h: |
| (JITCode): |
| (JSC::JITCode::tryToDisassemble): |
| |
| 2012-06-19 Mark Hahnenberg <mhahnenberg@apple.com> |
| |
| GCActivityCallback and IncrementalSweeper should share code |
| https://bugs.webkit.org/show_bug.cgi?id=89400 |
| |
| Reviewed by Geoffrey Garen. |
| |
| A lot of functionality is duplicated between GCActivityCallback and IncrementalSweeper. |
| We should extract the common functionality out into a separate class that both of them |
| can inherit from. This refactoring will be an even greater boon when we add the ability |
| to shut these two agents down in a thread-safe fashion |
| |
| * CMakeLists.txt: |
| * GNUmakefile.list.am: |
| * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: |
| * JavaScriptCore.xcodeproj/project.pbxproj: |
| * Target.pri: |
| * heap/Heap.cpp: |
| (JSC::Heap::Heap): Move initialization down so that the JSGlobalData has a valid Heap when |
| we're initializing the GCActivityCallback and the IncrementalSweeper. |
| * heap/Heap.h: |
| (Heap): |
| * heap/HeapTimer.cpp: Added. |
| (JSC): |
| (JSC::HeapTimer::HeapTimer): Initialize the various base class data that |
| DefaultGCActivityCallback::commonConstructor() used to do. |
| (JSC::HeapTimer::~HeapTimer): Call to invalidate(). |
| (JSC::HeapTimer::synchronize): Same functionality as the old DefaultGCActivityCallback::synchronize(). |
| Virtual so that non-CF subclasses can override. |
| (JSC::HeapTimer::invalidate): Tears down the runloop timer to prevent any future firing. |
| (JSC::HeapTimer::timerDidFire): Callback to pass to the timer function. Casts and calls the virtual doWork(). |
| * heap/HeapTimer.h: Added. This is the class that serves as the common base class for |
| both GCActivityCallback and IncrementalSweeper. It handles setting up and tearing down run loops and synchronizing |
| across threads for its subclasses. |
| (JSC): |
| (HeapTimer): |
| * heap/IncrementalSweeper.cpp: Changes to accomodate the extraction of common functionality |
| between IncrementalSweeper and GCActivityCallback into a common ancestor. |
| (JSC): |
| (JSC::IncrementalSweeper::doWork): |
| (JSC::IncrementalSweeper::IncrementalSweeper): |
| (JSC::IncrementalSweeper::cancelTimer): |
| (JSC::IncrementalSweeper::create): |
| * heap/IncrementalSweeper.h: |
| (IncrementalSweeper): |
| * runtime/GCActivityCallback.cpp: |
| (JSC::DefaultGCActivityCallback::DefaultGCActivityCallback): |
| (JSC::DefaultGCActivityCallback::doWork): |
| * runtime/GCActivityCallback.h: |
| (GCActivityCallback): |
| (JSC::GCActivityCallback::willCollect): |
| (JSC::GCActivityCallback::GCActivityCallback): |
| (JSC): |
| (DefaultGCActivityCallback): Remove the platform data struct. The platform data should be kept in |
| the class itself so as to be accessible by doWork(). Most of the platform data for CF is kept in |
| HeapTimer anyways, so we only need the m_delay field now. |
| * runtime/GCActivityCallbackBlackBerry.cpp: |
| (JSC): |
| (JSC::DefaultGCActivityCallback::DefaultGCActivityCallback): |
| (JSC::DefaultGCActivityCallback::doWork): |
| (JSC::DefaultGCActivityCallback::didAllocate): |
| * runtime/GCActivityCallbackCF.cpp: |
| (JSC): |
| (JSC::DefaultGCActivityCallback::DefaultGCActivityCallback): |
| (JSC::DefaultGCActivityCallback::doWork): |
| (JSC::DefaultGCActivityCallback::scheduleTimer): |
| (JSC::DefaultGCActivityCallback::cancelTimer): |
| (JSC::DefaultGCActivityCallback::didAllocate): |
| (JSC::DefaultGCActivityCallback::willCollect): |
| (JSC::DefaultGCActivityCallback::cancel): |
| |
| |
| 2012-06-19 Mike West <mkwst@chromium.org> |
| |
| Introduce ENABLE_CSP_NEXT configuration flag. |
| https://bugs.webkit.org/show_bug.cgi?id=89300 |
| |
| Reviewed by Adam Barth. |
| |
| The 1.0 draft of the Content Security Policy spec is just about to |
| move to Last Call. We'll hide work on the upcoming 1.1 spec behind |
| this ENABLE flag, disabled by default. |
| |
| Spec: https://dvcs.w3.org/hg/content-security-policy/raw-file/tip/csp-specification.dev.html |
| |
| * Configurations/FeatureDefines.xcconfig: |
| |
| 2012-06-18 Mark Lam <mark.lam@apple.com> |
| |
| Changed JSC to always record line number information so that error.stack |
| and window.onerror() can report proper line numbers. |
| https://bugs.webkit.org/show_bug.cgi?id=89410 |
| |
| Reviewed by Geoffrey Garen. |
| |
| * bytecode/CodeBlock.cpp: |
| (JSC::CodeBlock::CodeBlock): |
| (JSC::CodeBlock::lineNumberForBytecodeOffset): |
| (JSC::CodeBlock::shrinkToFit): m_lineInfo is now available unconditionally. |
| |
| * bytecode/CodeBlock.h: |
| (JSC::CodeBlock::addLineInfo): |
| (JSC::CodeBlock::hasLineInfo): Unused. Now removed. |
| (JSC::CodeBlock::needsCallReturnIndices): |
| (CodeBlock): |
| (RareData): Hoisted m_lineInfo out of m_rareData. m_lineInfo is now |
| filled in unconditionally. |
| |
| * bytecompiler/BytecodeGenerator.h: |
| (JSC::BytecodeGenerator::addLineInfo): |
| |
| 2012-06-18 Andy Estes <aestes@apple.com> |
| |
| Fix r120663, which didn't land the change that was reviewed. |
| |
| 2012-06-18 Andy Estes <aestes@apple.com> |
| |
| [JSC] In JSGlobalData.cpp, enableAssembler() sometimes leaks two CF objects |
| https://bugs.webkit.org/show_bug.cgi?id=89415 |
| |
| Reviewed by Sam Weinig. |
| |
| In the case where canUseJIT was a non-NULL CFBooleanRef, |
| enableAssembler() would leak both canUseJITKey and canUseJIT by |
| returning before calling CFRelease. Fix this by using RetainPtr. |
| |
| * runtime/JSGlobalData.cpp: |
| (JSC::enableAssembler): |
| |
| 2012-06-17 Geoffrey Garen <ggaren@apple.com> |
| |
| GC copy phase spends needless cycles zero-filling blocks |
| https://bugs.webkit.org/show_bug.cgi?id=89128 |
| |
| Reviewed by Gavin Barraclough. |
| |
| We only need to zero-fill when we're allocating memory that might not |
| get fully initialized before GC. |
| |
| * heap/CopiedBlock.h: |
| (JSC::CopiedBlock::createNoZeroFill): |
| (JSC::CopiedBlock::create): Added a way to create without zero-filling. |
| This is our optimization. |
| |
| (JSC::CopiedBlock::zeroFillToEnd): |
| (JSC::CopiedBlock::CopiedBlock): Split zero-filling out from creation, |
| so we can sometimes create without zero-filling. |
| |
| * heap/CopiedSpace.cpp: |
| (JSC::CopiedSpace::init): |
| (JSC::CopiedSpace::tryAllocateSlowCase): |
| (JSC::CopiedSpace::doneCopying): Renamed addNewBlock to allocateBlock() |
| to clarify that the new block is always newly-allocated. |
| |
| (JSC::CopiedSpace::doneFillingBlock): Make sure to zero-fill to the end |
| of a block that might be used in the future for allocation. (Most of the |
| time, this is a no-op, since we've already filled the block completely.) |
| |
| (JSC::CopiedSpace::getFreshBlock): Removed this function because the |
| abstraction of "allocation must succeed" is no longer useful. |
| |
| * heap/CopiedSpace.h: Updated declarations to match. |
| |
| * heap/CopiedSpaceInlineMethods.h: |
| (JSC::CopiedSpace::allocateBlockForCopyingPhase): New function, which |
| knows that it can skip zero-filling. |
| |
| Added tighter scoping to our lock, to improve parallelism. |
| |
| (JSC::CopiedSpace::allocateBlock): Folded getFreshBlock functionality |
| into this function, for simplicity. |
| |
| * heap/MarkStack.cpp: |
| (JSC::SlotVisitor::startCopying): |
| (JSC::SlotVisitor::allocateNewSpace): Use our new zero-fill-free helper |
| function for great good. |
| |
| 2012-06-17 Filip Pizlo <fpizlo@apple.com> |
| |
| DFG should attempt to use structure watchpoints for all inlined get_by_id's and put_by_id's |
| https://bugs.webkit.org/show_bug.cgi?id=89316 |
| |
| Reviewed by Oliver Hunt. |
| |
| * dfg/DFGByteCodeParser.cpp: |
| (JSC::DFG::ByteCodeParser::addStructureTransitionCheck): |
| (ByteCodeParser): |
| (JSC::DFG::ByteCodeParser::handleGetById): |
| (JSC::DFG::ByteCodeParser::parseBlock): |
| |
| 2012-06-15 Yong Li <yoli@rim.com> |
| |
| [BlackBerry] Put platform-specific GC policy in GCActivityCallback |
| https://bugs.webkit.org/show_bug.cgi?id=89236 |
| |
| Reviewed by Rob Buis. |
| |
| Add GCActivityCallbackBlackBerry.cpp and implement platform-specific |
| low memory GC policy there. |
| |
| * PlatformBlackBerry.cmake: |
| * heap/Heap.h: |
| (JSC::Heap::isSafeToCollect): Added. |
| * runtime/GCActivityCallbackBlackBerry.cpp: Added. |
| (JSC): |
| (JSC::DefaultGCActivityCallbackPlatformData::DefaultGCActivityCallbackPlatformData): |
| (DefaultGCActivityCallbackPlatformData): |
| (JSC::DefaultGCActivityCallback::DefaultGCActivityCallback): |
| (JSC::DefaultGCActivityCallback::~DefaultGCActivityCallback): |
| (JSC::DefaultGCActivityCallback::didAllocate): |
| (JSC::DefaultGCActivityCallback::willCollect): |
| (JSC::DefaultGCActivityCallback::synchronize): |
| (JSC::DefaultGCActivityCallback::cancel): |
| |
| 2012-06-15 Filip Pizlo <fpizlo@apple.com> |
| |
| DFG should be able to set watchpoints on structure transitions in the |
| method check prototype chain |
| https://bugs.webkit.org/show_bug.cgi?id=89058 |
| |
| Adding the same assertion to 32-bit that I added to 64-bit. This change |
| does not affect correctness but it's a good thing for assertion coverage. |
| |
| * dfg/DFGSpeculativeJIT32_64.cpp: |
| (JSC::DFG::SpeculativeJIT::compile): |
| |
| 2012-06-13 Filip Pizlo <fpizlo@apple.com> |
| |
| DFG should be able to set watchpoints on structure transitions in the |
| method check prototype chain |
| https://bugs.webkit.org/show_bug.cgi?id=89058 |
| |
| Reviewed by Gavin Barraclough. |
| |
| This adds the ability to set watchpoints on Structures, and then does |
| the most modest thing we can do with this ability: the DFG now sets |
| watchpoints on structure transitions in the prototype chain of method |
| checks. |
| |
| This appears to be a >1% speed-up on V8. |
| |
| * bytecode/PutByIdStatus.cpp: |
| (JSC::PutByIdStatus::computeFromLLInt): |
| (JSC::PutByIdStatus::computeFor): |
| * bytecode/StructureSet.h: |
| (JSC::StructureSet::containsOnly): |
| (StructureSet): |
| * bytecode/Watchpoint.cpp: |
| (JSC::WatchpointSet::WatchpointSet): |
| (JSC::InlineWatchpointSet::add): |
| (JSC): |
| (JSC::InlineWatchpointSet::inflateSlow): |
| (JSC::InlineWatchpointSet::freeFat): |
| * bytecode/Watchpoint.h: |
| (WatchpointSet): |
| (JSC): |
| (InlineWatchpointSet): |
| (JSC::InlineWatchpointSet::InlineWatchpointSet): |
| (JSC::InlineWatchpointSet::~InlineWatchpointSet): |
| (JSC::InlineWatchpointSet::hasBeenInvalidated): |
| (JSC::InlineWatchpointSet::isStillValid): |
| (JSC::InlineWatchpointSet::startWatching): |
| (JSC::InlineWatchpointSet::notifyWrite): |
| (JSC::InlineWatchpointSet::isFat): |
| (JSC::InlineWatchpointSet::fat): |
| (JSC::InlineWatchpointSet::inflate): |
| * dfg/DFGAbstractState.cpp: |
| (JSC::DFG::AbstractState::execute): |
| * dfg/DFGByteCodeParser.cpp: |
| (JSC::DFG::ByteCodeParser::addStructureTransitionCheck): |
| (ByteCodeParser): |
| (JSC::DFG::ByteCodeParser::parseBlock): |
| * dfg/DFGCSEPhase.cpp: |
| (JSC::DFG::CSEPhase::structureTransitionWatchpointElimination): |
| (CSEPhase): |
| (JSC::DFG::CSEPhase::performNodeCSE): |
| * dfg/DFGCommon.h: |
| * dfg/DFGGraph.cpp: |
| (JSC::DFG::Graph::dump): |
| * dfg/DFGGraph.h: |
| (JSC::DFG::Graph::isCellConstant): |
| * dfg/DFGJITCompiler.h: |
| (JSC::DFG::JITCompiler::addWeakReferences): |
| (JITCompiler): |
| * dfg/DFGNode.h: |
| (JSC::DFG::Node::hasStructure): |
| (Node): |
| (JSC::DFG::Node::structure): |
| * dfg/DFGNodeType.h: |
| (DFG): |
| * dfg/DFGPredictionPropagationPhase.cpp: |
| (JSC::DFG::PredictionPropagationPhase::propagate): |
| * dfg/DFGRepatch.cpp: |
| (JSC::DFG::emitPutTransitionStub): |
| * dfg/DFGSpeculativeJIT64.cpp: |
| (JSC::DFG::SpeculativeJIT::compile): |
| * jit/JITStubs.cpp: |
| (JSC::JITThunks::tryCachePutByID): |
| * llint/LLIntSlowPaths.cpp: |
| (JSC::LLInt::LLINT_SLOW_PATH_DECL): |
| * runtime/Structure.cpp: |
| (JSC::Structure::Structure): |
| * runtime/Structure.h: |
| (JSC::Structure::transitionWatchpointSetHasBeenInvalidated): |
| (Structure): |
| (JSC::Structure::transitionWatchpointSetIsStillValid): |
| (JSC::Structure::addTransitionWatchpoint): |
| (JSC::Structure::notifyTransitionFromThisStructure): |
| (JSC::JSCell::setStructure): |
| * runtime/SymbolTable.cpp: |
| (JSC::SymbolTableEntry::attemptToWatch): |
| |
| 2012-06-13 Filip Pizlo <fpizlo@apple.com> |
| |
| DFG should be able to set watchpoints on global variables |
| https://bugs.webkit.org/show_bug.cgi?id=88692 |
| |
| Reviewed by Geoffrey Garen. |
| |
| Rolling back in after fixing Windows build issues, and implementing |
| branchTest8 for the Qt port's strange assemblers. |
| |
| This implements global variable constant folding by allowing the optimizing |
| compiler to set a "watchpoint" on globals that it wishes to constant fold. |
| If the watchpoint fires, then an OSR exit is forced by overwriting the |
| machine code that the optimizing compiler generated with a jump. |
| |
| As such, this patch is adding quite a bit of stuff: |
| |
| - Jump replacement on those hardware targets supported by the optimizing |
| JIT. It is now possible to patch in a jump instruction over any recorded |
| watchpoint label. The jump must be "local" in the sense that it must be |
| within the range of the largest jump distance supported by a one |
| instruction jump. |
| |
| - WatchpointSets and Watchpoints. A Watchpoint is a doubly-linked list node |
| that records the location where a jump must be inserted and the |
| destination to which it should jump. Watchpoints can be added to a |
| WatchpointSet. The WatchpointSet can be fired all at once, which plants |
| all jumps. WatchpointSet also remembers if it had ever been invalidated, |
| which allows for monotonicity: we typically don't want to optimize using |
| watchpoints on something for which watchpoints had previously fired. The |
| act of notifying a WatchpointSet has a trivial fast path in case no |
| Watchpoints are registered (one-byte load+branch). |
| |
| - SpeculativeJIT::speculationWatchpoint(). It's like speculationCheck(), |
| except that you don't have to emit branches. But, you need to know what |
| WatchpointSet to add the resulting Watchpoint to. Not everything that |
| you could write a speculationCheck() for will have a WatchpointSet that |
| would get notified if the condition you were speculating against became |
| invalid. |
| |
| - SymbolTableEntry now has the ability to refer to a WatchpointSet. It can |
| do so without incurring any space overhead for those entries that don't |
| have WatchpointSets. |
| |
| - The bytecode generator infers all global function variables to be |
| watchable, and makes all stores perform the WatchpointSet's write check, |
| and marks all loads as being potentially watchable (i.e. you can compile |
| them to a watchpoint and a constant). |
| |
| Put together, this allows for fully sleazy inlining of calls to globally |
| declared functions. The inline prologue will no longer contain the load of |
| the function, or any checks of the function you're calling. I.e. it's |
| pretty much like the kind of inlining you would see in Java or C++. |
| Furthermore, the watchpointing functionality is built to be fairly general, |
| and should allow setting watchpoints on all sorts of interesting things |
| in the future. |
| |
| The sleazy inlining means that we will now sometimes inline in code paths |
| that have never executed. Previously, to inline we would have either had |
| to have executed the call (to read the call's inline cache) or have |
| executed the method check (to read the method check's inline cache). Now, |
| we might inline when the callee is a watched global variable. This |
| revealed some humorous bugs. First, constant folding disagreed with CFA |
| over what kinds of operations can clobber (example: code path A is dead |
| but stores a String into variable X, all other code paths store 0 into |
| X, and then you do CompareEq(X, 0) - CFA will say that this is a non- |
| clobbering constant, but constant folding thought it was clobbering |
| because it saw the String prediction). Second, inlining would crash if |
| the inline callee had not been compiled. This patch fixes both bugs, |
| since otherwise run-javascriptcore-tests would report regressions. |
| |
| * CMakeLists.txt: |
| * GNUmakefile.list.am: |
| * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.def: |
| * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: |
| * JavaScriptCore.xcodeproj/project.pbxproj: |
| * Target.pri: |
| * assembler/ARMv7Assembler.h: |
| (ARMv7Assembler): |
| (JSC::ARMv7Assembler::ARMv7Assembler): |
| (JSC::ARMv7Assembler::labelForWatchpoint): |
| (JSC::ARMv7Assembler::label): |
| (JSC::ARMv7Assembler::replaceWithJump): |
| (JSC::ARMv7Assembler::maxJumpReplacementSize): |
| * assembler/AbstractMacroAssembler.h: |
| (JSC): |
| (AbstractMacroAssembler): |
| (Label): |
| (JSC::AbstractMacroAssembler::watchpointLabel): |
| (JSC::AbstractMacroAssembler::readPointer): |
| * assembler/AssemblerBuffer.h: |
| * assembler/MacroAssemblerARM.h: |
| (JSC::MacroAssemblerARM::branchTest8): |
| (MacroAssemblerARM): |
| (JSC::MacroAssemblerARM::replaceWithJump): |
| (JSC::MacroAssemblerARM::maxJumpReplacementSize): |
| * assembler/MacroAssemblerARMv7.h: |
| (JSC::MacroAssemblerARMv7::load8Signed): |
| (JSC::MacroAssemblerARMv7::load16Signed): |
| (MacroAssemblerARMv7): |
| (JSC::MacroAssemblerARMv7::replaceWithJump): |
| (JSC::MacroAssemblerARMv7::maxJumpReplacementSize): |
| (JSC::MacroAssemblerARMv7::branchTest8): |
| (JSC::MacroAssemblerARMv7::jump): |
| (JSC::MacroAssemblerARMv7::makeBranch): |
| * assembler/MacroAssemblerMIPS.h: |
| (JSC::MacroAssemblerMIPS::branchTest8): |
| (MacroAssemblerMIPS): |
| (JSC::MacroAssemblerMIPS::replaceWithJump): |
| (JSC::MacroAssemblerMIPS::maxJumpReplacementSize): |
| * assembler/MacroAssemblerSH4.h: |
| (JSC::MacroAssemblerSH4::branchTest8): |
| (MacroAssemblerSH4): |
| (JSC::MacroAssemblerSH4::replaceWithJump): |
| (JSC::MacroAssemblerSH4::maxJumpReplacementSize): |
| * assembler/MacroAssemblerX86.h: |
| (MacroAssemblerX86): |
| (JSC::MacroAssemblerX86::branchTest8): |
| * assembler/MacroAssemblerX86Common.h: |
| (JSC::MacroAssemblerX86Common::replaceWithJump): |
| (MacroAssemblerX86Common): |
| (JSC::MacroAssemblerX86Common::maxJumpReplacementSize): |
| * assembler/MacroAssemblerX86_64.h: |
| (MacroAssemblerX86_64): |
| (JSC::MacroAssemblerX86_64::branchTest8): |
| * assembler/X86Assembler.h: |
| (JSC::X86Assembler::X86Assembler): |
| (X86Assembler): |
| (JSC::X86Assembler::cmpb_im): |
| (JSC::X86Assembler::testb_im): |
| (JSC::X86Assembler::labelForWatchpoint): |
| (JSC::X86Assembler::label): |
| (JSC::X86Assembler::replaceWithJump): |
| (JSC::X86Assembler::maxJumpReplacementSize): |
| (JSC::X86Assembler::X86InstructionFormatter::memoryModRM): |
| * bytecode/CodeBlock.cpp: |
| (JSC): |
| (JSC::CodeBlock::printGetByIdCacheStatus): |
| (JSC::CodeBlock::dump): |
| * bytecode/CodeBlock.h: |
| (JSC::CodeBlock::appendOSRExit): |
| (JSC::CodeBlock::appendSpeculationRecovery): |
| (CodeBlock): |
| (JSC::CodeBlock::appendWatchpoint): |
| (JSC::CodeBlock::numberOfWatchpoints): |
| (JSC::CodeBlock::watchpoint): |
| (DFGData): |
| * bytecode/DFGExitProfile.h: |
| (JSC::DFG::exitKindToString): |
| (JSC::DFG::exitKindIsCountable): |
| * bytecode/GetByIdStatus.cpp: |
| (JSC::GetByIdStatus::computeForChain): |
| * bytecode/Instruction.h: |
| (Instruction): |
| (JSC::Instruction::Instruction): |
| * bytecode/Opcode.h: |
| (JSC): |
| (JSC::padOpcodeName): |
| * bytecode/Watchpoint.cpp: Added. |
| (JSC): |
| (JSC::Watchpoint::~Watchpoint): |
| (JSC::Watchpoint::correctLabels): |
| (JSC::Watchpoint::fire): |
| (JSC::WatchpointSet::WatchpointSet): |
| (JSC::WatchpointSet::~WatchpointSet): |
| (JSC::WatchpointSet::add): |
| (JSC::WatchpointSet::notifyWriteSlow): |
| (JSC::WatchpointSet::fireAllWatchpoints): |
| * bytecode/Watchpoint.h: Added. |
| (JSC): |
| (Watchpoint): |
| (JSC::Watchpoint::Watchpoint): |
| (JSC::Watchpoint::setDestination): |
| (WatchpointSet): |
| (JSC::WatchpointSet::isStillValid): |
| (JSC::WatchpointSet::hasBeenInvalidated): |
| (JSC::WatchpointSet::startWatching): |
| (JSC::WatchpointSet::notifyWrite): |
| (JSC::WatchpointSet::addressOfIsWatched): |
| * bytecompiler/BytecodeGenerator.cpp: |
| (JSC::ResolveResult::checkValidity): |
| (JSC::BytecodeGenerator::addGlobalVar): |
| (JSC::BytecodeGenerator::BytecodeGenerator): |
| (JSC::BytecodeGenerator::resolve): |
| (JSC::BytecodeGenerator::emitResolve): |
| (JSC::BytecodeGenerator::emitResolveWithBase): |
| (JSC::BytecodeGenerator::emitResolveWithThis): |
| (JSC::BytecodeGenerator::emitGetStaticVar): |
| (JSC::BytecodeGenerator::emitPutStaticVar): |
| * bytecompiler/BytecodeGenerator.h: |
| (BytecodeGenerator): |
| * bytecompiler/NodesCodegen.cpp: |
| (JSC::FunctionCallResolveNode::emitBytecode): |
| (JSC::PostfixResolveNode::emitBytecode): |
| (JSC::PrefixResolveNode::emitBytecode): |
| (JSC::ReadModifyResolveNode::emitBytecode): |
| (JSC::AssignResolveNode::emitBytecode): |
| (JSC::ConstDeclNode::emitCodeSingle): |
| * dfg/DFGAbstractState.cpp: |
| (JSC::DFG::AbstractState::execute): |
| (JSC::DFG::AbstractState::clobberStructures): |
| * dfg/DFGAbstractState.h: |
| (AbstractState): |
| (JSC::DFG::AbstractState::didClobber): |
| * dfg/DFGByteCodeParser.cpp: |
| (JSC::DFG::ByteCodeParser::handleInlining): |
| (JSC::DFG::ByteCodeParser::parseBlock): |
| * dfg/DFGCCallHelpers.h: |
| (CCallHelpers): |
| (JSC::DFG::CCallHelpers::setupArguments): |
| * dfg/DFGCSEPhase.cpp: |
| (JSC::DFG::CSEPhase::globalVarWatchpointElimination): |
| (CSEPhase): |
| (JSC::DFG::CSEPhase::globalVarStoreElimination): |
| (JSC::DFG::CSEPhase::performNodeCSE): |
| * dfg/DFGCapabilities.h: |
| (JSC::DFG::canCompileOpcode): |
| * dfg/DFGConstantFoldingPhase.cpp: |
| (JSC::DFG::ConstantFoldingPhase::run): |
| * dfg/DFGCorrectableJumpPoint.h: |
| (JSC::DFG::CorrectableJumpPoint::isSet): |
| (CorrectableJumpPoint): |
| * dfg/DFGJITCompiler.cpp: |
| (JSC::DFG::JITCompiler::linkOSRExits): |
| (JSC::DFG::JITCompiler::link): |
| * dfg/DFGNode.h: |
| (JSC::DFG::Node::hasIdentifierNumberForCheck): |
| (Node): |
| (JSC::DFG::Node::identifierNumberForCheck): |
| (JSC::DFG::Node::hasRegisterPointer): |
| * dfg/DFGNodeType.h: |
| (DFG): |
| * dfg/DFGOSRExit.cpp: |
| (JSC::DFG::OSRExit::OSRExit): |
| * dfg/DFGOSRExit.h: |
| (OSRExit): |
| * dfg/DFGOperations.cpp: |
| * dfg/DFGOperations.h: |
| * dfg/DFGPredictionPropagationPhase.cpp: |
| (JSC::DFG::PredictionPropagationPhase::propagate): |
| * dfg/DFGSpeculativeJIT.h: |
| (JSC::DFG::SpeculativeJIT::callOperation): |
| (JSC::DFG::SpeculativeJIT::appendCall): |
| (SpeculativeJIT): |
| (JSC::DFG::SpeculativeJIT::speculationWatchpoint): |
| * dfg/DFGSpeculativeJIT32_64.cpp: |
| (JSC::DFG::SpeculativeJIT::compile): |
| * dfg/DFGSpeculativeJIT64.cpp: |
| (JSC::DFG::SpeculativeJIT::compile): |
| * interpreter/Interpreter.cpp: |
| (JSC::Interpreter::privateExecute): |
| * jit/JIT.cpp: |
| (JSC::JIT::privateCompileMainPass): |
| (JSC::JIT::privateCompileSlowCases): |
| * jit/JIT.h: |
| * jit/JITPropertyAccess.cpp: |
| (JSC::JIT::emit_op_put_global_var_check): |
| (JSC): |
| (JSC::JIT::emitSlow_op_put_global_var_check): |
| * jit/JITPropertyAccess32_64.cpp: |
| (JSC::JIT::emit_op_put_global_var_check): |
| (JSC): |
| (JSC::JIT::emitSlow_op_put_global_var_check): |
| * jit/JITStubs.cpp: |
| (JSC::DEFINE_STUB_FUNCTION): |
| (JSC): |
| * jit/JITStubs.h: |
| * llint/LLIntSlowPaths.cpp: |
| (JSC::LLInt::LLINT_SLOW_PATH_DECL): |
| (LLInt): |
| * llint/LLIntSlowPaths.h: |
| (LLInt): |
| * llint/LowLevelInterpreter32_64.asm: |
| * llint/LowLevelInterpreter64.asm: |
| * runtime/JSObject.cpp: |
| (JSC::JSObject::removeDirect): |
| * runtime/JSObject.h: |
| (JSObject): |
| * runtime/JSSymbolTableObject.h: |
| (JSC::symbolTableGet): |
| (JSC::symbolTablePut): |
| (JSC::symbolTablePutWithAttributes): |
| * runtime/SymbolTable.cpp: Added. |
| (JSC): |
| (JSC::SymbolTableEntry::copySlow): |
| (JSC::SymbolTableEntry::freeFatEntrySlow): |
| (JSC::SymbolTableEntry::couldBeWatched): |
| (JSC::SymbolTableEntry::attemptToWatch): |
| (JSC::SymbolTableEntry::addressOfIsWatched): |
| (JSC::SymbolTableEntry::addWatchpoint): |
| (JSC::SymbolTableEntry::notifyWriteSlow): |
| (JSC::SymbolTableEntry::inflateSlow): |
| * runtime/SymbolTable.h: |
| (JSC): |
| (SymbolTableEntry): |
| (Fast): |
| (JSC::SymbolTableEntry::Fast::Fast): |
| (JSC::SymbolTableEntry::Fast::isNull): |
| (JSC::SymbolTableEntry::Fast::getIndex): |
| (JSC::SymbolTableEntry::Fast::isReadOnly): |
| (JSC::SymbolTableEntry::Fast::getAttributes): |
| (JSC::SymbolTableEntry::Fast::isFat): |
| (JSC::SymbolTableEntry::SymbolTableEntry): |
| (JSC::SymbolTableEntry::~SymbolTableEntry): |
| (JSC::SymbolTableEntry::operator=): |
| (JSC::SymbolTableEntry::isNull): |
| (JSC::SymbolTableEntry::getIndex): |
| (JSC::SymbolTableEntry::getFast): |
| (JSC::SymbolTableEntry::getAttributes): |
| (JSC::SymbolTableEntry::isReadOnly): |
| (JSC::SymbolTableEntry::watchpointSet): |
| (JSC::SymbolTableEntry::notifyWrite): |
| (FatEntry): |
| (JSC::SymbolTableEntry::FatEntry::FatEntry): |
| (JSC::SymbolTableEntry::isFat): |
| (JSC::SymbolTableEntry::fatEntry): |
| (JSC::SymbolTableEntry::inflate): |
| (JSC::SymbolTableEntry::bits): |
| (JSC::SymbolTableEntry::freeFatEntry): |
| (JSC::SymbolTableEntry::pack): |
| (JSC::SymbolTableEntry::isValidIndex): |
| |
| 2012-06-13 Sheriff Bot <webkit.review.bot@gmail.com> |
| |
| Unreviewed, rolling out r120172. |
| http://trac.webkit.org/changeset/120172 |
| https://bugs.webkit.org/show_bug.cgi?id=88976 |
| |
| The patch causes compilation failures on Gtk, Qt and Apple Win |
| bots (Requested by zdobersek on #webkit). |
| |
| * CMakeLists.txt: |
| * GNUmakefile.list.am: |
| * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.def: |
| * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: |
| * JavaScriptCore.xcodeproj/project.pbxproj: |
| * Target.pri: |
| * assembler/ARMv7Assembler.h: |
| (JSC::ARMv7Assembler::nop): |
| (JSC::ARMv7Assembler::label): |
| (JSC::ARMv7Assembler::readPointer): |
| (ARMv7Assembler): |
| * assembler/AbstractMacroAssembler.h: |
| (JSC): |
| (AbstractMacroAssembler): |
| (Label): |
| * assembler/AssemblerBuffer.h: |
| * assembler/MacroAssemblerARM.h: |
| * assembler/MacroAssemblerARMv7.h: |
| (JSC::MacroAssemblerARMv7::nop): |
| (JSC::MacroAssemblerARMv7::jump): |
| (JSC::MacroAssemblerARMv7::makeBranch): |
| * assembler/MacroAssemblerMIPS.h: |
| * assembler/MacroAssemblerSH4.h: |
| * assembler/MacroAssemblerX86.h: |
| (MacroAssemblerX86): |
| (JSC::MacroAssemblerX86::moveWithPatch): |
| * assembler/MacroAssemblerX86Common.h: |
| * assembler/MacroAssemblerX86_64.h: |
| (JSC::MacroAssemblerX86_64::branchTest8): |
| * assembler/X86Assembler.h: |
| (JSC::X86Assembler::cmpb_im): |
| (JSC::X86Assembler::codeSize): |
| (JSC::X86Assembler::label): |
| (JSC::X86Assembler::X86InstructionFormatter::memoryModRM): |
| * bytecode/CodeBlock.cpp: |
| (JSC::CodeBlock::dump): |
| * bytecode/CodeBlock.h: |
| (JSC::CodeBlock::appendOSRExit): |
| (JSC::CodeBlock::appendSpeculationRecovery): |
| (DFGData): |
| * bytecode/DFGExitProfile.h: |
| (JSC::DFG::exitKindToString): |
| (JSC::DFG::exitKindIsCountable): |
| * bytecode/Instruction.h: |
| * bytecode/Opcode.h: |
| (JSC): |
| (JSC::padOpcodeName): |
| * bytecode/Watchpoint.cpp: Removed. |
| * bytecode/Watchpoint.h: Removed. |
| * bytecompiler/BytecodeGenerator.cpp: |
| (JSC::ResolveResult::checkValidity): |
| (JSC::BytecodeGenerator::addGlobalVar): |
| (JSC::BytecodeGenerator::BytecodeGenerator): |
| (JSC::BytecodeGenerator::resolve): |
| (JSC::BytecodeGenerator::emitResolve): |
| (JSC::BytecodeGenerator::emitResolveWithBase): |
| (JSC::BytecodeGenerator::emitResolveWithThis): |
| (JSC::BytecodeGenerator::emitGetStaticVar): |
| (JSC::BytecodeGenerator::emitPutStaticVar): |
| * bytecompiler/BytecodeGenerator.h: |
| (BytecodeGenerator): |
| * bytecompiler/NodesCodegen.cpp: |
| (JSC::FunctionCallResolveNode::emitBytecode): |
| (JSC::PostfixResolveNode::emitBytecode): |
| (JSC::PrefixResolveNode::emitBytecode): |
| (JSC::ReadModifyResolveNode::emitBytecode): |
| (JSC::AssignResolveNode::emitBytecode): |
| (JSC::ConstDeclNode::emitCodeSingle): |
| * dfg/DFGAbstractState.cpp: |
| (JSC::DFG::AbstractState::execute): |
| (JSC::DFG::AbstractState::clobberStructures): |
| * dfg/DFGAbstractState.h: |
| (AbstractState): |
| * dfg/DFGByteCodeParser.cpp: |
| (JSC::DFG::ByteCodeParser::handleInlining): |
| (JSC::DFG::ByteCodeParser::parseBlock): |
| * dfg/DFGCCallHelpers.h: |
| (JSC::DFG::CCallHelpers::setupArguments): |
| * dfg/DFGCSEPhase.cpp: |
| (JSC::DFG::CSEPhase::globalVarStoreElimination): |
| (JSC::DFG::CSEPhase::performNodeCSE): |
| * dfg/DFGCapabilities.h: |
| (JSC::DFG::canCompileOpcode): |
| * dfg/DFGConstantFoldingPhase.cpp: |
| (JSC::DFG::ConstantFoldingPhase::run): |
| * dfg/DFGCorrectableJumpPoint.h: |
| * dfg/DFGJITCompiler.cpp: |
| (JSC::DFG::JITCompiler::linkOSRExits): |
| (JSC::DFG::JITCompiler::link): |
| * dfg/DFGNode.h: |
| (JSC::DFG::Node::hasRegisterPointer): |
| * dfg/DFGNodeType.h: |
| (DFG): |
| * dfg/DFGOSRExit.cpp: |
| (JSC::DFG::OSRExit::OSRExit): |
| * dfg/DFGOSRExit.h: |
| (OSRExit): |
| * dfg/DFGOperations.cpp: |
| * dfg/DFGOperations.h: |
| * dfg/DFGPredictionPropagationPhase.cpp: |
| (JSC::DFG::PredictionPropagationPhase::propagate): |
| * dfg/DFGSpeculativeJIT.h: |
| (JSC::DFG::SpeculativeJIT::callOperation): |
| (JSC::DFG::SpeculativeJIT::appendCallSetResult): |
| (JSC::DFG::SpeculativeJIT::speculationCheck): |
| * dfg/DFGSpeculativeJIT32_64.cpp: |
| (JSC::DFG::SpeculativeJIT::compile): |
| * dfg/DFGSpeculativeJIT64.cpp: |
| (JSC::DFG::SpeculativeJIT::compile): |
| * jit/JIT.cpp: |
| (JSC::JIT::privateCompileMainPass): |
| (JSC::JIT::privateCompileSlowCases): |
| * jit/JIT.h: |
| * jit/JITPropertyAccess.cpp: |
| * jit/JITPropertyAccess32_64.cpp: |
| * jit/JITStubs.cpp: |
| * jit/JITStubs.h: |
| * llint/LLIntSlowPaths.cpp: |
| * llint/LLIntSlowPaths.h: |
| (LLInt): |
| * llint/LowLevelInterpreter32_64.asm: |
| * llint/LowLevelInterpreter64.asm: |
| * runtime/JSObject.cpp: |
| (JSC::JSObject::removeDirect): |
| * runtime/JSObject.h: |
| (JSObject): |
| * runtime/JSSymbolTableObject.h: |
| (JSC::symbolTableGet): |
| (JSC::symbolTablePut): |
| (JSC::symbolTablePutWithAttributes): |
| * runtime/SymbolTable.cpp: Removed. |
| * runtime/SymbolTable.h: |
| (JSC): |
| (JSC::SymbolTableEntry::isNull): |
| (JSC::SymbolTableEntry::getIndex): |
| (SymbolTableEntry): |
| (JSC::SymbolTableEntry::getAttributes): |
| (JSC::SymbolTableEntry::isReadOnly): |
| (JSC::SymbolTableEntry::pack): |
| (JSC::SymbolTableEntry::isValidIndex): |
| |
| 2012-06-12 Filip Pizlo <fpizlo@apple.com> |
| |
| DFG should be able to set watchpoints on global variables |
| https://bugs.webkit.org/show_bug.cgi?id=88692 |
| |
| Reviewed by Geoffrey Garen. |
| |
| This implements global variable constant folding by allowing the optimizing |
| compiler to set a "watchpoint" on globals that it wishes to constant fold. |
| If the watchpoint fires, then an OSR exit is forced by overwriting the |
| machine code that the optimizing compiler generated with a jump. |
| |
| As such, this patch is adding quite a bit of stuff: |
| |
| - Jump replacement on those hardware targets supported by the optimizing |
| JIT. It is now possible to patch in a jump instruction over any recorded |
| watchpoint label. The jump must be "local" in the sense that it must be |
| within the range of the largest jump distance supported by a one |
| instruction jump. |
| |
| - WatchpointSets and Watchpoints. A Watchpoint is a doubly-linked list node |
| that records the location where a jump must be inserted and the |
| destination to which it should jump. Watchpoints can be added to a |
| WatchpointSet. The WatchpointSet can be fired all at once, which plants |
| all jumps. WatchpointSet also remembers if it had ever been invalidated, |
| which allows for monotonicity: we typically don't want to optimize using |
| watchpoints on something for which watchpoints had previously fired. The |
| act of notifying a WatchpointSet has a trivial fast path in case no |
| Watchpoints are registered (one-byte load+branch). |
| |
| - SpeculativeJIT::speculationWatchpoint(). It's like speculationCheck(), |
| except that you don't have to emit branches. But, you need to know what |
| WatchpointSet to add the resulting Watchpoint to. Not everything that |
| you could write a speculationCheck() for will have a WatchpointSet that |
| would get notified if the condition you were speculating against became |
| invalid. |
| |
| - SymbolTableEntry now has the ability to refer to a WatchpointSet. It can |
| do so without incurring any space overhead for those entries that don't |
| have WatchpointSets. |
| |
| - The bytecode generator infers all global function variables to be |
| watchable, and makes all stores perform the WatchpointSet's write check, |
| and marks all loads as being potentially watchable (i.e. you can compile |
| them to a watchpoint and a constant). |
| |
| Put together, this allows for fully sleazy inlining of calls to globally |
| declared functions. The inline prologue will no longer contain the load of |
| the function, or any checks of the function you're calling. I.e. it's |
| pretty much like the kind of inlining you would see in Java or C++. |
| Furthermore, the watchpointing functionality is built to be fairly general, |
| and should allow setting watchpoints on all sorts of interesting things |
| in the future. |
| |
| The sleazy inlining means that we will now sometimes inline in code paths |
| that have never executed. Previously, to inline we would have either had |
| to have executed the call (to read the call's inline cache) or have |
| executed the method check (to read the method check's inline cache). Now, |
| we might inline when the callee is a watched global variable. This |
| revealed some humorous bugs. First, constant folding disagreed with CFA |
| over what kinds of operations can clobber (example: code path A is dead |
| but stores a String into variable X, all other code paths store 0 into |
| X, and then you do CompareEq(X, 0) - CFA will say that this is a non- |
| clobbering constant, but constant folding thought it was clobbering |
| because it saw the String prediction). Second, inlining would crash if |
| the inline callee had not been compiled. This patch fixes both bugs, |
| since otherwise run-javascriptcore-tests would report regressions. |
| |
| * CMakeLists.txt: |
| * GNUmakefile.list.am: |
| * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: |
| * JavaScriptCore.xcodeproj/project.pbxproj: |
| * Target.pri: |
| * assembler/ARMv7Assembler.h: |
| (ARMv7Assembler): |
| (JSC::ARMv7Assembler::ARMv7Assembler): |
| (JSC::ARMv7Assembler::labelForWatchpoint): |
| (JSC::ARMv7Assembler::label): |
| (JSC::ARMv7Assembler::replaceWithJump): |
| (JSC::ARMv7Assembler::maxJumpReplacementSize): |
| * assembler/AbstractMacroAssembler.h: |
| (JSC): |
| (AbstractMacroAssembler): |
| (Label): |
| (JSC::AbstractMacroAssembler::watchpointLabel): |
| * assembler/AssemblerBuffer.h: |
| * assembler/MacroAssemblerARM.h: |
| (JSC::MacroAssemblerARM::replaceWithJump): |
| (MacroAssemblerARM): |
| (JSC::MacroAssemblerARM::maxJumpReplacementSize): |
| * assembler/MacroAssemblerARMv7.h: |
| (MacroAssemblerARMv7): |
| (JSC::MacroAssemblerARMv7::replaceWithJump): |
| (JSC::MacroAssemblerARMv7::maxJumpReplacementSize): |
| (JSC::MacroAssemblerARMv7::branchTest8): |
| (JSC::MacroAssemblerARMv7::jump): |
| (JSC::MacroAssemblerARMv7::makeBranch): |
| * assembler/MacroAssemblerMIPS.h: |
| (JSC::MacroAssemblerMIPS::replaceWithJump): |
| (MacroAssemblerMIPS): |
| (JSC::MacroAssemblerMIPS::maxJumpReplacementSize): |
| * assembler/MacroAssemblerSH4.h: |
| (JSC::MacroAssemblerSH4::replaceWithJump): |
| (MacroAssemblerSH4): |
| (JSC::MacroAssemblerSH4::maxJumpReplacementSize): |
| * assembler/MacroAssemblerX86.h: |
| (MacroAssemblerX86): |
| (JSC::MacroAssemblerX86::branchTest8): |
| * assembler/MacroAssemblerX86Common.h: |
| (JSC::MacroAssemblerX86Common::replaceWithJump): |
| (MacroAssemblerX86Common): |
| (JSC::MacroAssemblerX86Common::maxJumpReplacementSize): |
| * assembler/MacroAssemblerX86_64.h: |
| (MacroAssemblerX86_64): |
| (JSC::MacroAssemblerX86_64::branchTest8): |
| * assembler/X86Assembler.h: |
| (JSC::X86Assembler::X86Assembler): |
| (X86Assembler): |
| (JSC::X86Assembler::cmpb_im): |
| (JSC::X86Assembler::testb_im): |
| (JSC::X86Assembler::labelForWatchpoint): |
| (JSC::X86Assembler::label): |
| (JSC::X86Assembler::replaceWithJump): |
| (JSC::X86Assembler::maxJumpReplacementSize): |
| (JSC::X86Assembler::X86InstructionFormatter::memoryModRM): |
| * bytecode/CodeBlock.cpp: |
| (JSC::CodeBlock::dump): |
| * bytecode/CodeBlock.h: |
| (JSC::CodeBlock::appendOSRExit): |
| (JSC::CodeBlock::appendSpeculationRecovery): |
| (CodeBlock): |
| (JSC::CodeBlock::appendWatchpoint): |
| (JSC::CodeBlock::numberOfWatchpoints): |
| (JSC::CodeBlock::watchpoint): |
| (DFGData): |
| * bytecode/DFGExitProfile.h: |
| (JSC::DFG::exitKindToString): |
| (JSC::DFG::exitKindIsCountable): |
| * bytecode/Instruction.h: |
| (Instruction): |
| (JSC::Instruction::Instruction): |
| * bytecode/Opcode.h: |
| (JSC): |
| (JSC::padOpcodeName): |
| * bytecode/Watchpoint.cpp: Added. |
| (JSC): |
| (JSC::Watchpoint::~Watchpoint): |
| (JSC::Watchpoint::correctLabels): |
| (JSC::Watchpoint::fire): |
| (JSC::WatchpointSet::WatchpointSet): |
| (JSC::WatchpointSet::~WatchpointSet): |
| (JSC::WatchpointSet::add): |
| (JSC::WatchpointSet::notifyWriteSlow): |
| (JSC::WatchpointSet::fireAllWatchpoints): |
| * bytecode/Watchpoint.h: Added. |
| (JSC): |
| (Watchpoint): |
| (JSC::Watchpoint::Watchpoint): |
| (JSC::Watchpoint::setDestination): |
| (WatchpointSet): |
| (JSC::WatchpointSet::isStillValid): |
| (JSC::WatchpointSet::hasBeenInvalidated): |
| (JSC::WatchpointSet::startWatching): |
| (JSC::WatchpointSet::notifyWrite): |
| (JSC::WatchpointSet::addressOfIsWatched): |
| * bytecompiler/BytecodeGenerator.cpp: |
| (JSC::ResolveResult::checkValidity): |
| (JSC::BytecodeGenerator::addGlobalVar): |
| (JSC::BytecodeGenerator::BytecodeGenerator): |
| (JSC::BytecodeGenerator::resolve): |
| (JSC::BytecodeGenerator::emitResolve): |
| (JSC::BytecodeGenerator::emitResolveWithBase): |
| (JSC::BytecodeGenerator::emitResolveWithThis): |
| (JSC::BytecodeGenerator::emitGetStaticVar): |
| (JSC::BytecodeGenerator::emitPutStaticVar): |
| * bytecompiler/BytecodeGenerator.h: |
| (BytecodeGenerator): |
| * bytecompiler/NodesCodegen.cpp: |
| (JSC::FunctionCallResolveNode::emitBytecode): |
| (JSC::PostfixResolveNode::emitBytecode): |
| (JSC::PrefixResolveNode::emitBytecode): |
| (JSC::ReadModifyResolveNode::emitBytecode): |
| (JSC::AssignResolveNode::emitBytecode): |
| (JSC::ConstDeclNode::emitCodeSingle): |
| * dfg/DFGAbstractState.cpp: |
| (JSC::DFG::AbstractState::execute): |
| (JSC::DFG::AbstractState::clobberStructures): |
| * dfg/DFGAbstractState.h: |
| (AbstractState): |
| (JSC::DFG::AbstractState::didClobber): |
| * dfg/DFGByteCodeParser.cpp: |
| (JSC::DFG::ByteCodeParser::handleInlining): |
| (JSC::DFG::ByteCodeParser::parseBlock): |
| * dfg/DFGCCallHelpers.h: |
| (CCallHelpers): |
| (JSC::DFG::CCallHelpers::setupArguments): |
| * dfg/DFGCSEPhase.cpp: |
| (JSC::DFG::CSEPhase::globalVarWatchpointElimination): |
| (CSEPhase): |
| (JSC::DFG::CSEPhase::globalVarStoreElimination): |
| (JSC::DFG::CSEPhase::performNodeCSE): |
| * dfg/DFGCapabilities.h: |
| (JSC::DFG::canCompileOpcode): |
| * dfg/DFGConstantFoldingPhase.cpp: |
| (JSC::DFG::ConstantFoldingPhase::run): |
| * dfg/DFGCorrectableJumpPoint.h: |
| (JSC::DFG::CorrectableJumpPoint::isSet): |
| (CorrectableJumpPoint): |
| * dfg/DFGJITCompiler.cpp: |
| (JSC::DFG::JITCompiler::linkOSRExits): |
| (JSC::DFG::JITCompiler::link): |
| * dfg/DFGNode.h: |
| (JSC::DFG::Node::hasIdentifierNumberForCheck): |
| (Node): |
| (JSC::DFG::Node::identifierNumberForCheck): |
| (JSC::DFG::Node::hasRegisterPointer): |
| * dfg/DFGNodeType.h: |
| (DFG): |
| * dfg/DFGOSRExit.cpp: |
| (JSC::DFG::OSRExit::OSRExit): |
| * dfg/DFGOSRExit.h: |
| (OSRExit): |
| * dfg/DFGOperations.cpp: |
| * dfg/DFGOperations.h: |
| * dfg/DFGPredictionPropagationPhase.cpp: |
| (JSC::DFG::PredictionPropagationPhase::propagate): |
| * dfg/DFGSpeculativeJIT.h: |
| (JSC::DFG::SpeculativeJIT::callOperation): |
| (JSC::DFG::SpeculativeJIT::appendCall): |
| (SpeculativeJIT): |
| (JSC::DFG::SpeculativeJIT::speculationWatchpoint): |
| * dfg/DFGSpeculativeJIT32_64.cpp: |
| (JSC::DFG::SpeculativeJIT::compile): |
| * dfg/DFGSpeculativeJIT64.cpp: |
| (JSC::DFG::SpeculativeJIT::compile): |
| * jit/JIT.cpp: |
| (JSC::JIT::privateCompileMainPass): |
| (JSC::JIT::privateCompileSlowCases): |
| * jit/JIT.h: |
| * jit/JITPropertyAccess.cpp: |
| (JSC::JIT::emit_op_put_global_var_check): |
| (JSC): |
| (JSC::JIT::emitSlow_op_put_global_var_check): |
| * jit/JITPropertyAccess32_64.cpp: |
| (JSC::JIT::emit_op_put_global_var_check): |
| (JSC): |
| (JSC::JIT::emitSlow_op_put_global_var_check): |
| * jit/JITStubs.cpp: |
| (JSC::JITThunks::JITThunks): |
| (JSC::DEFINE_STUB_FUNCTION): |
| (JSC): |
| * jit/JITStubs.h: |
| * llint/LLIntSlowPaths.cpp: |
| (JSC::LLInt::LLINT_SLOW_PATH_DECL): |
| (LLInt): |
| * llint/LLIntSlowPaths.h: |
| (LLInt): |
| * llint/LowLevelInterpreter32_64.asm: |
| * llint/LowLevelInterpreter64.asm: |
| * runtime/JSObject.cpp: |
| (JSC::JSObject::removeDirect): |
| * runtime/JSObject.h: |
| (JSObject): |
| * runtime/JSSymbolTableObject.h: |
| (JSC::symbolTableGet): |
| (JSC::symbolTablePut): |
| (JSC::symbolTablePutWithAttributes): |
| * runtime/SymbolTable.cpp: Added. |
| (JSC): |
| (JSC::SymbolTableEntry::copySlow): |
| (JSC::SymbolTableEntry::freeFatEntrySlow): |
| (JSC::SymbolTableEntry::couldBeWatched): |
| (JSC::SymbolTableEntry::attemptToWatch): |
| (JSC::SymbolTableEntry::addressOfIsWatched): |
| (JSC::SymbolTableEntry::addWatchpoint): |
| (JSC::SymbolTableEntry::notifyWriteSlow): |
| (JSC::SymbolTableEntry::inflateSlow): |
| * runtime/SymbolTable.h: |
| (JSC): |
| (SymbolTableEntry): |
| (Fast): |
| (JSC::SymbolTableEntry::Fast::Fast): |
| (JSC::SymbolTableEntry::Fast::isNull): |
| (JSC::SymbolTableEntry::Fast::getIndex): |
| (JSC::SymbolTableEntry::Fast::isReadOnly): |
| (JSC::SymbolTableEntry::Fast::getAttributes): |
| (JSC::SymbolTableEntry::Fast::isFat): |
| (JSC::SymbolTableEntry::SymbolTableEntry): |
| (JSC::SymbolTableEntry::~SymbolTableEntry): |
| (JSC::SymbolTableEntry::operator=): |
| (JSC::SymbolTableEntry::isNull): |
| (JSC::SymbolTableEntry::getIndex): |
| (JSC::SymbolTableEntry::getFast): |
| (JSC::SymbolTableEntry::getAttributes): |
| (JSC::SymbolTableEntry::isReadOnly): |
| (JSC::SymbolTableEntry::watchpointSet): |
| (JSC::SymbolTableEntry::notifyWrite): |
| (FatEntry): |
| (JSC::SymbolTableEntry::FatEntry::FatEntry): |
| (JSC::SymbolTableEntry::isFat): |
| (JSC::SymbolTableEntry::fatEntry): |
| (JSC::SymbolTableEntry::inflate): |
| (JSC::SymbolTableEntry::bits): |
| (JSC::SymbolTableEntry::freeFatEntry): |
| (JSC::SymbolTableEntry::pack): |
| (JSC::SymbolTableEntry::isValidIndex): |
| |
| 2012-06-12 Filip Pizlo <fpizlo@apple.com> |
| |
| Unreviewed build fix for ARMv7 debug builds. |
| |
| * jit/JITStubs.cpp: |
| (JSC::JITThunks::JITThunks): |
| |
| 2012-06-12 Geoffrey Garen <ggaren@apple.com> |
| |
| Build fix for case-sensitive file systems: use the right case. |
| |
| * heap/ListableHandler.h: |
| |
| 2012-06-11 Geoffrey Garen <ggaren@apple.com> |
| |
| GC should be 1.7X faster |
| https://bugs.webkit.org/show_bug.cgi?id=88840 |
| |
| Reviewed by Oliver Hunt. |
| |
| I profiled, and removed anything that showed up as a concurrency |
| bottleneck. Then, I added 3 threads to our max thread count, since we |
| can scale up to more threads now. |
| |
| * heap/BlockAllocator.cpp: |
| (JSC::BlockAllocator::BlockAllocator): |
| (JSC::BlockAllocator::~BlockAllocator): |
| (JSC::BlockAllocator::releaseFreeBlocks): |
| (JSC::BlockAllocator::waitForRelativeTimeWhileHoldingLock): |
| (JSC::BlockAllocator::waitForRelativeTime): |
| (JSC::BlockAllocator::blockFreeingThreadMain): |
| * heap/BlockAllocator.h: |
| (BlockAllocator): |
| (JSC::BlockAllocator::allocate): |
| (JSC::BlockAllocator::deallocate): Use a spin lock for the common case |
| where we're just popping a linked list. (A pthread mutex would sleep our |
| thread even if the lock were only contended for a microsecond.) |
| |
| Scope the lock to avoid holding it while allocating VM, since that's a |
| slow activity and it doesn't modify any of our data structures. |
| |
| We still use a pthread mutex to handle our condition variable since we |
| have to, and it's not a hot path. |
| |
| * heap/CopiedSpace.cpp: |
| (JSC::CopiedSpace::CopiedSpace): |
| (JSC::CopiedSpace::doneFillingBlock): |
| * heap/CopiedSpace.h: |
| (JSC::CopiedSpace::CopiedSpace): Use a spin lock for the to space lock, |
| since it just guards linked list and hash table manipulation. |
| |
| * heap/MarkStack.cpp: |
| (JSC::MarkStackSegmentAllocator::MarkStackSegmentAllocator): |
| (JSC::MarkStackSegmentAllocator::allocate): |
| (JSC::MarkStackSegmentAllocator::release): |
| (JSC::MarkStackSegmentAllocator::shrinkReserve): Use a spin lock, since |
| we're just managing a linked list. |
| |
| (JSC::MarkStackArray::donateSomeCellsTo): Changed donation to be proportional |
| to our current stack size. This fixes cases where we used to donate too |
| much. Interestingly, donating too much was starving the donor (when it |
| ran out of work later) *and* the recipient (since it had to wait on a |
| long donation operation to complete before it could acquire the lock). |
| |
| In the worst case, we're still guaranteed to donate N cells in roughly log N time. |
| |
| This change also fixes cases where we used to donate too little, since |
| we would always keep a fixed minimum number of cells. In the worst case, |
| with N marking threads, would could have N large object graph roots in |
| our stack for the duration of GC, and scale to only 1 thread. |
| |
| It's an interesting observation that a single object in the mark stack |
| might represent an arbitrarily large object graph -- and only the act |
| of marking can find out. |
| |
| (JSC::MarkStackArray::stealSomeCellsFrom): Steal in proportion to idle |
| threads. Once again, this fixes cases where constants could cause us |
| to steal too much or too little. |
| |
| (JSC::SlotVisitor::donateKnownParallel): Always wake up other threads |
| if they're idle. We can afford to do this because we're conservative |
| about when we donate. |
| |
| (JSC::SlotVisitor::drainFromShared): |
| * heap/MarkStack.h: |
| (MarkStackSegmentAllocator): |
| (MarkStackArray): |
| (JSC): |
| * heap/SlotVisitor.h: Merged the "should I donate?" decision into a |
| single function, for simplicity. |
| |
| * runtime/Options.cpp: |
| (minimumNumberOfScansBetweenRebalance): Reduced the delay before donation |
| a lot. We can afford to do this because, in the common case, donation is |
| a single branch that decides not to donate. |
| |
| (cpusToUse): Use more CPUs now, since we scale better now. |
| |
| * runtime/Options.h: |
| (Options): Removed now-unused variables. |
| |
| 2012-06-12 Filip Pizlo <fpizlo@apple.com> |
| |
| REGRESSION(120121): inspector tests crash in DFG |
| https://bugs.webkit.org/show_bug.cgi?id=88941 |
| |
| Reviewed by Geoffrey Garen. |
| |
| The CFG simplifier has two different ways of fixing up GetLocal, Phantom, and Flush. If we've |
| already fixed up the node one way, we shouldn't try the other way. The reason why we shouldn't |
| is that the second way depends on the node referring to other nodes in the to-be-jettisoned |
| block. After fixup they potentially will refer to nodes in the block being merged to. |
| |
| * dfg/DFGCFGSimplificationPhase.cpp: |
| (JSC::DFG::CFGSimplificationPhase::fixPossibleGetLocal): |
| (JSC::DFG::CFGSimplificationPhase::mergeBlocks): |
| |
| 2012-06-12 Leo Yang <leo.yang@torchmobile.com.cn> |
| |
| Dynamic hash table in DOMObjectHashTableMap is wrong in multiple threads |
| https://bugs.webkit.org/show_bug.cgi?id=87334 |
| |
| Reviewed by Geoffrey Garen. |
| |
| Add a copy member function to JSC::HasTable. This function will copy all data |
| members except for *table* which contains thread specific data that prevents |
| up copying it. When you want to copy a JSC::HashTable that was constructed |
| on another thread you should call JSC::HashTable::copy(). |
| |
| * runtime/Lookup.h: |
| (JSC::HashTable::copy): |
| (HashTable): |
| |
| 2012-06-12 Filip Pizlo <fpizlo@apple.com> |
| |
| DFG should not ASSERT if you have a double use of a variable that is not revealed to be a double |
| until after CFG simplification |
| https://bugs.webkit.org/show_bug.cgi?id=88927 |
| <rdar://problem/11513971> |
| |
| Reviewed by Geoffrey Garen. |
| |
| Speculation fixup needs to run if simplification did things, because simplification can change |
| predictions - particularly if you had a control flow path that stored weird things into a |
| variable, but that path got axed by the simplifier. |
| |
| Running fixup in the fixpoint requires making it idempotent, which it previously wasn't. Only |
| one place needed to be changed, namely the un-MustGenerate-ion of ValueToInt32. |
| |
| * dfg/DFGDriver.cpp: |
| (JSC::DFG::compile): |
| * dfg/DFGFixupPhase.cpp: |
| (JSC::DFG::FixupPhase::fixupNode): |
| |
| 2012-06-12 Filip Pizlo <fpizlo@apple.com> |
| |
| REGRESSION (r119779): Javascript TypeError: 'undefined' is not an object |
| https://bugs.webkit.org/show_bug.cgi?id=88783 |
| <rdar://problem/11640299> |
| |
| Reviewed by Geoffrey Garen. |
| |
| If you don't keep alive the base of an object access over the various checks |
| you do for the prototype chain, you're going to have a bad time. |
| |
| * dfg/DFGByteCodeParser.cpp: |
| (JSC::DFG::ByteCodeParser::handleGetById): |
| |
| 2012-06-12 Hojong Han <hojong.han@samsung.com> |
| |
| Property names of the built-in object cannot be retrieved |
| after trying to delete one of its properties |
| https://bugs.webkit.org/show_bug.cgi?id=86461 |
| |
| Reviewed by Gavin Barraclough. |
| |
| * runtime/JSObject.cpp: |
| (JSC::getClassPropertyNames): |
| (JSC::JSObject::getOwnPropertyNames): |
| |
| 2012-06-11 Gyuyoung Kim <gyuyoung.kim@samsung.com> |
| |
| [CMAKE][EFL] Remove duplicated executable output path |
| https://bugs.webkit.org/show_bug.cgi?id=88765 |
| |
| Reviewed by Daniel Bates. |
| |
| CMake files for EFL port have redefined executable output path. However, EFL port doesn't |
| need to define again because it is already defined in top-level CMake file. |
| |
| * shell/CMakeLists.txt: |
| |
| 2012-06-11 Carlos Garcia Campos <cgarcia@igalia.com> |
| |
| Unreviewed. Fix make distcheck issues. |
| |
| * GNUmakefile.list.am: Remove non existent header file. |
| |
| 2012-06-10 Patrick Gansterer <paroga@webkit.org> |
| |
| Unreviewed. Build fix for !ENABLE(JIT) after r119844 and r119925. |
| |
| * runtime/Executable.h: |
| (ExecutableBase): |
| (JSC::ExecutableBase::clearCodeVirtual): |
| |
| 2012-06-10 Patrick Gansterer <paroga@webkit.org> |
| |
| Unreviewed. Build fix for !ENABLE(JIT) after r119844. |
| |
| * runtime/Executable.h: |
| (ExecutableBase): |
| (JSC): |
| |
| 2012-06-09 Dominic Cooney <dominicc@chromium.org> |
| |
| [Chromium] Remove JavaScriptCore dependencies from gyp |
| https://bugs.webkit.org/show_bug.cgi?id=88510 |
| |
| Reviewed by Adam Barth. |
| |
| Chromium doesn't support JSC any more and there doesn't seem to be |
| a strong interest in using GYP as the common build system in other |
| ports. |
| |
| * JavaScriptCore.gyp/JavaScriptCore.gyp: WebCore still depends on YARR interpreter. |
| * JavaScriptCore.gypi: Only include YARR source. |
| * gyp/JavaScriptCore.gyp: Removed. |
| * gyp/gtk.gyp: Removed. |
| |
| 2012-06-09 Geoffrey Garen <ggaren@apple.com> |
| |
| Unreviewed, rolling back in part2 of r118646. |
| |
| This patch removes eager finalization. |
| |
| Weak pointer finalization should be lazy |
| https://bugs.webkit.org/show_bug.cgi?id=87599 |
| |
| Reviewed by Sam Weinig. |
| |
| * heap/Heap.cpp: |
| (JSC::Heap::collect): Don't finalize eagerly -- we'll do it lazily. |
| |
| * heap/MarkedBlock.cpp: |
| (JSC::MarkedBlock::sweep): Do sweep weak sets when sweeping a block, |
| since we won't get another chance. |
| |
| * heap/MarkedBlock.h: |
| (JSC::MarkedBlock::sweepWeakSet): |
| * heap/MarkedSpace.cpp: |
| (MarkedSpace::WeakSetSweep): |
| * heap/MarkedSpace.h: |
| (JSC::MarkedSpace::sweepWeakSets): Removed now-unused code. |
| |
| 2012-06-09 Sukolsak Sakshuwong <sukolsak@google.com> |
| |
| Add UNDO_MANAGER flag |
| https://bugs.webkit.org/show_bug.cgi?id=87908 |
| |
| Reviewed by Tony Chang. |
| |
| * Configurations/FeatureDefines.xcconfig: |
| |
| 2012-06-08 Geoffrey Garen <ggaren@apple.com> |
| |
| Unreviewed, rolling back in part1 of r118646. |
| |
| This patch includes everything necessary for lazy finalization, but |
| keeps eager finalization enabled for the time being. |
| |
| Weak pointer finalization should be lazy |
| https://bugs.webkit.org/show_bug.cgi?id=87599 |
| |
| Reviewed by Sam Weinig. |
| |
| * heap/MarkedBlock.cpp: |
| * heap/MarkedBlock.h: |
| (JSC::MarkedBlock::resetAllocator): |
| * heap/MarkedSpace.cpp: |
| (JSC::MarkedSpace::resetAllocators): |
| * heap/MarkedSpace.h: |
| (JSC::MarkedSpace::resetAllocators): Don't force allocator reset anymore. |
| It will happen automatically when a weak set is swept. It's simpler to |
| have only one canonical way for this to happen, and it wasn't buying |
| us anything to do it eagerly. |
| * heap/WeakBlock.cpp: |
| (JSC::WeakBlock::sweep): Don't short-circuit a sweep unless we know |
| the sweep would be a no-op. If even one finalizer is pending, we need to |
| run it, since we won't get another chance. |
| * heap/WeakSet.cpp: |
| (JSC::WeakSet::sweep): This loop can be simpler now that |
| WeakBlock::sweep() does what we mean. |
| Reset our allocator after a sweep because this is the optimal time to |
| start trying to recycle old weak pointers. |
| (JSC::WeakSet::tryFindAllocator): Don't sweep when searching for an |
| allocator because we've swept already, and forcing a new sweep would be |
| wasteful. |
| * heap/WeakSet.h: |
| (JSC::WeakSet::shrink): Be sure to reset our allocator after a shrink |
| because the shrink may have removed the block the allocator was going to |
| allocate out of. |
| |
| 2012-06-08 Gavin Barraclough <barraclough@apple.com> |
| |
| Unreviewed roll out r119795. |
| |
| This broke jquery/core.html |
| |
| * dfg/DFGSpeculativeJIT.h: |
| (JSC::DFG::SpeculativeJIT::emitAllocateBasicJSObject): |
| * jit/JITInlineMethods.h: |
| (JSC::JIT::emitAllocateBasicJSObject): |
| * llint/LowLevelInterpreter.asm: |
| * runtime/JSGlobalData.h: |
| (JSGlobalData): |
| * runtime/JSGlobalThis.cpp: |
| (JSC::JSGlobalThis::setUnwrappedObject): |
| * runtime/JSObject.cpp: |
| (JSC::JSObject::visitChildren): |
| (JSC::JSObject::createInheritorID): |
| * runtime/JSObject.h: |
| (JSObject): |
| (JSC::JSObject::resetInheritorID): |
| (JSC): |
| (JSC::JSObject::offsetOfInheritorID): |
| (JSC::JSObject::inheritorID): |
| |
| 2012-06-08 Filip Pizlo <fpizlo@apple.com> |
| |
| PredictedType should be called SpeculatedType |
| https://bugs.webkit.org/show_bug.cgi?id=88477 |
| |
| Unreviewed, fix a renaming goof from http://trac.webkit.org/changeset/119660. |
| I accidentally renamed ByteCodeParser::getPrediction to |
| ByteCodeParser::getSpeculation. That was not the intent. This changes it |
| back. |
| |
| * dfg/DFGByteCodeParser.cpp: |
| (JSC::DFG::ByteCodeParser::addCall): |
| (JSC::DFG::ByteCodeParser::getPredictionWithoutOSRExit): |
| (JSC::DFG::ByteCodeParser::getPrediction): |
| (JSC::DFG::ByteCodeParser::handleCall): |
| (JSC::DFG::ByteCodeParser::parseBlock): |
| |
| 2012-06-08 Andy Wingo <wingo@igalia.com> |
| |
| Explictly mark stubs called by JIT as being internal |
| https://bugs.webkit.org/show_bug.cgi?id=88552 |
| |
| Reviewed by Filip Pizlo. |
| |
| * dfg/DFGOSRExitCompiler.h: |
| * dfg/DFGOperations.cpp: |
| * dfg/DFGOperations.h: |
| * jit/HostCallReturnValue.h: |
| * jit/JITStubs.cpp: |
| * jit/JITStubs.h: |
| * jit/ThunkGenerators.cpp: |
| * llint/LLIntSlowPaths.h: Mark a bunch of stubs as being |
| WTF_INTERNAL. Change most calls to SYMBOL_STRING_RELOCATION to |
| LOCAL_REFERENCE, or GLOBAL_REFERENCE in the case of the wrappers |
| to truly global symbols. |
| * offlineasm/asm.rb: Generate LOCAL_REFERENCE instead of |
| SYMBOL_STRING_RELOCATION. |
| |
| 2012-06-08 Geoffrey Garen <ggaren@apple.com> |
| |
| Don't rely on weak pointers for eager CodeBlock finalization |
| https://bugs.webkit.org/show_bug.cgi?id=88465 |
| |
| Reviewed by Gavin Barraclough. |
| |
| This is incompatible with lazy weak pointer finalization. |
| |
| I considered just making CodeBlock finalization lazy-friendly, but it |
| turns out that the heap is already way up in CodeBlock's business when |
| it comes to finalization, so I decided to finish the job and move full |
| responsibility for CodeBlock finalization into the heap. |
| |
| * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.def: Maybe this |
| will build. |
| |
| * debugger/Debugger.cpp: Updated for rename. |
| |
| * heap/Heap.cpp: |
| (JSC::Heap::deleteAllCompiledCode): Renamed for consistency. Fixed a bug |
| where we would not delete code for a code block that had been previously |
| jettisoned. I don't know if this happens in practice -- I mostly did |
| this to improve consistency with deleteUnmarkedCompiledCode. |
| |
| (JSC::Heap::deleteUnmarkedCompiledCode): New function, responsible for |
| eager finalization of unmarked code blocks. |
| |
| (JSC::Heap::collect): Updated for rename. Updated to call |
| deleteUnmarkedCompiledCode(), which takes care of jettisoned DFG code |
| blocks too. |
| |
| (JSC::Heap::addCompiledCode): Renamed, since this points to all code |
| now, not just functions. |
| |
| * heap/Heap.h: |
| (Heap): Keep track of all user code, not just functions. This is a |
| negligible additional overhead, since most code is function code. |
| |
| * runtime/Executable.cpp: |
| (JSC::*::finalize): Removed these functions, since we don't rely on |
| weak pointer finalization anymore. |
| |
| (JSC::FunctionExecutable::FunctionExecutable): Moved linked-list stuff |
| into base class so all executables can be in the list. |
| |
| (JSC::EvalExecutable::clearCode): |
| (JSC::ProgramExecutable::clearCode): |
| (JSC::FunctionExecutable::clearCode): All we need to do is delete our |
| CodeBlock -- that will delete all of its internal data structures. |
| |
| (JSC::FunctionExecutable::clearCodeIfNotCompiling): Factored out a helper |
| function to improve clarity. |
| |
| * runtime/Executable.h: |
| (JSC::ExecutableBase): Moved linked-list stuff |
| into base class so all executables can be in the list. |
| |
| (JSC::NativeExecutable::create): |
| (NativeExecutable): |
| (ScriptExecutable): |
| (JSC::ScriptExecutable::finishCreation): |
| (JSC::EvalExecutable::create): |
| (EvalExecutable): |
| (JSC::ProgramExecutable::create): |
| (ProgramExecutable): |
| (FunctionExecutable): |
| (JSC::FunctionExecutable::create): Don't use a finalizer -- the heap |
| will call us back to destroy our code block. |
| |
| (JSC::FunctionExecutable::discardCode): Renamed to clearCodeIfNotCompiling() |
| for clarity. |
| |
| (JSC::FunctionExecutable::isCompiling): New helper function, for clarity. |
| |
| (JSC::ScriptExecutable::clearCodeVirtual): New helper function, since |
| the heap needs to make polymorphic calls to clear code. |
| |
| * runtime/JSGlobalData.cpp: |
| (JSC::StackPreservingRecompiler::operator()): |
| * runtime/JSGlobalObject.cpp: |
| (JSC::DynamicGlobalObjectScope::DynamicGlobalObjectScope): Updated for |
| renames. |
| |
| 2012-06-07 Filip Pizlo <fpizlo@apple.com> |
| |
| DFG should inline prototype chain accesses, and do the right things if the |
| specific function optimization is available |
| https://bugs.webkit.org/show_bug.cgi?id=88594 |
| |
| Reviewed by Gavin Barraclough. |
| |
| Looks like a 3% win on V8. |
| |
| * bytecode/CodeBlock.h: |
| (JSC::Structure::prototypeForLookup): |
| (JSC): |
| * bytecode/GetByIdStatus.cpp: |
| (JSC::GetByIdStatus::computeFromLLInt): |
| (JSC): |
| (JSC::GetByIdStatus::computeForChain): |
| (JSC::GetByIdStatus::computeFor): |
| * bytecode/GetByIdStatus.h: |
| (JSC::GetByIdStatus::GetByIdStatus): |
| (JSC::GetByIdStatus::isSimple): |
| (JSC::GetByIdStatus::chain): |
| (JSC::GetByIdStatus::specificValue): |
| (GetByIdStatus): |
| * bytecode/StructureSet.h: |
| (StructureSet): |
| (JSC::StructureSet::singletonStructure): |
| * bytecode/StructureStubInfo.h: |
| (JSC::StructureStubInfo::initGetByIdProto): |
| (JSC::StructureStubInfo::initGetByIdChain): |
| * dfg/DFGByteCodeParser.cpp: |
| (JSC::DFG::ByteCodeParser::handleGetById): |
| * dfg/DFGRepatch.cpp: |
| (JSC::DFG::tryCacheGetByID): |
| * jit/JITStubs.cpp: |
| (JSC::JITThunks::tryCacheGetByID): |
| * runtime/JSGlobalObject.h: |
| (JSC::Structure::prototypeForLookup): |
| (JSC): |
| * runtime/Structure.h: |
| (Structure): |
| |
| 2012-06-07 Gavin Barraclough <barraclough@apple.com> |
| |
| Remove JSObject::m_inheritorID |
| https://bugs.webkit.org/show_bug.cgi?id=88378 |
| |
| Reviewed by Geoff Garen. |
| |
| This is rarely used, and not performance critical (the commonly accessed copy is cached on JSFunction), |
| and most objects don't need an inheritorID (this value is only used if the object is used as a prototype). |
| Instead use a private named value in the object's property storage. |
| |
| * dfg/DFGSpeculativeJIT.h: |
| (JSC::DFG::SpeculativeJIT::emitAllocateBasicJSObject): |
| - No need m_inheritorID to initialize! |
| * jit/JITInlineMethods.h: |
| (JSC::JIT::emitAllocateBasicJSObject): |
| - No need m_inheritorID to initialize! |
| * llint/LowLevelInterpreter.asm: |
| - No need m_inheritorID to initialize! |
| * runtime/JSGlobalData.h: |
| (JSGlobalData): |
| - Added private name 'm_inheritorIDKey'. |
| * runtime/JSGlobalThis.cpp: |
| (JSC::JSGlobalThis::setUnwrappedObject): |
| - resetInheritorID is now passed a JSGlobalData&. |
| * runtime/JSObject.cpp: |
| (JSC::JSObject::visitChildren): |
| - No m_inheritorID to be marked. |
| (JSC::JSObject::createInheritorID): |
| - Store the newly created inheritorID in the property map. |
| * runtime/JSObject.h: |
| (JSC::JSObject::resetInheritorID): |
| - Remove the inheritorID from property storage. |
| (JSC::JSObject::inheritorID): |
| - Read the inheritorID from property storage. |
| |
| 2012-06-07 Gavin Barraclough <barraclough@apple.com> |
| |
| Math.pow on iOS does not support denormal numbers. |
| https://bugs.webkit.org/show_bug.cgi?id=88592 |
| |
| Reviewed by Filip Pizlo. |
| |
| Import an implementation from fdlibm, detect cases where it is safe to use the system |
| implementation & where we should fall back to fdlibm. |
| |
| * runtime/MathObject.cpp: |
| (JSC::isDenormal): |
| (JSC::isEdgeCase): |
| (JSC::mathPow): |
| - On iOS, detect cases where denormal support may be required & use fdlibm in these cases. |
| (JSC::mathProtoFuncPow): |
| - Changed to use mathPow. |
| (JSC::fdlibmScalbn): |
| (JSC::fdlibmPow): |
| - These functions imported from fdlibm; original style retained to ease future merging. |
| |
| 2012-06-07 Patrick Gansterer <paroga@webkit.org> |
| |
| Unreviewed. Build fix for !ENABLE(JIT) after r119441. |
| |
| * interpreter/Interpreter.cpp: |
| (JSC::Interpreter::privateExecute): |
| |
| 2012-06-07 Andy Wingo <wingo@igalia.com> |
| |
| Unreviewed build fix after r119593. |
| |
| * llint/LLIntOfflineAsmConfig.h (OFFLINE_ASM_GLOBAL_LABEL): Fix |
| uses of "name" to be "label", the macro's parameter. Otherwise we |
| serialize mentions of the literal symbol "name" into the objcode. |
| Causes a build error using GNU ld (not gold). |
| |
| 2012-06-06 Ryosuke Niwa <rniwa@webkit.org> |
| |
| Chromium build fix attempt. Why do we need to list these files in gyp!? |
| |
| * JavaScriptCore.gypi: |
| |
| 2012-06-06 Filip Pizlo <fpizlo@apple.com> |
| |
| PredictedType should be called SpeculatedType |
| https://bugs.webkit.org/show_bug.cgi?id=88477 |
| |
| Rubber stamped by Gavin Barraclough. |
| |
| * CMakeLists.txt: |
| * GNUmakefile.list.am: |
| * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: |
| * JavaScriptCore.xcodeproj/project.pbxproj: |
| * Target.pri: |
| * bytecode/CodeBlock.cpp: |
| (JSC::CodeBlock::shouldOptimizeNow): |
| (JSC::CodeBlock::dumpValueProfiles): |
| * bytecode/CodeBlock.h: |
| (JSC::CodeBlock::valueProfilePredictionForBytecodeOffset): |
| * bytecode/LazyOperandValueProfile.cpp: |
| (JSC::LazyOperandValueProfileParser::prediction): |
| * bytecode/LazyOperandValueProfile.h: |
| (LazyOperandValueProfileParser): |
| * bytecode/PredictedType.cpp: Removed. |
| * bytecode/PredictedType.h: Removed. |
| * bytecode/SpeculatedType.cpp: Copied from Source/JavaScriptCore/bytecode/PredictedType.cpp. |
| (JSC::speculationToString): |
| (JSC::speculationToAbbreviatedString): |
| (JSC::speculationFromClassInfo): |
| (JSC::speculationFromStructure): |
| (JSC::speculationFromCell): |
| (JSC::speculationFromValue): |
| * bytecode/SpeculatedType.h: Copied from Source/JavaScriptCore/bytecode/PredictedType.h. |
| (JSC): |
| (JSC::isAnySpeculation): |
| (JSC::isCellSpeculation): |
| (JSC::isObjectSpeculation): |
| (JSC::isFinalObjectSpeculation): |
| (JSC::isFinalObjectOrOtherSpeculation): |
| (JSC::isFixedIndexedStorageObjectSpeculation): |
| (JSC::isStringSpeculation): |
| (JSC::isArraySpeculation): |
| (JSC::isFunctionSpeculation): |
| (JSC::isInt8ArraySpeculation): |
| (JSC::isInt16ArraySpeculation): |
| (JSC::isInt32ArraySpeculation): |
| (JSC::isUint8ArraySpeculation): |
| (JSC::isUint8ClampedArraySpeculation): |
| (JSC::isUint16ArraySpeculation): |
| (JSC::isUint32ArraySpeculation): |
| (JSC::isFloat32ArraySpeculation): |
| (JSC::isFloat64ArraySpeculation): |
| (JSC::isArgumentsSpeculation): |
| (JSC::isActionableIntMutableArraySpeculation): |
| (JSC::isActionableFloatMutableArraySpeculation): |
| (JSC::isActionableTypedMutableArraySpeculation): |
| (JSC::isActionableMutableArraySpeculation): |
| (JSC::isActionableArraySpeculation): |
| (JSC::isArrayOrOtherSpeculation): |
| (JSC::isMyArgumentsSpeculation): |
| (JSC::isInt32Speculation): |
| (JSC::isDoubleRealSpeculation): |
| (JSC::isDoubleSpeculation): |
| (JSC::isNumberSpeculation): |
| (JSC::isBooleanSpeculation): |
| (JSC::isOtherSpeculation): |
| (JSC::isEmptySpeculation): |
| (JSC::mergeSpeculations): |
| (JSC::mergeSpeculation): |
| * bytecode/StructureSet.h: |
| (JSC::StructureSet::speculationFromStructures): |
| * bytecode/ValueProfile.h: |
| (JSC::ValueProfileBase::ValueProfileBase): |
| (JSC::ValueProfileBase::dump): |
| (JSC::ValueProfileBase::computeUpdatedPrediction): |
| (ValueProfileBase): |
| * dfg/DFGAbstractState.cpp: |
| (JSC::DFG::AbstractState::initialize): |
| (JSC::DFG::AbstractState::execute): |
| (JSC::DFG::AbstractState::mergeStateAtTail): |
| * dfg/DFGAbstractState.h: |
| (JSC::DFG::AbstractState::speculateInt32Unary): |
| (JSC::DFG::AbstractState::speculateNumberUnary): |
| (JSC::DFG::AbstractState::speculateBooleanUnary): |
| (JSC::DFG::AbstractState::speculateInt32Binary): |
| (JSC::DFG::AbstractState::speculateNumberBinary): |
| * dfg/DFGAbstractValue.h: |
| (JSC::DFG::StructureAbstractValue::filter): |
| (JSC::DFG::StructureAbstractValue::speculationFromStructures): |
| (JSC::DFG::AbstractValue::AbstractValue): |
| (JSC::DFG::AbstractValue::clear): |
| (JSC::DFG::AbstractValue::isClear): |
| (JSC::DFG::AbstractValue::makeTop): |
| (JSC::DFG::AbstractValue::clobberStructures): |
| (JSC::DFG::AbstractValue::isTop): |
| (JSC::DFG::AbstractValue::set): |
| (JSC::DFG::AbstractValue::merge): |
| (JSC::DFG::AbstractValue::filter): |
| (JSC::DFG::AbstractValue::validateIgnoringValue): |
| (JSC::DFG::AbstractValue::validate): |
| (JSC::DFG::AbstractValue::checkConsistency): |
| (JSC::DFG::AbstractValue::dump): |
| (AbstractValue): |
| * dfg/DFGArgumentPosition.h: |
| (JSC::DFG::ArgumentPosition::ArgumentPosition): |
| (JSC::DFG::ArgumentPosition::mergeArgumentAwareness): |
| (JSC::DFG::ArgumentPosition::prediction): |
| (ArgumentPosition): |
| * dfg/DFGArgumentsSimplificationPhase.cpp: |
| (JSC::DFG::ArgumentsSimplificationPhase::run): |
| * dfg/DFGByteCodeParser.cpp: |
| (ByteCodeParser): |
| (JSC::DFG::ByteCodeParser::injectLazyOperandSpeculation): |
| (JSC::DFG::ByteCodeParser::getLocal): |
| (JSC::DFG::ByteCodeParser::getArgument): |
| (JSC::DFG::ByteCodeParser::addCall): |
| (JSC::DFG::ByteCodeParser::getSpeculationWithoutOSRExit): |
| (JSC::DFG::ByteCodeParser::getSpeculation): |
| (InlineStackEntry): |
| (JSC::DFG::ByteCodeParser::handleCall): |
| (JSC::DFG::ByteCodeParser::handleIntrinsic): |
| (JSC::DFG::ByteCodeParser::handleGetById): |
| (JSC::DFG::ByteCodeParser::parseBlock): |
| (JSC::DFG::ByteCodeParser::fixVariableAccessSpeculations): |
| (JSC::DFG::ByteCodeParser::parse): |
| * dfg/DFGCSEPhase.cpp: |
| (JSC::DFG::CSEPhase::getIndexedPropertyStorageLoadElimination): |
| (JSC::DFG::CSEPhase::performNodeCSE): |
| * dfg/DFGConstantFoldingPhase.cpp: |
| (JSC::DFG::ConstantFoldingPhase::run): |
| * dfg/DFGFixupPhase.cpp: |
| (JSC::DFG::FixupPhase::fixupNode): |
| (JSC::DFG::FixupPhase::fixDoubleEdge): |
| * dfg/DFGGraph.cpp: |
| (JSC::DFG::Graph::nameOfVariableAccessData): |
| (JSC::DFG::Graph::dump): |
| (JSC::DFG::Graph::predictArgumentTypes): |
| * dfg/DFGGraph.h: |
| (JSC::DFG::Graph::getJSConstantSpeculation): |
| (JSC::DFG::Graph::isPredictedNumerical): |
| (JSC::DFG::Graph::byValIsPure): |
| * dfg/DFGJITCompiler.h: |
| (JSC::DFG::JITCompiler::getSpeculation): |
| * dfg/DFGNode.h: |
| (JSC::DFG::Node::Node): |
| (JSC::DFG::Node::getHeapPrediction): |
| (JSC::DFG::Node::predictHeap): |
| (JSC::DFG::Node::prediction): |
| (JSC::DFG::Node::predict): |
| (JSC::DFG::Node::shouldSpeculateInteger): |
| (JSC::DFG::Node::shouldSpeculateDouble): |
| (JSC::DFG::Node::shouldSpeculateNumber): |
| (JSC::DFG::Node::shouldSpeculateBoolean): |
| (JSC::DFG::Node::shouldSpeculateFinalObject): |
| (JSC::DFG::Node::shouldSpeculateFinalObjectOrOther): |
| (JSC::DFG::Node::shouldSpeculateArray): |
| (JSC::DFG::Node::shouldSpeculateArguments): |
| (JSC::DFG::Node::shouldSpeculateInt8Array): |
| (JSC::DFG::Node::shouldSpeculateInt16Array): |
| (JSC::DFG::Node::shouldSpeculateInt32Array): |
| (JSC::DFG::Node::shouldSpeculateUint8Array): |
| (JSC::DFG::Node::shouldSpeculateUint8ClampedArray): |
| (JSC::DFG::Node::shouldSpeculateUint16Array): |
| (JSC::DFG::Node::shouldSpeculateUint32Array): |
| (JSC::DFG::Node::shouldSpeculateFloat32Array): |
| (JSC::DFG::Node::shouldSpeculateFloat64Array): |
| (JSC::DFG::Node::shouldSpeculateArrayOrOther): |
| (JSC::DFG::Node::shouldSpeculateObject): |
| (JSC::DFG::Node::shouldSpeculateCell): |
| (Node): |
| * dfg/DFGPredictionPropagationPhase.cpp: |
| (JSC::DFG::PredictionPropagationPhase::setPrediction): |
| (JSC::DFG::PredictionPropagationPhase::mergePrediction): |
| (JSC::DFG::PredictionPropagationPhase::propagate): |
| (JSC::DFG::PredictionPropagationPhase::doRoundOfDoubleVoting): |
| * dfg/DFGSpeculativeJIT.cpp: |
| (JSC::DFG::SpeculativeJIT::fillStorage): |
| (JSC::DFG::SpeculativeJIT::writeBarrier): |
| (JSC::DFG::GPRTemporary::GPRTemporary): |
| (JSC::DFG::FPRTemporary::FPRTemporary): |
| (JSC::DFG::SpeculativeJIT::compilePeepHoleDoubleBranch): |
| (JSC::DFG::SpeculativeJIT::compilePeepHoleObjectEquality): |
| (JSC::DFG::SpeculativeJIT::compilePeepHoleBranch): |
| (JSC::DFG::SpeculativeJIT::compile): |
| (JSC::DFG::SpeculativeJIT::checkArgumentTypes): |
| (JSC::DFG::SpeculativeJIT::compileGetCharCodeAt): |
| (JSC::DFG::SpeculativeJIT::compileGetByValOnString): |
| (JSC::DFG::SpeculativeJIT::compileValueToInt32): |
| (JSC::DFG::SpeculativeJIT::compileDoubleAsInt32): |
| (JSC::DFG::SpeculativeJIT::compileInt32ToDouble): |
| (JSC::DFG::SpeculativeJIT::compileGetTypedArrayLength): |
| (JSC::DFG::SpeculativeJIT::compileGetByValOnIntTypedArray): |
| (JSC::DFG::SpeculativeJIT::compilePutByValForIntTypedArray): |
| (JSC::DFG::SpeculativeJIT::compileGetByValOnFloatTypedArray): |
| (JSC::DFG::SpeculativeJIT::compilePutByValForFloatTypedArray): |
| (JSC::DFG::SpeculativeJIT::compileInstanceOf): |
| (JSC::DFG::SpeculativeJIT::compileAdd): |
| (JSC::DFG::SpeculativeJIT::compileArithSub): |
| (JSC::DFG::SpeculativeJIT::compileArithNegate): |
| (JSC::DFG::SpeculativeJIT::compileArithMul): |
| (JSC::DFG::SpeculativeJIT::compileArithMod): |
| (JSC::DFG::SpeculativeJIT::compare): |
| (JSC::DFG::SpeculativeJIT::compileStrictEq): |
| (JSC::DFG::SpeculativeJIT::compileGetIndexedPropertyStorage): |
| (JSC::DFG::SpeculativeJIT::compileGetByValOnArguments): |
| (JSC::DFG::SpeculativeJIT::compileGetArgumentsLength): |
| (JSC::DFG::SpeculativeJIT::compileRegExpExec): |
| * dfg/DFGSpeculativeJIT.h: |
| (DFG): |
| (JSC::DFG::ValueSource::forSpeculation): |
| (SpeculativeJIT): |
| (GPRTemporary): |
| (FPRTemporary): |
| (JSC::DFG::SpecDoubleOperand::SpecDoubleOperand): |
| (JSC::DFG::SpecDoubleOperand::~SpecDoubleOperand): |
| (JSC::DFG::SpecDoubleOperand::fpr): |
| (JSC::DFG::SpecCellOperand::SpecCellOperand): |
| (JSC::DFG::SpecCellOperand::~SpecCellOperand): |
| (JSC::DFG::SpecCellOperand::gpr): |
| (JSC::DFG::SpecBooleanOperand::SpecBooleanOperand): |
| (JSC::DFG::SpecBooleanOperand::~SpecBooleanOperand): |
| (JSC::DFG::SpecBooleanOperand::gpr): |
| * dfg/DFGSpeculativeJIT32_64.cpp: |
| (JSC::DFG::SpeculativeJIT::fillSpeculateIntInternal): |
| (JSC::DFG::SpeculativeJIT::fillSpecDouble): |
| (JSC::DFG::SpeculativeJIT::fillSpecCell): |
| (JSC::DFG::SpeculativeJIT::fillSpecBoolean): |
| (JSC::DFG::SpeculativeJIT::compileObjectEquality): |
| (JSC::DFG::SpeculativeJIT::compileObjectToObjectOrOtherEquality): |
| (JSC::DFG::SpeculativeJIT::compilePeepHoleObjectToObjectOrOtherEquality): |
| (JSC::DFG::SpeculativeJIT::compileDoubleCompare): |
| (JSC::DFG::SpeculativeJIT::compileLogicalNot): |
| (JSC::DFG::SpeculativeJIT::emitBranch): |
| (JSC::DFG::SpeculativeJIT::compile): |
| * dfg/DFGSpeculativeJIT64.cpp: |
| (JSC::DFG::SpeculativeJIT::fillSpeculateIntInternal): |
| (JSC::DFG::SpeculativeJIT::fillSpecDouble): |
| (JSC::DFG::SpeculativeJIT::fillSpecCell): |
| (JSC::DFG::SpeculativeJIT::fillSpecBoolean): |
| (JSC::DFG::SpeculativeJIT::compileObjectEquality): |
| (JSC::DFG::SpeculativeJIT::compileObjectToObjectOrOtherEquality): |
| (JSC::DFG::SpeculativeJIT::compilePeepHoleObjectToObjectOrOtherEquality): |
| (JSC::DFG::SpeculativeJIT::compileDoubleCompare): |
| (JSC::DFG::SpeculativeJIT::compileLogicalNot): |
| (JSC::DFG::SpeculativeJIT::emitBranch): |
| (JSC::DFG::SpeculativeJIT::compile): |
| * dfg/DFGVariableAccessData.h: |
| (JSC::DFG::VariableAccessData::VariableAccessData): |
| (JSC::DFG::VariableAccessData::predict): |
| (JSC::DFG::VariableAccessData::nonUnifiedPrediction): |
| (JSC::DFG::VariableAccessData::prediction): |
| (JSC::DFG::VariableAccessData::argumentAwarePrediction): |
| (JSC::DFG::VariableAccessData::mergeArgumentAwarePrediction): |
| (JSC::DFG::VariableAccessData::shouldUseDoubleFormatAccordingToVote): |
| (JSC::DFG::VariableAccessData::makePredictionForDoubleFormat): |
| (VariableAccessData): |
| |
| 2012-06-06 Filip Pizlo <fpizlo@apple.com> |
| |
| Global object variable accesses should not require an extra load |
| https://bugs.webkit.org/show_bug.cgi?id=88385 |
| |
| Reviewed by Gavin Barraclough and Geoffrey Garen. |
| |
| Previously, if you wanted to access a global variable, you'd first have |
| to load the register array from the appropriate global object and then |
| either load or store at an offset to the register array. This is because |
| JSGlobalObject inherited from JSVariableObject, and JSVariableObject is |
| designed with the pessimistic assumption that its register array may |
| point into the call stack. This is never the case for global objects. |
| Hence, even though the global object may add more registers at any time, |
| it does not need to store them in a contiguous array. It can use a |
| SegmentedVector or similar. |
| |
| This patch refactors global objects and variable objects as follows: |
| |
| - The functionality to track variables in an indexable array using a |
| SymbolTable to map names to indices is moved into JSSymbolTableObject, |
| which is now a supertype of JSVariableObject. JSVariableObject is now |
| just a holder for a registers array and implements the registerAt() |
| method that is left abstract in JSSymbolTableObject. Because all users |
| of JSVariableObject know whether they are a JSStaticScopeObject, |
| JSActivation, or JSGlobalObject, this "abstract" method is not virtual; |
| instead the utility methods that would call registerAt() are now |
| template functions that require you to know statically what subtype of |
| JSSymbolTableObject you're using (JSVariableObject or something else), |
| so that registerAt() can be statically bound. |
| |
| - A new class is added called JSSegmentedVariableObject, which only |
| differs from JSVariableObject in how it allocates registers. It uses a |
| SegmentedVector instead of manually managing a pointer to a contiguous |
| slab of registers. This changes the interface somewhat; for example |
| with JSVariableObject if you wanted to add a register you had to do |
| it yourself since the JSVariableObject didn't know how the registers |
| array ought to be allocated. With JSSegmentedVariableObject you can |
| just call addRegisters(). JSSegmentedVariableObject preserves the |
| invariant that once you get a pointer into a register, that pointer |
| will continue to be valid so long as the JSSegmentedVariableObject is |
| alive. This allows the JITs and interpreters to skip the extra load. |
| |
| - JSGlobalObject now inherits from JSSegmentedVariableObject. For now |
| (and possibly forever) it is the only subtype of this new class. |
| |
| - The bytecode format is changed so that get_global_var and |
| put_global_var have a pointer to the register directly rather than |
| having an index. A convenience method is provided in |
| JSSegmentedVariableObject to get the index given a a pointer, which is |
| used for assertions and debug dumps. |
| |
| This appears to be a 1% across the board win. |
| |
| * CMakeLists.txt: |
| * GNUmakefile.list.am: |
| * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: |
| * JavaScriptCore.xcodeproj/project.pbxproj: |
| * Target.pri: |
| * bytecode/CodeBlock.cpp: |
| (JSC::CodeBlock::dump): |
| * bytecode/Instruction.h: |
| (Instruction): |
| (JSC::Instruction::Instruction): |
| * bytecompiler/BytecodeGenerator.cpp: |
| (JSC::ResolveResult::registerPointer): |
| (JSC): |
| (JSC::BytecodeGenerator::BytecodeGenerator): |
| (JSC::BytecodeGenerator::retrieveLastUnaryOp): |
| (JSC::BytecodeGenerator::resolve): |
| (JSC::BytecodeGenerator::resolveConstDecl): |
| (JSC::BytecodeGenerator::emitGetStaticVar): |
| (JSC::BytecodeGenerator::emitPutStaticVar): |
| * bytecompiler/BytecodeGenerator.h: |
| (ResolveResult): |
| (BytecodeGenerator): |
| * dfg/DFGAssemblyHelpers.h: |
| (AssemblyHelpers): |
| * dfg/DFGByteCodeParser.cpp: |
| (JSC::DFG::ByteCodeParser::parseBlock): |
| * dfg/DFGCSEPhase.cpp: |
| (JSC::DFG::CSEPhase::globalVarLoadElimination): |
| (JSC::DFG::CSEPhase::globalVarStoreElimination): |
| (JSC::DFG::CSEPhase::performNodeCSE): |
| * dfg/DFGGraph.cpp: |
| (JSC::DFG::Graph::dump): |
| * dfg/DFGGraph.h: |
| (JSC::DFG::Graph::globalObjectFor): |
| (Graph): |
| * dfg/DFGNode.h: |
| (JSC::DFG::Node::hasVarNumber): |
| (Node): |
| (JSC::DFG::Node::hasRegisterPointer): |
| (JSC::DFG::Node::registerPointer): |
| * dfg/DFGSpeculativeJIT32_64.cpp: |
| (JSC::DFG::SpeculativeJIT::compile): |
| * dfg/DFGSpeculativeJIT64.cpp: |
| (JSC::DFG::SpeculativeJIT::compile): |
| * heap/Heap.h: |
| (Heap): |
| (JSC::Heap::isWriteBarrierEnabled): |
| (JSC): |
| * interpreter/Interpreter.cpp: |
| (JSC::Interpreter::execute): |
| (JSC::Interpreter::privateExecute): |
| * jit/JITPropertyAccess.cpp: |
| (JSC::JIT::emit_op_get_global_var): |
| (JSC::JIT::emit_op_put_global_var): |
| * jit/JITPropertyAccess32_64.cpp: |
| (JSC::JIT::emit_op_get_global_var): |
| (JSC::JIT::emit_op_put_global_var): |
| * llint/LowLevelInterpreter32_64.asm: |
| * llint/LowLevelInterpreter64.asm: |
| * runtime/JSGlobalObject.cpp: |
| (JSC): |
| (JSC::JSGlobalObject::put): |
| (JSC::JSGlobalObject::putDirectVirtual): |
| (JSC::JSGlobalObject::defineOwnProperty): |
| (JSC::JSGlobalObject::visitChildren): |
| (JSC::JSGlobalObject::addStaticGlobals): |
| (JSC::JSGlobalObject::getOwnPropertySlot): |
| (JSC::JSGlobalObject::getOwnPropertyDescriptor): |
| * runtime/JSGlobalObject.h: |
| (JSGlobalObject): |
| (JSC::JSGlobalObject::JSGlobalObject): |
| (JSC): |
| (JSC::JSGlobalObject::hasOwnPropertyForWrite): |
| * runtime/JSSegmentedVariableObject.cpp: Added. |
| (JSC): |
| (JSC::JSSegmentedVariableObject::findRegisterIndex): |
| (JSC::JSSegmentedVariableObject::addRegisters): |
| (JSC::JSSegmentedVariableObject::visitChildren): |
| * runtime/JSSegmentedVariableObject.h: Added. |
| (JSC): |
| (JSSegmentedVariableObject): |
| (JSC::JSSegmentedVariableObject::registerAt): |
| (JSC::JSSegmentedVariableObject::assertRegisterIsInThisObject): |
| (JSC::JSSegmentedVariableObject::JSSegmentedVariableObject): |
| (JSC::JSSegmentedVariableObject::finishCreation): |
| * runtime/JSStaticScopeObject.cpp: |
| (JSC::JSStaticScopeObject::put): |
| (JSC::JSStaticScopeObject::putDirectVirtual): |
| (JSC::JSStaticScopeObject::getOwnPropertySlot): |
| * runtime/JSSymbolTableObject.cpp: Added. |
| (JSC): |
| (JSC::JSSymbolTableObject::destroy): |
| (JSC::JSSymbolTableObject::deleteProperty): |
| (JSC::JSSymbolTableObject::getOwnPropertyNames): |
| (JSC::JSSymbolTableObject::putDirectVirtual): |
| (JSC::JSSymbolTableObject::isDynamicScope): |
| * runtime/JSSymbolTableObject.h: Added. |
| (JSC): |
| (JSSymbolTableObject): |
| (JSC::JSSymbolTableObject::symbolTable): |
| (JSC::JSSymbolTableObject::JSSymbolTableObject): |
| (JSC::JSSymbolTableObject::finishCreation): |
| (JSC::symbolTableGet): |
| (JSC::symbolTablePut): |
| (JSC::symbolTablePutWithAttributes): |
| * runtime/JSVariableObject.cpp: |
| (JSC): |
| * runtime/JSVariableObject.h: |
| (JSVariableObject): |
| (JSC::JSVariableObject::JSVariableObject): |
| (JSC::JSVariableObject::finishCreation): |
| (JSC): |
| * runtime/WriteBarrier.h: |
| |
| 2012-06-06 Filip Pizlo <fpizlo@apple.com> |
| |
| DFG arguments access slow path should not crash if the arguments haven't been created |
| https://bugs.webkit.org/show_bug.cgi?id=88471 |
| |
| Reviewed by Gavin Barraclough. |
| |
| * dfg/DFGCCallHelpers.h: |
| (JSC::DFG::CCallHelpers::setupArgumentsWithExecState): |
| (CCallHelpers): |
| * dfg/DFGOperations.cpp: |
| * dfg/DFGOperations.h: |
| * dfg/DFGSpeculativeJIT.h: |
| (JSC::DFG::SpeculativeJIT::callOperation): |
| * dfg/DFGSpeculativeJIT32_64.cpp: |
| (JSC::DFG::SpeculativeJIT::compile): |
| * dfg/DFGSpeculativeJIT64.cpp: |
| (JSC::DFG::SpeculativeJIT::compile): |
| |
| 2012-06-06 Michael Saboff <msaboff@apple.com> |
| |
| ENH: Add Logging to GC Marking Phase |
| https://bugs.webkit.org/show_bug.cgi?id=88364 |
| |
| Reviewed by Filip Pizlo. |
| |
| Log GC marking to stderr or a file. The logging in controlled |
| with the define ENABLE_OBJECT_MARK_LOGGING in wtf/Platform.h. |
| If DATA_LOG_TO_FILE in wtf/DataLog.cpp is set to 1, output is |
| logged to a file otherwise it is logged to stderr. |
| |
| When logging is enabled, the GC is built single threaded since the |
| log output from the various threads isn't buffered and output in a |
| thread safe manner. |
| |
| * heap/Heap.cpp: |
| (JSC::Heap::markRoots): |
| * heap/MarkStack.cpp: |
| (JSC::MarkStackThreadSharedData::resetChildren): |
| (JSC::MarkStackThreadSharedData::childVisitCount): |
| (JSC::MarkStackThreadSharedData::markingThreadMain): |
| (JSC::MarkStackThreadSharedData::markingThreadStartFunc): |
| (JSC::MarkStackThreadSharedData::MarkStackThreadSharedData): |
| (JSC::MarkStackThreadSharedData::reset): |
| * heap/MarkStack.h: |
| (MarkStackThreadSharedData): |
| (MarkStack): |
| (JSC::MarkStack::sharedData): |
| (JSC::MarkStack::resetChildCount): |
| (JSC::MarkStack::childCount): |
| (JSC::MarkStack::incrementChildCount): |
| * runtime/JSArray.cpp: |
| (JSC::JSArray::visitChildren): |
| * runtime/JSCell.cpp: |
| (JSC::JSCell::className): |
| * runtime/JSCell.h: |
| (JSCell): |
| (JSC::JSCell::visitChildren): |
| * runtime/JSString.cpp: |
| (JSC::JSString::visitChildren): |
| * runtime/JSString.h: |
| (JSString): |
| * runtime/Structure.h: |
| (JSC::MarkStack::internalAppend): |
| |
| 2012-06-06 Gavin Barraclough <barraclough@apple.com> |
| |
| Assigning to a static property should not change iteration order |
| https://bugs.webkit.org/show_bug.cgi?id=88401 |
| |
| Reviewed by Geoff Garen. |
| |
| A specific iteration order is not defined by the spec, but test-262 somewhat tenuously |
| requires that it is at least stable, e.g. ch10/10.4/10.4.2/S10.4.2_A1.1_T1.js |
| |
| Whilst it is not clear that this behavior really arises from the specification, it |
| would seem like common sense to conform to this. |
| |
| The problem here is that we allow properties in the structure to shadow those in the |
| static table, and we iterate the properties in the structure first - which means that |
| as values of existing properties are modified, their iteration order changes too. |
| |
| The easy fix is to iterate the properties from the static table first. This has a |
| further benefit, since it will mean that user added properties will come after those |
| present in the static table (respected the expected insertion-order). |
| |
| * runtime/JSObject.cpp: |
| (JSC::JSObject::getOwnPropertyNames): |
| - Iterate static properties first. |
| |
| 2012-06-06 Andy Wingo <wingo@igalia.com> |
| |
| Ensure consistent order of evaluation in LLInt slow paths |
| https://bugs.webkit.org/show_bug.cgi?id=88409 |
| |
| Reviewed by Geoffrey Garen. |
| |
| * llint/LLIntSlowPaths.cpp: |
| (slow_path_mul) |
| (slow_path_sub) |
| (slow_path_div) |
| (slow_path_mod) |
| (slow_path_lshift) |
| (slow_path_rshift) |
| (slow_path_urshift) |
| (slow_path_bitand) |
| (slow_path_bitor) |
| (slow_path_bitxor): Avoid calling toNumber, toInt32, or toUInt32 |
| multiple times without intervening sequence points. Fixes |
| fast/js/exception-sequencing-binops.html with GCC 4.7 on x86-64 |
| Linux, which reordered evaluation of the arguments to fmod. |
| |
| 2012-06-06 Andy Wingo <wingo@igalia.com> |
| |
| [GTK] Enable the LLInt |
| https://bugs.webkit.org/show_bug.cgi?id=88315 |
| |
| Reviewed by Filip Pizlo. |
| |
| * GNUmakefile.am: Add rules to generate LLIntDesiredOffsets.h and |
| LLIntAssembly.h. |
| * GNUmakefile.list.am: Add offlineasm and llint files to the |
| dist. Add LLInt source files to the build. |
| * llint/LowLevelInterpreter.asm (crash): Generate a store of |
| 0xbbadbeef to a register, not to a constant. Otherwise, gas was |
| failing to assemble result. |
| * offlineasm/asm.rb (labelReference): Generate a |
| SYMBOL_STRING_RELOCATION instead of a SYMBOL_STRING, so that we go |
| through the PLT on ELF systems. |
| |
| 2012-06-06 Andy Wingo <wingo@igalia.com> |
| |
| REGRESSION (r106478): None of the Paper.js JavaScript examples work |
| https://bugs.webkit.org/show_bug.cgi?id=87158 |
| |
| Reviewed by Michael Saboff. |
| |
| * bytecompiler/BytecodeGenerator.cpp: |
| (JSC::BytecodeGenerator::resolve): If we have to bail out to |
| dynamicResolve(), only skip static scopes from the head of the |
| scope chain. Before, we were also skipping activations with |
| direct eval as well, which was incorrect. |
| |
| 2012-06-06 Dan Bernstein <mitz@apple.com> |
| |
| Reverted r119567, the fix for <http://webkit.org/b/88378>, because it broke the 32-bit build. |
| |
| * dfg/DFGSpeculativeJIT.h: |
| (JSC::DFG::SpeculativeJIT::emitAllocateBasicJSObject): |
| * jit/JITInlineMethods.h: |
| (JSC::JIT::emitAllocateBasicJSObject): |
| * llint/LowLevelInterpreter.asm: |
| * runtime/JSGlobalData.h: |
| (JSGlobalData): |
| * runtime/JSGlobalThis.cpp: |
| (JSC::JSGlobalThis::setUnwrappedObject): |
| * runtime/JSObject.cpp: |
| (JSC::JSObject::visitChildren): |
| (JSC::JSObject::createInheritorID): |
| * runtime/JSObject.h: |
| (JSObject): |
| (JSC::JSObject::resetInheritorID): |
| (JSC): |
| (JSC::JSObject::offsetOfInheritorID): |
| (JSC::JSObject::inheritorID): |
| |
| 2012-06-05 Yuqiang Xian <yuqiang.xian@intel.com> |
| |
| Improve Math.round and Math.floor intrinsic |
| https://bugs.webkit.org/show_bug.cgi?id=88314 |
| |
| Reviewed by Filip Pizlo. |
| |
| Currently we call a native function from the JIT code to complete the |
| "round" and "floor" operations. We could inline some fast paths |
| especially for those positive values on the platforms where floating |
| point truncation is supported. |
| This brings 3% gain on Kraken, especially 32% on audio-oscillator, |
| and slight win on SunSpider, measured on IA32. |
| |
| * jit/ThunkGenerators.cpp: |
| (JSC::floorThunkGenerator): |
| (JSC): |
| (JSC::roundThunkGenerator): |
| |
| 2012-06-05 Gavin Barraclough <barraclough@apple.com> |
| |
| Remove JSObject::m_inheritorID |
| https://bugs.webkit.org/show_bug.cgi?id=88378 |
| |
| Reviewed by Geoff Garen. |
| |
| This is rarely used, and not performance critical (the commonly accessed copy is cached on JSFunction), |
| and most objects don't need an inheritorID (this value is only used if the object is used as a prototype). |
| Instead use a private named value in the object's property storage. |
| |
| * dfg/DFGSpeculativeJIT.h: |
| (JSC::DFG::SpeculativeJIT::emitAllocateBasicJSObject): |
| - No need m_inheritorID to initialize! |
| * jit/JITInlineMethods.h: |
| (JSC::JIT::emitAllocateBasicJSObject): |
| - No need m_inheritorID to initialize! |
| * llint/LowLevelInterpreter.asm: |
| - No need m_inheritorID to initialize! |
| * runtime/JSGlobalData.h: |
| (JSGlobalData): |
| - Added private name 'm_inheritorIDKey'. |
| * runtime/JSGlobalThis.cpp: |
| (JSC::JSGlobalThis::setUnwrappedObject): |
| - resetInheritorID is now passed a JSGlobalData&. |
| * runtime/JSObject.cpp: |
| (JSC::JSObject::visitChildren): |
| - No m_inheritorID to be marked. |
| (JSC::JSObject::createInheritorID): |
| - Store the newly created inheritorID in the property map. |
| * runtime/JSObject.h: |
| (JSC::JSObject::resetInheritorID): |
| - Remove the inheritorID from property storage. |
| (JSC::JSObject::inheritorID): |
| - Read the inheritorID from property storage. |
| |
| 2012-06-05 Filip Pizlo <fpizlo@apple.com> |
| |
| DFG CFG simplification should not attempt to deref nodes inside of an unreachable subgraph |
| https://bugs.webkit.org/show_bug.cgi?id=88362 |
| |
| Reviewed by Gavin Barraclough. |
| |
| * dfg/DFGCFGSimplificationPhase.cpp: |
| (JSC::DFG::CFGSimplificationPhase::fixPhis): |
| (JSC::DFG::CFGSimplificationPhase::removePotentiallyDeadPhiReference): |
| |
| 2012-06-05 Mark Hahnenberg <mhahnenberg@apple.com> |
| |
| Entry into JSC should CRASH() if the Heap is busy |
| https://bugs.webkit.org/show_bug.cgi?id=88355 |
| |
| Reviewed by Geoffrey Garen. |
| |
| Interpreter::execute() returns jsNull() right now if we try to enter it while |
| the Heap is busy (e.g. with a collection), which is okay, but some code paths |
| that call Interpreter::execute() allocate objects before checking if the Heap |
| is busy. Attempting to execute JS code while the Heap is busy should not be |
| allowed and should be enforced by a release-mode CRASH() to prevent vague, |
| unhelpful backtraces later on if somebody makes a mistake. Normally, recursively |
| executing JS code is okay, e.g. for evals, but it should not occur during a |
| Heap allocation or collection because the Heap is not guaranteed to be in a |
| consistent state (especially during collections). We are protected from |
| executing JS on the same Heap concurrently on two separate threads because |
| they must each take a JSLock first. However, we are not protected from reentrant |
| execution of JS on the same thread because JSLock allows reentrancy. Therefore, |
| we should fail early if we detect an entrance into JS code while the Heap is busy. |
| |
| * heap/Heap.cpp: Changed Heap::collect so that it sets the m_operationInProgress field |
| at the beginning of collection and then unsets it at the end so that it is set at all |
| times throughout the duration of a collection rather than sporadically during various |
| phases. There is no reason to unset during a collection because our collector does |
| not currently support running additional JS between the phases of a collection. |
| (JSC::Heap::getConservativeRegisterRoots): |
| (JSC::Heap::markRoots): |
| (JSC::Heap::collect): |
| * interpreter/Interpreter.cpp: |
| (JSC::Interpreter::execute): Crash if the Heap is busy. |
| * runtime/Completion.cpp: Crash if the Heap is busy. We do it here before we call |
| Interpreter::execute() because we do some allocation prior to calling execute() which |
| could cause Heap corruption if, for example, that allocation caused a collection. |
| (JSC::evaluate): |
| |
| 2012-06-05 Dongwoo Im <dw.im@samsung.com> |
| |
| Add 'isProtocolHandlerRegistered' and 'unregisterProtocolHandler'. |
| https://bugs.webkit.org/show_bug.cgi?id=73176 |
| |
| Reviewed by Adam Barth. |
| |
| Two more APIs are added in Custom Scheme Handler specification. |
| http://dev.w3.org/html5/spec/Overview.html#custom-handlers |
| One is 'isProtocolHandlerRegistered' to query whether the specific URL |
| is registered or not. |
| The other is 'unregisterProtocolHandler' to remove the registered URL. |
| |
| * Configurations/FeatureDefines.xcconfig: Add a macro 'ENABLE_CUSTOM_SCHEME_HANDLER'. |
| |
| 2012-06-04 Filip Pizlo <fpizlo@apple.com> |
| |
| DFG CFG simplification should correct the variables at the head of the predecessor block |
| https://bugs.webkit.org/show_bug.cgi?id=88284 |
| |
| Reviewed by Geoffrey Garen. |
| |
| * dfg/DFGCFGSimplificationPhase.cpp: |
| (JSC::DFG::CFGSimplificationPhase::mergeBlocks): |
| |
| 2012-06-04 Geoffrey Garen <ggaren@apple.com> |
| |
| Unreviewed. |
| |
| Rolled out r119364 because it's still causing crashes (when running |
| v8-earley in release builds of DRT) |
| |
| This time for sure! |
| |
| * heap/Heap.cpp: |
| (JSC::Heap::collect): |
| * heap/MarkedBlock.cpp: |
| (JSC::MarkedBlock::sweep): |
| * heap/MarkedBlock.h: |
| (JSC::MarkedBlock::resetAllocator): |
| (JSC): |
| * heap/MarkedSpace.cpp: |
| (JSC::ResetAllocator::operator()): |
| (JSC): |
| (JSC::MarkedSpace::resetAllocators): |
| (JSC::MarkedSpace::sweepWeakSets): |
| * heap/MarkedSpace.h: |
| (MarkedSpace): |
| * heap/WeakBlock.cpp: |
| (JSC::WeakBlock::sweep): |
| * heap/WeakSet.cpp: |
| (JSC::WeakSet::sweep): |
| (JSC::WeakSet::tryFindAllocator): |
| * heap/WeakSet.h: |
| (JSC::WeakSet::shrink): |
| |
| 2012-06-04 Filip Pizlo <fpizlo@apple.com> |
| |
| DFG arguments simplification should have rationalized handling of TearOffArguments |
| https://bugs.webkit.org/show_bug.cgi?id=88206 |
| |
| Reviewed by Geoffrey Garen. |
| |
| - Accesses to the unmodified arguments register ought to have the same effect on |
| alias/escape analysis of arguments as accesses to the mutable arguments register. |
| |
| - The existence of TearOffArguments should not get in the way of arguments aliasing. |
| |
| - TearOffArguments should be eliminated if CreateArguments is eliminated. |
| |
| * dfg/DFGArgumentsSimplificationPhase.cpp: |
| (JSC::DFG::ArgumentsSimplificationPhase::run): |
| (JSC::DFG::ArgumentsSimplificationPhase::observeBadArgumentsUse): |
| |
| 2012-06-04 Gavin Barraclough <barraclough@apple.com> |
| |
| Remove enabledProfilerReference |
| https://bugs.webkit.org/show_bug.cgi?id=88258 |
| |
| Reviewed by Michael Saboff. |
| |
| Make the enabled profiler a member of JSGlobalData, and switch code that accesses it to do so directly |
| via the JSGlobalData, rather than holding a Profiler** reference to it. Do not pass the Profiler** |
| reference to JIT code. This patch does not change the stack layout on entry into JIT code (passing an |
| unused void* instead), since this is an intrusive change better handled in a separate patch. |
| |
| * interpreter/Interpreter.cpp: |
| (JSC::Interpreter::throwException): |
| (JSC::Interpreter::execute): |
| (JSC::Interpreter::executeCall): |
| (JSC::Interpreter::executeConstruct): |
| (JSC::Interpreter::privateExecute): |
| * jit/JITCode.h: |
| (JSC::JITCode::execute): |
| - Don't pass Profiler** to JIT code. |
| * jit/JITOpcodes.cpp: |
| (JSC::JIT::emit_op_profile_will_call): |
| (JSC::JIT::emit_op_profile_did_call): |
| * jit/JITOpcodes32_64.cpp: |
| (JSC::JIT::emit_op_profile_will_call): |
| (JSC::JIT::emit_op_profile_did_call): |
| * jit/JITStubs.cpp: |
| (JSC): |
| (JSC::ctiTrampoline): |
| (JSC::ctiVMThrowTrampoline): |
| (JSC::ctiOpThrowNotCaught): |
| (JSC::JITThunks::JITThunks): |
| (JSC::DEFINE_STUB_FUNCTION): |
| - For ARM_THUMB2, rename ENABLE_PROFILER_REFERENCE_OFFSET to FIRST_STACK_ARGUMENT (which is how it is being used). |
| - For MIPS, remove ENABLE_PROFILER_REFERENCE_OFFSET. |
| * jit/JITStubs.h: |
| (JITStackFrame): |
| (JSC): |
| - Renamed enabledProfilerReference to unusedX. |
| * llint/LLIntSlowPaths.cpp: |
| (JSC::LLInt::LLINT_SLOW_PATH_DECL): |
| * llint/LowLevelInterpreter.asm: |
| * profiler/Profiler.cpp: |
| (JSC): |
| (JSC::Profiler::startProfiling): |
| (JSC::Profiler::stopProfiling): |
| * profiler/Profiler.h: |
| (Profiler): |
| - Removed s_sharedEnabledProfilerReference, enabledProfilerReference(). |
| * runtime/JSGlobalData.cpp: |
| (JSC::JSGlobalData::JSGlobalData): |
| * runtime/JSGlobalData.h: |
| (JSC): |
| (JSC::JSGlobalData::enabledProfiler): |
| (JSGlobalData): |
| - Added m_enabledProfiler, enabledProfiler(). |
| * runtime/JSGlobalObject.cpp: |
| (JSC::JSGlobalObject::~JSGlobalObject): |
| |
| 2012-06-04 Filip Pizlo <fpizlo@apple.com> |
| |
| get_argument_by_val should be profiled everywhere |
| https://bugs.webkit.org/show_bug.cgi?id=88205 |
| |
| Reviewed by Geoffrey Garen. |
| |
| * jit/JITOpcodes32_64.cpp: |
| (JSC::JIT::emitSlow_op_get_argument_by_val): |
| * llint/LLIntSlowPaths.cpp: |
| (JSC::LLInt::LLINT_SLOW_PATH_DECL): |
| |
| 2012-06-04 Filip Pizlo <fpizlo@apple.com> |
| |
| DFG arguments simplification takes unkindly to direct accesses to the arguments register |
| https://bugs.webkit.org/show_bug.cgi?id=88261 |
| |
| Reviewed by Geoffrey Garen. |
| |
| Fixed arguments simplification for direct accesses to the arguments register, which may |
| arise if CSE had not run. Fixed CSE so that it does run prior to arguments simplification, |
| by making it a full-fledged member of the fixpoint. Fixed other issues in arguments |
| simplification, like realizing that it needs to bail if there is a direct assignment to |
| the arguments register, and failing to turn CreateArguments into PhantomArguments. Also |
| fixed CSE's handling of store elimination of captured locals in the presence of a |
| GetMyArgumentByVal (or one of its friends), and fixed CSE to correctly fixup variables at |
| tail if the Flush it removes is the last operation on a local in a basic block. |
| |
| * bytecode/CodeBlock.cpp: |
| (JSC::CodeBlock::dump): |
| * dfg/DFGArgumentsSimplificationPhase.cpp: |
| (JSC::DFG::ArgumentsSimplificationPhase::run): |
| (JSC::DFG::ArgumentsSimplificationPhase::isOKToOptimize): |
| * dfg/DFGCSEPhase.cpp: |
| (JSC::DFG::CSEPhase::run): |
| (JSC::DFG::CSEPhase::setLocalStoreElimination): |
| (JSC::DFG::CSEPhase::performNodeCSE): |
| (CSEPhase): |
| * dfg/DFGDriver.cpp: |
| (JSC::DFG::compile): |
| |
| 2012-06-04 Anders Carlsson <andersca@apple.com> |
| |
| Fix a struct/class mismatch. |
| |
| * heap/Handle.h: |
| (Handle): |
| |
| 2012-06-04 David Kilzer <ddkilzer@apple.com> |
| |
| BUILD FIX: FeatureDefines.xcconfig should match across projects |
| |
| * Configurations/FeatureDefines.xcconfig: |
| - Add missing ENABLE_LEGACY_CSS_VENDOR_PREFIXES. |
| |
| 2012-06-02 Geoffrey Garen <ggaren@apple.com> |
| |
| Weak pointer finalization should be lazy |
| https://bugs.webkit.org/show_bug.cgi?id=87599 |
| |
| Reviewed by Sam Weinig. |
| |
| This time for sure! |
| |
| * heap/Heap.cpp: |
| (JSC::Heap::collect): Don't sweep eagerly -- we'll sweep lazily instead. |
| |
| * heap/MarkedBlock.cpp: |
| (JSC::MarkedBlock::sweep): Sweep our weak set before we sweep our other |
| destructors -- this is our last chance to run weak set finalizers before |
| we recycle our memory. |
| |
| * heap/MarkedBlock.h: |
| (JSC::MarkedBlock::resetAllocator): |
| * heap/MarkedSpace.cpp: |
| (JSC::MarkedSpace::resetAllocators): |
| * heap/MarkedSpace.h: |
| (JSC::MarkedSpace::resetAllocators): Don't force allocator reset anymore. |
| It will happen automatically when a weak set is swept. It's simpler to |
| have only one canonical way for this to happen, and it wasn't buying |
| us anything to do it eagerly. |
| |
| * heap/WeakBlock.cpp: |
| (JSC::WeakBlock::sweep): Don't short-circuit a sweep unless we know |
| the sweep would be a no-op. If even one finalizer is pending, we need to |
| run it, since we won't get another chance. |
| |
| * heap/WeakSet.cpp: |
| (JSC::WeakSet::sweep): This loop can be simpler now that |
| WeakBlock::sweep() does what we mean. |
| |
| Reset our allocator after a sweep because this is the optimal time to |
| start trying to recycle old weak pointers. |
| |
| (JSC::WeakSet::tryFindAllocator): Don't sweep when searching for an |
| allocator because we've swept already, and forcing a new sweep would be |
| wasteful. |
| |
| * heap/WeakSet.h: |
| (JSC::WeakSet::shrink): Be sure to reset our allocator after a shrink |
| because the shrink may have removed the block the allocator was going to |
| allocate out of. |
| |
| 2012-06-02 Filip Pizlo <fpizlo@apple.com> |
| |
| If the DFG bytecode parser detects that op_method_check has gone polymorphic, it |
| shouldn't revert all the way to GetById/GetByIdFlush |
| https://bugs.webkit.org/show_bug.cgi?id=88176 |
| |
| Reviewed by Geoffrey Garen. |
| |
| Refactored the code so that the op_method_check case of the parser gracefully falls |
| through to all of the goodness of the normal op_get_by_id case. |
| |
| * dfg/DFGByteCodeParser.cpp: |
| (ByteCodeParser): |
| (JSC::DFG::ByteCodeParser::handleGetById): |
| (DFG): |
| (JSC::DFG::ByteCodeParser::parseBlock): |
| |
| 2012-06-02 Filip Pizlo <fpizlo@apple.com> |
| |
| DFG CSE should be able to eliminate unnecessary flushes of arguments and captured variables |
| https://bugs.webkit.org/show_bug.cgi?id=87929 |
| |
| Reviewed by Geoffrey Garen. |
| |
| Slight speed-up on V8. Big win (up to 50%) on programs that inline very small functions. |
| |
| This required a bunch of changes: |
| |
| - The obvious change is making CSE essentially ignore whether or not the set of |
| operations between the Flush and the SetLocal can exit, and instead focus on whether or |
| not that set of operations can clobber the world or access local variables. This code |
| is now refactored to return a set of flags indicating any of these events, and the CSE |
| decides what to do based on those flags. If the set of operations is non-clobbering |
| and non-accessing, then the Flush is turned into a Phantom on the child of the |
| SetLocal. This expands the liveness of the relevant variable but virtually guarantees |
| that it will be register allocated and not flushed to the stack. So, yeah, this patch |
| is a lot of work to save a few stores to the stack. |
| |
| - Previously, CheckArgumentsNotCreated was optimized "lazily" in that you only knew if |
| it was a no-op if you were holding onto a CFA abstract state. But this would make the |
| CSE act pessimistically, since it doesn't use the CFA. Hence, this patch changes the |
| constant folding phase into something more broad; it now fixes up |
| CheckArgumentsNotCreated nodes by turning them into phantoms if it knows that they are |
| no-ops. |
| |
| - Arguments simplification was previously relying on this very strange PhantomArguments |
| node, which had two different meanings: for normal execution it meant the empty value |
| but for OSR exit it meant that the arguments should be reified. This produces problems |
| when set SetLocals to the captured arguments registers are CSE'd away, since we'd be |
| triggering reification of arguments without having initialized the arguments registers |
| to empty. The cleanest solution was to fix PhantomArguments to have one meaning: |
| namely, arguments reification on OSR exit. Hence, this patch changes arguments |
| simplification to change SetLocal of CreateArguments on the arguments registers to be |
| a SetLocal of Empty. |
| |
| - Argument value recoveries were previously derived from the value source of the |
| arguments at the InlineStart. But that relies on all SetLocals to arguments having |
| been flushed. It's possible that we could have elided the SetLocal to the arguments |
| at the callsite because there were subsequent SetLocals to the arguments inside of the |
| callee, in which case the InlineStart would get the wrong information. Hence, this |
| patch changes argument value recovery computation to operate over the ArgumentPositions |
| directly. |
| |
| - But that doesn't actually work, because previously, there was no way to link an |
| InlineStart back to the corresponding ArgumentPositions, at least not without some |
| ugliness. So this patch instates the rule that the m_argumentPositions vector consists |
| of disjoint subsequences such that each subsequence corresponds to an inline callsite |
| and can be identified by its first index, and within each subsequence are the |
| ArgumentPositions of all of the arguments ordered by argument index. This required |
| flipping the order in which ArgumentPositions are added to the vector, and giving |
| InlineStart an operand that indicates the start of that inline callsite's |
| ArgumentPosition subsequence. |
| |
| - This patch also revealed a nasty bug in the reification of arguments in inline call |
| frames on OSR exit. Since the reification was happening after the values of virtual |
| registers were recovered, the value recoveries of the inline arguments were wrong. |
| Hence using operationCreateInlinedArguments is wrong. For example a value recovery |
| might say that you have to box a double, but if we had already boxed it then boxing |
| it a second time will result in garbage. The specific case of this bug was this patch |
| uncovered was that now it is possible for an inline call frame to not have any valid |
| value recoveries for any inline arguments, if the optimization elides all argument |
| flushes, while at the same time optimizing away arguments creation. Then OSR exit |
| would try to recover the arguments using the inline call frame, which had bogus |
| information, and humorous crashes would ensue. This patch fixes this issue by moving |
| arguments reification to after call frame reification, so that arguments reification |
| can always use operationCreateArguments instead of operationCreateInlinedArguments. |
| |
| - This patch may turn a Flush into a Phantom. That's kind of the whole point. But that |
| broke forward speculation checks, which knew to look for a Flush prior to a SetLocal |
| but didn't know that there could alternatively be a Phantom in place of the Flush. |
| This patch fixes that by augmenting the forward speculation check logic. |
| |
| - Finally, in the process of having fun with all of the above, I realized that my DFG |
| validation was not actually running on every phase like I had originally designed it |
| to. In fact it was only running just after bytecode parsing. I initially tried to |
| make it run in every phase but found that this causes some tests to timeout |
| (specifically the evil fuzzing ones), so I decided on a compromise where: (i) in |
| release mode validation never runs, (ii) in debug mode validation will run just |
| after parsing and just before the backend, and (iii) it's possible with a simple |
| switch to enable validation to run on every phase. |
| |
| Luckily all of the above issues were already covered by the 77 or so DFG-specific |
| layout tests. Hence, this patch does not introduce any new tests despite being so |
| meaty. |
| |
| * dfg/DFGAbstractState.cpp: |
| (JSC::DFG::AbstractState::execute): |
| * dfg/DFGArgumentPosition.h: |
| (JSC::DFG::ArgumentPosition::prediction): |
| (JSC::DFG::ArgumentPosition::doubleFormatState): |
| (JSC::DFG::ArgumentPosition::shouldUseDoubleFormat): |
| (ArgumentPosition): |
| * dfg/DFGArgumentsSimplificationPhase.cpp: |
| (JSC::DFG::ArgumentsSimplificationPhase::run): |
| * dfg/DFGByteCodeParser.cpp: |
| (JSC::DFG::ByteCodeParser::handleInlining): |
| (JSC::DFG::ByteCodeParser::InlineStackEntry::InlineStackEntry): |
| * dfg/DFGCSEPhase.cpp: |
| (JSC::DFG::CSEPhase::SetLocalStoreEliminationResult::SetLocalStoreEliminationResult): |
| (SetLocalStoreEliminationResult): |
| (JSC::DFG::CSEPhase::setLocalStoreElimination): |
| (JSC::DFG::CSEPhase::performNodeCSE): |
| * dfg/DFGCommon.h: |
| * dfg/DFGConstantFoldingPhase.cpp: |
| (JSC::DFG::ConstantFoldingPhase::run): |
| * dfg/DFGDriver.cpp: |
| (JSC::DFG::compile): |
| * dfg/DFGNode.h: |
| (Node): |
| (JSC::DFG::Node::hasArgumentPositionStart): |
| (JSC::DFG::Node::argumentPositionStart): |
| * dfg/DFGOSRExitCompiler32_64.cpp: |
| (JSC::DFG::OSRExitCompiler::compileExit): |
| * dfg/DFGOSRExitCompiler64.cpp: |
| (JSC::DFG::OSRExitCompiler::compileExit): |
| * dfg/DFGPhase.cpp: |
| (DFG): |
| * dfg/DFGPhase.h: |
| (Phase): |
| * dfg/DFGSpeculativeJIT.cpp: |
| (JSC::DFG::SpeculativeJIT::compile): |
| * dfg/DFGSpeculativeJIT.h: |
| (JSC::DFG::SpeculativeJIT::forwardSpeculationCheck): |
| * dfg/DFGSpeculativeJIT32_64.cpp: |
| (JSC::DFG::SpeculativeJIT::compile): |
| * dfg/DFGSpeculativeJIT64.cpp: |
| (JSC::DFG::SpeculativeJIT::compile): |
| |
| 2012-06-02 Geoffrey Garen <ggaren@apple.com> |
| |
| DOM string cache should hash pointers, not characters |
| https://bugs.webkit.org/show_bug.cgi?id=88175 |
| |
| Reviewed by Phil Pizlo and Sam Weinig. |
| |
| * heap/Weak.h: |
| (JSC::weakAdd): |
| (JSC::weakRemove): Made these function templates slightly more generic |
| to accommodate new client types. |
| |
| 2012-06-01 Filip Pizlo <fpizlo@apple.com> |
| |
| DFG CFA should know that PutByVal can clobber the world |
| https://bugs.webkit.org/show_bug.cgi?id=88155 |
| |
| Reviewed by Gavin Barraclough. |
| |
| * dfg/DFGAbstractState.cpp: |
| (JSC::DFG::AbstractState::execute): |
| |
| 2012-06-01 Filip Pizlo <fpizlo@apple.com> |
| |
| DFG CFA should mark basic blocks as having constants if local accesses yield constants |
| https://bugs.webkit.org/show_bug.cgi?id=88153 |
| |
| Reviewed by Gavin Barraclough. |
| |
| * dfg/DFGAbstractState.cpp: |
| (JSC::DFG::AbstractState::execute): |
| |
| 2012-06-01 Filip Pizlo <fpizlo@apple.com> |
| |
| DFG arguments simplification phase uses a node.codeOrigin after appending a node |
| https://bugs.webkit.org/show_bug.cgi?id=88151 |
| |
| Reviewed by Geoffrey Garen. |
| |
| The right thing to do is to save the CodeOrigin before appending to the graph. |
| |
| * dfg/DFGArgumentsSimplificationPhase.cpp: |
| (JSC::DFG::ArgumentsSimplificationPhase::run): |
| |
| 2012-06-01 Filip Pizlo <fpizlo@apple.com> |
| |
| DFG should not emit unnecessary speculation checks when performing an int32 to double conversion on |
| a value that is proved to be a number, predicted to be an int32, but not proved to be an int32 |
| https://bugs.webkit.org/show_bug.cgi?id=88146 |
| |
| Reviewed by Gavin Barraclough. |
| |
| * dfg/DFGSpeculativeJIT.cpp: |
| (JSC::DFG::SpeculativeJIT::compileInt32ToDouble): |
| |
| 2012-06-01 Filip Pizlo <fpizlo@apple.com> |
| |
| DFG constant folding search for the last local access skips the immediately previous local access |
| https://bugs.webkit.org/show_bug.cgi?id=88141 |
| |
| Reviewed by Michael Saboff. |
| |
| If you use a loop in the style of: |
| |
| for (i = start; i--;) |
| |
| then you need to remember that the first value of 'i' that the loop body will see is 'start - 1'. |
| Hence the following is probably wrong: |
| |
| for (i = start - 1; i--;) |
| |
| * dfg/DFGConstantFoldingPhase.cpp: |
| (JSC::DFG::ConstantFoldingPhase::run): |
| |
| 2012-06-01 Filip Pizlo <fpizlo@apple.com> |
| |
| DFG constant folding should be OK with GetLocal of captured variables having a constant |
| https://bugs.webkit.org/show_bug.cgi?id=88137 |
| |
| Reviewed by Gavin Barraclough. |
| |
| * dfg/DFGConstantFoldingPhase.cpp: |
| (JSC::DFG::ConstantFoldingPhase::run): |
| |
| 2012-05-31 Mark Hahnenberg <mhahnenberg@apple.com> |
| |
| JSGlobalObject does not mark m_privateNameStructure |
| https://bugs.webkit.org/show_bug.cgi?id=88023 |
| |
| Rubber stamped by Gavin Barraclough. |
| |
| * runtime/JSGlobalObject.cpp: |
| (JSC::JSGlobalObject::visitChildren): We need to mark this so it doesn't get |
| inadvertently garbage collected. |
| |
| 2012-05-31 Erik Arvidsson <arv@chromium.org> |
| |
| Make DOM Exceptions Errors |
| https://bugs.webkit.org/show_bug.cgi?id=85078 |
| |
| Reviewed by Oliver Hunt. |
| |
| WebIDL mandates that exceptions should have Error.prototype on its prototype chain. |
| |
| For JSC we have access to the Error.prototype from the binding code. |
| |
| For V8 we set a field in the WrapperTypeInfo and when the constructor function is created we |
| set the prototype as needed. |
| |
| Updated test: fast/dom/DOMException/prototype-object.html |
| |
| * JavaScriptCore.xcodeproj/project.pbxproj: |
| * runtime/JSGlobalObject.cpp: |
| (JSC::JSGlobalObject::reset): |
| * runtime/JSGlobalObject.h: |
| (JSC): |
| (JSGlobalObject): |
| (JSC::JSGlobalObject::errorPrototype): |
| |
| 2012-05-31 Andy Wingo <wingo@igalia.com> |
| |
| Fix reference to unset variable in debug mode |
| https://bugs.webkit.org/show_bug.cgi?id=87981 |
| |
| Reviewed by Geoffrey Garen. |
| |
| * runtime/JSONObject.cpp (Stringifier::Holder::Holder): |
| Initialize m_size in debug mode, as we check it later in an assert. |
| |
| 2012-05-30 Mark Hahnenberg <mhahnenberg@apple.com> |
| |
| Heap should sweep incrementally |
| https://bugs.webkit.org/show_bug.cgi?id=85429 |
| |
| We shouldn't have to wait for the opportunistic GC timer to fire in order |
| to call object destructors. Instead, we should incrementally sweep some |
| subset of the blocks requiring sweeping periodically. We tie this sweeping |
| to a timer rather than to collections because we want to reclaim this memory |
| even if we stop allocating. This way, our memory usage scales smoothly with |
| actual use, regardless of whether we've recently done an opportunistic GC or not. |
| |
| Reviewed by Geoffrey Garen. |
| |
| * CMakeLists.txt: |
| * GNUmakefile.list.am: |
| * JavaScriptCore.gypi: |
| * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: |
| * JavaScriptCore.xcodeproj/project.pbxproj: |
| * Target.pri: |
| * heap/Heap.cpp: |
| (JSC::Heap::Heap): |
| (JSC::Heap::collect): We no longer sweep during a full sweep. We only shrink now, |
| which we will switch over to being done during incremental sweeping too as soon as |
| all finalizers can be run lazily (and, by extension, incrementally). |
| (JSC::Heap::sweeper): |
| (JSC): |
| * heap/Heap.h: |
| (JSC): |
| (Heap): |
| * heap/IncrementalSweeper.cpp: Added. |
| (JSC): |
| (JSC::IncrementalSweeper::timerDidFire): The IncrementalSweeper works very similarly to |
| GCActivityCallback. It is tied to a run-loop based timer that fires periodically based |
| on how long the previous sweep increment took to run. The IncrementalSweeper doesn't do |
| anything if the platform doesn't support CoreFoundation. |
| (JSC::IncrementalSweeper::IncrementalSweeper): |
| (JSC::IncrementalSweeper::~IncrementalSweeper): |
| (JSC::IncrementalSweeper::create): |
| (JSC::IncrementalSweeper::scheduleTimer): |
| (JSC::IncrementalSweeper::cancelTimer): |
| (JSC::IncrementalSweeper::doSweep): Iterates over the snapshot of the MarkedSpace taken |
| during the last collection, checking to see which blocks need sweeping. If it successfully |
| gets to the end of the blocks that need sweeping then it cancels the timer. |
| (JSC::IncrementalSweeper::startSweeping): We take a snapshot of the Heap and store it in |
| a Vector that the incremental sweep will iterate over. We also reset our index into this Vector. |
| * heap/IncrementalSweeper.h: Added. |
| (JSC): |
| (IncrementalSweeper): |
| * heap/MarkedBlock.h: |
| (JSC::MarkedBlock::needsSweeping): If a block is in the Marked state it needs sweeping |
| to be usable and to run any destructors that need to be run. |
| |
| 2012-05-30 Patrick Gansterer <paroga@webkit.org> |
| |
| [WINCE] Fix JSString after r115516. |
| https://bugs.webkit.org/show_bug.cgi?id=87892 |
| |
| Reviewed by Geoffrey Garen. |
| |
| r115516 splitted JSString into two classes, with addition nested classes. |
| Add a workaround for the WinCE compiler since it can't resolve the friend class |
| declerations corretly and denies the access to protected members of JSString. |
| |
| * runtime/JSString.h: |
| (JSC::JSRopeString::RopeBuilder::append): |
| (JSC::JSRopeString::append): |
| (JSRopeString): |
| |
| 2012-05-30 Oliver Hunt <oliver@apple.com> |
| |
| Really provide error information with the inspector disabled |
| https://bugs.webkit.org/show_bug.cgi?id=87910 |
| |
| Reviewed by Filip Pizlo. |
| |
| Don't bother checking for anything other than pre-existing error info. |
| In the absence of complete line number information you'll only get the |
| line a function starts on, but at least it's something. |
| |
| * interpreter/Interpreter.cpp: |
| (JSC::Interpreter::throwException): |
| |
| 2012-05-30 Filip Pizlo <fpizlo@apple.com> |
| |
| LLInt broken on x86-32 with JIT turned off |
| https://bugs.webkit.org/show_bug.cgi?id=87906 |
| |
| Reviewed by Geoffrey Garen. |
| |
| Fixed the code to not clobber registers that contain important things, like the call frame. |
| |
| * llint/LowLevelInterpreter32_64.asm: |
| |
| 2012-05-30 Filip Pizlo <fpizlo@apple.com> |
| |
| ScriptDebugServer wants sourceIDs that are non-zero because that's what HashMaps want, so JSC should placate it |
| https://bugs.webkit.org/show_bug.cgi?id=87887 |
| |
| Reviewed by Darin Adler. |
| |
| Better fix - we now never call SourceProvider::asID() if SourceProvider* is 0. |
| |
| * parser/Nodes.h: |
| (JSC::ScopeNode::sourceID): |
| * parser/SourceCode.h: |
| (JSC::SourceCode::providerID): |
| (SourceCode): |
| * parser/SourceProvider.h: |
| (SourceProvider): |
| (JSC::SourceProvider::asID): |
| * runtime/Executable.h: |
| (JSC::ScriptExecutable::sourceID): |
| |
| 2012-05-30 Filip Pizlo <fpizlo@apple.com> |
| |
| ScriptDebugServer wants sourceIDs that are non-zero because that's what HashMaps want, so JSC should placate it |
| https://bugs.webkit.org/show_bug.cgi?id=87887 |
| |
| Reviewed by Geoffrey Garen. |
| |
| * parser/SourceProvider.h: |
| (JSC::SourceProvider::asID): |
| |
| 2012-05-30 Oliver Hunt <oliver@apple.com> |
| |
| DFG does not correctly handle exceptions caught in the LLInt |
| https://bugs.webkit.org/show_bug.cgi?id=87885 |
| |
| Reviewed by Filip Pizlo. |
| |
| Make the DFG use genericThrow, rather than reimplementing a small portion of it. |
| Also make the LLInt slow paths validate that their PC is correct. |
| |
| * dfg/DFGOperations.cpp: |
| * llint/LLIntSlowPaths.cpp: |
| (LLInt): |
| |
| 2012-05-29 Filip Pizlo <fpizlo@apple.com> |
| |
| DFG CFA should infer types and values of captured variables |
| https://bugs.webkit.org/show_bug.cgi?id=87813 |
| |
| Reviewed by Gavin Barraclough. |
| |
| Slight speed-up in V8/earley-boyer (~1%). |
| |
| * bytecode/CodeBlock.h: |
| (JSC::CodeBlock::argumentsAreCaptured): |
| (JSC::CodeBlock::argumentIsCaptured): |
| (CodeBlock): |
| * dfg/DFGAbstractState.cpp: |
| (DFG): |
| (JSC::DFG::AbstractState::beginBasicBlock): |
| (JSC::DFG::AbstractState::initialize): |
| (JSC::DFG::AbstractState::endBasicBlock): |
| (JSC::DFG::AbstractState::execute): |
| (JSC::DFG::AbstractState::clobberWorld): |
| (JSC::DFG::AbstractState::clobberStructures): |
| (JSC::DFG::AbstractState::mergeStateAtTail): |
| (JSC::DFG::AbstractState::merge): |
| (JSC::DFG::AbstractState::mergeToSuccessors): |
| * dfg/DFGAbstractState.h: |
| (JSC::DFG::AbstractState::variables): |
| (AbstractState): |
| * dfg/DFGSpeculativeJIT32_64.cpp: |
| (JSC::DFG::SpeculativeJIT::compile): |
| * dfg/DFGSpeculativeJIT64.cpp: |
| (JSC::DFG::SpeculativeJIT::compile): |
| |
| 2012-05-30 Patrick Gansterer <paroga@webkit.org> |
| |
| Unreviewed. Build fix for !ENABLE(JIT) after r117823. |
| |
| * bytecode/CodeBlock.cpp: |
| (JSC::CodeBlock::dump): |
| |
| 2012-05-30 Sheriff Bot <webkit.review.bot@gmail.com> |
| |
| Unreviewed, rolling out r118868. |
| http://trac.webkit.org/changeset/118868 |
| https://bugs.webkit.org/show_bug.cgi?id=87828 |
| |
| introduced ~20 crashes on Mac and Qt bots (Requested by pizlo_ |
| on #webkit). |
| |
| * heap/Heap.cpp: |
| (JSC::Heap::collect): |
| * heap/MarkedBlock.cpp: |
| (JSC::MarkedBlock::sweep): |
| * heap/MarkedBlock.h: |
| (JSC::MarkedBlock::sweepWeakSet): |
| (JSC): |
| * heap/MarkedSpace.cpp: |
| (JSC::SweepWeakSet::operator()): |
| (JSC): |
| (JSC::MarkedSpace::sweepWeakSets): |
| * heap/MarkedSpace.h: |
| (MarkedSpace): |
| |
| 2012-05-29 Geoffrey Garen <ggaren@apple.com> |
| |
| Rolled back in r118646, now that |
| https://bugs.webkit.org/show_bug.cgi?id=87784 is fixed. |
| |
| http://trac.webkit.org/changeset/118646 |
| https://bugs.webkit.org/show_bug.cgi?id=87599 |
| |
| * heap/Heap.cpp: |
| (JSC::Heap::collect): |
| * heap/MarkedBlock.cpp: |
| (JSC::MarkedBlock::sweep): |
| * heap/MarkedBlock.h: |
| (JSC): |
| * heap/MarkedSpace.cpp: |
| (JSC): |
| * heap/MarkedSpace.h: |
| (MarkedSpace): |
| |
| 2012-05-29 Filip Pizlo <fpizlo@apple.com> |
| |
| DFG should keep captured variables alive until the (inline) return. |
| https://bugs.webkit.org/show_bug.cgi?id=87205 |
| |
| Reviewed by Gavin Barraclough. |
| |
| Changes the way we do flushing for captured variables and arguments. Instead of flushing |
| each SetLocal immediately, we flush at kill points. So a SetLocal will cause a Flush of |
| whatever was live in the variable previously, and a return will cause a Flush of all |
| captured variables and all arguments. |
| |
| * dfg/DFGByteCodeParser.cpp: |
| (JSC::DFG::ByteCodeParser::setDirect): |
| (JSC::DFG::ByteCodeParser::set): |
| (JSC::DFG::ByteCodeParser::setLocal): |
| (JSC::DFG::ByteCodeParser::getArgument): |
| (JSC::DFG::ByteCodeParser::setArgument): |
| (JSC::DFG::ByteCodeParser::findArgumentPositionForArgument): |
| (ByteCodeParser): |
| (JSC::DFG::ByteCodeParser::findArgumentPositionForLocal): |
| (JSC::DFG::ByteCodeParser::findArgumentPosition): |
| (JSC::DFG::ByteCodeParser::flush): |
| (JSC::DFG::ByteCodeParser::flushDirect): |
| (JSC::DFG::ByteCodeParser::flushArgumentsAndCapturedVariables): |
| (JSC::DFG::ByteCodeParser::handleInlining): |
| (JSC::DFG::ByteCodeParser::parseBlock): |
| (JSC::DFG::ByteCodeParser::InlineStackEntry::InlineStackEntry): |
| * dfg/DFGCSEPhase.cpp: |
| (JSC::DFG::CSEPhase::setLocalStoreElimination): |
| (JSC::DFG::CSEPhase::performNodeCSE): |
| * dfg/DFGSpeculativeJIT.cpp: |
| (JSC::DFG::SpeculativeJIT::compile): |
| * dfg/DFGSpeculativeJIT.h: |
| (JSC::DFG::SpeculativeJIT::forwardSpeculationCheck): |
| |
| 2012-05-29 Geoffrey Garen <ggaren@apple.com> |
| |
| WeakGCMap should be lazy-finalization-safe |
| https://bugs.webkit.org/show_bug.cgi?id=87784 |
| |
| Reviewed by Darin Adler. |
| |
| * runtime/WeakGCMap.h: |
| (JSC::WeakGCMap::get): Since this is a map of raw WeakImpl pointers, and |
| not Weak<T>, we need to verify manually that the WeakImpl is live before |
| we return its payload. |
| |
| 2012-05-29 Mark Hahnenberg <mhahnenberg@apple.com> |
| |
| CopiedSpace::doneCopying could start another collection |
| https://bugs.webkit.org/show_bug.cgi?id=86538 |
| |
| Reviewed by Geoffrey Garen. |
| |
| It's possible that if we don't have anything at the head of to-space |
| after a collection and the BlockAllocator doesn't have any fresh blocks |
| to give us right now we could start another collection while still in |
| the middle of the first collection when we call CopiedSpace::addNewBlock(). |
| |
| One way to resolve this would be to have Heap::shouldCollect() check that |
| m_operationInProgress is NoOperation. This would prevent the path in |
| getFreshBlock() that starts the collection if we're already in the middle of one. |
| |
| I could not come up with a test case to reproduce this crash on ToT. |
| |
| * heap/Heap.h: |
| (JSC::Heap::shouldCollect): We shouldn't collect if we're already in the middle |
| of a collection, i.e. the current operation should be NoOperation. |
| |
| 2012-05-29 David Barr <davidbarr@chromium.org> |
| |
| Introduce ENABLE_CSS_IMAGE_RESOLUTION compile flag |
| https://bugs.webkit.org/show_bug.cgi?id=87685 |
| |
| Reviewed by Eric Seidel. |
| |
| Add a configuration option for CSS image-resolution support, disabling it by default. |
| |
| * Configurations/FeatureDefines.xcconfig: |
| |
| 2012-05-28 Sheriff Bot <webkit.review.bot@gmail.com> |
| |
| Unreviewed, rolling out r118646. |
| http://trac.webkit.org/changeset/118646 |
| https://bugs.webkit.org/show_bug.cgi?id=87691 |
| |
| broke V8 raytrace benchmark (Requested by pizlo_ on #webkit). |
| |
| * heap/Heap.cpp: |
| (JSC::Heap::collect): |
| * heap/MarkedBlock.cpp: |
| (JSC::MarkedBlock::sweep): |
| * heap/MarkedBlock.h: |
| (JSC::MarkedBlock::sweepWeakSet): |
| (JSC): |
| * heap/MarkedSpace.cpp: |
| (JSC::SweepWeakSet::operator()): |
| (JSC): |
| (JSC::MarkedSpace::sweepWeakSets): |
| * heap/MarkedSpace.h: |
| (MarkedSpace): |
| |
| 2012-05-28 Filip Pizlo <fpizlo@apple.com> |
| |
| DFG should not generate code for code that the CFA proves to be unreachable |
| https://bugs.webkit.org/show_bug.cgi?id=87682 |
| |
| Reviewed by Sam Weinig. |
| |
| This also fixes a small performance bug where CFA was not marking blocks |
| as having constants (and hence not triggering constant folding) if the only |
| constants were on GetLocals. |
| |
| And fixing that bug revealed another bug: constant folding was assuming that |
| a GetLocal must be the first access to a local in a basic block. This isn't |
| true. The first access may be a Flush. This patch fixes that issue using the |
| safest approach possible, since we don't need to be clever for something that |
| only happens in one of our benchmarks. |
| |
| * dfg/DFGAbstractState.cpp: |
| (JSC::DFG::AbstractState::execute): |
| * dfg/DFGConstantFoldingPhase.cpp: |
| (JSC::DFG::ConstantFoldingPhase::run): |
| * dfg/DFGJITCompiler.h: |
| (JSC::DFG::JITCompiler::noticeOSREntry): |
| * dfg/DFGSpeculativeJIT.cpp: |
| (JSC::DFG::SpeculativeJIT::compile): |
| |
| 2012-05-28 Carlos Garcia Campos <cgarcia@igalia.com> |
| |
| Unreviewed. Fix make distcheck. |
| |
| * GNUmakefile.list.am: Add missing header file. |
| |
| 2012-05-27 Geoffrey Garen <ggaren@apple.com> |
| |
| Weak pointer finalization should be lazy |
| https://bugs.webkit.org/show_bug.cgi?id=87599 |
| |
| Reviewed by Darin Adler. |
| |
| * heap/Heap.cpp: |
| (JSC::Heap::collect): Don't force immediate finalization -- it will |
| happen lazily. |
| |
| * heap/MarkedBlock.cpp: |
| (JSC::MarkedBlock::sweep): Sweep a block's weak set when sweeping the |
| block. The weak set may not have been swept yet, and this is our last |
| chance to run weak finalizers before we recycle the memory they reference. |
| |
| * heap/MarkedBlock.h: |
| * heap/MarkedSpace.cpp: |
| (JSC::MarkedBlock::sweepWeakSets): |
| * heap/MarkedSpace.h: |
| (JSC::MarkedSpace::sweepWeakSets): Nixed sweepWeakSets because it's unused |
| now. |
| |
| 2012-05-26 Geoffrey Garen <ggaren@apple.com> |
| |
| WebKit should be lazy-finalization-safe (esp. the DOM) v2 |
| https://bugs.webkit.org/show_bug.cgi?id=87581 |
| |
| Reviewed by Oliver Hunt. |
| |
| * heap/MarkedBlock.cpp: |
| (JSC::MarkedBlock::callDestructor): |
| * heap/WeakBlock.h: |
| * heap/WeakSetInlines.h: |
| (JSC::WeakBlock::finalize): Since we don't guarantee destruction order, |
| it's not valid to access GC pointers like the Structure pointer during |
| finalization. We NULL out the structure pointer in debug builds to try |
| to make this programming mistake more obvious. |
| |
| * API/JSCallbackConstructor.cpp: |
| (JSC::JSCallbackConstructor::destroy): |
| * API/JSCallbackObject.cpp: |
| (JSC::::destroy): |
| (JSC::JSCallbackObjectData::finalize): |
| * runtime/Arguments.cpp: |
| (JSC::Arguments::destroy): |
| * runtime/DateInstance.cpp: |
| (JSC::DateInstance::destroy): |
| * runtime/Error.cpp: |
| (JSC::StrictModeTypeErrorFunction::destroy): |
| * runtime/Executable.cpp: |
| (JSC::ExecutableBase::destroy): |
| (JSC::NativeExecutable::destroy): |
| (JSC::ScriptExecutable::destroy): |
| (JSC::EvalExecutable::destroy): |
| (JSC::ProgramExecutable::destroy): |
| (JSC::FunctionExecutable::destroy): |
| * runtime/JSGlobalObject.cpp: |
| (JSC::JSGlobalObject::destroy): |
| * runtime/JSPropertyNameIterator.cpp: |
| (JSC::JSPropertyNameIterator::destroy): |
| * runtime/JSStaticScopeObject.cpp: |
| (JSC::JSStaticScopeObject::destroy): |
| * runtime/JSString.cpp: |
| (JSC::JSString::destroy): |
| * runtime/JSVariableObject.cpp: |
| (JSC::JSVariableObject::destroy): |
| * runtime/NameInstance.cpp: |
| (JSC::NameInstance::destroy): |
| * runtime/RegExp.cpp: |
| (JSC::RegExp::destroy): |
| * runtime/RegExpConstructor.cpp: |
| (JSC::RegExpConstructor::destroy): |
| * runtime/Structure.cpp: |
| (JSC::Structure::destroy): |
| * runtime/StructureChain.cpp: |
| (JSC::StructureChain::destroy): Use static_cast instead of jsCast because |
| jsCast does Structure-based validation, and our Structure is not guaranteed |
| to be alive when we get finalized. |
| |
| 2012-05-22 Filip Pizlo <fpizlo@apple.com> |
| |
| DFG CSE should eliminate redundant WeakJSConstants |
| https://bugs.webkit.org/show_bug.cgi?id=87179 |
| |
| Reviewed by Gavin Barraclough. |
| |
| Merged r118141 from dfgopt. |
| |
| * dfg/DFGCSEPhase.cpp: |
| (JSC::DFG::CSEPhase::weakConstantCSE): |
| (CSEPhase): |
| (JSC::DFG::CSEPhase::performNodeCSE): |
| * dfg/DFGNode.h: |
| (JSC::DFG::Node::weakConstant): |
| |
| 2012-05-22 Filip Pizlo <fpizlo@apple.com> |
| |
| DFG CSE should do redundant store elimination |
| https://bugs.webkit.org/show_bug.cgi?id=87161 |
| |
| Reviewed by Oliver Hunt. |
| |
| Merge r118138 from dfgopt. |
| |
| This patch adds redundant store elimination. For example, consider this |
| code: |
| |
| o.x = 42; |
| o.x = 84; |
| |
| If o.x is speculated to be a well-behaved field, the first assignment is |
| unnecessary, since the second just overwrites it. We would like to |
| eliminate the first assignment in these cases. The need for this |
| optimization arises mostly from stores that our runtime requires. For |
| example: |
| |
| o = {f:1, g:2, h:3}; |
| |
| This will have four assignments to the structure for the newly created |
| object - one assignment for the empty structure, one for {f}, one for |
| {f, g}, and one for {f, g, h}. We would like to only have the last of |
| those assigments in this case. |
| |
| Intriguingly, doing so for captured variables breaks the way arguments |
| simplification used to work. Consider that prior to either arguments |
| simplification or store elimination we will have IR that looks like: |
| |
| a: SetLocal(r0, Empty) |
| b: SetLocal(r1, Empty) |
| c: GetLocal(r0) |
| d: CreateArguments(@c) |
| e: SetLocal(r0, @d) |
| f: SetLocal(r1, @d) |
| |
| Then redundant store elimination will eliminate the stores that |
| initialize the arguments registers to Empty, but then arguments |
| simplification eliminates the stores that initialize the arguments to |
| the newly created arguments - and at this point we no longer have any |
| stores to the arguments register, leading to hilarious crashes. This |
| patch therefore changes arguments simplification to replace |
| CreateArguments with JSConstant(Empty) rather than eliminating the |
| SetLocals. But this revealed bugs where arguments simplification was |
| being overzealous, so I fixed those bugs. |
| |
| This is a minor speed-up on V8/early and a handful of other tests. |
| |
| * bytecode/CodeBlock.h: |
| (JSC::CodeBlock::uncheckedActivationRegister): |
| * dfg/DFGAbstractState.cpp: |
| (JSC::DFG::AbstractState::execute): |
| * dfg/DFGArgumentsSimplificationPhase.cpp: |
| (JSC::DFG::ArgumentsSimplificationPhase::run): |
| (JSC::DFG::ArgumentsSimplificationPhase::observeBadArgumentsUse): |
| (JSC::DFG::ArgumentsSimplificationPhase::observeBadArgumentsUses): |
| (JSC::DFG::ArgumentsSimplificationPhase::observeProperArgumentsUse): |
| * dfg/DFGCSEPhase.cpp: |
| (JSC::DFG::CSEPhase::globalVarStoreElimination): |
| (CSEPhase): |
| (JSC::DFG::CSEPhase::putStructureStoreElimination): |
| (JSC::DFG::CSEPhase::putByOffsetStoreElimination): |
| (JSC::DFG::CSEPhase::setLocalStoreElimination): |
| (JSC::DFG::CSEPhase::setReplacement): |
| (JSC::DFG::CSEPhase::eliminate): |
| (JSC::DFG::CSEPhase::performNodeCSE): |
| * dfg/DFGGraph.h: |
| (JSC::DFG::Graph::uncheckedActivationRegisterFor): |
| (Graph): |
| * dfg/DFGNode.h: |
| (JSC::DFG::Node::isPhantomArguments): |
| (Node): |
| (JSC::DFG::Node::hasConstant): |
| (JSC::DFG::Node::valueOfJSConstant): |
| (JSC::DFG::Node::hasStructureTransitionData): |
| * dfg/DFGNodeType.h: |
| (DFG): |
| * dfg/DFGPredictionPropagationPhase.cpp: |
| (JSC::DFG::PredictionPropagationPhase::propagate): |
| * dfg/DFGSpeculativeJIT.cpp: |
| (JSC::DFG::SpeculativeJIT::computeValueRecoveryFor): |
| * dfg/DFGSpeculativeJIT32_64.cpp: |
| (JSC::DFG::SpeculativeJIT::compile): |
| * dfg/DFGSpeculativeJIT64.cpp: |
| (JSC::DFG::SpeculativeJIT::compile): |
| |
| 2012-05-21 Filip Pizlo <fpizlo@apple.com> |
| |
| DFG ConvertThis should just be a CheckStructure if the structure is known |
| https://bugs.webkit.org/show_bug.cgi?id=87057 |
| |
| Reviewed by Gavin Barraclough. |
| |
| Merged r118021 from dfgopt. |
| |
| This gives ValueProfile the ability to track singleton values - i.e. profiling |
| sites that always see the same value. |
| |
| That is then used to profile the structure in op_convert_this. |
| |
| This is then used to optimize op_convert_this into a CheckStructure if the |
| structure is always the same. |
| |
| That then results in better CSE in inlined code that uses 'this', since |
| previously we couldn't CSE accesses on 'this' from different inline call frames. |
| |
| Also fixed a bug where we were unnecessarily flushing 'this'. |
| |
| * bytecode/CodeBlock.cpp: |
| (JSC::CodeBlock::dump): |
| (JSC::CodeBlock::stronglyVisitStrongReferences): |
| * bytecode/LazyOperandValueProfile.cpp: |
| (JSC::CompressedLazyOperandValueProfileHolder::computeUpdatedPredictions): |
| * bytecode/LazyOperandValueProfile.h: |
| (CompressedLazyOperandValueProfileHolder): |
| * bytecode/Opcode.h: |
| (JSC): |
| (JSC::padOpcodeName): |
| * bytecode/ValueProfile.h: |
| (JSC::ValueProfileBase::ValueProfileBase): |
| (JSC::ValueProfileBase::dump): |
| (JSC::ValueProfileBase::computeUpdatedPrediction): |
| (ValueProfileBase): |
| * bytecompiler/BytecodeGenerator.cpp: |
| (JSC::BytecodeGenerator::BytecodeGenerator): |
| * dfg/DFGByteCodeParser.cpp: |
| (JSC::DFG::ByteCodeParser::setArgument): |
| (JSC::DFG::ByteCodeParser::parseBlock): |
| * jit/JITOpcodes.cpp: |
| (JSC::JIT::emit_op_convert_this): |
| (JSC::JIT::emitSlow_op_convert_this): |
| * jit/JITOpcodes32_64.cpp: |
| (JSC::JIT::emit_op_convert_this): |
| (JSC::JIT::emitSlow_op_convert_this): |
| * llint/LLIntSlowPaths.cpp: |
| (JSC::LLInt::LLINT_SLOW_PATH_DECL): |
| * llint/LowLevelInterpreter32_64.asm: |
| * llint/LowLevelInterpreter64.asm: |
| * runtime/JSValue.h: |
| (JSValue): |
| * runtime/Structure.h: |
| (JSC::JSValue::structureOrUndefined): |
| (JSC): |
| |
| 2012-05-24 Tim Horton <timothy_horton@apple.com> |
| |
| Add feature defines for web-facing parts of CSS Regions and Exclusions |
| https://bugs.webkit.org/show_bug.cgi?id=87442 |
| <rdar://problem/10887709> |
| |
| Reviewed by Dan Bernstein. |
| |
| * Configurations/FeatureDefines.xcconfig: |
| |
| 2012-05-24 Geoffrey Garen <ggaren@apple.com> |
| |
| WebKit should be lazy-finalization-safe (esp. the DOM) |
| https://bugs.webkit.org/show_bug.cgi?id=87456 |
| |
| Reviewed by Filip Pizlo. |
| |
| Lazy finalization adds one twist to weak pointer use: |
| |
| A HashMap of weak pointers may contain logically null entries. |
| (Weak pointers behave as-if null once their payloads die.) |
| Insertion must not assume that a pre-existing entry is |
| necessarily valid, and iteration must not assume that all |
| entries can be dereferenced. |
| |
| (Previously, I thought that it also added a second twist: |
| |
| A demand-allocated weak pointer may replace a dead payload |
| before the payload's finalizer runs. In that case, when the |
| payload's finalizer runs, the payload has already been |
| overwritten, and the finalizer should not clear the payload, |
| which now points to something new. |
| |
| But that's not the case here, since we cancel the old payload's |
| finalizer when we over-write it. I've added ASSERTs to verify this |
| assumption, in case it ever changes.) |
| |
| * API/JSClassRef.cpp: |
| (OpaqueJSClass::prototype): No need to specify null; that's the default. |
| |
| * API/JSWeakObjectMapRefPrivate.cpp: Use remove, since take() is gone. |
| |
| * heap/PassWeak.h: |
| (WeakImplAccessor::was): This is no longer a debug-only function, since |
| it's required to reason about lazily finalized pointers. |
| |
| * heap/Weak.h: |
| (JSC::weakAdd): |
| (JSC::weakRemove): |
| (JSC::weakClear): Added these helper functions for the common idioms of |
| what clients want to do in their weak pointer finalizers. |
| |
| * jit/JITStubs.cpp: |
| (JSC::JITThunks::hostFunctionStub): Use the new idioms. Otherwise, we |
| would return NULL for a "zombie" executable weak pointer that was waiting |
| for finalization (item (2)), and finalizing a dead executable weak pointer |
| would potentially destroy a new, live one (item (1)). |
| |
| * runtime/RegExpCache.cpp: |
| (JSC::RegExpCache::lookupOrCreate): |
| (JSC::RegExpCache::finalize): Ditto. |
| |
| (JSC::RegExpCache::invalidateCode): Check for null while iterating. (See |
| item (2).) |
| |
| * runtime/Structure.cpp: |
| (JSC::StructureTransitionTable::contains): |
| (JSC::StructureTransitionTable::add): Use get and set instead of add and |
| contains, since add and contains are not compatible with lazy finalization. |
| |
| * runtime/WeakGCMap.h: |
| (WeakGCMap): |
| (JSC::WeakGCMap::clear): |
| (JSC::WeakGCMap::remove): Removed a bunch of code that was incompatible with |
| lazy finalization because I didn't feel like making it compatible, and I had |
| no way to test it. |
| |
| 2012-05-24 Filip Pizlo <fpizlo@apple.com> |
| |
| REGRESSION (r118013-r118031): Loops/Reloads under www.yahoo.com, quits after three tries with error |
| https://bugs.webkit.org/show_bug.cgi?id=87327 |
| |
| Reviewed by Geoffrey Garen. |
| |
| If you use AbstractValue::filter(StructureSet) to test subset relationships between TOP and a |
| set containing >=2 elements, you're going to have a bad time. |
| |
| That's because AbstractValue considers a set with >=2 elements to be equivalent to TOP, in order |
| to save space and speed up convergence. So filtering has no effect in this case, which made |
| the code think that the abstract value was proving that the structure check was unnecessary. |
| The correct thing to do is to use isSubsetOf() on the StructureAbstractValue, which does the |
| right thingies for TOP and >=2 elements. |
| |
| * dfg/DFGAbstractState.cpp: |
| (JSC::DFG::AbstractState::execute): |
| * dfg/DFGSpeculativeJIT32_64.cpp: |
| (JSC::DFG::SpeculativeJIT::compile): |
| * dfg/DFGSpeculativeJIT64.cpp: |
| (JSC::DFG::SpeculativeJIT::compile): |
| |
| 2012-05-24 Filip Pizlo <fpizlo@apple.com> |
| |
| new test fast/js/dfg-arguments-mixed-alias.html fails on JSVALUE32_64 |
| https://bugs.webkit.org/show_bug.cgi?id=87378 |
| |
| Reviewed by Gavin Barraclough. |
| |
| - Captured variable tracking forgot did not consistently handle arguments, leading to OSR |
| badness. |
| |
| - Nodes capable of exiting were tracked in a non-monotonic way, leading to compiler errors. |
| |
| * dfg/DFGByteCodeParser.cpp: |
| (JSC::DFG::ByteCodeParser::InlineStackEntry::InlineStackEntry): |
| * dfg/DFGCSEPhase.cpp: |
| (JSC::DFG::CSEPhase::CSEPhase): |
| (CSEPhase): |
| (JSC::DFG::performCSE): |
| * dfg/DFGCSEPhase.h: |
| (DFG): |
| * dfg/DFGCommon.h: |
| * dfg/DFGDriver.cpp: |
| (JSC::DFG::compile): |
| * dfg/DFGGraph.cpp: |
| (JSC::DFG::Graph::resetExitStates): |
| (DFG): |
| * dfg/DFGGraph.h: |
| (Graph): |
| * dfg/DFGPhase.h: |
| (DFG): |
| (JSC::DFG::runPhase): |
| |
| 2012-05-24 Geoffrey Garen <ggaren@apple.com> |
| |
| Made WeakSet per-block instead of per-heap |
| https://bugs.webkit.org/show_bug.cgi?id=87401 |
| |
| Reviewed by Oliver Hunt. |
| |
| This allows us fast access to the set of all weak pointers for a block, |
| which is a step toward lazy finalization. |
| |
| No performance change. |
| |
| * heap/Heap.cpp: |
| (JSC::Heap::Heap): |
| (JSC::Heap::lastChanceToFinalize): Removed the per-heap weak set, since |
| it's per-block now. |
| |
| (JSC::Heap::markRoots): Delegate weak set visiting to the marked space, |
| since it knows how to iterate all blocks. |
| |
| (JSC::Heap::collect): Moved the reaping outside of markRoots, since it |
| doesn't mark anything. |
| |
| Make sure to reset allocators after shrinking, since shrinking may |
| deallocate the current allocator. |
| |
| * heap/Heap.h: |
| (Heap): No more per-heap weak set, since it's per-block now. |
| |
| * heap/MarkedBlock.cpp: |
| (JSC::MarkedBlock::MarkedBlock): |
| * heap/MarkedBlock.h: |
| (MarkedBlock): |
| (JSC::MarkedBlock::lastChanceToFinalize): Migrated finalization logic |
| here from the heap, so the heap doesn't need to know about our internal |
| data structures like our weak set. |
| |
| (JSC::MarkedBlock::heap): |
| (JSC::MarkedBlock::weakSet): |
| (JSC::MarkedBlock::shrink): |
| (JSC::MarkedBlock::resetAllocator): |
| (JSC::MarkedBlock::visitWeakSet): |
| (JSC::MarkedBlock::reapWeakSet): |
| (JSC::MarkedBlock::sweepWeakSet): |
| * heap/MarkedSpace.cpp: |
| (JSC::VisitWeakSet::VisitWeakSet): |
| (JSC::VisitWeakSet::operator()): |
| (VisitWeakSet): |
| (JSC): |
| (JSC::ReapWeakSet::operator()): |
| (JSC::SweepWeakSet::operator()): |
| (JSC::LastChanceToFinalize::operator()): |
| (JSC::MarkedSpace::lastChanceToFinalize): |
| (JSC::ResetAllocator::operator()): |
| (JSC::MarkedSpace::resetAllocators): |
| (JSC::MarkedSpace::visitWeakSets): |
| (JSC::MarkedSpace::reapWeakSets): |
| (JSC::MarkedSpace::sweepWeakSets): |
| (JSC::Shrink::operator()): |
| (JSC::MarkedSpace::shrink): |
| * heap/MarkedSpace.h: |
| (MarkedSpace): Make sure to account for our weak sets when sweeping, |
| shrinking, etc. |
| |
| * heap/WeakSet.cpp: |
| (JSC): |
| * heap/WeakSet.h: |
| (WeakSet): |
| (JSC::WeakSet::heap): |
| (JSC): |
| (JSC::WeakSet::lastChanceToFinalize): |
| (JSC::WeakSet::visit): |
| (JSC::WeakSet::reap): |
| (JSC::WeakSet::shrink): |
| (JSC::WeakSet::resetAllocator): Inlined some things since they're called |
| once per block now instead of once per heap. |
| |
| * heap/WeakSetInlines.h: |
| (JSC::WeakSet::allocate): Use the per-block weak set since there is no |
| per-heap weak set anymore. |
| |
| 2012-05-24 Gavin Barraclough <barraclough@apple.com> |
| |
| Fix arm build |
| |
| Rubber stamped by Geoff Garen |
| |
| * dfg/DFGGPRInfo.h: |
| (GPRInfo): |
| |
| 2012-05-24 Gavin Barraclough <barraclough@apple.com> |
| |
| Move cacheFlush from ExecutableAllocator to Assembler classes |
| https://bugs.webkit.org/show_bug.cgi?id=87420 |
| |
| Reviewed by Oliver Hunt. |
| |
| Makes more sense there, & remove a pile of #ifdefs. |
| |
| * assembler/ARMAssembler.cpp: |
| (JSC): |
| (JSC::ARMAssembler::cacheFlush): |
| * assembler/ARMAssembler.h: |
| (ARMAssembler): |
| (JSC::ARMAssembler::cacheFlush): |
| * assembler/ARMv7Assembler.h: |
| (JSC::ARMv7Assembler::relinkJump): |
| (JSC::ARMv7Assembler::cacheFlush): |
| (ARMv7Assembler): |
| (JSC::ARMv7Assembler::setInt32): |
| (JSC::ARMv7Assembler::setUInt7ForLoad): |
| * assembler/AbstractMacroAssembler.h: |
| (JSC::AbstractMacroAssembler::cacheFlush): |
| * assembler/LinkBuffer.h: |
| (JSC::LinkBuffer::performFinalization): |
| * assembler/MIPSAssembler.h: |
| (JSC::MIPSAssembler::relinkJump): |
| (JSC::MIPSAssembler::relinkCall): |
| (JSC::MIPSAssembler::repatchInt32): |
| (JSC::MIPSAssembler::cacheFlush): |
| (MIPSAssembler): |
| * assembler/SH4Assembler.h: |
| (JSC::SH4Assembler::repatchCompact): |
| (JSC::SH4Assembler::cacheFlush): |
| (SH4Assembler): |
| * assembler/X86Assembler.h: |
| (X86Assembler): |
| (JSC::X86Assembler::cacheFlush): |
| * jit/ExecutableAllocator.cpp: |
| (JSC): |
| * jit/ExecutableAllocator.h: |
| (ExecutableAllocator): |
| |
| 2012-05-24 John Mellor <johnme@chromium.org> |
| |
| Font Boosting: Add compile flag and runtime setting |
| https://bugs.webkit.org/show_bug.cgi?id=87394 |
| |
| Reviewed by Adam Barth. |
| |
| Add ENABLE_FONT_BOOSTING. |
| |
| * Configurations/FeatureDefines.xcconfig: |
| |
| 2012-05-24 Allan Sandfeld Jensen <allan.jensen@nokia.com> |
| |
| cti_vm_throw gets kicked out by gcc 4.6 -flto |
| https://bugs.webkit.org/show_bug.cgi?id=56088 |
| |
| Reviewed by Darin Adler. |
| |
| Add REFERENCED_FROM_ASM to functions only referenced from assembler. |
| |
| * dfg/DFGOperations.cpp: |
| * jit/HostCallReturnValue.h: |
| * jit/JITStubs.h: |
| * jit/ThunkGenerators.cpp: |
| |
| 2012-05-24 Filip Pizlo <fpizlo@apple.com> |
| |
| Incorrect merge of r117542 from dfg opt branch in r118323 is leading to fast/js/dfg-arguments-osr-exit.html failing |
| https://bugs.webkit.org/show_bug.cgi?id=87350 |
| |
| Reviewed by Maciej Stachowiak. |
| |
| The dfgopt branch introduced the notion of a local variable being killed because it was aliased |
| to the Arguments object as in cases like: |
| |
| var a = arguments; |
| return a.length; |
| |
| This required changes to OSR exit handling - if the variable is dead but aliased to arguments, then |
| OSR exit should reify the arguments. But meanwhile, in tip of tree we introduced special handling for |
| dead variables on OSR exit. When the two were merged in r118323, the structure of the if/else branches |
| ended up being such that we would treat dead arguments variables as totally dead as opposed to treating |
| them as variables that need arguments reification. |
| |
| This fixes the structure of the relevant if/else block so that variables that are dead-but-arguments |
| end up being treated as reified arguments objects, while variables that are dead but not aliased to |
| arguments are treated as tip of tree would have treated them (initialize to Undefined). |
| |
| * dfg/DFGSpeculativeJIT.cpp: |
| (JSC::DFG::SpeculativeJIT::compile): |
| |
| 2012-05-24 Csaba Osztrogonác <ossy@webkit.org> |
| |
| Unreviewed 32 bit buildfix after r118325. |
| |
| * dfg/DFGSpeculativeJIT32_64.cpp: |
| (JSC::DFG::SpeculativeJIT::fillSpeculateIntInternal): Use ASSERT_UNUSED instead ASSERT. |
| |
| 2012-05-23 Filip Pizlo <fpizlo@apple.com> |
| |
| DFG operationTearOffActivation should return after handling the null activation case |
| https://bugs.webkit.org/show_bug.cgi?id=87348 |
| <rdar://problem/11522295> |
| |
| Reviewed by Oliver Hunt. |
| |
| * dfg/DFGOperations.cpp: |
| |
| 2012-05-23 Filip Pizlo <fpizlo@apple.com> |
| |
| Unreviewed, merge the arguments fix in r118138 to get bots green. |
| |
| * dfg/DFGArgumentsSimplificationPhase.cpp: |
| (JSC::DFG::ArgumentsSimplificationPhase::observeBadArgumentsUse): |
| |
| 2012-05-20 Filip Pizlo <fpizlo@apple.com> |
| |
| DFG CFA should record if a node can OSR exit |
| https://bugs.webkit.org/show_bug.cgi?id=86905 |
| |
| Reviewed by Oliver Hunt. |
| |
| Merged r117931 from dfgopt. |
| |
| Adds a NodeFlag that denotes nodes that are known to not have OSR exits. |
| This ought to aid any backwards analyses that need to know when a |
| backward flow merge might happen due to a side exit. |
| |
| Also added assertions into speculationCheck() that ensure that we did not |
| mark a node as non-exiting and then promptly compile in an exit. This |
| helped catch some minor bugs where we were doing unnecessary speculation |
| checks. |
| |
| This is a perf-neutral change. The speculation checks that this removes |
| were not on hot paths of major benchmarks. |
| |
| * bytecode/PredictedType.h: |
| (JSC): |
| (JSC::isAnyPrediction): |
| * dfg/DFGAbstractState.cpp: |
| (JSC::DFG::AbstractState::execute): |
| * dfg/DFGAbstractState.h: |
| (JSC::DFG::AbstractState::speculateInt32Unary): |
| (AbstractState): |
| (JSC::DFG::AbstractState::speculateNumberUnary): |
| (JSC::DFG::AbstractState::speculateBooleanUnary): |
| (JSC::DFG::AbstractState::speculateInt32Binary): |
| (JSC::DFG::AbstractState::speculateNumberBinary): |
| * dfg/DFGNode.h: |
| (JSC::DFG::Node::mergeFlags): |
| (JSC::DFG::Node::filterFlags): |
| (Node): |
| (JSC::DFG::Node::setCanExit): |
| (JSC::DFG::Node::canExit): |
| * dfg/DFGNodeFlags.cpp: |
| (JSC::DFG::nodeFlagsAsString): |
| * dfg/DFGNodeFlags.h: |
| (DFG): |
| * dfg/DFGSpeculativeJIT.cpp: |
| (JSC::DFG::SpeculativeJIT::SpeculativeJIT): |
| (JSC::DFG::SpeculativeJIT::checkArgumentTypes): |
| (JSC::DFG::SpeculativeJIT::compileValueToInt32): |
| * dfg/DFGSpeculativeJIT.h: |
| (JSC::DFG::SpeculativeJIT::speculationCheck): |
| (JSC::DFG::SpeculativeJIT::forwardSpeculationCheck): |
| (JSC::DFG::SpeculativeJIT::terminateSpeculativeExecution): |
| (SpeculativeJIT): |
| * dfg/DFGSpeculativeJIT32_64.cpp: |
| (JSC::DFG::SpeculativeJIT::fillSpeculateIntInternal): |
| (JSC::DFG::SpeculativeJIT::fillSpeculateDouble): |
| (JSC::DFG::SpeculativeJIT::fillSpeculateCell): |
| (JSC::DFG::SpeculativeJIT::fillSpeculateBoolean): |
| (JSC::DFG::SpeculativeJIT::compile): |
| * dfg/DFGSpeculativeJIT64.cpp: |
| (JSC::DFG::SpeculativeJIT::fillSpeculateIntInternal): |
| (JSC::DFG::SpeculativeJIT::fillSpeculateDouble): |
| (JSC::DFG::SpeculativeJIT::fillSpeculateCell): |
| (JSC::DFG::SpeculativeJIT::fillSpeculateBoolean): |
| (JSC::DFG::SpeculativeJIT::compile): |
| |
| 2012-05-20 Filip Pizlo <fpizlo@apple.com> |
| |
| DFG should not do unnecessary indirections when storing to objects |
| https://bugs.webkit.org/show_bug.cgi?id=86959 |
| |
| Reviewed by Oliver Hunt. |
| |
| Merged r117819 from dfgopt. |
| |
| * dfg/DFGByteCodeParser.cpp: |
| (JSC::DFG::ByteCodeParser::parseBlock): |
| * dfg/DFGCSEPhase.cpp: |
| (JSC::DFG::CSEPhase::getByOffsetLoadElimination): |
| * dfg/DFGSpeculativeJIT32_64.cpp: |
| (JSC::DFG::SpeculativeJIT::compile): |
| * dfg/DFGSpeculativeJIT64.cpp: |
| (JSC::DFG::SpeculativeJIT::compile): |
| |
| 2012-05-17 Filip Pizlo <fpizlo@apple.com> |
| |
| DFG should optimize aliased uses of the Arguments object of the current call frame |
| https://bugs.webkit.org/show_bug.cgi?id=86552 |
| |
| Reviewed by Geoff Garen. |
| |
| Merged r117542 and r117543 from dfgopt. |
| |
| Performs must-alias and escape analysis on uses of CreateArguments, and if |
| a variable is must-aliased to CreateArguments and does not escape, then we |
| turn all uses of that variable into direct arguments accesses. |
| |
| 36% speed-up on V8/earley leading to a 2.3% speed-up overall in V8. |
| |
| * bytecode/CodeBlock.h: |
| (JSC::CodeBlock::uncheckedArgumentsRegister): |
| * bytecode/ValueRecovery.h: |
| (JSC::ValueRecovery::argumentsThatWereNotCreated): |
| (ValueRecovery): |
| (JSC::ValueRecovery::dump): |
| * dfg/DFGAbstractState.cpp: |
| (JSC::DFG::AbstractState::execute): |
| * dfg/DFGAdjacencyList.h: |
| (AdjacencyList): |
| (JSC::DFG::AdjacencyList::removeEdgeFromBag): |
| * dfg/DFGArgumentsSimplificationPhase.cpp: |
| (JSC::DFG::ArgumentsSimplificationPhase::run): |
| (ArgumentsSimplificationPhase): |
| (JSC::DFG::ArgumentsSimplificationPhase::observeBadArgumentsUse): |
| (JSC::DFG::ArgumentsSimplificationPhase::observeBadArgumentsUses): |
| (JSC::DFG::ArgumentsSimplificationPhase::observeProperArgumentsUse): |
| (JSC::DFG::ArgumentsSimplificationPhase::isOKToOptimize): |
| (JSC::DFG::ArgumentsSimplificationPhase::removeArgumentsReferencingPhantomChild): |
| * dfg/DFGAssemblyHelpers.h: |
| (JSC::DFG::AssemblyHelpers::argumentsRegisterFor): |
| (AssemblyHelpers): |
| * dfg/DFGByteCodeParser.cpp: |
| (JSC::DFG::ByteCodeParser::parseBlock): |
| * dfg/DFGCFGSimplificationPhase.cpp: |
| (JSC::DFG::CFGSimplificationPhase::removePotentiallyDeadPhiReference): |
| * dfg/DFGGPRInfo.h: |
| (GPRInfo): |
| * dfg/DFGGraph.cpp: |
| (JSC::DFG::Graph::collectGarbage): |
| (DFG): |
| * dfg/DFGGraph.h: |
| (Graph): |
| (JSC::DFG::Graph::executableFor): |
| (JSC::DFG::Graph::argumentsRegisterFor): |
| (JSC::DFG::Graph::uncheckedArgumentsRegisterFor): |
| (JSC::DFG::Graph::clobbersWorld): |
| * dfg/DFGNode.h: |
| (JSC::DFG::Node::hasHeapPrediction): |
| * dfg/DFGNodeType.h: |
| (DFG): |
| * dfg/DFGOSRExitCompiler.cpp: |
| * dfg/DFGOSRExitCompiler.h: |
| (JSC::DFG::OSRExitCompiler::OSRExitCompiler): |
| (OSRExitCompiler): |
| * dfg/DFGOSRExitCompiler32_64.cpp: |
| (JSC::DFG::OSRExitCompiler::compileExit): |
| * dfg/DFGOSRExitCompiler64.cpp: |
| (JSC::DFG::OSRExitCompiler::compileExit): |
| * dfg/DFGOperations.cpp: |
| * dfg/DFGPredictionPropagationPhase.cpp: |
| (JSC::DFG::PredictionPropagationPhase::propagate): |
| * dfg/DFGSpeculativeJIT.cpp: |
| (JSC::DFG::ValueSource::dump): |
| (JSC::DFG::SpeculativeJIT::compile): |
| (JSC::DFG::SpeculativeJIT::computeValueRecoveryFor): |
| * dfg/DFGSpeculativeJIT.h: |
| * dfg/DFGSpeculativeJIT32_64.cpp: |
| (JSC::DFG::SpeculativeJIT::compile): |
| * dfg/DFGSpeculativeJIT64.cpp: |
| (JSC::DFG::SpeculativeJIT::compile): |
| * dfg/DFGVariableAccessData.h: |
| (JSC::DFG::VariableAccessData::VariableAccessData): |
| (JSC::DFG::VariableAccessData::mergeIsArgumentsAlias): |
| (VariableAccessData): |
| (JSC::DFG::VariableAccessData::isArgumentsAlias): |
| * jit/JITOpcodes.cpp: |
| (JSC::JIT::emitSlow_op_get_argument_by_val): |
| |
| 2012-05-23 Filip Pizlo <fpizlo@apple.com> |
| |
| DFGCapabilities should not try to get an arguments register from code blocks that don't have one |
| https://bugs.webkit.org/show_bug.cgi?id=87332 |
| |
| Reviewed by Andy Estes. |
| |
| * dfg/DFGCapabilities.h: |
| (JSC::DFG::canInlineOpcode): |
| |
| 2012-05-23 Filip Pizlo <fpizlo@apple.com> |
| |
| DFG should have sparse conditional constant propagation |
| https://bugs.webkit.org/show_bug.cgi?id=86580 |
| |
| Reviewed by Oliver Hunt. |
| |
| Merged r117370 from dfgopt. |
| |
| This enhances CFA so that if it suspects at any point during the fixpoint that a |
| branch will only go one way, then it only propagates in that one way. |
| |
| This vastly increases the opportunities for CFG simplification. For example, it |
| enables us to evaporate this loop: |
| |
| for (var i = 0; i < 1; ++i) doThings(i); |
| |
| As a result, it uncovered loads of bugs in the CFG simplifier. In particular: |
| |
| - Phi fixup was assuming that all Phis worth fixing up are shouldGenerate(). |
| That's not true; we also fixup Phis that are dead. |
| |
| - GetLocal fixup was assuming that it's only necessary to rewire links to a |
| GetLocal, and that the GetLocal's own links don't need to be rewired. Untrue, |
| because the GetLocal may not be rewirable (first block has no GetLocal for r42 |
| but second block does have a GetLocal), in which case it will refer to a Phi |
| in the second block. We need it to refer to a Phi from the first block to |
| ensure that subsequent transformations work. |
| |
| - Tail operand fixup was ignoring the fact that Phis in successors may contain |
| references to the children of our tail variables. Hence, successor Phi child |
| substitution needs to use the original second block variable table as its |
| prior, rather than trying to reconstruct the prior later (since by that point |
| the children of the second block's tail variables will have been fixed up, so |
| we will not know what the prior would have been). |
| |
| * dfg/DFGAbstractState.cpp: |
| (JSC::DFG::AbstractState::beginBasicBlock): |
| (JSC::DFG::AbstractState::endBasicBlock): |
| (JSC::DFG::AbstractState::reset): |
| (JSC::DFG::AbstractState::execute): |
| (JSC::DFG::AbstractState::mergeToSuccessors): |
| * dfg/DFGAbstractState.h: |
| (JSC::DFG::AbstractState::branchDirectionToString): |
| (AbstractState): |
| * dfg/DFGCFGSimplificationPhase.cpp: |
| (JSC::DFG::CFGSimplificationPhase::run): |
| (JSC::DFG::CFGSimplificationPhase::removePotentiallyDeadPhiReference): |
| (JSC::DFG::CFGSimplificationPhase::OperandSubstitution::OperandSubstitution): |
| (OperandSubstitution): |
| (JSC::DFG::CFGSimplificationPhase::skipGetLocal): |
| (JSC::DFG::CFGSimplificationPhase::recordPossibleIncomingReference): |
| (CFGSimplificationPhase): |
| (JSC::DFG::CFGSimplificationPhase::fixTailOperand): |
| (JSC::DFG::CFGSimplificationPhase::mergeBlocks): |
| * dfg/DFGGraph.h: |
| (JSC::DFG::Graph::changeEdge): |
| |
| 2012-05-23 Ojan Vafai <ojan@chromium.org> |
| |
| add back the ability to disable flexbox |
| https://bugs.webkit.org/show_bug.cgi?id=87147 |
| |
| Reviewed by Tony Chang. |
| |
| * Configurations/FeatureDefines.xcconfig: |
| |
| 2012-05-23 Filip Pizlo <fpizlo@apple.com> |
| |
| Unreviewed, fix Windows build. |
| |
| * bytecode/CodeBlock.h: |
| * dfg/DFGCapabilities.h: |
| (JSC::DFG::canCompileOpcode): |
| (JSC::DFG::canCompileOpcodes): |
| * dfg/DFGCommon.h: |
| (DFG): |
| |
| 2012-05-23 Filip Pizlo <fpizlo@apple.com> |
| |
| DFG should optimize inlined uses of arguments.length and arguments[i] |
| https://bugs.webkit.org/show_bug.cgi?id=86327 |
| |
| Reviewed by Gavin Barraclough. |
| |
| Merged r117017 from dfgopt. |
| |
| Turns inlined uses of arguments.length into a constant. |
| |
| Turns inlined uses of arguments[constant] into a direct reference to the |
| argument. |
| |
| Big win on micro-benchmarks. Not yet a win on V8 because the hot uses of |
| arguments.length and arguments[i] are aliased. I'll leave the aliasing |
| optimizations to a later patch. |
| |
| * CMakeLists.txt: |
| * GNUmakefile.list.am: |
| * JavaScriptCore.xcodeproj/project.pbxproj: |
| * Target.pri: |
| * bytecode/DFGExitProfile.h: |
| (FrequentExitSite): |
| (JSC::DFG::FrequentExitSite::FrequentExitSite): |
| (JSC::DFG::QueryableExitProfile::hasExitSite): |
| (QueryableExitProfile): |
| * dfg/DFGAbstractState.cpp: |
| (JSC::DFG::AbstractState::execute): |
| * dfg/DFGArgumentsSimplificationPhase.cpp: Added. |
| (DFG): |
| (ArgumentsSimplificationPhase): |
| (JSC::DFG::ArgumentsSimplificationPhase::ArgumentsSimplificationPhase): |
| (JSC::DFG::ArgumentsSimplificationPhase::run): |
| (JSC::DFG::performArgumentsSimplification): |
| * dfg/DFGArgumentsSimplificationPhase.h: Added. |
| (DFG): |
| * dfg/DFGAssemblyHelpers.cpp: |
| (JSC::DFG::AssemblyHelpers::executableFor): |
| (DFG): |
| * dfg/DFGAssemblyHelpers.h: |
| (AssemblyHelpers): |
| * dfg/DFGByteCodeParser.cpp: |
| (JSC::DFG::ByteCodeParser::parseBlock): |
| (JSC::DFG::ByteCodeParser::InlineStackEntry::InlineStackEntry): |
| * dfg/DFGCSEPhase.cpp: |
| (JSC::DFG::CSEPhase::getLocalLoadElimination): |
| (JSC::DFG::CSEPhase::performNodeCSE): |
| * dfg/DFGDriver.cpp: |
| (JSC::DFG::compile): |
| * dfg/DFGGraph.h: |
| (JSC::DFG::Graph::Graph): |
| (JSC::DFG::Graph::executableFor): |
| (Graph): |
| (JSC::DFG::Graph::clobbersWorld): |
| * dfg/DFGNode.h: |
| (JSC::DFG::Node::convertToConstant): |
| (JSC::DFG::Node::convertToGetLocalUnlinked): |
| (Node): |
| (JSC::DFG::Node::unlinkedLocal): |
| * dfg/DFGNodeType.h: |
| (DFG): |
| * dfg/DFGOSRExit.cpp: |
| (JSC::DFG::OSRExit::considerAddingAsFrequentExitSiteSlow): |
| * dfg/DFGPredictionPropagationPhase.cpp: |
| (JSC::DFG::PredictionPropagationPhase::propagate): |
| * dfg/DFGSpeculativeJIT32_64.cpp: |
| (JSC::DFG::SpeculativeJIT::compile): |
| * dfg/DFGSpeculativeJIT64.cpp: |
| (JSC::DFG::SpeculativeJIT::compile): |
| |
| 2012-05-13 Filip Pizlo <fpizlo@apple.com> |
| |
| DFG should be able to optimize foo.apply(bar, arguments) |
| https://bugs.webkit.org/show_bug.cgi?id=86306 |
| |
| Reviewed by Gavin Barraclough. |
| |
| Merge r116912 from dfgopt. |
| |
| Enables compilation of op_jneq_ptr and some forms of op_call_varargs. |
| |
| Also includes a bunch of bug fixes that were made necessary by the increased |
| pressure on the CFG simplifier. |
| |
| This is a 1-2% win on V8. |
| |
| * bytecode/CodeBlock.cpp: |
| (JSC::CodeBlock::printCallOp): |
| (JSC::CodeBlock::CodeBlock): |
| (JSC::ProgramCodeBlock::canCompileWithDFGInternal): |
| (JSC::EvalCodeBlock::canCompileWithDFGInternal): |
| (JSC::FunctionCodeBlock::canCompileWithDFGInternal): |
| * bytecode/CodeBlock.h: |
| (CodeBlock): |
| (JSC::CodeBlock::canCompileWithDFG): |
| (JSC::CodeBlock::canCompileWithDFGState): |
| (ProgramCodeBlock): |
| (EvalCodeBlock): |
| (FunctionCodeBlock): |
| * dfg/DFGAbstractState.cpp: |
| (JSC::DFG::AbstractState::execute): |
| * dfg/DFGByteCodeParser.cpp: |
| (JSC::DFG::ByteCodeParser::parseBlock): |
| (JSC::DFG::ByteCodeParser::processPhiStack): |
| (JSC::DFG::ByteCodeParser::parse): |
| * dfg/DFGCFGSimplificationPhase.cpp: |
| (JSC::DFG::CFGSimplificationPhase::run): |
| (JSC::DFG::CFGSimplificationPhase::fixPossibleGetLocal): |
| (JSC::DFG::CFGSimplificationPhase::fixTailOperand): |
| (JSC::DFG::CFGSimplificationPhase::mergeBlocks): |
| * dfg/DFGCSEPhase.cpp: |
| (JSC::DFG::CSEPhase::getLocalLoadElimination): |
| (CSEPhase): |
| (JSC::DFG::CSEPhase::setReplacement): |
| (JSC::DFG::CSEPhase::performNodeCSE): |
| * dfg/DFGCapabilities.cpp: |
| (JSC::DFG::debugFail): |
| (DFG): |
| (JSC::DFG::canHandleOpcodes): |
| (JSC::DFG::canCompileOpcodes): |
| (JSC::DFG::canInlineOpcodes): |
| * dfg/DFGCapabilities.h: |
| (JSC::DFG::canCompileOpcode): |
| (JSC::DFG::canInlineOpcode): |
| (DFG): |
| (JSC::DFG::canCompileOpcodes): |
| (JSC::DFG::canCompileEval): |
| (JSC::DFG::canCompileProgram): |
| (JSC::DFG::canCompileFunctionForCall): |
| (JSC::DFG::canCompileFunctionForConstruct): |
| * dfg/DFGCommon.h: |
| * dfg/DFGGraph.cpp: |
| (JSC::DFG::Graph::dump): |
| * dfg/DFGNodeType.h: |
| (DFG): |
| * dfg/DFGPredictionPropagationPhase.cpp: |
| (JSC::DFG::PredictionPropagationPhase::propagate): |
| * dfg/DFGSpeculativeJIT32_64.cpp: |
| (JSC::DFG::SpeculativeJIT::compile): |
| * dfg/DFGSpeculativeJIT64.cpp: |
| (JSC::DFG::SpeculativeJIT::emitCall): |
| (JSC::DFG::SpeculativeJIT::compile): |
| * dfg/DFGValidate.cpp: |
| (Validate): |
| (JSC::DFG::Validate::validate): |
| (JSC::DFG::Validate::checkOperand): |
| (JSC::DFG::Validate::reportValidationContext): |
| * jit/JIT.cpp: |
| (JSC::JIT::emitOptimizationCheck): |
| (JSC::JIT::privateCompileSlowCases): |
| (JSC::JIT::privateCompile): |
| * jit/JIT.h: |
| * jit/JITArithmetic.cpp: |
| (JSC::JIT::compileBinaryArithOp): |
| * jit/JITPropertyAccess.cpp: |
| (JSC::JIT::privateCompilePutByIdTransition): |
| * jit/JITPropertyAccess32_64.cpp: |
| (JSC::JIT::privateCompilePutByIdTransition): |
| * tools/CodeProfile.cpp: |
| (JSC::CodeProfile::sample): |
| |
| 2012-05-23 Geoffrey Garen <ggaren@apple.com> |
| |
| Refactored WeakBlock to use malloc, clarify behavior |
| https://bugs.webkit.org/show_bug.cgi?id=87318 |
| |
| Reviewed by Filip Pizlo. |
| |
| We want to use malloc so we can make these smaller than 4KB, |
| since an individual MarkedBlock will usually have fewer than |
| 4KB worth of weak pointers. |
| |
| * heap/Heap.cpp: |
| (JSC::Heap::markRoots): Renamed visitLiveWeakImpls to visit, since |
| we no longer need to distinguish from "visitDeadWeakImpls". |
| |
| Renamed "visitDeadWeakImpls" to "reap" because we're not actually |
| doing any visiting -- we're just tagging things as dead. |
| |
| * heap/WeakBlock.cpp: |
| (JSC::WeakBlock::create): |
| (JSC::WeakBlock::destroy): |
| (JSC::WeakBlock::WeakBlock): Malloc! |
| |
| (JSC::WeakBlock::visit): |
| (JSC::WeakBlock::reap): Renamed as above. |
| |
| * heap/WeakBlock.h: |
| (WeakBlock): Reduced to 3KB, as explained above. |
| |
| * heap/WeakSet.cpp: |
| (JSC::WeakSet::visit): |
| (JSC::WeakSet::reap): |
| * heap/WeakSet.h: |
| (WeakSet): Updated for renames, and to match WebKit style. |
| |
| 2012-05-23 Filip Pizlo <fpizlo@apple.com> |
| |
| Use after free in JSC::DFG::ByteCodeParser::processPhiStack |
| https://bugs.webkit.org/show_bug.cgi?id=87312 |
| <rdar://problem/11518848> |
| |
| Reviewed by Oliver Hunt. |
| |
| * dfg/DFGByteCodeParser.cpp: |
| (JSC::DFG::ByteCodeParser::processPhiStack): |
| (JSC::DFG::ByteCodeParser::parse): |
| |
| 2012-05-23 Filip Pizlo <fpizlo@apple.com> |
| |
| It should be possible to make C function calls from DFG code on ARM in debug mode |
| https://bugs.webkit.org/show_bug.cgi?id=87313 |
| |
| Reviewed by Gavin Barraclough. |
| |
| * dfg/DFGSpeculativeJIT.h: |
| (SpeculativeJIT): |
| |
| 2012-05-11 Filip Pizlo <fpizlo@apple.com> |
| |
| DFG should be able to inline functions that use arguments reflectively |
| https://bugs.webkit.org/show_bug.cgi?id=86132 |
| |
| Reviewed by Oliver Hunt. |
| |
| Merged r116838 from dfgopt. |
| |
| This turns on inlining of functions that use arguments reflectively, but it |
| does not do any of the obvious optimizations that this exposes. I'll save that |
| for another patch - the important thing for now is that this contains all of |
| the plumbing necessary to make this kind of inlining sound even in bizarro |
| cases like an inline callee escaping the arguments object to parts of the |
| inline caller where the arguments are otherwise dead. Or even more fun cases |
| like where you've inlined to an inline stack that is three-deep, and the |
| function on top of the inline stack reflectively accesses the arguments of a |
| function that is in the middle of the inline stack. Any subsequent |
| optimizations that we do for the obvious cases of arguments usage in inline |
| functions will have to take care not to break the baseline functionality that |
| this patch plumbs together. |
| |
| * bytecode/CodeBlock.cpp: |
| (JSC::CodeBlock::printCallOp): |
| (JSC::CodeBlock::dump): |
| * bytecode/CodeBlock.h: |
| * dfg/DFGAssemblyHelpers.h: |
| (JSC::DFG::AssemblyHelpers::argumentsRegisterFor): |
| (AssemblyHelpers): |
| * dfg/DFGByteCodeParser.cpp: |
| (InlineStackEntry): |
| (JSC::DFG::ByteCodeParser::handleCall): |
| (JSC::DFG::ByteCodeParser::handleInlining): |
| (JSC::DFG::ByteCodeParser::InlineStackEntry::InlineStackEntry): |
| (JSC::DFG::ByteCodeParser::parse): |
| * dfg/DFGCCallHelpers.h: |
| (JSC::DFG::CCallHelpers::setupArgumentsWithExecState): |
| (CCallHelpers): |
| * dfg/DFGCapabilities.h: |
| (JSC::DFG::canInlineOpcode): |
| * dfg/DFGDriver.cpp: |
| (JSC::DFG::compile): |
| * dfg/DFGFixupPhase.cpp: |
| (JSC::DFG::FixupPhase::fixupNode): |
| * dfg/DFGOperations.cpp: |
| * dfg/DFGOperations.h: |
| * dfg/DFGSpeculativeJIT.h: |
| (JSC::DFG::SpeculativeJIT::callOperation): |
| * dfg/DFGSpeculativeJIT32_64.cpp: |
| (JSC::DFG::SpeculativeJIT::compile): |
| * dfg/DFGSpeculativeJIT64.cpp: |
| (JSC::DFG::SpeculativeJIT::compile): |
| * interpreter/CallFrame.cpp: |
| (JSC): |
| (JSC::CallFrame::someCodeBlockForPossiblyInlinedCode): |
| * interpreter/CallFrame.h: |
| (ExecState): |
| (JSC::ExecState::someCodeBlockForPossiblyInlinedCode): |
| * interpreter/Interpreter.cpp: |
| (JSC::Interpreter::retrieveArgumentsFromVMCode): |
| * runtime/Arguments.cpp: |
| (JSC::Arguments::tearOff): |
| (JSC): |
| (JSC::Arguments::tearOffForInlineCallFrame): |
| * runtime/Arguments.h: |
| (Arguments): |
| (JSC::Arguments::create): |
| (JSC::Arguments::finishCreation): |
| (JSC): |
| |
| 2012-05-23 Filip Pizlo <fpizlo@apple.com> |
| |
| Every OSR exit on ARM results in a crash |
| https://bugs.webkit.org/show_bug.cgi?id=87307 |
| |
| Reviewed by Geoffrey Garen. |
| |
| * dfg/DFGThunks.cpp: |
| (JSC::DFG::osrExitGenerationThunkGenerator): |
| |
| 2012-05-23 Geoffrey Garen <ggaren@apple.com> |
| |
| Refactored heap tear-down to use normal value semantics (i.e., destructors) |
| https://bugs.webkit.org/show_bug.cgi?id=87302 |
| |
| Reviewed by Oliver Hunt. |
| |
| This is a step toward incremental DOM finalization. |
| |
| * heap/CopiedSpace.cpp: |
| (JSC::CopiedSpace::~CopiedSpace): |
| * heap/CopiedSpace.h: |
| (CopiedSpace): Just use our destructor, instead of relying on the heap |
| to send us a special message at a special time. |
| |
| * heap/Heap.cpp: |
| (JSC::Heap::Heap): Use OwnPtr for m_markListSet because this is not Sparta. |
| |
| (JSC::Heap::~Heap): No need for delete or freeAllBlocks because normal |
| destructors do this work automatically now. |
| |
| (JSC::Heap::lastChanceToFinalize): Just call lastChanceToFinalize on our |
| sub-objects, and assume it does the right thing. This improves encapsulation, |
| so we can add items requiring finalization to our sub-objects. |
| |
| * heap/Heap.h: Moved m_blockAllocator to get the right destruction order. |
| |
| * heap/MarkedSpace.cpp: |
| (Take): |
| (JSC): |
| (JSC::Take::Take): |
| (JSC::Take::operator()): |
| (JSC::Take::returnValue): Moved to the top of the file so it can be used |
| in another function. |
| |
| (JSC::MarkedSpace::~MarkedSpace): Delete all outstanding memory, like a good |
| destructor should. |
| |
| (JSC::MarkedSpace::lastChanceToFinalize): Moved some code here from the heap, |
| since it pertains to our internal implementation details. |
| |
| * heap/MarkedSpace.h: |
| (MarkedSpace): |
| * heap/WeakBlock.cpp: |
| (JSC::WeakBlock::lastChanceToFinalize): |
| * heap/WeakBlock.h: |
| (WeakBlock): |
| * heap/WeakSet.cpp: |
| (JSC::WeakSet::lastChanceToFinalize): |
| * heap/WeakSet.h: |
| (WeakSet): Stop using a special freeAllBlocks() callback and just implement |
| lastChanceToFinalize. |
| |
| 2011-05-22 Geoffrey Garen <ggaren@apple.com> |
| |
| Encapsulated some calculations for whether portions of the heap are empty |
| https://bugs.webkit.org/show_bug.cgi?id=87210 |
| |
| Reviewed by Gavin Barraclough. |
| |
| This is a step toward incremental DOM finalization. |
| |
| * heap/Heap.cpp: |
| (JSC::Heap::~Heap): Explicitly call freeAllBlocks() instead of relying |
| implicitly on all blocks thinking they're empty. In future, we may |
| choose to tear down the heap without first setting all data structures |
| to "empty". |
| |
| * heap/MarkedBlock.h: |
| (JSC::MarkedBlock::isEmpty): |
| (JSC::MarkedBlock::gatherDirtyCells): Renamed markCountIsZero to isEmpty, |
| in preparation for making it check for outstanding finalizers in addition |
| to marked cells. |
| |
| * heap/MarkedSpace.cpp: |
| (Take): |
| (JSC::Take::Take): |
| (JSC::Take::operator()): |
| (JSC::Take::returnValue): |
| (JSC::MarkedSpace::shrink): |
| (JSC::MarkedSpace::freeAllBlocks): Refactored the "Take" functor to support |
| a conditional isEmpty check, so it dould be shared by shrink() and freeAllBlocks(). |
| |
| * heap/WeakBlock.cpp: |
| (JSC::WeakBlock::WeakBlock): |
| (JSC::WeakBlock::visitLiveWeakImpls): |
| (JSC::WeakBlock::visitDeadWeakImpls): |
| * heap/WeakBlock.h: |
| (WeakBlock): |
| (JSC::WeakBlock::isEmpty): |
| * heap/WeakSet.cpp: |
| (JSC::WeakSet::sweep): |
| (JSC::WeakSet::shrink): Use isEmpty(), in preparation for changes in |
| its implementation. |
| |
| 2012-05-23 Oswald Buddenhagen <oswald.buddenhagen@nokia.com> |
| |
| [Qt] Remove references to $$QT_SOURCE_TREE |
| |
| With a modularized Qt, it's ambigious. What we really want is qtbase, |
| which qtcore is a proxy for (we assume it will always live in qtbase). |
| |
| Reviewed by Tor Arne Vestbø. |
| |
| * JavaScriptCore.pri: |
| * Target.pri: |
| |
| 2012-05-09 Filip Pizlo <fpizlo@apple.com> |
| |
| DFG should allow inlining in case of certain arity mismatches |
| https://bugs.webkit.org/show_bug.cgi?id=86059 |
| |
| Reviewed by Geoff Garen. |
| |
| Merge r116620 from dfgopt. |
| |
| * dfg/DFGByteCodeParser.cpp: |
| (JSC::DFG::ByteCodeParser::handleInlining): |
| |
| 2012-05-08 Filip Pizlo <fpizlo@apple.com> |
| |
| DFG variable capture analysis should work even if the variables arose through inlining |
| https://bugs.webkit.org/show_bug.cgi?id=85945 |
| |
| Reviewed by Oliver Hunt. |
| |
| Merged r116555 from dfgopt. |
| |
| This just changes how the DFG queries whether a variable is captured. It does not |
| change any user-visible behavior. |
| |
| As part of this change, I further solidified the policy that the CFA behaves in an |
| undefined way for captured locals and queries about their values will not yield |
| reliable results. This will likely be changed in the future, but for now it makes |
| sense. |
| |
| One fun part about this change is that it recognizes that the same variable may |
| be both captured and not, at the same time, because their live interval spans |
| inlining boundaries. This only happens in the case of arguments to functions that |
| capture their arguments, and this change treats them with just the right touch of |
| conservatism: they will be treated as if captured by the caller as well as the |
| callee. |
| |
| Finally, this also adds captured variable reasoning to the InlineCallFrame, which |
| I thought might be useful for later tooling. |
| |
| This is perf-neutral, since it does it does not make the DFG take advantage of this |
| new functionality in any way. In particular, it is still the case that the DFG will |
| not inline functions that use arguments reflectively or that create activations. |
| |
| * bytecode/CodeBlock.h: |
| (CodeBlock): |
| (JSC::CodeBlock::needsActivation): |
| (JSC::CodeBlock::argumentIsCaptured): |
| (JSC::CodeBlock::localIsCaptured): |
| (JSC::CodeBlock::isCaptured): |
| * bytecode/CodeOrigin.h: |
| (InlineCallFrame): |
| * dfg/DFGAbstractState.cpp: |
| (JSC::DFG::AbstractState::initialize): |
| (JSC::DFG::AbstractState::endBasicBlock): |
| (JSC::DFG::AbstractState::execute): |
| (JSC::DFG::AbstractState::merge): |
| * dfg/DFGByteCodeParser.cpp: |
| (JSC::DFG::ByteCodeParser::newVariableAccessData): |
| (JSC::DFG::ByteCodeParser::getLocal): |
| (JSC::DFG::ByteCodeParser::setLocal): |
| (JSC::DFG::ByteCodeParser::getArgument): |
| (JSC::DFG::ByteCodeParser::setArgument): |
| (JSC::DFG::ByteCodeParser::flushArgument): |
| (JSC::DFG::ByteCodeParser::parseBlock): |
| (JSC::DFG::ByteCodeParser::processPhiStack): |
| (JSC::DFG::ByteCodeParser::fixVariableAccessPredictions): |
| (JSC::DFG::ByteCodeParser::InlineStackEntry::InlineStackEntry): |
| * dfg/DFGCFGSimplificationPhase.cpp: |
| (CFGSimplificationPhase): |
| (JSC::DFG::CFGSimplificationPhase::keepOperandAlive): |
| (JSC::DFG::CFGSimplificationPhase::fixPossibleGetLocal): |
| (JSC::DFG::CFGSimplificationPhase::fixTailOperand): |
| * dfg/DFGCommon.h: |
| * dfg/DFGFixupPhase.cpp: |
| (JSC::DFG::FixupPhase::fixupNode): |
| * dfg/DFGGraph.cpp: |
| (JSC::DFG::Graph::nameOfVariableAccessData): |
| * dfg/DFGGraph.h: |
| (JSC::DFG::Graph::needsActivation): |
| (JSC::DFG::Graph::usesArguments): |
| * dfg/DFGPredictionPropagationPhase.cpp: |
| (JSC::DFG::PredictionPropagationPhase::doRoundOfDoubleVoting): |
| * dfg/DFGSpeculativeJIT.cpp: |
| (JSC::DFG::SpeculativeJIT::compile): |
| * dfg/DFGSpeculativeJIT32_64.cpp: |
| (JSC::DFG::SpeculativeJIT::compile): |
| * dfg/DFGSpeculativeJIT64.cpp: |
| (JSC::DFG::SpeculativeJIT::compile): |
| * dfg/DFGVariableAccessData.h: |
| (JSC::DFG::VariableAccessData::VariableAccessData): |
| (JSC::DFG::VariableAccessData::mergeIsCaptured): |
| (VariableAccessData): |
| (JSC::DFG::VariableAccessData::isCaptured): |
| |
| 2012-05-08 Filip Pizlo <fpizlo@apple.com> |
| |
| DFG should support op_get_argument_by_val and op_get_arguments_length |
| https://bugs.webkit.org/show_bug.cgi?id=85911 |
| |
| Reviewed by Oliver Hunt. |
| |
| Merged r116467 from dfgopt. |
| |
| This adds a simple and relatively conservative implementation of op_get_argument_by_val |
| and op_get_arguments_length. We can optimize these later. For now it's great to have |
| the additional coverage. |
| |
| This patch appears to be perf-neutral. |
| |
| * dfg/DFGAbstractState.cpp: |
| (JSC::DFG::AbstractState::execute): |
| * dfg/DFGAssemblyHelpers.h: |
| (JSC::DFG::AssemblyHelpers::addressFor): |
| (JSC::DFG::AssemblyHelpers::tagFor): |
| (JSC::DFG::AssemblyHelpers::payloadFor): |
| * dfg/DFGByteCodeParser.cpp: |
| (JSC::DFG::ByteCodeParser::parseBlock): |
| * dfg/DFGCapabilities.h: |
| (JSC::DFG::canCompileOpcode): |
| (JSC::DFG::canInlineOpcode): |
| * dfg/DFGNode.h: |
| (JSC::DFG::Node::hasHeapPrediction): |
| * dfg/DFGNodeType.h: |
| (DFG): |
| * dfg/DFGOperations.cpp: |
| * dfg/DFGOperations.h: |
| * dfg/DFGPredictionPropagationPhase.cpp: |
| (JSC::DFG::PredictionPropagationPhase::propagate): |
| * dfg/DFGSpeculativeJIT.h: |
| (JSC::DFG::SpeculativeJIT::callOperation): |
| (SpeculativeJIT): |
| * dfg/DFGSpeculativeJIT32_64.cpp: |
| (JSC::DFG::SpeculativeJIT::compile): |
| * dfg/DFGSpeculativeJIT64.cpp: |
| (JSC::DFG::SpeculativeJIT::compile): |
| * jit/JITOpcodes.cpp: |
| (JSC::JIT::emit_op_get_argument_by_val): |
| * jit/JITOpcodes32_64.cpp: |
| (JSC::JIT::emit_op_get_argument_by_val): |
| * llint/LowLevelInterpreter32_64.asm: |
| * llint/LowLevelInterpreter64.asm: |
| |
| 2012-05-07 Filip Pizlo <fpizlo@apple.com> |
| |
| DFG should support op_tear_off_arguments |
| https://bugs.webkit.org/show_bug.cgi?id=85847 |
| |
| Reviewed by Michael Saboff. |
| |
| Merged r116378 from dfgopt. |
| |
| * dfg/DFGAbstractState.cpp: |
| (JSC::DFG::AbstractState::execute): |
| * dfg/DFGByteCodeParser.cpp: |
| (JSC::DFG::ByteCodeParser::parseBlock): |
| * dfg/DFGCapabilities.h: |
| (JSC::DFG::canCompileOpcode): |
| (JSC::DFG::canInlineOpcode): |
| * dfg/DFGNodeType.h: |
| (DFG): |
| * dfg/DFGOperations.cpp: |
| * dfg/DFGOperations.h: |
| * dfg/DFGPredictionPropagationPhase.cpp: |
| (JSC::DFG::PredictionPropagationPhase::propagate): |
| * dfg/DFGSpeculativeJIT.h: |
| (SpeculativeJIT): |
| (JSC::DFG::SpeculativeJIT::callOperation): |
| * dfg/DFGSpeculativeJIT32_64.cpp: |
| (JSC::DFG::SpeculativeJIT::compile): |
| * dfg/DFGSpeculativeJIT64.cpp: |
| (JSC::DFG::SpeculativeJIT::compile): |
| |
| 2012-05-22 Mark Hahnenberg <mhahnenberg@apple.com> |
| |
| CopiedSpace::contains doesn't check for oversize blocks |
| https://bugs.webkit.org/show_bug.cgi?id=87180 |
| |
| Reviewed by Geoffrey Garen. |
| |
| When doing a conservative scan we use CopiedSpace::contains to determine if a particular |
| address points into the CopiedSpace. Currently contains() only checks if the address |
| points to a block in to-space, which means that pointers to oversize blocks may not get scanned. |
| |
| * heap/CopiedSpace.cpp: |
| (JSC::CopiedSpace::tryAllocateOversize): |
| (JSC::CopiedSpace::tryReallocateOversize): |
| (JSC::CopiedSpace::doneFillingBlock): |
| (JSC::CopiedSpace::doneCopying): |
| * heap/CopiedSpace.h: Refactored CopiedSpace so that all blocks (oversize and to-space) are |
| in a single hash set and bloom filter for membership testing. |
| (CopiedSpace): |
| * heap/CopiedSpaceInlineMethods.h: |
| (JSC::CopiedSpace::contains): We check for the normal block first. Since the oversize blocks are |
| only page aligned, rather than block aligned, we have to re-mask the ptr to check if it's in |
| CopiedSpace. Also added a helper function of the same name that takes a CopiedBlock* and checks |
| if it's in CopiedSpace so that check isn't typed out twice. |
| (JSC): |
| (JSC::CopiedSpace::startedCopying): |
| (JSC::CopiedSpace::addNewBlock): |
| |
| 2012-05-22 Geoffrey Garen <ggaren@apple.com> |
| |
| CopiedBlock and MarkedBlock should have proper value semantics (i.e., destructors) |
| https://bugs.webkit.org/show_bug.cgi?id=87172 |
| |
| Reviewed by Oliver Hunt and Phil Pizlo. |
| |
| This enables MarkedBlock to own non-trivial sub-objects that require |
| destruction. It also fixes a FIXME about casting a CopiedBlock to a |
| MarkedBlock at destroy time. |
| |
| CopiedBlock and MarkedBlock now accept an allocation chunk at create |
| time and return it at destroy time. Their client is expected to |
| allocate, recycle, and destroy these chunks. |
| |
| * heap/BlockAllocator.cpp: |
| (JSC::BlockAllocator::releaseFreeBlocks): |
| (JSC::BlockAllocator::blockFreeingThreadMain): Don't call MarkedBlock::destroy |
| because we expect that to be called before a block is put on our free |
| list now. Do manually deallocate our allocation chunk because that's |
| our job now. |
| |
| * heap/BlockAllocator.h: |
| (BlockAllocator): |
| (JSC::BlockAllocator::allocate): Allocate never fails now. This is a |
| cleaner abstraction because only one object does all the VM allocation |
| and deallocation. Caching is an implementation detail. |
| |
| (JSC::BlockAllocator::deallocate): We take an allocation chunk argument |
| instead of a block because we now expect the block to have been destroyed |
| before we recycle its memory. For convenience, we still use the HeapBlock |
| class as our linked list node. This is OK because HeapBlock is a POD type. |
| |
| * heap/CopiedBlock.h: |
| (CopiedBlock): |
| (JSC::CopiedBlock::create): |
| (JSC::CopiedBlock::destroy): |
| (JSC::CopiedBlock::CopiedBlock): Added proper create and destroy functions, |
| to match MarkedBlock. |
| |
| * heap/CopiedSpace.cpp: |
| (JSC::CopiedSpace::tryAllocateOversize): |
| (JSC::CopiedSpace::tryReallocateOversize): |
| (JSC::CopiedSpace::doneCopying): |
| (JSC::CopiedSpace::getFreshBlock): |
| (JSC::CopiedSpace::freeAllBlocks): |
| * heap/CopiedSpaceInlineMethods.h: |
| (JSC::CopiedSpace::recycleBlock): Make sure to call destroy before |
| returning a block to the BlockAllocator. Otherwise, our destructors |
| won't run. (If we get this wrong now, we'll get a compile error.) |
| |
| * heap/HeapBlock.h: |
| (JSC::HeapBlock::HeapBlock): const! |
| |
| * heap/MarkedAllocator.cpp: |
| (JSC::MarkedAllocator::allocateBlock): No need to distinguish between |
| create and recycle -- MarkedBlock always accepts memory allocated by |
| its client now. |
| |
| * heap/MarkedBlock.cpp: |
| (JSC::MarkedBlock::create): Don't allocate memory -- we assume that we're |
| passed already-allocated memory, to clarify the responsibility for VM |
| recycling. |
| |
| (JSC::MarkedBlock::destroy): Do run our destructor before giving back |
| our VM -- that is the whole point of this patch. |
| |
| (JSC::MarkedBlock::MarkedBlock): |
| * heap/MarkedBlock.h: |
| (MarkedBlock): |
| * heap/MarkedSpace.cpp: const! |
| |
| (JSC::MarkedSpace::freeBlocks): Make sure to call destroy before |
| returning a block to the BlockAllocator. Otherwise, our destructors |
| won't run. (If we get this wrong now, we'll get a compile error.) |
| |
| == Rolled over to ChangeLog-2012-05-22 == |