| 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 == |