diff options
author | Allan Sandfeld Jensen <allan.jensen@digia.com> | 2013-09-13 12:51:20 +0200 |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2013-09-19 20:50:05 +0200 |
commit | d441d6f39bb846989d95bcf5caf387b42414718d (patch) | |
tree | e367e64a75991c554930278175d403c072de6bb8 /Source/JavaScriptCore/ChangeLog-2013-04-24 | |
parent | 0060b2994c07842f4c59de64b5e3e430525c4b90 (diff) | |
download | qtwebkit-d441d6f39bb846989d95bcf5caf387b42414718d.tar.gz |
Import Qt5x2 branch of QtWebkit for Qt 5.2
Importing a new snapshot of webkit.
Change-Id: I2d01ad12cdc8af8cb015387641120a9d7ea5f10c
Reviewed-by: Allan Sandfeld Jensen <allan.jensen@digia.com>
Diffstat (limited to 'Source/JavaScriptCore/ChangeLog-2013-04-24')
-rw-r--r-- | Source/JavaScriptCore/ChangeLog-2013-04-24 | 29044 |
1 files changed, 29044 insertions, 0 deletions
diff --git a/Source/JavaScriptCore/ChangeLog-2013-04-24 b/Source/JavaScriptCore/ChangeLog-2013-04-24 new file mode 100644 index 000000000..d3b5d15cd --- /dev/null +++ b/Source/JavaScriptCore/ChangeLog-2013-04-24 @@ -0,0 +1,29044 @@ +2013-04-23 Filip Pizlo <fpizlo@apple.com> + + DFG CFA filters CheckFunction in a really weird way, and assumes that the function's structure won't change + https://bugs.webkit.org/show_bug.cgi?id=115077 + + Reviewed by Oliver Hunt. + + The filtering did three things that are unusual: + + 1) AbstractValue::filterByValue() assumed that the passed value's structure wouldn't change, in + the sense that at it assumed it could use that value's *current* structure to do structure + filtering. Filtering by structure only makes sense if you can prove that the given value will + always have that structure (for example by either using a watchpoing or emitting code that + checks that structure at run-time). + + 2) AbstractValue::filterByValue() and the CheckFunction case in AbstractState::executeEffects() + tried to invalidate the CFA based on whether the filtration led to an empty value. This is + well-intentioned, but it's not how the CFA currently works. It's inconsistent with other + parts of the CFA. We shouldn't introduce this feature into just one kind of filtration and + not have it elsewhere. + + 3) The attempt to detect when the value was empty was actually implemented incorrectly. It + relied on AbstractValue::validate(). That method says that a concrete value does not belong + to the abstract value if it has a different structure. This makes sense for the other place + where AbstractValue::validate() is called: during OSR entry, where we are talking about a + JSValue that we see *right now*. It doesn't make sense in the CFA, since in the CFA any + value we observe in the code is a value whose structure may change when the code starts + running, and so we cannot use the value's current structure to infer things about the code + when it starts running. + + I fixed the above problems by (1) changing filterByValue() to not filter the structure, (2) + changing filterByValue() and the CheckFunction case to not invalidate the CFA, and (3) + making sure that nobody else was misusing AbstractValue::validate() (they weren't). + + * dfg/DFGAbstractState.cpp: + (JSC::DFG::AbstractState::executeEffects): + * dfg/DFGAbstractValue.h: + (JSC::DFG::AbstractValue::filterByValue): + +2013-04-23 Oliver Hunt <oliver@apple.com> + + Default ParserError() initialiser doesn't initialise all fields + https://bugs.webkit.org/show_bug.cgi?id=115074 + + Reviewed by Joseph Pecoraro. + + Only the jsc command prompt depended on this, but we'll fix it to + be on the safe side. + + * parser/ParserError.h: + (JSC::ParserError::ParserError): + +2013-04-23 Christophe Dumez <ch.dumez@sisa.samsung.com> + + Global constructors should be configurable and not enumerable + https://bugs.webkit.org/show_bug.cgi?id=110573 + + Reviewed by Geoffrey Garen. + + Update JSObject::deleteProperty() so that mark to set the property + value to undefined if it is in static hashtable of properties. The + previous code was not doing anything in this case and this meant + we could not remove builtin DOMWindow properties such as + "ProgressEvent" even if marked as Deletable. + + * runtime/JSObject.cpp: + (JSC::JSObject::deleteProperty): + * runtime/Lookup.h: + (JSC): + (JSC::putEntry): + (JSC::lookupPut): + +2013-04-23 Geoffrey Garen <ggaren@apple.com> + + Filled out more cases of branch folding in bytecode when emitting + expressions into a branching context + https://bugs.webkit.org/show_bug.cgi?id=115057 + + Reviewed by Filip Pizlo. + + This covers a few cases like: + + - while (true) { } + - while (1) { } + - if (x) break; + - if (x) continue; + - if (boolean_expr == boolean_const) { } + - if (boolean_expr == 1_or_0) { } + - if (bitop == 1_or_0) { } + + This also works, but will bring shame on your family: + + - while ("hello world") { } + + No change on the benchmarks we track, but a 2.5X speedup on a microbenchmark + that uses these techniques. + + * JavaScriptCore.order: Order! + + * bytecompiler/BytecodeGenerator.cpp: + (JSC::BytecodeGenerator::emitNewArray): + (JSC::BytecodeGenerator::emitThrowReferenceError): + (JSC::BytecodeGenerator::emitReadOnlyExceptionIfNeeded): + * bytecompiler/BytecodeGenerator.h: + (JSC::BytecodeGenerator::shouldEmitDebugHooks): Updated ancillary code + for interface simplifications. + + * bytecompiler/NodesCodegen.cpp: + (JSC::ConstantNode::emitBytecodeInConditionContext): Constants can + jump unconditionally when used within a condition context. + + (JSC::ConstantNode::emitBytecode): + (JSC::StringNode::jsValue): Gave constants a common base class so I + could implement their codegen just once. + + (JSC::BinaryOpNode::emitBytecodeInConditionContext): + (JSC::canFoldToBranch): + (JSC::BinaryOpNode::tryFoldToBranch): Fold (!/=)= and (!/=)== where + appropriate. A lot of cases are not appropriate because of the surprising + type conversion semantics of ==. For example, if (number == true) { } is + not the same as if (number) { } because the former will up-convert true + to number and then do numeric comparison. + + (JSC::singleStatement): + (JSC::IfElseNode::tryFoldBreakAndContinue): + (JSC::IfElseNode::emitBytecode): + (JSC::ContinueNode::trivialTarget): + (JSC::BreakNode::trivialTarget): Fold "if (expression) break" and + "if (expression) continue" into direct jumps from expression. + + * parser/ASTBuilder.h: + (ASTBuilder): + (JSC::ASTBuilder::createIfStatement): + * parser/NodeConstructors.h: + (JSC::ConstantNode::ConstantNode): + (JSC): + (JSC::NullNode::NullNode): + (JSC::BooleanNode::BooleanNode): + (JSC::NumberNode::NumberNode): + (JSC::StringNode::StringNode): + (JSC::IfElseNode::IfElseNode): + * parser/Nodes.h: + (JSC::ExpressionNode::isConstant): + (JSC::ExpressionNode::isBoolean): + (JSC::StatementNode::isBreak): + (JSC::StatementNode::isContinue): + (ConstantNode): + (JSC::ConstantNode::isPure): + (JSC::ConstantNode::isConstant): + (NullNode): + (JSC::NullNode::jsValue): + (JSC::BooleanNode::value): + (JSC::BooleanNode::isBoolean): + (JSC::BooleanNode::jsValue): + (JSC::NumberNode::value): + (NumberNode): + (JSC::NumberNode::jsValue): + (StringNode): + (BinaryOpNode): + (IfElseNode): + (ContinueNode): + (JSC::ContinueNode::isContinue): + (BreakNode): + (JSC::BreakNode::isBreak): + * parser/Parser.cpp: + (JSC::::parseIfStatement): + * parser/ResultType.h: + (JSC::ResultType::definitelyIsBoolean): + (ResultType): + * runtime/JSCJSValueInlines.h: + (JSC::JSValue::pureToBoolean): + * runtime/JSCell.h: + * runtime/JSCellInlines.h: + (JSC::JSCell::pureToBoolean): Updated for interface changes above. + +2013-04-23 Mark Lam <mark.lam@apple.com> + + Simplify the baseline JIT loop hint call site. + https://bugs.webkit.org/show_bug.cgi?id=115052. + + Reviewed by Geoffrey Garen. + + Moved the watchdog timer check after the JIT optimization check. This + ensures that the JIT opimization counter is incremented on every loop + hint even if the watchdog timer fires. + + Removed the code that allows the JIT OSR to happen if the watchdog + timer fires but does not result in a termination. It is extremely rare + that the JIT optimization counter would trigger an OSR on the same pass + as when the watchdog timer fire. If it does happen, we'll simply hold + off on servicing the watchdog timer until the next pass (because it's + not time critical). + + * jit/JITOpcodes.cpp: + (JSC::JIT::emit_op_loop_hint): + (JSC::JIT::emitSlow_op_loop_hint): + +2013-04-23 Roger Fong <roger_fong@apple.com> + + AppleWin build fix. + + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: + +2013-04-18 Mark Hahnenberg <mhahnenberg@apple.com> + + Objective-C API: Update public header documentation + https://bugs.webkit.org/show_bug.cgi?id=114841 + + Reviewed by Geoffrey Garen. + + Added documentation for the newly added object lifetime-related stuff. + + * API/JSManagedValue.h: + * API/JSVirtualMachine.h: + +2013-04-22 Mark Lam <mark.lam@apple.com> + + Fix a typo in MacroAssemblerARMv7.h. + https://bugs.webkit.org/show_bug.cgi?id=115011. + + Reviewed by Geoffrey Garen. + + * assembler/ARMAssembler.h: Fix a comment. + * assembler/ARMv7Assembler.h: Added some comments. + * assembler/MacroAssemblerARMv7.h: + - ARMAssembler::PL should be ARMv7Assembler::ConditionPL. + +2013-04-22 Julien Brianceau <jbrianceau@nds.com> + + Add branchAdd32 missing implementation in SH4 base JIT. + This should fix SH4 build, broken since r148893. + https://bugs.webkit.org/show_bug.cgi?id=114993. + + Reviewed by Oliver Hunt. + + * assembler/MacroAssemblerSH4.h: + (JSC::MacroAssemblerSH4::branchAdd32): + (MacroAssemblerSH4): + +2013-04-22 Benjamin Poulain <bpoulain@apple.com> + + Windows build fix after r148921 + + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCoreExports.def: + * JavaScriptCore.vcxproj/JavaScriptCoreExportGenerator/JavaScriptCoreExports.def.in: + +2013-04-22 Benjamin Poulain <benjamin@webkit.org> + + Remove the memory instrumentation code + https://bugs.webkit.org/show_bug.cgi?id=114931 + + Reviewed by Andreas Kling. + + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCoreExports.def: + * JavaScriptCore.vcxproj/JavaScriptCoreExportGenerator/JavaScriptCoreExports.def.in: + +2013-04-22 Mark Lam <mark.lam@apple.com> + + Fix broken 32-bit build to green the bots. + https://bugs.webkit.org/show_bug.cgi?id=114968. + + Unreviewed. + + Basically, I moved a JIT::emit_op_loop_hint() and JIT::emitSlow_op_loop_hint() + into common code where they belong, instead of the 64-bit specific section. + + Also fixed some SH4 assertions failures which were also caused by + https://bugs.webkit.org/show_bug.cgi?id=114963. Thanks to Julien Brianceau + for pointing this out. + + * assembler/MacroAssemblerSH4.h: + (JSC::MacroAssemblerSH4::branchAdd32): + * jit/JITOpcodes.cpp: + (JSC): + (JSC::JIT::emit_op_loop_hint): + (JSC::JIT::emitSlow_op_loop_hint): + +2013-04-22 Oliver Hunt <oliver@apple.com> + + Perform null check before trying to use the result of readline() + + RS=Gavin + + * jsc.cpp: + (runInteractive): + +2013-04-22 Oliver Hunt <oliver@apple.com> + + Fix assertions to account for new Vector layout + + RS=Gavin + + * llint/LLIntData.cpp: + (JSC::LLInt::Data::performAssertions): + +2013-04-22 Mark Lam <mark.lam@apple.com> + + Change baseline JIT watchdog timer check to use the proper fast slow path + infrastructure. + https://bugs.webkit.org/show_bug.cgi?id=114963. + + Reviewed by Oliver Hunt. + + Edit: The PositiveOrZero condition is added because it is needed for + the JIT optimization check. Previously, the JIT check branches around + the slow path if the test result is 'Signed' i.e. negative. Since we + now need to test for a condition that branches to the slow path (not + around it), we need the complement of 'Signed / Negative' i.e. Positive + or zero. + + SH4 parts contributed by Julien Brianceau. + + * assembler/ARMAssembler.h: + * assembler/MacroAssemblerARM.h: + * assembler/MacroAssemblerARMv7.h: + * assembler/MacroAssemblerMIPS.h: + (JSC::MacroAssemblerMIPS::branchAdd32): + * assembler/MacroAssemblerSH4.h: + (JSC::MacroAssemblerSH4::branchAdd32): + * assembler/MacroAssemblerX86Common.h: + * assembler/SH4Assembler.h: + * jit/JIT.cpp: + (JSC::JIT::emitEnterOptimizationCheck): + (JSC::JIT::privateCompileSlowCases): + * jit/JIT.h: + (JSC::JIT::emitEnterOptimizationCheck): + * jit/JITOpcodes.cpp: + (JSC::JIT::emit_op_loop_hint): + (JSC::JIT::emitSlow_op_loop_hint): + (JSC::JIT::emit_op_enter): + * jit/JITOpcodes32_64.cpp: + (JSC::JIT::emit_op_enter): + +2013-04-22 Andreas Kling <akling@apple.com> + + Shrink baseline size of WTF::Vector on 64-bit by switching to unsigned capacity and size. + <http://webkit.org/b/97268> + <rdar://problem/12376519> + + Reviewed by Sam Weinig. + + Update LLInt WTF::Vector offset constants to match the new memory layout. + + * llint/LowLevelInterpreter.asm: + +2013-04-21 Oliver Hunt <oliver@apple.com> + + JS Lexer and Parser should be more informative when they encounter errors + https://bugs.webkit.org/show_bug.cgi?id=114924 + + Reviewed by Filip Pizlo. + + Add new tokens to represent the various ways that parsing and lexing have failed. + This gives us the ability to produce better error messages in some cases, + and to indicate whether or not the failure was due to invalid source, or simply + early termination. + + The jsc prompt now makes use of this so that you can write functions that + are more than one line long. + + * bytecompiler/BytecodeGenerator.cpp: + (JSC::BytecodeGenerator::generate): + * jsc.cpp: + (stringFromUTF): + (jscSource): + (runInteractive): + * parser/Lexer.cpp: + (JSC::::parseFourDigitUnicodeHex): + (JSC::::parseIdentifierSlowCase): + (JSC::::parseString): + (JSC::::parseStringSlowCase): + (JSC::::lex): + * parser/Lexer.h: + (UnicodeHexValue): + (JSC::Lexer::UnicodeHexValue::UnicodeHexValue): + (JSC::Lexer::UnicodeHexValue::valueType): + (JSC::Lexer::UnicodeHexValue::isValid): + (JSC::Lexer::UnicodeHexValue::value): + (Lexer): + * parser/Parser.h: + (JSC::Parser::getTokenName): + (JSC::Parser::updateErrorMessageSpecialCase): + (JSC::::parse): + * parser/ParserError.h: + (ParserError): + (JSC::ParserError::ParserError): + * parser/ParserTokens.h: + * runtime/Completion.cpp: + (JSC): + (JSC::checkSyntax): + * runtime/Completion.h: + (JSC): + +2013-04-21 Mark Lam <mark.lam@apple.com> + + Refactor identical inline functions in JSVALUE64 and JSVALUE32_64 sections + out into the common section. + https://bugs.webkit.org/show_bug.cgi?id=114910. + + Reviewed by Filip Pizlo. + + * dfg/DFGSpeculativeJIT.h: + (SpeculativeJIT): + (JSC::DFG::SpeculativeJIT::callOperation): + +2013-04-20 Allan Sandfeld Jensen <allan.jensen@digia.com> + + LLint should be able to use x87 instead of SSE for floating pointer + https://bugs.webkit.org/show_bug.cgi?id=112239 + + Reviewed by Filip Pizlo. + + Implements LLInt floating point operations in x87, to ensure we support + x86 without SSE2. + + X86 (except 64bit) now defaults to using x87 instructions in order to + support all 32bit x86 back to i686. The implementation uses the fucomi + instruction from i686 which sets the new minimum. + + The FPU registers must always be empty on entering or exiting a function. + We make sure to only use two X87 registers, and they are always emptied + before calling deeper functions or returning from the LLInt. + + * jit/JITStubs.cpp: + (JSC): Empty FPU registers before exiting. + * llint/LowLevelInterpreter32_64.asm: + * llint/LowLevelInterpreter64.asm: + * offlineasm/instructions.rb: + * offlineasm/x86.rb: + +2013-04-19 Roger Fong <roger_fong@apple.com> + + Remove uses of WebKit_Source from AppleWin build in JavaScriptCore. + + * JavaScriptCore.vcxproj/JavaScriptCore.make: + * JavaScriptCore.vcxproj/build-generated-files.sh: + * JavaScriptCore.vcxproj/copy-files.cmd: + * JavaScriptCore.vcxproj/testRegExp/testRegExp.vcxproj: + +2013-04-19 Benjamin Poulain <bpoulain@apple.com> + + Rename JSStringJoiner::build() to join() + https://bugs.webkit.org/show_bug.cgi?id=114845 + + Reviewed by Geoffrey Garen. + + The method name build() came from StringBuilder history. It does not make much + sense on the StringJoiner. + + * runtime/ArrayPrototype.cpp: + (JSC::arrayProtoFuncToString): + (JSC::arrayProtoFuncToLocaleString): + (JSC::arrayProtoFuncJoin): + * runtime/JSStringJoiner.cpp: + (JSC::JSStringJoiner::join): + * runtime/JSStringJoiner.h: + (JSStringJoiner): + +2013-04-19 Roger Fong <roger_fong@apple.com> + + Unreviewed. WebKit_Source is incorrectly set. + + * JavaScriptCore.vcxproj/JavaScriptCore.make: + +2013-04-19 Martin Robinson <mrobinson@igalia.com> + + [GTK] JSCore.gir.in has a few problems + https://bugs.webkit.org/show_bug.cgi?id=114710 + + Reviewed by Philippe Normand. + + * GNUmakefile.am: Add the gobject introspection steps for JavaScriptCore here, + because they are shared between WebKit1 and WebKit2. + * JavaScriptCore.gir.in: Added. Moved from the WebKit1 directory. Now written + as foreign interfaces and referencing the javascriptcoregtk library. + +2013-04-18 Benjamin Poulain <bpoulain@apple.com> + + Use StringJoiner to create the JSString of arrayProtoFuncToString + https://bugs.webkit.org/show_bug.cgi?id=114779 + + Reviewed by Geoffrey Garen. + + The function arrayProtoFuncToString was just a glorified JSStringJoiner. + This patch replaces it by JSStringJoiner to simplify the code and enjoy any optimization + made on JSStringJoiner. + + For some reason, this makes the execution 3.4% faster, despite having almost identical code. + + * runtime/ArrayPrototype.cpp: + (JSC::arrayProtoFuncToString): + +2013-04-18 Oliver Hunt <oliver@apple.com> + + StackFrame::column() returning bogus value + https://bugs.webkit.org/show_bug.cgi?id=114840 + + Reviewed by Gavin Barraclough. + + Don't add one part of the expression offset to the other part of the expression. + Make StackFrame::toString() include the column info. + + * interpreter/Interpreter.cpp: + (JSC::StackFrame::expressionInfo): + (JSC::StackFrame::toString): + +2013-04-18 Mark Hahnenberg <mhahnenberg@apple.com> + + Crash beneath JSC::JIT::privateCompileSlowCases @ stephenrdonaldson.com + https://bugs.webkit.org/show_bug.cgi?id=114774 + + Reviewed by Geoffrey Garen. + + We're not linking up all of the slow cases in the baseline JIT when compiling put_to_base. + + * jit/JITOpcodes.cpp: + (JSC::JIT::emitSlow_op_put_to_base): + +2013-04-18 Mark Lam <mark.lam@apple.com> + + Interpreter entry points should throw the TerminatedExecutionException from the caller frame. + https://bugs.webkit.org/show_bug.cgi?id=114816. + + Reviewed by Oliver Hunt. + + * interpreter/Interpreter.cpp: + (JSC::Interpreter::execute): + (JSC::Interpreter::executeCall): + (JSC::Interpreter::executeConstruct): + +2013-04-18 Gabor Rapcsanyi <rgabor@webkit.org> + + LLInt ARM backend should not use the d8 register as scratch register + https://bugs.webkit.org/show_bug.cgi?id=114811 + + Reviewed by Filip Pizlo. + + The d8 register must preserved across function calls and should + not used as scratch register. Changing it to d6. + + * offlineasm/arm.rb: + +2013-04-18 Geoffrey Garen <ggaren@apple.com> + + Removed HeapTimer::synchronize + https://bugs.webkit.org/show_bug.cgi?id=114832 + + Reviewed by Mark Hahnenberg. + + HeapTimer::synchronize was a flawed attempt to make HeapTimer thread-safe. + Instead, we use proper locking now. + + This is a slight API change, since the GC timer will now only fire in the + run loop that created the JS VM, even if another run loop later executes + some JS. + + * API/APIShims.h: + (JSC::APIEntryShimWithoutLock::APIEntryShimWithoutLock): + * heap/HeapTimer.cpp: + (JSC): + * heap/HeapTimer.h: + (HeapTimer): + +2013-04-17 Geoffrey Garen <ggaren@apple.com> + + Renamed JSGlobalData to VM + https://bugs.webkit.org/show_bug.cgi?id=114777 + + Reviewed by Phil Pizlo. + + * API/APICast.h: + (JSC): + (toJS): + (toRef): + * API/APIShims.h: + (JSC::APIEntryShimWithoutLock::APIEntryShimWithoutLock): + (APIEntryShimWithoutLock): + (JSC::APIEntryShim::APIEntryShim): + (APIEntryShim): + (JSC::APIEntryShim::~APIEntryShim): + (JSC::APICallbackShim::APICallbackShim): + (JSC::APICallbackShim::~APICallbackShim): + (APICallbackShim): + * API/JSAPIWrapperObject.h: + (JSAPIWrapperObject): + * API/JSAPIWrapperObject.mm: + (JSC::::createStructure): + (JSC::JSAPIWrapperObject::JSAPIWrapperObject): + (JSC::JSAPIWrapperObject::finishCreation): + (JSC::JSAPIWrapperObject::visitChildren): + * API/JSBase.cpp: + (JSGarbageCollect): + (JSReportExtraMemoryCost): + (JSSynchronousGarbageCollectForDebugging): + * API/JSCallbackConstructor.cpp: + (JSC::JSCallbackConstructor::JSCallbackConstructor): + (JSC::JSCallbackConstructor::finishCreation): + * API/JSCallbackConstructor.h: + (JSC::JSCallbackConstructor::createStructure): + * API/JSCallbackFunction.cpp: + (JSC::JSCallbackFunction::finishCreation): + (JSC::JSCallbackFunction::create): + * API/JSCallbackFunction.h: + (JSCallbackFunction): + (JSC::JSCallbackFunction::createStructure): + * API/JSCallbackObject.cpp: + (JSC::::create): + (JSC::::createStructure): + * API/JSCallbackObject.h: + (JSC::JSCallbackObjectData::setPrivateProperty): + (JSC::JSCallbackObjectData::JSPrivatePropertyMap::setPrivateProperty): + (JSCallbackObject): + (JSC::JSCallbackObject::setPrivateProperty): + * API/JSCallbackObjectFunctions.h: + (JSC::::JSCallbackObject): + (JSC::::finishCreation): + (JSC::::put): + (JSC::::staticFunctionGetter): + * API/JSClassRef.cpp: + (OpaqueJSClassContextData::OpaqueJSClassContextData): + (OpaqueJSClass::contextData): + (OpaqueJSClass::prototype): + * API/JSClassRef.h: + (OpaqueJSClassContextData): + * API/JSContext.mm: + (-[JSContext setException:]): + (-[JSContext initWithGlobalContextRef:]): + (+[JSContext contextWithGlobalContextRef:]): + * API/JSContextRef.cpp: + (JSContextGroupCreate): + (JSContextGroupRelease): + (JSGlobalContextCreate): + (JSGlobalContextCreateInGroup): + (JSGlobalContextRetain): + (JSGlobalContextRelease): + (JSContextGetGroup): + (JSContextCreateBacktrace): + * API/JSObjectRef.cpp: + (JSObjectMake): + (JSObjectMakeConstructor): + (JSObjectMakeFunction): + (JSObjectSetPrototype): + (JSObjectHasProperty): + (JSObjectGetProperty): + (JSObjectSetProperty): + (JSObjectDeleteProperty): + (JSObjectGetPrivateProperty): + (JSObjectSetPrivateProperty): + (JSObjectDeletePrivateProperty): + (OpaqueJSPropertyNameArray::OpaqueJSPropertyNameArray): + (OpaqueJSPropertyNameArray): + (JSObjectCopyPropertyNames): + (JSPropertyNameArrayRelease): + (JSPropertyNameAccumulatorAddName): + * API/JSScriptRef.cpp: + (OpaqueJSScript::create): + (OpaqueJSScript::vm): + (OpaqueJSScript::OpaqueJSScript): + (OpaqueJSScript): + (parseScript): + * API/JSVirtualMachine.mm: + (scanExternalObjectGraph): + * API/JSVirtualMachineInternal.h: + (JSC): + * API/JSWrapperMap.mm: + (makeWrapper): + * API/ObjCCallbackFunction.h: + (JSC::ObjCCallbackFunction::createStructure): + * API/ObjCCallbackFunction.mm: + (JSC::ObjCCallbackFunction::create): + * API/OpaqueJSString.cpp: + (OpaqueJSString::identifier): + * API/OpaqueJSString.h: + (JSC): + (OpaqueJSString): + * GNUmakefile.list.am: + * JSCTypedArrayStubs.h: + (JSC): + * JavaScriptCore.order: + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCoreExports.def: + * JavaScriptCore.vcxproj/JavaScriptCore.vcxproj: + * JavaScriptCore.vcxproj/JavaScriptCore.vcxproj.filters: + * JavaScriptCore.vcxproj/JavaScriptCoreExportGenerator/JavaScriptCoreExports.def.in: + * JavaScriptCore.xcodeproj/project.pbxproj: + * KeywordLookupGenerator.py: + (Trie.printSubTreeAsC): + * Target.pri: + * assembler/ARMAssembler.cpp: + (JSC::ARMAssembler::executableCopy): + * assembler/ARMAssembler.h: + (ARMAssembler): + * assembler/AssemblerBuffer.h: + (JSC::AssemblerBuffer::executableCopy): + * assembler/AssemblerBufferWithConstantPool.h: + (JSC::AssemblerBufferWithConstantPool::executableCopy): + * assembler/LinkBuffer.cpp: + (JSC::LinkBuffer::linkCode): + * assembler/LinkBuffer.h: + (JSC): + (JSC::LinkBuffer::LinkBuffer): + (LinkBuffer): + * assembler/MIPSAssembler.h: + (JSC::MIPSAssembler::executableCopy): + * assembler/SH4Assembler.h: + (JSC::SH4Assembler::executableCopy): + * assembler/X86Assembler.h: + (JSC::X86Assembler::executableCopy): + (JSC::X86Assembler::X86InstructionFormatter::executableCopy): + * bytecode/CallLinkInfo.cpp: + (JSC::CallLinkInfo::unlink): + * bytecode/CallLinkInfo.h: + (CallLinkInfo): + * bytecode/CodeBlock.cpp: + (JSC::dumpStructure): + (JSC::CodeBlock::printStructures): + (JSC::CodeBlock::CodeBlock): + (JSC::CodeBlock::~CodeBlock): + (JSC::CodeBlock::visitStructures): + (JSC::CodeBlock::finalizeUnconditionally): + (JSC::CodeBlock::createActivation): + (JSC::CodeBlock::unlinkCalls): + (JSC::CodeBlock::unlinkIncomingCalls): + (JSC::CodeBlock::findClosureCallForReturnPC): + (JSC::ProgramCodeBlock::jettisonImpl): + (JSC::EvalCodeBlock::jettisonImpl): + (JSC::FunctionCodeBlock::jettisonImpl): + (JSC::CodeBlock::predictedMachineCodeSize): + (JSC::CodeBlock::usesOpcode): + * bytecode/CodeBlock.h: + (JSC::CodeBlock::appendWeakReference): + (JSC::CodeBlock::appendWeakReferenceTransition): + (JSC::CodeBlock::setJITCode): + (JSC::CodeBlock::setGlobalData): + (JSC::CodeBlock::vm): + (JSC::CodeBlock::valueProfileForBytecodeOffset): + (JSC::CodeBlock::addConstant): + (JSC::CodeBlock::setConstantRegisters): + (CodeBlock): + (JSC::CodeBlock::WeakReferenceTransition::WeakReferenceTransition): + * bytecode/EvalCodeCache.h: + (JSC::EvalCodeCache::getSlow): + * bytecode/GetByIdStatus.cpp: + (JSC::GetByIdStatus::computeFromLLInt): + (JSC::GetByIdStatus::computeForChain): + (JSC::GetByIdStatus::computeFor): + * bytecode/GetByIdStatus.h: + (GetByIdStatus): + * bytecode/Instruction.h: + (JSC::Instruction::Instruction): + * bytecode/ObjectAllocationProfile.h: + (JSC::ObjectAllocationProfile::initialize): + (JSC::ObjectAllocationProfile::possibleDefaultPropertyCount): + * bytecode/PolymorphicAccessStructureList.h: + (JSC::PolymorphicAccessStructureList::PolymorphicStubInfo::set): + (JSC::PolymorphicAccessStructureList::PolymorphicAccessStructureList): + * bytecode/PolymorphicPutByIdList.h: + (JSC::PutByIdAccess::transition): + (JSC::PutByIdAccess::replace): + * bytecode/PreciseJumpTargets.cpp: + (JSC::computePreciseJumpTargets): + * bytecode/PutByIdStatus.cpp: + (JSC::PutByIdStatus::computeFromLLInt): + (JSC::PutByIdStatus::computeFor): + * bytecode/PutByIdStatus.h: + (JSC): + (PutByIdStatus): + * bytecode/ResolveGlobalStatus.cpp: + (JSC::computeForStructure): + * bytecode/SamplingTool.cpp: + (JSC::SamplingTool::notifyOfScope): + * bytecode/SamplingTool.h: + (JSC::ScriptSampleRecord::ScriptSampleRecord): + (SamplingTool): + * bytecode/StructureStubInfo.h: + (JSC::StructureStubInfo::initGetByIdSelf): + (JSC::StructureStubInfo::initGetByIdProto): + (JSC::StructureStubInfo::initGetByIdChain): + (JSC::StructureStubInfo::initPutByIdTransition): + (JSC::StructureStubInfo::initPutByIdReplace): + * bytecode/UnlinkedCodeBlock.cpp: + (JSC::generateFunctionCodeBlock): + (JSC::UnlinkedFunctionExecutable::UnlinkedFunctionExecutable): + (JSC::UnlinkedFunctionExecutable::link): + (JSC::UnlinkedFunctionExecutable::fromGlobalCode): + (JSC::UnlinkedFunctionExecutable::codeBlockFor): + (JSC::UnlinkedCodeBlock::UnlinkedCodeBlock): + * bytecode/UnlinkedCodeBlock.h: + (JSC::UnlinkedFunctionExecutable::create): + (UnlinkedFunctionExecutable): + (JSC::UnlinkedFunctionExecutable::finishCreation): + (JSC::UnlinkedFunctionExecutable::createStructure): + (JSC::UnlinkedCodeBlock::addRegExp): + (JSC::UnlinkedCodeBlock::addConstant): + (JSC::UnlinkedCodeBlock::addFunctionDecl): + (JSC::UnlinkedCodeBlock::addFunctionExpr): + (JSC::UnlinkedCodeBlock::vm): + (UnlinkedCodeBlock): + (JSC::UnlinkedCodeBlock::finishCreation): + (JSC::UnlinkedGlobalCodeBlock::UnlinkedGlobalCodeBlock): + (JSC::UnlinkedProgramCodeBlock::create): + (JSC::UnlinkedProgramCodeBlock::addFunctionDeclaration): + (JSC::UnlinkedProgramCodeBlock::UnlinkedProgramCodeBlock): + (JSC::UnlinkedProgramCodeBlock::createStructure): + (JSC::UnlinkedEvalCodeBlock::create): + (JSC::UnlinkedEvalCodeBlock::UnlinkedEvalCodeBlock): + (JSC::UnlinkedEvalCodeBlock::createStructure): + (JSC::UnlinkedFunctionCodeBlock::create): + (JSC::UnlinkedFunctionCodeBlock::UnlinkedFunctionCodeBlock): + (JSC::UnlinkedFunctionCodeBlock::createStructure): + * bytecompiler/BytecodeGenerator.cpp: + (JSC::BytecodeGenerator::BytecodeGenerator): + (JSC::BytecodeGenerator::addConstant): + (JSC::BytecodeGenerator::emitLoad): + (JSC::BytecodeGenerator::emitDirectPutById): + (JSC::BytecodeGenerator::addStringConstant): + (JSC::BytecodeGenerator::expectedFunctionForIdentifier): + (JSC::BytecodeGenerator::emitThrowReferenceError): + (JSC::BytecodeGenerator::emitReadOnlyExceptionIfNeeded): + * bytecompiler/BytecodeGenerator.h: + (BytecodeGenerator): + (JSC::BytecodeGenerator::vm): + (JSC::BytecodeGenerator::propertyNames): + (JSC::BytecodeGenerator::makeFunction): + * bytecompiler/NodesCodegen.cpp: + (JSC::RegExpNode::emitBytecode): + (JSC::ArrayNode::toArgumentList): + (JSC::ApplyFunctionCallDotNode::emitBytecode): + (JSC::InstanceOfNode::emitBytecode): + * debugger/Debugger.cpp: + (JSC::Debugger::recompileAllJSFunctions): + (JSC::evaluateInGlobalCallFrame): + * debugger/Debugger.h: + (JSC): + * debugger/DebuggerActivation.cpp: + (JSC::DebuggerActivation::DebuggerActivation): + (JSC::DebuggerActivation::finishCreation): + * debugger/DebuggerActivation.h: + (JSC::DebuggerActivation::create): + (JSC::DebuggerActivation::createStructure): + (DebuggerActivation): + * debugger/DebuggerCallFrame.cpp: + (JSC::DebuggerCallFrame::evaluate): + * dfg/DFGAbstractState.cpp: + (JSC::DFG::AbstractState::executeEffects): + * dfg/DFGAssemblyHelpers.h: + (JSC::DFG::AssemblyHelpers::AssemblyHelpers): + (JSC::DFG::AssemblyHelpers::vm): + (JSC::DFG::AssemblyHelpers::debugCall): + (JSC::DFG::AssemblyHelpers::emitExceptionCheck): + (AssemblyHelpers): + * dfg/DFGByteCodeParser.cpp: + (JSC::DFG::ByteCodeParser::ByteCodeParser): + (ByteCodeParser): + (JSC::DFG::ByteCodeParser::handleConstantInternalFunction): + (JSC::DFG::ByteCodeParser::parseBlock): + (JSC::DFG::ByteCodeParser::InlineStackEntry::InlineStackEntry): + (JSC::DFG::ByteCodeParser::parseCodeBlock): + * dfg/DFGByteCodeParser.h: + (JSC): + * dfg/DFGCCallHelpers.h: + (JSC::DFG::CCallHelpers::CCallHelpers): + * dfg/DFGCapabilities.cpp: + (JSC::DFG::canHandleOpcodes): + * dfg/DFGConstantFoldingPhase.cpp: + (JSC::DFG::ConstantFoldingPhase::foldConstants): + * dfg/DFGDisassembler.cpp: + (JSC::DFG::Disassembler::reportToProfiler): + * dfg/DFGDriver.cpp: + (JSC::DFG::compile): + * dfg/DFGDriver.h: + (JSC): + * dfg/DFGFixupPhase.cpp: + (JSC::DFG::FixupPhase::fixupNode): + (JSC::DFG::FixupPhase::isStringPrototypeMethodSane): + (JSC::DFG::FixupPhase::canOptimizeStringObjectAccess): + * dfg/DFGGraph.cpp: + (JSC::DFG::Graph::Graph): + * dfg/DFGGraph.h: + (Graph): + * dfg/DFGJITCompiler.cpp: + (JSC::DFG::JITCompiler::JITCompiler): + (JSC::DFG::JITCompiler::linkOSRExits): + (JSC::DFG::JITCompiler::link): + (JSC::DFG::JITCompiler::compile): + (JSC::DFG::JITCompiler::compileFunction): + * dfg/DFGJITCompiler.h: + (JSC): + * dfg/DFGOSREntry.cpp: + (JSC::DFG::prepareOSREntry): + * dfg/DFGOSRExitCompiler.cpp: + * dfg/DFGOSRExitCompiler32_64.cpp: + (JSC::DFG::OSRExitCompiler::compileExit): + * dfg/DFGOSRExitCompiler64.cpp: + (JSC::DFG::OSRExitCompiler::compileExit): + * dfg/DFGOperations.cpp: + (JSC::DFG::putByVal): + (JSC::DFG::operationPutByValInternal): + (JSC::getHostCallReturnValueWithExecState): + * dfg/DFGPhase.h: + (JSC::DFG::Phase::vm): + * 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): + (JSC::DFG::linkSlowFor): + (JSC::DFG::dfgLinkFor): + (JSC::DFG::dfgLinkSlowFor): + (JSC::DFG::dfgLinkClosureCall): + * dfg/DFGSpeculativeJIT.cpp: + (JSC::DFG::SpeculativeJIT::typedArrayDescriptor): + (JSC::DFG::SpeculativeJIT::compilePeepHoleObjectEquality): + (JSC::DFG::SpeculativeJIT::compileGetByValOnString): + (JSC::DFG::SpeculativeJIT::compileFromCharCode): + (JSC::DFG::SpeculativeJIT::compileMakeRope): + (JSC::DFG::SpeculativeJIT::compileStringEquality): + (JSC::DFG::SpeculativeJIT::compileToStringOnCell): + (JSC::DFG::SpeculativeJIT::speculateObject): + (JSC::DFG::SpeculativeJIT::speculateObjectOrOther): + (JSC::DFG::SpeculativeJIT::speculateString): + (JSC::DFG::SpeculativeJIT::speculateStringOrStringObject): + * dfg/DFGSpeculativeJIT.h: + (JSC::DFG::SpeculativeJIT::prepareForExternalCall): + (JSC::DFG::SpeculativeJIT::emitAllocateBasicStorage): + (JSC::DFG::SpeculativeJIT::emitAllocateJSObject): + * dfg/DFGSpeculativeJIT32_64.cpp: + (JSC::DFG::SpeculativeJIT::compileObjectEquality): + (JSC::DFG::SpeculativeJIT::compileObjectToObjectOrOtherEquality): + (JSC::DFG::SpeculativeJIT::compilePeepHoleObjectToObjectOrOtherEquality): + (JSC::DFG::SpeculativeJIT::compileObjectOrOtherLogicalNot): + (JSC::DFG::SpeculativeJIT::emitObjectOrOtherBranch): + (JSC::DFG::SpeculativeJIT::compile): + * dfg/DFGSpeculativeJIT64.cpp: + (JSC::DFG::SpeculativeJIT::compileObjectEquality): + (JSC::DFG::SpeculativeJIT::compileObjectToObjectOrOtherEquality): + (JSC::DFG::SpeculativeJIT::compilePeepHoleObjectToObjectOrOtherEquality): + (JSC::DFG::SpeculativeJIT::compileObjectOrOtherLogicalNot): + (JSC::DFG::SpeculativeJIT::emitObjectOrOtherBranch): + (JSC::DFG::SpeculativeJIT::compile): + * dfg/DFGThunks.cpp: + (JSC::DFG::osrExitGenerationThunkGenerator): + (JSC::DFG::throwExceptionFromCallSlowPathGenerator): + (JSC::DFG::slowPathFor): + (JSC::DFG::linkForThunkGenerator): + (JSC::DFG::linkCallThunkGenerator): + (JSC::DFG::linkConstructThunkGenerator): + (JSC::DFG::linkClosureCallThunkGenerator): + (JSC::DFG::virtualForThunkGenerator): + (JSC::DFG::virtualCallThunkGenerator): + (JSC::DFG::virtualConstructThunkGenerator): + * dfg/DFGThunks.h: + (JSC): + (DFG): + * heap/BlockAllocator.h: + (JSC): + * heap/CopiedSpace.cpp: + (JSC::CopiedSpace::tryAllocateSlowCase): + (JSC::CopiedSpace::tryReallocate): + * heap/CopiedSpaceInlines.h: + (JSC::CopiedSpace::tryAllocate): + * heap/GCThreadSharedData.cpp: + (JSC::GCThreadSharedData::GCThreadSharedData): + (JSC::GCThreadSharedData::reset): + * heap/GCThreadSharedData.h: + (JSC): + (GCThreadSharedData): + * heap/HandleSet.cpp: + (JSC::HandleSet::HandleSet): + (JSC::HandleSet::~HandleSet): + (JSC::HandleSet::grow): + * heap/HandleSet.h: + (JSC): + (HandleSet): + (JSC::HandleSet::vm): + * heap/Heap.cpp: + (JSC::Heap::Heap): + (JSC): + (JSC::Heap::lastChanceToFinalize): + (JSC::Heap::protect): + (JSC::Heap::unprotect): + (JSC::Heap::stack): + (JSC::Heap::getConservativeRegisterRoots): + (JSC::Heap::markRoots): + (JSC::Heap::deleteAllCompiledCode): + (JSC::Heap::collect): + (JSC::Heap::isValidAllocation): + * heap/Heap.h: + (JSC): + (Heap): + (JSC::Heap::vm): + * heap/HeapTimer.cpp: + (JSC::HeapTimer::HeapTimer): + (JSC::HeapTimer::timerDidFire): + (JSC::HeapTimer::timerEvent): + * heap/HeapTimer.h: + (JSC): + (HeapTimer): + * heap/IncrementalSweeper.cpp: + (JSC::IncrementalSweeper::IncrementalSweeper): + (JSC::IncrementalSweeper::sweepNextBlock): + (JSC::IncrementalSweeper::willFinishSweeping): + (JSC::IncrementalSweeper::create): + * heap/IncrementalSweeper.h: + (IncrementalSweeper): + * heap/Local.h: + (Local): + (JSC::::Local): + (JSC::LocalStack::LocalStack): + (JSC::LocalStack::push): + (LocalStack): + * heap/LocalScope.h: + (JSC): + (LocalScope): + (JSC::LocalScope::LocalScope): + * heap/MachineStackMarker.cpp: + (JSC::MachineThreads::addCurrentThread): + * heap/MarkedAllocator.cpp: + (JSC::MarkedAllocator::allocateSlowCase): + * heap/MarkedBlock.cpp: + (JSC::MarkedBlock::MarkedBlock): + * heap/MarkedBlock.h: + (JSC::MarkedBlock::vm): + * heap/SlotVisitor.cpp: + (JSC::SlotVisitor::SlotVisitor): + (JSC::SlotVisitor::setup): + * heap/Strong.h: + (JSC): + (Strong): + (JSC::Strong::operator=): + * heap/StrongInlines.h: + (JSC::::Strong): + (JSC::::set): + * heap/SuperRegion.h: + (JSC): + * heap/WeakSet.cpp: + * heap/WeakSet.h: + (WeakSet): + (JSC::WeakSet::WeakSet): + (JSC::WeakSet::vm): + * interpreter/AbstractPC.cpp: + (JSC::AbstractPC::AbstractPC): + * interpreter/AbstractPC.h: + (JSC): + (AbstractPC): + * interpreter/CachedCall.h: + (JSC::CachedCall::CachedCall): + * interpreter/CallFrame.h: + (ExecState): + (JSC::ExecState::clearException): + (JSC::ExecState::clearSupplementaryExceptionInfo): + (JSC::ExecState::exception): + (JSC::ExecState::hadException): + (JSC::ExecState::propertyNames): + (JSC::ExecState::emptyList): + (JSC::ExecState::interpreter): + (JSC::ExecState::heap): + (JSC::ExecState::arrayConstructorTable): + (JSC::ExecState::arrayPrototypeTable): + (JSC::ExecState::booleanPrototypeTable): + (JSC::ExecState::dateTable): + (JSC::ExecState::dateConstructorTable): + (JSC::ExecState::errorPrototypeTable): + (JSC::ExecState::globalObjectTable): + (JSC::ExecState::jsonTable): + (JSC::ExecState::mathTable): + (JSC::ExecState::numberConstructorTable): + (JSC::ExecState::numberPrototypeTable): + (JSC::ExecState::objectConstructorTable): + (JSC::ExecState::privateNamePrototypeTable): + (JSC::ExecState::regExpTable): + (JSC::ExecState::regExpConstructorTable): + (JSC::ExecState::regExpPrototypeTable): + (JSC::ExecState::stringConstructorTable): + (JSC::ExecState::abstractReturnPC): + * interpreter/CallFrameClosure.h: + (CallFrameClosure): + * interpreter/Interpreter.cpp: + (JSC): + (JSC::eval): + (JSC::loadVarargs): + (JSC::Interpreter::Interpreter): + (JSC::Interpreter::dumpRegisters): + (JSC::Interpreter::unwindCallFrame): + (JSC::appendSourceToError): + (JSC::getCallerInfo): + (JSC::Interpreter::getStackTrace): + (JSC::Interpreter::addStackTraceIfNecessary): + (JSC::Interpreter::throwException): + (JSC::Interpreter::execute): + (JSC::Interpreter::executeCall): + (JSC::Interpreter::executeConstruct): + (JSC::Interpreter::prepareForRepeatCall): + (JSC::Interpreter::retrieveArgumentsFromVMCode): + (JSC::Interpreter::retrieveCallerFromVMCode): + * interpreter/Interpreter.h: + (JSC): + (JSC::TopCallFrameSetter::TopCallFrameSetter): + (JSC::TopCallFrameSetter::~TopCallFrameSetter): + (TopCallFrameSetter): + (JSC::NativeCallFrameTracer::NativeCallFrameTracer): + (Interpreter): + * interpreter/JSStack.cpp: + (JSC::JSStack::JSStack): + * interpreter/JSStack.h: + (JSC): + * jit/ClosureCallStubRoutine.cpp: + (JSC::ClosureCallStubRoutine::ClosureCallStubRoutine): + * jit/ClosureCallStubRoutine.h: + (ClosureCallStubRoutine): + * jit/ExecutableAllocator.cpp: + (JSC::ExecutableAllocator::ExecutableAllocator): + (JSC::ExecutableAllocator::allocate): + * jit/ExecutableAllocator.h: + (JSC): + (ExecutableAllocator): + * jit/ExecutableAllocatorFixedVMPool.cpp: + (JSC::ExecutableAllocator::ExecutableAllocator): + (JSC::ExecutableAllocator::allocate): + * jit/GCAwareJITStubRoutine.cpp: + (JSC::GCAwareJITStubRoutine::GCAwareJITStubRoutine): + (JSC::MarkingGCAwareJITStubRoutineWithOneObject::MarkingGCAwareJITStubRoutineWithOneObject): + (JSC::createJITStubRoutine): + * jit/GCAwareJITStubRoutine.h: + (GCAwareJITStubRoutine): + (MarkingGCAwareJITStubRoutineWithOneObject): + (JSC): + * jit/JIT.cpp: + (JSC::JIT::JIT): + (JSC::JIT::privateCompile): + (JSC::JIT::linkFor): + (JSC::JIT::linkSlowCall): + * jit/JIT.h: + (JSC::JIT::compile): + (JSC::JIT::compileClosureCall): + (JSC::JIT::compileGetByIdProto): + (JSC::JIT::compileGetByIdSelfList): + (JSC::JIT::compileGetByIdProtoList): + (JSC::JIT::compileGetByIdChainList): + (JSC::JIT::compileGetByIdChain): + (JSC::JIT::compilePutByIdTransition): + (JSC::JIT::compileGetByVal): + (JSC::JIT::compilePutByVal): + (JSC::JIT::compileCTINativeCall): + (JSC::JIT::compilePatchGetArrayLength): + (JIT): + * jit/JITCall.cpp: + (JSC::JIT::compileLoadVarargs): + (JSC::JIT::compileCallEvalSlowCase): + (JSC::JIT::compileOpCallSlowCase): + (JSC::JIT::privateCompileClosureCall): + * jit/JITCall32_64.cpp: + (JSC::JIT::compileLoadVarargs): + (JSC::JIT::compileCallEvalSlowCase): + (JSC::JIT::compileOpCallSlowCase): + (JSC::JIT::privateCompileClosureCall): + * jit/JITCode.h: + (JSC): + (JSC::JITCode::execute): + * jit/JITDriver.h: + (JSC::jitCompileIfAppropriate): + (JSC::jitCompileFunctionIfAppropriate): + * jit/JITExceptions.cpp: + (JSC::genericThrow): + (JSC::jitThrow): + * jit/JITExceptions.h: + (JSC): + * jit/JITInlines.h: + (JSC::JIT::emitLoadCharacterString): + (JSC::JIT::updateTopCallFrame): + * jit/JITOpcodes.cpp: + (JSC::JIT::privateCompileCTINativeCall): + (JSC::JIT::emit_op_new_object): + (JSC::JIT::emit_op_to_primitive): + (JSC::JIT::emit_op_catch): + (JSC::JIT::emit_op_convert_this): + (JSC::JIT::emitSlow_op_convert_this): + * jit/JITOpcodes32_64.cpp: + (JSC::JIT::privateCompileCTINativeCall): + (JSC::JIT::emit_op_new_object): + (JSC::JIT::emit_op_to_primitive): + (JSC::JIT::emitSlow_op_eq): + (JSC::JIT::emitSlow_op_neq): + (JSC::JIT::compileOpStrictEq): + (JSC::JIT::emit_op_catch): + (JSC::JIT::emit_op_convert_this): + (JSC::JIT::emitSlow_op_convert_this): + * jit/JITPropertyAccess.cpp: + (JSC::JIT::stringGetByValStubGenerator): + (JSC::JIT::emitSlow_op_get_by_val): + (JSC::JIT::compileGetByIdHotPath): + (JSC::JIT::privateCompilePutByIdTransition): + (JSC::JIT::privateCompilePatchGetArrayLength): + (JSC::JIT::privateCompileGetByIdProto): + (JSC::JIT::privateCompileGetByIdSelfList): + (JSC::JIT::privateCompileGetByIdProtoList): + (JSC::JIT::privateCompileGetByIdChainList): + (JSC::JIT::privateCompileGetByIdChain): + (JSC::JIT::privateCompileGetByVal): + (JSC::JIT::privateCompilePutByVal): + * jit/JITPropertyAccess32_64.cpp: + (JSC::JIT::stringGetByValStubGenerator): + (JSC::JIT::emitSlow_op_get_by_val): + (JSC::JIT::compileGetByIdHotPath): + (JSC::JIT::privateCompilePutByIdTransition): + (JSC::JIT::privateCompilePatchGetArrayLength): + (JSC::JIT::privateCompileGetByIdProto): + (JSC::JIT::privateCompileGetByIdSelfList): + (JSC::JIT::privateCompileGetByIdProtoList): + (JSC::JIT::privateCompileGetByIdChainList): + (JSC::JIT::privateCompileGetByIdChain): + * jit/JITStubs.cpp: + (JSC::ctiTrampoline): + (JSC): + (JSC::performPlatformSpecificJITAssertions): + (JSC::tryCachePutByID): + (JSC::tryCacheGetByID): + (JSC::returnToThrowTrampoline): + (JSC::throwExceptionFromOpCall): + (JSC::DEFINE_STUB_FUNCTION): + (JSC::getPolymorphicAccessStructureListSlot): + (JSC::jitCompileFor): + (JSC::lazyLinkFor): + (JSC::putByVal): + * jit/JITStubs.h: + (JSC): + (JITStackFrame): + * jit/JITThunks.cpp: + (JSC::JITThunks::ctiNativeCall): + (JSC::JITThunks::ctiNativeConstruct): + (JSC::JITThunks::ctiStub): + (JSC::JITThunks::hostFunctionStub): + * jit/JITThunks.h: + (JSC): + (JITThunks): + * jit/JITWriteBarrier.h: + (JSC): + (JSC::JITWriteBarrierBase::set): + (JSC::JITWriteBarrier::set): + * jit/SpecializedThunkJIT.h: + (JSC::SpecializedThunkJIT::loadJSStringArgument): + (JSC::SpecializedThunkJIT::finalize): + * jit/ThunkGenerator.h: + (JSC): + * jit/ThunkGenerators.cpp: + (JSC::generateSlowCaseFor): + (JSC::linkForGenerator): + (JSC::linkCallGenerator): + (JSC::linkConstructGenerator): + (JSC::linkClosureCallGenerator): + (JSC::virtualForGenerator): + (JSC::virtualCallGenerator): + (JSC::virtualConstructGenerator): + (JSC::stringLengthTrampolineGenerator): + (JSC::nativeForGenerator): + (JSC::nativeCallGenerator): + (JSC::nativeConstructGenerator): + (JSC::stringCharLoad): + (JSC::charToString): + (JSC::charCodeAtThunkGenerator): + (JSC::charAtThunkGenerator): + (JSC::fromCharCodeThunkGenerator): + (JSC::sqrtThunkGenerator): + (JSC::floorThunkGenerator): + (JSC::ceilThunkGenerator): + (JSC::roundThunkGenerator): + (JSC::expThunkGenerator): + (JSC::logThunkGenerator): + (JSC::absThunkGenerator): + (JSC::powThunkGenerator): + * jit/ThunkGenerators.h: + (JSC): + * jsc.cpp: + (GlobalObject): + (GlobalObject::create): + (GlobalObject::createStructure): + (GlobalObject::finishCreation): + (GlobalObject::addFunction): + (GlobalObject::addConstructableFunction): + (functionDumpCallFrame): + (functionJSCStack): + (functionReleaseExecutableMemory): + (functionRun): + (main): + (runWithScripts): + (jscmain): + * llint/LLIntData.cpp: + (JSC::LLInt::Data::performAssertions): + * llint/LLIntData.h: + (JSC): + (Data): + (JSC::LLInt::Data::performAssertions): + * llint/LLIntEntrypoints.cpp: + (JSC::LLInt::getFunctionEntrypoint): + (JSC::LLInt::getEvalEntrypoint): + (JSC::LLInt::getProgramEntrypoint): + * llint/LLIntEntrypoints.h: + (JSC): + (LLInt): + (JSC::LLInt::getEntrypoint): + * llint/LLIntExceptions.cpp: + (JSC::LLInt::interpreterThrowInCaller): + (JSC::LLInt::returnToThrow): + (JSC::LLInt::callToThrow): + * llint/LLIntOffsetsExtractor.cpp: + * llint/LLIntSlowPaths.cpp: + (LLInt): + (JSC::LLInt::llint_trace_operand): + (JSC::LLInt::llint_trace_value): + (JSC::LLInt::LLINT_SLOW_PATH_DECL): + (JSC::LLInt::shouldJIT): + (JSC::LLInt::handleHostCall): + (JSC::LLInt::setUpCall): + * llint/LLIntThunks.cpp: + (JSC::LLInt::generateThunkWithJumpTo): + (JSC::LLInt::functionForCallEntryThunkGenerator): + (JSC::LLInt::functionForConstructEntryThunkGenerator): + (JSC::LLInt::functionForCallArityCheckThunkGenerator): + (JSC::LLInt::functionForConstructArityCheckThunkGenerator): + (JSC::LLInt::evalEntryThunkGenerator): + (JSC::LLInt::programEntryThunkGenerator): + * llint/LLIntThunks.h: + (JSC): + (LLInt): + * llint/LowLevelInterpreter.asm: + * llint/LowLevelInterpreter.cpp: + (JSC::CLoop::execute): + * llint/LowLevelInterpreter32_64.asm: + * llint/LowLevelInterpreter64.asm: + * offlineasm/cloop.rb: + * parser/ASTBuilder.h: + (JSC::ASTBuilder::ASTBuilder): + (JSC::ASTBuilder::createSourceElements): + (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::createArguments): + (JSC::ASTBuilder::createArgumentsList): + (JSC::ASTBuilder::createProperty): + (JSC::ASTBuilder::createPropertyList): + (JSC::ASTBuilder::createElementList): + (JSC::ASTBuilder::createFormalParameterList): + (JSC::ASTBuilder::createClause): + (JSC::ASTBuilder::createClauseList): + (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::addVar): + (JSC::ASTBuilder::combineCommaNodes): + (JSC::ASTBuilder::Scope::Scope): + (JSC::ASTBuilder::createNumber): + (ASTBuilder): + (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::Keywords::Keywords): + (JSC::::Lexer): + (JSC::::parseIdentifier): + (JSC::::parseIdentifierSlowCase): + * parser/Lexer.h: + (JSC::Keywords::isKeyword): + (JSC::Keywords::getKeyword): + (Keywords): + (Lexer): + (JSC::::makeIdentifier): + (JSC::::makeRightSizedIdentifier): + (JSC::::makeIdentifierLCharFromUChar): + (JSC::::makeLCharIdentifier): + * parser/NodeConstructors.h: + (JSC::ParserArenaFreeable::operator new): + (JSC::ParserArenaDeletable::operator new): + (JSC::ParserArenaRefCounted::ParserArenaRefCounted): + (JSC::PropertyNode::PropertyNode): + (JSC::ContinueNode::ContinueNode): + (JSC::BreakNode::BreakNode): + (JSC::ForInNode::ForInNode): + * parser/Nodes.cpp: + (JSC::ScopeNode::ScopeNode): + (JSC::ProgramNode::ProgramNode): + (JSC::ProgramNode::create): + (JSC::EvalNode::EvalNode): + (JSC::EvalNode::create): + (JSC::FunctionBodyNode::FunctionBodyNode): + (JSC::FunctionBodyNode::create): + * parser/Nodes.h: + (ParserArenaFreeable): + (ParserArenaDeletable): + (ParserArenaRefCounted): + (ArrayNode): + (ForInNode): + (ContinueNode): + (BreakNode): + (ScopeNode): + (ProgramNode): + (EvalNode): + (FunctionBodyNode): + * parser/Parser.cpp: + (JSC::::Parser): + (JSC::::parseInner): + (JSC::::parseSourceElements): + (JSC::::parseTryStatement): + (JSC::::parseFunctionBody): + (JSC::::parseFunctionInfo): + (JSC::::parseAssignmentExpression): + (JSC::::parseProperty): + (JSC::::parsePrimaryExpression): + (JSC::::parseMemberExpression): + (JSC::::parseUnaryExpression): + * parser/Parser.h: + (JSC): + (JSC::Scope::Scope): + (JSC::Scope::declareVariable): + (JSC::Scope::declareParameter): + (Scope): + (Parser): + (JSC::Parser::pushScope): + (JSC::::parse): + (JSC::parse): + * parser/ParserArena.h: + (IdentifierArena): + (JSC::IdentifierArena::makeIdentifier): + (JSC::IdentifierArena::makeIdentifierLCharFromUChar): + (JSC::IdentifierArena::makeNumericIdentifier): + * parser/SyntaxChecker.h: + (JSC::SyntaxChecker::SyntaxChecker): + (JSC::SyntaxChecker::createProperty): + (JSC::SyntaxChecker::createGetterOrSetterProperty): + * profiler/LegacyProfiler.cpp: + (JSC::LegacyProfiler::startProfiling): + (JSC::LegacyProfiler::stopProfiling): + * profiler/LegacyProfiler.h: + (JSC): + * profiler/ProfilerBytecode.cpp: + (JSC::Profiler::Bytecode::toJS): + * profiler/ProfilerBytecodeSequence.cpp: + (JSC::Profiler::BytecodeSequence::BytecodeSequence): + (JSC::Profiler::BytecodeSequence::addSequenceProperties): + * profiler/ProfilerBytecodes.cpp: + (JSC::Profiler::Bytecodes::toJS): + * profiler/ProfilerCompilation.cpp: + (JSC::Profiler::Compilation::toJS): + * profiler/ProfilerCompiledBytecode.cpp: + (JSC::Profiler::CompiledBytecode::toJS): + * profiler/ProfilerDatabase.cpp: + (JSC::Profiler::Database::Database): + (JSC::Profiler::Database::toJS): + (JSC::Profiler::Database::toJSON): + * profiler/ProfilerDatabase.h: + (Database): + * profiler/ProfilerOSRExit.cpp: + (JSC::Profiler::OSRExit::toJS): + * profiler/ProfilerOrigin.cpp: + (JSC::Profiler::Origin::toJS): + * profiler/ProfilerProfiledBytecodes.cpp: + (JSC::Profiler::ProfiledBytecodes::toJS): + * runtime/ArgList.h: + (MarkedArgumentBuffer): + * runtime/Arguments.cpp: + (JSC::Arguments::putByIndex): + (JSC::Arguments::put): + (JSC::Arguments::deleteProperty): + (JSC::Arguments::defineOwnProperty): + (JSC::Arguments::tearOff): + (JSC::Arguments::didTearOffActivation): + (JSC::Arguments::tearOffForInlineCallFrame): + * runtime/Arguments.h: + (JSC::Arguments::create): + (JSC::Arguments::createStructure): + (Arguments): + (JSC::Arguments::Arguments): + (JSC::Arguments::trySetArgument): + (JSC::Arguments::finishCreation): + * runtime/ArrayConstructor.cpp: + (JSC::ArrayConstructor::finishCreation): + * runtime/ArrayConstructor.h: + (JSC::ArrayConstructor::createStructure): + * runtime/ArrayPrototype.cpp: + (JSC::ArrayPrototype::ArrayPrototype): + (JSC::ArrayPrototype::finishCreation): + (JSC::arrayProtoFuncSort): + (JSC::arrayProtoFuncSplice): + * runtime/ArrayPrototype.h: + (JSC::ArrayPrototype::createStructure): + * runtime/BatchedTransitionOptimizer.h: + (JSC::BatchedTransitionOptimizer::BatchedTransitionOptimizer): + (JSC::BatchedTransitionOptimizer::~BatchedTransitionOptimizer): + (BatchedTransitionOptimizer): + * runtime/BooleanConstructor.cpp: + (JSC::BooleanConstructor::finishCreation): + (JSC::constructBoolean): + (JSC::constructBooleanFromImmediateBoolean): + * runtime/BooleanConstructor.h: + (JSC::BooleanConstructor::createStructure): + * runtime/BooleanObject.cpp: + (JSC::BooleanObject::BooleanObject): + (JSC::BooleanObject::finishCreation): + * runtime/BooleanObject.h: + (BooleanObject): + (JSC::BooleanObject::create): + (JSC::BooleanObject::createStructure): + * runtime/BooleanPrototype.cpp: + (JSC::BooleanPrototype::BooleanPrototype): + (JSC::BooleanPrototype::finishCreation): + (JSC::booleanProtoFuncToString): + * runtime/BooleanPrototype.h: + (JSC::BooleanPrototype::createStructure): + * runtime/Butterfly.h: + (JSC): + (Butterfly): + * runtime/ButterflyInlines.h: + (JSC::Butterfly::createUninitialized): + (JSC::Butterfly::create): + (JSC::Butterfly::growPropertyStorage): + (JSC::Butterfly::createOrGrowArrayRight): + (JSC::Butterfly::growArrayRight): + (JSC::Butterfly::resizeArray): + * runtime/CodeCache.cpp: + (JSC::CodeCache::getCodeBlock): + (JSC::CodeCache::getProgramCodeBlock): + (JSC::CodeCache::getEvalCodeBlock): + (JSC::CodeCache::getFunctionExecutableFromGlobalCode): + * runtime/CodeCache.h: + (JSC): + (JSC::SourceCodeValue::SourceCodeValue): + (CodeCache): + * runtime/CommonIdentifiers.cpp: + (JSC): + (JSC::CommonIdentifiers::CommonIdentifiers): + * runtime/CommonIdentifiers.h: + (CommonIdentifiers): + * runtime/CommonSlowPaths.h: + (JSC::CommonSlowPaths::opIn): + * runtime/Completion.cpp: + (JSC::checkSyntax): + (JSC::evaluate): + * runtime/DateConstructor.cpp: + (JSC::DateConstructor::finishCreation): + * runtime/DateConstructor.h: + (JSC::DateConstructor::createStructure): + * runtime/DateInstance.cpp: + (JSC::DateInstance::DateInstance): + (JSC::DateInstance::finishCreation): + (JSC::DateInstance::calculateGregorianDateTime): + (JSC::DateInstance::calculateGregorianDateTimeUTC): + * runtime/DateInstance.h: + (DateInstance): + (JSC::DateInstance::create): + (JSC::DateInstance::createStructure): + * runtime/DatePrototype.cpp: + (JSC::DatePrototype::finishCreation): + (JSC::dateProtoFuncSetTime): + (JSC::setNewValueFromTimeArgs): + (JSC::setNewValueFromDateArgs): + (JSC::dateProtoFuncSetYear): + (JSC::dateProtoFuncToJSON): + * runtime/DatePrototype.h: + (JSC::DatePrototype::createStructure): + * runtime/Error.cpp: + (JSC::createError): + (JSC::createEvalError): + (JSC::createRangeError): + (JSC::createReferenceError): + (JSC::createSyntaxError): + (JSC::createTypeError): + (JSC::createURIError): + (JSC::addErrorInfo): + (JSC::throwError): + * runtime/Error.h: + (JSC): + (JSC::StrictModeTypeErrorFunction::create): + (JSC::StrictModeTypeErrorFunction::createStructure): + * runtime/ErrorConstructor.cpp: + (JSC::ErrorConstructor::finishCreation): + * runtime/ErrorConstructor.h: + (JSC::ErrorConstructor::createStructure): + * runtime/ErrorInstance.cpp: + (JSC::ErrorInstance::ErrorInstance): + * runtime/ErrorInstance.h: + (JSC::ErrorInstance::createStructure): + (JSC::ErrorInstance::create): + (ErrorInstance): + (JSC::ErrorInstance::finishCreation): + * runtime/ErrorPrototype.cpp: + (JSC::ErrorPrototype::ErrorPrototype): + (JSC::ErrorPrototype::finishCreation): + * runtime/ErrorPrototype.h: + (JSC::ErrorPrototype::createStructure): + * runtime/ExceptionHelpers.cpp: + (JSC::createInterruptedExecutionException): + (JSC::createTerminatedExecutionException): + * runtime/ExceptionHelpers.h: + (JSC): + (JSC::InterruptedExecutionError::InterruptedExecutionError): + (JSC::InterruptedExecutionError::create): + (JSC::InterruptedExecutionError::createStructure): + (JSC::TerminatedExecutionError::TerminatedExecutionError): + (JSC::TerminatedExecutionError::create): + (JSC::TerminatedExecutionError::createStructure): + * runtime/Executable.cpp: + (JSC::jettisonCodeBlock): + (JSC::EvalExecutable::EvalExecutable): + (JSC::ProgramExecutable::ProgramExecutable): + (JSC::FunctionExecutable::FunctionExecutable): + (JSC::EvalExecutable::compileOptimized): + (JSC::EvalExecutable::compileInternal): + (JSC::EvalExecutable::jettisonOptimizedCode): + (JSC::ProgramExecutable::checkSyntax): + (JSC::ProgramExecutable::compileOptimized): + (JSC::ProgramExecutable::jettisonOptimizedCode): + (JSC::ProgramExecutable::initializeGlobalProperties): + (JSC::FunctionExecutable::compileOptimizedForCall): + (JSC::FunctionExecutable::compileOptimizedForConstruct): + (JSC::FunctionExecutable::produceCodeBlockFor): + (JSC::FunctionExecutable::jettisonOptimizedCodeForCall): + (JSC::FunctionExecutable::jettisonOptimizedCodeForConstruct): + (JSC::FunctionExecutable::fromGlobalCode): + * runtime/Executable.h: + (JSC::ExecutableBase::ExecutableBase): + (JSC::ExecutableBase::finishCreation): + (JSC::ExecutableBase::createStructure): + (JSC::NativeExecutable::create): + (JSC::NativeExecutable::createStructure): + (JSC::NativeExecutable::finishCreation): + (JSC::NativeExecutable::NativeExecutable): + (JSC::ScriptExecutable::ScriptExecutable): + (JSC::ScriptExecutable::finishCreation): + (JSC::EvalExecutable::compile): + (EvalExecutable): + (JSC::EvalExecutable::create): + (JSC::EvalExecutable::createStructure): + (JSC::ProgramExecutable::create): + (ProgramExecutable): + (JSC::ProgramExecutable::compile): + (JSC::ProgramExecutable::createStructure): + (JSC::FunctionExecutable::create): + (JSC::FunctionExecutable::compileForCall): + (FunctionExecutable): + (JSC::FunctionExecutable::compileForConstruct): + (JSC::FunctionExecutable::jettisonOptimizedCodeFor): + (JSC::FunctionExecutable::createStructure): + (JSC::JSFunction::JSFunction): + * runtime/ExecutionHarness.h: + (JSC::prepareForExecution): + (JSC::prepareFunctionForExecution): + * runtime/FunctionConstructor.cpp: + (JSC::FunctionConstructor::finishCreation): + * runtime/FunctionConstructor.h: + (JSC::FunctionConstructor::createStructure): + * runtime/FunctionPrototype.cpp: + (JSC::FunctionPrototype::finishCreation): + (JSC::FunctionPrototype::addFunctionProperties): + (JSC::functionProtoFuncBind): + * runtime/FunctionPrototype.h: + (JSC::FunctionPrototype::createStructure): + * runtime/GCActivityCallback.cpp: + (JSC::DefaultGCActivityCallback::DefaultGCActivityCallback): + (JSC::DefaultGCActivityCallback::doWork): + (JSC::DefaultGCActivityCallback::didAllocate): + * runtime/GCActivityCallback.h: + (JSC::GCActivityCallback::GCActivityCallback): + * runtime/GCActivityCallbackBlackBerry.cpp: + (JSC::DefaultGCActivityCallback::DefaultGCActivityCallback): + (JSC::DefaultGCActivityCallback::doWork): + (JSC::DefaultGCActivityCallback::didAllocate): + * runtime/GetterSetter.h: + (JSC::GetterSetter::GetterSetter): + (JSC::GetterSetter::create): + (JSC::GetterSetter::setGetter): + (JSC::GetterSetter::setSetter): + (JSC::GetterSetter::createStructure): + * runtime/Identifier.cpp: + (JSC::Identifier::add): + (JSC::Identifier::add8): + (JSC::Identifier::addSlowCase): + (JSC::Identifier::from): + (JSC::Identifier::checkCurrentIdentifierTable): + * runtime/Identifier.h: + (JSC::Identifier::Identifier): + (JSC::Identifier::createLCharFromUChar): + (Identifier): + (JSC::Identifier::add): + * runtime/InternalFunction.cpp: + (JSC::InternalFunction::InternalFunction): + (JSC::InternalFunction::finishCreation): + (JSC::InternalFunction::name): + (JSC::InternalFunction::displayName): + * runtime/InternalFunction.h: + (JSC::InternalFunction::createStructure): + (InternalFunction): + * runtime/JSAPIValueWrapper.h: + (JSC::JSAPIValueWrapper::createStructure): + (JSC::JSAPIValueWrapper::finishCreation): + (JSC::JSAPIValueWrapper::JSAPIValueWrapper): + * runtime/JSActivation.cpp: + (JSC::JSActivation::symbolTablePut): + (JSC::JSActivation::symbolTablePutWithAttributes): + (JSC::JSActivation::getOwnPropertySlot): + (JSC::JSActivation::put): + (JSC::JSActivation::putDirectVirtual): + (JSC::JSActivation::argumentsGetter): + * runtime/JSActivation.h: + (JSActivation): + (JSC::JSActivation::create): + (JSC::JSActivation::createStructure): + (JSC::JSActivation::JSActivation): + (JSC::JSActivation::tearOff): + * runtime/JSArray.cpp: + (JSC::createArrayButterflyInDictionaryIndexingMode): + (JSC::JSArray::setLengthWritable): + (JSC::JSArray::unshiftCountSlowCase): + (JSC::JSArray::setLength): + (JSC::JSArray::push): + (JSC::JSArray::shiftCountWithAnyIndexingType): + (JSC::JSArray::unshiftCountWithArrayStorage): + (JSC::JSArray::unshiftCountWithAnyIndexingType): + (JSC::ContiguousTypeAccessor::setWithValue): + (JSC::JSArray::sortCompactedVector): + (JSC::JSArray::sortVector): + * runtime/JSArray.h: + (JSC::JSArray::JSArray): + (JSArray): + (JSC::JSArray::shiftCountForShift): + (JSC::JSArray::unshiftCountForShift): + (JSC::JSArray::createStructure): + (JSC::createContiguousArrayButterfly): + (JSC::createArrayButterfly): + (JSC): + (JSC::JSArray::create): + (JSC::JSArray::tryCreateUninitialized): + (JSC::constructArray): + * runtime/JSBoundFunction.cpp: + (JSC::JSBoundFunction::create): + (JSC::JSBoundFunction::JSBoundFunction): + * runtime/JSBoundFunction.h: + (JSC::JSBoundFunction::createStructure): + * runtime/JSCJSValue.cpp: + (JSC::JSValue::putToPrimitive): + (JSC::JSValue::toStringSlowCase): + * runtime/JSCJSValue.h: + (JSC): + * runtime/JSCell.h: + (JSCell): + * runtime/JSCellInlines.h: + (JSC::JSCell::JSCell): + (JSC::JSCell::finishCreation): + (JSC::allocateCell): + (JSC::JSCell::setStructure): + (JSC::JSCell::fastGetOwnProperty): + * runtime/JSDateMath.cpp: + (JSC::getDSTOffset): + (JSC::getUTCOffset): + (JSC::parseDate): + * runtime/JSDestructibleObject.h: + (JSC::JSDestructibleObject::JSDestructibleObject): + * runtime/JSFunction.cpp: + (JSC::JSFunction::create): + (JSC::JSFunction::JSFunction): + (JSC::JSFunction::finishCreation): + (JSC::JSFunction::createAllocationProfile): + (JSC::JSFunction::name): + (JSC::JSFunction::displayName): + (JSC::JSFunction::getOwnPropertySlot): + (JSC::JSFunction::deleteProperty): + * runtime/JSFunction.h: + (JSFunction): + (JSC::JSFunction::create): + (JSC::JSFunction::setScope): + (JSC::JSFunction::createStructure): + * runtime/JSGlobalData.cpp: Removed. + * runtime/JSGlobalData.h: Removed. + * runtime/JSGlobalObject.cpp: + (JSC::JSGlobalObject::JSGlobalObject): + (JSC::JSGlobalObject::~JSGlobalObject): + (JSC::JSGlobalObject::setGlobalThis): + (JSC::JSGlobalObject::init): + (JSC::JSGlobalObject::putDirectVirtual): + (JSC::JSGlobalObject::reset): + (JSC): + (JSC::JSGlobalObject::haveABadTime): + (JSC::JSGlobalObject::createThrowTypeError): + (JSC::JSGlobalObject::resetPrototype): + (JSC::JSGlobalObject::addStaticGlobals): + (JSC::DynamicGlobalObjectScope::DynamicGlobalObjectScope): + (JSC::JSGlobalObject::createProgramCodeBlock): + (JSC::JSGlobalObject::createEvalCodeBlock): + * runtime/JSGlobalObject.h: + (JSC::JSGlobalObject::create): + (JSGlobalObject): + (JSC::JSGlobalObject::finishCreation): + (JSC::JSGlobalObject::vm): + (JSC::JSGlobalObject::createStructure): + (JSC::ExecState::dynamicGlobalObject): + (JSC::constructEmptyArray): + (DynamicGlobalObjectScope): + * runtime/JSGlobalObjectFunctions.cpp: + (JSC::globalFuncProtoSetter): + * runtime/JSLock.cpp: + (JSC::JSLockHolder::JSLockHolder): + (JSC::JSLockHolder::init): + (JSC::JSLockHolder::~JSLockHolder): + (JSC::JSLock::JSLock): + (JSC::JSLock::willDestroyGlobalData): + (JSC::JSLock::lock): + (JSC::JSLock::unlock): + (JSC::JSLock::DropAllLocks::DropAllLocks): + (JSC::JSLock::DropAllLocks::~DropAllLocks): + * runtime/JSLock.h: + (JSC): + (JSLockHolder): + (JSLock): + (JSC::JSLock::vm): + (DropAllLocks): + * runtime/JSNameScope.h: + (JSC::JSNameScope::createStructure): + (JSC::JSNameScope::finishCreation): + (JSC::JSNameScope::JSNameScope): + * runtime/JSNotAnObject.h: + (JSC::JSNotAnObject::JSNotAnObject): + (JSC::JSNotAnObject::create): + (JSC::JSNotAnObject::createStructure): + * runtime/JSONObject.cpp: + (JSC::JSONObject::JSONObject): + (JSC::JSONObject::finishCreation): + (Holder): + (JSC::Stringifier::Stringifier): + (JSC::Stringifier::stringify): + (JSC::Stringifier::toJSON): + (JSC::Stringifier::appendStringifiedValue): + (JSC::Stringifier::Holder::Holder): + (JSC::Stringifier::Holder::appendNextProperty): + (JSC::Walker::Walker): + (JSC::Walker::walk): + (JSC::JSONProtoFuncParse): + (JSC::JSONProtoFuncStringify): + (JSC::JSONStringify): + * runtime/JSONObject.h: + (JSC::JSONObject::createStructure): + * runtime/JSObject.cpp: + (JSC::JSObject::put): + (JSC::JSObject::putByIndex): + (JSC::JSObject::enterDictionaryIndexingModeWhenArrayStorageAlreadyExists): + (JSC::JSObject::enterDictionaryIndexingMode): + (JSC::JSObject::notifyPresenceOfIndexedAccessors): + (JSC::JSObject::createInitialIndexedStorage): + (JSC::JSObject::createInitialUndecided): + (JSC::JSObject::createInitialInt32): + (JSC::JSObject::createInitialDouble): + (JSC::JSObject::createInitialContiguous): + (JSC::JSObject::createArrayStorage): + (JSC::JSObject::createInitialArrayStorage): + (JSC::JSObject::convertUndecidedToInt32): + (JSC::JSObject::convertUndecidedToDouble): + (JSC::JSObject::convertUndecidedToContiguous): + (JSC::JSObject::constructConvertedArrayStorageWithoutCopyingElements): + (JSC::JSObject::convertUndecidedToArrayStorage): + (JSC::JSObject::convertInt32ToDouble): + (JSC::JSObject::convertInt32ToContiguous): + (JSC::JSObject::convertInt32ToArrayStorage): + (JSC::JSObject::genericConvertDoubleToContiguous): + (JSC::JSObject::convertDoubleToContiguous): + (JSC::JSObject::rageConvertDoubleToContiguous): + (JSC::JSObject::convertDoubleToArrayStorage): + (JSC::JSObject::convertContiguousToArrayStorage): + (JSC::JSObject::convertUndecidedForValue): + (JSC::JSObject::convertInt32ForValue): + (JSC::JSObject::setIndexQuicklyToUndecided): + (JSC::JSObject::convertInt32ToDoubleOrContiguousWhilePerformingSetIndex): + (JSC::JSObject::convertDoubleToContiguousWhilePerformingSetIndex): + (JSC::JSObject::ensureInt32Slow): + (JSC::JSObject::ensureDoubleSlow): + (JSC::JSObject::ensureContiguousSlow): + (JSC::JSObject::rageEnsureContiguousSlow): + (JSC::JSObject::ensureArrayStorageSlow): + (JSC::JSObject::ensureArrayStorageExistsAndEnterDictionaryIndexingMode): + (JSC::JSObject::switchToSlowPutArrayStorage): + (JSC::JSObject::putDirectVirtual): + (JSC::JSObject::setPrototype): + (JSC::JSObject::setPrototypeWithCycleCheck): + (JSC::JSObject::putDirectAccessor): + (JSC::JSObject::deleteProperty): + (JSC::JSObject::getPropertySpecificValue): + (JSC::JSObject::getOwnNonIndexPropertyNames): + (JSC::JSObject::seal): + (JSC::JSObject::freeze): + (JSC::JSObject::preventExtensions): + (JSC::JSObject::reifyStaticFunctionsForDelete): + (JSC::JSObject::removeDirect): + (JSC::JSObject::putIndexedDescriptor): + (JSC::JSObject::defineOwnIndexedProperty): + (JSC::JSObject::allocateSparseIndexMap): + (JSC::JSObject::putByIndexBeyondVectorLengthWithoutAttributes): + (JSC::JSObject::putByIndexBeyondVectorLengthWithArrayStorage): + (JSC::JSObject::putByIndexBeyondVectorLength): + (JSC::JSObject::putDirectIndexBeyondVectorLengthWithArrayStorage): + (JSC::JSObject::putDirectIndexBeyondVectorLength): + (JSC::JSObject::putDirectNativeFunction): + (JSC::JSObject::increaseVectorLength): + (JSC::JSObject::ensureLengthSlow): + (JSC::JSObject::growOutOfLineStorage): + (JSC::JSObject::getOwnPropertyDescriptor): + (JSC::putDescriptor): + (JSC::JSObject::putDirectMayBeIndex): + (JSC::DefineOwnPropertyScope::DefineOwnPropertyScope): + (JSC::DefineOwnPropertyScope::~DefineOwnPropertyScope): + (DefineOwnPropertyScope): + (JSC::JSObject::defineOwnNonIndexProperty): + * runtime/JSObject.h: + (JSObject): + (JSC::JSObject::putByIndexInline): + (JSC::JSObject::putDirectIndex): + (JSC::JSObject::setIndexQuickly): + (JSC::JSObject::initializeIndex): + (JSC::JSObject::getDirect): + (JSC::JSObject::getDirectOffset): + (JSC::JSObject::putDirect): + (JSC::JSObject::isSealed): + (JSC::JSObject::isFrozen): + (JSC::JSObject::flattenDictionaryObject): + (JSC::JSObject::ensureInt32): + (JSC::JSObject::ensureDouble): + (JSC::JSObject::ensureContiguous): + (JSC::JSObject::rageEnsureContiguous): + (JSC::JSObject::ensureArrayStorage): + (JSC::JSObject::finishCreation): + (JSC::JSObject::createStructure): + (JSC::JSObject::ensureLength): + (JSC::JSNonFinalObject::createStructure): + (JSC::JSNonFinalObject::JSNonFinalObject): + (JSC::JSNonFinalObject::finishCreation): + (JSC::JSFinalObject::createStructure): + (JSC::JSFinalObject::finishCreation): + (JSC::JSFinalObject::JSFinalObject): + (JSC::JSFinalObject::create): + (JSC::JSObject::setButterfly): + (JSC::JSObject::JSObject): + (JSC::JSObject::inlineGetOwnPropertySlot): + (JSC::JSObject::putDirectInternal): + (JSC::JSObject::setStructureAndReallocateStorageIfNecessary): + (JSC::JSObject::putOwnDataProperty): + (JSC::JSObject::putDirectWithoutTransition): + (JSC): + * runtime/JSPropertyNameIterator.cpp: + (JSC::JSPropertyNameIterator::JSPropertyNameIterator): + (JSC::JSPropertyNameIterator::create): + * runtime/JSPropertyNameIterator.h: + (JSC::JSPropertyNameIterator::createStructure): + (JSC::JSPropertyNameIterator::setCachedStructure): + (JSC::JSPropertyNameIterator::setCachedPrototypeChain): + (JSC::JSPropertyNameIterator::finishCreation): + (JSC::StructureRareData::setEnumerationCache): + * runtime/JSProxy.cpp: + (JSC::JSProxy::setTarget): + * runtime/JSProxy.h: + (JSC::JSProxy::create): + (JSC::JSProxy::createStructure): + (JSC::JSProxy::JSProxy): + (JSC::JSProxy::finishCreation): + (JSProxy): + * runtime/JSScope.cpp: + (JSC::executeResolveOperations): + (JSC::JSScope::resolveContainingScopeInternal): + (JSC::JSScope::resolveWithBase): + (JSC::JSScope::resolveWithThis): + (JSC::JSScope::resolvePut): + * runtime/JSScope.h: + (JSScope): + (JSC::JSScope::JSScope): + (JSC::JSScope::vm): + (JSC::ExecState::vm): + * runtime/JSSegmentedVariableObject.h: + (JSC::JSSegmentedVariableObject::JSSegmentedVariableObject): + (JSC::JSSegmentedVariableObject::finishCreation): + * runtime/JSString.cpp: + (JSC::JSRopeString::RopeBuilder::expand): + (JSC::StringObject::create): + * runtime/JSString.h: + (JSC): + (JSString): + (JSC::JSString::JSString): + (JSC::JSString::finishCreation): + (JSC::JSString::create): + (JSC::JSString::createHasOtherOwner): + (JSC::JSString::createStructure): + (JSRopeString): + (JSC::JSRopeString::RopeBuilder::RopeBuilder): + (JSC::JSRopeString::RopeBuilder::append): + (RopeBuilder): + (JSC::JSRopeString::JSRopeString): + (JSC::JSRopeString::finishCreation): + (JSC::JSRopeString::append): + (JSC::JSRopeString::createNull): + (JSC::JSRopeString::create): + (JSC::jsEmptyString): + (JSC::jsSingleCharacterString): + (JSC::jsSingleCharacterSubstring): + (JSC::jsNontrivialString): + (JSC::jsString): + (JSC::jsSubstring): + (JSC::jsSubstring8): + (JSC::jsOwnedString): + (JSC::jsStringBuilder): + (JSC::inlineJSValueNotStringtoString): + * runtime/JSStringJoiner.cpp: + (JSC::JSStringJoiner::build): + * runtime/JSSymbolTableObject.h: + (JSC::JSSymbolTableObject::JSSymbolTableObject): + (JSC::JSSymbolTableObject::finishCreation): + (JSC::symbolTablePut): + (JSC::symbolTablePutWithAttributes): + * runtime/JSVariableObject.h: + (JSC::JSVariableObject::JSVariableObject): + * runtime/JSWithScope.h: + (JSC::JSWithScope::create): + (JSC::JSWithScope::createStructure): + (JSC::JSWithScope::JSWithScope): + * runtime/JSWrapperObject.h: + (JSWrapperObject): + (JSC::JSWrapperObject::createStructure): + (JSC::JSWrapperObject::JSWrapperObject): + (JSC::JSWrapperObject::setInternalValue): + * runtime/LiteralParser.cpp: + (JSC::::tryJSONPParse): + (JSC::::makeIdentifier): + (JSC::::parse): + * runtime/Lookup.cpp: + (JSC::HashTable::createTable): + (JSC::setUpStaticFunctionSlot): + * runtime/Lookup.h: + (JSC::HashTable::initializeIfNeeded): + (JSC::HashTable::entry): + (JSC::HashTable::begin): + (JSC::HashTable::end): + (HashTable): + (JSC::lookupPut): + * runtime/MathObject.cpp: + (JSC::MathObject::MathObject): + (JSC::MathObject::finishCreation): + (JSC::mathProtoFuncSin): + * runtime/MathObject.h: + (JSC::MathObject::createStructure): + * runtime/MemoryStatistics.cpp: + * runtime/MemoryStatistics.h: + * runtime/NameConstructor.cpp: + (JSC::NameConstructor::finishCreation): + (JSC::constructPrivateName): + * runtime/NameConstructor.h: + (JSC::NameConstructor::createStructure): + * runtime/NameInstance.cpp: + (JSC::NameInstance::NameInstance): + * runtime/NameInstance.h: + (JSC::NameInstance::createStructure): + (JSC::NameInstance::create): + (NameInstance): + (JSC::NameInstance::finishCreation): + * runtime/NamePrototype.cpp: + (JSC::NamePrototype::NamePrototype): + (JSC::NamePrototype::finishCreation): + * runtime/NamePrototype.h: + (JSC::NamePrototype::createStructure): + * runtime/NativeErrorConstructor.h: + (JSC::NativeErrorConstructor::createStructure): + (JSC::NativeErrorConstructor::finishCreation): + * runtime/NativeErrorPrototype.cpp: + (JSC::NativeErrorPrototype::finishCreation): + * runtime/NumberConstructor.cpp: + (JSC::NumberConstructor::finishCreation): + (JSC::constructWithNumberConstructor): + * runtime/NumberConstructor.h: + (JSC::NumberConstructor::createStructure): + * runtime/NumberObject.cpp: + (JSC::NumberObject::NumberObject): + (JSC::NumberObject::finishCreation): + (JSC::constructNumber): + * runtime/NumberObject.h: + (NumberObject): + (JSC::NumberObject::create): + (JSC::NumberObject::createStructure): + * runtime/NumberPrototype.cpp: + (JSC::NumberPrototype::NumberPrototype): + (JSC::NumberPrototype::finishCreation): + (JSC::integerValueToString): + (JSC::numberProtoFuncToString): + * runtime/NumberPrototype.h: + (JSC::NumberPrototype::createStructure): + * runtime/ObjectConstructor.cpp: + (JSC::ObjectConstructor::finishCreation): + (JSC::objectConstructorGetOwnPropertyDescriptor): + (JSC::objectConstructorSeal): + (JSC::objectConstructorFreeze): + (JSC::objectConstructorPreventExtensions): + (JSC::objectConstructorIsSealed): + (JSC::objectConstructorIsFrozen): + * runtime/ObjectConstructor.h: + (JSC::ObjectConstructor::createStructure): + (JSC::constructEmptyObject): + * runtime/ObjectPrototype.cpp: + (JSC::ObjectPrototype::ObjectPrototype): + (JSC::ObjectPrototype::finishCreation): + (JSC::objectProtoFuncToString): + * runtime/ObjectPrototype.h: + (JSC::ObjectPrototype::createStructure): + * runtime/Operations.cpp: + (JSC::jsTypeStringForValue): + * runtime/Operations.h: + (JSC): + (JSC::jsString): + (JSC::jsStringFromArguments): + (JSC::normalizePrototypeChainForChainAccess): + (JSC::normalizePrototypeChain): + * runtime/PropertyMapHashTable.h: + (JSC::PropertyMapEntry::PropertyMapEntry): + (JSC::PropertyTable::createStructure): + (PropertyTable): + (JSC::PropertyTable::copy): + * runtime/PropertyNameArray.h: + (JSC::PropertyNameArray::PropertyNameArray): + (JSC::PropertyNameArray::vm): + (JSC::PropertyNameArray::addKnownUnique): + (PropertyNameArray): + * runtime/PropertyTable.cpp: + (JSC::PropertyTable::create): + (JSC::PropertyTable::clone): + (JSC::PropertyTable::PropertyTable): + * runtime/PrototypeMap.cpp: + (JSC::PrototypeMap::emptyObjectStructureForPrototype): + * runtime/RegExp.cpp: + (JSC::RegExp::RegExp): + (JSC::RegExp::finishCreation): + (JSC::RegExp::createWithoutCaching): + (JSC::RegExp::create): + (JSC::RegExp::compile): + (JSC::RegExp::compileIfNecessary): + (JSC::RegExp::match): + (JSC::RegExp::compileMatchOnly): + (JSC::RegExp::compileIfNecessaryMatchOnly): + * runtime/RegExp.h: + (JSC): + (RegExp): + (JSC::RegExp::createStructure): + * runtime/RegExpCache.cpp: + (JSC::RegExpCache::lookupOrCreate): + (JSC::RegExpCache::RegExpCache): + (JSC::RegExpCache::addToStrongCache): + * runtime/RegExpCache.h: + (RegExpCache): + * runtime/RegExpCachedResult.cpp: + (JSC::RegExpCachedResult::lastResult): + (JSC::RegExpCachedResult::setInput): + * runtime/RegExpCachedResult.h: + (JSC::RegExpCachedResult::RegExpCachedResult): + (JSC::RegExpCachedResult::record): + * runtime/RegExpConstructor.cpp: + (JSC::RegExpConstructor::RegExpConstructor): + (JSC::RegExpConstructor::finishCreation): + (JSC::constructRegExp): + * runtime/RegExpConstructor.h: + (JSC::RegExpConstructor::createStructure): + (RegExpConstructor): + (JSC::RegExpConstructor::performMatch): + * runtime/RegExpMatchesArray.cpp: + (JSC::RegExpMatchesArray::RegExpMatchesArray): + (JSC::RegExpMatchesArray::create): + (JSC::RegExpMatchesArray::finishCreation): + (JSC::RegExpMatchesArray::reifyAllProperties): + * runtime/RegExpMatchesArray.h: + (RegExpMatchesArray): + (JSC::RegExpMatchesArray::createStructure): + * runtime/RegExpObject.cpp: + (JSC::RegExpObject::RegExpObject): + (JSC::RegExpObject::finishCreation): + (JSC::RegExpObject::match): + * runtime/RegExpObject.h: + (JSC::RegExpObject::create): + (JSC::RegExpObject::setRegExp): + (JSC::RegExpObject::setLastIndex): + (JSC::RegExpObject::createStructure): + * runtime/RegExpPrototype.cpp: + (JSC::regExpProtoFuncCompile): + * runtime/RegExpPrototype.h: + (JSC::RegExpPrototype::createStructure): + * runtime/SmallStrings.cpp: + (JSC::SmallStrings::initializeCommonStrings): + (JSC::SmallStrings::createEmptyString): + (JSC::SmallStrings::createSingleCharacterString): + (JSC::SmallStrings::initialize): + * runtime/SmallStrings.h: + (JSC): + (JSC::SmallStrings::singleCharacterString): + (SmallStrings): + * runtime/SparseArrayValueMap.cpp: + (JSC::SparseArrayValueMap::SparseArrayValueMap): + (JSC::SparseArrayValueMap::finishCreation): + (JSC::SparseArrayValueMap::create): + (JSC::SparseArrayValueMap::createStructure): + (JSC::SparseArrayValueMap::putDirect): + (JSC::SparseArrayEntry::put): + * runtime/SparseArrayValueMap.h: + * runtime/StrictEvalActivation.cpp: + (JSC::StrictEvalActivation::StrictEvalActivation): + * runtime/StrictEvalActivation.h: + (JSC::StrictEvalActivation::create): + (JSC::StrictEvalActivation::createStructure): + * runtime/StringConstructor.cpp: + (JSC::StringConstructor::finishCreation): + * runtime/StringConstructor.h: + (JSC::StringConstructor::createStructure): + * runtime/StringObject.cpp: + (JSC::StringObject::StringObject): + (JSC::StringObject::finishCreation): + (JSC::constructString): + * runtime/StringObject.h: + (JSC::StringObject::create): + (JSC::StringObject::createStructure): + (StringObject): + * runtime/StringPrototype.cpp: + (JSC::StringPrototype::StringPrototype): + (JSC::StringPrototype::finishCreation): + (JSC::removeUsingRegExpSearch): + (JSC::replaceUsingRegExpSearch): + (JSC::stringProtoFuncMatch): + (JSC::stringProtoFuncSearch): + (JSC::stringProtoFuncSplit): + * runtime/StringPrototype.h: + (JSC::StringPrototype::createStructure): + * runtime/StringRecursionChecker.h: + (JSC::StringRecursionChecker::performCheck): + (JSC::StringRecursionChecker::~StringRecursionChecker): + * runtime/Structure.cpp: + (JSC::StructureTransitionTable::add): + (JSC::Structure::Structure): + (JSC::Structure::materializePropertyMap): + (JSC::Structure::despecifyDictionaryFunction): + (JSC::Structure::addPropertyTransition): + (JSC::Structure::removePropertyTransition): + (JSC::Structure::changePrototypeTransition): + (JSC::Structure::despecifyFunctionTransition): + (JSC::Structure::attributeChangeTransition): + (JSC::Structure::toDictionaryTransition): + (JSC::Structure::toCacheableDictionaryTransition): + (JSC::Structure::toUncacheableDictionaryTransition): + (JSC::Structure::sealTransition): + (JSC::Structure::freezeTransition): + (JSC::Structure::preventExtensionsTransition): + (JSC::Structure::takePropertyTableOrCloneIfPinned): + (JSC::Structure::nonPropertyTransition): + (JSC::Structure::isSealed): + (JSC::Structure::isFrozen): + (JSC::Structure::flattenDictionaryStructure): + (JSC::Structure::addPropertyWithoutTransition): + (JSC::Structure::removePropertyWithoutTransition): + (JSC::Structure::allocateRareData): + (JSC::Structure::cloneRareDataFrom): + (JSC::Structure::copyPropertyTable): + (JSC::Structure::copyPropertyTableForPinning): + (JSC::Structure::get): + (JSC::Structure::despecifyFunction): + (JSC::Structure::despecifyAllFunctions): + (JSC::Structure::putSpecificValue): + (JSC::Structure::createPropertyMap): + (JSC::Structure::getPropertyNamesFromStructure): + (JSC::Structure::prototypeChainMayInterceptStoreTo): + * runtime/Structure.h: + (Structure): + (JSC::Structure::finishCreation): + (JSC::Structure::setPrototypeWithoutTransition): + (JSC::Structure::setGlobalObject): + (JSC::Structure::setObjectToStringValue): + (JSC::Structure::materializePropertyMapIfNecessary): + (JSC::Structure::materializePropertyMapIfNecessaryForPinning): + (JSC::Structure::setPreviousID): + * runtime/StructureChain.cpp: + (JSC::StructureChain::StructureChain): + * runtime/StructureChain.h: + (JSC::StructureChain::create): + (JSC::StructureChain::createStructure): + (JSC::StructureChain::finishCreation): + (StructureChain): + * runtime/StructureInlines.h: + (JSC::Structure::create): + (JSC::Structure::createStructure): + (JSC::Structure::get): + (JSC::Structure::setEnumerationCache): + (JSC::Structure::prototypeChain): + (JSC::Structure::propertyTable): + * runtime/StructureRareData.cpp: + (JSC::StructureRareData::createStructure): + (JSC::StructureRareData::create): + (JSC::StructureRareData::clone): + (JSC::StructureRareData::StructureRareData): + * runtime/StructureRareData.h: + (StructureRareData): + * runtime/StructureRareDataInlines.h: + (JSC::StructureRareData::setPreviousID): + (JSC::StructureRareData::setObjectToStringValue): + * runtime/StructureTransitionTable.h: + (StructureTransitionTable): + (JSC::StructureTransitionTable::setSingleTransition): + * runtime/SymbolTable.h: + (JSC::SharedSymbolTable::create): + (JSC::SharedSymbolTable::createStructure): + (JSC::SharedSymbolTable::SharedSymbolTable): + * runtime/VM.cpp: Copied from Source/JavaScriptCore/runtime/JSGlobalData.cpp. + (JSC::VM::VM): + (JSC::VM::~VM): + (JSC::VM::createContextGroup): + (JSC::VM::create): + (JSC::VM::createLeaked): + (JSC::VM::sharedInstanceExists): + (JSC::VM::sharedInstance): + (JSC::VM::sharedInstanceInternal): + (JSC::VM::getHostFunction): + (JSC::VM::ClientData::~ClientData): + (JSC::VM::resetDateCache): + (JSC::VM::startSampling): + (JSC::VM::stopSampling): + (JSC::VM::discardAllCode): + (JSC::VM::dumpSampleData): + (JSC::VM::addSourceProviderCache): + (JSC::VM::clearSourceProviderCaches): + (JSC::VM::releaseExecutableMemory): + (JSC::releaseExecutableMemory): + (JSC::VM::gatherConservativeRoots): + (JSC::VM::addRegExpToTrace): + (JSC::VM::dumpRegExpTrace): + * runtime/VM.h: Copied from Source/JavaScriptCore/runtime/JSGlobalData.h. + (VM): + (JSC::VM::isSharedInstance): + (JSC::VM::usingAPI): + (JSC::VM::isInitializingObject): + (JSC::VM::setInitializingObjectClass): + (JSC::WeakSet::heap): + * runtime/WriteBarrier.h: + (JSC): + (JSC::WriteBarrierBase::set): + (JSC::WriteBarrierBase::setMayBeNull): + (JSC::WriteBarrierBase::setEarlyValue): + (JSC::WriteBarrier::WriteBarrier): + * testRegExp.cpp: + (GlobalObject): + (GlobalObject::create): + (GlobalObject::createStructure): + (GlobalObject::finishCreation): + (main): + (testOneRegExp): + (parseRegExpLine): + (runFromFiles): + (realMain): + * yarr/YarrInterpreter.h: + (BytecodePattern): + * yarr/YarrJIT.cpp: + (YarrGenerator): + (JSC::Yarr::YarrGenerator::compile): + (JSC::Yarr::jitCompile): + * yarr/YarrJIT.h: + (JSC): + +2013-04-18 Xuefei Ren <xren@blackberry.com> + + remove build warning(unused parameter) + https://bugs.webkit.org/show_bug.cgi?id=114670 + + Reviewed by Rob Buis. + + remove warning in Source/JavaScriptCore/runtime/GCActivityCallbackBlackBerry.cpp + + * runtime/GCActivityCallbackBlackBerry.cpp: + (JSC::DefaultGCActivityCallback::didAllocate): + +2013-04-18 Jonathan Liu <net147@gmail.com> + + Implement JIT for MinGW-w64 64-bit + https://bugs.webkit.org/show_bug.cgi?id=114580 + + Reviewed by Jocelyn Turcotte. + + * jit/JITStubs.cpp: + (JSC): + +2013-04-17 Mark Lam <mark.lam@apple.com> + + Avoid using a branch range that is too far for some CPU architectures. + https://bugs.webkit.org/show_bug.cgi?id=114782. + + Reviewed by David Kilzer. + + * llint/LowLevelInterpreter.asm: + * llint/LowLevelInterpreter32_64.asm: + * llint/LowLevelInterpreter64.asm: + +2013-04-17 Julien Brianceau <jbrianceau@nds.com> + + Fix SH4 build (broken since r148639). + https://bugs.webkit.org/show_bug.cgi?id=114773. + + Allow longer displacements for specific branches in SH4 LLINT. + + Reviewed by Oliver Hunt. + + * offlineasm/sh4.rb: + +2013-04-14 Roger Fong <roger_fong@apple.com> + + Unreviewed. More Windows build fix. + + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCoreExports.def: + * JavaScriptCore.vcxproj/JavaScriptCoreExportGenerator/JavaScriptCoreExports.def.in: + +2013-04-14 Roger Fong <roger_fong@apple.com> + + Unreviewed. Windows build fix. + + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCoreExports.def: + * JavaScriptCore.vcxproj/JavaScriptCoreExportGenerator/JavaScriptCoreExports.def.in: + +2013-04-17 Mark Lam <mark.lam@apple.com> + + Fix broken build. Replaced a static const with a #define. + https://bugs.webkit.org/show_bug.cgi?id=114577. + + Unreviewed. + + * runtime/Watchdog.cpp: + (JSC::Watchdog::Watchdog): + (JSC::Watchdog::isEnabled): + +2013-04-17 Mark Lam <mark.lam@apple.com> + + Add LLINT and baseline JIT support for timing out scripts. + https://bugs.webkit.org/show_bug.cgi?id=114577. + + Reviewed by Geoffrey Garen. + + Introduces the new Watchdog class which is used to track script + execution time, and initiate script termination if needed. + + * API/JSContextRef.cpp: + (internalScriptTimeoutCallback): + (JSContextGroupSetExecutionTimeLimit): + (JSContextGroupClearExecutionTimeLimit): + * API/JSContextRefPrivate.h: + - Added new script execution time limit APIs. + * API/tests/testapi.c: + (currentCPUTime): + (shouldTerminateCallback): + (cancelTerminateCallback): + (extendTerminateCallback): + (main): + - Added new API tests for script execution time limit. + * CMakeLists.txt: + * GNUmakefile.list.am: + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: + * JavaScriptCore.vcxproj/JavaScriptCore.vcxproj: + * JavaScriptCore.vcxproj/JavaScriptCore.vcxproj.filters: + * JavaScriptCore.xcodeproj/project.pbxproj: + * Target.pri: + * bytecompiler/BytecodeGenerator.cpp: + (JSC::BytecodeGenerator::emitLoopHint): + - loop hints are needed for the llint as well. Hence, it will be + emitted unconditionally. + * interpreter/Interpreter.cpp: + (JSC::Interpreter::addStackTraceIfNecessary): + (JSC::Interpreter::throwException): + (JSC::Interpreter::execute): + (JSC::Interpreter::executeCall): + (JSC::Interpreter::executeConstruct): + - Added checks for script termination before entering script code. + * jit/JIT.cpp: + (JSC::JIT::emitWatchdogTimerCheck): + * jit/JIT.h: + (JSC::JIT::emit_op_loop_hint): + * jit/JITStubs.cpp: + (JSC::DEFINE_STUB_FUNCTION(void, handle_watchdog_timer)): + * jit/JITStubs.h: + * llint/LLIntExceptions.cpp: + (JSC::LLInt::doThrow): + - Factored out some common code from returnToThrow() and callToThrow(). + (JSC::LLInt::returnToThrow): + (JSC::LLInt::callToThrow): + * llint/LLIntSlowPaths.cpp: + (JSC::LLInt::LLINT_SLOW_PATH_DECL(slow_path_handle_watchdog_timer)): + * llint/LLIntSlowPaths.h: + * llint/LowLevelInterpreter.asm: + * llint/LowLevelInterpreter32_64.asm: + * llint/LowLevelInterpreter64.asm: + * runtime/ExceptionHelpers.cpp: + (JSC::throwTerminatedExecutionException): + - Also removed the now unused InterruptedExecutionException. + * runtime/ExceptionHelpers.h: + * runtime/JSGlobalData.cpp: + (JSC::JSGlobalData::JSGlobalData): + * runtime/JSGlobalData.h: + - Added watchdog, and removed the now obsolete Terminator. + * runtime/Terminator.h: Removed. + * runtime/Watchdog.cpp: Added. + (JSC::Watchdog::Watchdog): + (JSC::Watchdog::~Watchdog): + (JSC::Watchdog::setTimeLimit): + (JSC::Watchdog::didFire): + (JSC::Watchdog::isEnabled): + (JSC::Watchdog::fire): + (JSC::Watchdog::arm): + (JSC::Watchdog::disarm): + (JSC::Watchdog::startCountdownIfNeeded): + (JSC::Watchdog::startCountdown): + (JSC::Watchdog::stopCountdown): + (JSC::Watchdog::Scope::Scope): + (JSC::Watchdog::Scope::~Scope): + * runtime/Watchdog.h: Added. + (Watchdog): + (JSC::Watchdog::didFire): + (JSC::Watchdog::timerDidFireAddress): + (JSC::Watchdog::isArmed): + (Watchdog::Scope): + * runtime/WatchdogMac.cpp: Added. + (JSC::Watchdog::initTimer): + (JSC::Watchdog::destroyTimer): + (JSC::Watchdog::startTimer): + (JSC::Watchdog::stopTimer): + * runtime/WatchdogNone.cpp: Added. + (JSC::Watchdog::initTimer): + (JSC::Watchdog::destroyTimer): + (JSC::Watchdog::startTimer): + (JSC::Watchdog::stopTimer): + +2013-04-14 Roger Fong <roger_fong@apple.com> + + Unreviewed. VS2010 Windows build fix. + + * JavaScriptCore.vcxproj/JavaScriptCoreExportGenerator/JavaScriptCoreExportGeneratorPostBuild.cmd: + +2013-04-14 Roger Fong <roger_fong@apple.com> + + Copy make-file-export-generator script to the the Source folders of the projects that use it. + <rdar://problem/13675604> + + * JavaScriptCore.vcxproj/JavaScriptCoreExportGenerator/JavaScriptCoreExportGenerator.vcxproj: + * JavaScriptCore.vcxproj/JavaScriptCoreExportGenerator/JavaScriptCoreExportGenerator.vcxproj.filters: + * JavaScriptCore.vcxproj/JavaScriptCoreExportGenerator/JavaScriptCoreExportGeneratorBuildCmd.cmd: + * JavaScriptCore.vcxproj/JavaScriptCoreExportGenerator/make-export-file-generator: Copied from Source/WebCore/make-export-file-generator. + +2013-04-17 Brent Fulgham <bfulgham@webkit.org> + + [Windows, WinCairo] Stop individually building WTF files in JSC. + https://bugs.webkit.org/show_bug.cgi?id=114705 + + Reviewed by Anders Carlsson. + + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCoreExports.def: + Export additional String/fastMalloc symbols needed by JSC program. + * JavaScriptCore.vcproj/jsc/jsc.vcproj: Don't manually build + WTF implementation files (a second time!) in this project. + * JavaScriptCore.vcxproj/JavaScriptCoreExportGenerator/JavaScriptCoreExports.def.in: + Export additional String/fastMalloc symbols needed by JSC program. + * JavaScriptCore.vcxproj/jsc/jsc.vcxproj: Don't manually + build WTF implementation files (a second time!) in this project. + * JavaScriptCore.vcxproj/jsc/jsc.vcxproj.filters: Ditto. + +2013-04-17 Mark Lam <mark.lam@apple.com> + + releaseExecutableMemory() should canonicalize cell liveness data before + it scans the GC roots. + https://bugs.webkit.org/show_bug.cgi?id=114733. + + Reviewed by Mark Hahnenberg. + + * heap/Heap.cpp: + (JSC::Heap::canonicalizeCellLivenessData): + * heap/Heap.h: + * runtime/JSGlobalData.cpp: + (JSC::JSGlobalData::releaseExecutableMemory): + +2013-04-16 Commit Queue <rniwa@webkit.org> + + Unreviewed, rolling out r148576. + http://trac.webkit.org/changeset/148576 + https://bugs.webkit.org/show_bug.cgi?id=114714 + + WebCore is building some of these same files (Requested by + bfulgham on #webkit). + + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCoreExports.def: + * JavaScriptCore.vcproj/jsc/jsc.vcproj: + * JavaScriptCore.vcxproj/JavaScriptCoreExportGenerator/JavaScriptCoreExports.def.in: + * JavaScriptCore.vcxproj/jsc/jsc.vcxproj: + * JavaScriptCore.vcxproj/jsc/jsc.vcxproj.filters: + +2013-04-16 Brent Fulgham <bfulgham@webkit.org> + + [Windows, WinCairo] Stop individually building WTF files in JSC. + https://bugs.webkit.org/show_bug.cgi?id=114705 + + Reviewed by Anders Carlsson. + + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCoreExports.def: + Export additional String/fastMalloc symbols needed by JSC program. + * JavaScriptCore.vcproj/jsc/jsc.vcproj: Don't manually build + WTF implementation files (a second time!) in this project. + * JavaScriptCore.vcxproj/JavaScriptCoreExportGenerator/JavaScriptCoreExports.def.in: + Export additional String/fastMalloc symbols needed by JSC program. + * JavaScriptCore.vcxproj/jsc/jsc.vcxproj: Don't manually + build WTF implementation files (a second time!) in this project. + * JavaScriptCore.vcxproj/jsc/jsc.vcxproj.filters: Ditto. + +2013-04-16 Patrick Gansterer <paroga@webkit.org> + + [CMake] Do not use JAVASCRIPTCORE_DIR in add_custom_command() of JavaScriptCore project + https://bugs.webkit.org/show_bug.cgi?id=114265 + + Reviewed by Brent Fulgham. + + Use CMAKE_CURRENT_SOURCE_DIR instead, since it provides the same value and is more + understandable. Also move the GENERATE_HASH_LUT macro into the CMakeLists.txt + of JavaScriptCore to avoid the usage of JAVASCRIPTCORE_DIR there too. + + * CMakeLists.txt: + +2013-04-16 Anders Carlsson <andersca@apple.com> + + Another Windows build fix attempt. + + * runtime/JSGlobalData.h: + (JSGlobalData): + +2013-04-16 Anders Carlsson <andersca@apple.com> + + Try to fix the Windows build. + + * runtime/JSGlobalData.h: + +2013-04-16 Brent Fulgham <bfulgham@webkit.org> + + [Windows] Unreviewed VS2010 build correction. + + * JavaScriptCore.vcxproj/JavaScriptCoreExportGenerator/JavaScriptCoreExportGeneratorCommon.props: + Specify proper link library to avoid mixture of ICU 4.0 and 4.6 + symbols during link. + +2013-04-15 Ryosuke Niwa <rniwa@webkit.org> + + Windows clean build fix after r148479. + + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCoreExports.def: + * JavaScriptCore.vcxproj/JavaScriptCoreExportGenerator/JavaScriptCoreExports.def.in: + +2013-04-15 Anders Carlsson <andersca@apple.com> + + ScriptWrappable subclasses shouldn't have to include WeakInlines.h + https://bugs.webkit.org/show_bug.cgi?id=114641 + + Reviewed by Alexey Proskuryakov. + + Move back the Weak constructor, destructor and clear() to Weak.h. Add a new weakClearSlowCase function + and put it in Weak.cpp. + + * CMakeLists.txt: + * GNUmakefile.list.am: + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: + * JavaScriptCore.vcxproj/JavaScriptCore.vcxproj: + * JavaScriptCore.vcxproj/JavaScriptCore.vcxproj.filters: + * JavaScriptCore.xcodeproj/project.pbxproj: + * Target.pri: + * heap/Weak.cpp: Added. + * heap/Weak.h: + * heap/WeakInlines.h: + * heap/WeakSetInlines.h: + +2013-04-15 Mark Hahnenberg <mhahnenberg@apple.com> + + HeapTimer lifetime should be less complicated + https://bugs.webkit.org/show_bug.cgi?id=114529 + + Reviewed by Oliver Hunt. + + Right now our HeapTimer lifetime is rather complicated. HeapTimers are "owned" by the JSGlobalData, + but there's an issue in that there can be races between a thread that is trying to tear down a JSGlobalData + and the HeapTimer's fire function. Our current code for tearing down HeapTimers is an intricate and delicate + dance which probably contains subtle bugs. + + We can make our lives easier by changing things around a bit. + + 1) We should free the API lock from being solely owned by the JSGlobalData so we don't have to worry about + grabbing the lock out of invalid memory when our HeapTimer callback fires. + + 2) We should also make it so that we deref the JSGlobalData first, then unlock the API lock so that when we + have the lock, the JSGlobalData is in one of two states: fully valid or completely destroyed, and we know exactly which one. + + 3) The JSLock can tell us this information by keeping a back pointer to the JSGlobalData. When the JSGlobalData's + destructor is called, it clears this pointer in the JSLock. Other clients of the API lock can then check + this pointer to determine whether or not the JSGlobalData is still around. + + 4) The CFRunLoopTimer will use the API lock as its context rather than the HeapTimer itself. The only way + the HeapTimer's callback can get to the HeapTimer is through the API lock's JSGlobalData pointer. + + 5) The CFRunLoopTimerContext struct has two fields for retain and release callbacks for the context's info field. + We'll provide these callbacks to ref() and deref() the JSLock as necessary. Thus, the timer becomes the other + owner of the JSLock apart from the JSGlobalData. + + * API/APIShims.h: Remove the cruft that was required by the previous design, such as RefGlobalDataTag. + (JSC::APIEntryShimWithoutLock::APIEntryShimWithoutLock): + (JSC::APIEntryShimWithoutLock::~APIEntryShimWithoutLock): + (APIEntryShimWithoutLock): + (JSC::APIEntryShim::APIEntryShim): + (JSC::APIEntryShim::~APIEntryShim): Protect the API lock with a RefPtr, deref the JSGlobalData, which could destroy it, + then unlock the API lock. This ordering prevents others from obtaining the API lock while the JSGlobalData is in the + middle of being torn down. + (JSC::APIEntryShim::init): We now take the lock, then ref the JSGlobalData, which is the opposite order of when we + tear down the shim. + * heap/Heap.cpp: + (JSC::Heap::setActivityCallback): Use PassOwnPtr now. + (JSC::Heap::activityCallback): Ditto. + (JSC::Heap::sweeper): Ditto. + (JSC): + * heap/Heap.h: + (Heap): + * heap/HeapTimer.cpp: + (JSC::retainAPILock): Retain callback for CFRunLoopTimerContext struct. + (JSC::releaseAPILock): Release callback for the CFRunLoopTimerContext struct. + (JSC::HeapTimer::HeapTimer): Use the API lock as the context's info field rather than the HeapTimer. + (JSC::HeapTimer::timerDidFire): Grab the API lock. Return early if the JSGlobalData has already been destroyed. + Otherwise, figure out which kind of HeapTimer we are based on the CFRunLoopTimerRef passed to the callback and + call the HeapTimer's callback. + * heap/HeapTimer.h: + (HeapTimer): + * heap/IncrementalSweeper.cpp: + (JSC::IncrementalSweeper::create): PassOwnPtr all the things. + * heap/IncrementalSweeper.h: + (IncrementalSweeper): + * jsc.cpp: + (jscmain): We use an APIEntryShim instead of a RefPtr for the JSGlobalData because we need to + tear down the JSGlobalData while we still hold the lock, which the APIEntryShim handles correctly. + * runtime/GCActivityCallback.h: + (DefaultGCActivityCallback): + (JSC::DefaultGCActivityCallback::create): + * runtime/JSGlobalData.cpp: + (JSC::JSGlobalData::JSGlobalData): + (JSC::JSGlobalData::~JSGlobalData): Notify the API lock that the JSGlobalData is being torn down. + * runtime/JSGlobalData.h: + (JSGlobalData): + (JSC::JSGlobalData::apiLock): + * runtime/JSLock.cpp: + (JSC::JSLockHolder::JSLockHolder): Ref, then lock (just like the API shim). + (JSC): + (JSC::JSLock::willDestroyGlobalData): + (JSC::JSLockHolder::init): + (JSC::JSLockHolder::~JSLockHolder): Protect, deref, then unlock (just like the API shim). + (JSC::JSLock::JSLock): + * runtime/JSLock.h: Add back pointer to the JSGlobalData and a callback for when the JSGlobalData is being + torn down that clears this pointer to notify other clients (i.e. timer callbacks) that the JSGlobalData is no + longer valid. + (JSLockHolder): + (JSLock): + (JSC::JSLock::globalData): + * testRegExp.cpp: + (realMain): We use an APIEntryShim instead of a RefPtr for the JSGlobalData because we need to + tear down the JSGlobalData while we still hold the lock, which the APIEntryShim handles correctly. + +2013-04-15 Julien Brianceau <jbrianceau@nds.com> + + LLInt SH4 backend implementation + https://bugs.webkit.org/show_bug.cgi?id=112886 + + Reviewed by Oliver Hunt. + + * dfg/DFGOperations.cpp: + (JSC): + * jit/JITStubs.cpp: + * llint/LLIntOfflineAsmConfig.h: + * llint/LowLevelInterpreter.asm: + * llint/LowLevelInterpreter32_64.asm: + * offlineasm/arm.rb: + * offlineasm/ast.rb: + * offlineasm/backends.rb: + * offlineasm/instructions.rb: + * offlineasm/mips.rb: + * offlineasm/risc.rb: + * offlineasm/sh4.rb: Added. + +2013-04-15 Patrick Gansterer <paroga@webkit.org> + + [CMake] Add WTF_USE_*_UNICODE variables + https://bugs.webkit.org/show_bug.cgi?id=114556 + + Reviewed by Brent Fulgham. + + WTF_USE_ICU_UNICODE and WTF_USE_WCHAR_UNICODE are used to + reduce duplication in the platform specific CMake files. + + * CMakeLists.txt: + * PlatformEfl.cmake: + +2013-04-13 Patrick Gansterer <paroga@webkit.org> + + Add missing export macro to SymbolTableEntry::freeFatEntrySlow() + + * runtime/SymbolTable.h: + (SymbolTableEntry): + +2013-04-12 Mark Hahnenberg <mhahnenberg@apple.com> + + Block freeing thread should call Region::destroy instead of delete + https://bugs.webkit.org/show_bug.cgi?id=114544 + + Reviewed by Oliver Hunt. + + Since Region doesn't have a virtual destructor, calling delete will not properly clean up all of + the state of the Region. We should call destroy() instead. + + * heap/BlockAllocator.cpp: + (JSC::BlockAllocator::releaseFreeRegions): + (JSC::BlockAllocator::blockFreeingThreadMain): + +2013-04-11 Benjamin Poulain <bpoulain@apple.com> + + Merge CharacterClassTable into CharacterClass + https://bugs.webkit.org/show_bug.cgi?id=114409 + + Reviewed by Darin Adler. + + CharacterClassTable is only a pointer and a boolean. + It is a little overkill to make a separate allocation + for that. + + * create_regex_tables: + * yarr/YarrJIT.cpp: + (JSC::Yarr::YarrGenerator::matchCharacterClass): + * yarr/YarrPattern.cpp: + (JSC::Yarr::CharacterClassConstructor::charClass): + * yarr/YarrPattern.h: + (CharacterClass): + (JSC::Yarr::CharacterClass::CharacterClass): + +2013-04-11 Michael Saboff <msaboff@apple.com> + + Added UNLIKELY() suggested in https://bugs.webkit.org/show_bug.cgi?id=114366 + after checking in the original change. + + Rubber-stamped by Jessie Berlin. + + * dfg/DFGOperations.cpp: + +2013-04-10 Benjamin Poulain <benjamin@webkit.org> + + Unify JSC Parser's error and error message + https://bugs.webkit.org/show_bug.cgi?id=114363 + + Reviewed by Geoffrey Garen. + + The parser kept the error state over two attributes: + error and errorMessage. They were changed in sync, + but had some discrepancy (for example, the error message + was always defined to something). + + This patch unifies the two. There is an error if + if the error message is non-null or if the parsing finished + before the end. + + This also gets rid of the allocation of the error message + when instantiating a parser. + + * parser/Parser.cpp: + (JSC::::Parser): + (JSC::::parseInner): + (JSC::::parseSourceElements): + (JSC::::parseVarDeclaration): + (JSC::::parseConstDeclaration): + (JSC::::parseForStatement): + (JSC::::parseSwitchStatement): + (JSC::::parsePrimaryExpression): + * parser/Parser.h: + (JSC::Parser::updateErrorMessage): + (JSC::Parser::updateErrorWithNameAndMessage): + (JSC::Parser::hasError): + (Parser): + +2013-04-10 Oliver Hunt <oliver@apple.com> + + Set trap is not being called for API objects + https://bugs.webkit.org/show_bug.cgi?id=114403 + + Reviewed by Anders Carlsson. + + Intercept putByIndex on the callback object and add tests + to make sure we don't regress in future. + + * API/JSCallbackObject.h: + (JSCallbackObject): + * API/JSCallbackObjectFunctions.h: + (JSC::::putByIndex): + (JSC): + * API/tests/testapi.c: + (PropertyCatchalls_setProperty): + * API/tests/testapi.js: + +2013-04-10 Benjamin Poulain <bpoulain@apple.com> + + Mass remove all the empty directories + + Rubberstamped by Ryosuke Niwa. + + * qt/api: Removed. + * qt/benchmarks/qscriptengine: Removed. + * qt/benchmarks/qscriptvalue: Removed. + * qt/tests/qscriptengine: Removed. + * qt/tests/qscriptstring: Removed. + * qt/tests/qscriptvalue: Removed. + * qt/tests/qscriptvalueiterator: Removed. + +2013-04-10 Mark Hahnenberg <mhahnenberg@apple.com> + + JSObject::getOwnNonIndexPropertyNames calculates numCacheableSlots incorrectly + https://bugs.webkit.org/show_bug.cgi?id=114235 + + Reviewed by Filip Pizlo. + + If the object doesn't have any properties but the prototype does, we'll assume those prototype properties are + accessible in the base object's backing store, which is bad. + + * runtime/JSObject.cpp: + (JSC::JSObject::getPropertyNames): + (JSC::JSObject::getOwnNonIndexPropertyNames): + * runtime/PropertyNameArray.h: + (JSC::PropertyNameArray::PropertyNameArray): + (JSC::PropertyNameArray::setNumCacheableSlotsForObject): + (JSC::PropertyNameArray::setBaseObject): + (PropertyNameArray): + +2013-04-10 Patrick Gansterer <paroga@webkit.org> + + Remove code duplicates from MacroAssemblerARM + https://bugs.webkit.org/show_bug.cgi?id=104457 + + Reviewed by Oliver Hunt. + + Reuse some existing methods to avoid duplicated code. + + * assembler/MacroAssemblerARM.h: + (JSC::MacroAssemblerARM::store8): + (JSC::MacroAssemblerARM::store32): + (JSC::MacroAssemblerARM::swap): + (JSC::MacroAssemblerARM::add32): + (JSC::MacroAssemblerARM::sub32): + +2013-04-10 Michael Saboff <msaboff@apple.com> + + DFG: Negative size for new Array() interpreted as large unsigned int + https://bugs.webkit.org/show_bug.cgi?id=114366 + + Reviewed by Oliver Hunt. + + Added new check in operationNewArrayWithSize() for a negative + size. If size is negative throw a "RangeError: Array size is not a + small enough positive integer" exception. + + * dfg/DFGOperations.cpp: + +2013-04-10 peavo@outlook.com <peavo@outlook.com> + + WinCairo build fails to link. + https://bugs.webkit.org/show_bug.cgi?id=114358 + + Reviewed by Brent Fulgham. + + Export the symbol WTF::MD5::checksum(). + + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCoreExports.def: + * JavaScriptCore.vcxproj/JavaScriptCoreExportGenerator/JavaScriptCoreExports.def.in: + +2013-04-08 Anders Carlsson <andersca@apple.com> + + Remove unneeded headers from FrameLoader.h + https://bugs.webkit.org/show_bug.cgi?id=114223 + + Reviewed by Geoffrey Garen. + + Update for WTF changes. + + * bytecode/SpeculatedType.h: + * runtime/JSCJSValue.h: + +2013-04-09 Geoffrey Garen <ggaren@apple.com> + + Removed bitrotted TimeoutChecker code + https://bugs.webkit.org/show_bug.cgi?id=114336 + + Reviewed by Alexey Proskuryakov. + + This mechanism hasn't worked for a while. + + MarkL is working on a new version of this feature with a distinct + implementation. + + * API/APIShims.h: + (JSC::APIEntryShim::~APIEntryShim): + (JSC::APIEntryShim::init): + * GNUmakefile.list.am: + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCoreExports.def: + * JavaScriptCore.vcxproj/JavaScriptCore.vcxproj: + * JavaScriptCore.vcxproj/JavaScriptCore.vcxproj.filters: + * JavaScriptCore.vcxproj/JavaScriptCoreExportGenerator/JavaScriptCoreExports.def.in: + * JavaScriptCore.xcodeproj/project.pbxproj: + * Target.pri: + * dfg/DFGGPRInfo.h: + * jit/JIT.cpp: + * jit/JIT.h: + * jit/JITStubs.cpp: + * jit/JITStubs.h: + * jit/JSInterfaceJIT.h: + (JSInterfaceJIT): + * runtime/JSGlobalData.cpp: + (JSC::JSGlobalData::JSGlobalData): + * runtime/JSGlobalData.h: + * runtime/JSGlobalObject.cpp: + * runtime/JSONObject.cpp: + (JSC::Stringifier::appendStringifiedValue): + (JSC::Walker::walk): + * runtime/TimeoutChecker.cpp: Removed. + * runtime/TimeoutChecker.h: Removed. + +2013-04-10 Oliver Hunt <oliver@apple.com> + + REGRESSION (r148073): WebKit Nightly r148082 crashes on launch in JSObjectSetPrivate + https://bugs.webkit.org/show_bug.cgi?id=114341 + + Reviewed by Alexey Proskuryakov. + + Make JSObjectSetPrivate use uncheckedToJS as some clients + clear their private data during finalization for some reason. + + * API/JSObjectRef.cpp: + (JSObjectSetPrivate): + +2013-04-09 Oliver Hunt <oliver@apple.com> + + Add liveness tests to JSC API entry points + https://bugs.webkit.org/show_bug.cgi?id=114318 + + Reviewed by Geoffrey Garen. + + Add simple checks for the existence of a method table on any + JSCells passed across the API. This in turn forces a structure + validity test. + + * API/APICast.h: + (toJS): + (toJSForGC): + (unsafeToJS): + * API/JSObjectRef.cpp: + (JSObjectGetPrivate): + +2013-04-09 Oliver Hunt <oliver@apple.com> + + Rollout last patch as it destroyed everything + + * API/APICast.h: + (toJS): + (toJSForGC): + +2013-04-09 Oliver Hunt <oliver@apple.com> + + Add liveness tests to JSC API entry points + https://bugs.webkit.org/show_bug.cgi?id=114318 + + Reviewed by Filip Pizlo. + + Add simple checks for the existence of a method table on any + JSCells passed across the API. This in turn forces a structure + validity test. + + * API/APICast.h: + (toJS): + (toJSForGC): + +2013-04-09 Balazs Kilvady <kilvadyb@homejinni.com> + + LLInt conditional branch compilation fault on MIPS. + https://bugs.webkit.org/show_bug.cgi?id=114264 + + Reviewed by Filip Pizlo. + + Fix conditional branch compilation in LLInt offlineasm. + + * offlineasm/mips.rb: + +2013-04-08 Mark Hahnenberg <mhahnenberg@apple.com> + + JSObject::getOwnNonIndexPropertyNames calculates numCacheableSlots incorrectly + https://bugs.webkit.org/show_bug.cgi?id=114235 + + Reviewed by Geoffrey Garen. + + Due to the way that numCacheableSlots is currently calculated, checking an object's prototype for enumerable + properties causes us not to cache any properties at all. We should only cache properties on the object itself + since we currently don't take advantage of any sort of name caching for properties in the prototype chain. + This fix undoes a ~2% SunSpider regression caused by http://trac.webkit.org/changeset/147570. + + * runtime/JSObject.cpp: + (JSC::JSObject::getOwnNonIndexPropertyNames): + +2013-04-09 Ryosuke Niwa <rniwa@webkit.org> + + Remove yarr.gyp + https://bugs.webkit.org/show_bug.cgi?id=114247 + + Reviewed by Benjamin Poulain. + + * yarr/yarr.gyp: Removed. + +2013-04-08 Ryosuke Niwa <rniwa@webkit.org> + + Remove JavaScriptCore.gyp/gypi + https://bugs.webkit.org/show_bug.cgi?id=114238 + + Reviewed by Benjamin Poulain. + + * JavaScriptCore.gyp: Removed. + * JavaScriptCore.gyp/.gitignore: Removed. + * JavaScriptCore.gypi: Removed. + +2013-04-08 Vahag Vardanyan <vaag@ispras.ru> + + Adds fromCharCode intrinsic support. + https://bugs.webkit.org/show_bug.cgi?id=104807 + + Reviewed by Oliver Hunt. + + Switch to using fromCharCode intrinsic instead of call operation in some cases. + + * dfg/DFGAbstractState.cpp: + (JSC::DFG::AbstractState::executeEffects): + * dfg/DFGByteCodeParser.cpp: + (JSC::DFG::ByteCodeParser::handleIntrinsic): + * dfg/DFGFixupPhase.cpp: + (JSC::DFG::FixupPhase::fixupNode): + * dfg/DFGNodeType.h: + (DFG): + * dfg/DFGOperations.cpp: + * dfg/DFGOperations.h: + * dfg/DFGPredictionPropagationPhase.cpp: + (JSC::DFG::PredictionPropagationPhase::propagate): + * dfg/DFGSpeculativeJIT.cpp: + (JSC::DFG::SpeculativeJIT::compileFromCharCode): + (DFG): + * dfg/DFGSpeculativeJIT.h: + (JSC::DFG::SpeculativeJIT::callOperation): + (SpeculativeJIT): + * dfg/DFGSpeculativeJIT32_64.cpp: + (JSC::DFG::SpeculativeJIT::compile): + * dfg/DFGSpeculativeJIT64.cpp: + (JSC::DFG::SpeculativeJIT::compile): + * runtime/StringConstructor.cpp: + (JSC::stringFromCharCode): + (JSC): + * runtime/StringConstructor.h: + (JSC): + +2013-04-08 Benjamin Poulain <benjamin@webkit.org> + + Remove HTML Notification + https://bugs.webkit.org/show_bug.cgi?id=114231 + + Reviewed by Ryosuke Niwa. + + * Configurations/FeatureDefines.xcconfig: + +2013-04-05 Roger Fong <roger_fong@apple.com> + + Build fix. + + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCoreExports.def: + * JavaScriptCore.vcxproj/JavaScriptCoreExportGenerator/JavaScriptCoreExports.def.in: + +2013-04-08 Filip Pizlo <fpizlo@apple.com> + + DFG should be able to inline string equality comparisons + https://bugs.webkit.org/show_bug.cgi?id=114224 + + Reviewed by Oliver Hunt. + + Inline 8-bit string equality, go to slow path for 16-bit strings. 2x speed-up for string equality + comparisons on 8-bit strings. 20-50% speed-up on JSRegress/HashMap tests. 30% speed-up on + string-fasta. 2% speed-up on SunSpider overall. Some small speed-ups elsewhere. + + This is a gnarly change but we have loads of test coverage already between the HashMap tests and + preexisting DFG string equality tests (which appear to have been designed to test OSR exits, but + also give us good overall coverage on string equality behavior). + + * dfg/DFGFixupPhase.cpp: + (JSC::DFG::FixupPhase::fixupNode): + * dfg/DFGOperations.cpp: + * dfg/DFGOperations.h: + * dfg/DFGSpeculativeJIT.cpp: + (JSC::DFG::SpeculativeJIT::compilePeepHoleBranch): + (JSC::DFG::SpeculativeJIT::compare): + (JSC::DFG::SpeculativeJIT::compileStrictEq): + (JSC::DFG::SpeculativeJIT::compileStringEquality): + (DFG): + * dfg/DFGSpeculativeJIT.h: + (SpeculativeJIT): + +2013-04-08 Geoffrey Garen <ggaren@apple.com> + + Stop #include-ing all of JavaScriptCore in every DOM-related file + https://bugs.webkit.org/show_bug.cgi?id=114220 + + Reviewed by Sam Weinig. + + I separated WeakInlines.h from Weak.h so WebCore data types that need + to declare a Weak<T> data member don't have to #include all of the + infrastructure for accessing that data member. + + This also required separating Weak<T> from PassWeak<T> by removing the + WeakImplAccessor class template and pushing code down into its subclasses. + + * API/JSWeakObjectMapRefPrivate.cpp: + * JavaScriptCore.xcodeproj/project.pbxproj: + * bytecode/UnlinkedCodeBlock.h: + * heap/PassWeak.h: + (JSC): + (PassWeak): + (JSC::::PassWeak): + (JSC::::operator): + (JSC::::get): + * heap/SlotVisitorInlines.h: + * heap/Weak.h: + (JSC): + (Weak): + * heap/WeakInlines.h: Copied from Source/JavaScriptCore/heap/Weak.h. + (JSC): + (JSC::::Weak): + (JSC::::operator): + (JSC::::get): + (JSC::::was): + (JSC::weakClear): + * jit/JITThunks.h: + * runtime/RegExpCache.h: + * runtime/Structure.h: + * runtime/WeakGCMap.h: + +2013-04-05 Roger Fong <roger_fong@apple.com> + + Windows build fix fix. + + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCoreExports.def: + +2013-04-05 Roger Fong <roger_fong@apple.com> + + Windows build fix. + + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCoreExports.def: + * JavaScriptCore.vcxproj/JavaScriptCoreExportGenerator/JavaScriptCoreExports.def.in: + +2013-04-08 Oliver Hunt <oliver@apple.com> + + Make resolve more robust in the face of lookup misses + https://bugs.webkit.org/show_bug.cgi?id=114211 + + Reviewed by Filip Pizlo. + + This simply short circuits the resolve operations in the + event that we don't find a path to a property. There's no + repro case for this happening unfortunately. + + * llint/LLIntSlowPaths.cpp: + (JSC::LLInt::LLINT_SLOW_PATH_DECL): + +2013-04-08 Oliver Hunt <oliver@apple.com> + + Build fix. + + * assembler/ARMv7Assembler.h: + (ARMv7Assembler): + +2013-04-08 Justin Haygood <jhaygood@reaktix.com> + + Allow KeywordLookupGenerator.py to work on Windows with Windows style line endings + https://bugs.webkit.org/show_bug.cgi?id=63234 + + Reviewed by Oliver Hunt. + + * KeywordLookupGenerator.py: + (parseKeywords): + +2013-04-08 Filip Pizlo <fpizlo@apple.com> + + REGRESSION(r146669): Assertion hit in JSC::DFG::SpeculativeJIT::fillSpeculateCell() running webgl tests + https://bugs.webkit.org/show_bug.cgi?id=114129 + <rdar://problem/13594898> + + Reviewed by Darin Adler. + + The check to see if we need a cell check when simplifying a GetById or PutById needs to be hoisted to + above where we abstractly execute the instruction, since after we abstracting execute it, it will + seem like it no longer needs the cell check. + + * dfg/DFGConstantFoldingPhase.cpp: + (JSC::DFG::ConstantFoldingPhase::foldConstants): + +2013-04-07 Oliver Hunt <oliver@apple.com> + + Add bounds checking for WTF::Vector::operator[] + https://bugs.webkit.org/show_bug.cgi?id=89600 + + Reviewed by Filip Pizlo. + + Make a few JSC classes opt-out of release mode bounds checking. + + * assembler/AssemblerBuffer.h: + (AssemblerBuffer): + * assembler/AssemblerBufferWithConstantPool.h: + (AssemblerBufferWithConstantPool): + * bytecode/CodeBlock.cpp: + (JSC::CodeBlock::CodeBlock): + (JSC::CodeBlock::bytecodeOffset): + (JSC): + (JSC::replaceExistingEntries): + * bytecode/CodeBlock.h: + (JSC::CodeBlock::bytecodeOffsetForCallAtIndex): + (JSC::CodeBlock::callReturnIndexVector): + (JSC::CodeBlock::codeOrigins): + (RareData): + * bytecode/UnlinkedCodeBlock.h: + (JSC::UnlinkedEvalCodeBlock::adoptVariables): + (UnlinkedEvalCodeBlock): + * bytecompiler/BytecodeGenerator.cpp: + (JSC::BytecodeGenerator::BytecodeGenerator): + (JSC::BytecodeGenerator::emitNewArray): + (JSC::BytecodeGenerator::emitCall): + (JSC::BytecodeGenerator::emitConstruct): + * bytecompiler/BytecodeGenerator.h: + (CallArguments): + (JSC::BytecodeGenerator::instructions): + (BytecodeGenerator): + * bytecompiler/StaticPropertyAnalysis.h: + (JSC::StaticPropertyAnalysis::create): + (JSC::StaticPropertyAnalysis::StaticPropertyAnalysis): + (StaticPropertyAnalysis): + * bytecompiler/StaticPropertyAnalyzer.h: + (StaticPropertyAnalyzer): + (JSC::StaticPropertyAnalyzer::StaticPropertyAnalyzer): + * dfg/DFGJITCompiler.cpp: + (JSC::DFG::JITCompiler::link): + * parser/ASTBuilder.h: + (ASTBuilder): + * runtime/ArgList.h: + (MarkedArgumentBuffer): + * runtime/ArrayPrototype.cpp: + (JSC::arrayProtoFuncSort): + +2013-04-07 Benjamin Poulain <benjamin@webkit.org> + + Use Vector::reserveInitialCapacity() when possible in JavaScriptCore runtime + https://bugs.webkit.org/show_bug.cgi?id=114111 + + Reviewed by Andreas Kling. + + Almost all the code was already using Vector::reserveInitialCapacity() + and Vector::uncheckedAppend(). Fix the remaining parts. + + * runtime/ArgList.h: + (MarkedArgumentBuffer): The type VectorType is unused. + + * runtime/ArrayPrototype.cpp: + (JSC::arrayProtoFuncSort): + Move the variable closer to where it is needed. + + * runtime/JSArray.cpp: + (JSC::JSArray::setLengthWithArrayStorage): + * runtime/JSObject.cpp: + (JSC::JSObject::getOwnPropertyNames): + +2013-04-07 Patrick Gansterer <paroga@webkit.org> + + Remove references to Skia and V8 from CMake files + https://bugs.webkit.org/show_bug.cgi?id=114130 + + Reviewed by Geoffrey Garen. + + * shell/PlatformBlackBerry.cmake: + +2013-04-07 David Kilzer <ddkilzer@apple.com> + + Remove the rest of SVG_DOM_OBJC_BINDINGS + <http://webkit.org/b/114112> + + Reviewed by Geoffrey Garen. + + * Configurations/FeatureDefines.xcconfig: + - Remove ENABLE_SVG_DOM_OBJC_BINDINGS macro. + +2013-04-07 Oliver Hunt <oliver@apple.com> + + Inspector should display information about non-object exceptions + https://bugs.webkit.org/show_bug.cgi?id=114123 + + Reviewed by Adele Peterson. + + Make sure we store the right stack information, even when throwing + a primitive. + + * interpreter/CallFrame.h: + (JSC::ExecState::clearSupplementaryExceptionInfo): + (ExecState): + * interpreter/Interpreter.cpp: + (JSC::Interpreter::addStackTraceIfNecessary): + (JSC::Interpreter::throwException): + +2013-04-06 Oliver Hunt <oliver@apple.com> + + Unify the many and varied stack trace mechanisms, and make the result sane. + https://bugs.webkit.org/show_bug.cgi?id=114072 + + Reviewed by Filip Pizlo. + + Makes JSC::StackFrame record the bytecode offset and other necessary data + rather than requiring us to perform eager evaluation of the line number, etc. + Then remove most of the users of retrieveLastCaller, as most of them were + using it to create a stack trace in a fairly incomplete and inefficient way. + + StackFrame now also has a couple of helpers to get the line and column info. + + * API/JSContextRef.cpp: + (JSContextCreateBacktrace): + * bytecompiler/BytecodeGenerator.cpp: + (JSC::BytecodeGenerator::emitDebugHook): + * interpreter/Interpreter.cpp: + (JSC): + (JSC::Interpreter::dumpRegisters): + (JSC::Interpreter::unwindCallFrame): + (JSC::getBytecodeOffsetForCallFrame): + (JSC::getCallerInfo): + (JSC::StackFrame::line): + (JSC::StackFrame::column): + (JSC::StackFrame::expressionInfo): + (JSC::StackFrame::toString): + (JSC::Interpreter::getStackTrace): + (JSC::Interpreter::addStackTraceIfNecessary): + (JSC::Interpreter::retrieveCallerFromVMCode): + * interpreter/Interpreter.h: + (StackFrame): + (Interpreter): + * runtime/Error.cpp: + (JSC::throwError): + * runtime/JSGlobalData.h: + (JSC): + (JSGlobalData): + * runtime/JSGlobalObject.cpp: + (JSC::DynamicGlobalObjectScope::DynamicGlobalObjectScope): + +2013-04-06 Geoffrey Garen <ggaren@apple.com> + + Removed v8 bindings hooks from IDL files + https://bugs.webkit.org/show_bug.cgi?id=114091 + + Reviewed by Anders Carlsson and Sam Weinig. + + * heap/HeapStatistics.h: + +2013-04-03 Roger Fong <roger_fong@apple.com> + + Windows VS2010 build fix. + + * JavaScriptCore.vcxproj/JavaScriptCoreExportGenerator/JavaScriptCoreExports.def.in: + +2013-04-06 Zan Dobersek <zdobersek@igalia.com> + + Remove the remaining PLATFORM(CHROMIUM) guard in JavaScriptCore + https://bugs.webkit.org/show_bug.cgi?id=114082 + + Reviewed by Ryosuke Niwa. + + * runtime/JSExportMacros.h: Remove the remaining PLATFORM(CHROMIUM) guard. + +2013-04-06 Ed Bartosh <bartosh@gmail.com> + + --minimal build fails with error: control reaches end of non-void function + https://bugs.webkit.org/show_bug.cgi?id=114085 + + Reviewed by Oliver Hunt. + + * interpreter/Interpreter.cpp: return 0 if JIT is not enabled + (JSC::getBytecodeOffsetForCallFrame): + +2013-04-06 Geoffrey Garen <ggaren@apple.com> + + Try to fix the Windows build. + + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCoreExports.def: + Added back a symbol that is exported. + +2013-04-06 Geoffrey Garen <ggaren@apple.com> + + Try to fix the Windows build. + + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCoreExports.def: + Removed symbols that aren't exported. + +2013-04-06 Geoffrey Garen <ggaren@apple.com> + + Rolled out 147820 and 147818 because they caused plugins tests to ASSERT + https://bugs.webkit.org/show_bug.cgi?id=114094 + + Reviewed by Anders Carlsson. + + * API/JSContextRef.cpp: + (JSContextCreateBacktrace): + * bytecompiler/BytecodeGenerator.cpp: + (JSC::BytecodeGenerator::emitDebugHook): + * interpreter/Interpreter.cpp: + (JSC): + (JSC::Interpreter::dumpRegisters): + (JSC::Interpreter::unwindCallFrame): + (JSC::getLineNumberForCallFrame): + (JSC::getCallerInfo): + (JSC::Interpreter::getStackTrace): + (JSC::Interpreter::addStackTraceIfNecessary): + (JSC::Interpreter::retrieveCallerFromVMCode): + * interpreter/Interpreter.h: + (StackFrame): + (JSC::StackFrame::toString): + (JSC::StackFrame::friendlyLineNumber): + (Interpreter): + * runtime/Error.cpp: + (JSC::throwError): + * runtime/JSGlobalData.h: + (JSC): + (JSGlobalData): + * runtime/JSGlobalObject.cpp: + (JSC::DynamicGlobalObjectScope::DynamicGlobalObjectScope): + +2013-04-06 Patrick Gansterer <paroga@webkit.org> + + Unreviewed build fix after r146932. + + * profiler/ProfilerDatabase.cpp: + (Profiler): + +2013-04-06 Patrick Gansterer <paroga@webkit.org> + + Do not call getenv() on Windows CE where it does not exist. + + * runtime/JSGlobalData.cpp: + (JSC::JSGlobalData::JSGlobalData): + +2013-04-05 Benjamin Poulain <benjamin@webkit.org> + + Second attempt to fix the Windows bot + + Unreviewed. + + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCoreExports.def: + * JavaScriptCore.vcxproj/JavaScriptCoreExportGenerator/JavaScriptCoreExports.def.in: + +2013-04-05 Benjamin Poulain <bpoulain@apple.com> + + Attempt to fix the Windows bot + + Unreviewed. + + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCoreExports.def: + * JavaScriptCore.vcxproj/JavaScriptCoreExportGenerator/JavaScriptCoreExports.def.in: + r147825 removed the symbol for nullptr_t. Add it back. + +2013-04-02 Roger Fong <roger_fong@apple.com> + + Build fix. + + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCoreExports.def: + * JavaScriptCore.vcxproj/JavaScriptCoreExportGenerator/JavaScriptCoreExports.def.in: + +2013-04-05 Oliver Hunt <oliver@apple.com> + + Build fix. + + * interpreter/Interpreter.cpp: + (JSC::getBytecodeOffsetForCallFrame): + +2013-04-05 Oliver Hunt <oliver@apple.com> + + Unify the many and varied stack trace mechanisms, and make the result sane. + https://bugs.webkit.org/show_bug.cgi?id=114072 + + Reviewed by Filip Pizlo. + + Makes JSC::StackFrame record the bytecode offset and other necessary data + rather than requiring us to perform eager evaluation of the line number, etc. + Then remove most of the users of retrieveLastCaller, as most of them were + using it to create a stack trace in a fairly incomplete and inefficient way. + + StackFrame now also has a couple of helpers to get the line and column info. + + * API/JSContextRef.cpp: + (JSContextCreateBacktrace): + * bytecompiler/BytecodeGenerator.cpp: + (JSC::BytecodeGenerator::emitDebugHook): + * interpreter/Interpreter.cpp: + (JSC): + (JSC::Interpreter::dumpRegisters): + (JSC::Interpreter::unwindCallFrame): + (JSC::getBytecodeOffsetForCallFrame): + (JSC::getCallerInfo): + (JSC::StackFrame::line): + (JSC::StackFrame::column): + (JSC::StackFrame::expressionInfo): + (JSC::StackFrame::toString): + (JSC::Interpreter::getStackTrace): + (JSC::Interpreter::addStackTraceIfNecessary): + (JSC::Interpreter::retrieveCallerFromVMCode): + * interpreter/Interpreter.h: + (StackFrame): + (Interpreter): + * runtime/Error.cpp: + (JSC::throwError): + * runtime/JSGlobalData.h: + (JSC): + (JSGlobalData): + * runtime/JSGlobalObject.cpp: + (JSC::DynamicGlobalObjectScope::DynamicGlobalObjectScope): + +2013-04-05 Mark Hahnenberg <mhahnenberg@apple.com> + + tryCacheGetByID sets StructureStubInfo accessType to an incorrect value + https://bugs.webkit.org/show_bug.cgi?id=114068 + + Reviewed by Geoffrey Garen. + + In the case where we have a non-Value cacheable property, we set the StructureStubInfo accessType to + get_by_id_self, but then we don't patch self and instead patch in a get_by_id_self_fail. This leads to + incorrect profiling data so when the DFG compiles the function, it uses a GetByOffset rather than a GetById, + which leads to loading a GetterSetter directly out of an object. + + * jit/JITStubs.cpp: + (JSC::tryCacheGetByID): + (JSC::DEFINE_STUB_FUNCTION): + +2013-04-05 Filip Pizlo <fpizlo@apple.com> + + If CallFrame::trueCallFrame() knows that it's about to read garbage instead of a valid CodeOrigin/InlineCallFrame, then it should give up and return 0 and all callers should be robust against this + https://bugs.webkit.org/show_bug.cgi?id=114062 + + Reviewed by Oliver Hunt. + + * bytecode/CodeBlock.h: + (JSC::CodeBlock::canGetCodeOrigin): + (CodeBlock): + * interpreter/CallFrame.cpp: + (JSC::CallFrame::trueCallFrame): + * interpreter/Interpreter.cpp: + (JSC::Interpreter::getStackTrace): + +2013-04-05 Geoffrey Garen <ggaren@apple.com> + + Made USE(JSC) unconditional + https://bugs.webkit.org/show_bug.cgi?id=114058 + + Reviewed by Anders Carlsson. + + * config.h: + +2013-04-05 Filip Pizlo <fpizlo@apple.com> + + Unreviewed, rolling out http://trac.webkit.org/changeset/147729 + + It's causing a bunch of breakage on some more strict compilers: + <inline asm>:1267:2: error: ambiguous instructions require an explicit suffix (could be 'ficomps', or 'ficompl') + + * offlineasm/x86.rb: + +2013-04-05 Roger Fong <roger_fong@apple.com> + + More VS2010 solution makefile fixes. + <rdar://problem/13588964> + + * JavaScriptCore.vcxproj/JavaScriptCore.make: + +2013-04-05 Allan Sandfeld Jensen <allan.jensen@digia.com> + + LLint should be able to use x87 instead of SSE for floating pointer + + https://bugs.webkit.org/show_bug.cgi?id=112239 + + Reviewed by Filip Pizlo. + + Implements LLInt floating point operations in x87, to ensure we support + x86 without SSE2. + + X86 (except 64bit) now defaults to using x87 instructions in order to + support all 32bit x86 back to i686. The implementation uses the fucomi + instruction from i686 which sets the new minimum. + + * offlineasm/x86.rb: + +2013-04-04 Christophe Dumez <ch.dumez@sisa.samsung.com> + + Unreviewed EFL build fix. + + We had undefined reference to `JSC::CodeOrigin::maximumBytecodeIndex'. + + * bytecode/CodeBlock.cpp: + (JSC::CodeBlock::findClosureCallForReturnPC): + (JSC::CodeBlock::bytecodeOffset): + +2013-04-04 Geoffrey Garen <ggaren@apple.com> + + Stop pretending that statements return a value + https://bugs.webkit.org/show_bug.cgi?id=113969 + + Reviewed by Oliver Hunt. + + Expressions have an intrinsic value, which they return to their parent + in the AST. + + Statements just execute for effect in sequence. + + This patch moves emitBytecode into the ExpressionNode and StatementNode + subclasses, and changes the SatementNode subclass to return void. This + eliminates some cruft where we used to return 0, or try to save a bogus + register and return it, as if a statement had a consuming parent in the + AST. + + * bytecompiler/BytecodeGenerator.h: + (JSC::BytecodeGenerator::emitNode): + (BytecodeGenerator): + (JSC::BytecodeGenerator::emitNodeInConditionContext): + * bytecompiler/NodesCodegen.cpp: + (JSC::ConstStatementNode::emitBytecode): + (JSC::BlockNode::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::CaseClauseNode::emitBytecode): + (JSC::CaseBlockNode::emitBytecodeForBlock): + (JSC::SwitchNode::emitBytecode): + (JSC::LabelNode::emitBytecode): + (JSC::ThrowNode::emitBytecode): + (JSC::TryNode::emitBytecode): + (JSC::ScopeNode::emitStatementsBytecode): + (JSC::ProgramNode::emitBytecode): + (JSC::EvalNode::emitBytecode): + (JSC::FunctionBodyNode::emitBytecode): + (JSC::FuncDeclNode::emitBytecode): + * parser/NodeConstructors.h: + (JSC::PropertyListNode::PropertyListNode): + (JSC::ArgumentListNode::ArgumentListNode): + * parser/Nodes.h: + (Node): + (ExpressionNode): + (StatementNode): + (ConstStatementNode): + (BlockNode): + (EmptyStatementNode): + (DebuggerStatementNode): + (ExprStatementNode): + (VarStatementNode): + (IfNode): + (IfElseNode): + (DoWhileNode): + (WhileNode): + (ForNode): + (ForInNode): + (ContinueNode): + (BreakNode): + (ReturnNode): + (WithNode): + (LabelNode): + (ThrowNode): + (TryNode): + (ProgramNode): + (EvalNode): + (FunctionBodyNode): + (FuncDeclNode): + (CaseBlockNode): + (SwitchNode): + +2013-04-04 Oliver Hunt <oliver@apple.com> + + Exception stack unwinding doesn't handle inline callframes correctly + https://bugs.webkit.org/show_bug.cgi?id=113952 + + Reviewed by Geoffrey Garen. + + The basic problem here is that the exception stack unwinding was + attempting to be "clever" and avoid doing a correct stack walk + as it "knew" inline callframes couldn't have exception handlers. + + This used to be safe as the exception handling machinery was + designed to fail gently and just claim that no handler existed. + This was "safe" and even "correct" inasmuch as we currently + don't run any code with exception handlers through the dfg. + + This patch fixes the logic by simply making everything uniformly + use the safe stack walking machinery, and making the correct + boundary checks occur everywhere that they should. + + * bytecode/CodeBlock.cpp: + (JSC::CodeBlock::findClosureCallForReturnPC): + (JSC::CodeBlock::bytecodeOffset): + * interpreter/Interpreter.cpp: + (JSC): + (JSC::Interpreter::dumpRegisters): + (JSC::Interpreter::unwindCallFrame): + (JSC::getCallerInfo): + (JSC::Interpreter::getStackTrace): + (JSC::Interpreter::retrieveCallerFromVMCode): + +2013-04-04 Geoffrey Garen <ggaren@apple.com> + + Removed a defunct comment + https://bugs.webkit.org/show_bug.cgi?id=113948 + + Reviewed by Oliver Hunt. + + This is also a convenient way to test the EWS. + + * bytecompiler/BytecodeGenerator.cpp: + (JSC): + +2013-04-04 Martin Robinson <mrobinson@igalia.com> + + [GTK] Remove the gyp build + https://bugs.webkit.org/show_bug.cgi?id=113942 + + Reviewed by Gustavo Noronha Silva. + + * JavaScriptCore.gyp/JavaScriptCoreGTK.gyp: Removed. + * JavaScriptCore.gyp/redirect-stdout.sh: Removed. + +2013-04-04 Geoffrey Garen <ggaren@apple.com> + + Simplified bytecode generation by merging prefix and postfix nodes + https://bugs.webkit.org/show_bug.cgi?id=113925 + + Reviewed by Filip Pizlo. + + PostfixNode now inherits from PrefixNode, so when we detect that we're + in a context where postifx and prefix are equivalent, PostFixNode can + just call through to PrefixNode codegen, instead of duplicating the + logic. + + * bytecompiler/NodesCodegen.cpp: + (JSC::PostfixNode::emitResolve): + (JSC::PostfixNode::emitBracket): + (JSC::PostfixNode::emitDot): + * parser/NodeConstructors.h: + (JSC::PostfixNode::PostfixNode): + * parser/Nodes.h: + (JSC): + (PrefixNode): + (PostfixNode): + +2013-04-04 Andras Becsi <andras.becsi@digia.com> + + Fix the build with GCC 4.8 + https://bugs.webkit.org/show_bug.cgi?id=113147 + + Reviewed by Allan Sandfeld Jensen. + + Initialize JSObject* exception to suppress warnings that make + the build fail because of -Werror=maybe-uninitialized. + + * runtime/Executable.cpp: + (JSC::FunctionExecutable::compileForCallInternal): + (JSC::FunctionExecutable::compileForConstructInternal): + +2013-04-02 Mark Hahnenberg <mhahnenberg@apple.com> + + get_by_pname can become confused when iterating over objects with static properties + https://bugs.webkit.org/show_bug.cgi?id=113831 + + Reviewed by Geoffrey Garen. + + get_by_pname doesn't take static properties into account when using a JSPropertyNameIterator to directly + access an object's backing store. One way to fix this is to not cache any properties when iterating over + objects with static properties. This patch fixes the bug that was originally reported on swisscom.ch. + + * runtime/JSObject.cpp: + (JSC::JSObject::getOwnNonIndexPropertyNames): + * runtime/JSPropertyNameIterator.cpp: + (JSC::JSPropertyNameIterator::create): + * runtime/PropertyNameArray.h: + (JSC::PropertyNameArray::PropertyNameArray): + (JSC::PropertyNameArray::numCacheableSlots): + (JSC::PropertyNameArray::setNumCacheableSlots): + (PropertyNameArray): + +2013-04-02 Geoffrey Garen <ggaren@apple.com> + + DFG should compile a little sooner + https://bugs.webkit.org/show_bug.cgi?id=113835 + + Unreviewed. + + Rolled out r147511 because it was based on incorrect performance + measurement. + + * bytecode/CodeBlock.cpp: + (JSC::CodeBlock::optimizationThresholdScalingFactor): + +2013-04-02 Geoffrey Garen <ggaren@apple.com> + + DFG should compile a little sooner + https://bugs.webkit.org/show_bug.cgi?id=113835 + + Reviewed by Michael Saboff. + + 2% speedup on SunSpider. + + 2% speedup on JSRegress. + + Neutral on Octane, v8, and Kraken. + + The worst-hit single sub-test is kraken-stanford-crypto-ccm.js, which gets + 18% slower. Since Kraken is neutral overall in its preferred mean, I + think that's OK for now. + + (Our array indexing speculation fails pathologically on + kraken-stanford-crypto-ccm.js. Compiling sooner is a regression because + it triggers those failures sooner. I'm going to file some follow-up bugs + explaining how to fix our speculations on this sub-test, at which point + compiling earlier should become a slight speedup on Kraken overall.) + + * bytecode/CodeBlock.cpp: + (JSC::CodeBlock::optimizationThresholdScalingFactor): I experimented + with a few different options, including reducing the coefficient 'a'. + A simple linear reduction on instruction count worked best. + +2013-04-01 Benjamin Poulain <benjamin@webkit.org> + + Use Vector::reserveInitialCapacity and Vector::uncheckedAppend for JSC's APIs + https://bugs.webkit.org/show_bug.cgi?id=113651 + + Reviewed by Andreas Kling. + + This removes a bunch of branches on initialization and when + filling the vector. + + * API/JSCallbackConstructor.cpp: + (JSC::constructJSCallback): + * API/JSCallbackFunction.cpp: + (JSC::JSCallbackFunction::call): + * API/JSCallbackObjectFunctions.h: + (JSC::::construct): + (JSC::::call): + * API/JSObjectRef.cpp: + (JSObjectCopyPropertyNames): + +2013-04-01 Mark Hahnenberg <mhahnenberg@apple.com> + + Fixing borked VS 2010 project file + + Unreviewed bot greening. + + * JavaScriptCore.vcxproj/JavaScriptCore.vcxproj: + * JavaScriptCore.vcxproj/JavaScriptCore.vcxproj.filters: + +2013-04-01 Mark Hahnenberg <mhahnenberg@apple.com> + + One more Windows build fix + + Unreviewed. + + * JavaScriptCore.vcxproj/JavaScriptCoreExportGenerator/JavaScriptCoreExports.def.in: + +2013-04-01 Mark Hahnenberg <mhahnenberg@apple.com> + + More build fallout fixes. + + Unreviewed build fix. + + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCoreExports.def: Add new export symbols. + * heap/SuperRegion.cpp: Windows didn't like "LLU". + +2013-04-01 Mark Hahnenberg <mhahnenberg@apple.com> + + r147324 broke the world + https://bugs.webkit.org/show_bug.cgi?id=113704 + + Unreviewed build fix. + + Remove a bunch of unused variables and use the correctly sized types for 32-bit platforms. + + * heap/BlockAllocator.cpp: + (JSC::BlockAllocator::BlockAllocator): + * heap/BlockAllocator.h: + (BlockAllocator): + * heap/Heap.cpp: + (JSC::Heap::Heap): + * heap/SuperRegion.cpp: + (JSC::SuperRegion::SuperRegion): + * heap/SuperRegion.h: + (SuperRegion): + +2013-04-01 Mark Hahnenberg <mhahnenberg@apple.com> + + 32-bit Windows build fix + + Unreviewed build fix. + + * heap/SuperRegion.cpp: + * heap/SuperRegion.h: Use uint64_t instead of size_t. + (SuperRegion): + +2013-04-01 Mark Hahnenberg <mhahnenberg@apple.com> + + EFL build fix + + Unreviewed build fix. + + * CMakeLists.txt: + +2013-03-31 Mark Hahnenberg <mhahnenberg@apple.com> + + Regions should be allocated from the same contiguous segment of virtual memory + https://bugs.webkit.org/show_bug.cgi?id=113662 + + Reviewed by Filip Pizlo. + + Instead of letting the OS spread our Regions all over the place, we should allocate them all within + some range of each other. This change will open the door to some other optimizations, e.g. doing simple + range checks for our write barriers and compressing JSCell pointers to 32-bits. + + Added new SuperRegion class that encapsulates allocating Regions from a contiguous reserved chunk of + virtual address space. It functions very similarly to the FixedVMPoolExecutableAllocator class used by the JIT. + + Also added two new subclasses of Region, NormalRegion and ExcessRegion. + + NormalRegion is the type of Region that is normally allocated when there is available space remaining + in the SuperRegion. If we ever run out of space in the SuperRegion, we fall back to allocating + ExcessRegions, which are identical to how Regions have behaved up until now, i.e. they contain a + PageAllocationAligned. + + We only use the SuperRegion (and NormalRegions) on 64-bit systems, since it doesn't make sense to reserve the + entire 4 GB address space on 32-bit systems just for the JS heap. + + * GNUmakefile.list.am: + * JavaScriptCore.gypi: + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: + * JavaScriptCore.vcxproj/JavaScriptCore.vcxproj: + * JavaScriptCore.vcxproj/JavaScriptCore.vcxproj.filters: + * JavaScriptCore.xcodeproj/project.pbxproj: + * Target.pri: + * heap/BlockAllocator.cpp: + (JSC::BlockAllocator::BlockAllocator): + * heap/BlockAllocator.h: + (JSC): + (BlockAllocator): + (JSC::BlockAllocator::allocate): + (JSC::BlockAllocator::allocateCustomSize): + (JSC::BlockAllocator::deallocateCustomSize): + * heap/Heap.cpp: + (JSC::Heap::Heap): + (JSC): + (JSC::Heap::didExceedFixedHeapSizeLimit): + * heap/Heap.h: + (Heap): + * heap/MarkedBlock.cpp: + (JSC::MarkedBlock::create): + * heap/Region.h: + (Region): + (JSC): + (NormalRegion): + (JSC::NormalRegion::base): + (JSC::NormalRegion::size): + (ExcessRegion): + (JSC::ExcessRegion::base): + (JSC::ExcessRegion::size): + (JSC::NormalRegion::NormalRegion): + (JSC::NormalRegion::tryCreate): + (JSC::NormalRegion::tryCreateCustomSize): + (JSC::NormalRegion::reset): + (JSC::ExcessRegion::ExcessRegion): + (JSC::ExcessRegion::~ExcessRegion): + (JSC::ExcessRegion::create): + (JSC::ExcessRegion::createCustomSize): + (JSC::ExcessRegion::reset): + (JSC::Region::Region): + (JSC::Region::initializeBlockList): + (JSC::Region::create): + (JSC::Region::createCustomSize): + (JSC::Region::~Region): + (JSC::Region::destroy): + (JSC::Region::reset): + (JSC::Region::deallocate): + (JSC::Region::base): + (JSC::Region::size): + * heap/SuperRegion.cpp: Added. + (JSC): + (JSC::SuperRegion::SuperRegion): + (JSC::SuperRegion::getAlignedBase): + (JSC::SuperRegion::allocateNewSpace): + (JSC::SuperRegion::notifyNeedPage): + (JSC::SuperRegion::notifyPageIsFree): + * heap/SuperRegion.h: Added. + (JSC): + (SuperRegion): + +2013-04-01 Benjamin Poulain <benjamin@webkit.org> + + Remove an unused variable from the ARMv7 Assembler + https://bugs.webkit.org/show_bug.cgi?id=113653 + + Reviewed by Andreas Kling. + + * assembler/ARMv7Assembler.h: + (ARMv7Assembler): + +2013-03-31 Adam Barth <abarth@webkit.org> + + [Chromium] Yarr should build using a separate GYP file from JavaScriptCore + https://bugs.webkit.org/show_bug.cgi?id=113652 + + Reviewed by Nico Weber. + + This patch moves JavaScriptCore.gyp to yarr.gyp because Chromium only + uses this GYP file to build yarr. + + * JavaScriptCore.gyp/JavaScriptCoreGTK.gyp: + * JavaScriptCore.gypi: + * yarr/yarr.gyp: Renamed from Source/JavaScriptCore/JavaScriptCore.gyp/JavaScriptCore.gyp. + +2013-03-31 Filip Pizlo <fpizlo@apple.com> + + Unreviewed, fix a comment. While thinking about TBAA for array accesses, + I realized that we have to be super careful about aliasing of typed arrays. + + * dfg/DFGCSEPhase.cpp: + (JSC::DFG::CSEPhase::getByValLoadElimination): + +2013-03-30 Mark Hahnenberg <mhahnenberg@apple.com> + + Move Region into its own header + https://bugs.webkit.org/show_bug.cgi?id=113617 + + Reviewed by Geoffrey Garen. + + BlockAllocator.h is getting a little crowded. We should move the Region class into its own + header, since it's pretty independent from the BlockAllocator. + + * GNUmakefile.list.am: + * JavaScriptCore.gypi: + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: + * JavaScriptCore.vcxproj/JavaScriptCore.vcxproj: + * JavaScriptCore.vcxproj/JavaScriptCore.vcxproj.filters: + * JavaScriptCore.xcodeproj/project.pbxproj: + * heap/BlockAllocator.h: + (JSC): + * heap/Region.h: Added. + (JSC): + (DeadBlock): + (JSC::DeadBlock::DeadBlock): + (Region): + (JSC::Region::blockSize): + (JSC::Region::isFull): + (JSC::Region::isEmpty): + (JSC::Region::isCustomSize): + (JSC::Region::create): + (JSC::Region::createCustomSize): + (JSC::Region::Region): + (JSC::Region::~Region): + (JSC::Region::reset): + (JSC::Region::allocate): + (JSC::Region::deallocate): + +2013-03-29 Mark Hahnenberg <mhahnenberg@apple.com> + + Objective-C API: Remove -[JSManagedValue managedValueWithValue:owner:] + https://bugs.webkit.org/show_bug.cgi?id=113602 + + Reviewed by Geoffrey Garen. + + Since we put the primary way of keeping track of external object graphs (i.e. "managed" references) + in JSVirtualMachine, there is some overlap in the functionality of that interface and JSManagedValue. + Specifically, we no longer need the methods that include an owner, since ownership is now tracked + by JSVirtualMachine. These JSManagedValues will become weak pointers unless they are used + with [JSVirtualMachine addManagedReference:withOwner:], in which case their lifetime is tied to that + of their owner. + + * API/JSManagedValue.h: + * API/JSManagedValue.mm: + (-[JSManagedValue init]): + (-[JSManagedValue initWithValue:]): + (JSManagedValueHandleOwner::isReachableFromOpaqueRoots): + * API/JSVirtualMachine.mm: + (getInternalObjcObject): + * API/tests/testapi.mm: + (-[TextXYZ setOnclick:]): + (-[TextXYZ dealloc]): + +2013-03-29 Geoffrey Garen <ggaren@apple.com> + + Simplified bytecode generation by unforking "condition context" codegen + https://bugs.webkit.org/show_bug.cgi?id=113554 + + Reviewed by Mark Hahnenberg. + + Now, a node that establishes a condition context can always ask its child + nodes to generate into that context. + + This has a few advantages: + + (*) Removes a bunch of code; + + (*) Optimizes a few missed cases like "if (!(x < 2))", "if (!!x)", and + "if (!x || !y)"; + + (*) Paves the way to removing more opcodes. + + * bytecode/Opcode.h: + (JSC): Separated out the branching opcodes for clarity. + * bytecompiler/NodesCodegen.cpp: + (JSC::ExpressionNode::emitBytecodeInConditionContext): All expressions + can be emitted in a condition context now -- the default behavior is + to branch based on the expression's value. + + (JSC::LogicalNotNode::emitBytecodeInConditionContext): + (JSC::LogicalOpNode::emitBytecodeInConditionContext): + (JSC::ConditionalNode::emitBytecode): + (JSC::IfNode::emitBytecode): + (JSC::IfElseNode::emitBytecode): + (JSC::DoWhileNode::emitBytecode): + (JSC::WhileNode::emitBytecode): + (JSC::ForNode::emitBytecode): + * parser/Nodes.h: + (JSC::ExpressionNode::isSubtract): + (ExpressionNode): + (LogicalNotNode): + (LogicalOpNode): Removed lots of code for handling expressions + that couldn't generate into a condition context because all expressions + can now. + +2013-03-28 Geoffrey Garen <ggaren@apple.com> + + Simplified the bytecode by removing op_loop and op_loop_if_* + https://bugs.webkit.org/show_bug.cgi?id=113548 + + Reviewed by Filip Pizlo. + + Regular jumps will suffice. + + These opcodes are identical to branches, except they also do timeout + checking. That style of timeout checking has been broken for a long + time, and when we add back timeout checking, it won't use these opcodes. + + * JavaScriptCore.order: + * bytecode/CodeBlock.cpp: + (JSC::CodeBlock::dumpBytecode): + * bytecode/Opcode.h: + (JSC): + (JSC::padOpcodeName): + * bytecode/PreciseJumpTargets.cpp: + (JSC::computePreciseJumpTargets): + * bytecompiler/BytecodeGenerator.cpp: + (JSC::BytecodeGenerator::emitJump): + (JSC::BytecodeGenerator::emitJumpIfTrue): + (JSC::BytecodeGenerator::emitJumpIfFalse): + * dfg/DFGByteCodeParser.cpp: + (JSC::DFG::ByteCodeParser::parseBlock): + * dfg/DFGCapabilities.h: + (JSC::DFG::canCompileOpcode): + * jit/JIT.cpp: + (JSC::JIT::privateCompileMainPass): + (JSC::JIT::privateCompileSlowCases): + * jit/JIT.h: + (JIT): + (JSC): + * llint/LowLevelInterpreter.asm: + * llint/LowLevelInterpreter32_64.asm: + * llint/LowLevelInterpreter64.asm: + +2013-03-28 Geoffrey Garen <ggaren@apple.com> + + Simplified the bytecode by removing op_jmp_scopes + https://bugs.webkit.org/show_bug.cgi?id=113545 + + Reviewed by Filip Pizlo. + + We already have op_pop_scope and op_jmp, so we don't need op_jmp_scopes. + Using op_jmp_scopes was also adding a "jump to self" to codegen for + return statements, which was pretty silly. + + * JavaScriptCore.order: + * bytecode/CodeBlock.cpp: + (JSC::CodeBlock::dumpBytecode): + * bytecode/Opcode.h: + (JSC::padOpcodeName): + * bytecode/PreciseJumpTargets.cpp: + (JSC::computePreciseJumpTargets): + * bytecompiler/BytecodeGenerator.cpp: + (JSC::BytecodeGenerator::emitComplexPopScopes): + (JSC::BytecodeGenerator::emitPopScopes): + * bytecompiler/BytecodeGenerator.h: + (BytecodeGenerator): + * bytecompiler/NodesCodegen.cpp: + (JSC::ContinueNode::emitBytecode): + (JSC::BreakNode::emitBytecode): + (JSC::ReturnNode::emitBytecode): + * jit/JIT.cpp: + (JSC::JIT::privateCompileMainPass): + * jit/JIT.h: + * jit/JITOpcodes.cpp: + * jit/JITOpcodes32_64.cpp: + * jit/JITStubs.cpp: + * jit/JITStubs.h: + * llint/LLIntSlowPaths.cpp: + * llint/LLIntSlowPaths.h: + * llint/LowLevelInterpreter.asm: + +2013-03-28 Mark Hahnenberg <mhahnenberg@apple.com> + + Safari hangs during test262 run in CodeCache::pruneSlowCase + https://bugs.webkit.org/show_bug.cgi?id=113469 + + Reviewed by Geoffrey Garen. + + We can end up hanging for quite some time if we add a lot of small keys to the CodeCache. + By the time we get around to pruning the cache, we have a potentially tens or hundreds of + thousands of small entries, which can cause a noticeable hang when pruning them. + + To fix this issue we added a hard cap to the number of entries in the cache because we + could potentially have to remove every element in the map. + + * runtime/CodeCache.cpp: + (JSC::CodeCacheMap::pruneSlowCase): We need to prune until we're both under the hard cap and the + capacity in bytes. + * runtime/CodeCache.h: + (CodeCacheMap): + (JSC::CodeCacheMap::numberOfEntries): Convenience accessor function to the number of entries in + the map that does the cast to size_t of m_map.size() for us. + (JSC::CodeCacheMap::canPruneQuickly): Checks that the total number is under the hard cap. We put this + check inside a function to more accurately describe why we're doing the check and to abstract out + the actual calculation in case we want to coalesce calls to pruneSlowCase in the future. + (JSC::CodeCacheMap::prune): Check the number of entries against our hard cap. If it's greater than + the cap then we need to drop down to pruneSlowCase. + +2013-03-28 Zan Dobersek <zdobersek@igalia.com> + + Unreviewed build fix for the EFL and GTK ports. + + * runtime/CodeCache.cpp: + (JSC::CodeCacheMap::pruneSlowCase): Pass a 0 casted to the int64_t type instead of 0LL + to the std::max call so the arguments' types match. + +2013-03-27 Geoffrey Garen <ggaren@apple.com> + + Unreviewed build fix: Removed a dead field. + + Pointed out by Mark Lam. + + * dfg/DFGByteCodeParser.cpp: + (JSC::DFG::ByteCodeParser::ByteCodeParser): + (ByteCodeParser): + +2013-03-27 Geoffrey Garen <ggaren@apple.com> + + Unreviewed build fix: Removed a dead field. + + * dfg/DFGByteCodeParser.cpp: + (JSC::DFG::ByteCodeParser::ByteCodeParser): + (ByteCodeParser): + +2013-03-27 Geoffrey Garen <ggaren@apple.com> + + Removed some dead code in the DFG bytecode parser + https://bugs.webkit.org/show_bug.cgi?id=113472 + + Reviewed by Sam Weinig. + + Now that Phi creation and liveness analysis are separate passes, we can + remove the vestiges of code that used to do that in the bytecode + parser. + + * dfg/DFGByteCodeParser.cpp: + (ByteCodeParser): + (JSC::DFG::ByteCodeParser::addToGraph): + (JSC::DFG::ByteCodeParser::parse): + +2013-03-27 Filip Pizlo <fpizlo@apple.com> + + JIT and DFG should NaN-check loads from Float32 arrays + https://bugs.webkit.org/show_bug.cgi?id=113462 + <rdar://problem/13490804> + + Reviewed by Mark Hahnenberg. + + * dfg/DFGSpeculativeJIT.cpp: + (JSC::DFG::SpeculativeJIT::compileGetByValOnFloatTypedArray): + * jit/JITPropertyAccess.cpp: + (JSC::JIT::emitFloatTypedArrayGetByVal): + +2013-03-27 Mark Hahnenberg <mhahnenberg@apple.com> + + CodeCache::m_capacity can becoming negative, producing undefined results in pruneSlowCase + https://bugs.webkit.org/show_bug.cgi?id=113453 + + Reviewed by Geoffrey Garen. + + * runtime/CodeCache.cpp: + (JSC::CodeCacheMap::pruneSlowCase): We make sure that m_minCapacity doesn't drop below zero now. + This prevents m_capacity from doing the same. + +2013-03-27 Filip Pizlo <fpizlo@apple.com> + + DFG should use CheckStructure for typed array checks whenever possible + https://bugs.webkit.org/show_bug.cgi?id=113374 + + Reviewed by Geoffrey Garen. + + We used to do the right thing, but it appears that this regressed at some point. Since the + FixupPhase now has the ability to outright remove spurious CheckStructures on array + operations, it is profitable for the ByteCodeParser to insert CheckStructures whenver there + is a chance that it might be profitable, and when the profiling tells us what structure to + check. + + Also added some code for doing ArrayProfile debugging. + + This is a slightly speed-up. Maybe 3% on Mandreel. + + * bytecode/ArrayProfile.cpp: + (JSC::ArrayProfile::computeUpdatedPrediction): + * dfg/DFGArrayMode.h: + (JSC::DFG::ArrayMode::benefitsFromStructureCheck): + +2013-03-27 Zeno Albisser <zeno@webkit.org> + + [Qt] Remove Qt specific WorkQueueItem definitions. + https://bugs.webkit.org/show_bug.cgi?id=112891 + + This patch is preparation work for removing + WorkQueue related code from TestRunnerQt and + replacing it with generic TestRunner code. + + Reviewed by Benjamin Poulain. + + * API/JSStringRefQt.cpp: + (JSStringCreateWithQString): + Adding a convenience function to create a + JSStringRef from a QString. + * API/JSStringRefQt.h: + +2013-03-26 Filip Pizlo <fpizlo@apple.com> + + REGRESSION: Sometimes, operations on proven strings ignore changes to the string prototype + https://bugs.webkit.org/show_bug.cgi?id=113353 + <rdar://problem/13510778> + + Reviewed by Mark Hahnenberg and Geoffrey Garen. + + ToString should call speculateStringObject() even if you know that it's a string object, since + it calls it to also get the watchpoint. Note that even with this change, if you do + Phantom(Check:StringObject:@a), it might get eliminated just because we proved that @a is a + string object (thereby eliminating the prototype watchpoint); that's fine since ToString is + MustGenerate and never decays to Phantom. + + * dfg/DFGSpeculativeJIT.cpp: + (JSC::DFG::SpeculativeJIT::compileToStringOnCell): + (JSC::DFG::SpeculativeJIT::speculateStringObject): + (JSC::DFG::SpeculativeJIT::speculateStringOrStringObject): + * dfg/DFGSpeculativeJIT.h: + (SpeculativeJIT): + (JSC::DFG::SpeculativeJIT::speculateStringObjectForStructure): + +2013-03-26 Mark Hahnenberg <mhahnenberg@apple.com> + + REGRESSION(r144131): It made fast/js/regress/string-repeat-arith.html assert on 32 bit + https://bugs.webkit.org/show_bug.cgi?id=112106 + + Rubber stamped by Filip Pizlo. + + * dfg/DFGSpeculativeJIT.cpp: + (JSC::DFG::SpeculativeJIT::checkGeneratedTypeForToInt32): Get rid of the case for constants because + we would have done constant folding anyways on a ValueToInt32. + * dfg/DFGSpeculativeJIT32_64.cpp: + (JSC::DFG::SpeculativeJIT::fillSpeculateBoolean): Fixed a random compile error with this flag enabled. + +2013-03-26 Filip Pizlo <fpizlo@apple.com> + + JSC_enableProfiler=true should also cause JSGlobalData to save the profiler output somewhere + https://bugs.webkit.org/show_bug.cgi?id=113144 + + Reviewed by Geoffrey Garen. + + Forgot to include Geoff's requested change in the original commit. + + * profiler/ProfilerDatabase.cpp: + (Profiler): + +2013-03-25 Filip Pizlo <fpizlo@apple.com> + + JSC_enableProfiler=true should also cause JSGlobalData to save the profiler output somewhere + https://bugs.webkit.org/show_bug.cgi?id=113144 + + Reviewed by Geoffrey Garen. + + Added the ability to save profiler output with JSC_enableProfiler=true. It will save it + to the current directory, or JSC_PROFILER_PATH if the latter was specified. + + This works by saving the Profiler::Database either when it is destroyed or atexit(), + whichever happens first. + + This allows use of the profiler from any WebKit client. + + * jsc.cpp: + (jscmain): + * profiler/ProfilerDatabase.cpp: + (Profiler): + (JSC::Profiler::Database::Database): + (JSC::Profiler::Database::~Database): + (JSC::Profiler::Database::registerToSaveAtExit): + (JSC::Profiler::Database::addDatabaseToAtExit): + (JSC::Profiler::Database::removeDatabaseFromAtExit): + (JSC::Profiler::Database::performAtExitSave): + (JSC::Profiler::Database::removeFirstAtExitDatabase): + (JSC::Profiler::Database::atExitCallback): + * profiler/ProfilerDatabase.h: + (JSC::Profiler::Database::databaseID): + (Database): + * runtime/JSGlobalData.cpp: + (JSC::JSGlobalData::JSGlobalData): + +2013-03-25 Filip Pizlo <fpizlo@apple.com> + + ArrayMode should not consider SpecOther when refining the base + https://bugs.webkit.org/show_bug.cgi?id=113271 + + Reviewed by Geoffrey Garen. + + 9% speed-up on Octane/pdfjs. + + * dfg/DFGArrayMode.cpp: + (JSC::DFG::ArrayMode::refine): + +2013-03-26 Csaba Osztrogonác <ossy@webkit.org> + + Fix unused parameter warnings in JITInlines.h + https://bugs.webkit.org/show_bug.cgi?id=112560 + + Reviewed by Zoltan Herczeg. + + * jit/JITInlines.h: + (JSC::JIT::beginUninterruptedSequence): + (JSC::JIT::endUninterruptedSequence): + (JSC): + +2013-03-25 Kent Tamura <tkent@chromium.org> + + Rename ENABLE_INPUT_TYPE_DATETIME + https://bugs.webkit.org/show_bug.cgi?id=113254 + + Reviewed by Kentaro Hara. + + Rename ENABLE_INPUT_TYPE_DATETIME to ENABLE_INPUT_TYPE_DATETIME_INCOMPLETE. + Actually I'd like to remove the code, but we shouldn't remove it yet + because we shipped products with it on some platforms. + + * Configurations/FeatureDefines.xcconfig: + +2013-03-25 Mark Lam <mark.lam@apple.com> + + Offlineasm cloop backend compiles op+branch incorrectly. + https://bugs.webkit.org/show_bug.cgi?id=113146. + + Reviewed by Geoffrey Garen. + + * dfg/DFGRepatch.h: + (JSC::DFG::dfgResetGetByID): + (JSC::DFG::dfgResetPutByID): + - These functions never return when the DFG is dsiabled, not just when + asserts are enabled. Changing the attribute from NO_RETURN_DUE_TO_ASSERT + to NO_RETURN. + * llint/LLIntOfflineAsmConfig.h: + - Added some #defines needed to get the cloop building again. + * offlineasm/cloop.rb: + - Fix cloopEmitOpAndBranchIfOverflow() and cloopEmitOpAndBranch() to + emit code that unconditionally executes the specified operation before + doing the conditional branch. + +2013-03-25 Mark Hahnenberg <mhahnenberg@apple.com> + + JSObject::enterDictionaryIndexingMode doesn't have a case for ALL_BLANK_INDEXING_TYPES + https://bugs.webkit.org/show_bug.cgi?id=113236 + + Reviewed by Geoffrey Garen. + + * runtime/JSObject.cpp: + (JSC::JSObject::enterDictionaryIndexingMode): We forgot blank indexing types. + +2013-03-23 Mark Hahnenberg <mhahnenberg@apple.com> + + HandleSet should use HeapBlocks for storing handles + https://bugs.webkit.org/show_bug.cgi?id=113145 + + Reviewed by Geoffrey Garen. + + * GNUmakefile.list.am: Build project changes. + * JavaScriptCore.gypi: Ditto. + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: Ditto. + * JavaScriptCore.vcxproj/JavaScriptCore.vcxproj: Ditto. + * JavaScriptCore.vcxproj/JavaScriptCore.vcxproj.filters: Ditto. + * JavaScriptCore.xcodeproj/project.pbxproj: Ditto. + * heap/BlockAllocator.cpp: Rename the RegionSet to m_fourKBBlockRegionSet because there are + too many block types to include them all in the name now. + (JSC::BlockAllocator::BlockAllocator): + * heap/BlockAllocator.h: + (BlockAllocator): Add the appropriate override for regionSetFor. + (JSC::WeakBlock): + (JSC::MarkStackSegment): + (JSC::HandleBlock): + * heap/HandleBlock.h: Added. + (HandleBlock): New class for HandleBlocks. + (JSC::HandleBlock::blockFor): Static method to get the block of the given HandleNode pointer. Allows + us to quickly figure out which HandleSet the HandleNode belongs to without storing the pointer to it + in the HandleNode. + (JSC::HandleBlock::handleSet): Getter. + * heap/HandleBlockInlines.h: Added. + (JSC::HandleBlock::create): + (JSC::HandleBlock::HandleBlock): + (JSC::HandleBlock::payloadEnd): + (JSC::HandleBlock::payload): + (JSC::HandleBlock::nodes): + (JSC::HandleBlock::nodeAtIndex): + (JSC::HandleBlock::nodeCapacity): + * heap/HandleSet.cpp: + (JSC::HandleSet::~HandleSet): + (JSC::HandleSet::grow): + * heap/HandleSet.h: + (HandleNode): Move the internal Node class from HandleSet to be its own public class so it can be + used by HandleBlock. + (HandleSet): Add a typedef so that Node refers to the new HandleNode class. + (JSC::HandleSet::toHandle): + (JSC::HandleSet::toNode): + (JSC::HandleSet::allocate): + (JSC::HandleSet::deallocate): + (JSC::HandleNode::HandleNode): + (JSC::HandleNode::slot): + (JSC::HandleNode::handleSet): Use the new blockFor static function to get the right HandleBlock and lookup + the HandleSet. + (JSC::HandleNode::setPrev): + (JSC::HandleNode::prev): + (JSC::HandleNode::setNext): + (JSC::HandleNode::next): + (JSC::HandleSet::forEachStrongHandle): + * heap/Heap.h: Friend HandleSet so that it can access the BlockAllocator when allocating HandleBlocks. + +2013-03-22 David Kilzer <ddkilzer@apple.com> + + BUILD FIX (r145119): Make JSValue* properties default to (assign) + <rdar://problem/13380794> + + Reviewed by Mark Hahnenberg. + + Fixes the following build failures: + + Source/JavaScriptCore/API/tests/testapi.mm:106:1: error: no 'assign', 'retain', or 'copy' attribute is specified - 'assign' is assumed [-Werror,-Wobjc-property-no-attribute] + @property JSValue *onclick; + ^ + Source/JavaScriptCore/API/tests/testapi.mm:106:1: error: default property attrib ute 'assign' not appropriate for non-GC object [-Werror,-Wobjc-property-no-attribute] + Source/JavaScriptCore/API/tests/testapi.mm:107:1: error: no 'assign', 'retain', or 'copy' attribute is specified - 'assign' is assumed [-Werror,-Wobjc-property-no-attribute] + @property JSValue *weakOnclick; + ^ + Source/JavaScriptCore/API/tests/testapi.mm:107:1: error: default property attribute 'assign' not appropriate for non-GC object [-Werror,-Wobjc-property-no-attribute] + 4 errors generated. + + * API/tests/testapi.mm: Default to (assign) for JSValue* + properties. + +2013-03-22 Ryosuke Niwa <rniwa@webkit.org> + + testLeakingPrototypesAcrossContexts added in r146682 doesn't compile on Win and fails on Mac + https://bugs.webkit.org/show_bug.cgi?id=113125 + + Reviewed by Mark Hahnenberg + + Remove the test added in r146682 as it's now failing on Mac. + This is the test that was causing a compilation failure on Windows. + + * API/tests/testapi.c: + (main): + +2013-03-22 Ryosuke Niwa <rniwa@webkit.org> + + Fix the typo: WIN -> WINDOWS. + + * API/tests/testapi.c: + (main): + +2013-03-22 Ryosuke Niwa <rniwa@webkit.org> + + I really can't figure out what's wrong with this one. + Temporarily disable the test added by r146682 on Windows since it doesn't compile. + + * API/tests/testapi.c: + (main): + +2013-03-22 Ryosuke Niwa <rniwa@webkit.org> + + Another build fix (after r146693) for r146682. + + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCoreExports.def: + * JavaScriptCore.vcxproj/JavaScriptCoreExportGenerator/JavaScriptCoreExports.def.in: + +2013-03-22 Roger Fong <roger_fong@apple.com> + + Unreviewed. AppleWin build fix. + + * JavaScriptCore.vcproj/JavaScriptCore/copy-files.cmd: + * JavaScriptCore.vcxproj/copy-files.cmd: + +2013-03-22 Mark Hahnenberg <mhahnenberg@apple.com> + + -[TinyDOMNode dealloc] should call [super dealloc] when ARC is not enabled + https://bugs.webkit.org/show_bug.cgi?id=113054 + + Reviewed by Geoffrey Garen. + + * API/tests/testapi.mm: + (-[TinyDOMNode dealloc]): + +2013-03-22 Mark Hahnenberg <mhahnenberg@apple.com> + + opaqueJSClassData should be cached on JSGlobalObject, not the JSGlobalData + https://bugs.webkit.org/show_bug.cgi?id=113086 + + Reviewed by Geoffrey Garen. + + opaqueJSClassData stores cached prototypes for JSClassRefs in the C API. It doesn't make sense to + share these prototypes within a JSGlobalData across JSGlobalObjects, and in fact doing so will cause + a leak of the original JSGlobalObject that these prototypes were created in. Therefore we should move + this cache to JSGlobalObject where it belongs and where it won't cause memory leaks. + + * API/JSBase.cpp: Needed to add an extern "C" so that testapi.c can use the super secret GC function. + * API/JSClassRef.cpp: We now grab the cached context data from the global object rather than the global data. + (OpaqueJSClass::contextData): + * API/JSClassRef.h: Remove this header because it's unnecessary and causes circular dependencies. + * API/tests/testapi.c: Added a new test that makes sure that using the same JSClassRef in two different contexts + doesn't cause leaks of the original global object. + (leakFinalize): + (nestedAllocateObject): This is a hack to bypass the conservative scan of the GC, which was unnecessarily marking + objects and keeping them alive, ruining the test result. + (testLeakingPrototypesAcrossContexts): + (main): + * API/tests/testapi.mm: extern "C" this so we can continue using it here. + * runtime/JSGlobalData.cpp: Remove JSClassRef related stuff. + (JSC::JSGlobalData::~JSGlobalData): + * runtime/JSGlobalData.h: + (JSGlobalData): + * runtime/JSGlobalObject.h: Add the stuff that JSGlobalData had. We add it to JSGlobalObjectRareData so that + clients who don't use the C API don't have to pay the memory cost of this extra HashMap. + (JSGlobalObject): + (JSGlobalObjectRareData): + (JSC::JSGlobalObject::opaqueJSClassData): + +2013-03-19 Martin Robinson <mrobinson@igalia.com> + + [GTK] Add support for building the WebCore bindings to the gyp build + https://bugs.webkit.org/show_bug.cgi?id=112638 + + Reviewed by Nico Weber. + + * JavaScriptCore.gyp/JavaScriptCoreGTK.gyp: Export all include directories to direct + dependents and fix the indentation of the libjavascriptcore target. + +2013-03-21 Filip Pizlo <fpizlo@apple.com> + + Fix some minor issues in the DFG's profiling of heap accesses + https://bugs.webkit.org/show_bug.cgi?id=113010 + + Reviewed by Goeffrey Garen. + + 1) If a CodeBlock gets jettisoned by GC, we should count the exit sites. + + 2) If a CodeBlock clears a structure stub during GC, it should record this, and + the DFG should prefer to not inline that access (i.e. treat it as if it had an + exit site). + + 3) If a PutById was seen by the baseline JIT, and the JIT attempted to cache it, + but it chose not to, then assume that it will take slow path. + + 4) If we frequently exited because of a structure check on a weak constant, + don't try to inline that access in the future. + + 5) Treat all exits that were counted as being frequent. + + 81% speed-up on Octane/gbemu. Small speed-ups elsewhere, and no regressions. + + * bytecode/CodeBlock.cpp: + (JSC::CodeBlock::finalizeUnconditionally): + (JSC): + (JSC::CodeBlock::resetStubDuringGCInternal): + (JSC::CodeBlock::reoptimize): + (JSC::CodeBlock::jettison): + (JSC::ProgramCodeBlock::jettisonImpl): + (JSC::EvalCodeBlock::jettisonImpl): + (JSC::FunctionCodeBlock::jettisonImpl): + (JSC::CodeBlock::tallyFrequentExitSites): + * bytecode/CodeBlock.h: + (CodeBlock): + (JSC::CodeBlock::tallyFrequentExitSites): + (ProgramCodeBlock): + (EvalCodeBlock): + (FunctionCodeBlock): + * bytecode/GetByIdStatus.cpp: + (JSC::GetByIdStatus::computeFor): + * bytecode/PutByIdStatus.cpp: + (JSC::PutByIdStatus::computeFor): + * bytecode/StructureStubInfo.h: + (JSC::StructureStubInfo::StructureStubInfo): + (StructureStubInfo): + * dfg/DFGByteCodeParser.cpp: + (JSC::DFG::ByteCodeParser::handleGetById): + (JSC::DFG::ByteCodeParser::parseBlock): + * dfg/DFGOSRExit.cpp: + (JSC::DFG::OSRExit::considerAddingAsFrequentExitSiteSlow): + * dfg/DFGOSRExit.h: + (JSC::DFG::OSRExit::considerAddingAsFrequentExitSite): + (OSRExit): + * jit/JITStubs.cpp: + (JSC::DEFINE_STUB_FUNCTION): + * runtime/Options.h: + (JSC): + +2013-03-22 Filip Pizlo <fpizlo@apple.com> + + DFG folding of PutById to SimpleReplace should consider the specialized function case + https://bugs.webkit.org/show_bug.cgi?id=113093 + + Reviewed by Geoffrey Garen and Mark Hahnenberg. + + * bytecode/PutByIdStatus.cpp: + (JSC::PutByIdStatus::computeFor): + +2013-03-22 David Kilzer <ddkilzer@apple.com> + + BUILD FIX (r146558): Build testapi.mm with ARC enabled for armv7s + <http://webkit.org/b/112608> + + Fixes the following build failure: + + Source/JavaScriptCore/API/tests/testapi.mm:205:1: error: method possibly missing a [super dealloc] call [-Werror,-Wobjc-missing-super-calls] + } + ^ + 1 error generated. + + * Configurations/ToolExecutable.xcconfig: Enable ARC for armv7s + architecture. + +2013-03-22 David Kilzer <ddkilzer@apple.com> + + Revert "BUILD FIX (r146558): Call [super dealloc] from -[TinyDOMNode dealloc]" + + This fixes a build failure introduced by this change: + + Source/JavaScriptCore/API/tests/testapi.mm:206:6: error: ARC forbids explicit message send of 'dealloc' + [super dealloc]; + ^ ~~~~~~~ + 1 error generated. + + Not sure why this didn't fail locally on my Mac Pro. + + * API/tests/testapi.mm: + (-[TinyDOMNode dealloc]): Remove call to [super dealloc]. + +2013-03-22 David Kilzer <ddkilzer@apple.com> + + BUILD FIX (r146558): Call [super dealloc] from -[TinyDOMNode dealloc] + <http://webkit.org/b/112608> + + Fixes the following build failure: + + Source/JavaScriptCore/API/tests/testapi.mm:205:1: error: method possibly missing a [super dealloc] call [-Werror,-Wobjc-missing-super-calls] + } + ^ + 1 error generated. + + * API/tests/testapi.mm: + (-[TinyDOMNode dealloc]): Call [super dealloc]. + +2013-03-22 Ryosuke Niwa <rniwa@webkit.org> + + Leak bots erroneously report JSC::WatchpointSet as leaking + https://bugs.webkit.org/show_bug.cgi?id=107781 + + Reviewed by Filip Pizlo. + + Since leaks doesn't support tagged pointers, avoid using it by flipping the bit flag to indicate + the entry is "fat". We set the flag when the entry is NOT fat; i.e. slim. + + Replaced FatFlag by SlimFlag and initialized m_bits with this flag to indicate that the entry is + initially "slim". + + * runtime/SymbolTable.cpp: + (JSC::SymbolTableEntry::copySlow): Don't set FatFlag since it has been replaced by SlimFlag. + (JSC::SymbolTableEntry::inflateSlow): Ditto. + + * runtime/SymbolTable.h: + (JSC::SymbolTableEntry::Fast::Fast): Set SlimFlag by default. + (JSC::SymbolTableEntry::Fast::isNull): Ignore SlimFlag. + (JSC::SymbolTableEntry::Fast::isFat): An entry is fat when m_bits is not entirely zero and SlimFlag + is not set. + + (JSC::SymbolTableEntry::SymbolTableEntry): Set SlimFlag by default. + (JSC::SymbolTableEntry::SymbolTableEntry::getFast): Set SlimFlag when creating Fast from a fat entry. + (JSC::SymbolTableEntry::isNull): Ignore SlimFlag. + (JSC::SymbolTableEntry::FatEntry::FatEntry): Strip SlimFlag. + (JSC::SymbolTableEntry::isFat): An entry is fat when m_bits is not entirely zero and SlimFlag is unset. + (JSC::SymbolTableEntry::fatEntry): Don't strip FatFlag as this flag doesn't exist anymore. + (JSC::SymbolTableEntry::pack): Preserve SlimFlag. + + (JSC::SymbolTableIndexHashTraits): empty value is no longer zero so don't set emptyValueIsZero true. + +2013-03-21 Mark Hahnenberg <mhahnenberg@apple.com> + + Objective-C API: Need a good way to preserve custom properties on JS wrappers + https://bugs.webkit.org/show_bug.cgi?id=112608 + + Reviewed by Geoffrey Garen. + + Currently, we just use a weak map, which means that garbage collection can cause a wrapper to + disappear if it isn't directly exported to JavaScript. + + The most straightforward and safe way (with respect to garbage collection and concurrency) is to have + clients add and remove their external references along with their owners. Effectively, the client is + recording the structure of the external object graph so that the garbage collector can make sure to + mark any wrappers that are reachable through either the JS object graph of the external Obj-C object + graph. By keeping these wrappers alive, this has the effect that custom properties on these wrappers + will also remain alive. + + The rule for if an object needs to be tracked by the runtime (and therefore whether the client should report it) is as follows: + For a particular object, its references to its children should be added if: + 1. The child is referenced from JavaScript. + 2. The child contains references to other objects for which (1) or (2) are true. + + * API/JSAPIWrapperObject.mm: + (JSAPIWrapperObjectHandleOwner::finalize): + (JSAPIWrapperObjectHandleOwner::isReachableFromOpaqueRoots): A wrapper object is kept alive only if its JSGlobalObject + is marked and its corresponding Objective-C object was added to the set of opaque roots. + (JSC::JSAPIWrapperObject::visitChildren): We now call out to scanExternalObjectGraph, which handles adding all Objective-C + objects to the set of opaque roots. + * API/JSAPIWrapperObject.h: + (JSAPIWrapperObject): + * API/JSContext.mm: Moved dealloc to its proper place in the main implementation. + (-[JSContext dealloc]): + * API/JSVirtualMachine.h: + * API/JSVirtualMachine.mm: + (-[JSVirtualMachine initWithContextGroupRef:]): + (-[JSVirtualMachine dealloc]): + (getInternalObjcObject): Helper funciton to get the Objective-C object out of JSManagedValues or JSValues if there is one. + (-[JSVirtualMachine addManagedReference:withOwner:]): Adds the Objective-C object to the set of objects + owned by the owner object in that particular virtual machine. + (-[JSVirtualMachine removeManagedReference:withOwner:]): Removes the relationship between the two objects. + (-[JSVirtualMachine externalObjectGraph]): + (scanExternalObjectGraph): Does a depth-first search of the external object graph in a particular virtual machine starting at + the specified root. Each new object it encounters it adds to the set of opaque roots. These opaque roots will keep their + corresponding wrapper objects alive if they have them. + * API/JSManagedReferenceInternal.h: Added. + * API/JSVirtualMachine.mm: Added the per-JSVirtualMachine map between objects and the objects they own, which is more formally + known as that virtual machine's external object graph. + * API/JSWrapperMap.mm: + (-[JSWrapperMap dealloc]): We were leaking this before :-( + (-[JSVirtualMachine initWithContextGroupRef:]): + (-[JSVirtualMachine dealloc]): + (-[JSVirtualMachine externalObjectGraph]): + * API/JSVirtualMachineInternal.h: + * API/tests/testapi.mm: Added two new tests using the TinyDOMNode class. The first tests that a custom property added to a wrapper + doesn't vanish after GC, even though that wrapper isn't directly accessible to the JS garbage collector but is accessible through + the external Objective-C object graph. The second test makes sure that adding an object to the external object graph with the same + owner doesn't cause any sort of problems. + (+[TinyDOMNode sharedVirtualMachine]): + (-[TinyDOMNode init]): + (-[TinyDOMNode dealloc]): + (-[TinyDOMNode appendChild:]): + (-[TinyDOMNode numberOfChildren]): + (-[TinyDOMNode childAtIndex:]): + (-[TinyDOMNode removeChildAtIndex:]): + * JavaScriptCore.xcodeproj/project.pbxproj: + * heap/SlotVisitor.h: + (SlotVisitor): + * heap/SlotVisitorInlines.h: + (JSC::SlotVisitor::containsOpaqueRootTriState): Added a new method to SlotVisitor to allow scanExternalObjectGraph to have a + thread-safe view of opaque roots during parallel marking. The set of opaque roots available to any one SlotVisitor isn't guaranteed + to be 100% correct, but that just results in a small duplication of work in scanExternalObjectGraph. To indicate this change for + false negatives we return a TriState that's either true or mixed, but never false. + +2013-03-21 Mark Lam <mark.lam@apple.com> + + Fix O(n^2) op_debug bytecode charPosition to column computation. + https://bugs.webkit.org/show_bug.cgi?id=112957. + + Reviewed by Geoffrey Garen. + + The previous algorithm does a linear reverse scan of the source string + to find the line start for any given char position. This results in a + O(n^2) algortithm when the source string has no line breaks. + + The new algorithm computes a line start column table for a + SourceProvider on first use. This line start table is used to fix up + op_debug's charPosition operand into a column operand when an + UnlinkedCodeBlock is linked into a CodeBlock. The initialization of + the line start table is O(n), and the CodeBlock column fix up is + O(log(n)). + + * bytecode/CodeBlock.cpp: + (JSC::CodeBlock::dumpBytecode): + (JSC::CodeBlock::CodeBlock): - do column fix up. + * interpreter/Interpreter.cpp: + (JSC::Interpreter::debug): - no need to do column fixup anymore. + * interpreter/Interpreter.h: + * jit/JITStubs.cpp: + (JSC::DEFINE_STUB_FUNCTION): + * llint/LLIntSlowPaths.cpp: + (JSC::LLInt::LLINT_SLOW_PATH_DECL): + * parser/SourceProvider.cpp: + (JSC::SourceProvider::lineStarts): + (JSC::charPositionExtractor): + (JSC::SourceProvider::charPositionToColumnNumber): + - initialize line start column table if needed. + - look up line start for the given char position. + * parser/SourceProvider.h: + +2013-03-21 Filip Pizlo <fpizlo@apple.com> + + JSC profiler should have an at-a-glance report of the success of DFG optimization + https://bugs.webkit.org/show_bug.cgi?id=112988 + + Reviewed by Geoffrey Garen. + + * dfg/DFGByteCodeParser.cpp: + (JSC::DFG::ByteCodeParser::handleCall): + (JSC::DFG::ByteCodeParser::handleGetById): + (JSC::DFG::ByteCodeParser::parseBlock): + * profiler/ProfilerCompilation.cpp: + (JSC::Profiler::Compilation::Compilation): + (JSC::Profiler::Compilation::toJS): + * profiler/ProfilerCompilation.h: + (JSC::Profiler::Compilation::noticeInlinedGetById): + (JSC::Profiler::Compilation::noticeInlinedPutById): + (JSC::Profiler::Compilation::noticeInlinedCall): + (Compilation): + * runtime/CommonIdentifiers.h: + +2013-03-21 Mark Lam <mark.lam@apple.com> + + Fix lexer charPosition computation when "rewind"ing the lexer. + https://bugs.webkit.org/show_bug.cgi?id=112952. + + Reviewed by Michael Saboff. + + Changed the Lexer to no longer keep a m_charPosition. Instead, we compute + currentCharPosition() from m_code and m_codeStartPlusOffset, where + m_codeStartPlusOffset is the SourceProvider m_codeStart + the SourceCode + start offset. This ensures that the charPosition is always in sync with + m_code. + + * parser/Lexer.cpp: + (JSC::::setCode): + (JSC::::internalShift): + (JSC::::shift): + (JSC::::lex): + * parser/Lexer.h: + (JSC::Lexer::currentCharPosition): + (JSC::::lexExpectIdentifier): + +2013-03-21 Alberto Garcia <agarcia@igalia.com> + + [BlackBerry] GCActivityCallback: replace JSLock with JSLockHolder + https://bugs.webkit.org/show_bug.cgi?id=112448 + + Reviewed by Xan Lopez. + + This changed in r121381. + + * runtime/GCActivityCallbackBlackBerry.cpp: + (JSC::DefaultGCActivityCallback::doWork): + +2013-03-21 Mark Hahnenberg <mhahnenberg@apple.com> + + Objective-C API: wrapperClass holds a static JSClassRef, which causes JSGlobalObjects to leak + https://bugs.webkit.org/show_bug.cgi?id=112856 + + Reviewed by Geoffrey Garen. + + Through a very convoluted path that involves the caching of prototypes on the JSClassRef, we can leak + JSGlobalObjects when inserting an Objective-C object into multiple independent JSContexts. + + * API/JSAPIWrapperObject.cpp: Removed. + * API/JSAPIWrapperObject.h: + (JSAPIWrapperObject): + * API/JSAPIWrapperObject.mm: Copied from Source/JavaScriptCore/API/JSAPIWrapperObject.cpp. Made this an + Objective-C++ file so that we can call release on the wrappedObject. Also added a WeakHandleOwner for + JSAPIWrapperObjects. This will also be used in a future patch for https://bugs.webkit.org/show_bug.cgi?id=112608. + (JSAPIWrapperObjectHandleOwner): + (jsAPIWrapperObjectHandleOwner): + (JSAPIWrapperObjectHandleOwner::finalize): This finalize replaces the old finalize that was done through + the C API. + (JSC::JSAPIWrapperObject::finishCreation): Allocate the WeakImpl. Balanced in finalize. + (JSC::JSAPIWrapperObject::setWrappedObject): We now do the retain of the wrappedObject here rather than in random + places scattered around JSWrapperMap.mm + * API/JSObjectRef.cpp: Added some ifdefs for platforms that don't support the Obj-C API. + (JSObjectGetPrivate): Ditto. + (JSObjectSetPrivate): Ditto. + (JSObjectGetPrivateProperty): Ditto. + (JSObjectSetPrivateProperty): Ditto. + (JSObjectDeletePrivateProperty): Ditto. + * API/JSValueRef.cpp: Ditto. + (JSValueIsObjectOfClass): Ditto. + * API/JSWrapperMap.mm: Remove wrapperClass(). + (objectWithCustomBrand): Change to no longer use a parent class, which was only used to give the ability to + finalize wrapper objects. + (-[JSObjCClassInfo initWithContext:forClass:superClassInfo:]): Change to no longer use wrapperClass(). + (-[JSObjCClassInfo allocateConstructorAndPrototypeWithSuperClassInfo:]): Ditto. + (tryUnwrapObjcObject): We now check if the object inherits from JSAPIWrapperObject. + * API/tests/testapi.mm: Added a test that exports an Objective-C object to two different JSContexts and makes + sure that the first one is collected properly by using a weak JSManagedValue for the wrapper in the first JSContext. + * CMakeLists.txt: Build file modifications. + * GNUmakefile.list.am: Ditto. + * JavaScriptCore.gypi: Ditto. + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: Ditto. + * JavaScriptCore.vcxproj/JavaScriptCore.vcxproj: Ditto. + * JavaScriptCore.vcxproj/JavaScriptCore.vcxproj.filters: Ditto. + * JavaScriptCore.xcodeproj/project.pbxproj: Ditto. + * runtime/JSGlobalObject.cpp: More ifdefs for unsupported platforms. + (JSC::JSGlobalObject::reset): Ditto. + (JSC::JSGlobalObject::visitChildren): Ditto. + * runtime/JSGlobalObject.h: Ditto. + (JSGlobalObject): Ditto. + (JSC::JSGlobalObject::objcCallbackFunctionStructure): Ditto. + +2013-03-21 Anton Muhin <antonm@chromium.org> + + Unreviewed, rolling out r146483. + http://trac.webkit.org/changeset/146483 + https://bugs.webkit.org/show_bug.cgi?id=111695 + + Breaks debug builds. + + * bytecode/GlobalResolveInfo.h: Removed property svn:mergeinfo. + +2013-03-21 Gabor Rapcsanyi <rgabor@webkit.org> + + Implement LLInt for CPU(ARM_TRADITIONAL) + https://bugs.webkit.org/show_bug.cgi?id=97589 + + Reviewed by Zoltan Herczeg. + + Enable LLInt for ARMv5 and ARMv7 traditional as well. + + * llint/LLIntOfflineAsmConfig.h: + * llint/LowLevelInterpreter.asm: + * llint/LowLevelInterpreter32_64.asm: + * offlineasm/arm.rb: + * offlineasm/backends.rb: + * offlineasm/instructions.rb: + +2013-03-20 Cosmin Truta <ctruta@blackberry.com> + + [QNX][ARM] REGRESSION(r135330): Various failures in Octane + https://bugs.webkit.org/show_bug.cgi?id=112863 + + Reviewed by Yong Li. + + This was fixed in http://trac.webkit.org/changeset/146396 on Linux only. + Enable this fix on QNX. + + * assembler/ARMv7Assembler.h: + (ARMv7Assembler): + (JSC::ARMv7Assembler::replaceWithJump): + (JSC::ARMv7Assembler::maxJumpReplacementSize): + * assembler/MacroAssemblerARMv7.h: + (JSC::MacroAssemblerARMv7::revertJumpReplacementToBranchPtrWithPatch): + +2013-03-20 Filip Pizlo <fpizlo@apple.com> + + Fix indentation of JSString.h + + Rubber stamped by Mark Hahnenberg. + + * runtime/JSString.h: + +2013-03-20 Filip Pizlo <fpizlo@apple.com> + + "" + x where x is not a string should be optimized by the DFG to some manner of ToString conversion + https://bugs.webkit.org/show_bug.cgi?id=112845 + + Reviewed by Mark Hahnenberg. + + I like to do "" + x. So I decided to make DFG recognize it, and related idioms. + + * dfg/DFGFixupPhase.cpp: + (JSC::DFG::FixupPhase::fixupNode): + (JSC::DFG::FixupPhase::fixupToPrimitive): + (FixupPhase): + (JSC::DFG::FixupPhase::fixupToString): + (JSC::DFG::FixupPhase::attemptToMakeFastStringAdd): + * dfg/DFGPredictionPropagationPhase.cpp: + (JSC::DFG::resultOfToPrimitive): + (DFG): + (JSC::DFG::PredictionPropagationPhase::propagate): + * dfg/DFGPredictionPropagationPhase.h: + (DFG): + +2013-03-20 Zoltan Herczeg <zherczeg@webkit.org> + + ARMv7 replaceWithJump ASSERT failure after r135330. + https://bugs.webkit.org/show_bug.cgi?id=103146 + + Reviewed by Filip Pizlo. + + On Linux, the 24 bit distance range of jumps sometimes does not + enough to cover all targets addresses. This patch supports jumps + outside of this range using a mov/movt/bx 10 byte long sequence. + + * assembler/ARMv7Assembler.h: + (ARMv7Assembler): + (JSC::ARMv7Assembler::revertJumpTo_movT3movtcmpT2): + (JSC::ARMv7Assembler::nopw): + (JSC::ARMv7Assembler::label): + (JSC::ARMv7Assembler::replaceWithJump): + (JSC::ARMv7Assembler::maxJumpReplacementSize): + * assembler/MacroAssemblerARMv7.h: + (JSC::MacroAssemblerARMv7::revertJumpReplacementToBranchPtrWithPatch): + +2013-03-20 Mark Hahnenberg <mhahnenberg@apple.com> + + Objective-C API: Fix over-releasing in allocateConstructorAndPrototypeWithSuperClassInfo: + https://bugs.webkit.org/show_bug.cgi?id=112832 + + Reviewed by Geoffrey Garen. + + If either the m_constructor or m_prototype (but not both) is collected, we will call + allocateConstructorAndPrototypeWithSuperClassInfo, which will create a new object to replace the one + that was collected, but at the end of the method we call release on both of them. + This is incorrect since we autorelease the JSValue in the case that the object doesn't need to be + reallocated. Thus we'll end up overreleasing later during the drain of the autorelease pool. + + * API/JSWrapperMap.mm: + (objectWithCustomBrand): We no longer alloc here. We instead call the JSValue valueWithValue class method, + which autoreleases for us. + (-[JSObjCClassInfo allocateConstructorAndPrototypeWithSuperClassInfo:]): We no longer call release on the + constructor or prototype JSValues. + * API/tests/testapi.mm: Added a new test that crashes on ToT due to over-releasing. + +2013-03-19 Filip Pizlo <fpizlo@apple.com> + + It's called "Hash Consing" not "Hash Consting" + https://bugs.webkit.org/show_bug.cgi?id=112768 + + Rubber stamped by Mark Hahnenberg. + + See http://en.wikipedia.org/wiki/Hash_consing + + * heap/GCThreadSharedData.cpp: + (JSC::GCThreadSharedData::GCThreadSharedData): + (JSC::GCThreadSharedData::reset): + * heap/GCThreadSharedData.h: + (GCThreadSharedData): + * heap/SlotVisitor.cpp: + (JSC::SlotVisitor::SlotVisitor): + (JSC::SlotVisitor::setup): + (JSC::SlotVisitor::reset): + (JSC::JSString::tryHashConsLock): + (JSC::JSString::releaseHashConsLock): + (JSC::JSString::shouldTryHashCons): + (JSC::SlotVisitor::internalAppend): + * heap/SlotVisitor.h: + (SlotVisitor): + * runtime/JSGlobalData.cpp: + (JSC::JSGlobalData::JSGlobalData): + * runtime/JSGlobalData.h: + (JSGlobalData): + (JSC::JSGlobalData::haveEnoughNewStringsToHashCons): + (JSC::JSGlobalData::resetNewStringsSinceLastHashCons): + * runtime/JSString.h: + (JSC::JSString::finishCreation): + (JSString): + (JSC::JSString::isHashConsSingleton): + (JSC::JSString::clearHashConsSingleton): + (JSC::JSString::setHashConsSingleton): + +2013-03-20 Filip Pizlo <fpizlo@apple.com> + + DFG implementation of op_strcat should inline rope allocations + https://bugs.webkit.org/show_bug.cgi?id=112780 + + Reviewed by Oliver Hunt. + + This gets rid of the StrCat node and adds a MakeRope node. The MakeRope node can + take either two or three operands, and allocates a rope string with either two or + three fibers. (The magic choice of three children for non-VarArg nodes happens to + match exactly with the magic choice of three fibers for rope strings.) + + ValueAdd on KnownString is replaced with MakeRope with two children. + + StrCat gets replaced by an appropriate sequence of MakeRope's. + + MakeRope does not do the dynamic check to see if its children are empty strings. + This is replaced by a static check, instead. The downside is that we may use more + memory if the strings passed to MakeRope turn out to dynamically be empty. The + upside is that we do fewer checks in the cases where either the strings are not + empty, or where the strings are statically known to be empty. I suspect both of + those cases are more common, than the case where the string is dynamically empty. + + This also results in some badness for X86. MakeRope needs six registers if it is + allocating a three-rope. We don't have six registers to spare on X86. Currently, + the code side-steps this problem by just never usign three-ropes in optimized + code on X86. All other architectures, including X86_64, don't have this problem. + + This is a shocking speed-up. 9% progressions on both V8/splay and + SunSpider/date-format-xparb. 1% progression on V8v7 overall, and ~0.5% progression + on SunSpider. 2x speed-up on microbenchmarks that test op_strcat. + + * dfg/DFGAbstractState.cpp: + (JSC::DFG::AbstractState::executeEffects): + * dfg/DFGAdjacencyList.h: + (AdjacencyList): + (JSC::DFG::AdjacencyList::removeEdge): + * dfg/DFGArgumentsSimplificationPhase.cpp: + (JSC::DFG::ArgumentsSimplificationPhase::removeArgumentsReferencingPhantomChild): + * dfg/DFGBackwardsPropagationPhase.cpp: + (JSC::DFG::BackwardsPropagationPhase::propagate): + * dfg/DFGByteCodeParser.cpp: + (JSC::DFG::ByteCodeParser::parseBlock): + * dfg/DFGCSEPhase.cpp: + (JSC::DFG::CSEPhase::putStructureStoreElimination): + (JSC::DFG::CSEPhase::eliminateIrrelevantPhantomChildren): + (JSC::DFG::CSEPhase::performNodeCSE): + * dfg/DFGDCEPhase.cpp: + (JSC::DFG::DCEPhase::eliminateIrrelevantPhantomChildren): + * dfg/DFGFixupPhase.cpp: + (JSC::DFG::FixupPhase::fixupNode): + (JSC::DFG::FixupPhase::createToString): + (JSC::DFG::FixupPhase::attemptToForceStringArrayModeByToStringConversion): + (JSC::DFG::FixupPhase::convertStringAddUse): + (FixupPhase): + (JSC::DFG::FixupPhase::convertToMakeRope): + (JSC::DFG::FixupPhase::fixupMakeRope): + (JSC::DFG::FixupPhase::attemptToMakeFastStringAdd): + * dfg/DFGNodeType.h: + (DFG): + * dfg/DFGOperations.cpp: + * dfg/DFGOperations.h: + * dfg/DFGPredictionPropagationPhase.cpp: + (JSC::DFG::PredictionPropagationPhase::propagate): + * dfg/DFGSpeculativeJIT.cpp: + (JSC::DFG::SpeculativeJIT::compileAdd): + (JSC::DFG::SpeculativeJIT::compileMakeRope): + (DFG): + * dfg/DFGSpeculativeJIT.h: + (JSC::DFG::SpeculativeJIT::callOperation): + (SpeculativeJIT): + (JSC::DFG::SpeculateCellOperand::SpeculateCellOperand): + (JSC::DFG::SpeculateCellOperand::~SpeculateCellOperand): + (JSC::DFG::SpeculateCellOperand::gpr): + (JSC::DFG::SpeculateCellOperand::use): + * dfg/DFGSpeculativeJIT32_64.cpp: + (JSC::DFG::SpeculativeJIT::compile): + * dfg/DFGSpeculativeJIT64.cpp: + (JSC::DFG::SpeculativeJIT::compile): + * runtime/JSString.h: + (JSRopeString): + +2013-03-20 Peter Gal <galpeter@inf.u-szeged.hu> + + Implement and32 on MIPS platform + https://bugs.webkit.org/show_bug.cgi?id=112665 + + Reviewed by Zoltan Herczeg. + + * assembler/MacroAssemblerMIPS.h: + (JSC::MacroAssemblerMIPS::and32): Added missing method. + (MacroAssemblerMIPS): + +2013-03-20 Mark Lam <mark.lam@apple.com> + + Fix incorrect debugger column number value. + https://bugs.webkit.org/show_bug.cgi?id=112741. + + Reviewed by Oliver Hunt. + + 1. In lexer, parser, and debugger code, renamed column to charPosition. + 2. Convert the charPosition to the equivalent column number before + passing it to the debugger. + 3. Changed ScopeNodes to take both a startLocation and an endLocation. + This allows FunctionBodyNodes, ProgramNodes, and EvalNodess to emit + correct debug hooks with correct starting line and column numbers. + 4. Fixed the Lexer to not reset the charPosition (previously + columnNumber) in Lexer::lex(). + + * JavaScriptCore.order: + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCoreExports.def: + * JavaScriptCore.vcxproj/JavaScriptCoreExportGenerator/JavaScriptCoreExports.def.in: + * bytecode/CodeBlock.cpp: + (JSC::CodeBlock::dumpBytecode): + * bytecompiler/BytecodeGenerator.cpp: + (JSC::BytecodeGenerator::emitDebugHook): + * bytecompiler/BytecodeGenerator.h: + (JSC::BytecodeGenerator::emitExpressionInfo): + * bytecompiler/NodesCodegen.cpp: + (JSC::ArrayNode::toArgumentList): + (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): + * interpreter/Interpreter.cpp: + (JSC::Interpreter::debug): + - convert charPosition to column for the debugger. + * interpreter/Interpreter.h: + * jit/JITStubs.cpp: + (DEFINE_STUB_FUNCTION(void, op_debug)): + * llint/LLIntSlowPaths.cpp: + (LLINT_SLOW_PATH_DECL(slow_op_debug)): + * parser/ASTBuilder.h: + (JSC::ASTBuilder::createFunctionExpr): + (JSC::ASTBuilder::createFunctionBody): + (JSC::ASTBuilder::createGetterOrSetterProperty): + (JSC::ASTBuilder::createFuncDeclStatement): + (JSC::ASTBuilder::createBlockStatement): + (JSC::ASTBuilder::createExprStatement): + (JSC::ASTBuilder::createIfStatement): + (JSC::ASTBuilder::createForLoop): + (JSC::ASTBuilder::createForInLoop): + (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::createWithStatement): + (JSC::ASTBuilder::createThrowStatement): + (JSC::ASTBuilder::createDebugger): + (JSC::ASTBuilder::createConstStatement): + * parser/Lexer.cpp: + (JSC::::setCode): + (JSC::::internalShift): + (JSC::::shift): + (JSC::::lex): + * parser/Lexer.h: + (JSC::Lexer::currentCharPosition): + (Lexer): + (JSC::::lexExpectIdentifier): + * parser/NodeConstructors.h: + (JSC::Node::Node): + * parser/Nodes.cpp: + (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: + (JSC::Node::charPosition): + (Node): + (StatementNode): + (JSC::StatementNode::lastLine): + (ScopeNode): + (JSC::ScopeNode::startLine): + (JSC::ScopeNode::startCharPosition): + (ProgramNode): + (EvalNode): + (FunctionBodyNode): + * parser/Parser.cpp: + (JSC::::Parser): + (JSC::::parseFunctionBody): + (JSC::::parseFunctionInfo): + * parser/Parser.h: + (JSC::::parse): + * parser/ParserTokens.h: + (JSC::JSTokenLocation::JSTokenLocation): + (JSTokenLocation): + * parser/SyntaxChecker.h: + (JSC::SyntaxChecker::createFunctionBody): + +2013-03-20 Csaba Osztrogonác <ossy@webkit.org> + + REGRESSION(r146089): It broke 20 sputnik tests on ARM traditional and Thumb2 + https://bugs.webkit.org/show_bug.cgi?id=112676 + + Rubber-stamped by Filip Pizlo. + + Add one more EABI_32BIT_DUMMY_ARG to make DFG JIT ARM EABI compatible + again after r146089 similar to https://bugs.webkit.org/show_bug.cgi?id=84449 + + * dfg/DFGSpeculativeJIT.h: + (JSC::DFG::SpeculativeJIT::callOperation): + +2013-03-19 Michael Saboff <msaboff@apple.com> + + Crash when loading http://www.jqchart.com/jquery/gauges/RadialGauge/LiveData + https://bugs.webkit.org/show_bug.cgi?id=112694 + + Reviewed by Filip Pizlo. + + We were trying to convert an NewArray to a Phantom, but convertToPhantom doesn't handle + nodes with variable arguments. Added code to insert a Phantom node in front of all the + live children of a var args node. Added ASSERT not var args for convertToPhantom to + catch any other similar cases. Added a new convertToPhantomUnchecked() for converting + var arg nodes. + + * dfg/DFGDCEPhase.cpp: + (JSC::DFG::DCEPhase::run): + * dfg/DFGNode.h: + (Node): + (JSC::DFG::Node::setOpAndDefaultNonExitFlags): Added ASSERT(!(m_flags & NodeHasVarArgs)) + (JSC::DFG::Node::setOpAndDefaultNonExitFlagsUnchecked): + (JSC::DFG::Node::convertToPhantomUnchecked): + +2013-03-19 Mark Hahnenberg <mhahnenberg@apple.com> + + Crash in SpeculativeJIT::fillSpeculateIntInternal<false> on http://bellard.org/jslinux + https://bugs.webkit.org/show_bug.cgi?id=112738 + + Reviewed by Filip Pizlo. + + * dfg/DFGFixupPhase.cpp: + (JSC::DFG::FixupPhase::fixIntEdge): We shouldn't be killing this node because it could be + referenced by other people. + +2013-03-19 Oliver Hunt <oliver@apple.com> + + RELEASE_ASSERT fires in exception handler lookup + + RS=Geoff Garen. + + Temporarily switch this RELEASE_ASSERT into a regular ASSERT + as currently this is producing fairly bad crashiness. + + * bytecode/CodeBlock.cpp: + (JSC::CodeBlock::handlerForBytecodeOffset): + +2013-03-18 Filip Pizlo <fpizlo@apple.com> + + DFG should optimize StringObject.length and StringOrStringObject.length + https://bugs.webkit.org/show_bug.cgi?id=112658 + + Reviewed by Mark Hahnenberg. + + Implemented by injecting a ToString(StringObject:@a) or ToString(StringOrStringObject:@a) prior + to GetArrayLength with ArrayMode(Array::String) if @a is predicted StringObject or + StringOrStringObject. + + * dfg/DFGFixupPhase.cpp: + (JSC::DFG::FixupPhase::fixupNode): + (JSC::DFG::FixupPhase::createToString): + (FixupPhase): + (JSC::DFG::FixupPhase::attemptToForceStringArrayModeByToStringConversion): + (JSC::DFG::FixupPhase::convertStringAddUse): + +2013-03-19 Gabor Rapcsanyi <rgabor@webkit.org> + + Implement and32 on ARMv7 and ARM traditional platforms + https://bugs.webkit.org/show_bug.cgi?id=112663 + + Reviewed by Zoltan Herczeg. + + * assembler/MacroAssemblerARM.h: + (JSC::MacroAssemblerARM::and32): Add missing method. + (MacroAssemblerARM): + * assembler/MacroAssemblerARMv7.h: + (JSC::MacroAssemblerARMv7::and32): Add missing method. + (MacroAssemblerARMv7): + +2013-03-18 Filip Pizlo <fpizlo@apple.com> + + DFG ToString generic cases should work correctly + https://bugs.webkit.org/show_bug.cgi?id=112654 + <rdar://problem/13447250> + + Reviewed by Geoffrey Garen. + + * dfg/DFGSpeculativeJIT.cpp: + (JSC::DFG::SpeculativeJIT::compileToStringOnCell): + * dfg/DFGSpeculativeJIT32_64.cpp: + (JSC::DFG::SpeculativeJIT::compile): + * dfg/DFGSpeculativeJIT64.cpp: + (JSC::DFG::SpeculativeJIT::compile): + +2013-03-18 Michael Saboff <msaboff@apple.com> + + Unreviewed build fix for 32 bit builds. + + * dfg/DFGSpeculativeJIT32_64.cpp: + (JSC::DFG::SpeculativeJIT::compile): + +2013-03-18 Michael Saboff <msaboff@apple.com> + + EFL: Unsafe branch detected in compilePutByValForFloatTypedArray() + https://bugs.webkit.org/show_bug.cgi?id=112609 + + Reviewed by Geoffrey Garen. + + Created local valueFPR and scratchFPR and filled them with valueOp.fpr() and scratch.fpr() + respectively so that if valueOp.fpr() causes a spill during allocation, it occurs before the + branch and also to follow convention. Added register allocation checks to FPRTemporary. + Cleaned up a couple of other places to follow the "AllocatVirtualRegType foo, get machine + reg from foo" pattern. + + * dfg/DFGSpeculativeJIT.cpp: + (JSC::DFG::SpeculativeJIT::compilePutByValForFloatTypedArray): + * dfg/DFGSpeculativeJIT.h: + (JSC::DFG::SpeculativeJIT::fprAllocate): + * dfg/DFGSpeculativeJIT32_64.cpp: + (JSC::DFG::SpeculativeJIT::convertToDouble): + (JSC::DFG::SpeculativeJIT::compile): + * dfg/DFGSpeculativeJIT64.cpp: + (JSC::DFG::SpeculativeJIT::compile): + +2013-03-18 Filip Pizlo <fpizlo@apple.com> + + DFG should inline binary string concatenations (i.e. ValueAdd with string children) + https://bugs.webkit.org/show_bug.cgi?id=112599 + + Reviewed by Oliver Hunt. + + This does as advertised: if you do x + y where x and y are strings, you'll get + a fast inlined JSRopeString allocation (along with whatever checks are necessary). + It also does good things if either x or y (or both) are StringObjects, or some + other thing like StringOrStringObject. It also lays the groundwork for making this + fast if either x or y are numbers, or some other reasonably-cheap-to-convert + value. + + * dfg/DFGAbstractState.cpp: + (JSC::DFG::AbstractState::executeEffects): + * dfg/DFGFixupPhase.cpp: + (JSC::DFG::FixupPhase::fixupNode): + (FixupPhase): + (JSC::DFG::FixupPhase::isStringObjectUse): + (JSC::DFG::FixupPhase::convertStringAddUse): + (JSC::DFG::FixupPhase::attemptToMakeFastStringAdd): + * dfg/DFGOperations.cpp: + * dfg/DFGOperations.h: + * dfg/DFGSpeculativeJIT.cpp: + (JSC::DFG::SpeculativeJIT::compileAdd): + * dfg/DFGSpeculativeJIT.h: + (JSC::DFG::SpeculativeJIT::callOperation): + (SpeculativeJIT): + (JSC::DFG::SpeculativeJIT::emitAllocateJSCell): + (JSC::DFG::SpeculativeJIT::emitAllocateJSObject): + * runtime/JSString.h: + (JSC::JSString::offsetOfFlags): + (JSString): + (JSRopeString): + (JSC::JSRopeString::offsetOfFibers): + +2013-03-18 Filip Pizlo <fpizlo@apple.com> + + JSC_NATIVE_FUNCTION() takes an identifier for the name and then uses #name, which is unsafe if name was already #define'd to something else + https://bugs.webkit.org/show_bug.cgi?id=112639 + + Reviewed by Michael Saboff. + + Change it to take a string instead. + + * runtime/JSObject.h: + (JSC): + * runtime/ObjectPrototype.cpp: + (JSC::ObjectPrototype::finishCreation): + * runtime/StringPrototype.cpp: + (JSC::StringPrototype::finishCreation): + +2013-03-18 Brent Fulgham <bfulgham@webkit.org> + + [WinCairo] Get build working under VS2010. + https://bugs.webkit.org/show_bug.cgi?id=112604 + + Reviewed by Tim Horton. + + * JavaScriptCore.vcxproj/testapi/testapi.vcxproj: Use CFLite-specific + build target (standard version links against CoreFoundation.lib + instead of CFLite.lib). + * JavaScriptCore.vcxproj/testapi/testapiCommonCFLite.props: Added. + * JavaScriptCore.vcxproj/testapi/testapiDebugCFLite.props: Added. + * JavaScriptCore.vcxproj/testapi/testapiReleaseCFLite.props: Added. + +2013-03-18 Roger Fong <roger_fong@apple.com> + + AppleWin VS2010 Debug configuration build fix.. + + * JavaScriptCore.vcxproj/JavaScriptCore.vcxproj: + +2013-03-18 Brent Fulgham <bfulgham@webkit.org> + + [WinCairo] Get build working under VS2010. + https://bugs.webkit.org/show_bug.cgi?id=112604 + + Reviewed by Tim Horton. + + * JavaScriptCore.vcxproj/JavaScriptCore.vcxproj: Add build targets for + Debug_WinCairo and Release_WinCairo using CFLite. + * JavaScriptCore.vcxproj/JavaScriptCoreCFLite.props: Added. + * JavaScriptCore.vcxproj/JavaScriptCoreDebugCFLite.props: Added. + * JavaScriptCore.vcxproj/JavaScriptCoreExportGenerator/JavaScriptCoreExportGenerator.vcxproj: + Add Debug_WinCairo and Release_WinCairo build targets to + make sure headers are copied to proper build folder. + * JavaScriptCore.vcxproj/JavaScriptCoreGenerated.vcxproj: Ditto. + * JavaScriptCore.vcxproj/JavaScriptCoreReleaseCFLite.props: Added. + * JavaScriptCore.vcxproj/LLInt/LLIntAssembly/LLIntAssembly.vcxproj: + Add Debug_WinCairo and Release_WinCairo build targets to + make sure headers are copied to proper build folder. + * JavaScriptCore.vcxproj/LLInt/LLIntDesiredOffsets/LLIntDesiredOffsets.vcxproj: + Ditto. + * JavaScriptCore.vcxproj/LLInt/LLIntOffsetsExtractor/LLIntOffsetsExtractor.vcxproj: + Ditto. + * JavaScriptCore.vcxproj/jsc/jsc.vcxproj: Ditto. + * JavaScriptCore.vcxproj/testRegExp/testRegExp.vcxproj: Ditto. + * JavaScriptCore.vcxproj/testapi/testapi.vcxproj: Ditto. + +2013-03-18 Michael Saboff <msaboff@apple.com> + + Potentially unsafe register allocations in DFG code generation + https://bugs.webkit.org/show_bug.cgi?id=112477 + + Reviewed by Geoffrey Garen. + + Moved allocation of temporary GPRs to be before any generated branches in the functions below. + + * dfg/DFGSpeculativeJIT32_64.cpp: + (JSC::DFG::SpeculativeJIT::compileObjectToObjectOrOtherEquality): + (JSC::DFG::SpeculativeJIT::compilePeepHoleObjectToObjectOrOtherEquality): + (JSC::DFG::SpeculativeJIT::compileObjectOrOtherLogicalNot): + * dfg/DFGSpeculativeJIT64.cpp: + (JSC::DFG::SpeculativeJIT::compileObjectToObjectOrOtherEquality): + (JSC::DFG::SpeculativeJIT::compilePeepHoleObjectToObjectOrOtherEquality): + (JSC::DFG::SpeculativeJIT::compileObjectOrOtherLogicalNot): + +2013-03-15 Filip Pizlo <fpizlo@apple.com> + + DFG string conversions and allocations should be inlined + https://bugs.webkit.org/show_bug.cgi?id=112376 + + Reviewed by Geoffrey Garen. + + This turns new String(), String(), String.prototype.valueOf(), and + String.prototype.toString() into intrinsics. It gives the DFG the ability to handle + conversions from StringObject to JSString and vice-versa, and also gives it the + ability to handle cases where a variable may be either a StringObject or a JSString. + To do this, I added StringObject to value profiling (and removed the stale + distinction between Myarguments and Foreignarguments). I also cleaned up ToPrimitive + handling, using some of the new functionality but also taking advantage of the + existence of Identity(String:@a). + + This is a 2% SunSpider speed-up. Also there are some speed-ups on V8v7 and Kraken. + On microbenchmarks that stress new String() this is a 14x speed-up. + + * CMakeLists.txt: + * DerivedSources.make: + * DerivedSources.pri: + * GNUmakefile.list.am: + * bytecode/CodeBlock.h: + (CodeBlock): + (JSC::CodeBlock::hasExitSite): + (JSC): + * bytecode/DFGExitProfile.cpp: + (JSC::DFG::ExitProfile::hasExitSite): + (DFG): + * bytecode/DFGExitProfile.h: + (ExitProfile): + (JSC::DFG::ExitProfile::hasExitSite): + * bytecode/ExitKind.cpp: + (JSC::exitKindToString): + * bytecode/ExitKind.h: + * bytecode/SpeculatedType.cpp: + (JSC::dumpSpeculation): + (JSC::speculationToAbbreviatedString): + (JSC::speculationFromClassInfo): + * bytecode/SpeculatedType.h: + (JSC): + (JSC::isStringObjectSpeculation): + (JSC::isStringOrStringObjectSpeculation): + * create_hash_table: + * dfg/DFGAbstractState.cpp: + (JSC::DFG::AbstractState::executeEffects): + * dfg/DFGAbstractState.h: + (JSC::DFG::AbstractState::filterEdgeByUse): + * dfg/DFGByteCodeParser.cpp: + (ByteCodeParser): + (JSC::DFG::ByteCodeParser::handleCall): + (JSC::DFG::ByteCodeParser::emitArgumentPhantoms): + (DFG): + (JSC::DFG::ByteCodeParser::handleConstantInternalFunction): + * dfg/DFGCSEPhase.cpp: + (JSC::DFG::CSEPhase::putStructureStoreElimination): + * dfg/DFGEdge.h: + (JSC::DFG::Edge::shift): + * dfg/DFGFixupPhase.cpp: + (JSC::DFG::FixupPhase::fixupNode): + (JSC::DFG::FixupPhase::isStringPrototypeMethodSane): + (FixupPhase): + (JSC::DFG::FixupPhase::canOptimizeStringObjectAccess): + (JSC::DFG::FixupPhase::observeUseKindOnNode): + * dfg/DFGGraph.h: + (JSC::DFG::Graph::hasGlobalExitSite): + (Graph): + (JSC::DFG::Graph::hasExitSite): + (JSC::DFG::Graph::clobbersWorld): + * dfg/DFGNode.h: + (JSC::DFG::Node::convertToToString): + (Node): + (JSC::DFG::Node::hasStructure): + (JSC::DFG::Node::shouldSpeculateStringObject): + (JSC::DFG::Node::shouldSpeculateStringOrStringObject): + * dfg/DFGNodeType.h: + (DFG): + * dfg/DFGOperations.cpp: + * dfg/DFGOperations.h: + * dfg/DFGPredictionPropagationPhase.cpp: + (JSC::DFG::PredictionPropagationPhase::propagate): + * dfg/DFGSpeculativeJIT.cpp: + (JSC::DFG::SpeculativeJIT::compileToStringOnCell): + (DFG): + (JSC::DFG::SpeculativeJIT::compileNewStringObject): + (JSC::DFG::SpeculativeJIT::speculateObject): + (JSC::DFG::SpeculativeJIT::speculateObjectOrOther): + (JSC::DFG::SpeculativeJIT::speculateString): + (JSC::DFG::SpeculativeJIT::speculateStringObject): + (JSC::DFG::SpeculativeJIT::speculateStringOrStringObject): + (JSC::DFG::SpeculativeJIT::speculate): + * dfg/DFGSpeculativeJIT.h: + (JSC::DFG::SpeculativeJIT::callOperation): + (SpeculativeJIT): + (JSC::DFG::SpeculateCellOperand::SpeculateCellOperand): + (DFG): + (JSC::DFG::SpeculativeJIT::speculateStringObjectForStructure): + * dfg/DFGSpeculativeJIT32_64.cpp: + (JSC::DFG::SpeculativeJIT::fillSpeculateCell): + (JSC::DFG::SpeculativeJIT::compile): + * dfg/DFGSpeculativeJIT64.cpp: + (JSC::DFG::SpeculativeJIT::fillSpeculateCell): + (JSC::DFG::SpeculativeJIT::compile): + * dfg/DFGUseKind.cpp: + (WTF::printInternal): + * dfg/DFGUseKind.h: + (JSC::DFG::typeFilterFor): + * interpreter/CallFrame.h: + (JSC::ExecState::regExpPrototypeTable): + * runtime/CommonIdentifiers.h: + * runtime/Intrinsic.h: + * runtime/JSDestructibleObject.h: + (JSDestructibleObject): + (JSC::JSDestructibleObject::classInfoOffset): + * runtime/JSGlobalData.cpp: + (JSC): + (JSC::JSGlobalData::JSGlobalData): + (JSC::JSGlobalData::~JSGlobalData): + * runtime/JSGlobalData.h: + (JSGlobalData): + * runtime/JSObject.cpp: + * runtime/JSObject.h: + (JSC): + * runtime/JSWrapperObject.h: + (JSC::JSWrapperObject::allocationSize): + (JSWrapperObject): + (JSC::JSWrapperObject::internalValueOffset): + (JSC::JSWrapperObject::internalValueCellOffset): + * runtime/StringPrototype.cpp: + (JSC): + (JSC::StringPrototype::finishCreation): + (JSC::StringPrototype::create): + * runtime/StringPrototype.h: + (StringPrototype): + +2013-03-18 Filip Pizlo <fpizlo@apple.com> + + ObjectPrototype properties should be eagerly created rather than lazily via static tables + https://bugs.webkit.org/show_bug.cgi?id=112539 + + Reviewed by Oliver Hunt. + + This is the first part of https://bugs.webkit.org/show_bug.cgi?id=112233. Rolling this + in first since it's the less-likely-to-be-broken part. + + * CMakeLists.txt: + * DerivedSources.make: + * DerivedSources.pri: + * GNUmakefile.list.am: + * interpreter/CallFrame.h: + (JSC::ExecState::objectConstructorTable): + * runtime/CommonIdentifiers.h: + * runtime/JSGlobalData.cpp: + (JSC): + (JSC::JSGlobalData::JSGlobalData): + (JSC::JSGlobalData::~JSGlobalData): + * runtime/JSGlobalData.h: + (JSGlobalData): + * runtime/JSObject.cpp: + (JSC::JSObject::putDirectNativeFunction): + (JSC): + * runtime/JSObject.h: + (JSObject): + (JSC): + * runtime/Lookup.cpp: + (JSC::setUpStaticFunctionSlot): + * runtime/ObjectPrototype.cpp: + (JSC): + (JSC::ObjectPrototype::finishCreation): + (JSC::ObjectPrototype::create): + * runtime/ObjectPrototype.h: + (ObjectPrototype): + +2013-03-16 Pratik Solanki <psolanki@apple.com> + + Disable High DPI Canvas on iOS + https://bugs.webkit.org/show_bug.cgi?id=112511 + + Reviewed by Joseph Pecoraro. + + * Configurations/FeatureDefines.xcconfig: + +2013-03-15 Andreas Kling <akling@apple.com> + + Don't also clone StructureRareData when cloning Structure. + <http://webkit.org/b/111672> + + Reviewed by Mark Hahnenberg. + + We were cloning a lot of StructureRareData with only the previousID pointer set since + the enumerationCache is not shared between clones. + + Let the Structure copy constructor decide whether it wants to clone the rare data. + The decision is made by StructureRareData::needsCloning() and will currently always + return false, since StructureRareData only holds on to caches at present. + This may change in the future as more members are added to StructureRareData. + + * runtime/Structure.cpp: + (JSC::Structure::Structure): + (JSC::Structure::cloneRareDataFrom): + * runtime/StructureInlines.h: + (JSC::Structure::create): + +2013-03-15 Mark Hahnenberg <mhahnenberg@apple.com> + + Roll out r145838 + https://bugs.webkit.org/show_bug.cgi?id=112458 + + Unreviewed. Requested by Filip Pizlo. + + * CMakeLists.txt: + * DerivedSources.make: + * DerivedSources.pri: + * GNUmakefile.list.am: + * dfg/DFGOperations.cpp: + * interpreter/CallFrame.h: + (JSC::ExecState::objectPrototypeTable): + * jit/JITStubs.cpp: + (JSC::getByVal): + * llint/LLIntSlowPaths.cpp: + (JSC::LLInt::getByVal): + * runtime/CommonIdentifiers.h: + * runtime/JSCell.cpp: + (JSC): + * runtime/JSCell.h: + (JSCell): + * runtime/JSCellInlines.h: + (JSC): + (JSC::JSCell::fastGetOwnProperty): + * runtime/JSGlobalData.cpp: + (JSC): + (JSC::JSGlobalData::JSGlobalData): + (JSC::JSGlobalData::~JSGlobalData): + * runtime/JSGlobalData.h: + (JSGlobalData): + * runtime/JSObject.cpp: + (JSC): + * runtime/JSObject.h: + (JSObject): + (JSC): + * runtime/Lookup.cpp: + (JSC::setUpStaticFunctionSlot): + * runtime/ObjectPrototype.cpp: + (JSC): + (JSC::ObjectPrototype::finishCreation): + (JSC::ObjectPrototype::getOwnPropertySlot): + (JSC::ObjectPrototype::getOwnPropertyDescriptor): + * runtime/ObjectPrototype.h: + (JSC::ObjectPrototype::create): + (ObjectPrototype): + * runtime/PropertyMapHashTable.h: + (JSC::PropertyTable::findWithString): + * runtime/Structure.h: + (Structure): + * runtime/StructureInlines.h: + (JSC::Structure::get): + +2013-03-15 Michael Saboff <msaboff@apple.com> + + Cleanup of DFG and Baseline JIT debugging code + https://bugs.webkit.org/show_bug.cgi?id=111871 + + Reviewed by Geoffrey Garen. + + Fixed various debug related issue in baseline and DFG JITs. See below. + + * dfg/DFGRepatch.cpp: + (JSC::DFG::dfgLinkClosureCall): Used pointerDump() to handle when calleeCodeBlock is NULL. + * dfg/DFGScratchRegisterAllocator.h: Now use ScratchBuffer::activeLengthPtr() to get + pointer to scratch register length. + (JSC::DFG::ScratchRegisterAllocator::preserveUsedRegistersToScratchBuffer): + (JSC::DFG::ScratchRegisterAllocator::restoreUsedRegistersFromScratchBuffer): + * dfg/DFGSpeculativeJIT.cpp: + (JSC::DFG::SpeculativeJIT::checkConsistency): Added missing case labels for DataFormatOSRMarker, + DataFormatDead, and DataFormatArguments and made them RELEASE_ASSERT_NOT_REACHED(); + * jit/JITCall.cpp: + (JSC::JIT::privateCompileClosureCall): Used pointerDump() to handle when calleeCodeBlock is NULL. + * jit/JITCall32_64.cpp: + (JSC::JIT::privateCompileClosureCall): Used pointerDump() to handle when calleeCodeBlock is NULL. + * runtime/JSGlobalData.h: + (JSC::ScratchBuffer::ScratchBuffer): Fixed buffer allocation alignment to + be on a double boundary. + (JSC::ScratchBuffer::setActiveLength): + (JSC::ScratchBuffer::activeLength): + (JSC::ScratchBuffer::activeLengthPtr): + +2013-03-15 Michael Saboff <msaboff@apple.com> + + Add runtime check for improper register allocations in DFG + https://bugs.webkit.org/show_bug.cgi?id=112380 + + Reviewed by Geoffrey Garen. + + Added framework to check for register allocation within a branch source - target range. All register allocations + are saved using the offset in the code stream where the allocation occurred. Later when a jump is linked, the + currently saved register allocations are checked to make sure that they didn't occur in the range of code that was + jumped over. This protects against the case where an allocation could have spilled register contents to free up + a register and that spill only occurs on one path of a many through the code. A subsequent fill of the spilled + register may load garbage. See https://bugs.webkit.org/show_bug.cgi?id=111777 for one such bug. + This code is protected by the compile time check of #if ENABLE(DFG_REGISTER_ALLOCATION_VALIDATION). + The check is only done during the processing of SpeculativeJIT::compile(Node* node) and its callees. + + * assembler/AbstractMacroAssembler.h: + (JSC::AbstractMacroAssembler::Jump::link): Invoke register allocation checks using source and target of link. + (JSC::AbstractMacroAssembler::Jump::linkTo): Invoke register allocation checks using source and target of link. + (AbstractMacroAssembler): + (RegisterAllocationOffset): New helper class to store the instruction stream offset and compare against a + jump range. + (JSC::AbstractMacroAssembler::RegisterAllocationOffset::RegisterAllocationOffset): + (JSC::AbstractMacroAssembler::RegisterAllocationOffset::check): + (JSC::AbstractMacroAssembler::addRegisterAllocationAtOffset): + (JSC::AbstractMacroAssembler::clearRegisterAllocationOffsets): + (JSC::AbstractMacroAssembler::checkRegisterAllocationAgainstBranchRange): + * dfg/DFGSpeculativeJIT.h: + (JSC::DFG::SpeculativeJIT::allocate): + * dfg/DFGSpeculativeJIT32_64.cpp: + (JSC::DFG::SpeculativeJIT::compile): + * dfg/DFGSpeculativeJIT64.cpp: + (JSC::DFG::SpeculativeJIT::compile): + +2013-03-14 Oliver Hunt <oliver@apple.com> + + REGRESSION(r145000): Crash loading arstechnica.com when Safari Web Inspector is open + https://bugs.webkit.org/show_bug.cgi?id=111868 + + Reviewed by Antti Koivisto. + + Don't allow non-local property lookup when the debugger is enabled. + + * bytecompiler/BytecodeGenerator.cpp: + (JSC::BytecodeGenerator::resolve): + +2013-03-11 Mark Hahnenberg <mhahnenberg@apple.com> + + Objective-C API: Objective-C functions exposed to JavaScript have the wrong type (object instead of function) + https://bugs.webkit.org/show_bug.cgi?id=105892 + + Reviewed by Geoffrey Garen. + + Changed ObjCCallbackFunction to subclass JSCallbackFunction which already has all of the machinery to call + functions using the C API. Since ObjCCallbackFunction is now a JSCell, we changed the old implementation of + ObjCCallbackFunction to be the internal implementation and keep track of all the proper data so that we + don't have to put all of that in the header, which will now be included from C++ files (e.g. JSGlobalObject.cpp). + + * API/JSCallbackFunction.cpp: Change JSCallbackFunction to allow subclassing. Originally it was internally + passing its own Structure up the chain of constructors, but we now want to be able to pass other Structures as well. + (JSC::JSCallbackFunction::JSCallbackFunction): + (JSC::JSCallbackFunction::create): + * API/JSCallbackFunction.h: + (JSCallbackFunction): + * API/JSWrapperMap.mm: Changed interface to tryUnwrapBlock. + (tryUnwrapObjcObject): + * API/ObjCCallbackFunction.h: + (ObjCCallbackFunction): Moved into the JSC namespace, just like JSCallbackFunction. + (JSC::ObjCCallbackFunction::createStructure): Overridden so that the correct ClassInfo gets used since we have + a destructor. + (JSC::ObjCCallbackFunction::impl): Getter for the internal impl. + * API/ObjCCallbackFunction.mm: + (JSC::ObjCCallbackFunctionImpl::ObjCCallbackFunctionImpl): What used to be ObjCCallbackFunction is now + ObjCCallbackFunctionImpl. It handles the Objective-C specific parts of managing callback functions. + (JSC::ObjCCallbackFunctionImpl::~ObjCCallbackFunctionImpl): + (JSC::objCCallbackFunctionCallAsFunction): Same as the old one, but now it casts to ObjCCallbackFunction and grabs the impl + rather than using JSObjectGetPrivate. + (JSC::ObjCCallbackFunction::ObjCCallbackFunction): New bits to allow being part of the JSCell hierarchy. + (JSC::ObjCCallbackFunction::create): + (JSC::ObjCCallbackFunction::destroy): + (JSC::ObjCCallbackFunctionImpl::call): Handles the actual invocation, just like it used to. + (objCCallbackFunctionForInvocation): + (tryUnwrapBlock): Changed to check the ClassInfo for inheritance directly, rather than going through the C API call. + * API/tests/testapi.mm: Added new test to make sure that doing Function.prototype.toString.call(f) won't result in + an error when f is an Objective-C method or block underneath the covers. + * runtime/JSGlobalObject.cpp: Added new Structure for ObjCCallbackFunction. + (JSC::JSGlobalObject::reset): + (JSC::JSGlobalObject::visitChildren): + * runtime/JSGlobalObject.h: + (JSGlobalObject): + (JSC::JSGlobalObject::objcCallbackFunctionStructure): + +2013-03-14 Mark Hahnenberg <mhahnenberg@apple.com> + + Objective-C API: Nested dictionaries are not converted properly in the Objective-C binding + https://bugs.webkit.org/show_bug.cgi?id=112377 + + Reviewed by Oliver Hunt. + + Accidental reassignment of the root task in the container conversion logic was causing the last + array or dictionary processed to be returned in the case of nested containers. + + * API/JSValue.mm: + (containerValueToObject): + * API/tests/testapi.mm: + +2013-03-13 Filip Pizlo <fpizlo@apple.com> + + JSObject fast by-string access optimizations should work even on the prototype chain, and even when the result is undefined + https://bugs.webkit.org/show_bug.cgi?id=112233 + + Reviewed by Oliver Hunt. + + Extended the existing fast access path for String keys to work over the entire prototype chain, + not just the self access case. This will fail as soon as it sees an object that intercepts + getOwnPropertySlot, so this patch also ensures that ObjectPrototype does not fall into that + category. This is accomplished by making ObjectPrototype eagerly reify all of its properties. + This is safe for ObjectPrototype because it's so common and we expect all of its properties to + be reified for any interesting programs anyway. A new idiom for adding native functions to + prototypes is introduced, which ought to work well for any other prototypes that we wish to do + this conversion for. + + This is a >60% speed-up in the case that you frequently do by-string lookups that "miss", i.e. + they don't turn up anything. + + * CMakeLists.txt: + * DerivedSources.make: + * DerivedSources.pri: + * GNUmakefile.list.am: + * dfg/DFGOperations.cpp: + * interpreter/CallFrame.h: + (JSC::ExecState::objectConstructorTable): + * jit/JITStubs.cpp: + (JSC::getByVal): + * llint/LLIntSlowPaths.cpp: + (JSC::LLInt::getByVal): + * runtime/CommonIdentifiers.h: + * runtime/JSCell.cpp: + (JSC::JSCell::getByStringSlow): + (JSC): + * runtime/JSCell.h: + (JSCell): + * runtime/JSCellInlines.h: + (JSC): + (JSC::JSCell::getByStringAndKey): + (JSC::JSCell::getByString): + * runtime/JSGlobalData.cpp: + (JSC): + (JSC::JSGlobalData::JSGlobalData): + (JSC::JSGlobalData::~JSGlobalData): + * runtime/JSGlobalData.h: + (JSGlobalData): + * runtime/JSObject.cpp: + (JSC::JSObject::putDirectNativeFunction): + (JSC): + * runtime/JSObject.h: + (JSObject): + (JSC): + * runtime/Lookup.cpp: + (JSC::setUpStaticFunctionSlot): + * runtime/ObjectPrototype.cpp: + (JSC): + (JSC::ObjectPrototype::finishCreation): + (JSC::ObjectPrototype::create): + * runtime/ObjectPrototype.h: + (ObjectPrototype): + * runtime/PropertyMapHashTable.h: + (JSC::PropertyTable::findWithString): + * runtime/Structure.h: + (Structure): + * runtime/StructureInlines.h: + (JSC::Structure::get): + (JSC): + +2013-03-13 Filip Pizlo <fpizlo@apple.com> + + DFG bytecode parser is too aggressive about getting rid of GetLocals on captured variables + https://bugs.webkit.org/show_bug.cgi?id=112287 + <rdar://problem/13342340> + + Reviewed by Oliver Hunt. + + * bytecode/CodeBlock.cpp: + (JSC::CodeBlock::dumpBytecode): + (JSC::CodeBlock::finalizeUnconditionally): + * dfg/DFGByteCodeParser.cpp: + (JSC::DFG::ByteCodeParser::getLocal): + +2013-03-13 Ryosuke Niwa <rniwa@webkit.org> + + Threaded HTML Parser is missing feature define flags in all but Chromium port's build files + https://bugs.webkit.org/show_bug.cgi?id=112277 + + Reviewed by Adam Barth. + + * Configurations/FeatureDefines.xcconfig: + +2013-03-13 Csaba Osztrogonác <ossy@webkit.org> + + LLINT C loop warning fix for GCC + https://bugs.webkit.org/show_bug.cgi?id=112145 + + Reviewed by Filip Pizlo. + + * llint/LowLevelInterpreter.cpp: + (JSC::CLoop::execute): + +2013-02-13 Simon Hausmann <simon.hausmann@digia.com> + + Add support for convenient conversion from JSStringRef to QString + https://bugs.webkit.org/show_bug.cgi?id=109694 + + Reviewed by Allan Sandfeld Jensen. + + Add JSStringCopyQString helper function that allows for the convenient + extraction of a QString out of a JSStringRef. + + * API/JSStringRefQt.cpp: Added. + (JSStringCopyQString): + * API/JSStringRefQt.h: Added. + * API/OpaqueJSString.h: + (OpaqueJSString): + (OpaqueJSString::qString): + (OpaqueJSString::OpaqueJSString): + * Target.pri: + +2013-03-13 Peter Gal <galpeter@inf.u-szeged.hu> + + Token 'not' is ignored in the offlineasm. + https://bugs.webkit.org/show_bug.cgi?id=111568 + + Reviewed by Filip Pizlo. + + * offlineasm/parser.rb: Build the Not AST node if the 'not' token is found. + +2013-03-12 Tim Horton <timothy_horton@apple.com> + + WTF uses macros for exports. Try to fix the Windows build. Unreviewed. + + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCoreExports.def: + * JavaScriptCore.vcxproj/JavaScriptCoreExportGenerator/JavaScriptCoreExports.def.in: + +2013-03-12 Filip Pizlo <fpizlo@apple.com> + + Array.prototype.sort should at least try to be PTIME even when the array is in some bizarre mode + https://bugs.webkit.org/show_bug.cgi?id=112187 + <rdar://problem/13393550> + + Reviewed by Michael Saboff and Gavin Barraclough. + + If we have an array-like object in crazy mode passed into Array.prototype.sort, and its length is large, + then first copy all elements into a separate, compact, un-holy array and sort that. Then copy back. + This means that sorting will be at worst O(n^2) in the actual number of things in the array, rather than + O(n^2) in the array's length. + + * runtime/ArrayPrototype.cpp: + (JSC::attemptFastSort): + (JSC::performSlowSort): + (JSC): + (JSC::arrayProtoFuncSort): + +2013-03-12 Tim Horton <timothy_horton@apple.com> + + Try to fix the Windows build. + + Not reviewed. + + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCoreExports.def: + +2013-03-12 Geoffrey Garen <ggaren@apple.com> + + Try to fix the Windows build. + + Not reviewed. + + * JavaScriptCore.vcxproj/JavaScriptCoreExportGenerator/JavaScriptCoreExports.def.in: + Export a thing. + +2013-03-11 Oliver Hunt <oliver@apple.com> + + Harden JSStringJoiner + https://bugs.webkit.org/show_bug.cgi?id=112093 + + Reviewed by Filip Pizlo. + + Harden JSStringJoiner, make it use our CheckedArithmetic + class to simplify everything. + + * runtime/JSStringJoiner.cpp: + (JSC::JSStringJoiner::build): + * runtime/JSStringJoiner.h: + (JSStringJoiner): + (JSC::JSStringJoiner::JSStringJoiner): + (JSC::JSStringJoiner::append): + +2013-03-12 Filip Pizlo <fpizlo@apple.com> + + DFG generic array access cases should not be guarded by CheckStructure even of the profiling tells us that it could be + https://bugs.webkit.org/show_bug.cgi?id=112183 + + Reviewed by Oliver Hunt. + + Slight speed-up on string-unpack-code. + + * dfg/DFGFixupPhase.cpp: + (JSC::DFG::FixupPhase::findAndRemoveUnnecessaryStructureCheck): + (FixupPhase): + (JSC::DFG::FixupPhase::checkArray): + (JSC::DFG::FixupPhase::blessArrayOperation): + +2013-03-12 Gabor Rapcsanyi <rgabor@webkit.org> + + https://bugs.webkit.org/show_bug.cgi?id=112141 + LLInt CLoop backend misses Double2Ints() on 32bit architectures + + Reviewed by Filip Pizlo. + + Implement Double2Ints() in CLoop backend of LLInt on 32bit architectures. + + * llint/LowLevelInterpreter.cpp: + (LLInt): + (JSC::LLInt::Double2Ints): + * offlineasm/cloop.rb: + +2013-03-12 Gabor Rapcsanyi <rgabor@webkit.org> + + Making more sophisticated cache flush on ARM Linux platform + https://bugs.webkit.org/show_bug.cgi?id=111854 + + Reviewed by Zoltan Herczeg. + + The cache flush on ARM Linux invalidates whole pages + instead of just the required area. + + * assembler/ARMAssembler.h: + (ARMAssembler): + (JSC::ARMAssembler::linuxPageFlush): + (JSC::ARMAssembler::cacheFlush): + * assembler/ARMv7Assembler.h: + (ARMv7Assembler): + (JSC::ARMv7Assembler::linuxPageFlush): + (JSC::ARMv7Assembler::cacheFlush): + +2013-03-12 Gabor Rapcsanyi <rgabor@webkit.org> + + Renaming the armv7.rb LLINT backend to arm.rb + https://bugs.webkit.org/show_bug.cgi?id=110565 + + Reviewed by Zoltan Herczeg. + + This is the first step of a unified ARM backend for + all ARM 32 bit architectures in LLInt. + + * CMakeLists.txt: + * GNUmakefile.list.am: + * JavaScriptCore.gypi: + * LLIntOffsetsExtractor.pro: + * offlineasm/arm.rb: Copied from Source/JavaScriptCore/offlineasm/armv7.rb. + * offlineasm/armv7.rb: Removed. + * offlineasm/backends.rb: + * offlineasm/risc.rb: + +2013-03-12 Csaba Osztrogonác <ossy@webkit.org> + + REGRESSION(r145482): It broke 33 jsc tests and zillion layout tests on all platform + https://bugs.webkit.org/show_bug.cgi?id=112112 + + Reviewed by Oliver Hunt. + + Rolling out https://trac.webkit.org/changeset/145482 to unbreak the bots. + + * runtime/JSStringJoiner.cpp: + (JSC::JSStringJoiner::build): + * runtime/JSStringJoiner.h: + (JSStringJoiner): + (JSC::JSStringJoiner::JSStringJoiner): + (JSC::JSStringJoiner::append): + +2013-03-12 Filip Pizlo <fpizlo@apple.com> + + DFG prediction propagation phase should not rerun forward propagation if double voting has already converged + https://bugs.webkit.org/show_bug.cgi?id=111920 + + Reviewed by Oliver Hunt. + + I don't know why we weren't exiting early after double voting if !m_changed. + + This change also removes backwards propagation from the voting fixpoint, since at that + point short-circuiting loops is probably not particularly profitable. Profiling shows + that this reduces the time spent in prediction propagation even further. + + This change appears to be a 1% SunSpider speed-up. + + * dfg/DFGPredictionPropagationPhase.cpp: + (JSC::DFG::PredictionPropagationPhase::run): + +2013-03-11 Filip Pizlo <fpizlo@apple.com> + + DFG overflow check elimination is too smart for its own good + https://bugs.webkit.org/show_bug.cgi?id=111832 + + Reviewed by Oliver Hunt and Gavin Barraclough. + + Rolling this back in after fixing accidental misuse of JSValue. The code was doing value < someInt + rather than value.asInt32() < someInt. This "worked" when isWithinPowerOfTwo wasn't templatized. + It worked by always being false and always disabling the relvant optimization. + + This improves overflow check elimination in three ways: + + 1) It reduces the amount of time the compiler will spend doing it. + + 2) It fixes bugs where overflow check elimination was overzealous. Precisely, for a binary operation + over @a and @b where both @a and @b will type check that their inputs (@a->children, @b->children) + are int32's and then perform a possibly-overflowing operation, we must be careful not to assume + that @a's non-int32 parts don't matter if at the point that @a runs we have as yet not proved that + @b->children are int32's and that hence @b might produce a large enough result that doubles would + start chopping low bits. The specific implication of this is that for a binary operation to not + propagate that it cares about non-int32 parts (NodeUsedAsNumber), we must prove that at least one + of the inputs is guaranteed to produce a result within 2^32 and that there won't be a tower of such + operations large enough to ultimately produce a double greater than 2^52 (roughly). We achieve the + latter by disabling this optimization for very large basic blocks. It's noteworthy that blocks that + large won't even make it into the DFG currently. + + 3) It makes the overflow check elimination more precise for cases where the inputs to an Add or Sub + are the outputs of a bit-op. For example in (@a + (@b | 0)) | 0, we don't need to propagate + NodeUsedAsNumber to either @a or @b. + + This is neutral on V8v7 and a slight speed-up on compile time benchmarks. + + * CMakeLists.txt: + * GNUmakefile.list.am: + * JavaScriptCore.xcodeproj/project.pbxproj: + * Target.pri: + * dfg/DFGArrayMode.cpp: + (JSC::DFG::ArrayMode::refine): + * dfg/DFGBackwardsPropagationPhase.cpp: Added. + (DFG): + (BackwardsPropagationPhase): + (JSC::DFG::BackwardsPropagationPhase::BackwardsPropagationPhase): + (JSC::DFG::BackwardsPropagationPhase::run): + (JSC::DFG::BackwardsPropagationPhase::isNotNegZero): + (JSC::DFG::BackwardsPropagationPhase::isNotZero): + (JSC::DFG::BackwardsPropagationPhase::isWithinPowerOfTwoForConstant): + (JSC::DFG::BackwardsPropagationPhase::isWithinPowerOfTwoNonRecursive): + (JSC::DFG::BackwardsPropagationPhase::isWithinPowerOfTwo): + (JSC::DFG::BackwardsPropagationPhase::mergeDefaultFlags): + (JSC::DFG::BackwardsPropagationPhase::propagate): + (JSC::DFG::performBackwardsPropagation): + * dfg/DFGBackwardsPropagationPhase.h: Added. + (DFG): + * dfg/DFGCPSRethreadingPhase.cpp: + (JSC::DFG::CPSRethreadingPhase::run): + (JSC::DFG::CPSRethreadingPhase::clearIsLoadedFrom): + (CPSRethreadingPhase): + (JSC::DFG::CPSRethreadingPhase::canonicalizeGetLocalFor): + (JSC::DFG::CPSRethreadingPhase::canonicalizeFlushOrPhantomLocalFor): + * dfg/DFGDriver.cpp: + (JSC::DFG::compile): + * dfg/DFGGraph.cpp: + (JSC::DFG::Graph::dump): + * dfg/DFGNodeFlags.cpp: + (JSC::DFG::dumpNodeFlags): + (DFG): + * dfg/DFGNodeFlags.h: + (DFG): + * dfg/DFGPredictionPropagationPhase.cpp: + (PredictionPropagationPhase): + (JSC::DFG::PredictionPropagationPhase::propagate): + * dfg/DFGUnificationPhase.cpp: + (JSC::DFG::UnificationPhase::run): + * dfg/DFGVariableAccessData.h: + (JSC::DFG::VariableAccessData::VariableAccessData): + (JSC::DFG::VariableAccessData::mergeIsLoadedFrom): + (VariableAccessData): + (JSC::DFG::VariableAccessData::setIsLoadedFrom): + (JSC::DFG::VariableAccessData::isLoadedFrom): + +2013-03-11 Oliver Hunt <oliver@apple.com> + + Harden JSStringJoiner + https://bugs.webkit.org/show_bug.cgi?id=112093 + + Reviewed by Filip Pizlo. + + Harden JSStringJoiner, make it use our CheckedArithmetic + class to simplify everything. + + * runtime/JSStringJoiner.cpp: + (JSC::JSStringJoiner::build): + * runtime/JSStringJoiner.h: + (JSStringJoiner): + (JSC::JSStringJoiner::JSStringJoiner): + (JSC::JSStringJoiner::append): + +2013-03-11 Michael Saboff <msaboff@apple.com> + + Crash beneath operationCreateInlinedArguments running fast/js/dfg-create-inlined-arguments-in-closure-inline.html (32-bit only) + https://bugs.webkit.org/show_bug.cgi?id=112067 + + Reviewed by Geoffrey Garen. + + We weren't setting the tag in SetCallee. Therefore set it to CellTag. + + * dfg/DFGSpeculativeJIT32_64.cpp: + (JSC::DFG::SpeculativeJIT::compile): + +2013-03-11 Oliver Hunt <oliver@apple.com> + + Make SegmentedVector Noncopyable + https://bugs.webkit.org/show_bug.cgi?id=112059 + + Reviewed by Geoffrey Garen. + + Copying a SegmentedVector is very expensive, and really shouldn't + be necessary. So I've taken the one place where we currently copy + and replaced it with a regular Vector, and replaced the address + dependent logic with a indexing ref instead. + + * bytecompiler/BytecodeGenerator.cpp: + (JSC::BytecodeGenerator::newLabelScope): + (JSC::BytecodeGenerator::emitComplexJumpScopes): + * bytecompiler/BytecodeGenerator.h: + (BytecodeGenerator): + * bytecompiler/LabelScope.h: + (JSC): + (JSC::LabelScopePtr::LabelScopePtr): + (LabelScopePtr): + (JSC::LabelScopePtr::operator=): + (JSC::LabelScopePtr::~LabelScopePtr): + (JSC::LabelScopePtr::operator*): + (JSC::LabelScopePtr::operator->): + * bytecompiler/NodesCodegen.cpp: + (JSC::DoWhileNode::emitBytecode): + (JSC::WhileNode::emitBytecode): + (JSC::ForNode::emitBytecode): + (JSC::ForInNode::emitBytecode): + (JSC::SwitchNode::emitBytecode): + (JSC::LabelNode::emitBytecode): + +2013-03-10 Andreas Kling <akling@apple.com> + + SpeculativeJIT should use OwnPtr<SlowPathGenerator>. + <http://webkit.org/b/111942> + + Reviewed by Anders Carlsson. + + There's no need to include DFGSlowPathGenerator.h from the header as long as the destructor is out-of-line, + so let's use OwnPtr instead of raw pointers + deleteAllValues(). + + * dfg/DFGSpeculativeJIT.cpp: + (JSC::DFG::SpeculativeJIT::~SpeculativeJIT): + (JSC::DFG::SpeculativeJIT::addSlowPathGenerator): + * dfg/DFGSpeculativeJIT.h: + (SpeculativeJIT): + +2013-03-09 Sheriff Bot <webkit.review.bot@gmail.com> + + Unreviewed, rolling out r145299. + http://trac.webkit.org/changeset/145299 + https://bugs.webkit.org/show_bug.cgi?id=111928 + + compilation failure with recent clang + (DFGBackwardsPropagationPhase.cpp:132:35: error: comparison of + constant 10 with expression of type 'bool' is always false) + (Requested by thorton on #webkit). + + * CMakeLists.txt: + * GNUmakefile.list.am: + * JavaScriptCore.xcodeproj/project.pbxproj: + * Target.pri: + * dfg/DFGArrayMode.cpp: + (JSC::DFG::ArrayMode::refine): + * dfg/DFGBackwardsPropagationPhase.cpp: Removed. + * dfg/DFGBackwardsPropagationPhase.h: Removed. + * dfg/DFGCPSRethreadingPhase.cpp: + (JSC::DFG::CPSRethreadingPhase::run): + (CPSRethreadingPhase): + (JSC::DFG::CPSRethreadingPhase::canonicalizeGetLocalFor): + (JSC::DFG::CPSRethreadingPhase::canonicalizeFlushOrPhantomLocalFor): + * dfg/DFGDriver.cpp: + (JSC::DFG::compile): + * dfg/DFGGraph.cpp: + (JSC::DFG::Graph::dump): + * dfg/DFGNodeFlags.cpp: + (JSC::DFG::nodeFlagsAsString): + (DFG): + * dfg/DFGNodeFlags.h: + (DFG): + * dfg/DFGPredictionPropagationPhase.cpp: + (JSC::DFG::PredictionPropagationPhase::isNotNegZero): + (PredictionPropagationPhase): + (JSC::DFG::PredictionPropagationPhase::isNotZero): + (JSC::DFG::PredictionPropagationPhase::isWithinPowerOfTwoForConstant): + (JSC::DFG::PredictionPropagationPhase::isWithinPowerOfTwoNonRecursive): + (JSC::DFG::PredictionPropagationPhase::isWithinPowerOfTwo): + (JSC::DFG::PredictionPropagationPhase::propagate): + (JSC::DFG::PredictionPropagationPhase::mergeDefaultFlags): + * dfg/DFGUnificationPhase.cpp: + (JSC::DFG::UnificationPhase::run): + * dfg/DFGVariableAccessData.h: + (JSC::DFG::VariableAccessData::VariableAccessData): + (VariableAccessData): + +2013-03-08 Filip Pizlo <fpizlo@apple.com> + + DFG overflow check elimination is too smart for its own good + https://bugs.webkit.org/show_bug.cgi?id=111832 + + Reviewed by Oliver Hunt and Gavin Barraclough. + + This improves overflow check elimination in three ways: + + 1) It reduces the amount of time the compiler will spend doing it. + + 2) It fixes bugs where overflow check elimination was overzealous. Precisely, for a binary operation + over @a and @b where both @a and @b will type check that their inputs (@a->children, @b->children) + are int32's and then perform a possibly-overflowing operation, we must be careful not to assume + that @a's non-int32 parts don't matter if at the point that @a runs we have as yet not proved that + @b->children are int32's and that hence @b might produce a large enough result that doubles would + start chopping low bits. The specific implication of this is that for a binary operation to not + propagate that it cares about non-int32 parts (NodeUsedAsNumber), we must prove that at least one + of the inputs is guaranteed to produce a result within 2^32 and that there won't be a tower of such + operations large enough to ultimately produce a double greater than 2^52 (roughly). We achieve the + latter by disabling this optimization for very large basic blocks. It's noteworthy that blocks that + large won't even make it into the DFG currently. + + 3) It makes the overflow check elimination more precise for cases where the inputs to an Add or Sub + are the outputs of a bit-op. For example in (@a + (@b | 0)) | 0, we don't need to propagate + NodeUsedAsNumber to either @a or @b. + + This is neutral on V8v7 and a slight speed-up on compile time benchmarks. + + * CMakeLists.txt: + * GNUmakefile.list.am: + * JavaScriptCore.xcodeproj/project.pbxproj: + * Target.pri: + * dfg/DFGArrayMode.cpp: + (JSC::DFG::ArrayMode::refine): + * dfg/DFGBackwardsPropagationPhase.cpp: Added. + (DFG): + (BackwardsPropagationPhase): + (JSC::DFG::BackwardsPropagationPhase::BackwardsPropagationPhase): + (JSC::DFG::BackwardsPropagationPhase::run): + (JSC::DFG::BackwardsPropagationPhase::isNotNegZero): + (JSC::DFG::BackwardsPropagationPhase::isNotZero): + (JSC::DFG::BackwardsPropagationPhase::isWithinPowerOfTwoForConstant): + (JSC::DFG::BackwardsPropagationPhase::isWithinPowerOfTwoNonRecursive): + (JSC::DFG::BackwardsPropagationPhase::isWithinPowerOfTwo): + (JSC::DFG::BackwardsPropagationPhase::mergeDefaultFlags): + (JSC::DFG::BackwardsPropagationPhase::propagate): + (JSC::DFG::performBackwardsPropagation): + * dfg/DFGBackwardsPropagationPhase.h: Added. + (DFG): + * dfg/DFGCPSRethreadingPhase.cpp: + (JSC::DFG::CPSRethreadingPhase::run): + (JSC::DFG::CPSRethreadingPhase::clearIsLoadedFrom): + (CPSRethreadingPhase): + (JSC::DFG::CPSRethreadingPhase::canonicalizeGetLocalFor): + (JSC::DFG::CPSRethreadingPhase::canonicalizeFlushOrPhantomLocalFor): + * dfg/DFGDriver.cpp: + (JSC::DFG::compile): + * dfg/DFGGraph.cpp: + (JSC::DFG::Graph::dump): + * dfg/DFGNodeFlags.cpp: + (JSC::DFG::dumpNodeFlags): + (DFG): + * dfg/DFGNodeFlags.h: + (DFG): + * dfg/DFGPredictionPropagationPhase.cpp: + (PredictionPropagationPhase): + (JSC::DFG::PredictionPropagationPhase::propagate): + * dfg/DFGUnificationPhase.cpp: + (JSC::DFG::UnificationPhase::run): + * dfg/DFGVariableAccessData.h: + (JSC::DFG::VariableAccessData::VariableAccessData): + (JSC::DFG::VariableAccessData::mergeIsLoadedFrom): + (VariableAccessData): + (JSC::DFG::VariableAccessData::setIsLoadedFrom): + (JSC::DFG::VariableAccessData::isLoadedFrom): + +2013-03-08 Roger Fong <roger_fong@apple.com> + + Makefile fixes. + + * JavaScriptCore.vcxproj/JavaScriptCore.make: + +2013-03-08 Gabor Rapcsanyi <rgabor@webkit.org> + + Cache flush problem on ARMv7 JSC + https://bugs.webkit.org/show_bug.cgi?id=111441 + + Reviewed by Zoltan Herczeg. + + Not proper cache flush causing random crashes on ARMv7 Linux with V8 tests. + The problem is similar to https://bugs.webkit.org/show_bug.cgi?id=77712. + Change the cache fulsh mechanism similar to ARM traditinal and revert the + temporary fix. + + * assembler/ARMv7Assembler.h: + (JSC::ARMv7Assembler::cacheFlush): + +2013-03-07 Geoffrey Garen <ggaren@apple.com> + + REGRESSION (r143759): 40% JSBench regression, 20% Octane/closure regression, 40% Octane/jquery regression, 2% Octane regression + https://bugs.webkit.org/show_bug.cgi?id=111797 + + Reviewed by Oliver Hunt. + + The bot's testing configuration stresses the cache's starting guess + of 1MB. + + This patch removes any starting guess, and just uses wall clock time + to discover the initial working set size of an app, in code size. + + * runtime/CodeCache.cpp: + (JSC::CodeCacheMap::pruneSlowCase): Update our timer as we go. + + Also fixed a bug where pruning from 0 to 0 would hang -- that case is + a possibility now that we start with a capacity of 0. + + * runtime/CodeCache.h: + (CodeCacheMap): + (JSC::CodeCacheMap::CodeCacheMap): + (JSC::CodeCacheMap::add): + (JSC::CodeCacheMap::prune): Don't prune if we're in the middle of + discovering the working set size of an app, in code size. + +2013-03-07 Michael Saboff <msaboff@apple.com> + + Crash when updating predictions below JSC::arrayProtoFuncForEach on tuaw.com article + https://bugs.webkit.org/show_bug.cgi?id=111777 + + Reviewed by Filip Pizlo. + + Moved register allocations to be above any generated control flow so that any + resulting spill would be visible to all subsequently generated code. + + * 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): + +2013-03-07 Filip Pizlo <fpizlo@apple.com> + + DFG should not get corrupted IR in the case of code that is dead, unreachable, and contains a chain of nodes that use each other in an untyped way + https://bugs.webkit.org/show_bug.cgi?id=111783 + + Reviewed by Mark Hahnenberg. + + Unreachable code is not touched by CFA and so thinks that even untyped uses are checked. + But dead untyped uses don't need checks and hence don't need to be Phantom'd. The DCE knew + this in findTypeCheckRoot() but not in eliminateIrrelevantPhantomChildren(), leading to a + Phantom node that had another Phantom node as one of its kids. + + * dfg/DFGDCEPhase.cpp: + (JSC::DFG::DCEPhase::eliminateIrrelevantPhantomChildren): + +2013-03-07 Filip Pizlo <fpizlo@apple.com> + + The DFG fixpoint is not strictly profitable, and should be straight-lined + https://bugs.webkit.org/show_bug.cgi?id=111764 + + Reviewed by Oliver Hunt and Geoffrey Garen. + + The DFG previously ran optimizations to fixpoint because there exists a circular dependency: + + CSE depends on CFG simplification: CFG simplification merges blocks, and CSE is block-local. + + CFG simplification depends on CFA and constant folding: constant folding reveals branches on + constants. + + CFA depends on CSE: CSE reveals must-alias relationships by proving that two operations + always produce identical values. + + Arguments simplification also depends on CSE, but it ought not depend on anything else. + + Hence we get a cycle like: CFA -> folding -> CFG -> CSE -> CFA. + + Note that before we had sparse conditional CFA, we also had CFA depending on CFG. This ought + not be the case anymore: CFG simplification should not by itself lead to better CFA results. + + My guess is that the weakest link in this cycle is CFG -> CSE. CSE cuts both ways: if you + CSE too much then you increase register pressure. Hence it's not clear that you always want + to CSE after simplifying control flow. This leads to an order of optimization as follows: + + CSE -> arguments -> CFA -> folding -> CFG + + This is a 2.5% speed-up on SunSpider, a 4% speed-up on V8Spider, a possible 0.3% slow-down + on V8v7, nothing on Kraken, and 1.2% speed-up in the JSRegress geomean. I'll take a 2.5% + speed-up over a 0.3% V8v7 speed-up. + + * dfg/DFGDriver.cpp: + (JSC::DFG::compile): + +2013-03-07 Roger Fong <roger_fong@apple.com> + + Build fix for AppleWin VS2010. + + * JavaScriptCore.vcxproj/JavaScriptCore.vcxproj: + * JavaScriptCore.vcxproj/JavaScriptCore.vcxproj.filters: + +2013-03-05 Mark Hahnenberg <mhahnenberg@apple.com> + + Objective-C API: Need a good way to reference event handlers without causing cycles + https://bugs.webkit.org/show_bug.cgi?id=111088 + + Reviewed by Geoffrey Garen. + + JSManagedValue is like a special kind of weak value. When you create a JSManagedValue, you can + supply an Objective-C object as its "owner". As long as the Objective-C owner object remains + alive and its wrapper remains accessible to the JSC garbage collector (e.g. by being marked by + the global object), the reference to the JavaScript value is strong. As soon as the Objective-C + owner is deallocated or its wrapper becomes inaccessible to the garbage collector, the reference + becomes weak. + + If you do not supply an owner or you use the weakValueWithValue: convenience class method, the + returned JSManagedValue behaves as a normal weak reference. + + This new class allows clients to maintain references to JavaScript values in the Objective-C + heap without creating reference cycles/leaking memory. + + * API/JSAPIWrapperObject.cpp: Added. + (JSC): + (JSC::::createStructure): + (JSC::JSAPIWrapperObject::JSAPIWrapperObject): This is a special JSObject for the Objective-C API that knows + for the purposes of garbage collection/marking that it wraps an opaque Objective-C object. + (JSC::JSAPIWrapperObject::visitChildren): We add the pointer to the wrapped Objective-C object to the set of + opaque roots so that the weak handle owner for JSManagedValues can find it later. + * API/JSAPIWrapperObject.h: Added. + (JSC): + (JSAPIWrapperObject): + (JSC::JSAPIWrapperObject::wrappedObject): + (JSC::JSAPIWrapperObject::setWrappedObject): + * API/JSBase.cpp: + (JSSynchronousGarbageCollect): + * API/JSBasePrivate.h: + * API/JSCallbackObject.cpp: + (JSC): + * API/JSCallbackObject.h: + (JSC::JSCallbackObject::destroy): Moved this to the header so that we don't get link errors with JSAPIWrapperObject. + * API/JSContext.mm: + (-[JSContext initWithVirtualMachine:]): We weren't adding manually allocated/initialized JSVirtualMachine objects to + the global cache of virtual machines. The init methods handle this now rather than contextWithGlobalContextRef, since + not everyone is guaranteed to use the latter. + (-[JSContext initWithGlobalContextRef:]): + (+[JSContext contextWithGlobalContextRef:]): + * API/JSManagedValue.h: Added. + * API/JSManagedValue.mm: Added. + (JSManagedValueHandleOwner): + (managedValueHandleOwner): + (+[JSManagedValue weakValueWithValue:]): + (+[JSManagedValue managedValueWithValue:owner:]): + (-[JSManagedValue init]): We explicitly call the ARC entrypoints to initialize/get the weak owner field since we don't + use ARC when building our framework. + (-[JSManagedValue initWithValue:]): + (-[JSManagedValue initWithValue:owner:]): + (-[JSManagedValue dealloc]): + (-[JSManagedValue value]): + (-[JSManagedValue weakOwner]): + (JSManagedValueHandleOwner::isReachableFromOpaqueRoots): If the Objective-C owner is still alive (i.e. loading the weak field + returns non-nil) and that value was added to the set of opaque roots by the wrapper for that Objective-C owner, then the the + JSObject to which the JSManagedObject refers is still alive. + * API/JSObjectRef.cpp: We have to add explicit checks for the JSAPIWrapperObject, just like the other types of JSCallbackObjects. + (JSObjectGetPrivate): + (JSObjectSetPrivate): + (JSObjectGetPrivateProperty): + (JSObjectSetPrivateProperty): + (JSObjectDeletePrivateProperty): + * API/JSValue.mm: + (objectToValueWithoutCopy): + * API/JSValueRef.cpp: + (JSValueIsObjectOfClass): + * API/JSVirtualMachine.mm: + (-[JSVirtualMachine initWithContextGroupRef:]): + (+[JSVirtualMachine virtualMachineWithContextGroupRef:]): + * API/JSWrapperMap.mm: + (wrapperFinalize): + (makeWrapper): This is our own internal version of JSObjectMake which creates JSAPIWrapperObjects, the Obj-C API + version of JSCallbackObjects. + (createObjectWithCustomBrand): + (-[JSObjCClassInfo wrapperForObject:]): + (tryUnwrapObjcObject): + * API/JavaScriptCore.h: + * API/tests/testapi.mm: Added new tests for the strong and weak uses of JSManagedValue in the context of an + onclick handler for an Objective-C object inserted into a JSContext. + (-[TextXYZ setWeakOnclick:]): + (-[TextXYZ setOnclick:]): + (-[TextXYZ weakOnclick]): + (-[TextXYZ onclick]): + (-[TextXYZ click]): + * CMakeLists.txt: Various build system additions. + * GNUmakefile.list.am: + * JavaScriptCore.gypi: + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: + * JavaScriptCore.xcodeproj/project.pbxproj: + * runtime/JSGlobalObject.cpp: Added the new canonical Structure for the JSAPIWrapperObject class. + (JSC::JSGlobalObject::reset): + (JSC): + (JSC::JSGlobalObject::visitChildren): + * runtime/JSGlobalObject.h: + (JSGlobalObject): + (JSC::JSGlobalObject::objcWrapperObjectStructure): + +2013-03-06 Filip Pizlo <fpizlo@apple.com> + + ConvertThis should be turned into Identity based on predictions in Fixup, rather than based on proofs in ConstantFolding + https://bugs.webkit.org/show_bug.cgi?id=111674 + + Reviewed by Oliver Hunt. + + This gets rid of the speculated forms of ConvertThis in the backend, and has Fixup + convert them to either Identity(Object:@child) if the child is predicted object, or + Phantom(Other:@child) ; WeakJSConstant(global this object) if it's predicted Other. + + The goal of this is to ensure that the optimization fixpoint doesn't create + Identity's, since doing so requires a rerun of CSE. So far this isn't a speed-up + but I'm hoping this will be a step towards reducing the need to rerun the fixpoint + so as to ultimately reduce compile times. + + * dfg/DFGAbstractState.cpp: + (JSC::DFG::AbstractState::executeEffects): + * dfg/DFGAssemblyHelpers.h: + (AssemblyHelpers): + * dfg/DFGConstantFoldingPhase.cpp: + (JSC::DFG::ConstantFoldingPhase::foldConstants): + * dfg/DFGFixupPhase.cpp: + (JSC::DFG::FixupPhase::fixupNode): + (FixupPhase): + (JSC::DFG::FixupPhase::observeUseKindOnNode): + (JSC::DFG::FixupPhase::setUseKindAndUnboxIfProfitable): + * dfg/DFGGraph.h: + (JSC::DFG::Graph::globalThisObjectFor): + (Graph): + * dfg/DFGNode.h: + (Node): + (JSC::DFG::Node::convertToIdentity): + (JSC::DFG::Node::convertToWeakConstant): + * dfg/DFGSpeculativeJIT32_64.cpp: + (JSC::DFG::SpeculativeJIT::compile): + * dfg/DFGSpeculativeJIT64.cpp: + (JSC::DFG::SpeculativeJIT::compile): + +2013-03-07 Peter Gal <galpeter@inf.u-szeged.hu> + + Children method in LLINT AST Not class should return [@child] + https://bugs.webkit.org/show_bug.cgi?id=90740 + + Reviewed by Filip Pizlo. + + * offlineasm/ast.rb: Fixed the return value of the children method in the Not AST class. + +2013-03-05 Oliver Hunt <oliver@apple.com> + + Bring back eager resolution of function scoped variables + https://bugs.webkit.org/show_bug.cgi?id=111497 + + Reviewed by Geoffrey Garen. + + This reverts the get/put_scoped_var part of the great non-local + variable resolution refactoring. This still leaves all the lazy + variable resolution logic as it's necessary for global property + resolution, and i don't want to make the patch bigger than it + already is. + + * bytecode/CodeBlock.cpp: + (JSC::CodeBlock::dumpBytecode): + (JSC::CodeBlock::CodeBlock): + * bytecode/CodeBlock.h: + (CodeBlock): + * bytecode/Opcode.h: + (JSC): + (JSC::padOpcodeName): + * bytecode/UnlinkedCodeBlock.cpp: + (JSC::generateFunctionCodeBlock): + (JSC::UnlinkedFunctionExecutable::codeBlockFor): + (JSC::UnlinkedCodeBlock::UnlinkedCodeBlock): + * bytecode/UnlinkedCodeBlock.h: + (JSC): + (UnlinkedFunctionExecutable): + (UnlinkedCodeBlock): + (JSC::UnlinkedCodeBlock::usesGlobalObject): + (JSC::UnlinkedCodeBlock::setGlobalObjectRegister): + (JSC::UnlinkedCodeBlock::globalObjectRegister): + * bytecompiler/BytecodeGenerator.cpp: + (JSC::ResolveResult::checkValidity): + (JSC::BytecodeGenerator::BytecodeGenerator): + (JSC::BytecodeGenerator::emitLoadGlobalObject): + (JSC): + (JSC::BytecodeGenerator::resolve): + (JSC::BytecodeGenerator::resolveConstDecl): + (JSC::BytecodeGenerator::emitResolve): + (JSC::BytecodeGenerator::emitResolveBase): + (JSC::BytecodeGenerator::emitResolveBaseForPut): + (JSC::BytecodeGenerator::emitResolveWithBaseForPut): + (JSC::BytecodeGenerator::emitResolveWithThis): + (JSC::BytecodeGenerator::emitGetStaticVar): + (JSC::BytecodeGenerator::emitPutStaticVar): + * bytecompiler/BytecodeGenerator.h: + (JSC::ResolveResult::lexicalResolve): + (JSC::ResolveResult::isStatic): + (JSC::ResolveResult::depth): + (JSC::ResolveResult::index): + (ResolveResult): + (JSC::ResolveResult::ResolveResult): + (BytecodeGenerator): + * bytecompiler/NodesCodegen.cpp: + (JSC::ResolveNode::isPure): + (JSC::FunctionCallResolveNode::emitBytecode): + (JSC::PostfixNode::emitResolve): + (JSC::TypeOfResolveNode::emitBytecode): + (JSC::PrefixNode::emitResolve): + (JSC::ReadModifyResolveNode::emitBytecode): + (JSC::AssignResolveNode::emitBytecode): + (JSC::ConstDeclNode::emitCodeSingle): + * dfg/DFGByteCodeParser.cpp: + (JSC::DFG::ByteCodeParser::parseBlock): + * dfg/DFGCapabilities.cpp: + (JSC::DFG::debugFail): + * dfg/DFGCapabilities.h: + (JSC::DFG::canCompileOpcode): + (JSC::DFG::canInlineOpcode): + * jit/JIT.cpp: + (JSC::JIT::privateCompileMainPass): + * jit/JIT.h: + (JIT): + * jit/JITPropertyAccess.cpp: + (JSC::JIT::emit_op_get_scoped_var): + (JSC): + (JSC::JIT::emit_op_put_scoped_var): + * jit/JITPropertyAccess32_64.cpp: + (JSC::JIT::emit_op_get_scoped_var): + (JSC): + (JSC::JIT::emit_op_put_scoped_var): + * llint/LowLevelInterpreter32_64.asm: + * llint/LowLevelInterpreter64.asm: + * runtime/CodeCache.cpp: + (JSC::CodeCache::getCodeBlock): + (JSC::CodeCache::getProgramCodeBlock): + (JSC::CodeCache::getEvalCodeBlock): + * runtime/CodeCache.h: + (JSC): + (CodeCache): + * runtime/Executable.cpp: + (JSC::EvalExecutable::compileInternal): + (JSC::FunctionExecutable::produceCodeBlockFor): + * runtime/JSGlobalObject.cpp: + (JSC::JSGlobalObject::createEvalCodeBlock): + * runtime/JSGlobalObject.h: + (JSGlobalObject): + * runtime/Options.cpp: + (JSC::Options::initialize): + +2013-03-06 Filip Pizlo <fpizlo@apple.com> + + Unreviewed, roll out http://trac.webkit.org/changeset/144989 + + I think we want the assertion that I removed. + + * dfg/DFGAbstractState.cpp: + (JSC::DFG::AbstractState::merge): + (JSC::DFG::AbstractState::mergeVariableBetweenBlocks): + * dfg/DFGAbstractState.h: + (AbstractState): + +2013-03-06 Filip Pizlo <fpizlo@apple.com> + + DFG::AbstractState::merge() is still more complicated than it needs to be + https://bugs.webkit.org/show_bug.cgi?id=111619 + + Reviewed by Mark Hahnenberg. + + This method is the one place where we still do some minimal amount of liveness pruning, but the style with + which it is written is awkward, and it makes an assertion about variablesAtTail that will be invalidated + by https://bugs.webkit.org/show_bug.cgi?id=111539. + + * dfg/DFGAbstractState.cpp: + (JSC::DFG::AbstractState::merge): + (JSC::DFG::AbstractState::mergeVariableBetweenBlocks): + * dfg/DFGAbstractState.h: + (AbstractState): + +2013-03-06 Filip Pizlo <fpizlo@apple.com> + + DFG should not run full CSE after the optimization fixpoint, since it really just wants store elimination + https://bugs.webkit.org/show_bug.cgi?id=111536 + + Reviewed by Oliver Hunt and Mark Hahnenberg. + + The fixpoint will do aggressive load elimination and pure CSE. There's no need to do it after the fixpoint. + On the other hand, the fixpoint does not profit from doing store elimination (except for SetLocal/Flush). + Previously we had CSE do both, and had it avoid doing some store elimination during the fixpoint by querying + the fixpoint state. This changes CSE to be templated on mode - either NormalCSE or StoreElimination - so + that we explicitly put it into one of those modes depending on where we call it from. The goal is to reduce + time spent doing load elimination after the fixpoint, since that is just wasted cycles. + + * dfg/DFGCSEPhase.cpp: + (JSC::DFG::CSEPhase::CSEPhase): + (JSC::DFG::CSEPhase::run): + (JSC::DFG::CSEPhase::performNodeCSE): + (JSC::DFG::CSEPhase::performBlockCSE): + (JSC::DFG::performCSE): + (DFG): + (JSC::DFG::performStoreElimination): + * dfg/DFGCSEPhase.h: + (DFG): + * dfg/DFGDriver.cpp: + (JSC::DFG::compile): + +2013-03-06 Andreas Kling <akling@apple.com> + + Pack Structure members better. + <http://webkit.org/b/111593> + <rdar://problem/13359200> + + Reviewed by Mark Hahnenberg. + + Shrink Structure by 8 bytes (now at 104 bytes) on 64-bit by packing the members better. + + * runtime/Structure.cpp: + (JSC::Structure::Structure): + * runtime/Structure.h: + (Structure): + +2013-03-06 Andreas Kling <akling@apple.com> + + Unreviewed, fix Windows build after r144910. + + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: + +2013-03-05 Filip Pizlo <fpizlo@apple.com> + + DFG should not check if nodes are shouldGenerate prior to DCE + https://bugs.webkit.org/show_bug.cgi?id=111520 + + Reviewed by Geoffrey Garen. + + All nodes are live before DCE. We don't need to check that they aren't, because they + definitely will be. + + * dfg/DFGArgumentsSimplificationPhase.cpp: + (JSC::DFG::ArgumentsSimplificationPhase::run): + * dfg/DFGCFAPhase.cpp: + (JSC::DFG::CFAPhase::performBlockCFA): + * dfg/DFGCFGSimplificationPhase.cpp: + (JSC::DFG::CFGSimplificationPhase::keepOperandAlive): + * dfg/DFGCSEPhase.cpp: + (JSC::DFG::CSEPhase::pureCSE): + (JSC::DFG::CSEPhase::int32ToDoubleCSE): + (JSC::DFG::CSEPhase::constantCSE): + (JSC::DFG::CSEPhase::weakConstantCSE): + (JSC::DFG::CSEPhase::getCalleeLoadElimination): + (JSC::DFG::CSEPhase::getArrayLengthElimination): + (JSC::DFG::CSEPhase::globalVarLoadElimination): + (JSC::DFG::CSEPhase::scopedVarLoadElimination): + (JSC::DFG::CSEPhase::globalVarWatchpointElimination): + (JSC::DFG::CSEPhase::globalVarStoreElimination): + (JSC::DFG::CSEPhase::scopedVarStoreElimination): + (JSC::DFG::CSEPhase::getByValLoadElimination): + (JSC::DFG::CSEPhase::checkStructureElimination): + (JSC::DFG::CSEPhase::structureTransitionWatchpointElimination): + (JSC::DFG::CSEPhase::putStructureStoreElimination): + (JSC::DFG::CSEPhase::getByOffsetLoadElimination): + (JSC::DFG::CSEPhase::putByOffsetStoreElimination): + (JSC::DFG::CSEPhase::getPropertyStorageLoadElimination): + (JSC::DFG::CSEPhase::checkArrayElimination): + (JSC::DFG::CSEPhase::getIndexedPropertyStorageLoadElimination): + (JSC::DFG::CSEPhase::getMyScopeLoadElimination): + (JSC::DFG::CSEPhase::getLocalLoadElimination): + (JSC::DFG::CSEPhase::setLocalStoreElimination): + (JSC::DFG::CSEPhase::performNodeCSE): + * dfg/DFGFixupPhase.cpp: + (JSC::DFG::FixupPhase::fixupNode): + (JSC::DFG::FixupPhase::fixupSetLocalsInBlock): + * dfg/DFGPredictionPropagationPhase.cpp: + (JSC::DFG::PredictionPropagationPhase::propagate): + * dfg/DFGStructureCheckHoistingPhase.cpp: + (JSC::DFG::StructureCheckHoistingPhase::run): + +2013-03-06 Csaba Osztrogonác <ossy@webkit.org> + + Fix unused parameter warnings in ARM assembler + https://bugs.webkit.org/show_bug.cgi?id=111433 + + Reviewed by Kentaro Hara. + + * assembler/ARMAssembler.h: Remove unreachable revertJump() after r143346. + * assembler/MacroAssemblerARM.h: + (JSC::MacroAssemblerARM::moveIntsToDouble): Remove unused scratch parameter instead of UNUSED_PARAM. + (JSC::MacroAssemblerARM::branchConvertDoubleToInt32): Remove unused fpTemp parameter. + (JSC::MacroAssemblerARM::revertJumpReplacementToPatchableBranchPtrWithPatch): Remove unused parameters. + +2013-03-06 Andreas Kling <akling@apple.com> + + Unused Structure property tables waste 14MB on Membuster. + <http://webkit.org/b/110854> + <rdar://problem/13292104> + + Reviewed by Geoffrey Garen. + + Turn PropertyTable into a GC object and have Structure drop unpinned tables when marking. + 14 MB progression on Membuster3. + + This time it should stick; I've been through all the tests with COLLECT_ON_EVERY_ALLOCATION. + The issue with the last version was that Structure::m_offset could be used uninitialized + when re-materializing a previously GC'd property table, causing some sanity checks to fail. + + * CMakeLists.txt: + * GNUmakefile.list.am: + * JavaScriptCore.gypi: + * JavaScriptCore.vcxproj/JavaScriptCore.vcxproj: + * JavaScriptCore.xcodeproj/project.pbxproj: + * Target.pri: + + Added PropertyTable.cpp. + + * runtime/PropertyTable.cpp: Added. + (JSC::PropertyTable::create): + (JSC::PropertyTable::clone): + (JSC::PropertyTable::PropertyTable): + (JSC::PropertyTable::destroy): + (JSC::PropertyTable::~PropertyTable): + (JSC::PropertyTable::visitChildren): + + Moved marking of property table values here from Structure::visitChildren(). + + * runtime/WriteBarrier.h: + (JSC::WriteBarrierBase::get): + + Move m_cell to a local before using it multiple times. This avoids a multiple-access race when + Structure::checkOffsetConsistency() is used in assertions on the main thread while a marking thread + zaps the property table. + + * runtime/Structure.h: + (JSC::Structure::materializePropertyMapIfNecessary): + (JSC::Structure::materializePropertyMapIfNecessaryForPinning): + * runtime/StructureInlines.h: + (JSC::Structure::propertyTable): + + Added a getter for the Structure's PropertyTable that ASSERTs GC currently isn't active. + Because GC can zap an unpinned property table at any time, it's not entirely safe to access it. + Renamed the variable itself to m_propertyTableUnsafe to force call sites into explaining themselves. + + (JSC::Structure::putWillGrowOutOfLineStorage): + (JSC::Structure::checkOffsetConsistency): + + Moved these out of Structure.h to break header dependency cycle between Structure/PropertyTable. + + * runtime/Structure.cpp: + (JSC::Structure::visitChildren): + + Null out m_propertyTable if the table is unpinned. This'll cause the table to get GC'd. + + (JSC::Structure::takePropertyTableOrCloneIfPinned): + + Added for setting up the property table in a new transition, this code is now shared between + addPropertyTransition() and nonPropertyTransition(). + + * runtime/JSGlobalData.h: + * runtime/JSGlobalData.cpp: + (JSC::JSGlobalData::JSGlobalData): + + Add a global propertyTableStructure. + + * runtime/PropertyMapHashTable.h: + (PropertyTable): + (JSC::PropertyTable::createStructure): + (JSC::PropertyTable::copy): + + Make PropertyTable a GC object. + + * runtime/Structure.cpp: + (JSC::Structure::dumpStatistics): + (JSC::Structure::materializePropertyMap): + (JSC::Structure::despecifyDictionaryFunction): + (JSC::Structure::addPropertyTransition): + (JSC::Structure::changePrototypeTransition): + (JSC::Structure::despecifyFunctionTransition): + (JSC::Structure::attributeChangeTransition): + (JSC::Structure::toDictionaryTransition): + (JSC::Structure::sealTransition): + (JSC::Structure::freezeTransition): + (JSC::Structure::preventExtensionsTransition): + (JSC::Structure::nonPropertyTransition): + (JSC::Structure::isSealed): + (JSC::Structure::isFrozen): + (JSC::Structure::flattenDictionaryStructure): + (JSC::Structure::pin): + (JSC::Structure::copyPropertyTable): + (JSC::Structure::copyPropertyTableForPinning): + (JSC::Structure::get): + (JSC::Structure::despecifyFunction): + (JSC::Structure::despecifyAllFunctions): + (JSC::Structure::putSpecificValue): + (JSC::Structure::remove): + (JSC::Structure::createPropertyMap): + (JSC::Structure::getPropertyNamesFromStructure): + (JSC::Structure::checkConsistency): + +2013-03-05 Filip Pizlo <fpizlo@apple.com> + + Get rid of the invert argument to SpeculativeJIT::jumpSlowForUnwantedArrayMode + https://bugs.webkit.org/show_bug.cgi?id=105624 + + Reviewed by Oliver Hunt. + + All callers pass invert = false, which is the default value of the argument. So, get + rid of the argument and fold away all code that checks it. + + * dfg/DFGSpeculativeJIT.cpp: + (JSC::DFG::SpeculativeJIT::jumpSlowForUnwantedArrayMode): + * dfg/DFGSpeculativeJIT.h: + (SpeculativeJIT): + +2013-03-05 Filip Pizlo <fpizlo@apple.com> + + Unreviewed, fix an incorrect comment. The comment was a holdover from a work-in-progress version of this code. + + * dfg/DFGDCEPhase.cpp: + (JSC::DFG::DCEPhase::run): + +2013-03-04 Filip Pizlo <fpizlo@apple.com> + + DFG DCE might eliminate checks unsoundly + https://bugs.webkit.org/show_bug.cgi?id=109389 + + Reviewed by Oliver Hunt. + + This gets rid of all eager reference counting, and does all dead code elimination + in one phase - the DCEPhase. This phase also sets up the node reference counts, + which are then used not just for DCE but also register allocation and stack slot + allocation. + + Doing this required a number of surgical changes in places that previously relied + on always having liveness information. For example, the structure check hoisting + phase must now consult whether a VariableAccessData is profitable for unboxing to + make sure that it doesn't try to do hoisting on set SetLocals. The arguments + simplification phase employs its own light-weight liveness analysis. Both phases + previously just used reference counts. + + The largest change is that now, dead nodes get turned into Phantoms. Those + Phantoms will retain those child edges that are not proven. This ensures that any + type checks performed by a dead node remain even after the node is killed. On the + other hand, this Phantom conversion means that we need special handling for + SetLocal. I decided to make the four forms of SetLocal explicit: + + MovHint(@a, rK): Just indicates that node @a contains the value that would have + now been placed into virtual register rK. Does not actually cause @a to be + stored into rK. This would have previously been a dead SetLocal with @a + being live. MovHints are always dead. + + ZombieHint(rK): Indicates that at this point, register rK will contain a dead + value and OSR should put Undefined into it. This would have previously been + a dead SetLocal with @a being dead also. ZombieHints are always dead. + + MovHintAndCheck(@a, rK): Identical to MovHint except @a is also type checked, + according to whatever UseKind the edge to @a has. The type check is always a + forward exit. MovHintAndChecks are always live, since they are + NodeMustGenerate. Previously this would have been a dead SetLocal with a + live @a, and the check would have disappeared. This is one of the bugs that + this patch solves. + + SetLocal(@a, rK): This still does exactly what it does now, if the SetLocal is + live. + + Basically this patch makes it so that dead SetLocals eventually decay to MovHint, + ZombieHint, or MovHintAndCheck depending on the situation. If the child @a is + also dead, then you get a ZombieHint. If the child @a is live but the SetLocal + has a type check and @a's type hasn't been proven to have that type then you get + a MovHintAndCheck. Otherwise you get a MovHint. + + This is performance neutral. + + * CMakeLists.txt: + * GNUmakefile.list.am: + * JavaScriptCore.xcodeproj/project.pbxproj: + * Target.pri: + * dfg/DFGAbstractState.cpp: + (JSC::DFG::AbstractState::executeEffects): + (JSC::DFG::AbstractState::mergeStateAtTail): + * dfg/DFGArgumentsSimplificationPhase.cpp: + (JSC::DFG::ArgumentsSimplificationPhase::run): + (ArgumentsSimplificationPhase): + (JSC::DFG::ArgumentsSimplificationPhase::removeArgumentsReferencingPhantomChild): + * dfg/DFGBasicBlock.h: + (BasicBlock): + * dfg/DFGBasicBlockInlines.h: + (DFG): + * dfg/DFGByteCodeParser.cpp: + (JSC::DFG::ByteCodeParser::addToGraph): + (JSC::DFG::ByteCodeParser::insertPhiNode): + (JSC::DFG::ByteCodeParser::emitFunctionChecks): + * dfg/DFGCFAPhase.cpp: + (JSC::DFG::CFAPhase::run): + * dfg/DFGCFGSimplificationPhase.cpp: + (JSC::DFG::CFGSimplificationPhase::run): + (JSC::DFG::CFGSimplificationPhase::keepOperandAlive): + * dfg/DFGCPSRethreadingPhase.cpp: + (JSC::DFG::CPSRethreadingPhase::run): + (JSC::DFG::CPSRethreadingPhase::addPhiSilently): + * dfg/DFGCSEPhase.cpp: + (JSC::DFG::CSEPhase::eliminateIrrelevantPhantomChildren): + (JSC::DFG::CSEPhase::setReplacement): + (JSC::DFG::CSEPhase::performNodeCSE): + * dfg/DFGCommon.cpp: + (WTF::printInternal): + (WTF): + * dfg/DFGCommon.h: + (WTF): + * dfg/DFGConstantFoldingPhase.cpp: + (JSC::DFG::ConstantFoldingPhase::foldConstants): + (JSC::DFG::ConstantFoldingPhase::addStructureTransitionCheck): + (JSC::DFG::ConstantFoldingPhase::paintUnreachableCode): + * dfg/DFGDCEPhase.cpp: Added. + (DFG): + (DCEPhase): + (JSC::DFG::DCEPhase::DCEPhase): + (JSC::DFG::DCEPhase::run): + (JSC::DFG::DCEPhase::findTypeCheckRoot): + (JSC::DFG::DCEPhase::countEdge): + (JSC::DFG::DCEPhase::eliminateIrrelevantPhantomChildren): + (JSC::DFG::performDCE): + * dfg/DFGDCEPhase.h: Added. + (DFG): + * dfg/DFGDriver.cpp: + (JSC::DFG::compile): + * dfg/DFGFixupPhase.cpp: + (JSC::DFG::FixupPhase::fixupNode): + (JSC::DFG::FixupPhase::checkArray): + (JSC::DFG::FixupPhase::blessArrayOperation): + (JSC::DFG::FixupPhase::fixIntEdge): + (JSC::DFG::FixupPhase::injectInt32ToDoubleNode): + (JSC::DFG::FixupPhase::truncateConstantToInt32): + * dfg/DFGGraph.cpp: + (JSC::DFG::Graph::Graph): + (JSC::DFG::Graph::dump): + (DFG): + * dfg/DFGGraph.h: + (JSC::DFG::Graph::changeChild): + (JSC::DFG::Graph::changeEdge): + (JSC::DFG::Graph::compareAndSwap): + (JSC::DFG::Graph::clearAndDerefChild): + (JSC::DFG::Graph::performSubstitution): + (JSC::DFG::Graph::performSubstitutionForEdge): + (Graph): + (JSC::DFG::Graph::substitute): + * dfg/DFGInsertionSet.h: + (InsertionSet): + * dfg/DFGNode.h: + (JSC::DFG::Node::Node): + (JSC::DFG::Node::convertToConstant): + (JSC::DFG::Node::convertToGetLocalUnlinked): + (JSC::DFG::Node::containsMovHint): + (Node): + (JSC::DFG::Node::hasVariableAccessData): + (JSC::DFG::Node::willHaveCodeGenOrOSR): + * dfg/DFGNodeType.h: + (DFG): + * dfg/DFGPredictionPropagationPhase.cpp: + (JSC::DFG::PredictionPropagationPhase::propagate): + * dfg/DFGSpeculativeJIT.cpp: + (JSC::DFG::SpeculativeJIT::convertLastOSRExitToForward): + (JSC::DFG::SpeculativeJIT::compileMovHint): + (JSC::DFG::SpeculativeJIT::compileMovHintAndCheck): + (DFG): + (JSC::DFG::SpeculativeJIT::compileInlineStart): + (JSC::DFG::SpeculativeJIT::compile): + * 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): + (JSC::DFG::StructureCheckHoistingPhase::shouldConsiderForHoisting): + (StructureCheckHoistingPhase): + * dfg/DFGValidate.cpp: + (JSC::DFG::Validate::validate): + +2013-03-05 Mark Hahnenberg <mhahnenberg@apple.com> + + Objective-C API: JSValue should implement init and return nil in exceptional cases + https://bugs.webkit.org/show_bug.cgi?id=111487 + + Reviewed by Darin Adler. + + * API/JSValue.mm: + (-[JSValue init]): We return nil here because there is no way to get the instance into a coherent state + without a JSContext. + (-[JSValue initWithValue:inContext:]): Similarly, we should also return nil here if either of the arguments is 0. + +2013-03-05 Sheriff Bot <webkit.review.bot@gmail.com> + + Unreviewed, rolling out r144708. + http://trac.webkit.org/changeset/144708 + https://bugs.webkit.org/show_bug.cgi?id=111447 + + random assertion crashes in inspector tests on qt+mac bots + (Requested by kling on #webkit). + + * CMakeLists.txt: + * GNUmakefile.list.am: + * JavaScriptCore.gypi: + * JavaScriptCore.vcxproj/JavaScriptCore.vcxproj: + * JavaScriptCore.xcodeproj/project.pbxproj: + * Target.pri: + * runtime/JSGlobalData.cpp: + (JSC::JSGlobalData::JSGlobalData): + * runtime/JSGlobalData.h: + (JSGlobalData): + * runtime/PropertyMapHashTable.h: + (PropertyTable): + (JSC::PropertyTable::PropertyTable): + (JSC): + (JSC::PropertyTable::~PropertyTable): + (JSC::PropertyTable::copy): + * runtime/PropertyTable.cpp: Removed. + * runtime/Structure.cpp: + (JSC::Structure::dumpStatistics): + (JSC::Structure::materializePropertyMap): + (JSC::Structure::despecifyDictionaryFunction): + (JSC::Structure::addPropertyTransition): + (JSC::Structure::changePrototypeTransition): + (JSC::Structure::despecifyFunctionTransition): + (JSC::Structure::attributeChangeTransition): + (JSC::Structure::toDictionaryTransition): + (JSC::Structure::sealTransition): + (JSC::Structure::freezeTransition): + (JSC::Structure::preventExtensionsTransition): + (JSC::Structure::nonPropertyTransition): + (JSC::Structure::isSealed): + (JSC::Structure::isFrozen): + (JSC::Structure::flattenDictionaryStructure): + (JSC::Structure::pin): + (JSC::Structure::copyPropertyTable): + (JSC::Structure::copyPropertyTableForPinning): + (JSC::Structure::get): + (JSC::Structure::despecifyFunction): + (JSC::Structure::despecifyAllFunctions): + (JSC::Structure::putSpecificValue): + (JSC::Structure::remove): + (JSC::Structure::createPropertyMap): + (JSC::Structure::getPropertyNamesFromStructure): + (JSC::Structure::visitChildren): + (JSC::Structure::checkConsistency): + * runtime/Structure.h: + (JSC): + (JSC::Structure::putWillGrowOutOfLineStorage): + (JSC::Structure::materializePropertyMapIfNecessary): + (JSC::Structure::materializePropertyMapIfNecessaryForPinning): + (JSC::Structure::checkOffsetConsistency): + (Structure): + * runtime/StructureInlines.h: + (JSC::Structure::get): + * runtime/WriteBarrier.h: + (JSC::WriteBarrierBase::get): + +2013-03-05 David Kilzer <ddkilzer@apple.com> + + BUILD FIX (r144698): Only enable SPEECH_SYNTHESIS for Mac + <http://webkit.org/b/106742> + + Fixes the following build failures: + + Undefined symbols for architecture i386: + "__ZTVN7WebCore25PlatformSpeechSynthesizerE", referenced from: + __ZN7WebCore25PlatformSpeechSynthesizerC2EPNS_31PlatformSpeechSynthesizerClientE in PlatformSpeechSynthesizer.o + NOTE: a missing vtable usually means the first non-inline virtual member function has no definition. + "__ZN7WebCore25PlatformSpeechSynthesizer19initializeVoiceListEv", referenced from: + __ZN7WebCore25PlatformSpeechSynthesizerC2EPNS_31PlatformSpeechSynthesizerClientE in PlatformSpeechSynthesizer.o + ld: symbol(s) not found for architecture i386 + + * Configurations/FeatureDefines.xcconfig: + - Fix definition of ENABLE_ENCRYPTED_MEDIA_V2_macosx to match + other FeatureDefines.xcconfig files. + - Only set ENABLE_SPEECH_SYNTHESIS for the macosx platform. + +2013-03-04 Andreas Kling <akling@apple.com> + + Unused Structure property tables waste 14MB on Membuster. + <http://webkit.org/b/110854> + <rdar://problem/13292104> + + Reviewed by Geoffrey Garen. + + Turn PropertyTable into a GC object and have Structure drop unpinned tables when marking. + 14 MB progression on Membuster3. + + * CMakeLists.txt: + * GNUmakefile.list.am: + * JavaScriptCore.gypi: + * JavaScriptCore.vcxproj/JavaScriptCore.vcxproj: + * JavaScriptCore.xcodeproj/project.pbxproj: + * Target.pri: + + Added PropertyTable.cpp. + + * runtime/PropertyTable.cpp: Added. + (JSC::PropertyTable::create): + (JSC::PropertyTable::clone): + (JSC::PropertyTable::PropertyTable): + (JSC::PropertyTable::destroy): + (JSC::PropertyTable::~PropertyTable): + (JSC::PropertyTable::visitChildren): + + Moved marking of property table values here from Structure::visitChildren(). + + * runtime/WriteBarrier.h: + (JSC::WriteBarrierBase::get): + + Move m_cell to a local before using it multiple times. This avoids a multiple-access race when + Structure::checkOffsetConsistency() is used in assertions on the main thread while a marking thread + zaps the property table. + + * runtime/Structure.h: + (JSC::Structure::materializePropertyMapIfNecessary): + (JSC::Structure::materializePropertyMapIfNecessaryForPinning): + * runtime/StructureInlines.h: + (JSC::Structure::propertyTable): + + Added a getter for the Structure's PropertyTable that ASSERTs GC currently isn't active. + Because GC can zap an unpinned property table at any time, it's not entirely safe to access it. + Renamed the variable itself to m_propertyTableUnsafe to force call sites into explaining themselves. + + (JSC::Structure::putWillGrowOutOfLineStorage): + (JSC::Structure::checkOffsetConsistency): + + Moved these out of Structure.h to break header dependency cycle between Structure/PropertyTable. + + * runtime/Structure.cpp: + (JSC::Structure::visitChildren): + + Null out m_propertyTable if the table is unpinned. This'll cause the table to get GC'd. + + * runtime/JSGlobalData.h: + * runtime/JSGlobalData.cpp: + (JSC::JSGlobalData::JSGlobalData): + + Add a global propertyTableStructure. + + * runtime/PropertyMapHashTable.h: + (PropertyTable): + (JSC::PropertyTable::createStructure): + (JSC::PropertyTable::copy): + + Make PropertyTable a GC object. + + * runtime/Structure.cpp: + (JSC::Structure::dumpStatistics): + (JSC::Structure::materializePropertyMap): + (JSC::Structure::despecifyDictionaryFunction): + (JSC::Structure::addPropertyTransition): + (JSC::Structure::changePrototypeTransition): + (JSC::Structure::despecifyFunctionTransition): + (JSC::Structure::attributeChangeTransition): + (JSC::Structure::toDictionaryTransition): + (JSC::Structure::sealTransition): + (JSC::Structure::freezeTransition): + (JSC::Structure::preventExtensionsTransition): + (JSC::Structure::nonPropertyTransition): + (JSC::Structure::isSealed): + (JSC::Structure::isFrozen): + (JSC::Structure::flattenDictionaryStructure): + (JSC::Structure::pin): + (JSC::Structure::copyPropertyTable): + (JSC::Structure::copyPropertyTableForPinning): + (JSC::Structure::get): + (JSC::Structure::despecifyFunction): + (JSC::Structure::despecifyAllFunctions): + (JSC::Structure::putSpecificValue): + (JSC::Structure::remove): + (JSC::Structure::createPropertyMap): + (JSC::Structure::getPropertyNamesFromStructure): + (JSC::Structure::checkConsistency): + +2013-03-04 Chris Fleizach <cfleizach@apple.com> + + Support WebSpeech - Speech Synthesis + https://bugs.webkit.org/show_bug.cgi?id=106742 + + Reviewed by Simon Fraser. + + Enable speech synthesis for the Mac. + + * Configurations/FeatureDefines.xcconfig: + +2013-03-04 Mark Hahnenberg <mhahnenberg@apple.com> + + Remove contextInternalContext from JSContextInternal.h + https://bugs.webkit.org/show_bug.cgi?id=111356 + + Reviewed by Geoffrey Garen. + + We don't need it any more since we have globalContextRef in JSContext. + + * API/JSContext.mm: + * API/JSContextInternal.h: + * API/JSValue.mm: + (+[JSValue valueWithBool:inContext:]): + (+[JSValue valueWithDouble:inContext:]): + (+[JSValue valueWithInt32:inContext:]): + (+[JSValue valueWithUInt32:inContext:]): + (+[JSValue valueWithNewObjectInContext:]): + (+[JSValue valueWithNewArrayInContext:]): + (+[JSValue valueWithNewRegularExpressionFromPattern:flags:inContext:]): + (+[JSValue valueWithNewErrorFromMessage:inContext:]): + (+[JSValue valueWithNullInContext:]): + (+[JSValue valueWithUndefinedInContext:]): + (-[JSValue toBool]): + (-[JSValue toDouble]): + (-[JSValue toNumber]): + (-[JSValue toString]): + (-[JSValue toDate]): + (-[JSValue toArray]): + (-[JSValue toDictionary]): + (-[JSValue valueForProperty:]): + (-[JSValue setValue:forProperty:]): + (-[JSValue deleteProperty:]): + (-[JSValue hasProperty:]): + (-[JSValue valueAtIndex:]): + (-[JSValue setValue:atIndex:]): + (-[JSValue isUndefined]): + (-[JSValue isNull]): + (-[JSValue isBoolean]): + (-[JSValue isNumber]): + (-[JSValue isString]): + (-[JSValue isObject]): + (-[JSValue isEqualToObject:]): + (-[JSValue isEqualWithTypeCoercionToObject:]): + (-[JSValue isInstanceOf:]): + (-[JSValue callWithArguments:]): + (-[JSValue constructWithArguments:]): + (-[JSValue invokeMethod:withArguments:]): + (valueToObject): + (objectToValueWithoutCopy): + (objectToValue): + (-[JSValue initWithValue:inContext:]): + (-[JSValue dealloc]): + (-[JSValue description]): + * API/JSWrapperMap.mm: + (createObjectWithCustomBrand): + (-[JSObjCClassInfo allocateConstructorAndPrototypeWithSuperClassInfo:]): + (-[JSObjCClassInfo wrapperForObject:]): + (-[JSWrapperMap jsWrapperForObject:]): + * API/ObjCCallbackFunction.mm: + (ObjCCallbackFunction::call): + (objCCallbackFunctionForInvocation): + +2013-03-04 Andreas Kling <akling@apple.com> + + Add simple vector traits for JSC::Identifier. + <http://webkit.org/b/111323> + + Reviewed by Geoffrey Garen. + + Identifiers are really just Strings, giving them simple vector traits makes + Vector move them with memcpy() instead of churning the refcounts. + + * runtime/Identifier.h: + (WTF): + +2013-03-04 Kunihiko Sakamoto <ksakamoto@chromium.org> + + Add build flag for FontLoader + https://bugs.webkit.org/show_bug.cgi?id=111289 + + Reviewed by Benjamin Poulain. + + Add ENABLE_FONT_LOAD_EVENTS build flag (disabled by default). + + * Configurations/FeatureDefines.xcconfig: + +2013-03-03 Andreas Kling <akling@apple.com> + + Shrink JSC::HashTable entries. + <http://webkit.org/b/111275> + <rdar://problem/13333511> + + Reviewed by Anders Carlsson. + + Move the Intrinsic value out of the function-specific part of the union, + and store it next to m_attributes. Reduces the size of HashEntry by 8 bytes. + + 990 kB progression on Membuster3. (PTUS: 797 kB) + + * runtime/Lookup.h: + (JSC::HashEntry::initialize): + (JSC::HashEntry::intrinsic): + (HashEntry): + +2013-03-01 David Kilzer <ddkilzer@apple.com> + + BUILD FIX: testapi should link to Foundation, not CoreFoundation + + * JavaScriptCore.xcodeproj/project.pbxproj: Change testapi to + link to Foundation.framework instead of CoreFoundation.framework + since it uses NS types. + +2013-03-01 Mark Hahnenberg <mhahnenberg@apple.com> + + Objective-C API: Passing JS functions to Objective-C callbacks causes JSValue to leak + https://bugs.webkit.org/show_bug.cgi?id=107836 + + Reviewed by Oliver Hunt. + + We've decided to remove support for this feature from the API because there's no way to automatically manage + the memory for clients in a satisfactory manner. Clients can still pass JS functions to Objective-C methods, + but the methods must accept plain JSValues instead of Objective-C blocks. + + We now ignore functions that are part of a protocol that inherits from JSExport that accept blocks as arguments. + + * API/JSBlockAdaptor.h: Removed. + * API/JSBlockAdaptor.mm: Removed. + * API/ObjCCallbackFunction.mm: + (ArgumentTypeDelegate::typeBlock): Return nil to signal that we want to ignore this function when copying it + to the object from the protocol. + * API/tests/testapi.mm: Added a test to make sure that we ignore methods declared as part of a JSExport-ed protocol + that have block arguments. + (-[TestObject bogusCallback:]): + * JavaScriptCore.gypi: Updated build files. + * JavaScriptCore.xcodeproj/project.pbxproj: + +2013-03-01 Filip Pizlo <fpizlo@apple.com> + + DFG Branch(LogicalNot) peephole should not try to optimize and work-around the case where LogicalNot may be otherwise live + https://bugs.webkit.org/show_bug.cgi?id=111209 + + Reviewed by Oliver Hunt. + + Even if it is then everything will work just fine. It's not necessary to check the ref count here. + + * dfg/DFGFixupPhase.cpp: + (JSC::DFG::FixupPhase::fixupNode): + +2013-03-01 Filip Pizlo <fpizlo@apple.com> + + DFG CSE phase shouldn't rely on ref count of nodes, since it doesn't have to + https://bugs.webkit.org/show_bug.cgi?id=111205 + + Reviewed by Oliver Hunt. + + I don't understand the intuition behind setLocalStoreElimination() validating that the SetLocal's ref count + is 1. I believe this is a hold-over from when setLocalStoreElimination() would match one SetLocal to another, + and then try to eliminate the first SetLocal. But that's not how it works now. Now, setLocalStoreElimination() + is actually Flush elimination: it eliminates any Flush that anchors a SetLocal if it proves that every path + from the SetLocal to the Flush is devoid of operations that may observe the local. It doesn't actually kill + the SetLocal itself: if the SetLocal is live because of other things (other Flushes or GetLocals in other + basic blocks), then the SetLocal will naturally still be alive because th Flush was only keeping the SetLocal + alive by one count rather than being solely responsible for its liveness. + + * dfg/DFGCSEPhase.cpp: + (JSC::DFG::CSEPhase::setLocalStoreElimination): + (JSC::DFG::CSEPhase::eliminate): + (JSC::DFG::CSEPhase::performNodeCSE): + +2013-03-01 Filip Pizlo <fpizlo@apple.com> + + Rename MovHint to MovHintEvent so I can create a NodeType called MovHint + + Rubber stamped by Mark Hahnenberg. + + This is similar to the SetLocal/SetLocalEvent naming scheme, where SetLocal is the + NodeType and SetLocalEvent is the VariableEventKind. + + * dfg/DFGVariableEvent.cpp: + (JSC::DFG::VariableEvent::dump): + * dfg/DFGVariableEvent.h: + (JSC::DFG::VariableEvent::movHint): + (JSC::DFG::VariableEvent::id): + (JSC::DFG::VariableEvent::operand): + (VariableEvent): + * dfg/DFGVariableEventStream.cpp: + (JSC::DFG::VariableEventStream::reconstruct): + +2013-03-01 Raphael Kubo da Costa <raphael.kubo.da.costa@intel.com> + + [JSC] Fix sign comparison warning/error after r144340. + https://bugs.webkit.org/show_bug.cgi?id=111164 + + Reviewed by Mark Hahnenberg. + + gcc (both 4.2.1 and 4.7.2) complain about comparing signed and + unsigned terms (clang accepts it just fine). + + Work around that by casting the 1 to an uintptr_t as well. + + * dfg/DFGEdge.h: + (JSC::DFG::Edge::makeWord): + +2013-02-28 Filip Pizlo <fpizlo@apple.com> + + DFG CFA should not do liveness pruning + https://bugs.webkit.org/show_bug.cgi?id=111119 + + Reviewed by Mark Hahnenberg. + + It adds complexity and probably buys nothing. Moreover, I'm transitioning to having + liveness only available at the bitter end of compilation, so this will stop working + after https://bugs.webkit.org/show_bug.cgi?id=109389 anyway. + + * dfg/DFGAbstractState.cpp: + (JSC::DFG::AbstractState::initialize): + (JSC::DFG::AbstractState::mergeStateAtTail): + +2013-02-28 Filip Pizlo <fpizlo@apple.com> + + Don't try to emit profiling if you don't have the DFG JIT. + + Rubber stamped by Mark Hahnenberg. + + * jit/JIT.h: + (JSC::JIT::shouldEmitProfiling): + +2013-02-28 Filip Pizlo <fpizlo@apple.com> + + DFG Phantom node should be honest about the fact that it can exit + https://bugs.webkit.org/show_bug.cgi?id=111115 + + Reviewed by Mark Hahnenberg. + + The chances of this having cause serious issues are low, since most clients of the + NodeDoesNotExit flag run after CFA and CFA updates this properly. But one possible + case of badness is if the ByteCodeParser inserted a Phantom with a type check in + between a LogicalNot and a Branch; then that peephole optimization in Fixup might + go slightly wrong. + + * dfg/DFGNodeType.h: + (DFG): + +2013-02-28 Mark Hahnenberg <mhahnenberg@apple.com> + + Add casts in DFGGPRInfo.h to suppress warnings + https://bugs.webkit.org/show_bug.cgi?id=111104 + + Reviewed by Filip Pizlo. + + With certain flags on, we get compiler warnings on ARM. We should do the proper casts to make these warnings go away. + + * dfg/DFGGPRInfo.h: + (JSC::DFG::GPRInfo::toIndex): + (JSC::DFG::GPRInfo::debugName): + +2013-02-28 Filip Pizlo <fpizlo@apple.com> + + It should be easy to determine if a DFG node exits forward or backward when doing type checks + https://bugs.webkit.org/show_bug.cgi?id=111102 + + Reviewed by Mark Hahnenberg. + + This adds a NodeExitsForward flag, which tells you the exit directionality of + type checks performed by the node. Even if you convert the node to a Phantom + and use the Edge UseKind for type checks, you'll still get the same exit + directionality that the original node would have wanted. + + * dfg/DFGArgumentsSimplificationPhase.cpp: + (JSC::DFG::ArgumentsSimplificationPhase::run): + * dfg/DFGArrayifySlowPathGenerator.h: + (JSC::DFG::ArrayifySlowPathGenerator::ArrayifySlowPathGenerator): + * dfg/DFGCFGSimplificationPhase.cpp: + (JSC::DFG::CFGSimplificationPhase::run): + (JSC::DFG::CFGSimplificationPhase::mergeBlocks): + * dfg/DFGCPSRethreadingPhase.cpp: + (JSC::DFG::CPSRethreadingPhase::canonicalizeFlushOrPhantomLocalFor): + * dfg/DFGCSEPhase.cpp: + (JSC::DFG::CSEPhase::setReplacement): + (JSC::DFG::CSEPhase::eliminate): + (JSC::DFG::CSEPhase::performNodeCSE): + * dfg/DFGConstantFoldingPhase.cpp: + (JSC::DFG::ConstantFoldingPhase::foldConstants): + * dfg/DFGFixupPhase.cpp: + (JSC::DFG::FixupPhase::checkArray): + * dfg/DFGNode.h: + (Node): + (JSC::DFG::Node::setOpAndDefaultNonExitFlags): + (JSC::DFG::Node::convertToPhantom): + * dfg/DFGNodeFlags.cpp: + (JSC::DFG::nodeFlagsAsString): + * dfg/DFGNodeFlags.h: + (DFG): + * dfg/DFGNodeType.h: + (DFG): + * dfg/DFGSpeculativeJIT.cpp: + (JSC::DFG::SpeculativeJIT::backwardSpeculationCheck): + (DFG): + (JSC::DFG::SpeculativeJIT::speculationCheck): + (JSC::DFG::SpeculativeJIT::speculationWatchpoint): + (JSC::DFG::SpeculativeJIT::forwardSpeculationCheck): + (JSC::DFG::SpeculativeJIT::backwardTypeCheck): + (JSC::DFG::SpeculativeJIT::typeCheck): + (JSC::DFG::SpeculativeJIT::forwardTypeCheck): + (JSC::DFG::SpeculativeJIT::fillStorage): + (JSC::DFG::SpeculativeJIT::compile): + (JSC::DFG::SpeculativeJIT::checkArgumentTypes): + (JSC::DFG::SpeculativeJIT::compileValueToInt32): + (JSC::DFG::SpeculativeJIT::compileInt32ToDouble): + * dfg/DFGSpeculativeJIT.h: + (SpeculativeJIT): + (JSC::DFG::SpeculateIntegerOperand::SpeculateIntegerOperand): + (JSC::DFG::SpeculateIntegerOperand::gpr): + (SpeculateIntegerOperand): + (JSC::DFG::SpeculateDoubleOperand::SpeculateDoubleOperand): + (JSC::DFG::SpeculateDoubleOperand::fpr): + (SpeculateDoubleOperand): + (JSC::DFG::SpeculateCellOperand::SpeculateCellOperand): + (JSC::DFG::SpeculateCellOperand::gpr): + (SpeculateCellOperand): + (JSC::DFG::SpeculateBooleanOperand::SpeculateBooleanOperand): + (JSC::DFG::SpeculateBooleanOperand::gpr): + (SpeculateBooleanOperand): + * dfg/DFGSpeculativeJIT32_64.cpp: + (JSC::DFG::SpeculativeJIT::fillSpeculateIntInternal): + (JSC::DFG::SpeculativeJIT::fillSpeculateInt): + (JSC::DFG::SpeculativeJIT::fillSpeculateIntStrict): + (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::fillSpeculateInt): + (JSC::DFG::SpeculativeJIT::fillSpeculateIntStrict): + (JSC::DFG::SpeculativeJIT::fillSpeculateDouble): + (JSC::DFG::SpeculativeJIT::fillSpeculateCell): + (JSC::DFG::SpeculativeJIT::fillSpeculateBoolean): + (JSC::DFG::SpeculativeJIT::compile): + +2013-02-28 Filip Pizlo <fpizlo@apple.com> + + CodeBlock::valueProfile() has a bogus assertion + https://bugs.webkit.org/show_bug.cgi?id=111106 + <rdar://problem/13131427> + + Reviewed by Mark Hahnenberg. + + This was just a bad assertion: m_bytecodeOffset == -1 means that the value profile is constructed but not initialized. + ValueProfile constructs itself in a safe way; you can call any method you want on a constructed but not initialized + ValueProfile. CodeBlock first constructs all ValueProfiles (by growing the ValueProfile vector) and then initializes + their m_bytecodeOffset later. This is necessary because the initialization is linking bytecode instructions to their + ValueProfiles, so at that point we don't want the ValueProfile vector to resize, which implies that we want all of + them to already be constructed. A GC can happen during this phase, and the GC may want to walk all ValueProfiles. + This is safe, but one of the ValueProfile getters (CodeBlock::valueProfile()) was asserting that any value profile + you get has had its m_bytecodeOffset initialized. This need not be the case and nothing will go wrong if it isn't. + + The solution is to remove the assertion, which I believe was put there to ensure that my m_valueProfiles refactoring + a long time ago was sound: it used to be that a ValueProfile with m_bytecodeOffset == -1 was an argument profile; now + all argument profiles are in m_argumentValueProfiles instead. I think it's safe to say that this refactoring was done + soundly since it was a long time ago. So we should kill the assertion - I don't see an easy way to make the assertion + sound with respect to the GC-during-CodeBlock-construction issue, and I don't believe that the assertion is buying us + anything at this point. + + * bytecode/CodeBlock.h: + (JSC::CodeBlock::valueProfile): + +2013-02-27 Filip Pizlo <fpizlo@apple.com> + + DFG CFA should leave behind information in Edge that says if the Edge's type check is proven to succeed + https://bugs.webkit.org/show_bug.cgi?id=110840 + + Reviewed by Mark Hahnenberg. + + This doesn't add any observable functionality to the compiler, yet. But it does give + every phase that runs after CFA the ability to know, in O(1) time, whether an edge + will need to execute a type check. + + * dfg/DFGAbstractState.h: + (JSC::DFG::AbstractState::filterEdgeByUse): + (JSC::DFG::AbstractState::filterByType): + * dfg/DFGCommon.cpp: + (WTF): + (WTF::printInternal): + * dfg/DFGCommon.h: + (JSC::DFG::isProved): + (DFG): + (JSC::DFG::proofStatusForIsProved): + (WTF): + * dfg/DFGEdge.cpp: + (JSC::DFG::Edge::dump): + * dfg/DFGEdge.h: + (JSC::DFG::Edge::Edge): + (JSC::DFG::Edge::setNode): + (JSC::DFG::Edge::useKindUnchecked): + (JSC::DFG::Edge::setUseKind): + (Edge): + (JSC::DFG::Edge::proofStatusUnchecked): + (JSC::DFG::Edge::proofStatus): + (JSC::DFG::Edge::setProofStatus): + (JSC::DFG::Edge::isProved): + (JSC::DFG::Edge::needsCheck): + (JSC::DFG::Edge::shift): + (JSC::DFG::Edge::makeWord): + +2013-02-28 Simon Hausmann <simon.hausmann@digia.com> + + [Qt][Mac] Fix massive parallel builds + + Reviewed by Tor Arne Vestbø. + + There exists a race condition that LLIntDesiredOffsets.h is written to + by two parllel instances of the ruby script. This patch ensures that similar to the output file, + the generated file is also prefixed according to the build configuration. + + * LLIntOffsetsExtractor.pro: + +2013-02-27 Sheriff Bot <webkit.review.bot@gmail.com> + + Unreviewed, rolling out r144168. + http://trac.webkit.org/changeset/144168 + https://bugs.webkit.org/show_bug.cgi?id=111019 + + It broke the build and tronical is unavailable (Requested by + Ossy_night on #webkit). + + * LLIntOffsetsExtractor.pro: + +2013-02-26 Filip Pizlo <fpizlo@apple.com> + + Disable some unsound DFG DCE + https://bugs.webkit.org/show_bug.cgi?id=110948 + + Reviewed by Michael Saboff. + + DCE of bitops is not sound since the bitops might call some variant of valueOf. + + This used to work right because ValueToInt32 was MustGenerate. From the DFG IR + standpoint it feels weird to make ValueToInt32 be MustGenerate since that node is + implemented entirely as a pure conversion. If we ever gave the DFG the ability to + do effectful bitops, we would most likely implement them as special nodes not + related to the ValueToInt32 and bitop nodes we have now. + + This change is performance neutral. + + * dfg/DFGNodeType.h: + (DFG): + +2013-02-27 Glenn Adams <glenn@skynav.com> + + Add ENABLE_CSS3_TEXT_LINE_BREAK flag. + https://bugs.webkit.org/show_bug.cgi?id=110944 + + Reviewed by Dean Jackson. + + * Configurations/FeatureDefines.xcconfig: + +2013-02-27 Julien Brianceau <jbrianceau@nds.com> + + Fix build when DFG_JIT is not enabled + https://bugs.webkit.org/show_bug.cgi?id=110991 + + Reviewed by Csaba Osztrogonác. + + * jit/JIT.h: + (JSC::JIT::canBeOptimizedOrInlined): + +2013-02-27 Simon Hausmann <simon.hausmann@digia.com> + + [Qt][Mac] Fix massive parallel builds + + Reviewed by Tor Arne Vestbø. + + There exists a race condition that LLIntDesiredOffsets.h is written to + by two parllel instances of the ruby script. This patch ensures that similar to the output file, + the generated file is also prefixed according to the build configuration. + + * LLIntOffsetsExtractor.pro: + +2013-02-26 Filip Pizlo <fpizlo@apple.com> + + DFG OSR exit doesn't know which virtual register to use for the last result register for post_inc and post_dec + https://bugs.webkit.org/show_bug.cgi?id=109036 + <rdar://problem/13292139> + + Reviewed by Gavin Barraclough. + + This was a two-fold problem: + + 1) post_inc/dec has two results - the new value of the variable, and the old value of the variable. DFG OSR exit + assumed that the "last result" used for the Baseline JIT's register allocation would be the new value. It was + wrong in this assumption. + + 2) The Baseline JIT knew to disable its last result optimization in cases where it might confuse the DFG. But it + was doing this only for code blocks that could be totally optimized, but not code blocks that could only be + optimized when inlined. + + This patch introduces a more rigorous notion of when the Baseline JIT emits profiling, when it does extra work + to account for the possibility of OSR exit, and when it does extra work to account for the possibility of OSR + entry. These notions are called shouldEmitProfiling(), canBeOptimizedOrInlined(), and canBeOptimized(), + respectively. + + This is performance-neutral and fixes the reported bug. It probably fixes other bugs as well, since previously + we for example weren't doing the more conservative implementation of op_mov in the Baseline JIT for code blocks + that could be inlined but not optimized. So, if such a code block OSR exited at just the right point, you'd get + symptoms similar to this bug. + + * dfg/DFGCapabilities.h: + (JSC::DFG::canCompileOpcode): + * dfg/DFGCommon.h: + * jit/JIT.cpp: + (JSC::JIT::privateCompile): + * jit/JIT.h: + (JSC::JIT::compilePatchGetArrayLength): + (JSC::JIT::canBeOptimizedOrInlined): + (JIT): + * jit/JITArithmetic.cpp: + (JSC::JIT::emit_op_post_inc): + (JSC::JIT::emit_op_post_dec): + * jit/JITArithmetic32_64.cpp: + (JSC::JIT::emit_op_post_inc): + (JSC::JIT::emit_op_post_dec): + * jit/JITCall.cpp: + (JSC::JIT::emit_op_call_put_result): + (JSC::JIT::compileOpCall): + * jit/JITCall32_64.cpp: + (JSC::JIT::compileOpCall): + * jit/JITInlines.h: + (JSC::JIT::emitArrayProfilingSite): + (JSC::JIT::map): + * jit/JITOpcodes.cpp: + (JSC::JIT::emit_op_mov): + * jit/JITPropertyAccess.cpp: + (JSC::JIT::compileGetByIdHotPath): + (JSC::JIT::privateCompilePutByIdTransition): + * jit/JITPropertyAccess32_64.cpp: + (JSC::JIT::compileGetByIdHotPath): + (JSC::JIT::privateCompilePutByIdTransition): + +2013-02-26 Roger Fong <roger_fong@apple.com> + + Unreviewed. AppleWin VS2010 build fix. + + * JavaScriptCore.vcxproj/JavaScriptCoreExportGenerator/JavaScriptCoreExports.def.in: + +2013-02-25 Filip Pizlo <fpizlo@apple.com> + + The DFG backend's and OSR's decision to unbox a variable should be based on whether it's used in a typed context + https://bugs.webkit.org/show_bug.cgi?id=110433 + + Reviewed by Oliver Hunt and Mark Hahnenberg. + + This introduces the equivalent of a liveness analysis, except for type checking. + A variable is said to be "profitable for unboxing" (i.e. live at a type check) + if there exists a type check on a GetLocal of that variable, and the type check + is consistent with the variable's prediction. Variables that are not profitable + for unboxing aren't unboxed. Previously they would have been. + + This is a slight speed-up on some things but mostly neutral. + + * dfg/DFGArgumentPosition.h: + (JSC::DFG::ArgumentPosition::ArgumentPosition): + (JSC::DFG::ArgumentPosition::mergeShouldNeverUnbox): + (JSC::DFG::ArgumentPosition::mergeArgumentPredictionAwareness): + (JSC::DFG::ArgumentPosition::mergeArgumentUnboxingAwareness): + (ArgumentPosition): + (JSC::DFG::ArgumentPosition::isProfitableToUnbox): + (JSC::DFG::ArgumentPosition::shouldUseDoubleFormat): + * dfg/DFGCommon.h: + (JSC::DFG::checkAndSet): + (DFG): + * dfg/DFGFixupPhase.cpp: + (JSC::DFG::FixupPhase::run): + (JSC::DFG::FixupPhase::fixupNode): + (JSC::DFG::FixupPhase::fixupSetLocalsInBlock): + (FixupPhase): + (JSC::DFG::FixupPhase::alwaysUnboxSimplePrimitives): + (JSC::DFG::FixupPhase::setUseKindAndUnboxIfProfitable): + * dfg/DFGPredictionPropagationPhase.cpp: + (JSC::DFG::PredictionPropagationPhase::doRoundOfDoubleVoting): + * dfg/DFGSpeculativeJIT.cpp: + (JSC::DFG::SpeculativeJIT::checkArgumentTypes): + * dfg/DFGVariableAccessData.h: + (JSC::DFG::VariableAccessData::VariableAccessData): + (JSC::DFG::VariableAccessData::mergeIsCaptured): + (JSC::DFG::VariableAccessData::mergeIsProfitableToUnbox): + (VariableAccessData): + (JSC::DFG::VariableAccessData::isProfitableToUnbox): + (JSC::DFG::VariableAccessData::shouldUnboxIfPossible): + (JSC::DFG::VariableAccessData::mergeStructureCheckHoistingFailed): + (JSC::DFG::VariableAccessData::mergeIsArgumentsAlias): + (JSC::DFG::VariableAccessData::shouldUseDoubleFormat): + (JSC::DFG::VariableAccessData::mergeFlags): + +2013-02-26 Oliver Hunt <oliver@apple.com> + + Fix windows build. + + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCoreExports.def: + +2013-02-26 Oliver Hunt <oliver@apple.com> + + Web Inspector: REGRESSION: [JSC] SourceProvider reuses IDs + https://bugs.webkit.org/show_bug.cgi?id=99674 + + Reviewed by Gavin Barraclough. + + Simple incrementing counter for SourceProvider IDs. Uses a + lock to incrementing the counter so we don't increment reuse + counter values or reassign the ID for a given SourceProvider. + + * parser/SourceProvider.cpp: + (JSC::SourceProvider::SourceProvider): + (JSC): + (JSC::SourceProvider::getID): + * parser/SourceProvider.h: + (JSC::SourceProvider::asID): + (SourceProvider): + +2013-02-26 Sheriff Bot <webkit.review.bot@gmail.com> + + Unreviewed, rolling out r144074. + http://trac.webkit.org/changeset/144074 + https://bugs.webkit.org/show_bug.cgi?id=110897 + + Causing 20+ crashes on Mac (Requested by bradee-oh on + #webkit). + + * CMakeLists.txt: + * GNUmakefile.list.am: + * JavaScriptCore.gypi: + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: + * JavaScriptCore.vcxproj/JavaScriptCore.vcxproj: + * JavaScriptCore.xcodeproj/project.pbxproj: + * Target.pri: + * runtime/JSGlobalData.cpp: + (JSC::JSGlobalData::JSGlobalData): + * runtime/JSGlobalData.h: + (JSGlobalData): + * runtime/PropertyMapHashTable.h: + (PropertyTable): + (JSC::PropertyTable::PropertyTable): + (JSC): + (JSC::PropertyTable::~PropertyTable): + (JSC::PropertyTable::copy): + * runtime/PropertyTable.cpp: Removed. + * runtime/Structure.cpp: + (JSC::Structure::materializePropertyMap): + (JSC::Structure::addPropertyTransition): + (JSC::Structure::changePrototypeTransition): + (JSC::Structure::despecifyFunctionTransition): + (JSC::Structure::attributeChangeTransition): + (JSC::Structure::toDictionaryTransition): + (JSC::Structure::preventExtensionsTransition): + (JSC::Structure::nonPropertyTransition): + (JSC::Structure::copyPropertyTable): + (JSC::Structure::copyPropertyTableForPinning): + (JSC::Structure::putSpecificValue): + (JSC::Structure::createPropertyMap): + (JSC::Structure::visitChildren): + * runtime/Structure.h: + (JSC): + (JSC::Structure::putWillGrowOutOfLineStorage): + (JSC::Structure::checkOffsetConsistency): + (Structure): + * runtime/StructureInlines.h: + +2013-02-26 Roger Fong <roger_fong@apple.com> + + Unreviewed. AppleWin VS2010 build fix. + + * JavaScriptCore.vcxproj/JavaScriptCoreExportGenerator/JavaScriptCoreExportGeneratorCommon.props: + +2013-02-26 Jer Noble <jer.noble@apple.com> + + Unreviewed build fix; use correct macro for platform name in FeatureDefines.xcconfig. + + * Configurations/FeatureDefines.xcconfig: + +2013-02-26 Michael Saboff <msaboff@apple.com> + + Potential crash in YARR JIT generated code when building 64 bit + https://bugs.webkit.org/show_bug.cgi?id=110893 + + Reviewed by Gavin Barraclough. + + The ABI doesn't define the behavior for the upper bits of a value that takes less than 64 bits. + Therefore, we zero extend both the count and length registers to assure that these unsigned values + don't have garbage upper bits. + + * yarr/YarrJIT.cpp: + (JSC::Yarr::YarrGenerator::generateEnter): + +2013-02-26 Andreas Kling <akling@apple.com> + + Unused Structure property tables waste 14MB on Membuster. + <http://webkit.org/b/110854> + <rdar://problem/13292104> + + Reviewed by Filip Pizlo. + + Turn PropertyTable into a GC object and have Structure drop unpinned tables when marking. + 14 MB progression on Membuster3. + + * CMakeLists.txt: + * GNUmakefile.list.am: + * JavaScriptCore.gypi: + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: + * JavaScriptCore.vcxproj/JavaScriptCore.vcxproj: + * JavaScriptCore.xcodeproj/project.pbxproj: + * Target.pri: + + Added PropertyTable.cpp. + + * runtime/PropertyTable.cpp: Added. + (JSC::PropertyTable::create): + (JSC::PropertyTable::clone): + (JSC::PropertyTable::PropertyTable): + (JSC::PropertyTable::destroy): + (JSC::PropertyTable::~PropertyTable): + (JSC::PropertyTable::visitChildren): + + Moved marking of property table values here from Structure::visitChildren(). + + * runtime/StructureInlines.h: + (JSC::Structure::putWillGrowOutOfLineStorage): + (JSC::Structure::checkOffsetConsistency): + + Moved these to StructureInlines.h to break header dependency cycle between Structure/PropertyTable. + + * runtime/Structure.cpp: + (JSC::Structure::visitChildren): + + Null out m_propertyTable if the table is unpinned. This'll cause the table to get GC'd. + + (JSC::Structure::materializePropertyMap): + (JSC::Structure::addPropertyTransition): + (JSC::Structure::changePrototypeTransition): + (JSC::Structure::despecifyFunctionTransition): + (JSC::Structure::attributeChangeTransition): + (JSC::Structure::toDictionaryTransition): + (JSC::Structure::preventExtensionsTransition): + (JSC::Structure::nonPropertyTransition): + (JSC::Structure::copyPropertyTable): + (JSC::Structure::copyPropertyTableForPinning): + (JSC::Structure::putSpecificValue): + (JSC::Structure::createPropertyMap): + * runtime/Structure.h: + (Structure): + * runtime/JSGlobalData.cpp: + (JSC::JSGlobalData::JSGlobalData): + * runtime/JSGlobalData.h: + (JSGlobalData): + * runtime/PropertyMapHashTable.h: + (PropertyTable): + (JSC::PropertyTable::createStructure): + (JSC::PropertyTable::copy): + +2013-02-26 Andreas Kling <akling@apple.com> + + Unreviewed, rolling out r144054. + http://trac.webkit.org/changeset/144054 + https://bugs.webkit.org/show_bug.cgi?id=110854 + + broke builds + + * CMakeLists.txt: + * GNUmakefile.list.am: + * JavaScriptCore.gypi: + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: + * JavaScriptCore.vcxproj/JavaScriptCore.vcxproj: + * JavaScriptCore.xcodeproj/project.pbxproj: + * Target.pri: + * runtime/JSGlobalData.cpp: + (JSC::JSGlobalData::JSGlobalData): + * runtime/JSGlobalData.h: + (JSGlobalData): + * runtime/PropertyMapHashTable.h: + (PropertyTable): + (JSC::PropertyTable::PropertyTable): + (JSC): + (JSC::PropertyTable::~PropertyTable): + (JSC::PropertyTable::copy): + * runtime/PropertyTable.cpp: Removed. + * runtime/Structure.cpp: + (JSC::Structure::materializePropertyMap): + (JSC::Structure::addPropertyTransition): + (JSC::Structure::changePrototypeTransition): + (JSC::Structure::despecifyFunctionTransition): + (JSC::Structure::attributeChangeTransition): + (JSC::Structure::toDictionaryTransition): + (JSC::Structure::preventExtensionsTransition): + (JSC::Structure::nonPropertyTransition): + (JSC::Structure::copyPropertyTable): + (JSC::Structure::copyPropertyTableForPinning): + (JSC::Structure::putSpecificValue): + (JSC::Structure::createPropertyMap): + (JSC::Structure::visitChildren): + * runtime/Structure.h: + (JSC): + (JSC::Structure::putWillGrowOutOfLineStorage): + (JSC::Structure::checkOffsetConsistency): + (Structure): + * runtime/StructureInlines.h: + +2013-02-26 Andreas Kling <akling@apple.com> + + Unused Structure property tables waste 14MB on Membuster. + <http://webkit.org/b/110854> + <rdar://problem/13292104> + + Reviewed by Filip Pizlo. + + Turn PropertyTable into a GC object and have Structure drop unpinned tables when marking. + 14 MB progression on Membuster3. + + * CMakeLists.txt: + * GNUmakefile.list.am: + * JavaScriptCore.gypi: + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: + * JavaScriptCore.vcxproj/JavaScriptCore.vcxproj: + * JavaScriptCore.xcodeproj/project.pbxproj: + * Target.pri: + + Added PropertyTable.cpp. + + * runtime/PropertyTable.cpp: Added. + (JSC::PropertyTable::create): + (JSC::PropertyTable::clone): + (JSC::PropertyTable::PropertyTable): + (JSC::PropertyTable::destroy): + (JSC::PropertyTable::~PropertyTable): + (JSC::PropertyTable::visitChildren): + + Moved marking of property table values here from Structure::visitChildren(). + + * runtime/StructureInlines.h: + (JSC::Structure::putWillGrowOutOfLineStorage): + (JSC::Structure::checkOffsetConsistency): + + Moved these to StructureInlines.h to break header dependency cycle between Structure/PropertyTable. + + * runtime/Structure.cpp: + (JSC::Structure::visitChildren): + + Null out m_propertyTable if the table is unpinned. This'll cause the table to get GC'd. + + (JSC::Structure::materializePropertyMap): + (JSC::Structure::addPropertyTransition): + (JSC::Structure::changePrototypeTransition): + (JSC::Structure::despecifyFunctionTransition): + (JSC::Structure::attributeChangeTransition): + (JSC::Structure::toDictionaryTransition): + (JSC::Structure::preventExtensionsTransition): + (JSC::Structure::nonPropertyTransition): + (JSC::Structure::copyPropertyTable): + (JSC::Structure::copyPropertyTableForPinning): + (JSC::Structure::putSpecificValue): + (JSC::Structure::createPropertyMap): + * runtime/Structure.h: + (Structure): + * runtime/JSGlobalData.cpp: + (JSC::JSGlobalData::JSGlobalData): + * runtime/JSGlobalData.h: + (JSGlobalData): + * runtime/PropertyMapHashTable.h: + (PropertyTable): + (JSC::PropertyTable::createStructure): + (JSC::PropertyTable::copy): + +2013-02-26 Jocelyn Turcotte <jocelyn.turcotte@digia.com> + + Implement JIT on Windows 64 bits + https://bugs.webkit.org/show_bug.cgi?id=107965 + + Reviewed by Simon Hausmann. + + 1. MSVC doesn't support inline assembly for 64 bits, implements the trampoline in a separate ASM file. + + 2. Windows 64 bits has a different calling convention than other OSes following the AMD64 ABI. + Differences that we have to handle here: + - Registers passed parameters are RCX, RDX, R8 and R9 instead of RDI, RSI, RDX, RCX, R8 and R9 + - RDI and RSI must be preserved by callee + - Only return values <= 8 bytes can be returned by register (RDX can't be used to return a second word) + - There is no red-zone after RIP on the stack, but instead 4 reserved words before it + + * Target.pri: + * jit/JITStubs.cpp: + * jit/JITStubs.h: + (JSC): + (JITStackFrame): + (JSC::JITStackFrame::returnAddressSlot): + * jit/JITStubsMSVC64.asm: Added. + * jit/JSInterfaceJIT.h: + (JSInterfaceJIT): + * jit/ThunkGenerators.cpp: + (JSC::nativeForGenerator): + * yarr/YarrJIT.cpp: + (YarrGenerator): + (JSC::Yarr::YarrGenerator::generateEnter): + (JSC::Yarr::YarrGenerator::generateReturn): + +2013-02-26 Oliver Hunt <oliver@apple.com> + + Kill another analyzer warning in javascriptcore + https://bugs.webkit.org/show_bug.cgi?id=110802 + + Reviewed by Benjamin Poulain. + + Add null checks. + + * profiler/LegacyProfiler.cpp: + (JSC::LegacyProfiler::startProfiling): + (JSC::LegacyProfiler::stopProfiling): + +2013-02-26 Sheriff Bot <webkit.review.bot@gmail.com> + + Unreviewed, rolling out r144004. + http://trac.webkit.org/changeset/144004 + https://bugs.webkit.org/show_bug.cgi?id=110858 + + This iOS change is outdated (Requested by notbenjamin on + #webkit). + + * bytecompiler/BytecodeGenerator.cpp: + (JSC::BytecodeGenerator::BytecodeGenerator): + * bytecompiler/BytecodeGenerator.h: + (JSC::BytecodeGenerator::emitNode): + (JSC::BytecodeGenerator::emitNodeInConditionContext): + (BytecodeGenerator): + * parser/Parser.cpp: + (JSC::::Parser): + * parser/Parser.h: + (JSC::Parser::canRecurse): + (Parser): + +2013-02-25 Filip Pizlo <fpizlo@apple.com> + + REGRESSION(r143654): some jquery test asserts on 32 bit debug build + https://bugs.webkit.org/show_bug.cgi?id=110756 + + Reviewed by Geoffrey Garen. + + TypeOf does speculations manually, so it should mark its JSValueOperand as doing ManualOperandSpeculation. + + * dfg/DFGSpeculativeJIT32_64.cpp: + (JSC::DFG::SpeculativeJIT::compile): + +2013-02-25 Benjamin Poulain <bpoulain@apple.com> + + [JSC] Upstream iOS Stack bound checking + https://bugs.webkit.org/show_bug.cgi?id=110813 + + Reviewed by Filip Pizlo. + + On iOS, the StackBounds cannot be cached because the stack + can be in one of two threads (the web thread or the UI thread). + + We simply always consider the current stack bound when testing + stack boundaries. + + * bytecompiler/BytecodeGenerator.cpp: + (JSC::BytecodeGenerator::BytecodeGenerator): + * bytecompiler/BytecodeGenerator.h: + (JSC::BytecodeGenerator::emitNode): + (JSC::BytecodeGenerator::emitNodeInConditionContext): + (BytecodeGenerator): + * parser/Parser.cpp: + (JSC::::Parser): + * parser/Parser.h: + (JSC::Parser::canRecurse): + (Parser): + +2013-02-25 Michael Saboff <msaboff@apple.com> + + For JSVALUE32_64, maxOffsetRelativeToPatchedStorage() doesn't compute the maximum negative offset + https://bugs.webkit.org/show_bug.cgi?id=110828 + + Reviewed by Oliver Hunt. + + * runtime/JSObject.h: + (JSC::maxOffsetRelativeToPatchedStorage): Only add the OBJECT_OFFSETOF(tag) for positive offsets. + That way this function will return the offset farthest from 0 needed to access either the payload + or tag. + +2013-02-25 Jeffrey Pfau <jpfau@apple.com> + + Optionally partition cache to prevent using cache for tracking + https://bugs.webkit.org/show_bug.cgi?id=110269 + + Reviewed by Maciej Stachowiak. + + * Configurations/FeatureDefines.xcconfig: Add defines for cache partitioning and public suffix list usage + +2013-02-25 Roger Fong <roger_fong@apple.com> + + Unreviewed. VS2010 solution build fix. + + * JavaScriptCore.vcxproj/JavaScriptCoreExportGenerator/JavaScriptCoreExportGeneratorCommon.props: + +2013-02-24 Filip Pizlo <fpizlo@apple.com> + + DFG::Edge should have more bits for UseKind, and DFG::Allocator should be simpler + https://bugs.webkit.org/show_bug.cgi?id=110722 + + Reviewed by Oliver Hunt. + + This rolls out the DFG::Allocator part of http://trac.webkit.org/changeset/143654, + and changes Edge to have more room for UseKinds and possibly other things. + + This is performance-neutral on both 32-bit and 64-bit. It reduces the size of + DFG::Node on 64-bit (by virtue of getting rid of the 16-byte alignment of Node) + and increases it slightly on 32-bit (by 4 bytes total - 16-byte alignment led to + 80 bytes, but the base size of Node plus the 12 bytes of new m_encodedWords in + Edge gets 84 bytes). But, it will mean that we don't have to increase Node by + another 16 bytes if we ever want to add more UseKinds or other things to Edge. + + * dfg/DFGAllocator.h: + (DFG): + (Allocator): + (JSC::DFG::Allocator::Region::headerSize): + (JSC::DFG::Allocator::Region::numberOfThingsPerRegion): + (JSC::DFG::Allocator::Region::data): + (JSC::DFG::Allocator::Region::isInThisRegion): + (JSC::DFG::::Allocator): + (JSC::DFG::::~Allocator): + (JSC::DFG::::allocate): + (JSC::DFG::::free): + (JSC::DFG::::freeAll): + (JSC::DFG::::reset): + (JSC::DFG::::indexOf): + (JSC::DFG::::allocatorOf): + (JSC::DFG::::bumpAllocate): + (JSC::DFG::::freeListAllocate): + (JSC::DFG::::allocateSlow): + (JSC::DFG::::freeRegionsStartingAt): + (JSC::DFG::::startBumpingIn): + * dfg/DFGEdge.h: + (JSC::DFG::Edge::Edge): + (Edge): + (JSC::DFG::Edge::node): + (JSC::DFG::Edge::setNode): + (JSC::DFG::Edge::useKindUnchecked): + (JSC::DFG::Edge::setUseKind): + (JSC::DFG::Edge::operator==): + (JSC::DFG::Edge::operator!=): + (JSC::DFG::Edge::makeWord): + * dfg/DFGNodeAllocator.h: + (DFG): + +2013-02-22 Filip Pizlo <fpizlo@apple.com> + + The DFG special case checks for isCreatedThisArgument are fragile + https://bugs.webkit.org/show_bug.cgi?id=110535 + + Reviewed by Oliver Hunt. + + There may be many situations in which we want to force a variable to never be + unboxed. Capturing is one such case, and the created this argument is another. + Previously all code that dealt with this issue had to query both scenarios. + + Now DFG::VariableAccessData knows these things. You just have to ask + VariableAccessData for whether a variable should be unboxed. Anyone wishing to + force a variable to never be unboxed just tells VariableAccessData. + + * dfg/DFGAbstractState.cpp: + (JSC::DFG::AbstractState::initialize): + * dfg/DFGByteCodeParser.cpp: + (JSC::DFG::ByteCodeParser::parseBlock): + (DFG): + * dfg/DFGCFGSimplificationPhase.cpp: + (CFGSimplificationPhase): + * dfg/DFGFixupPhase.cpp: + (JSC::DFG::FixupPhase::fixupNode): + * dfg/DFGGraph.h: + (Graph): + * 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/DFGUnificationPhase.cpp: + (JSC::DFG::UnificationPhase::run): + * dfg/DFGVariableAccessData.h: + (JSC::DFG::VariableAccessData::VariableAccessData): + (JSC::DFG::VariableAccessData::mergeIsCaptured): + (JSC::DFG::VariableAccessData::mergeShouldNeverUnbox): + (VariableAccessData): + (JSC::DFG::VariableAccessData::shouldNeverUnbox): + (JSC::DFG::VariableAccessData::shouldUnboxIfPossible): + (JSC::DFG::VariableAccessData::shouldUseDoubleFormat): + (JSC::DFG::VariableAccessData::tallyVotesForShouldUseDoubleFormat): + +2013-02-25 Geoffrey Garen <ggaren@apple.com> + + Do one lookup per code cache insertion instead of two + https://bugs.webkit.org/show_bug.cgi?id=110674 + + Reviewed by Sam Weinig. + + Deployed the idiomatic "add null value" trick to avoid a second hash + lookup when inserting an item. + + * runtime/CodeCache.cpp: + (JSC::CodeCacheMap::pruneSlowCase): Factored this into a helper function + to improve clarity and get some code off the hot path. + + (JSC::CodeCache::getCodeBlock): + (JSC::CodeCache::getFunctionExecutableFromGlobalCode): Use the add() API + to avoid two hash lookups. Be sure to remove items if parsing fails, + otherwise we'll leave nulls in the table. (I'm guessing that caching parse + errors is not a win.) + + * runtime/CodeCache.h: + (JSC::SourceCodeValue::SourceCodeValue): + (CodeCacheMap): + (JSC::CodeCacheMap::add): Combined find() and set() into add(). + + (JSC::CodeCacheMap::remove): + (JSC::CodeCacheMap::age): + (JSC::CodeCacheMap::prune): Refactored to support above changes. + +2013-02-25 Carlos Garcia Campos <cgarcia@igalia.com> + + [BlackBerry][ARM] Fix cast-align warnings in JavaScriptCore + https://bugs.webkit.org/show_bug.cgi?id=110738 + + Reviewed by Rob Buis. + + Use reinterpret_cast_ptr instead of reinterpret_cast for + pointers. + + * dfg/DFGOperations.cpp: + * heap/CopiedBlock.h: + (JSC::CopiedBlock::zeroFillWilderness): + * heap/WeakBlock.h: + (JSC::WeakBlock::asWeakImpl): + (JSC::WeakBlock::asFreeCell): + (JSC::WeakBlock::weakImpls): + * heap/WeakImpl.h: + (JSC::WeakImpl::asWeakImpl): + * interpreter/JSStack.cpp: + (JSC::JSStack::disableErrorStackReserve): + * interpreter/JSStack.h: + (JSC::JSStack::reservationEnd): + * runtime/ArrayStorage.h: + (JSC::ArrayStorage::from): + * runtime/Butterfly.h: + (JSC::Butterfly::indexingPayload): + * runtime/IndexingHeader.h: + (JSC::IndexingHeader::propertyStorage): + * runtime/JSActivation.h: + (JSC::JSActivation::tearOff): + (JSC::JSActivation::isTornOff): + (JSC::JSActivation::storage): + +2013-02-22 Filip Pizlo <fpizlo@apple.com> + + DFG::SpeculativeJIT::speculateNumber() should just use SpeculateDoubleOperand instead of doing its own thing + https://bugs.webkit.org/show_bug.cgi?id=110659 + + Reviewed by Oliver Hunt and Mark Hahnenberg. + + This simplifies the code, and also has the effect that if speculateNumber() is called + prior to someone actually using the number in a double context, then the number will + already be up-converted to double and ready to go. + + Previously if this ever came up, the subsequent use would have to again branch to see + if the value is tagged as int or tagged as double. + + On the other hand, if you ever did speculateNumber() and then used the value as a + JSValue, this will be a slow down now. + + I suspect that the former (speculateNumber() and then use as number) is more likely + than the latter (speculateNumber() and then use as JSValue). + + * dfg/DFGSpeculativeJIT.cpp: + (JSC::DFG::SpeculativeJIT::speculateNumber): + +2013-02-22 Filip Pizlo <fpizlo@apple.com> + + DFG FixupPhase should have one common hook for knowing if a node is ever being speculated a certain way + https://bugs.webkit.org/show_bug.cgi?id=110650 + + Reviewed by Mark Hahnenberg. + + Changes almost all calls to edge.setUseKind(kind) to be + setUseKindAndUnboxIfProfitable<kind>(edge). This will allow us to use the latter + as a hook for deciding which locals to unbox (webkit.org/b/110433). + + * dfg/DFGFixupPhase.cpp: + (JSC::DFG::FixupPhase::fixupNode): + (FixupPhase): + (JSC::DFG::FixupPhase::setUseKindAndUnboxIfProfitable): + (JSC::DFG::FixupPhase::fixIntEdge): + (JSC::DFG::FixupPhase::fixDoubleEdge): + (JSC::DFG::FixupPhase::attemptToMakeIntegerAdd): + +2013-02-22 Filip Pizlo <fpizlo@apple.com> + + REGRESSION(r143654): some fast/js test crashes on 32 bit build + https://bugs.webkit.org/show_bug.cgi?id=110590 + + Reviewed by Mark Hahnenberg. + + In compileValueToInt32, the refactoring in r143654 undid one of the fixes from + r143314 due to a merge goof. + + In speculateNumber, we were simply forgetting to indicate that we need a + ManualOperandSpeculation on a JSValueOperand. ManualOperandSpeculation should + be passed whenever you will be performing the type checks yourself rather than + using the operand class to do it for you. + + * dfg/DFGSpeculativeJIT.cpp: + (JSC::DFG::SpeculativeJIT::compileValueToInt32): + (JSC::DFG::SpeculativeJIT::speculateNumber): + +2013-02-22 Geoffrey Garen <ggaren@apple.com> + + Not reviewed. + + Fix the 32-bit build by using the right data type in more places. + + * runtime/CodeCache.h: + (CodeCacheMap): + +2013-02-22 Geoffrey Garen <ggaren@apple.com> + + Not reviewed. + + Fix the 32-bit build by using the right data type. + + * runtime/CodeCache.h: + (JSC::CodeCacheMap::find): + +2013-02-21 Geoffrey Garen <ggaren@apple.com> + + Code cache size should adapt to workload + https://bugs.webkit.org/show_bug.cgi?id=110560 + + Reviewed by Antti Koivisto. + + (*) 5% PLT arithmetic mean speedup + (*) 10% PLT geometric mean speedup + (*) 3.4X microbenchmark speedup + (*) Reduces initial cache capacity by 16X + + * runtime/CodeCache.cpp: + (JSC::CodeCache::CodeCache): Updated for interface change. + + * runtime/CodeCache.h: + (JSC::SourceCodeValue::SourceCodeValue): + (SourceCodeValue): Turned the cache value into a struct so it can track its age. + + (CodeCacheMap): + (JSC::CodeCacheMap::CodeCacheMap): + (JSC::CodeCacheMap::find): + (JSC::CodeCacheMap::set): + (JSC::CodeCacheMap::clear): + (JSC::CodeCacheMap::pruneIfNeeded): + (CodeCache): Grow and shrink in response to usage. + +2013-02-21 Jessie Berlin <jberlin@apple.com> + + Fix a typo that broke the 32 bit build. + + * dfg/DFGSpeculativeJIT32_64.cpp: + (JSC::DFG::SpeculativeJIT::compile): + +2013-02-21 Michael Saboff <msaboff@apple.com> + + 25-30% regression in V8 RayTrace test in 32 bit builds with JIT disabled + https://bugs.webkit.org/show_bug.cgi?id=110539 + + Reviewed by Filip Pizlo. + + Change the scale used to lookup pointers in JSGlobalObject::m_specialPointers to be 4 bytes for + the 32 bit version of the interpreter. + + * llint/LowLevelInterpreter32_64.asm: + +2013-02-21 Roger Fong <roger_fong@apple.com> + + Unreviewed. Add executable property to cmd file. + Required for executable files to maintain their executable permissions over svn. + + * JavaScriptCore.vcxproj/copy-files.cmd: Added property svn:executable. + +2013-02-21 Filip Pizlo <fpizlo@apple.com> + + Object allocation profiling will refuse to create objects with more than JSFinalObject::maxInlineCapacity() inline slots, but JSFunction::allocationProfile() asserts that the number of inline slots is always what it asked for + https://bugs.webkit.org/show_bug.cgi?id=110519 + <rdar://problem/13218566> + + Reviewed by Geoffrey Garen. + + * runtime/JSFunction.h: + (JSC::JSFunction::allocationProfile): + +2013-02-21 Roger Fong <roger_fong@apple.com> + + Unreviewed. Build fix for VS2010 WebKit solution. + + * JavaScriptCore.vcxproj/JavaScriptCoreExportGenerator/JavaScriptCoreExports.def.in: + +2013-02-20 Filip Pizlo <fpizlo@apple.com> + + DFG should not change its mind about what type speculations a node does, by encoding the checks in the NodeType, UseKind, and ArrayMode + https://bugs.webkit.org/show_bug.cgi?id=109371 + + Reviewed by Oliver Hunt. + + FixupPhase now locks in the speculations that each node will do. The DFG then + remembers those speculations, and doesn't change its mind about them even if the + graph is transformed - for example if a node's child is repointed to a different + node as part of CSE, CFG simplification, or folding. Each node ensures that it + executes the speculations promised by its edges. This is true even for Phantom + nodes. + + This still leaves some craziness on the table for future work, like the + elimination of speculating SetLocal's due to CFG simplification + (webkit.org/b/109388) and elimination of nodes via DCE (webkit.org/b/109389). + + In all, this allows for a huge simplification of the DFG. Instead of having to + execute the right speculation heuristic each time you want to decide what a node + does (for example Node::shouldSpeculateInteger(child1, child2) && + node->canSpeculateInteger()), you just ask for the use kinds of its children + (typically node->binaryUseKind() == Int32Use). Because the use kinds are + discrete, you can often just switch over them. This makes many parts of the code + more clear than they were before. + + Having UseKinds describe the speculations being performed also makes it far + easier to perform analyses that need to know what speculations are done. This is + so far only used to simplify large parts of the CFA. + + To have a larger vocabulary of UseKinds, this also changes the node allocator to + be able to round up Node sizes to the nearest multiple of 16. + + This appears to be neutral on benchmarks, except for some goofy speed-ups, like + 8% on Octane/box2d. + + * CMakeLists.txt: + * GNUmakefile.list.am: + * JavaScriptCore.xcodeproj/project.pbxproj: + * Target.pri: + * dfg/DFGAbstractState.cpp: + (JSC::DFG::AbstractState::startExecuting): + (DFG): + (JSC::DFG::AbstractState::executeEdges): + (JSC::DFG::AbstractState::verifyEdge): + (JSC::DFG::AbstractState::verifyEdges): + (JSC::DFG::AbstractState::executeEffects): + (JSC::DFG::AbstractState::execute): + * dfg/DFGAbstractState.h: + (AbstractState): + (JSC::DFG::AbstractState::filterEdgeByUse): + (JSC::DFG::AbstractState::filterByType): + * dfg/DFGAbstractValue.h: + (JSC::DFG::AbstractValue::filter): + * dfg/DFGAdjacencyList.h: + (JSC::DFG::AdjacencyList::AdjacencyList): + (JSC::DFG::AdjacencyList::child): + (JSC::DFG::AdjacencyList::setChild): + (JSC::DFG::AdjacencyList::reset): + (JSC::DFG::AdjacencyList::firstChild): + (JSC::DFG::AdjacencyList::setFirstChild): + (JSC::DFG::AdjacencyList::numChildren): + (JSC::DFG::AdjacencyList::setNumChildren): + (AdjacencyList): + * dfg/DFGAllocator.h: + (DFG): + (Allocator): + (JSC::DFG::Allocator::cellSize): + (JSC::DFG::Allocator::Region::headerSize): + (JSC::DFG::Allocator::Region::numberOfThingsPerRegion): + (JSC::DFG::Allocator::Region::payloadSize): + (JSC::DFG::Allocator::Region::payloadBegin): + (JSC::DFG::Allocator::Region::payloadEnd): + (JSC::DFG::Allocator::Region::isInThisRegion): + (JSC::DFG::::Allocator): + (JSC::DFG::::~Allocator): + (JSC::DFG::::allocate): + (JSC::DFG::::free): + (JSC::DFG::::freeAll): + (JSC::DFG::::reset): + (JSC::DFG::::indexOf): + (JSC::DFG::::allocatorOf): + (JSC::DFG::::bumpAllocate): + (JSC::DFG::::freeListAllocate): + (JSC::DFG::::allocateSlow): + (JSC::DFG::::freeRegionsStartingAt): + (JSC::DFG::::startBumpingIn): + * dfg/DFGByteCodeParser.cpp: + (JSC::DFG::ByteCodeParser::addToGraph): + (JSC::DFG::ByteCodeParser::handleMinMax): + * dfg/DFGCSEPhase.cpp: + (JSC::DFG::CSEPhase::setLocalStoreElimination): + (JSC::DFG::CSEPhase::eliminateIrrelevantPhantomChildren): + (JSC::DFG::CSEPhase::setReplacement): + (JSC::DFG::CSEPhase::performNodeCSE): + * dfg/DFGCommon.h: + (DFG): + * dfg/DFGConstantFoldingPhase.cpp: + (JSC::DFG::ConstantFoldingPhase::foldConstants): + (JSC::DFG::ConstantFoldingPhase::addStructureTransitionCheck): + * dfg/DFGDriver.cpp: + (JSC::DFG::compile): + * dfg/DFGEdge.cpp: + (JSC::DFG::Edge::dump): + * dfg/DFGEdge.h: + (JSC::DFG::Edge::useKindUnchecked): + (JSC::DFG::Edge::useKind): + (JSC::DFG::Edge::shift): + * dfg/DFGFixupPhase.cpp: + (JSC::DFG::FixupPhase::run): + (JSC::DFG::FixupPhase::fixupNode): + (JSC::DFG::FixupPhase::checkArray): + (JSC::DFG::FixupPhase::blessArrayOperation): + (JSC::DFG::FixupPhase::fixIntEdge): + (JSC::DFG::FixupPhase::fixDoubleEdge): + (JSC::DFG::FixupPhase::injectInt32ToDoubleNode): + (FixupPhase): + (JSC::DFG::FixupPhase::truncateConstantToInt32): + (JSC::DFG::FixupPhase::truncateConstantsIfNecessary): + (JSC::DFG::FixupPhase::attemptToMakeIntegerAdd): + * dfg/DFGGraph.cpp: + (DFG): + (JSC::DFG::Graph::refChildren): + (JSC::DFG::Graph::derefChildren): + * dfg/DFGGraph.h: + (JSC::DFG::Graph::ref): + (JSC::DFG::Graph::deref): + (JSC::DFG::Graph::performSubstitution): + (JSC::DFG::Graph::isPredictedNumerical): + (JSC::DFG::Graph::addImmediateShouldSpeculateInteger): + (DFG): + * dfg/DFGNode.h: + (JSC::DFG::Node::Node): + (JSC::DFG::Node::convertToGetByOffset): + (JSC::DFG::Node::convertToPutByOffset): + (JSC::DFG::Node::willHaveCodeGenOrOSR): + (JSC::DFG::Node::child1): + (JSC::DFG::Node::child2): + (JSC::DFG::Node::child3): + (JSC::DFG::Node::binaryUseKind): + (Node): + (JSC::DFG::Node::isBinaryUseKind): + * dfg/DFGNodeAllocator.h: + (DFG): + * dfg/DFGNodeFlags.cpp: + (JSC::DFG::nodeFlagsAsString): + * dfg/DFGNodeType.h: + (DFG): + * dfg/DFGPredictionPropagationPhase.cpp: + (JSC::DFG::PredictionPropagationPhase::propagate): + * dfg/DFGSpeculativeJIT.cpp: + (JSC::DFG::SpeculativeJIT::speculationCheck): + (DFG): + (JSC::DFG::SpeculativeJIT::speculationWatchpoint): + (JSC::DFG::SpeculativeJIT::forwardSpeculationCheck): + (JSC::DFG::SpeculativeJIT::terminateSpeculativeExecution): + (JSC::DFG::SpeculativeJIT::typeCheck): + (JSC::DFG::SpeculativeJIT::forwardTypeCheck): + (JSC::DFG::SpeculativeJIT::fillStorage): + (JSC::DFG::SpeculativeJIT::compilePeepHoleBranch): + (JSC::DFG::SpeculativeJIT::compile): + (JSC::DFG::SpeculativeJIT::compileDoublePutByVal): + (JSC::DFG::SpeculativeJIT::compileValueToInt32): + (JSC::DFG::SpeculativeJIT::compileInt32ToDouble): + (JSC::DFG::SpeculativeJIT::compilePutByValForIntTypedArray): + (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::speculateInt32): + (JSC::DFG::SpeculativeJIT::speculateNumber): + (JSC::DFG::SpeculativeJIT::speculateRealNumber): + (JSC::DFG::SpeculativeJIT::speculateBoolean): + (JSC::DFG::SpeculativeJIT::speculateCell): + (JSC::DFG::SpeculativeJIT::speculateObject): + (JSC::DFG::SpeculativeJIT::speculateObjectOrOther): + (JSC::DFG::SpeculativeJIT::speculateString): + (JSC::DFG::SpeculativeJIT::speculateNotCell): + (JSC::DFG::SpeculativeJIT::speculateOther): + (JSC::DFG::SpeculativeJIT::speculate): + * dfg/DFGSpeculativeJIT.h: + (SpeculativeJIT): + (JSC::DFG::SpeculativeJIT::valueOfNumberConstant): + (JSC::DFG::SpeculativeJIT::needsTypeCheck): + (JSC::DFG::IntegerOperand::IntegerOperand): + (JSC::DFG::IntegerOperand::edge): + (IntegerOperand): + (JSC::DFG::IntegerOperand::node): + (JSC::DFG::IntegerOperand::gpr): + (JSC::DFG::IntegerOperand::use): + (JSC::DFG::JSValueOperand::JSValueOperand): + (JSValueOperand): + (JSC::DFG::JSValueOperand::edge): + (JSC::DFG::JSValueOperand::node): + (JSC::DFG::JSValueOperand::gpr): + (JSC::DFG::JSValueOperand::fill): + (JSC::DFG::JSValueOperand::use): + (JSC::DFG::StorageOperand::StorageOperand): + (JSC::DFG::StorageOperand::edge): + (StorageOperand): + (JSC::DFG::StorageOperand::node): + (JSC::DFG::StorageOperand::gpr): + (JSC::DFG::StorageOperand::use): + (JSC::DFG::SpeculateIntegerOperand::SpeculateIntegerOperand): + (SpeculateIntegerOperand): + (JSC::DFG::SpeculateIntegerOperand::edge): + (JSC::DFG::SpeculateIntegerOperand::node): + (JSC::DFG::SpeculateIntegerOperand::gpr): + (JSC::DFG::SpeculateIntegerOperand::use): + (JSC::DFG::SpeculateStrictInt32Operand::SpeculateStrictInt32Operand): + (SpeculateStrictInt32Operand): + (JSC::DFG::SpeculateStrictInt32Operand::edge): + (JSC::DFG::SpeculateStrictInt32Operand::node): + (JSC::DFG::SpeculateStrictInt32Operand::gpr): + (JSC::DFG::SpeculateStrictInt32Operand::use): + (JSC::DFG::SpeculateDoubleOperand::SpeculateDoubleOperand): + (SpeculateDoubleOperand): + (JSC::DFG::SpeculateDoubleOperand::edge): + (JSC::DFG::SpeculateDoubleOperand::node): + (JSC::DFG::SpeculateDoubleOperand::fpr): + (JSC::DFG::SpeculateDoubleOperand::use): + (JSC::DFG::SpeculateCellOperand::SpeculateCellOperand): + (SpeculateCellOperand): + (JSC::DFG::SpeculateCellOperand::edge): + (JSC::DFG::SpeculateCellOperand::node): + (JSC::DFG::SpeculateCellOperand::gpr): + (JSC::DFG::SpeculateCellOperand::use): + (JSC::DFG::SpeculateBooleanOperand::SpeculateBooleanOperand): + (JSC::DFG::SpeculateBooleanOperand::edge): + (SpeculateBooleanOperand): + (JSC::DFG::SpeculateBooleanOperand::node): + (JSC::DFG::SpeculateBooleanOperand::gpr): + (JSC::DFG::SpeculateBooleanOperand::use): + (DFG): + * dfg/DFGSpeculativeJIT32_64.cpp: + (JSC::DFG::SpeculativeJIT::fillInteger): + (JSC::DFG::SpeculativeJIT::fillJSValue): + (JSC::DFG::SpeculativeJIT::fillSpeculateIntInternal): + (JSC::DFG::SpeculativeJIT::fillSpeculateInt): + (JSC::DFG::SpeculativeJIT::fillSpeculateIntStrict): + (JSC::DFG::SpeculativeJIT::fillSpeculateDouble): + (JSC::DFG::SpeculativeJIT::fillSpeculateCell): + (JSC::DFG::SpeculativeJIT::fillSpeculateBoolean): + (JSC::DFG::SpeculativeJIT::compileObjectEquality): + (JSC::DFG::SpeculativeJIT::compileObjectToObjectOrOtherEquality): + (JSC::DFG::SpeculativeJIT::compilePeepHoleObjectToObjectOrOtherEquality): + (JSC::DFG::SpeculativeJIT::compileObjectOrOtherLogicalNot): + (JSC::DFG::SpeculativeJIT::compileLogicalNot): + (JSC::DFG::SpeculativeJIT::emitObjectOrOtherBranch): + (JSC::DFG::SpeculativeJIT::emitBranch): + (JSC::DFG::SpeculativeJIT::compile): + * dfg/DFGSpeculativeJIT64.cpp: + (JSC::DFG::SpeculativeJIT::fillInteger): + (JSC::DFG::SpeculativeJIT::fillJSValue): + (JSC::DFG::SpeculativeJIT::fillSpeculateIntInternal): + (JSC::DFG::SpeculativeJIT::fillSpeculateInt): + (JSC::DFG::SpeculativeJIT::fillSpeculateIntStrict): + (JSC::DFG::SpeculativeJIT::fillSpeculateDouble): + (JSC::DFG::SpeculativeJIT::fillSpeculateCell): + (JSC::DFG::SpeculativeJIT::fillSpeculateBoolean): + (JSC::DFG::SpeculativeJIT::compileObjectEquality): + (JSC::DFG::SpeculativeJIT::compileObjectToObjectOrOtherEquality): + (JSC::DFG::SpeculativeJIT::compilePeepHoleObjectToObjectOrOtherEquality): + (JSC::DFG::SpeculativeJIT::compileObjectOrOtherLogicalNot): + (JSC::DFG::SpeculativeJIT::compileLogicalNot): + (JSC::DFG::SpeculativeJIT::emitObjectOrOtherBranch): + (JSC::DFG::SpeculativeJIT::emitBranch): + (JSC::DFG::SpeculativeJIT::compile): + * dfg/DFGStructureCheckHoistingPhase.cpp: + (JSC::DFG::StructureCheckHoistingPhase::run): + * dfg/DFGUseKind.cpp: Added. + (WTF): + (WTF::printInternal): + * dfg/DFGUseKind.h: Added. + (DFG): + (JSC::DFG::typeFilterFor): + (JSC::DFG::isNumerical): + (WTF): + * dfg/DFGValidate.cpp: + (JSC::DFG::Validate::reportValidationContext): + +2013-02-20 Mark Hahnenberg <mhahnenberg@apple.com> + + Objective-C API: Need a way to use the Objective-C JavaScript API with WebKit + https://bugs.webkit.org/show_bug.cgi?id=106059 + + Reviewed by Geoffrey Garen. + + * API/JSBase.h: Renamed enable flag for API. + * API/JSBlockAdaptor.h: Using new flag. + * API/JSBlockAdaptor.mm: Ditto. + * API/JSContext.h: Add convenience C API conversion function for JSGlobalContextRef. + * API/JSContext.mm: + (-[JSContext JSGlobalContextRef]): Implementation of C API convenience function. + (-[JSContext initWithVirtualMachine:]): We don't use the m_apiData field any more. + (-[JSContext initWithGlobalContextRef:]): init method for allocating new JSContexts given a JSGlobalContextRef. + (-[JSContext dealloc]): No more m_apiData. + (-[JSContext wrapperForObjCObject:]): Renamed wrapperForObject. + (-[JSContext wrapperForJSObject:]): Fetches or allocates the JSValue for the specified JSValueRef in this JSContext. + (+[JSContext contextWithGlobalContextRef:]): Helper function to grab the lightweight JSContext wrapper for a given + JSGlobalContextRef from the global wrapper cache or allocate a new one if there isn't already one. + * API/JSContextInternal.h: New flag, new method declaration for initWithGlobalContextRef. + * API/JSExport.h: New flag. + * API/JSValue.h: New flag and new C API convenience method. + * API/JSValue.mm: + (-[JSValue JSValueRef]): Implementation of the C API convenience method. + (objectToValueWithoutCopy): + (+[JSValue valueWithValue:inContext:]): We now ask the JSContext for an Objective-C JSValue wrapper, which it can cache + in its internal JSWrapperMap. + * API/JSValueInternal.h: + * API/JSVirtualMachine.h: + * API/JSVirtualMachine.mm: Added global cache that maps JSContextGroupRef -> JSVirtualMachine lightweight wrappers. + (wrapperCacheLock): + (initWrapperCache): + (+[JSVMWrapperCache addWrapper:forJSContextGroupRef:]): + (+[JSVMWrapperCache wrapperForJSContextGroupRef:]): + (-[JSVirtualMachine init]): + (-[JSVirtualMachine initWithContextGroupRef:]): + (-[JSVirtualMachine dealloc]): + (+[JSVirtualMachine virtualMachineWithContextGroupRef:]): + (-[JSVirtualMachine contextForGlobalContextRef:]): + (-[JSVirtualMachine addContext:forGlobalContextRef:]): + * API/JSVirtualMachineInternal.h: + * API/JSWrapperMap.h: + * API/JSWrapperMap.mm: + (-[JSObjCClassInfo allocateConstructorAndPrototypeWithSuperClassInfo:]): We use the JSObjectSetPrototype C API call because + setting the __proto__ property causes all sorts of bad things to happen behind the scenes, which can cause crashes based on + when it gets called. + (-[JSWrapperMap initWithContext:]): + (-[JSWrapperMap jsWrapperForObject:]): + (-[JSWrapperMap objcWrapperForJSValueRef:]): + * API/JavaScriptCore.h: + * API/ObjCCallbackFunction.h: + * API/ObjCCallbackFunction.mm: + (ObjCCallbackFunction::ObjCCallbackFunction): We never actually should have retained the target in the case that we had a + block as a callback. Blocks are initially allocated on the stack and are only moved to the heap if we call their copy method. + Retaining the block on the stack was a bad idea because if that stack frame ever went away and we called the block later, + we'd crash and burn. + (ObjCCallbackFunction::setContext): We need a new setter for when the weak reference to a JSContext inside an ObjCCallbackFunction + disappears, we can allocate a new one in its place. + (ObjCCallbackFunction): + (objCCallbackFunctionCallAsFunction): Reset the callback's context if it's ever destroyed. + (objCCallbackFunctionForInvocation): Again, don't set the __proto__ property because it uses black magic that can cause us to crash + depending on when this is called. + (objCCallbackFunctionForBlock): Here is where we copy the block to the heap when we're first creating the callback object for it. + * API/tests/testapi.c: + (main): + * API/tests/testapi.mm: We're going to get rid of the automatic block conversion, since that is causing leaks. I changed it + here in this test just so that it wouldn't mask any other potential leaks. Also modified some of the tests since JSContexts are + just lightweight wrappers now, we're not guaranteed to get the same pointer back from the call to [JSValue context] as the one + that the value was created in. + (-[TestObject callback:]): + * JavaScriptCore.xcodeproj/project.pbxproj: + * runtime/JSGlobalData.cpp: + (JSC::JSGlobalData::JSGlobalData): No more m_apiData. + * runtime/JSGlobalData.h: Ditto. + * runtime/JSGlobalObject.cpp: + (JSC::JSGlobalObject::JSGlobalObject): Ditto. + * runtime/JSGlobalObject.h: + +2013-02-19 Filip Pizlo <fpizlo@apple.com> + + DFG::SpeculativeJIT::compileInt32ToDouble() has an unnecessary case for constant operands + https://bugs.webkit.org/show_bug.cgi?id=110309 + + Reviewed by Sam Weinig. + + It used to be necessary, back when we didn't have constant folding. Now we have + constant folding. So we don't need it. + + * dfg/DFGSpeculativeJIT.cpp: + (JSC::DFG::SpeculativeJIT::compileInt32ToDouble): + +2013-02-20 Filip Pizlo <fpizlo@apple.com> + + DFG inlines Resolves that it doesn't know how to handle correctly + https://bugs.webkit.org/show_bug.cgi?id=110405 + + Reviewed by Geoffrey Garen. + + Don't try to be clever: if there's a failing resolve, we can't inline it, period. + + * dfg/DFGCapabilities.h: + (JSC::DFG::canInlineResolveOperations): + (JSC::DFG::canInlineOpcode): + +2013-02-20 Roger Fong <roger_fong@apple.com> + + Get VS2010 Solution B&I ready. + <rdar://problem/1322988> + + Rubberstamped by Timothy Horton. + + Add Production configuration. + Add a JavaScriptCore submit solution with a DebugSuffix configuration. + Modify JavaScriptCore.make as necessary. + + * JavaScriptCore.vcxproj/JavaScriptCore.make: Added. + * JavaScriptCore.vcxproj/JavaScriptCore.sln: Removed. + * JavaScriptCore.vcxproj/JavaScriptCore.submit.sln: Copied from Source/JavaScriptCore/JavaScriptCore.vcxproj/JavaScriptCore.sln. + * JavaScriptCore.vcxproj/JavaScriptCore.vcxproj: + * JavaScriptCore.vcxproj/JavaScriptCoreCommon.props: + * JavaScriptCore.vcxproj/JavaScriptCoreExportGenerator/JavaScriptCoreExportGenerator.vcxproj: + * JavaScriptCore.vcxproj/JavaScriptCoreExportGenerator/JavaScriptCoreExportGeneratorCommon.props: + * JavaScriptCore.vcxproj/JavaScriptCoreExportGenerator/JavaScriptCoreExportGeneratorPostBuild.cmd: + * JavaScriptCore.vcxproj/JavaScriptCoreExportGenerator/JavaScriptCoreExportGeneratorPreBuild.cmd: + * JavaScriptCore.vcxproj/JavaScriptCoreExportGenerator/JavaScriptCoreExportGeneratorProduction.props: Added. + * JavaScriptCore.vcxproj/JavaScriptCoreExportGenerator/JavaScriptCoreExportGeneratorRelease.props: + * JavaScriptCore.vcxproj/JavaScriptCoreGenerated.vcxproj: + * JavaScriptCore.vcxproj/JavaScriptCoreGenerated.vcxproj.filters: + * JavaScriptCore.vcxproj/JavaScriptCoreGeneratedProduction.props: Added. + * JavaScriptCore.vcxproj/JavaScriptCoreGeneratedRelease.props: + * JavaScriptCore.vcxproj/JavaScriptCoreProduction.props: Added. + * JavaScriptCore.vcxproj/JavaScriptCoreRelease.props: + * JavaScriptCore.vcxproj/LLInt/LLIntAssembly/LLIntAssembly.vcxproj: + * JavaScriptCore.vcxproj/LLInt/LLIntDesiredOffsets/LLIntDesiredOffsets.vcxproj: + * JavaScriptCore.vcxproj/LLInt/LLIntOffsetsExtractor/LLIntOffsetsExtractor.vcxproj: + * JavaScriptCore.vcxproj/LLInt/LLIntOffsetsExtractor/LLIntOffsetsExtractorCommon.props: + * JavaScriptCore.vcxproj/LLInt/LLIntOffsetsExtractor/LLIntOffsetsExtractorDebug.props: + * JavaScriptCore.vcxproj/LLInt/LLIntOffsetsExtractor/LLIntOffsetsExtractorProduction.props: Added. + * JavaScriptCore.vcxproj/LLInt/LLIntOffsetsExtractor/LLIntOffsetsExtractorRelease.props: + * JavaScriptCore.vcxproj/jsc/jsc.vcxproj: + * JavaScriptCore.vcxproj/jsc/jscCommon.props: + * JavaScriptCore.vcxproj/jsc/jscProduction.props: Added. + * JavaScriptCore.vcxproj/jsc/jscRelease.props: + * JavaScriptCore.vcxproj/testRegExp/testRegExp.vcxproj: + * JavaScriptCore.vcxproj/testRegExp/testRegExpCommon.props: + * JavaScriptCore.vcxproj/testRegExp/testRegExpProduction.props: Added. + * JavaScriptCore.vcxproj/testRegExp/testRegExpRelease.props: + * JavaScriptCore.vcxproj/testapi/testapi.vcxproj: + * JavaScriptCore.vcxproj/testapi/testapiCommon.props: + * JavaScriptCore.vcxproj/testapi/testapiProduction.props: Added. + * JavaScriptCore.vcxproj/testapi/testapiRelease.props: + +2013-02-19 Jer Noble <jer.noble@apple.com> + + EME: Enable both ENCRYPTED_MEDIA and ENCRYPTED_MEDIA_V2 until clients transition to the new API. + https://bugs.webkit.org/show_bug.cgi?id=110284 + + Reviewed by Eric Carlson. + + Re-enable the ENCRYPTED_MEDIA flag. + + * Configurations/FeatureDefines.xcconfig: + +2013-02-20 Dirk Schulze <krit@webkit.org> + + Enable CANVAS_PATH flag + https://bugs.webkit.org/show_bug.cgi?id=108508 + + Reviewed by Simon Fraser. + + Enable CANVAS_PATH flag on trunk. + + Existing tests cover the feature. + + * Configurations/FeatureDefines.xcconfig: + +2013-02-19 Mark Rowe <mrowe@apple.com> + + Unreviewed, uninteresting change to test a theory about bad dependency handling. + + * API/JSStringRefCF.cpp: + (JSStringCreateWithCFString): Remove an unnecessary else clause. + +2013-02-19 Oliver Hunt <oliver@apple.com> + + Silence some analyzer warnings + https://bugs.webkit.org/show_bug.cgi?id=110281 + + Reviewed by Mark Hahnenberg. + + The static analyzer believes that callerCodeBlock can be null, + based on other code performing null tests. This should not + ever be the case, but we'll add RELEASE_ASSERTs to make it + obvious if we're ever wrong. + + * interpreter/Interpreter.cpp: + (JSC::getCallerInfo): + +2013-02-19 Oliver Hunt <oliver@apple.com> + + Don't force everything to be blinded in debug builds + https://bugs.webkit.org/show_bug.cgi?id=110279 + + Reviewed by Mark Hahnenberg. + + Switch to an explicit flag for indicating that we want + every constant to be blinded. + + * assembler/MacroAssembler.h: + (JSC::MacroAssembler::shouldBlind): + +2013-02-19 Filip Pizlo <fpizlo@apple.com> + + Fix indentation of Opcode.h + + Rubber stamped by Mark Hahnenberg. + + * bytecode/Opcode.h: + +2013-02-19 Filip Pizlo <fpizlo@apple.com> + + Moved PolymorphicAccessStructureList into its own file. + + Rubber stamped by Mark Hahnenberg. + + * GNUmakefile.list.am: + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: + * JavaScriptCore.xcodeproj/project.pbxproj: + * bytecode/Instruction.h: + (JSC): + * bytecode/PolymorphicAccessStructureList.h: Added. + (JSC): + (PolymorphicAccessStructureList): + (PolymorphicStubInfo): + (JSC::PolymorphicAccessStructureList::PolymorphicStubInfo::PolymorphicStubInfo): + (JSC::PolymorphicAccessStructureList::PolymorphicStubInfo::set): + (JSC::PolymorphicAccessStructureList::PolymorphicAccessStructureList): + (JSC::PolymorphicAccessStructureList::visitWeak): + * bytecode/StructureStubInfo.h: + +2013-02-19 Filip Pizlo <fpizlo@apple.com> + + Fix indentation of Instruction.h + + Rubber stamped by Mark Hahnenberg. + + * bytecode/Instruction.h: + +2013-02-18 Geoffrey Garen <ggaren@apple.com> + + Unreviewed, rolling in r143348. + http://trac.webkit.org/changeset/143348 + https://bugs.webkit.org/show_bug.cgi?id=110242 + + The bug was that isEmptyValue() was returning true for the deleted value. + Fixed this and simplified things further by delegating to m_sourceCode + for both isNull() and isHashTableDeletedValue(), so they can't be out of + sync. + + * runtime/CodeCache.cpp: + (JSC::CodeCache::getFunctionExecutableFromGlobalCode): + * runtime/CodeCache.h: + (JSC::SourceCodeKey::SourceCodeKey): + (JSC::SourceCodeKey::isHashTableDeletedValue): + (JSC::SourceCodeKey::hash): + (JSC::SourceCodeKey::length): + (JSC::SourceCodeKey::isNull): + (JSC::SourceCodeKey::operator==): + (SourceCodeKey): + +2013-02-15 Martin Robinson <mrobinson@igalia.com> + + [GTK] Improve gyp build JavaScriptCore code generation + https://bugs.webkit.org/show_bug.cgi?id=109969 + + Reviewed by Dirk Pranke. + + Switch away from using DerivedSources.make when building JavaScriptCore generated + sources. This bring a couple advantages, such as building the sources in parallel, + but requires us to list the generated sources more than once. + + * JavaScriptCore.gyp/JavaScriptCoreGTK.gyp: Add rules for generating JavaScriptCore sources. + * JavaScriptCore.gyp/generate-derived-sources.sh: Added. + * JavaScriptCore.gyp/redirect-stdout.sh: Added. + +2013-02-19 Sheriff Bot <webkit.review.bot@gmail.com> + + Unreviewed, rolling out r143348. + http://trac.webkit.org/changeset/143348 + https://bugs.webkit.org/show_bug.cgi?id=110242 + + "Caused a deleted value sentinel crash on the layout tests" + (Requested by ggaren on #webkit). + + * runtime/CodeCache.cpp: + (JSC::CodeCache::getFunctionExecutableFromGlobalCode): + * runtime/CodeCache.h: + (JSC::SourceCodeKey::SourceCodeKey): + (JSC::SourceCodeKey::isHashTableDeletedValue): + (JSC::SourceCodeKey::hash): + (JSC::SourceCodeKey::length): + (JSC::SourceCodeKey::isNull): + (JSC::SourceCodeKey::operator==): + (SourceCodeKey): + +2013-02-19 Mark Hahnenberg <mhahnenberg@apple.com> + + HeapBlock::destroy should issue warning if result is unused + https://bugs.webkit.org/show_bug.cgi?id=110233 + + Reviewed by Oliver Hunt. + + To enforce the fact that we need to return blocks to the BlockAllocator after calling destroy, + we should add WARN_UNUSED_RETURN to HeapBlock::destroy and any other destroy functions in its subclasses. + + * heap/HeapBlock.h: + +2013-02-19 Mark Hahnenberg <mhahnenberg@apple.com> + + WeakSet::removeAllocator leaks WeakBlocks + https://bugs.webkit.org/show_bug.cgi?id=110228 + + Reviewed by Geoffrey Garen. + + We need to return the WeakBlock to the BlockAllocator after the call to WeakBlock::destroy. + + * heap/WeakSet.cpp: + (JSC::WeakSet::removeAllocator): + +2013-02-18 Geoffrey Garen <ggaren@apple.com> + + Save space on keys in the CodeCache + https://bugs.webkit.org/show_bug.cgi?id=110179 + + Reviewed by Oliver Hunt. + + Share the SourceProvider's string instead of making our own copy. This + chops off 16MB - 32MB from the CodeCache's memory footprint when full. + (It's 16MB when the strings are LChar, and 32MB when they're UChar.) + + * runtime/CodeCache.cpp: + (JSC::CodeCache::getFunctionExecutableFromGlobalCode): + * runtime/CodeCache.h: Removed a defunct enum value. + + (JSC::SourceCodeKey::SourceCodeKey): + (JSC::SourceCodeKey::isHashTableDeletedValue): + (SourceCodeKey): + (JSC::SourceCodeKey::hash): + (JSC::SourceCodeKey::length): + (JSC::SourceCodeKey::isNull): + (JSC::SourceCodeKey::string): + (JSC::SourceCodeKey::operator==): Store a SourceCode instead of a String + so we can share our string with our SourceProvider. Cache our hash so + we don't have to re-decode our string just to re-hash the table. + +2013-02-19 Zoltan Herczeg <zherczeg@webkit.org> + + revertBranchPtrWithPatch is incorrect on ARM traditional + https://bugs.webkit.org/show_bug.cgi?id=110201 + + Reviewed by Oliver Hunt. + + Revert two instructions back to their original value. + + * assembler/ARMAssembler.h: + (JSC::ARMAssembler::revertBranchPtrWithPatch): + (ARMAssembler): + * assembler/MacroAssemblerARM.h: + (JSC::MacroAssemblerARM::branchPtrWithPatch): + (JSC::MacroAssemblerARM::revertJumpReplacementToBranchPtrWithPatch): + +2013-02-19 Filip Pizlo <fpizlo@apple.com> + + REGRESSION(r143241): It made 27 layout tests crash on 32 bit platforms + https://bugs.webkit.org/show_bug.cgi?id=110184 + + Reviewed by Zoltan Herczeg. + + 32-bit backend was making all sorts of crazy assumptions, which happened to mostly + not break things prior to http://trac.webkit.org/changeset/143241. This brings the + 32-bit backend's type speculation fully into compliance with what the 64-bit + backend does. + + * dfg/DFGSpeculativeJIT.cpp: + (JSC::DFG::SpeculativeJIT::checkGeneratedTypeForToInt32): + (JSC::DFG::SpeculativeJIT::compileValueToInt32): + * dfg/DFGSpeculativeJIT32_64.cpp: + (JSC::DFG::SpeculativeJIT::fillSpeculateIntInternal): + (JSC::DFG::SpeculativeJIT::fillSpeculateDouble): + (JSC::DFG::SpeculativeJIT::fillSpeculateCell): + (JSC::DFG::SpeculativeJIT::fillSpeculateBoolean): + +2013-02-18 Ilya Tikhonovsky <loislo@chromium.org> + + Unreviewed build fix for Apple Windows. Second stage. + Add missed export statement. + + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCoreExports.def: + +2013-02-18 Roger Fong <roger_fong@apple.com> + + Unreviewed Windows build fix. + + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCoreExports.def: + * JavaScriptCore.vcxproj/JavaScriptCoreExportGenerator/JavaScriptCoreExports.def.in: + +2013-02-18 Darin Adler <darin@apple.com> + + Remove unneeded explicit function template arguments. + https://bugs.webkit.org/show_bug.cgi?id=110043 + + Reviewed by Ryosuke Niwa. + + * runtime/Identifier.cpp: + (JSC::IdentifierASCIIStringTranslator::hash): Let the compiler deduce the type + when calling computeHashAndMaskTop8Bits. + (JSC::IdentifierLCharFromUCharTranslator::hash): Ditto. + * runtime/Identifier.h: + (JSC::IdentifierCharBufferTranslator::hash): Ditto. +2013-02-18 Geoffrey Garen <ggaren@apple.com> + + Shrank the SourceProvider cache + https://bugs.webkit.org/show_bug.cgi?id=110158 + + Reviewed by Oliver Hunt. + + CodeCache is now our primary source cache, so a long-lived SourceProvider + cache is a waste. I measured this as a 10MB Membuster win; with more + precise instrumentation, Andreas estimated it as up to 30MB. + + I didn't eliminate the SourceProvider cache because it's still useful + in speeding up uncached parsing of scripts with large nested functions + (i.e., all scripts). + + * heap/Heap.cpp: + (JSC::Heap::collect): Discard all source provider caches after GC. This + is a convenient place to do so because it's reasonably soon after initial + parsing without being immediate. + + * parser/Parser.cpp: + (JSC::::Parser): Updated for interface change: The heap now owns the + source provider cache, since most SourceProviders are not expected to + have one by default, and the heap is responsible for throwing them away. + + (JSC::::parseInner): No need to update statistics on cache size, since + we're going to throw it away no matter what. + + (JSC::::parseFunctionInfo): Reduced the minimum function size to 16. This + is a 27% win on a new parsing micro-benchmark I've added. Now that the + cache is temporary, we don't have to worry so much about its memory + footprint. + + * parser/Parser.h: + (Parser): Updated for interface changes. + + * parser/SourceProvider.cpp: + (JSC::SourceProvider::SourceProvider): + (JSC::SourceProvider::~SourceProvider): + * parser/SourceProvider.h: + (JSC): + (SourceProvider): SourceProvider doesn't own its cache anymore because + the cache is temporary. + + * parser/SourceProviderCache.cpp: + (JSC::SourceProviderCache::clear): + (JSC::SourceProviderCache::add): + * parser/SourceProviderCache.h: + (JSC::SourceProviderCache::SourceProviderCache): + (SourceProviderCache): + * parser/SourceProviderCacheItem.h: + (SourceProviderCacheItem): No need to update statistics on cache size, + since we're going to throw it away no matter what. + + * runtime/JSGlobalData.cpp: + (JSC::JSGlobalData::addSourceProviderCache): + (JSC): + (JSC::JSGlobalData::clearSourceProviderCaches): + * runtime/JSGlobalData.h: + (JSC): + (JSGlobalData): Moved the cache here so it's easier to throw away. + +2013-02-18 Filip Pizlo <fpizlo@apple.com> + + DFG backend Branch handling has duplicate code and dead code + https://bugs.webkit.org/show_bug.cgi?id=110162 + + Reviewed by Mark Hahnenberg. + + Streamline the code, and make the 64 backend's optimizations make more sense + (i.e. not be dead code). + + * dfg/DFGSpeculativeJIT32_64.cpp: + (JSC::DFG::SpeculativeJIT::compile): + * dfg/DFGSpeculativeJIT64.cpp: + (JSC::DFG::SpeculativeJIT::emitBranch): + (JSC::DFG::SpeculativeJIT::compile): + +2013-02-18 Brent Fulgham <bfulgham@webkit.org> + + [Windows] Unreviewed VS2010 build correction after r143273. + + * JavaScriptCore.vcxproj/JavaScriptCore.vcxproj: Add missing source + file SourceProvider.cpp. + * JavaScriptCore.vcxproj/JavaScriptCore.vcxproj.filters: Ditto. + * JavaScriptCore.vcxproj/JavaScriptCoreExportGenerator/JavaScriptCoreExports.def.in: Add missing exports. + +2013-02-18 Filip Pizlo <fpizlo@apple.com> + + Structure::flattenDictionaryStructure should compute max offset in a manner that soundly handles the case where the property list becomes empty + https://bugs.webkit.org/show_bug.cgi?id=110155 + <rdar://problem/13233773> + + Reviewed by Mark Rowe. + + This was a rookie mistake. It was doing: + + for (blah) { + m_offset = foo // foo's monotonically increase in the loop + } + + as a way of computing max offset for all of the properties. Except what if the loop doesn't + execute because there are no properties? Well, then, you're going to have a bogus m_offset. + + The solution is to initialize m_offset at the top of the loop. + + * runtime/Structure.cpp: + (JSC::Structure::flattenDictionaryStructure): + +2013-02-18 Balazs Kilvady <kilvadyb@homejinni.com> + + MIPS DFG implementation. + https://bugs.webkit.org/show_bug.cgi?id=101328 + + Reviewed by Oliver Hunt. + + DFG implementation for MIPS. + + * assembler/MIPSAssembler.h: + (JSC::MIPSAssembler::MIPSAssembler): + (JSC::MIPSAssembler::sllv): + (JSC::MIPSAssembler::movd): + (MIPSAssembler): + (JSC::MIPSAssembler::negd): + (JSC::MIPSAssembler::labelForWatchpoint): + (JSC::MIPSAssembler::label): + (JSC::MIPSAssembler::vmov): + (JSC::MIPSAssembler::linkDirectJump): + (JSC::MIPSAssembler::maxJumpReplacementSize): + (JSC::MIPSAssembler::revertJumpToMove): + (JSC::MIPSAssembler::replaceWithJump): + * assembler/MacroAssembler.h: + (MacroAssembler): + (JSC::MacroAssembler::poke): + * assembler/MacroAssemblerMIPS.h: + (JSC::MacroAssemblerMIPS::add32): + (MacroAssemblerMIPS): + (JSC::MacroAssemblerMIPS::and32): + (JSC::MacroAssemblerMIPS::lshift32): + (JSC::MacroAssemblerMIPS::mul32): + (JSC::MacroAssemblerMIPS::or32): + (JSC::MacroAssemblerMIPS::rshift32): + (JSC::MacroAssemblerMIPS::urshift32): + (JSC::MacroAssemblerMIPS::sub32): + (JSC::MacroAssemblerMIPS::xor32): + (JSC::MacroAssemblerMIPS::store32): + (JSC::MacroAssemblerMIPS::jump): + (JSC::MacroAssemblerMIPS::branchAdd32): + (JSC::MacroAssemblerMIPS::branchMul32): + (JSC::MacroAssemblerMIPS::branchSub32): + (JSC::MacroAssemblerMIPS::branchNeg32): + (JSC::MacroAssemblerMIPS::call): + (JSC::MacroAssemblerMIPS::loadDouble): + (JSC::MacroAssemblerMIPS::moveDouble): + (JSC::MacroAssemblerMIPS::swapDouble): + (JSC::MacroAssemblerMIPS::subDouble): + (JSC::MacroAssemblerMIPS::mulDouble): + (JSC::MacroAssemblerMIPS::divDouble): + (JSC::MacroAssemblerMIPS::negateDouble): + (JSC::MacroAssemblerMIPS::branchEqual): + (JSC::MacroAssemblerMIPS::branchNotEqual): + (JSC::MacroAssemblerMIPS::branchTruncateDoubleToInt32): + (JSC::MacroAssemblerMIPS::branchTruncateDoubleToUint32): + (JSC::MacroAssemblerMIPS::truncateDoubleToInt32): + (JSC::MacroAssemblerMIPS::truncateDoubleToUint32): + (JSC::MacroAssemblerMIPS::branchDoubleNonZero): + (JSC::MacroAssemblerMIPS::branchDoubleZeroOrNaN): + (JSC::MacroAssemblerMIPS::invert): + (JSC::MacroAssemblerMIPS::replaceWithJump): + (JSC::MacroAssemblerMIPS::maxJumpReplacementSize): + * dfg/DFGAssemblyHelpers.h: + (AssemblyHelpers): + (JSC::DFG::AssemblyHelpers::preserveReturnAddressAfterCall): + (JSC::DFG::AssemblyHelpers::restoreReturnAddressBeforeReturn): + (JSC::DFG::AssemblyHelpers::debugCall): + * dfg/DFGCCallHelpers.h: + (CCallHelpers): + (JSC::DFG::CCallHelpers::setupArguments): + (JSC::DFG::CCallHelpers::setupArgumentsWithExecState): + * dfg/DFGFPRInfo.h: + (DFG): + (FPRInfo): + (JSC::DFG::FPRInfo::toRegister): + (JSC::DFG::FPRInfo::toIndex): + (JSC::DFG::FPRInfo::debugName): + * dfg/DFGGPRInfo.h: + (DFG): + (GPRInfo): + (JSC::DFG::GPRInfo::toRegister): + (JSC::DFG::GPRInfo::toIndex): + (JSC::DFG::GPRInfo::debugName): + * dfg/DFGSpeculativeJIT.h: + (SpeculativeJIT): + * jit/JSInterfaceJIT.h: + (JSInterfaceJIT): + * runtime/JSGlobalData.h: + (JSC::ScratchBuffer::allocationSize): + (ScratchBuffer): + +2013-02-18 Filip Pizlo <fpizlo@apple.com> + + DFG::SpeculativeJIT::isKnownXYZ methods should use CFA rather than other things + https://bugs.webkit.org/show_bug.cgi?id=110092 + + Reviewed by Geoffrey Garen. + + These methods were previously using GenerationInfo and other things to try to + gain information that the CFA could give away for free, if you asked kindly + enough. + + Also fixed CallLinkStatus's dump() method since it was making an invalid + assertion: we most certainly can have a status where the structure is non-null + and the executable is null, like if we're dealing with an InternalFunction. + + Also removed calls to isKnownNotXYZ from fillSpeculateABC methods in 32_64. I + don't know why that was there. But it was causing asserts if the value was + empty - i.e. we had already exited unconditionally but we didn't know it. I + could have fixed this by introducing another form of isKnownNotXYZ which was + tolerant of empty values, but I didn't feel like fixing code that I knew to be + unnecessary. (More deeply, isKnownNotCell, for example, really asks: "do you + know that this value can never be a cell?" while some of the previous uses + wanted to ask: "do you know that this is a value that is not a cell?". The + former is "true" if the value is a contradiction [i.e. BOTTOM], while the + latter is "false" for contradictions, since contradictions are not values.) + + * bytecode/CallLinkStatus.cpp: + (JSC::CallLinkStatus::dump): + * bytecode/CallLinkStatus.h: + (JSC::CallLinkStatus::CallLinkStatus): + * dfg/DFGSpeculativeJIT.cpp: + (DFG): + * dfg/DFGSpeculativeJIT.h: + (JSC::DFG::SpeculativeJIT::isKnownInteger): + (JSC::DFG::SpeculativeJIT::isKnownCell): + (JSC::DFG::SpeculativeJIT::isKnownNotInteger): + (JSC::DFG::SpeculativeJIT::isKnownNotNumber): + (JSC::DFG::SpeculativeJIT::isKnownNotCell): + * dfg/DFGSpeculativeJIT32_64.cpp: + (JSC::DFG::SpeculativeJIT::fillSpeculateIntInternal): + (JSC::DFG::SpeculativeJIT::fillSpeculateDouble): + (JSC::DFG::SpeculativeJIT::fillSpeculateCell): + * dfg/DFGStructureAbstractValue.h: + (JSC::DFG::StructureAbstractValue::dump): + +2013-02-17 Filip Pizlo <fpizlo@apple.com> + + Get rid of DFG::DoubleOperand and simplify ValueToInt32 + https://bugs.webkit.org/show_bug.cgi?id=110072 + + Reviewed by Geoffrey Garen. + + ValueToInt32 had a side-effecting path, which was not OSR-friendly: an OSR after + the side-effect would lead to the side-effect re-executing. I got rid of that path + and replaced it with an optimization for the case where the input is speculated + number-or-other. This makes idioms like null|0 and true|0 work as expected, and + get optimized appropriately. + + Also got rid of DoubleOperand. Replaced all remaining uses of it with + SpeculateDoubleOperand. Because the latter asserts that the Edge is a DoubleUse + edge and the remaining uses of DoubleOperand are all for untyped uses, I worked + around the assertion by setting the UseKind to DoubleUse by force. This is sound, + since all existing assertions for DoubleUse are actually asserting that we're not + converting a value to double unexpectedly. But all of these calls to + SpeculateDoubleOperand are when the operand is already known to be represented as + double, so there is no conversion. + + This is neutral on benchmarks, except stanford-crypto-ccm, which speeds up a + little. Mostly, this is intended to delete a bunch of code. DoubleOperand was + equivalent to the replace-edge-with-DoubleUse trick that I'm using now, except it + involved a _lot_ more code. + + * dfg/DFGAbstractState.cpp: + (JSC::DFG::AbstractState::execute): + * dfg/DFGCSEPhase.cpp: + (JSC::DFG::CSEPhase::performNodeCSE): + * dfg/DFGFixupPhase.cpp: + (JSC::DFG::FixupPhase::fixupNode): + * dfg/DFGNodeType.h: + (DFG): + * dfg/DFGSpeculativeJIT.cpp: + (DFG): + (JSC::DFG::SpeculativeJIT::compileValueToInt32): + * dfg/DFGSpeculativeJIT.h: + (SpeculativeJIT): + (DFG): + (FPRTemporary): + * dfg/DFGSpeculativeJIT32_64.cpp: + (DFG): + (JSC::DFG::SpeculativeJIT::compile): + * dfg/DFGSpeculativeJIT64.cpp: + (DFG): + +2013-02-18 Ádám Kallai <kadam@inf.u-szeged.hu> + + [Qt] Mountain Lion buildfix after r143147. + + Reviewed by Csaba Osztrogonác. + + * runtime/DateConstructor.cpp: + +2013-02-18 Zan Dobersek <zdobersek@igalia.com> + + Stop placing std::isfinite and std::signbit inside the global scope + https://bugs.webkit.org/show_bug.cgi?id=109817 + + Reviewed by Darin Adler. + + Prefix calls to the isfinite and signbit methods with std:: as the two + methods are no longer being imported into the global scope. + + * assembler/MacroAssembler.h: + (JSC::MacroAssembler::shouldBlindDouble): + * offlineasm/cloop.rb: + * runtime/BigInteger.h: + (JSC::BigInteger::BigInteger): + * runtime/DateConstructor.cpp: + (JSC::constructDate): + * runtime/DatePrototype.cpp: + (JSC::fillStructuresUsingTimeArgs): + (JSC::fillStructuresUsingDateArgs): + (JSC::dateProtoFuncToISOString): + (JSC::dateProtoFuncSetYear): + * runtime/JSCJSValueInlines.h: + (JSC::JSValue::JSValue): + * runtime/JSGlobalObjectFunctions.cpp: + (JSC::globalFuncIsFinite): + * runtime/JSONObject.cpp: + (JSC::Stringifier::appendStringifiedValue): + * runtime/MathObject.cpp: + (JSC::mathProtoFuncMax): Also include an opportunistic style fix. + (JSC::mathProtoFuncMin): Ditto. + * runtime/NumberPrototype.cpp: + (JSC::toStringWithRadix): + (JSC::numberProtoFuncToExponential): + (JSC::numberProtoFuncToFixed): + (JSC::numberProtoFuncToPrecision): + (JSC::numberProtoFuncToString): + * runtime/Uint16WithFraction.h: + (JSC::Uint16WithFraction::Uint16WithFraction): + +2013-02-18 Ádám Kallai <kadam@inf.u-szeged.hu> + + [Qt] Mountain Lion buildfix after r143147. + + Reviewed by Csaba Osztrogonác. + + * runtime/DateInstance.cpp: + +2013-02-18 Ilya Tikhonovsky <loislo@chromium.org> + + Unreviewed speculative build fix for Apple Win bots. + + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCoreExports.def: + +2013-02-18 Filip Pizlo <fpizlo@apple.com> + + Fix indentation of StructureStubInfo.h + + Rubber stamped by Mark Hahnenberg. + + * bytecode/StructureStubInfo.h: + +2013-02-18 Filip Pizlo <fpizlo@apple.com> + + Fix indentation of JSGlobalObject.h and JSGlobalObjectFunctions.h + + Rubber stamped by Mark Hahnenberg. + + * runtime/JSGlobalObject.h: + * runtime/JSGlobalObjectFunctions.h: + +2013-02-18 Filip Pizlo <fpizlo@apple.com> + + Fix indention of Operations.h + + Rubber stamped by Mark Hahnenberg. + + * runtime/Operations.h: + +2013-02-18 Filip Pizlo <fpizlo@apple.com> + + Remove DFG::SpeculativeJIT::isKnownNumeric(), since it's not called from anywhere. + + Rubber stamped by Andy Estes. + + * dfg/DFGSpeculativeJIT.cpp: + (DFG): + * dfg/DFGSpeculativeJIT.h: + (SpeculativeJIT): + +2013-02-18 Filip Pizlo <fpizlo@apple.com> + + Remove DFG::SpeculativeJIT::isStrictInt32(), since it's not called from anywhere. + + Rubber stampted by Andy Estes. + + * dfg/DFGSpeculativeJIT.cpp: + (DFG): + * dfg/DFGSpeculativeJIT.h: + (SpeculativeJIT): + +2013-02-18 Filip Pizlo <fpizlo@apple.com> + + Remove dead code for ValueToNumber from the DFG. + + Rubber stamped by Andy Estes. + + We killed ValueToNumber at some point, but forgot to kill all of the backend support + for it. + + * dfg/DFGByteCodeParser.cpp: + (JSC::DFG::ByteCodeParser::handleMinMax): + * dfg/DFGOperations.cpp: + * dfg/DFGOperations.h: + * dfg/DFGSpeculativeJIT.h: + (SpeculativeJIT): + * dfg/DFGSpeculativeJIT32_64.cpp: + * dfg/DFGSpeculativeJIT64.cpp: + +2013-02-17 Csaba Osztrogonác <ossy@webkit.org> + + Unreviewed buildfix for JSVALUE32_64 builds after r143147. + + * jit/JIT.h: + +2013-02-17 Filip Pizlo <fpizlo@apple.com> + + Move all Structure out-of-line inline methods to StructureInlines.h + https://bugs.webkit.org/show_bug.cgi?id=110024 + + Rubber stamped by Mark Hahnenberg and Sam Weinig. + + This was supposed to be easy. + + But, initially, there was a Structure inline method in CodeBlock.h, and moving that + into StructureInlines.h meant that Operations.h included CodeBlock.h. This would + cause WebCore build failures, because CodeBlock.h transitively included the JSC + parser (via many, many paths), and the JSC parser defines tokens using enumeration + elements that CSSGrammar.cpp (generated by bison) would #define. For example, + bison would give CSSGrammar.cpp a #define FUNCTION 123, and would do so before + including anything interesting. The JSC parser would have an enum that included + FUNCTION as an element. Hence the JSC parser included into CSSGrammar.cpp would have + a token element called FUNCTION declared in an enumeration, but FUNCTION was + #define'd to 123, leading to a parser error. + + Wow. + + So I removed all transitive include paths from CodeBlock.h to the JSC Parser. I + believe I was able to do so without out-of-lining anything interesting or performance + critical. This is probably a purely good thing to have done: it will be nice to be + able to make changes to the parser without having to compile the universe. + + Of course, doing this caused a bunch of other things to not compile, since a bunch of + headers relied on things being implicitly included for them when they transitively + included the parser. I fixed a lot of that. + + Finally, I ended up removing the method that depended on CodeBlock.h from + StructureInlines.h, and putting it in Structure.cpp. That might seem like all of this + was a waste of time, except that I suspect it was a worthwhile forcing function for + cleaning up a bunch of cruft. + + * API/JSCallbackFunction.cpp: + * CMakeLists.txt: + * GNUmakefile.list.am: + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: + * JavaScriptCore.xcodeproj/project.pbxproj: + * Target.pri: + * bytecode/CodeBlock.h: + (JSC): + * bytecode/EvalCodeCache.h: + * bytecode/SamplingTool.h: + * bytecode/UnlinkedCodeBlock.cpp: + (JSC::UnlinkedFunctionExecutable::parameterCount): + (JSC): + * bytecode/UnlinkedCodeBlock.h: + (UnlinkedFunctionExecutable): + * bytecompiler/BytecodeGenerator.h: + * bytecompiler/Label.h: + (JSC): + * dfg/DFGByteCodeParser.cpp: + * dfg/DFGByteCodeParser.h: + * dfg/DFGFPRInfo.h: + * dfg/DFGRegisterBank.h: + * heap/HandleStack.cpp: + * jit/JITWriteBarrier.h: + * parser/Nodes.h: + (JSC): + * parser/Parser.h: + * parser/ParserError.h: Added. + (JSC): + (JSC::ParserError::ParserError): + (ParserError): + (JSC::ParserError::toErrorObject): + * parser/ParserModes.h: + * parser/SourceProvider.cpp: Added. + (JSC): + (JSC::SourceProvider::SourceProvider): + (JSC::SourceProvider::~SourceProvider): + * parser/SourceProvider.h: + (JSC): + (SourceProvider): + * runtime/ArrayPrototype.cpp: + * runtime/DatePrototype.cpp: + * runtime/Executable.h: + * runtime/JSGlobalObject.cpp: + * runtime/JSGlobalObject.h: + (JSC): + * runtime/Operations.h: + * runtime/Structure.cpp: + (JSC::Structure::prototypeForLookup): + (JSC): + * runtime/Structure.h: + (JSC): + * runtime/StructureInlines.h: Added. + (JSC): + (JSC::Structure::create): + (JSC::Structure::createStructure): + (JSC::Structure::get): + (JSC::Structure::masqueradesAsUndefined): + (JSC::SlotVisitor::internalAppend): + (JSC::Structure::transitivelyTransitionedFrom): + (JSC::Structure::setEnumerationCache): + (JSC::Structure::enumerationCache): + (JSC::Structure::prototypeForLookup): + (JSC::Structure::prototypeChain): + (JSC::Structure::isValid): + * runtime/StructureRareData.cpp: + +2013-02-17 Roger Fong <roger_fong@apple.com> + + Unreviewed. Windows build fix. + + * runtime/CodeCache.h: + (CodeCacheMap): + +2013-02-16 Geoffrey Garen <ggaren@apple.com> + + Code cache should be explicit about what it caches + https://bugs.webkit.org/show_bug.cgi?id=110039 + + Reviewed by Oliver Hunt. + + This patch makes the code cache more explicit in two ways: + + (1) The cache caches top-level scripts. Any sub-functions executed as a + part of a script are cached with it and evicted with it. + + This simplifies things by eliminating out-of-band sub-function tracking, + and fixes pathological cases where functions for live scripts would be + evicted in favor of functions for dead scripts, and/or high probability + functions executed early in script lifetime would be evicted in favor of + low probability functions executed late in script lifetime, due to LRU. + + Statistical data from general browsing and PLT confirms that caching + functions independently of scripts is not profitable. + + (2) The cache tracks script size, not script count. + + This reduces the worst-case cache size by a factor of infinity. + + Script size is a reasonable first-order estimate of in-memory footprint + for a cached script because there are no syntactic constructs that have + super-linear memory footprint. + + * bytecode/UnlinkedCodeBlock.cpp: + (JSC::generateFunctionCodeBlock): Moved this function out of the cache + because it does not consult the cache, and is not managed by it. + + (JSC::UnlinkedFunctionExecutable::visitChildren): Visit our code blocks + because they are strong references now, rather than weak, a la (1). + + (JSC::UnlinkedFunctionExecutable::codeBlockFor): Updated for interface changes. + + * bytecode/UnlinkedCodeBlock.h: + (UnlinkedFunctionExecutable): + (UnlinkedFunctionCodeBlock): Strong now, not weak, a la (1). + + * runtime/CodeCache.cpp: + (JSC::CodeCache::CodeCache): + * runtime/CodeCache.h: + (JSC::SourceCodeKey::length): + (SourceCodeKey): + (CodeCacheMap): + (JSC::CodeCacheMap::CodeCacheMap): + (JSC::CodeCacheMap::find): + (JSC::CodeCacheMap::set): + (JSC::CodeCacheMap::clear): + (CodeCache): + (JSC::CodeCache::clear): Removed individual function tracking, due to (1). + Added explicit character counting, for (2). + + You might think 16000000 characters is a lot. It is. But this patch + didn't establish that limit -- it just took the existing limit and + made it more visible. I intend to reduce the size of the cache in a + future patch. + +2013-02-16 Filip Pizlo <fpizlo@apple.com> + + Remove support for bytecode comments, since it doesn't build, and hasn't been used in a while. + https://bugs.webkit.org/show_bug.cgi?id=110035 + + Rubber stamped by Andreas Kling. + + There are other ways of achieving the same effect, like adding print statements to the bytecode generator. + The fact that this feature doesn't build and nobody noticed implies that it's probably not a popular + feature. As well, the amount of wiring that was required for it was quite big considering its relatively + modest utility. + + * GNUmakefile.list.am: + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: + * JavaScriptCore.xcodeproj/project.pbxproj: + * bytecode/CodeBlock.cpp: + (JSC): + (JSC::CodeBlock::dumpBytecode): + (JSC::CodeBlock::CodeBlock): + * bytecode/CodeBlock.h: + (CodeBlock): + * bytecode/Comment.h: Removed. + * bytecompiler/BytecodeGenerator.cpp: + (JSC::BytecodeGenerator::BytecodeGenerator): + (JSC::BytecodeGenerator::emitOpcode): + (JSC): + * bytecompiler/BytecodeGenerator.h: + (BytecodeGenerator): + (JSC::BytecodeGenerator::symbolTable): + +2013-02-16 Brent Fulgham <bfulgham@webkit.org> + + [Windows] Unreviewed Visual Studio 2010 build fix after r143117 + + * JavaScriptCore.vcxproj/LLInt/LLIntOffsetsExtractor/LLIntOffsetsExtractorDebug.props: Reference new path to property sheets. + * JavaScriptCore.vcxproj/JavaScriptCoreExportGenerator/JavaScriptCoreExports.def.in: + Build correction after new operator == added. + +2013-02-16 Filip Pizlo <fpizlo@apple.com> + + Fix indentation of Structure.h + + Rubber stamped by Mark Hahnenberg. + + * runtime/Structure.h: + +2013-02-16 Christophe Dumez <ch.dumez@sisa.samsung.com> + + Unreviewed build fix. + + Export symbol for new CString operator== operator to fix Windows build. + + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCoreExports.def: + +2013-02-15 Filip Pizlo <fpizlo@apple.com> + + Structure should be more methodical about the relationship between m_offset and m_propertyTable + https://bugs.webkit.org/show_bug.cgi?id=109978 + + Reviewed by Mark Hahnenberg. + + Allegedly, the previous relationship was that either m_propertyTable or m_offset + would be set, and if m_propertyTable was not set you could rebuild it. In reality, + we would sometimes "reset" both: some transitions wouldn't set m_offset, and other + transitions would clear the previous structure's m_propertyTable. So, in a + structure transition chain of A->B->C you could have: + + A transitions to B: B doesn't copy m_offset but does copy m_propertyTable, because + that seemed like a good idea at the time (this was a common idiom in the code). + B transitions to C: C steals B's m_propertyTable, leaving B with neither a + m_propertyTable nor a m_offset. + + Then we would ask for the size of the property storage of B and get the answer + "none". That's not good. + + Now, there is a new relationship, which, hopefully, should fix things: m_offset is + always set and always refers to the maximum offset ever used by the property table. + From this, you can infer both the inline and out-of-line property size, and + capacity. This is accomplished by having PropertyTable::add() take a + PropertyOffset reference, which must be Structure::m_offset. It will update this + offset. As well, all transitions now copy m_offset. And we frequently assert + (using RELEASE_ASSERT) that the m_offset matches what m_propertyTable would tell + you. Hence if you ever modify the m_propertyTable, you'll also update the offset. + If you ever copy the property table, you'll also copy the offset. Life should be + good, I think. + + * runtime/PropertyMapHashTable.h: + (JSC::PropertyTable::add): + * runtime/Structure.cpp: + (JSC::Structure::materializePropertyMap): + (JSC::Structure::addPropertyTransition): + (JSC::Structure::removePropertyTransition): + (JSC::Structure::changePrototypeTransition): + (JSC::Structure::despecifyFunctionTransition): + (JSC::Structure::attributeChangeTransition): + (JSC::Structure::toDictionaryTransition): + (JSC::Structure::sealTransition): + (JSC::Structure::freezeTransition): + (JSC::Structure::preventExtensionsTransition): + (JSC::Structure::nonPropertyTransition): + (JSC::Structure::flattenDictionaryStructure): + (JSC::Structure::checkConsistency): + (JSC::Structure::putSpecificValue): + (JSC::Structure::createPropertyMap): + (JSC::PropertyTable::checkConsistency): + * runtime/Structure.h: + (JSC): + (JSC::Structure::putWillGrowOutOfLineStorage): + (JSC::Structure::outOfLineCapacity): + (JSC::Structure::outOfLineSize): + (JSC::Structure::isEmpty): + (JSC::Structure::materializePropertyMapIfNecessary): + (JSC::Structure::materializePropertyMapIfNecessaryForPinning): + (Structure): + (JSC::Structure::checkOffsetConsistency): + +2013-02-15 Martin Robinson <mrobinson@igalia.com> + + [GTK] Spread the gyp build files throughout the tree + https://bugs.webkit.org/show_bug.cgi?id=109960 + + Reviewed by Dirk Pranke. + + * JavaScriptCore.gyp/JavaScriptCoreGTK.gyp: Renamed from Source/WebKit/gtk/gyp/JavaScriptCore.gyp. + * JavaScriptCore.gyp/generate-derived-sources.sh: Renamed from Source/WebKit/gtk/gyp/generate-derived-sources.sh. + +2013-02-15 Filip Pizlo <fpizlo@apple.com> + + DFG SpeculativeJIT64 should be more precise about when it's dealing with a cell (even though it probably doesn't matter) + https://bugs.webkit.org/show_bug.cgi?id=109625 + + Reviewed by Mark Hahnenberg. + + * dfg/DFGSpeculativeJIT64.cpp: + (JSC::DFG::SpeculativeJIT::compileObjectEquality): + (JSC::DFG::SpeculativeJIT::compileObjectToObjectOrOtherEquality): + (JSC::DFG::SpeculativeJIT::compilePeepHoleObjectToObjectOrOtherEquality): + (JSC::DFG::SpeculativeJIT::compile): + +2013-02-15 Geoffrey Garen <ggaren@apple.com> + + Merged the global function cache into the source code cache + https://bugs.webkit.org/show_bug.cgi?id=108660 + + Reviewed by Sam Weinig. + + Responding to review comments by Darin Adler. + + * runtime/CodeCache.h: + (JSC::SourceCodeKey::SourceCodeKey): Don't initialize m_name and m_flags + in the hash table deleted value because they're meaningless. + +2013-02-14 Filip Pizlo <fpizlo@apple.com> + + DFG AbstractState should filter operands to NewArray more precisely + https://bugs.webkit.org/show_bug.cgi?id=109900 + + Reviewed by Mark Hahnenberg. + + NewArray for primitive indexing types speculates that the inputs are the appropriate + primitives. Now, the CFA filters the abstract state accordingly, as well. + + * dfg/DFGAbstractState.cpp: + (JSC::DFG::AbstractState::execute): + +2013-02-15 Andreas Kling <akling@apple.com> + + Yarr: Use OwnPtr to make pattern/disjunction/character-class ownership clearer. + <http://webkit.org/b/109218> + + Reviewed by Benjamin Poulain. + + - Let classes that manage lifetime of other objects hold on to them with OwnPtr instead of raw pointers. + - Placed some strategic Vector::shrinkToFit(), ::reserveInitialCapacity() and ::swap(). + + 668 kB progression on Membuster3. + + * yarr/YarrInterpreter.cpp: + (JSC::Yarr::ByteCompiler::atomParenthesesSubpatternEnd): + (JSC::Yarr::ByteCompiler::emitDisjunction): + (ByteCompiler): + * yarr/YarrInterpreter.h: + (JSC::Yarr::BytecodePattern::BytecodePattern): + (BytecodePattern): + * yarr/YarrJIT.cpp: + (JSC::Yarr::YarrGenerator::opCompileParenthesesSubpattern): + (JSC::Yarr::YarrGenerator::opCompileParentheticalAssertion): + (JSC::Yarr::YarrGenerator::opCompileBody): + * yarr/YarrPattern.cpp: + (JSC::Yarr::CharacterClassConstructor::charClass): + (JSC::Yarr::YarrPatternConstructor::YarrPatternConstructor): + (JSC::Yarr::YarrPatternConstructor::reset): + (JSC::Yarr::YarrPatternConstructor::atomPatternCharacter): + (JSC::Yarr::YarrPatternConstructor::atomCharacterClassEnd): + (JSC::Yarr::YarrPatternConstructor::copyDisjunction): + (JSC::Yarr::YarrPatternConstructor::setupDisjunctionOffsets): + (JSC::Yarr::YarrPatternConstructor::checkForTerminalParentheses): + (JSC::Yarr::YarrPatternConstructor::optimizeBOL): + (JSC::Yarr::YarrPatternConstructor::containsCapturingTerms): + (JSC::Yarr::YarrPatternConstructor::optimizeDotStarWrappedExpressions): + * yarr/YarrPattern.h: + (JSC::Yarr::PatternDisjunction::addNewAlternative): + (PatternDisjunction): + (YarrPattern): + (JSC::Yarr::YarrPattern::reset): + (JSC::Yarr::YarrPattern::newlineCharacterClass): + (JSC::Yarr::YarrPattern::digitsCharacterClass): + (JSC::Yarr::YarrPattern::spacesCharacterClass): + (JSC::Yarr::YarrPattern::wordcharCharacterClass): + (JSC::Yarr::YarrPattern::nondigitsCharacterClass): + (JSC::Yarr::YarrPattern::nonspacesCharacterClass): + (JSC::Yarr::YarrPattern::nonwordcharCharacterClass): + +2013-02-14 Geoffrey Garen <ggaren@apple.com> + + Merged the global function cache into the source code cache + https://bugs.webkit.org/show_bug.cgi?id=108660 + + Reviewed by Sam Weinig. + + This has a few benefits: + + (*) Saves a few kB by removing a second cache data structure. + + (*) Reduces the worst case memory usage of the cache by 1.75X. (Heavy + use of 'new Function' and other techniques could cause us to fill + both root caches, and they didn't trade off against each other.) + + (*) Paves the way for future improvements based on a non-trivial + cache key (for example, shrinkable pointer to the key string, and + more precise cache size accounting). + + Also cleaned up the cache implementation and simplified it a bit. + + * heap/Handle.h: + (HandleBase): + * heap/Strong.h: + (Strong): Build! + + * runtime/CodeCache.cpp: + (JSC): + (JSC::CodeCache::getCodeBlock): + (JSC::CodeCache::generateFunctionCodeBlock): + (JSC::CodeCache::getFunctionExecutableFromGlobalCode): + (JSC::CodeCache::usedFunctionCode): Updated for three interface changes: + + (*) SourceCodeKey is a class, not a pair. + + (*) Table values are abstract pointers, since they can be executables + or code blocks. (In a future patch, I'd like to change this so we + always store only code blocks. But that's too much for one patch.) + + (*) The cache function is named "set" because it always overwrites + unconditionally. + + * runtime/CodeCache.h: + (CacheMap): + (JSC::CacheMap::find): + (JSC::CacheMap::set): + (JSC::CacheMap::clear): Added support for specifying hash traits, so we + can use a SourceCodeKey. + + Removed side table and random number generator to save space and reduce + complexity. Hash tables are already random, so we don't need another source + of randomness. + + (SourceCodeKey): + (JSC::SourceCodeKey::SourceCodeKey): + (JSC::SourceCodeKey::isHashTableDeletedValue): + (JSC::SourceCodeKey::hash): + (JSC::SourceCodeKey::isNull): + (JSC::SourceCodeKey::operator==): + (JSC::SourceCodeKeyHash::hash): + (JSC::SourceCodeKeyHash::equal): + (SourceCodeKeyHash): + (SourceCodeKeyHashTraits): + (JSC::SourceCodeKeyHashTraits::isEmptyValue): A SourceCodeKey is just a + fancy triplet: source code string; function name (or null, for non-functions); + and flags. Flags and function name distinguish between functions and programs + with identical code, so they can live in the same cache. + + I chose to use the source code string as the primary hashing reference + because it's likely to be unique. We can use profiling to choose another + technique in future, if collisions between functions and programs prove + to be hot. I suspect they won't. + + (JSC::CodeCache::clear): + (CodeCache): Removed the second cache. + + * heap/Handle.h: + (HandleBase): + * heap/Strong.h: + (Strong): + * runtime/CodeCache.cpp: + (JSC): + (JSC::CodeCache::getCodeBlock): + (JSC::CodeCache::generateFunctionCodeBlock): + (JSC::CodeCache::getFunctionExecutableFromGlobalCode): + (JSC::CodeCache::usedFunctionCode): + * runtime/CodeCache.h: + (JSC): + (CacheMap): + (JSC::CacheMap::find): + (JSC::CacheMap::set): + (JSC::CacheMap::clear): + (SourceCodeKey): + (JSC::SourceCodeKey::SourceCodeKey): + (JSC::SourceCodeKey::isHashTableDeletedValue): + (JSC::SourceCodeKey::hash): + (JSC::SourceCodeKey::isNull): + (JSC::SourceCodeKey::operator==): + (JSC::SourceCodeKeyHash::hash): + (JSC::SourceCodeKeyHash::equal): + (SourceCodeKeyHash): + (SourceCodeKeyHashTraits): + (JSC::SourceCodeKeyHashTraits::isEmptyValue): + (JSC::CodeCache::clear): + (CodeCache): + +2013-02-14 Tony Chang <tony@chromium.org> + + Unreviewed, set svn:eol-style native for .sln, .vcproj, and .vsprops files. + https://bugs.webkit.org/show_bug.cgi?id=96934 + + * JavaScriptCore.vcproj/JavaScriptCore.sln: Modified property svn:eol-style. + * JavaScriptCore.vcproj/JavaScriptCoreSubmit.sln: Modified property svn:eol-style. + * JavaScriptCore.vcproj/testRegExp/testRegExpCommon.vsprops: Added property svn:eol-style. + * JavaScriptCore.vcproj/testRegExp/testRegExpDebug.vsprops: Added property svn:eol-style. + * JavaScriptCore.vcproj/testRegExp/testRegExpDebugAll.vsprops: Added property svn:eol-style. + * JavaScriptCore.vcproj/testRegExp/testRegExpDebugCairoCFLite.vsprops: Added property svn:eol-style. + * JavaScriptCore.vcproj/testRegExp/testRegExpProduction.vsprops: Added property svn:eol-style. + * JavaScriptCore.vcproj/testRegExp/testRegExpRelease.vsprops: Added property svn:eol-style. + * JavaScriptCore.vcproj/testRegExp/testRegExpReleaseCairoCFLite.vsprops: Added property svn:eol-style. + * JavaScriptCore.vcproj/testRegExp/testRegExpReleasePGO.vsprops: Added property svn:eol-style. + +2013-02-14 Tony Chang <tony@chromium.org> + + Unreviewed, set svn:eol-style CRLF for .sln files. + + * JavaScriptCore.vcproj/JavaScriptCore.sln: Modified property svn:eol-style. + * JavaScriptCore.vcproj/JavaScriptCoreSubmit.sln: Modified property svn:eol-style. + +2013-02-14 David Kilzer <ddkilzer@apple.com> + + [Mac] Clean up WARNING_CFLAGS + <http://webkit.org/b/109747> + <rdar://problem/13208373> + + Reviewed by Mark Rowe. + + * Configurations/Base.xcconfig: Use + GCC_WARN_64_TO_32_BIT_CONVERSION to enable and disable + -Wshorten-64-to-32 rather than WARNING_CFLAGS. + + * JavaScriptCore.vcproj/JavaScriptCore.sln: Modified property svn:eol-style. + * JavaScriptCore.vcproj/JavaScriptCoreSubmit.sln: Modified property svn:eol-style. + +2013-02-13 Anders Carlsson <andersca@apple.com> + + Better build fix. + + * API/tests/testapi.c: + (assertEqualsAsNumber): + (main): + +2013-02-13 Roger Fong <roger_fong@apple.com> + + Unreviewed. Build fix. + + * API/tests/testapi.c: + (assertEqualsAsNumber): + (main): + +2013-02-13 Oliver Hunt <oliver@apple.com> + + Yet another build fix + + * bytecode/CodeBlock.cpp: + (JSC::CodeBlock::CodeBlock): + +2013-02-13 Zan Dobersek <zdobersek@igalia.com> + + The 'global isinf/isnan' compiler quirk required when using clang with libstdc++ + https://bugs.webkit.org/show_bug.cgi?id=109325 + + Reviewed by Anders Carlsson. + + Prefix calls to the isinf and isnan methods with std::, declaring we want to use the + two methods as they're provided by the C++ standard library being used. + + * API/JSValueRef.cpp: + (JSValueMakeNumber): + * JSCTypedArrayStubs.h: + (JSC): + * bytecompiler/BytecodeGenerator.cpp: + (JSC::BytecodeGenerator::emitLoad): + * dfg/DFGByteCodeParser.cpp: + (JSC::DFG::ByteCodeParser::constantNaN): + * offlineasm/cloop.rb: + * runtime/DateConstructor.cpp: + (JSC::dateUTC): Also include an opportunistic style fix. + * runtime/DateInstance.cpp: + (JSC::DateInstance::calculateGregorianDateTime): + (JSC::DateInstance::calculateGregorianDateTimeUTC): + * runtime/DatePrototype.cpp: + (JSC::dateProtoFuncGetMilliSeconds): + (JSC::dateProtoFuncGetUTCMilliseconds): + (JSC::setNewValueFromTimeArgs): + (JSC::setNewValueFromDateArgs): + (JSC::dateProtoFuncSetYear): + * runtime/JSCJSValue.cpp: + (JSC::JSValue::toInteger): + * runtime/JSDateMath.cpp: + (JSC::getUTCOffset): + (JSC::parseDateFromNullTerminatedCharacters): + (JSC::parseDate): + * runtime/JSGlobalObjectFunctions.cpp: + (JSC::globalFuncIsNaN): + * runtime/MathObject.cpp: + (JSC::mathProtoFuncMax): + (JSC::mathProtoFuncMin): + (JSC::mathProtoFuncPow): + * runtime/PropertyDescriptor.cpp: + (JSC::sameValue): + +2013-02-13 Filip Pizlo <fpizlo@apple.com> + + Change another use of (SpecCell & ~SpecString) to SpecObject. + + Reviewed by Mark Hahnenberg. + + * dfg/DFGAbstractState.cpp: + (JSC::DFG::AbstractState::execute): + +2013-02-13 Filip Pizlo <fpizlo@apple.com> + + ForwardInt32ToDouble is not in DFG::MinifiedNode's list of relevant node types + https://bugs.webkit.org/show_bug.cgi?id=109726 + + Reviewed by Mark Hahnenberg. + + If you add it to the list of relevant node types, you also need to make sure + it's listed as either hasChild or one of the other kinds. Otherwise you get + an assertion. This is causing test failures in run-javascriptcore-tests. + + * dfg/DFGMinifiedNode.h: + (JSC::DFG::MinifiedNode::hasChild): + +2013-02-13 Oliver Hunt <oliver@apple.com> + + Build fix. + + Rearranged the code somewhat to reduce the number of + DFG related ifdefs. + + * bytecode/CodeBlock.cpp: + (JSC::CodeBlock::CodeBlock): + +2013-02-13 Filip Pizlo <fpizlo@apple.com> + + ForwardInt32ToDouble is not in DFG::MinifiedNode's list of relevant node types + https://bugs.webkit.org/show_bug.cgi?id=109726 + + Reviewed by Gavin Barraclough. + + This is asymptomatic because ForwardInt32ToDouble is only used in SetLocals, in + which case the value is already stored to the stack. Still, we should fix this. + + * dfg/DFGMinifiedNode.h: + (JSC::DFG::belongsInMinifiedGraph): + +2013-02-12 Filip Pizlo <fpizlo@apple.com> + + DFG LogicalNot/Branch peephole removal and inversion ignores the possibility of things exiting + https://bugs.webkit.org/show_bug.cgi?id=109489 + + Reviewed by Mark Hahnenberg. + + If things can exit between the LogicalNot and the Branch then don't peephole. + + * dfg/DFGFixupPhase.cpp: + (JSC::DFG::FixupPhase::fixupNode): + +2013-02-13 Oliver Hunt <oliver@apple.com> + + Remove unnecessary indirection to non-local variable access operations + https://bugs.webkit.org/show_bug.cgi?id=109724 + + Reviewed by Filip Pizlo. + + Linked bytecode now stores a direct pointer to the resolve operation + vectors, so the interpreter no longer needs a bunch of indirection to + to perform non-local lookup. + + * bytecode/CodeBlock.cpp: + (JSC::CodeBlock::CodeBlock): + * bytecode/CodeBlock.h: + (CodeBlock): + * bytecode/Instruction.h: + * dfg/DFGByteCodeParser.cpp: + (ByteCodeParser): + (InlineStackEntry): + (JSC::DFG::ByteCodeParser::parseResolveOperations): + (JSC::DFG::ByteCodeParser::parseBlock): + (JSC::DFG::ByteCodeParser::InlineStackEntry::InlineStackEntry): + * dfg/DFGCapabilities.h: + (JSC::DFG::canInlineOpcode): + * dfg/DFGGraph.h: + (ResolveGlobalData): + (ResolveOperationData): + (PutToBaseOperationData): + * dfg/DFGSpeculativeJIT.h: + * dfg/DFGSpeculativeJIT32_64.cpp: + (JSC::DFG::SpeculativeJIT::compile): + * dfg/DFGSpeculativeJIT64.cpp: + (JSC::DFG::SpeculativeJIT::compile): + * jit/JITOpcodes.cpp: + (JSC::JIT::emit_op_put_to_base): + (JSC::JIT::emit_op_resolve): + (JSC::JIT::emitSlow_op_resolve): + (JSC::JIT::emit_op_resolve_base): + (JSC::JIT::emitSlow_op_resolve_base): + (JSC::JIT::emit_op_resolve_with_base): + (JSC::JIT::emitSlow_op_resolve_with_base): + (JSC::JIT::emit_op_resolve_with_this): + (JSC::JIT::emitSlow_op_resolve_with_this): + (JSC::JIT::emitSlow_op_put_to_base): + * jit/JITOpcodes32_64.cpp: + (JSC::JIT::emit_op_put_to_base): + * llint/LLIntSlowPaths.cpp: + (JSC::LLInt::LLINT_SLOW_PATH_DECL): + * llint/LowLevelInterpreter.asm: + +2013-02-13 Zoltan Herczeg <zherczeg@webkit.org> + + replaceWithJump should not decrease the offset by 1 on ARM traditional. + https://bugs.webkit.org/show_bug.cgi?id=109689 + + Reviewed by Oliver Hunt. + + * assembler/ARMAssembler.h: + (JSC::ARMAssembler::replaceWithJump): + +2013-02-12 Joseph Pecoraro <pecoraro@apple.com> + + [iOS] Enable PAGE_VISIBILITY_API + https://bugs.webkit.org/show_bug.cgi?id=109399 + + Reviewed by David Kilzer. + + * Configurations/FeatureDefines.xcconfig: + +2013-02-12 Filip Pizlo <fpizlo@apple.com> + + Renamed SpecObjectMask to SpecObject. + + Rubber stamped by Mark Hahnenberg. + + "SpecObjectMask" is a weird name considering that a bunch of the other speculated + types are also masks, but don't have "Mask" in the name. + + * bytecode/SpeculatedType.h: + (JSC): + (JSC::isObjectSpeculation): + (JSC::isObjectOrOtherSpeculation): + * dfg/DFGAbstractState.cpp: + (JSC::DFG::AbstractState::execute): + * dfg/DFGPredictionPropagationPhase.cpp: + (JSC::DFG::PredictionPropagationPhase::propagate): + * dfg/DFGSpeculativeJIT.cpp: + (JSC::DFG::SpeculativeJIT::compilePeepHoleObjectEquality): + * dfg/DFGSpeculativeJIT32_64.cpp: + (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): + +2013-02-12 Filip Pizlo <fpizlo@apple.com> + + DFG CFA doesn't filter precisely enough for CompareStrictEq + https://bugs.webkit.org/show_bug.cgi?id=109618 + + Reviewed by Mark Hahnenberg. + + The backend speculates object for this case, but the CFA was filtering on + (SpecCell & ~SpecString) | SpecOther. + + * dfg/DFGAbstractState.cpp: + (JSC::DFG::AbstractState::execute): + +2013-02-12 Martin Robinson <mrobinson@igalia.com> + + Fix the gyp build of JavaScriptCore. + + * JavaScriptCore.gypi: Added some missing DFG files to the source list. + +2013-02-12 Sheriff Bot <webkit.review.bot@gmail.com> + + Unreviewed, rolling out r142387. + http://trac.webkit.org/changeset/142387 + https://bugs.webkit.org/show_bug.cgi?id=109601 + + caused all layout and jscore tests on windows to fail + (Requested by kling on #webkit). + + * bytecode/UnlinkedCodeBlock.cpp: + (JSC::UnlinkedCodeBlock::UnlinkedCodeBlock): + * bytecode/UnlinkedCodeBlock.h: + (UnlinkedCodeBlock): + +2013-02-11 Filip Pizlo <fpizlo@apple.com> + + DFG CompareEq optimization should be retuned + https://bugs.webkit.org/show_bug.cgi?id=109545 + + Reviewed by Mark Hahnenberg. + + - Made the object-to-object equality case work again by hoisting the if statement + for it. Previously, object-to-object equality would be compiled as + object-to-object-or-other. + + - Added AbstractState guards for most of the type checks that the object equality + code uses. + + Looks like a hint of a speed-up on all of the things. + + * dfg/DFGAbstractState.cpp: + (JSC::DFG::AbstractState::execute): + * dfg/DFGSpeculativeJIT.cpp: + (JSC::DFG::SpeculativeJIT::compilePeepHoleObjectEquality): + (JSC::DFG::SpeculativeJIT::compilePeepHoleBranch): + (JSC::DFG::SpeculativeJIT::compare): + * dfg/DFGSpeculativeJIT32_64.cpp: + (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): + +2013-02-12 Gabor Rapcsanyi <rgabor@webkit.org> + + JSC asserting with long parameter list functions in debug mode on ARM traditional + https://bugs.webkit.org/show_bug.cgi?id=109565 + + Reviewed by Zoltan Herczeg. + + Increase the value of sequenceGetByIdSlowCaseInstructionSpace to 80. + + * jit/JIT.h: + +2013-02-11 Oliver Hunt <oliver@apple.com> + + Make JSC API more NULL tolerant + https://bugs.webkit.org/show_bug.cgi?id=109515 + + Reviewed by Mark Hahnenberg. + + We do so much marshalling for the C API these days anyway that a single null + check isn't a performance issue. Yet the existing "null is unsafe" behaviour + leads to crashes in embedding applications whenever there's an untested code + path, so it seems having defined behaviour is superior. + + * API/APICast.h: + (toJS): + (toJSForGC): + * API/JSObjectRef.cpp: + (JSObjectIsFunction): + (JSObjectCallAsFunction): + (JSObjectIsConstructor): + (JSObjectCallAsConstructor): + * API/tests/testapi.c: + (main): + +2013-02-11 Filip Pizlo <fpizlo@apple.com> + + Unreviewed, adding a FIXME to remind ourselves of a bug. + https://bugs.webkit.org/show_bug.cgi?id=109487 + + * dfg/DFGSpeculativeJIT.cpp: + (JSC::DFG::SpeculativeJIT::compileStrictEqForConstant): + +2013-02-11 Filip Pizlo <fpizlo@apple.com> + + Strange bug in DFG OSR in JSC + https://bugs.webkit.org/show_bug.cgi?id=109491 + + Reviewed by Mark Hahnenberg. + + Int32ToDouble was being injected after a side-effecting operation and before a SetLocal. Anytime we + inject something just before a SetLocal we should be aware that the previous operation may have been + a side-effect associated with the current code origin. Hence, we should use a forward exit. + Int32ToDouble does not do forward exits by default. + + This patch adds a forward-exiting form of Int32ToDouble, for use in SetLocal Int32ToDouble injections. + Changed the CSE and other things to treat these nodes identically, but for the exit strategy to be + distinct (Int32ToDouble -> backward, ForwardInt32ToDouble -> forward). The use of the NodeType for + signaling exit direction is not "great" but it's what we use in other places already (like + ForwardCheckStructure). + + * dfg/DFGAbstractState.cpp: + (JSC::DFG::AbstractState::execute): + * dfg/DFGCSEPhase.cpp: + (JSC::DFG::CSEPhase::int32ToDoubleCSE): + (CSEPhase): + (JSC::DFG::CSEPhase::performNodeCSE): + * dfg/DFGCommon.h: + * dfg/DFGFixupPhase.cpp: + (JSC::DFG::FixupPhase::fixupNode): + (JSC::DFG::FixupPhase::fixDoubleEdge): + (JSC::DFG::FixupPhase::injectInt32ToDoubleNode): + * dfg/DFGNode.h: + (JSC::DFG::Node::willHaveCodeGenOrOSR): + * dfg/DFGNodeType.h: + (DFG): + * dfg/DFGPredictionPropagationPhase.cpp: + (JSC::DFG::PredictionPropagationPhase::propagate): + * dfg/DFGSpeculativeJIT.cpp: + (JSC::DFG::SpeculativeJIT::convertLastOSRExitToForward): + (JSC::DFG::SpeculativeJIT::compileInt32ToDouble): + * dfg/DFGSpeculativeJIT.h: + * dfg/DFGSpeculativeJIT32_64.cpp: + (JSC::DFG::SpeculativeJIT::compile): + * dfg/DFGSpeculativeJIT64.cpp: + (JSC::DFG::SpeculativeJIT::compile): + * dfg/DFGVariableEventStream.cpp: + (JSC::DFG::VariableEventStream::reconstruct): + +2013-02-11 Filip Pizlo <fpizlo@apple.com> + + NonStringCell and Object are practically the same thing for the purpose of speculation + https://bugs.webkit.org/show_bug.cgi?id=109492 + + Reviewed by Mark Hahnenberg. + + Removed isNonStringCellSpeculation, and made all callers use isObjectSpeculation. + + Changed isNonStringCellOrOtherSpeculation to be isObjectOrOtherSpeculation. + + I believe this is correct because even weird object types like JSNotAnObject end up + being "objects" from the standpoint of our typesystem. Anyway, the assumption that + "is cell but not a string" equates to "object" is an assumption that is already made + in other places in the system so there's little value in being paranoid about it. + + * bytecode/SpeculatedType.h: + (JSC::isObjectSpeculation): + (JSC::isObjectOrOtherSpeculation): + * dfg/DFGAbstractState.cpp: + (JSC::DFG::AbstractState::execute): + * dfg/DFGNode.h: + (Node): + (JSC::DFG::Node::shouldSpeculateObjectOrOther): + * dfg/DFGSpeculativeJIT.cpp: + (JSC::DFG::SpeculativeJIT::compilePeepHoleBranch): + (JSC::DFG::SpeculativeJIT::compare): + (JSC::DFG::SpeculativeJIT::compileStrictEq): + * dfg/DFGSpeculativeJIT.h: + (SpeculativeJIT): + * dfg/DFGSpeculativeJIT32_64.cpp: + (JSC::DFG::SpeculativeJIT::compileObjectOrOtherLogicalNot): + (JSC::DFG::SpeculativeJIT::compileLogicalNot): + (JSC::DFG::SpeculativeJIT::emitObjectOrOtherBranch): + (JSC::DFG::SpeculativeJIT::emitBranch): + (JSC::DFG::SpeculativeJIT::compile): + * dfg/DFGSpeculativeJIT64.cpp: + (JSC::DFG::SpeculativeJIT::compileObjectOrOtherLogicalNot): + (JSC::DFG::SpeculativeJIT::compileLogicalNot): + (JSC::DFG::SpeculativeJIT::emitObjectOrOtherBranch): + (JSC::DFG::SpeculativeJIT::emitBranch): + (JSC::DFG::SpeculativeJIT::compile): + +2013-02-10 Filip Pizlo <fpizlo@apple.com> + + DFG CompareEq(a, null) and CompareStrictEq(a, const) are unsound with respect to constant folding + https://bugs.webkit.org/show_bug.cgi?id=109387 + + Reviewed by Oliver Hunt and Mark Hahnenberg. + + Lock in the decision to use a non-speculative constant comparison as early as possible + and don't let the CFA change it by folding constants. This might be a performance + penalty on some really weird code (FWIW, I haven't seen this on benchmarks), but on + the other hand it completely side-steps the unsoundness that the bug speaks of. + + Rolling back in after adding 32-bit path. + + * dfg/DFGAbstractState.cpp: + (JSC::DFG::AbstractState::execute): + * dfg/DFGByteCodeParser.cpp: + (JSC::DFG::ByteCodeParser::isConstantForCompareStrictEq): + (ByteCodeParser): + (JSC::DFG::ByteCodeParser::parseBlock): + * dfg/DFGCSEPhase.cpp: + (JSC::DFG::CSEPhase::performNodeCSE): + * dfg/DFGNodeType.h: + (DFG): + * dfg/DFGPredictionPropagationPhase.cpp: + (JSC::DFG::PredictionPropagationPhase::propagate): + * dfg/DFGSpeculativeJIT.cpp: + (JSC::DFG::SpeculativeJIT::compileStrictEq): + * dfg/DFGSpeculativeJIT32_64.cpp: + (JSC::DFG::SpeculativeJIT::compile): + * dfg/DFGSpeculativeJIT64.cpp: + (JSC::DFG::SpeculativeJIT::compile): + +2013-02-10 Filip Pizlo <fpizlo@apple.com> + + DFG TypeOf implementation should have its backend code aligned to what the CFA does + https://bugs.webkit.org/show_bug.cgi?id=109385 + + Reviewed by Sam Weinig. + + The problem was that if we ended up trying to constant fold, but didn't succeed + because of prediction mismatches, then we would also fail to do filtration. + + Rearranged the control flow in the CFA to fix that. + + As far as I know, this is asymptomatic - it's sort of OK for the CFA to prove less + things, which is what the bug was. + + * dfg/DFGAbstractState.cpp: + (JSC::DFG::AbstractState::execute): + +2013-02-11 Sheriff Bot <webkit.review.bot@gmail.com> + + Unreviewed, rolling out r142491. + http://trac.webkit.org/changeset/142491 + https://bugs.webkit.org/show_bug.cgi?id=109470 + + broke the 32 bit build (Requested by jessieberlin on #webkit). + + * dfg/DFGAbstractState.cpp: + (JSC::DFG::AbstractState::execute): + * dfg/DFGByteCodeParser.cpp: + (JSC::DFG::ByteCodeParser::parseBlock): + * dfg/DFGCSEPhase.cpp: + (JSC::DFG::CSEPhase::performNodeCSE): + * dfg/DFGNodeType.h: + (DFG): + * dfg/DFGPredictionPropagationPhase.cpp: + (JSC::DFG::PredictionPropagationPhase::propagate): + * dfg/DFGSpeculativeJIT.cpp: + (JSC::DFG::SpeculativeJIT::compileStrictEq): + * dfg/DFGSpeculativeJIT64.cpp: + (JSC::DFG::SpeculativeJIT::compile): + +2013-02-10 Filip Pizlo <fpizlo@apple.com> + + DFG CompareEq(a, null) and CompareStrictEq(a, const) are unsound with respect to constant folding + https://bugs.webkit.org/show_bug.cgi?id=109387 + + Reviewed by Oliver Hunt. + + Lock in the decision to use a non-speculative constant comparison as early as possible + and don't let the CFA change it by folding constants. This might be a performance + penalty on some really weird code (FWIW, I haven't seen this on benchmarks), but on + the other hand it completely side-steps the unsoundness that the bug speaks of. + + * dfg/DFGAbstractState.cpp: + (JSC::DFG::AbstractState::execute): + * dfg/DFGByteCodeParser.cpp: + (JSC::DFG::ByteCodeParser::isConstantForCompareStrictEq): + (ByteCodeParser): + (JSC::DFG::ByteCodeParser::parseBlock): + * dfg/DFGCSEPhase.cpp: + (JSC::DFG::CSEPhase::performNodeCSE): + * dfg/DFGNodeType.h: + (DFG): + * dfg/DFGPredictionPropagationPhase.cpp: + (JSC::DFG::PredictionPropagationPhase::propagate): + * dfg/DFGSpeculativeJIT.cpp: + (JSC::DFG::SpeculativeJIT::compileStrictEq): + * dfg/DFGSpeculativeJIT64.cpp: + (JSC::DFG::SpeculativeJIT::compile): + +2013-02-11 Csaba Osztrogonác <ossy@webkit.org> + + Unreviewed fix after r13954 for !ENABLE(JIT) builds. + + * llint/LowLevelInterpreter.cpp: + +2013-02-11 Gabor Rapcsanyi <rgabor@webkit.org> + + JSC build failing with verbose debug mode + https://bugs.webkit.org/show_bug.cgi?id=109441 + + Reviewed by Darin Adler. + + Fixing some verbose messages which caused build errors. + + * dfg/DFGAbstractState.cpp: + (JSC::DFG::AbstractState::mergeToSuccessors): + * dfg/DFGCFAPhase.cpp: + (JSC::DFG::CFAPhase::performBlockCFA): + * dfg/DFGCSEPhase.cpp: + (JSC::DFG::CSEPhase::setReplacement): + (JSC::DFG::CSEPhase::eliminate): + * dfg/DFGPredictionInjectionPhase.cpp: + (JSC::DFG::PredictionInjectionPhase::run): + +2013-02-10 Martin Robinson <mrobinson@igalia.com> + + Fix the GTK+ gyp build + + * JavaScriptCore.gypi: Update the source list to accurately + reflect what's in the repository and remove the offsets extractor + from the list of JavaScriptCore files. It's only used to build + the extractor binary. + +2013-02-09 Andreas Kling <akling@apple.com> + + Shrink-wrap UnlinkedCodeBlock members. + <http://webkit.org/b/109368> + + Reviewed by Oliver Hunt. + + Rearrange the members of UnlinkedCodeBlock to avoid unnecessary padding on 64-bit. + Knocks ~600 KB off of the Membuster3 peak. + + * bytecode/UnlinkedCodeBlock.cpp: + (JSC::UnlinkedCodeBlock::UnlinkedCodeBlock): + * bytecode/UnlinkedCodeBlock.h: + (UnlinkedCodeBlock): + +2013-02-08 Filip Pizlo <fpizlo@apple.com> + + DFG should allow phases to break Phi's and then have one phase to rebuild them + https://bugs.webkit.org/show_bug.cgi?id=108414 + + Reviewed by Mark Hahnenberg. + + Introduces two new DFG forms: LoadStore and ThreadedCPS. These are described in + detail in DFGCommon.h. + + Consequently, DFG phases no longer have to worry about preserving data flow + links between basic blocks. It is generally always safe to request that the + graph be dethreaded (Graph::dethread), which brings it into LoadStore form, where + the data flow is implicit. In this form, only liveness-at-head needs to be + preserved. + + All of the machinery for "threading" the graph to introduce data flow between + blocks is now moved out of the bytecode parser and into the CPSRethreadingPhase. + All phases that previously did this maintenance themselves now just rely on + being able to dethread the graph. The one exception is the structure check + hoising phase, which operates over a threaded graph and preserves it, for the + sake of performance. + + Also moved two other things into their own phases: unification (previously found + in the parser) and prediction injection (previously found in various places). + + * CMakeLists.txt: + * GNUmakefile.list.am: + * JavaScriptCore.xcodeproj/project.pbxproj: + * Target.pri: + * bytecode/Operands.h: + (Operands): + (JSC::Operands::sizeFor): + (JSC::Operands::atFor): + * dfg/DFGAbstractState.cpp: + (JSC::DFG::AbstractState::execute): + (JSC::DFG::AbstractState::mergeStateAtTail): + * dfg/DFGAllocator.h: + (JSC::DFG::::allocateSlow): + * dfg/DFGArgumentsSimplificationPhase.cpp: + (JSC::DFG::ArgumentsSimplificationPhase::run): + * dfg/DFGBasicBlockInlines.h: + (DFG): + * dfg/DFGByteCodeParser.cpp: + (JSC::DFG::ByteCodeParser::getLocal): + (JSC::DFG::ByteCodeParser::getArgument): + (JSC::DFG::ByteCodeParser::flushDirect): + (JSC::DFG::ByteCodeParser::parseBlock): + (DFG): + (JSC::DFG::ByteCodeParser::parse): + * dfg/DFGCFGSimplificationPhase.cpp: + (JSC::DFG::CFGSimplificationPhase::run): + (JSC::DFG::CFGSimplificationPhase::killUnreachable): + (JSC::DFG::CFGSimplificationPhase::keepOperandAlive): + (CFGSimplificationPhase): + (JSC::DFG::CFGSimplificationPhase::fixJettisonedPredecessors): + (JSC::DFG::CFGSimplificationPhase::mergeBlocks): + * dfg/DFGCPSRethreadingPhase.cpp: Added. + (DFG): + (CPSRethreadingPhase): + (JSC::DFG::CPSRethreadingPhase::CPSRethreadingPhase): + (JSC::DFG::CPSRethreadingPhase::run): + (JSC::DFG::CPSRethreadingPhase::freeUnnecessaryNodes): + (JSC::DFG::CPSRethreadingPhase::clearVariablesAtHeadAndTail): + (JSC::DFG::CPSRethreadingPhase::addPhiSilently): + (JSC::DFG::CPSRethreadingPhase::addPhi): + (JSC::DFG::CPSRethreadingPhase::canonicalizeGetLocalFor): + (JSC::DFG::CPSRethreadingPhase::canonicalizeGetLocal): + (JSC::DFG::CPSRethreadingPhase::canonicalizeSetLocal): + (JSC::DFG::CPSRethreadingPhase::canonicalizeFlushOrPhantomLocalFor): + (JSC::DFG::CPSRethreadingPhase::canonicalizeFlushOrPhantomLocal): + (JSC::DFG::CPSRethreadingPhase::canonicalizeSetArgument): + (JSC::DFG::CPSRethreadingPhase::canonicalizeLocalsInBlock): + (JSC::DFG::CPSRethreadingPhase::canonicalizeLocalsInBlocks): + (JSC::DFG::CPSRethreadingPhase::propagatePhis): + (JSC::DFG::CPSRethreadingPhase::PhiStackEntry::PhiStackEntry): + (PhiStackEntry): + (JSC::DFG::CPSRethreadingPhase::phiStackFor): + (JSC::DFG::performCPSRethreading): + * dfg/DFGCPSRethreadingPhase.h: Added. + (DFG): + * dfg/DFGCSEPhase.cpp: + (CSEPhase): + (JSC::DFG::CSEPhase::performNodeCSE): + * dfg/DFGCommon.cpp: + (WTF): + (WTF::printInternal): + * dfg/DFGCommon.h: + (JSC::DFG::logCompilationChanges): + (DFG): + (WTF): + * dfg/DFGConstantFoldingPhase.cpp: + (JSC::DFG::ConstantFoldingPhase::foldConstants): + * dfg/DFGDriver.cpp: + (JSC::DFG::compile): + * dfg/DFGGraph.cpp: + (JSC::DFG::Graph::Graph): + (JSC::DFG::Graph::dump): + (JSC::DFG::Graph::dethread): + (JSC::DFG::Graph::collectGarbage): + * dfg/DFGGraph.h: + (JSC::DFG::Graph::performSubstitution): + (Graph): + (JSC::DFG::Graph::performSubstitutionForEdge): + (JSC::DFG::Graph::convertToConstant): + * dfg/DFGNode.h: + (JSC::DFG::Node::convertToPhantomLocal): + (Node): + (JSC::DFG::Node::convertToGetLocal): + (JSC::DFG::Node::hasVariableAccessData): + * dfg/DFGNodeType.h: + (DFG): + * dfg/DFGPhase.cpp: + (JSC::DFG::Phase::beginPhase): + * dfg/DFGPhase.h: + (JSC::DFG::runAndLog): + * dfg/DFGPredictionInjectionPhase.cpp: Added. + (DFG): + (PredictionInjectionPhase): + (JSC::DFG::PredictionInjectionPhase::PredictionInjectionPhase): + (JSC::DFG::PredictionInjectionPhase::run): + (JSC::DFG::performPredictionInjection): + * dfg/DFGPredictionInjectionPhase.h: Added. + (DFG): + * dfg/DFGPredictionPropagationPhase.cpp: + (JSC::DFG::PredictionPropagationPhase::run): + (JSC::DFG::PredictionPropagationPhase::propagate): + * dfg/DFGSpeculativeJIT32_64.cpp: + (JSC::DFG::SpeculativeJIT::compile): + * dfg/DFGSpeculativeJIT64.cpp: + (JSC::DFG::SpeculativeJIT::compile): + * dfg/DFGStructureCheckHoistingPhase.cpp: + (JSC::DFG::StructureCheckHoistingPhase::run): + * dfg/DFGUnificationPhase.cpp: Added. + (DFG): + (UnificationPhase): + (JSC::DFG::UnificationPhase::UnificationPhase): + (JSC::DFG::UnificationPhase::run): + (JSC::DFG::performUnification): + * dfg/DFGUnificationPhase.h: Added. + (DFG): + * dfg/DFGValidate.cpp: + (JSC::DFG::Validate::validate): + (JSC::DFG::Validate::dumpGraphIfAppropriate): + * dfg/DFGVirtualRegisterAllocationPhase.cpp: + (JSC::DFG::VirtualRegisterAllocationPhase::run): + * llint/LLIntSlowPaths.cpp: + (JSC::LLInt::setUpCall): + * runtime/JSCJSValue.cpp: + (JSC::JSValue::dump): + * runtime/JSString.h: + (JSString): + * runtime/Options.h: + (JSC): + +2013-02-08 Jer Noble <jer.noble@apple.com> + + Bring WebKit up to speed with latest Encrypted Media spec. + https://bugs.webkit.org/show_bug.cgi?id=97037 + + Reviewed by Eric Carlson. + + Define the ENABLE_ENCRYPTED_MEDIA_V2 setting. + + * Configurations/FeatureDefines.xcconfig: + +2013-02-08 Gavin Barraclough <barraclough@apple.com> + + Objective-C API for JavaScriptCore + https://bugs.webkit.org/show_bug.cgi?id=105889 + + Reviewed by Joseph Pecoraro + + Following up on review comments, mostly typos. + + * API/JSBlockAdaptor.h: + * API/JSBlockAdaptor.mm: + (-[JSBlockAdaptor blockFromValue:inContext:withException:]): + * API/JSContext.h: + * API/JSExport.h: + * API/JSValue.h: + * API/JSValue.mm: + * API/JSWrapperMap.mm: + (selectorToPropertyName): + (-[JSWrapperMap classInfoForClass:]): + (-[JSWrapperMap wrapperForObject:]): + +2013-02-08 Martin Robinson <mrobinson@igalia.com> + + [GTK] Add an experimental gyp build + https://bugs.webkit.org/show_bug.cgi?id=109003 + + Reviewed by Gustavo Noronha Silva. + + * JavaScriptCore.gypi: Update the list of source files to include those + necessary for the GTK+ build. + +2013-02-08 Andreas Kling <akling@apple.com> + + JSC: Lower minimum PropertyTable size. + <http://webkit.org/b/109247> + + Reviewed by Darin Adler. + + Lower the minimum table size for PropertyTable from 16 to 8. + 3.32 MB progression on Membuster3 (a ~13% reduction in memory used by PropertyTables.) + + * runtime/PropertyMapHashTable.h: + (PropertyTable): + (JSC::PropertyTable::sizeForCapacity): + +2013-02-07 Roger Fong <roger_fong@apple.com> + + Unreviewed. More VS2010 WebKit solution touchups. + Make JavaScriptCoreExports.def.in be treated as a custom build file so that changes to it cause the exports to be rebuilt. + + * JavaScriptCore.vcxproj/JavaScriptCoreExportGenerator/JavaScriptCoreExportGenerator.vcxproj: + * JavaScriptCore.vcxproj/JavaScriptCoreExportGenerator/JavaScriptCoreExportGenerator.vcxproj.filters: + * JavaScriptCore.vcxproj/JavaScriptCoreExportGenerator/JavaScriptCoreExports.def.in: + +2013-02-07 Mark Hahnenberg <mhahnenberg@apple.com> + + Objective-C API: testapi.mm should use ARC + https://bugs.webkit.org/show_bug.cgi?id=107838 + + Reviewed by Mark Rowe. + + Removing the changes to the Xcode project file and moving the equivalent flags into + the ToolExecutable xcconfig file. + + * Configurations/ToolExecutable.xcconfig: + * JavaScriptCore.xcodeproj/project.pbxproj: + +2013-02-07 Brent Fulgham <bfulgham@webkit.org> + + [Windows] Unreviewed Visual Studio 2010 build fixes after r142179. + + * JavaScriptCore.vcxproj/JavaScriptCoreExportGenerator/JavaScriptCoreExports.def.in: Correct changed symbols + * JavaScriptCore.vcxproj/JavaScriptCoreExports.def: Removed autogenerated file. + +2013-02-05 Filip Pizlo <fpizlo@apple.com> + + DFG::ByteCodeParser should do surgical constant folding to reduce load on the optimization fixpoint + https://bugs.webkit.org/show_bug.cgi?id=109000 + + Reviewed by Oliver Hunt. + + Previously our source parser's ASTBuilder did some surgical constant folding, but it + didn't cover some cases. It was particularly incapable of doing constant folding for + cases where we do some minimal loop peeling in the bytecode generator - since it + didn't "see" those constants prior to the peeling. Example: + + for (var i = 0; i < 4; ++i) + things; + + This will get peeled just a bit by the bytecode generator, so that the "i < 4" is + duplicated both at the top of the loop and the bottom. This means that we have a + constant comparison: "0 < 4", which the bytecode generator emits without any further + thought. + + The DFG optimization fixpoint of course folds this and simplifies the CFG + accordingly, but this incurs a compile-time cost. The purpose of this change is to + do some surgical constant folding in the DFG's bytecode parser, so that such + constructs reduce load on the CFG simplifier and the optimization fixpoint. The goal + is not to cover all cases, since the DFG CFA and CFG simplifier have a powerful + sparse conditional constant propagation that we can always fall back on. Instead the + goal is to cover enough cases that for common small functions we don't have to + perform such transformations, thereby reducing compile times. + + This also refactors m_inlineStackEntry->m_inlineCallFrame to be a handy method call + and also adds the notion of a TriState-based JSValue::pureToBoolean(). Both of these + things are used by the folder. + + As well, care has been taken to make sure that the bytecode parser only does folding + that is statically provable, and that doesn't arise out of speculation. This means + we cannot fold on data flow that crosses inlining boundaries. On the other hand, the + folding that the bytecode parser uses doesn't require phantoming anything. Such is + the trade-off: for anything that we do need phantoming, we defer it to the + optimization fixpoint. + + Slight SunSpider speed-up. + + * dfg/DFGByteCodeParser.cpp: + (JSC::DFG::ByteCodeParser::get): + (JSC::DFG::ByteCodeParser::getLocal): + (JSC::DFG::ByteCodeParser::setLocal): + (JSC::DFG::ByteCodeParser::flushDirect): + (JSC::DFG::ByteCodeParser::flushArgumentsAndCapturedVariables): + (JSC::DFG::ByteCodeParser::toInt32): + (ByteCodeParser): + (JSC::DFG::ByteCodeParser::inlineCallFrame): + (JSC::DFG::ByteCodeParser::currentCodeOrigin): + (JSC::DFG::ByteCodeParser::canFold): + (JSC::DFG::ByteCodeParser::handleInlining): + (JSC::DFG::ByteCodeParser::getScope): + (JSC::DFG::ByteCodeParser::parseResolveOperations): + (JSC::DFG::ByteCodeParser::parseBlock): + (JSC::DFG::ByteCodeParser::parseCodeBlock): + * dfg/DFGNode.h: + (JSC::DFG::Node::isStronglyProvedConstantIn): + (Node): + * runtime/JSCJSValue.h: + * runtime/JSCJSValueInlines.h: + (JSC::JSValue::pureToBoolean): + (JSC): + +2013-02-07 Zoltan Herczeg <zherczeg@webkit.org> + + Invalid code is generated for storing constants with baseindex addressing modes on ARM traditional. + https://bugs.webkit.org/show_bug.cgi?id=109050 + + Reviewed by Oliver Hunt. + + The S! scratch register is reused, but it should contain the constant value. + + * assembler/ARMAssembler.cpp: + (JSC::ARMAssembler::baseIndexTransfer32): + (JSC::ARMAssembler::baseIndexTransfer16): + +2013-02-07 Andras Becsi <andras.becsi@digia.com> + + [Qt] Use GNU ar's thin archive format for intermediate static libs + https://bugs.webkit.org/show_bug.cgi?id=109052 + + Reviewed by Jocelyn Turcotte. + + Adjust project files that used activeBuildConfig() + to use targetSubDir(). + + * JavaScriptCore.pri: + * LLIntOffsetsExtractor.pro: + * Target.pri: + +2013-02-06 Roger Fong <roger_fong@apple.com> + + Unreviewed. Touchups to VS2010 WebKit solution. + Fix an export generator script, modify some property sheets, add resouce file. + + * JavaScriptCore.vcxproj/JavaScriptCoreExportGenerator/JavaScriptCoreExportGeneratorDebug.props: + * JavaScriptCore.vcxproj/JavaScriptCoreExportGenerator/JavaScriptCoreExportGeneratorPostBuild.cmd: + * JavaScriptCore.vcxproj/JavaScriptCoreExportGenerator/JavaScriptCoreExportGeneratorRelease.props: + * JavaScriptCore.vcxproj/resource.h: Added. + +2013-02-06 Ilya Tikhonovsky <loislo@chromium.org> + + Web Inspector: Native Memory Instrumentation: assign class name to the heap graph node automatically + https://bugs.webkit.org/show_bug.cgi?id=107262 + + Reviewed by Yury Semikhatsky. + + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCoreExports.def: + +2013-02-06 Mike West <mkwst@chromium.org> + + Add an ENABLE_NOSNIFF feature flag. + https://bugs.webkit.org/show_bug.cgi?id=109029 + + Reviewed by Jochen Eisinger. + + This new flag will control the behavior of 'X-Content-Type-Options: nosniff' + when processing script and other resource types. + + * Configurations/FeatureDefines.xcconfig: + +2013-02-05 Mark Hahnenberg <mhahnenberg@apple.com> + + put_to_base should emit a Phantom for "value" across the ForceOSRExit + https://bugs.webkit.org/show_bug.cgi?id=108998 + + Reviewed by Oliver Hunt. + + Otherwise, the OSR exit compiler could clobber it, which would lead to badness. + + * bytecode/CodeBlock.cpp: + (JSC::CodeBlock::tallyFrequentExitSites): Build fixes for when DFG debug logging is enabled. + * dfg/DFGByteCodeParser.cpp: + (JSC::DFG::ByteCodeParser::parseBlock): Added extra Phantoms for the "value" field where needed. + * dfg/DFGSpeculativeJIT.cpp: + (JSC::DFG::SpeculativeJIT::compile): Ditto. + +2013-02-05 Michael Saboff <msaboff@apple.com> + + Crash at JSC::call when loading www.gap.com with JSVALUE32_64 Enabled + https://bugs.webkit.org/show_bug.cgi?id=108991 + + Reviewed by Oliver Hunt. + + Changed the restoration from calleeGPR to nonArgGPR0 because the restoration of the return location + may step on calleeGPR is it happen to be nonArgGPR2. + + * dfg/DFGRepatch.cpp: + (JSC::DFG::dfgLinkClosureCall): + +2013-02-05 Roger Fong <roger_fong@apple.com> + + Add a JavaScriptCore Export Generator project. + https://bugs.webkit.org/show_bug.cgi?id=108971. + + Reviewed by Brent Fulgham. + + * JavaScriptCore.vcxproj/JavaScriptCore.sln: + * JavaScriptCore.vcxproj/JavaScriptCore.vcxproj: + * JavaScriptCore.vcxproj/JavaScriptCore.vcxproj.filters: + * JavaScriptCore.vcxproj/JavaScriptCoreCommon.props: + * JavaScriptCore.vcxproj/JavaScriptCoreExportGenerator: Added. + * JavaScriptCore.vcxproj/JavaScriptCoreExportGenerator/JavaScriptCoreExportGenerator.vcxproj: Added. + * JavaScriptCore.vcxproj/JavaScriptCoreExportGenerator/JavaScriptCoreExportGenerator.vcxproj.filters: Added. + * JavaScriptCore.vcxproj/JavaScriptCoreExportGenerator/JavaScriptCoreExportGenerator.vcxproj.user: Added. + * JavaScriptCore.vcxproj/JavaScriptCoreExportGenerator/JavaScriptCoreExportGeneratorBuildCmd.cmd: Added. + * JavaScriptCore.vcxproj/JavaScriptCoreExportGenerator/JavaScriptCoreExportGeneratorCommon.props: Added. + * JavaScriptCore.vcxproj/JavaScriptCoreExportGenerator/JavaScriptCoreExportGeneratorDebug.props: Added. + * JavaScriptCore.vcxproj/JavaScriptCoreExportGenerator/JavaScriptCoreExportGeneratorPostBuild.cmd: Added. + * JavaScriptCore.vcxproj/JavaScriptCoreExportGenerator/JavaScriptCoreExportGeneratorPreBuild.cmd: Added. + * JavaScriptCore.vcxproj/JavaScriptCoreExportGenerator/JavaScriptCoreExportGeneratorRelease.props: Added. + * JavaScriptCore.vcxproj/JavaScriptCoreExportGenerator/JavaScriptCoreExports.def.in: Added. + +2013-02-04 Filip Pizlo <fpizlo@apple.com> + + DFG should have a precise view of jump targets + https://bugs.webkit.org/show_bug.cgi?id=108868 + + Reviewed by Oliver Hunt. + + Previously, the DFG relied entirely on the CodeBlock's jump targets list for + determining when to break basic blocks. This worked great, except sometimes it + would be too conservative since the CodeBlock just says where the bytecode + generator inserted labels. + + This change keeps the old jump target list in CodeBlock since it is still + valuable to the baseline JIT, but switches the DFG to use its own jump target + calculator. This ought to reduce pressure on the DFG simplifier, which would + previously do a lot of work to try to merge redundantly created basic blocks. + It appears to be a 1% progression on SunSpider. + + * CMakeLists.txt: + * GNUmakefile.list.am: + * JavaScriptCore.xcodeproj/project.pbxproj: + * Target.pri: + * bytecode/PreciseJumpTargets.cpp: Added. + (JSC): + (JSC::addSimpleSwitchTargets): + (JSC::computePreciseJumpTargets): + * bytecode/PreciseJumpTargets.h: Added. + (JSC): + * dfg/DFGByteCodeParser.cpp: + (JSC::DFG::ByteCodeParser::parseCodeBlock): + +2013-02-01 Roger Fong <roger_fong@apple.com> + + Make ConfigurationBuildDir include directories precede WebKitLibraries in JSC. + https://bugs.webkit.org/show_bug.cgi?id=108693. + + Rubberstamped by Timothy Horton. + + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCoreCommon.vsprops: + +2013-02-04 Mark Hahnenberg <mhahnenberg@apple.com> + + Structure::m_outOfLineCapacity is unnecessary + https://bugs.webkit.org/show_bug.cgi?id=108206 + + Reviewed by Darin Adler. + + Simplifying the utility functions that we use since we don't need a + bunch of fancy templates for this one specific call site. + + * runtime/Structure.h: + (JSC::Structure::outOfLineCapacity): + +2013-02-05 Mark Hahnenberg <mhahnenberg@apple.com> + + Objective-C API: testapi.mm should use ARC + https://bugs.webkit.org/show_bug.cgi?id=107838 + + Reviewed by Oliver Hunt. + + In ToT testapi.mm uses the Obj-C garbage collector, which hides a lot of our object lifetime bugs. + We should enable ARC, since that is what most of our clients will be using. We use Xcode project + settings to make sure we don't try to compile ARC on 32-bit. + + * API/tests/testapi.mm: + (+[TestObject testObject]): + (testObjectiveCAPI): + * JavaScriptCore.xcodeproj/project.pbxproj: + +2013-02-05 Brent Fulgham <bfulgham@webkit.org> + + [Windows] Unreviewed VS2010 Build Correction after r141651 + + * JavaScriptCore.vcxproj/JavaScriptCore.vcxproj: Add missing + StructureRareData.h and StructureRareData.cpp files. + * JavaScriptCore.vcxproj/JavaScriptCore.vcxproj.filters: Ditto. + +2013-02-05 Michael Saboff <msaboff@apple.com> + + r141788 won't build due to not having all changes needed by Node* change + https://bugs.webkit.org/show_bug.cgi?id=108944 + + Reviewed by David Kilzer. + + Fixed three instances of integerResult(..., m_compileIndex) to be integerResult(..., node). + + * dfg/DFGSpeculativeJIT.cpp: + (JSC::DFG::SpeculativeJIT::compileSoftModulo): + (JSC::DFG::SpeculativeJIT::compileIntegerArithDivForARMv7s): + +2013-02-04 Sheriff Bot <webkit.review.bot@gmail.com> + + Unreviewed, rolling out r141809. + http://trac.webkit.org/changeset/141809 + https://bugs.webkit.org/show_bug.cgi?id=108860 + + ARC isn't supported on 32-bit. (Requested by mhahnenberg on + #webkit). + + * API/tests/testapi.mm: + (+[TestObject testObject]): + (testObjectiveCAPI): + * JavaScriptCore.xcodeproj/project.pbxproj: + +2013-02-04 Mark Hahnenberg <mhahnenberg@apple.com> + + Objective-C API: testapi.mm should use ARC + https://bugs.webkit.org/show_bug.cgi?id=107838 + + Reviewed by Oliver Hunt. + + In ToT testapi.mm uses the Obj-C garbage collector, which hides a lot of our object lifetime bugs. + We should enable ARC, since that is what most of our clients will be using. + + * API/tests/testapi.mm: + (-[TestObject init]): + (-[TestObject dealloc]): + (+[TestObject testObject]): + (testObjectiveCAPI): + * JavaScriptCore.xcodeproj/project.pbxproj: + +2013-02-04 Mark Hahnenberg <mhahnenberg@apple.com> + + Objective-C API: ObjCCallbackFunction should retain the target of its NSInvocation + https://bugs.webkit.org/show_bug.cgi?id=108843 + + Reviewed by Darin Adler. + + Currently, ObjCCallbackFunction doesn't retain the target of its NSInvocation. It needs to do + this to prevent crashes when trying to invoke a callback later on. + + * API/ObjCCallbackFunction.mm: + (ObjCCallbackFunction::ObjCCallbackFunction): + (ObjCCallbackFunction::~ObjCCallbackFunction): + +2013-02-04 Martin Robinson <mrobinson@igalia.com> + + Fix GTK+ 'make dist' in preparation for the 1.11.5 release. + + * GNUmakefile.list.am: Update the source lists. + +2013-02-04 Michael Saboff <msaboff@apple.com> + + For ARMv7s use integer divide instruction for divide and modulo when possible + https://bugs.webkit.org/show_bug.cgi?id=108840 + + Reviewed in person by Filip Pizlo. + + Added ARMv7s integer divide path for ArithDiv and ArithMod where operands and results are integer. + This is patterned after the similar code for X86. Also added modulo power of 2 optimization + that uses logical and. Added sdiv and udiv to the ARMv7 disassembler. Put all the changes + behind #if CPU(APPLE_ARMV7S). + + * assembler/ARMv7Assembler.h: + (ARMv7Assembler): + (JSC::ARMv7Assembler::sdiv): + (JSC::ARMv7Assembler::udiv): + * dfg/DFGCommon.h: + (JSC::DFG::isARMv7s): + * dfg/DFGFixupPhase.cpp: + (JSC::DFG::FixupPhase::fixupNode): + * dfg/DFGSpeculativeJIT.cpp: + (JSC::DFG::SpeculativeJIT::compileSoftModulo): + (JSC::DFG::SpeculativeJIT::compileIntegerArithDivForARMv7s): + * dfg/DFGSpeculativeJIT.h: + (SpeculativeJIT): + * dfg/DFGSpeculativeJIT32_64.cpp: + (JSC::DFG::SpeculativeJIT::compile): + +2013-02-04 David Kilzer <ddkilzer@apple.com> + + Check PrivateHeaders/JSBasePrivate.h for inappropriate macros + <http://webkit.org/b/108749> + + Reviewed by Joseph Pecoraro. + + * JavaScriptCore.xcodeproj/project.pbxproj: Add + PrivateHeaders/JSBasePrivate.h to list of headers to check in + "Check for Inappropriate Macros in External Headers" build phase + script. + +2013-02-04 David Kilzer <ddkilzer@apple.com> + + Remove duplicate entries from JavaScriptCore Xcode project + + $ uniq Source/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj | diff -u - Source/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj | patch -p0 -R + patching file Source/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj + + * JavaScriptCore.xcodeproj/project.pbxproj: Remove duplicates. + +2013-02-04 David Kilzer <ddkilzer@apple.com> + + Sort JavaScriptCore Xcode project file + + * JavaScriptCore.xcodeproj/project.pbxproj: + +2013-02-03 David Kilzer <ddkilzer@apple.com> + + Upstream ENABLE_PDFKIT_PLUGIN settting + <http://webkit.org/b/108792> + + Reviewed by Tim Horton. + + * Configurations/FeatureDefines.xcconfig: Disable PDFKIT_PLUGIN + on iOS since PDFKit is a Mac-only framework. + +2013-02-02 Andreas Kling <akling@apple.com> + + Vector should consult allocator about ideal size when choosing capacity. + <http://webkit.org/b/108410> + <rdar://problem/13124002> + + Reviewed by Benjamin Poulain. + + Remove assertion about Vector capacity that won't hold anymore since capacity() + may not be what you passed to reserveCapacity(). + Also export WTF::fastMallocGoodSize() for Windows builds. + + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCoreExports.def: + * bytecode/CodeBlock.cpp: + (JSC::CodeBlock::CodeBlock): + +2013-02-02 Patrick Gansterer <paroga@webkit.org> + + [CMake] Adopt the WinCE port to new CMake + https://bugs.webkit.org/show_bug.cgi?id=108754 + + Reviewed by Laszlo Gombos. + + * os-win32/WinMain.cpp: Removed. + * shell/PlatformWinCE.cmake: Removed. + +2013-02-02 Mark Rowe <mrowe@apple.com> + + <http://webkit.org/b/108745> WTF shouldn't use a script build phase to detect the presence of headers when the compiler can do it for us + + Reviewed by Sam Weinig. + + * DerivedSources.make: Remove an obsolete Makefile rule. This should have been removed when the use + of the generated file moved to WTF. + +2013-02-02 David Kilzer <ddkilzer@apple.com> + + Upstream iOS FeatureDefines + <http://webkit.org/b/108753> + + Reviewed by Anders Carlsson. + + * Configurations/FeatureDefines.xcconfig: + - ENABLE_DEVICE_ORIENTATION: Add iOS configurations. + - ENABLE_PLUGIN_PROXY_FOR_VIDEO: Ditto. + - FEATURE_DEFINES: Add ENABLE_PLUGIN_PROXY_FOR_VIDEO. Add + PLATFORM_NAME variant to reduce future merge conflicts. + +2013-02-01 Mark Hahnenberg <mhahnenberg@apple.com> + + Structure::m_enumerationCache should be moved to StructureRareData + https://bugs.webkit.org/show_bug.cgi?id=108723 + + Reviewed by Oliver Hunt. + + m_enumerationCache is only used by objects whose properties are iterated over, so not every Structure needs this + field and it can therefore be moved safely to StructureRareData to help with memory savings. + + * runtime/JSPropertyNameIterator.h: + (JSPropertyNameIterator): + (JSC::Register::propertyNameIterator): + (JSC::StructureRareData::enumerationCache): Add to JSPropertyNameIterator.h so that it can see the correct type. + (JSC::StructureRareData::setEnumerationCache): Ditto. + * runtime/Structure.cpp: + (JSC::Structure::addPropertyWithoutTransition): Use the enumerationCache() getter rather than accessing the field. + (JSC::Structure::removePropertyWithoutTransition): Ditto. + (JSC::Structure::visitChildren): We no longer have to worry about marking the m_enumerationCache field. + * runtime/Structure.h: + (JSC::Structure::setEnumerationCache): Move the old accessors back since we don't have to have any knowledge of + the JSPropertyNameIterator type. + (JSC::Structure::enumerationCache): Ditto. + * runtime/StructureRareData.cpp: + (JSC::StructureRareData::visitChildren): Mark the new m_enumerationCache field. + * runtime/StructureRareData.h: Add new functions/fields. + (StructureRareData): + +2013-02-01 Roger Fong <roger_fong@apple.com> + + Unreviewed. JavaScriptCore VS2010 project cleanup. + + * JavaScriptCore.vcxproj/JavaScriptCore.vcxproj: + * JavaScriptCore.vcxproj/JavaScriptCore.vcxproj.filters: + * JavaScriptCore.vcxproj/JavaScriptCoreCommon.props: + * JavaScriptCore.vcxproj/testRegExp/testRegExp.vcxproj: + +2013-02-01 Sheriff Bot <webkit.review.bot@gmail.com> + + Unreviewed, rolling out r141662. + http://trac.webkit.org/changeset/141662 + https://bugs.webkit.org/show_bug.cgi?id=108738 + + it's an incorrect change since processPhiStack will + dereference dangling BasicBlock pointers (Requested by pizlo + on #webkit). + + * dfg/DFGByteCodeParser.cpp: + (JSC::DFG::ByteCodeParser::parse): + +2013-02-01 Filip Pizlo <fpizlo@apple.com> + + Eliminate dead blocks sooner in the DFG::ByteCodeParser to make clear that you don't need to hold onto them during Phi construction + https://bugs.webkit.org/show_bug.cgi?id=108717 + + Reviewed by Mark Hahnenberg. + + I think this makes the code clearer. It doesn't change behavior. + + * dfg/DFGByteCodeParser.cpp: + (JSC::DFG::ByteCodeParser::parse): + +2013-02-01 Mark Hahnenberg <mhahnenberg@apple.com> + + Structure should have a StructureRareData field to save space + https://bugs.webkit.org/show_bug.cgi?id=108659 + + Reviewed by Oliver Hunt. + + Many of the fields in Structure are used in a subset of all total Structures; however, all Structures must + pay the memory cost of those fields, regardless of whether they use them or not. Since we can have potentially + many Structures on a single page (e.g. bing.com creates ~1500 Structures), it would be profitable to + refactor Structure so that not every Structure has to pay the memory costs for these infrequently used fields. + + To accomplish this, we can create a new StructureRareData class to house these seldom used fields which we + can allocate on demand whenever a Structure requires it. This StructureRareData can itself be a JSCell, and + can do all the marking of the fields for the Structure. The StructureRareData field will be part of a union + with m_previous to minimize overhead. We'll add a new field to JSTypeInfo to indicate that the Structure has + a StructureRareData field. During transitions, a Structure will clone its previous Structure's StructureRareData + if it has one. There could be some potential for optimizing this process, but the initial implementation will + be dumb since we'd be paying these overhead costs for each Structure anyways. + + Initially we'll only put two fields in the StructureRareData to avoid a memory regression. Over time we'll + continue to move fields from Structure to StructureRareData. Optimistically, this could potentially reduce our + Structure memory footprint by up to around 75%. It could also clear the way for removing destructors from + Structures (and into StructureRareData). + + * CMakeLists.txt: + * GNUmakefile.list.am: + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: + * JavaScriptCore.xcodeproj/project.pbxproj: + * Target.pri: + * dfg/DFGRepatch.cpp: Includes for linking purposes. + * jit/JITStubs.cpp: + * jsc.cpp: + * llint/LLIntSlowPaths.cpp: + * runtime/JSCellInlines.h: Added ifdef guards. + * runtime/JSGlobalData.cpp: New Structure for StructureRareData class. + (JSC::JSGlobalData::JSGlobalData): + * runtime/JSGlobalData.h: + (JSGlobalData): + * runtime/JSGlobalObject.h: + * runtime/JSTypeInfo.h: New flag to indicate whether or not a Structure has a StructureRareData field. + (JSC::TypeInfo::flags): + (JSC::TypeInfo::structureHasRareData): + * runtime/ObjectPrototype.cpp: + * runtime/Structure.cpp: We use a combined WriteBarrier<JSCell> field m_previousOrRareData to avoid compiler issues. + (JSC::Structure::dumpStatistics): + (JSC::Structure::Structure): + (JSC::Structure::materializePropertyMap): + (JSC::Structure::addPropertyTransition): + (JSC::Structure::nonPropertyTransition): + (JSC::Structure::pin): + (JSC::Structure::allocateRareData): Handles allocating a brand new StructureRareData field. + (JSC::Structure::cloneRareDataFrom): Handles cloning a StructureRareData field from another. Used during Structure + transitions. + (JSC::Structure::visitChildren): We no longer have to worry about marking m_objectToStringValue. + * runtime/Structure.h: + (JSC::Structure::previousID): Checks the structureHasRareData flag to see where it should get the previous Structure. + (JSC::Structure::objectToStringValue): Reads the value from the StructureRareData. If it doesn't exist, returns 0. + (JSC::Structure::setObjectToStringValue): Ensures that we have a StructureRareData field, then forwards the function + call to it. + (JSC::Structure::materializePropertyMapIfNecessary): + (JSC::Structure::setPreviousID): Checks for StructureRareData and forwards if necessary. + (Structure): + (JSC::Structure::clearPreviousID): Ditto. + (JSC::Structure::create): + * runtime/StructureRareData.cpp: Added. All of the basic functionality of a JSCell with the fields that we've moved + from Structure and the functions required to access/modify those fields as Structure would have done. + (JSC): + (JSC::StructureRareData::createStructure): + (JSC::StructureRareData::create): + (JSC::StructureRareData::clone): + (JSC::StructureRareData::StructureRareData): + (JSC::StructureRareData::visitChildren): + * runtime/StructureRareData.h: Added. + (JSC): + (StructureRareData): + * runtime/StructureRareDataInlines.h: Added. + (JSC): + (JSC::StructureRareData::previousID): + (JSC::StructureRareData::setPreviousID): + (JSC::StructureRareData::clearPreviousID): + (JSC::Structure::previous): Handles the ugly casting to get the value of the right type of m_previousOrRareData. + (JSC::Structure::rareData): Ditto. + (JSC::StructureRareData::objectToStringValue): + (JSC::StructureRareData::setObjectToStringValue): + + * CMakeLists.txt: + * GNUmakefile.list.am: + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: + * JavaScriptCore.xcodeproj/project.pbxproj: + * Target.pri: + * dfg/DFGRepatch.cpp: + * jit/JITStubs.cpp: + * jsc.cpp: + * llint/LLIntSlowPaths.cpp: + * runtime/JSCellInlines.h: + * runtime/JSGlobalData.cpp: + (JSC::JSGlobalData::JSGlobalData): + * runtime/JSGlobalData.h: + (JSGlobalData): + * runtime/JSGlobalObject.h: + * runtime/JSTypeInfo.h: + (JSC): + (JSC::TypeInfo::flags): + (JSC::TypeInfo::structureHasRareData): + * runtime/ObjectPrototype.cpp: + * runtime/Structure.cpp: + (JSC::Structure::dumpStatistics): + (JSC::Structure::Structure): + (JSC::Structure::materializePropertyMap): + (JSC::Structure::addPropertyTransition): + (JSC::Structure::nonPropertyTransition): + (JSC::Structure::pin): + (JSC::Structure::allocateRareData): + (JSC): + (JSC::Structure::cloneRareDataFrom): + (JSC::Structure::visitChildren): + * runtime/Structure.h: + (JSC::Structure::previousID): + (JSC::Structure::objectToStringValue): + (JSC::Structure::setObjectToStringValue): + (JSC::Structure::materializePropertyMapIfNecessary): + (JSC::Structure::setPreviousID): + (Structure): + (JSC::Structure::clearPreviousID): + (JSC::Structure::previous): + (JSC::Structure::rareData): + (JSC::Structure::create): + * runtime/StructureRareData.cpp: Added. + (JSC): + (JSC::StructureRareData::createStructure): + (JSC::StructureRareData::create): + (JSC::StructureRareData::clone): + (JSC::StructureRareData::StructureRareData): + (JSC::StructureRareData::visitChildren): + * runtime/StructureRareData.h: Added. + (JSC): + (StructureRareData): + * runtime/StructureRareDataInlines.h: Added. + (JSC): + (JSC::StructureRareData::previousID): + (JSC::StructureRareData::setPreviousID): + (JSC::StructureRareData::clearPreviousID): + (JSC::StructureRareData::objectToStringValue): + (JSC::StructureRareData::setObjectToStringValue): + +2013-02-01 Balazs Kilvady <kilvadyb@homejinni.com> + + offlineasm BaseIndex handling is broken on ARM due to MIPS changes + https://bugs.webkit.org/show_bug.cgi?id=108261 + + Reviewed by Filip Pizlo. + + offlineasm BaseIndex handling fix on MIPS. + + * offlineasm/mips.rb: + * offlineasm/risc.rb: + +2013-02-01 Geoffrey Garen <ggaren@apple.com> + + Removed an unused function: JSGlobalObject::createFunctionExecutableFromGlobalCode + https://bugs.webkit.org/show_bug.cgi?id=108657 + + Reviewed by Anders Carlsson. + + * runtime/JSGlobalObject.cpp: + (JSC): + * runtime/JSGlobalObject.h: + (JSGlobalObject): + +2013-02-01 Geoffrey Garen <ggaren@apple.com> + + Added TriState to WTF and started using it in one place + https://bugs.webkit.org/show_bug.cgi?id=108628 + + Reviewed by Beth Dakin. + + * runtime/PrototypeMap.h: + (JSC::PrototypeMap::isPrototype): Use TriState instead of boolean. In + response to review feedback, this is an attempt to clarify that our + 'true' condition is actually just a 'maybe'. + + * runtime/PrototypeMap.h: + (PrototypeMap): + (JSC::PrototypeMap::isPrototype): + +2013-02-01 Alexis Menard <alexis@webkit.org> + + Enable unprefixed CSS transitions by default. + https://bugs.webkit.org/show_bug.cgi?id=108216 + + Reviewed by Dean Jackson. + + Rename the flag CSS_TRANSFORMS_ANIMATIONS_TRANSITIONS_UNPREFIXED + to CSS_TRANSFORMS_ANIMATIONS_UNPREFIXED which will be used later to + guard the unprefixing work for CSS Transforms and animations. + + * Configurations/FeatureDefines.xcconfig: + +2013-01-31 Filip Pizlo <fpizlo@apple.com> + + DFG::CFGSimplificationPhase::keepOperandAlive() conflates liveness and availability + https://bugs.webkit.org/show_bug.cgi?id=108580 + + Reviewed by Oliver Hunt. + + This is a harmless bug in that it only results in us keeping a bit too many things + for OSR. But it's worth fixing so that the code is consistent. + + keepOperandAlive() is called when block A has a branch to blocks B and C, but the + A->B edge is proven to never be taken and we want to optimize the code to have A + unconditionally jump to C. In that case, for the purposes of OSR, we need to + preserve the knowledge that the state that B expected to be live incoming from A + ought still to be live up to the point of where the A->B,C branch used to be. The + way we keep things alive is by using the variablesAtTail of A (i.e., we use the + knowledge of in what manner A made state available to B and C). The way we choose + which state should be kept alive ought to be chosen by the variablesAtHead of B + (i.e. the things B says it needs from its predecessors, including A), except that + keepOperandAlive() was previously just using variablesAtTail of A for this + purpose. + + The fix is to have keepOperandAlive() use both liveness and availability in its + logic. It should use liveness (i.e. B->variablesAtHead) to decide what to keep + alive, and it should use availability (i.e. A->variablesAtTail) to decide how to + keep it alive. + + This might be a microscopic win on some programs, but it's mainly intended to be + a code clean-up so that I don't end up scratching my head in confusion the next + time I look at this code. + + * dfg/DFGCFGSimplificationPhase.cpp: + (JSC::DFG::CFGSimplificationPhase::keepOperandAlive): + (JSC::DFG::CFGSimplificationPhase::jettisonBlock): + (JSC::DFG::CFGSimplificationPhase::mergeBlocks): + +2013-01-31 Geoffrey Garen <ggaren@apple.com> + + REGRESSION (r141192): Crash beneath cti_op_get_by_id_generic @ discussions.apple.com + https://bugs.webkit.org/show_bug.cgi?id=108576 + + Reviewed by Filip Pizlo. + + This was a long-standing bug. The DFG would destructively reuse a register + in op_convert_this, but: + + * The bug only presented during speculation failure for type Other + + * The bug presented by removing the low bits of a pointer, which + used to be harmless, since all objects were so aligned anyway. + + * dfg/DFGSpeculativeJIT64.cpp: + (JSC::DFG::SpeculativeJIT::compile): Don't reuse our this register as + our scratch register. The whole point of our scratch register is to + avoid destructively modifying our this register. I'm pretty sure this + was a copy-paste error. + +2013-01-31 Roger Fong <roger_fong@apple.com> + + Unreviewed. Windows build fix. + + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCoreExports.def: + +2013-01-31 Jessie Berlin <jberlin@apple.com> + + Rolling out r141407 because it is causing crashes under + WTF::TCMalloc_Central_FreeList::FetchFromSpans() in Release builds. + + * bytecode/CodeBlock.cpp: + (JSC::CodeBlock::CodeBlock): + +2013-01-31 Mark Hahnenberg <mhahnenberg@apple.com> + + Objective-C API: JSContext exception property causes reference cycle + https://bugs.webkit.org/show_bug.cgi?id=107778 + + Reviewed by Darin Adler. + + JSContext has a (retain) JSValue * exception property which, when non-null, creates a + reference cycle (since the JSValue * holds a strong reference back to the JSContext *). + + * API/JSContext.mm: Instead of JSValue *, we now use a plain JSValueRef, which eliminates the reference cycle. + (-[JSContext initWithVirtualMachine:]): + (-[JSContext setException:]): + (-[JSContext exception]): + +2013-01-31 Roger Fong <roger_fong@apple.com> + + Unreviewed build fix. Win7 port. + + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCoreExports.def: + +2013-01-31 Joseph Pecoraro <pecoraro@apple.com> + + Disable ENABLE_FULLSCREEN_API on iOS + https://bugs.webkit.org/show_bug.cgi?id=108250 + + Reviewed by Benjamin Poulain. + + * Configurations/FeatureDefines.xcconfig: + +2013-01-31 Mark Hahnenberg <mhahnenberg@apple.com> + + Objective-C API: Fix insertion of values greater than the max index allowed by the spec + https://bugs.webkit.org/show_bug.cgi?id=108264 + + Reviewed by Oliver Hunt. + + Fixed a bug, added a test to the API tests, cleaned up some code. + + * API/JSValue.h: Changed some of the documentation on setValue:atIndex: to indicate that + setting values at indices greater than UINT_MAX - 1 wont' affect the length of JS arrays. + * API/JSValue.mm: + (-[JSValue valueAtIndex:]): We weren't returning when we should have been. + (-[JSValue setValue:atIndex:]): Added a comment about why we do the early check for being larger than UINT_MAX. + (objectToValueWithoutCopy): Removed two redundant cases that were already checked previously. + * API/tests/testapi.mm: + +2013-01-30 Andreas Kling <akling@apple.com> + + Vector should consult allocator about ideal size when choosing capacity. + <http://webkit.org/b/108410> + <rdar://problem/13124002> + + Reviewed by Benjamin Poulain. + + Remove assertion about Vector capacity that won't hold anymore since capacity() + may not be what you passed to reserveCapacity(). + + * bytecode/CodeBlock.cpp: + (JSC::CodeBlock::CodeBlock): + +2013-01-30 Filip Pizlo <fpizlo@apple.com> + + DFG bytecode parser should have more assertions about the status of local accesses + https://bugs.webkit.org/show_bug.cgi?id=108417 + + Reviewed by Mark Hahnenberg. + + Assert some things that we already know to be true, just to reassure ourselves that they are true. + This is meant as a prerequisite for https://bugs.webkit.org/show_bug.cgi?id=108414, which will + make these rules even stricter. + + * dfg/DFGByteCodeParser.cpp: + (JSC::DFG::ByteCodeParser::getLocal): + (JSC::DFG::ByteCodeParser::getArgument): + +2013-01-30 Mark Hahnenberg <mhahnenberg@apple.com> + + Objective-C API: JSContext's dealloc causes ASSERT due to ordering of releases + https://bugs.webkit.org/show_bug.cgi?id=107978 + + Reviewed by Filip Pizlo. + + We need to add the Identifier table save/restore in JSContextGroupRelease so that we + have the correct table if we end up destroying the JSGlobalData/Heap. + + * API/JSContextRef.cpp: + (JSContextGroupRelease): + +2013-01-30 Mark Hahnenberg <mhahnenberg@apple.com> + + Objective-C API: exceptionHandler needs to be released in JSContext dealloc + https://bugs.webkit.org/show_bug.cgi?id=108378 + + Reviewed by Filip Pizlo. + + JSContext has a (copy) exceptionHandler property that it doesn't release in dealloc. + That sounds like the potential for a leak. It should be released. + + * API/JSContext.mm: + (-[JSContext dealloc]): + +2013-01-30 Filip Pizlo <fpizlo@apple.com> + + REGRESSION(140504): pure CSE no longer matches things, 10% regression on Kraken + https://bugs.webkit.org/show_bug.cgi?id=108366 + + Reviewed by Geoffrey Garen and Mark Hahnenberg. + + This was a longstanding bug that was revealed by http://trac.webkit.org/changeset/140504. + Pure CSE requires that the Node::flags() that may affect the behavior of a node match, + when comparing a possibly redundant node to its possible replacement. It was doing this + by comparing Node::arithNodeFlags(), which as the name might appear to suggest, returns + just those flag bits that correspond to actual node behavior and not auxiliary things. + Unfortunately, Node::arithNodeFlags() wasn't actually masking off the irrelevant bits. + This worked prior to r140504 because CSE itself didn't mutate the flags, so there was a + very high probability that matching nodes would also have completely identical flag bits + (even the ones that aren't relevant to arithmetic behavior, like NodeDoesNotExit). But + r140504 moved one of CSE's side-tables (m_relevantToOSR) into a flag bit for quicker + access. These bits would be mutated as the CSE ran over a basic block, in such a way that + there was a very high probability that the possible replacement would already have the + bit set, while the redundant node did not have the bit set. Since Node::arithNodeFlags() + returned all of the bits, this would cause CSEPhase::pureCSE() to reject the match + almost every time. + + The solution is to make Node::arithNodeFlags() do as its name suggests: only return those + flags that are relevant to arithmetic behavior. This patch introduces a new mask that + represents those bits, and includes NodeBehaviorMask and NodeBackPropMask, which are both + used for queries on Node::arithNodeFlags(), and both affect arithmetic code gen. None of + the other flags are relevant to Node::arithNodeFlags() since they either correspond to + information already conveyed by the opcode (like NodeResultMask, NodeMustGenerate, + NodeHasVarArgs, NodeClobbersWorld, NodeMightClobber) or information that doesn't affect + the result that the node will produce or any of the queries performed on the result of + Node::arithNodeFlags (NodeDoesNotExit and of course NodeRelevantToOSR). + + This is a 10% speed-up on Kraken, undoing the regression from r140504. + + * dfg/DFGNode.h: + (JSC::DFG::Node::arithNodeFlags): + * dfg/DFGNodeFlags.h: + (DFG): + +2013-01-29 Mark Hahnenberg <mhahnenberg@apple.com> + + Structure::m_outOfLineCapacity is unnecessary + https://bugs.webkit.org/show_bug.cgi?id=108206 + + Reviewed by Geoffrey Garen. + + We can calculate our out of line capacity by using the outOfLineSize and our knowledge about our resize policy. + According to GDB, this knocks Structures down from 136 bytes to 128 bytes (I'm guessing the extra bytes are from + better alignment of object fields), which puts Structures in a smaller size class. Woohoo! Looks neutral on our + benchmarks. + + * runtime/Structure.cpp: + (JSC::Structure::Structure): + (JSC): + (JSC::Structure::suggestedNewOutOfLineStorageCapacity): + (JSC::Structure::addPropertyTransition): + (JSC::Structure::addPropertyWithoutTransition): + * runtime/Structure.h: + (Structure): + (JSC::Structure::outOfLineCapacity): + (JSC::Structure::totalStorageCapacity): + +2013-01-29 Geoffrey Garen <ggaren@apple.com> + + Be a little more conservative about emitting table-based switches + https://bugs.webkit.org/show_bug.cgi?id=108292 + + Reviewed by Filip Pizlo. + + Profiling shows we're using op_switch in cases where it's a regression. + + * bytecompiler/NodesCodegen.cpp: + (JSC): + (JSC::length): + (JSC::CaseBlockNode::tryTableSwitch): + (JSC::CaseBlockNode::emitBytecodeForBlock): + * parser/Nodes.h: + (CaseBlockNode): + +2013-01-29 Sheriff Bot <webkit.review.bot@gmail.com> + + Unreviewed, rolling out r140983. + http://trac.webkit.org/changeset/140983 + https://bugs.webkit.org/show_bug.cgi?id=108277 + + Unfortunately, this API has one last client (Requested by + abarth on #webkit). + + * Configurations/FeatureDefines.xcconfig: + +2013-01-29 Mark Hahnenberg <mhahnenberg@apple.com> + + Objective-C API: JSObjCClassInfo creates reference cycle with JSContext + https://bugs.webkit.org/show_bug.cgi?id=107839 + + Reviewed by Geoffrey Garen. + + Fixing several ASSERTs that were incorrect along with some of the reallocation of m_prototype and + m_constructor that they were based on. + + * API/JSWrapperMap.mm: + (-[JSObjCClassInfo allocateConstructorAndPrototypeWithSuperClassInfo:]): We now only allocate those + fields that are null (i.e. have been collected or have never been allocated to begin with). + (-[JSObjCClassInfo reallocateConstructorAndOrPrototype]): Renamed to better indicate that we're + reallocating one or both of the prototype/constructor combo. + (-[JSObjCClassInfo wrapperForObject:]): Call new reallocate function. + (-[JSObjCClassInfo constructor]): Ditto. + +2013-01-29 Geoffrey Garen <ggaren@apple.com> + + Make precise size classes more precise + https://bugs.webkit.org/show_bug.cgi?id=108270 + + Reviewed by Mark Hahnenberg. + + Size inference makes this profitable. + + I chose 8 byte increments because JSString is 24 bytes. Otherwise, 16 + byte increments might be better. + + * heap/Heap.h: + (Heap): Removed firstAllocatorWithoutDestructors because it's unused now. + + * heap/MarkedBlock.h: + (MarkedBlock): Updated constants. + + * heap/MarkedSpace.h: + (MarkedSpace): + (JSC): Also reduced the maximum precise size class because my testing + has shown that the smaller size classes are much more common. This + offsets some of the size class explosion caused by reducing the precise + increment. + + * llint/LLIntData.cpp: + (JSC::LLInt::Data::performAssertions): No need for this ASSERT anymore + because we don't rely on firstAllocatorWithoutDestructors anymore, since + we pick size classes dynamically now. + +2013-01-29 Oliver Hunt <oliver@apple.com> + + Add some hardening to methodTable() + https://bugs.webkit.org/show_bug.cgi?id=108253 + + Reviewed by Mark Hahnenberg. + + When accessing methodTable() we now always make sure that our + structure _could_ be valid. Added a separate method to get a + classes methodTable during destruction as it's not possible to + validate the structure at that point. This separation might + also make it possible to improve the performance of methodTable + access more generally in future. + + * heap/MarkedBlock.cpp: + (JSC::MarkedBlock::callDestructor): + * runtime/JSCell.h: + (JSCell): + * runtime/JSCellInlines.h: + (JSC::JSCell::methodTableForDestruction): + (JSC): + (JSC::JSCell::methodTable): + +2013-01-29 Filip Pizlo <fpizlo@apple.com> + + offlineasm BaseIndex handling is broken on ARM due to MIPS changes + https://bugs.webkit.org/show_bug.cgi?id=108261 + + Reviewed by Oliver Hunt. + + Backends shouldn't override each other's methods. That's not cool. + + * offlineasm/mips.rb: + +2013-01-29 Filip Pizlo <fpizlo@apple.com> + + cloop.rb shouldn't use a method called 'dump' for code generation + https://bugs.webkit.org/show_bug.cgi?id=108251 + + Reviewed by Mark Hahnenberg. + + Revert http://trac.webkit.org/changeset/141178 and rename 'dump' to 'clDump'. + + Also made trivial build fixes for !ENABLE(JIT). + + * offlineasm/cloop.rb: + * runtime/Executable.h: + (ExecutableBase): + (JSC::ExecutableBase::intrinsicFor): + * runtime/JSGlobalData.h: + +2013-01-29 Geoffrey Garen <ggaren@apple.com> + + Removed GGC because it has been disabled for a long time + https://bugs.webkit.org/show_bug.cgi?id=108245 + + Reviewed by Filip Pizlo. + + * GNUmakefile.list.am: + * JavaScriptCore.vcxproj/JavaScriptCore.vcxproj: + * JavaScriptCore.vcxproj/JavaScriptCore.vcxproj.filters: + * JavaScriptCore.xcodeproj/project.pbxproj: + * dfg/DFGRepatch.cpp: + (JSC::DFG::emitPutReplaceStub): + (JSC::DFG::emitPutTransitionStub): + * dfg/DFGSpeculativeJIT.cpp: + (JSC::DFG::SpeculativeJIT::writeBarrier): + * dfg/DFGSpeculativeJIT.h: + (SpeculativeJIT): + * dfg/DFGSpeculativeJIT32_64.cpp: + (JSC::DFG::SpeculativeJIT::compile): + * dfg/DFGSpeculativeJIT64.cpp: + (JSC::DFG::SpeculativeJIT::compile): + * heap/CardSet.h: Removed. + * heap/Heap.cpp: + (JSC::Heap::markRoots): + (JSC::Heap::collect): + * heap/Heap.h: + (Heap): + (JSC::Heap::shouldCollect): + (JSC::Heap::isWriteBarrierEnabled): + (JSC): + (JSC::Heap::writeBarrier): + * heap/MarkedBlock.h: + (MarkedBlock): + (JSC): + * heap/MarkedSpace.cpp: + (JSC): + * jit/JITPropertyAccess.cpp: + (JSC::JIT::emitWriteBarrier): + +2013-01-29 Filip Pizlo <fpizlo@apple.com> + + Remove redundant AST dump method from cloop.rb, since they are already defined in ast.rb + https://bugs.webkit.org/show_bug.cgi?id=108247 + + Reviewed by Oliver Hunt. + + Makes offlineasm dumping easier to read and less likely to cause assertion failures. + Also fixes the strange situation where cloop.rb and ast.rb both defined dump methods, + but cloop.rb was winning. + + * offlineasm/cloop.rb: + +2013-01-29 Mark Hahnenberg <mhahnenberg@apple.com> + + Objective-C API: JSObjCClassInfo creates reference cycle with JSContext + https://bugs.webkit.org/show_bug.cgi?id=107839 + + Reviewed by Oliver Hunt. + + JSContext has a JSWrapperMap, which has an NSMutableDictionary m_classMap, which has values that + are JSObjCClassInfo objects, which have strong references to two JSValue *'s, m_prototype and + m_constructor, which in turn have strong references to the JSContext, creating a reference cycle. + We should make m_prototype and m_constructor Weak<JSObject>. This gets rid of the strong reference + to the JSContext and also prevents clients from accidentally creating reference cycles by assigning + to the prototype of the constructor. If Weak<JSObject> fields are ever garbage collected, we will + reallocate them. + + * API/JSContext.mm: + (-[JSContext wrapperMap]): + * API/JSContextInternal.h: + * API/JSWrapperMap.mm: + (-[JSObjCClassInfo initWithContext:forClass:superClassInfo:]): + (-[JSObjCClassInfo dealloc]): + (-[JSObjCClassInfo allocateConstructorAndPrototypeWithSuperClassInfo:]): + (-[JSObjCClassInfo allocateConstructorAndPrototype]): + (-[JSObjCClassInfo wrapperForObject:]): + (-[JSObjCClassInfo constructor]): + +2013-01-29 Oliver Hunt <oliver@apple.com> + + REGRESSION (r140594): RELEASE_ASSERT_NOT_REACHED in JSC::Interpreter::execute + https://bugs.webkit.org/show_bug.cgi?id=108097 + + Reviewed by Geoffrey Garen. + + LiteralParser was accepting a bogus 'var a.b = c' statement + + * runtime/LiteralParser.cpp: + (JSC::::tryJSONPParse): + +2013-01-29 Oliver Hunt <oliver@apple.com> + + Force debug builds to do bounds checks on contiguous property storage + https://bugs.webkit.org/show_bug.cgi?id=108212 + + Reviewed by Mark Hahnenberg. + + Add a ContiguousData type that we use to represent contiguous property + storage. In release builds it is simply a pointer to the correct type, + but in debug builds it also carries the data length and performs bounds + checks. This means we don't have to add as many manual bounds assertions + when performing operations over contiguous data. + + * dfg/DFGOperations.cpp: + * runtime/ArrayStorage.h: + (ArrayStorage): + (JSC::ArrayStorage::vector): + * runtime/Butterfly.h: + (JSC::ContiguousData::ContiguousData): + (ContiguousData): + (JSC::ContiguousData::operator[]): + (JSC::ContiguousData::data): + (JSC::ContiguousData::length): + (JSC): + (JSC::Butterfly::contiguousInt32): + (Butterfly): + (JSC::Butterfly::contiguousDouble): + (JSC::Butterfly::contiguous): + * runtime/JSArray.cpp: + (JSC::JSArray::sortNumericVector): + (ContiguousTypeAccessor): + (JSC::ContiguousTypeAccessor::getAsValue): + (JSC::ContiguousTypeAccessor::setWithValue): + (JSC::ContiguousTypeAccessor::replaceDataReference): + (JSC): + (JSC::JSArray::sortCompactedVector): + (JSC::JSArray::sort): + (JSC::JSArray::fillArgList): + (JSC::JSArray::copyToArguments): + * runtime/JSArray.h: + (JSArray): + * runtime/JSObject.cpp: + (JSC::JSObject::copyButterfly): + (JSC::JSObject::visitButterfly): + (JSC::JSObject::createInitialInt32): + (JSC::JSObject::createInitialDouble): + (JSC::JSObject::createInitialContiguous): + (JSC::JSObject::convertUndecidedToInt32): + (JSC::JSObject::convertUndecidedToDouble): + (JSC::JSObject::convertUndecidedToContiguous): + (JSC::JSObject::convertInt32ToDouble): + (JSC::JSObject::convertInt32ToContiguous): + (JSC::JSObject::genericConvertDoubleToContiguous): + (JSC::JSObject::convertDoubleToContiguous): + (JSC::JSObject::rageConvertDoubleToContiguous): + (JSC::JSObject::ensureInt32Slow): + (JSC::JSObject::ensureDoubleSlow): + (JSC::JSObject::ensureContiguousSlow): + (JSC::JSObject::rageEnsureContiguousSlow): + (JSC::JSObject::ensureLengthSlow): + * runtime/JSObject.h: + (JSC::JSObject::ensureInt32): + (JSC::JSObject::ensureDouble): + (JSC::JSObject::ensureContiguous): + (JSC::JSObject::rageEnsureContiguous): + (JSObject): + (JSC::JSObject::indexingData): + (JSC::JSObject::currentIndexingData): + +2013-01-29 Brent Fulgham <bfulgham@webkit.org> + + [Windows, WinCairo] Unreviewed build fix after r141050 + + * JavaScriptCore.vcxproj/JavaScriptCoreExports.def: Update symbols + to match JavaScriptCore.vcproj version. + +2013-01-29 Allan Sandfeld Jensen <allan.jensen@digia.com> + + [Qt] Implement GCActivityCallback + https://bugs.webkit.org/show_bug.cgi?id=103998 + + Reviewed by Simon Hausmann. + + Implements the activity triggered garbage collector. + + * runtime/GCActivityCallback.cpp: + (JSC::DefaultGCActivityCallback::DefaultGCActivityCallback): + (JSC::DefaultGCActivityCallback::scheduleTimer): + (JSC::DefaultGCActivityCallback::cancelTimer): + * runtime/GCActivityCallback.h: + (GCActivityCallback): + (DefaultGCActivityCallback): + +2013-01-29 Mikhail Pozdnyakov <mikhail.pozdnyakov@intel.com> + + Compilation warning in JSC + https://bugs.webkit.org/show_bug.cgi?id=108178 + + Reviewed by Kentaro Hara. + + Fixed 'comparison between signed and unsigned integer' warning in JSC::Structure constructor. + + * runtime/Structure.cpp: + (JSC::Structure::Structure): + +2013-01-29 Jocelyn Turcotte <jocelyn.turcotte@digia.com> + + [Qt] Fix the JSC build on Mac + + Unreviewed, build fix. + + * heap/HeapTimer.h: + Qt on Mac has USE(CF) true, and should use the CF HeapTimer in that case. + +2013-01-29 Allan Sandfeld Jensen <allan.jensen@digia.com> + + [Qt] Implement IncrementalSweeper and HeapTimer + https://bugs.webkit.org/show_bug.cgi?id=103996 + + Reviewed by Simon Hausmann. + + Implements the incremental sweeping garbage collection for the Qt platform. + + * heap/HeapTimer.cpp: + (JSC::HeapTimer::HeapTimer): + (JSC::HeapTimer::~HeapTimer): + (JSC::HeapTimer::timerEvent): + (JSC::HeapTimer::synchronize): + (JSC::HeapTimer::invalidate): + (JSC::HeapTimer::didStartVMShutdown): + * heap/HeapTimer.h: + (HeapTimer): + * heap/IncrementalSweeper.cpp: + (JSC::IncrementalSweeper::IncrementalSweeper): + (JSC::IncrementalSweeper::scheduleTimer): + * heap/IncrementalSweeper.h: + (IncrementalSweeper): + +2013-01-28 Filip Pizlo <fpizlo@apple.com> + + DFG should not use a graph that is a vector, Nodes shouldn't move after allocation, and we should always refer to nodes by Node* + https://bugs.webkit.org/show_bug.cgi?id=106868 + + Reviewed by Oliver Hunt. + + This adds a pool allocator for Nodes, and uses that instead of a Vector. Changes all + uses of Node& and NodeIndex to be simply Node*. Nodes no longer have an index except + for debugging (Node::index(), which is not guaranteed to be O(1)). + + 1% speed-up on SunSpider, presumably because this improves compile times. + + * CMakeLists.txt: + * GNUmakefile.list.am: + * JavaScriptCore.xcodeproj/project.pbxproj: + * Target.pri: + * bytecode/DataFormat.h: + (JSC::dataFormatToString): + * dfg/DFGAbstractState.cpp: + (JSC::DFG::AbstractState::initialize): + (JSC::DFG::AbstractState::booleanResult): + (JSC::DFG::AbstractState::execute): + (JSC::DFG::AbstractState::mergeStateAtTail): + (JSC::DFG::AbstractState::mergeToSuccessors): + (JSC::DFG::AbstractState::mergeVariableBetweenBlocks): + (JSC::DFG::AbstractState::dump): + * dfg/DFGAbstractState.h: + (DFG): + (JSC::DFG::AbstractState::forNode): + (AbstractState): + (JSC::DFG::AbstractState::speculateInt32Unary): + (JSC::DFG::AbstractState::speculateNumberUnary): + (JSC::DFG::AbstractState::speculateBooleanUnary): + (JSC::DFG::AbstractState::speculateInt32Binary): + (JSC::DFG::AbstractState::speculateNumberBinary): + (JSC::DFG::AbstractState::trySetConstant): + * dfg/DFGAbstractValue.h: + (AbstractValue): + * dfg/DFGAdjacencyList.h: + (JSC::DFG::AdjacencyList::AdjacencyList): + (JSC::DFG::AdjacencyList::initialize): + * dfg/DFGAllocator.h: Added. + (DFG): + (Allocator): + (JSC::DFG::Allocator::Region::size): + (JSC::DFG::Allocator::Region::headerSize): + (JSC::DFG::Allocator::Region::numberOfThingsPerRegion): + (JSC::DFG::Allocator::Region::data): + (JSC::DFG::Allocator::Region::isInThisRegion): + (JSC::DFG::Allocator::Region::regionFor): + (Region): + (JSC::DFG::::Allocator): + (JSC::DFG::::~Allocator): + (JSC::DFG::::allocate): + (JSC::DFG::::free): + (JSC::DFG::::freeAll): + (JSC::DFG::::reset): + (JSC::DFG::::indexOf): + (JSC::DFG::::allocatorOf): + (JSC::DFG::::bumpAllocate): + (JSC::DFG::::freeListAllocate): + (JSC::DFG::::allocateSlow): + (JSC::DFG::::freeRegionsStartingAt): + (JSC::DFG::::startBumpingIn): + * dfg/DFGArgumentsSimplificationPhase.cpp: + (JSC::DFG::ArgumentsSimplificationPhase::run): + (JSC::DFG::ArgumentsSimplificationPhase::observeBadArgumentsUse): + (JSC::DFG::ArgumentsSimplificationPhase::observeBadArgumentsUses): + (JSC::DFG::ArgumentsSimplificationPhase::observeProperArgumentsUse): + (JSC::DFG::ArgumentsSimplificationPhase::isOKToOptimize): + (JSC::DFG::ArgumentsSimplificationPhase::removeArgumentsReferencingPhantomChild): + * dfg/DFGArrayMode.cpp: + (JSC::DFG::ArrayMode::originalArrayStructure): + (JSC::DFG::ArrayMode::alreadyChecked): + * dfg/DFGArrayMode.h: + (ArrayMode): + * dfg/DFGArrayifySlowPathGenerator.h: + (JSC::DFG::ArrayifySlowPathGenerator::ArrayifySlowPathGenerator): + * dfg/DFGBasicBlock.h: + (JSC::DFG::BasicBlock::node): + (JSC::DFG::BasicBlock::isInPhis): + (JSC::DFG::BasicBlock::isInBlock): + (BasicBlock): + * dfg/DFGBasicBlockInlines.h: + (DFG): + * dfg/DFGByteCodeParser.cpp: + (ByteCodeParser): + (JSC::DFG::ByteCodeParser::getDirect): + (JSC::DFG::ByteCodeParser::get): + (JSC::DFG::ByteCodeParser::setDirect): + (JSC::DFG::ByteCodeParser::set): + (JSC::DFG::ByteCodeParser::setPair): + (JSC::DFG::ByteCodeParser::injectLazyOperandSpeculation): + (JSC::DFG::ByteCodeParser::getLocal): + (JSC::DFG::ByteCodeParser::setLocal): + (JSC::DFG::ByteCodeParser::getArgument): + (JSC::DFG::ByteCodeParser::setArgument): + (JSC::DFG::ByteCodeParser::flushDirect): + (JSC::DFG::ByteCodeParser::getToInt32): + (JSC::DFG::ByteCodeParser::toInt32): + (JSC::DFG::ByteCodeParser::getJSConstantForValue): + (JSC::DFG::ByteCodeParser::getJSConstant): + (JSC::DFG::ByteCodeParser::getCallee): + (JSC::DFG::ByteCodeParser::getThis): + (JSC::DFG::ByteCodeParser::setThis): + (JSC::DFG::ByteCodeParser::isJSConstant): + (JSC::DFG::ByteCodeParser::isInt32Constant): + (JSC::DFG::ByteCodeParser::valueOfJSConstant): + (JSC::DFG::ByteCodeParser::valueOfInt32Constant): + (JSC::DFG::ByteCodeParser::constantUndefined): + (JSC::DFG::ByteCodeParser::constantNull): + (JSC::DFG::ByteCodeParser::one): + (JSC::DFG::ByteCodeParser::constantNaN): + (JSC::DFG::ByteCodeParser::cellConstant): + (JSC::DFG::ByteCodeParser::addToGraph): + (JSC::DFG::ByteCodeParser::insertPhiNode): + (JSC::DFG::ByteCodeParser::addVarArgChild): + (JSC::DFG::ByteCodeParser::addCall): + (JSC::DFG::ByteCodeParser::addStructureTransitionCheck): + (JSC::DFG::ByteCodeParser::getPredictionWithoutOSRExit): + (JSC::DFG::ByteCodeParser::getPrediction): + (JSC::DFG::ByteCodeParser::getArrayModeAndEmitChecks): + (JSC::DFG::ByteCodeParser::makeSafe): + (JSC::DFG::ByteCodeParser::makeDivSafe): + (JSC::DFG::ByteCodeParser::ConstantRecord::ConstantRecord): + (ConstantRecord): + (JSC::DFG::ByteCodeParser::PhiStackEntry::PhiStackEntry): + (PhiStackEntry): + (JSC::DFG::ByteCodeParser::handleCall): + (JSC::DFG::ByteCodeParser::emitFunctionChecks): + (JSC::DFG::ByteCodeParser::handleInlining): + (JSC::DFG::ByteCodeParser::setIntrinsicResult): + (JSC::DFG::ByteCodeParser::handleMinMax): + (JSC::DFG::ByteCodeParser::handleIntrinsic): + (JSC::DFG::ByteCodeParser::handleGetByOffset): + (JSC::DFG::ByteCodeParser::handleGetById): + (JSC::DFG::ByteCodeParser::getScope): + (JSC::DFG::ByteCodeParser::parseResolveOperations): + (JSC::DFG::ByteCodeParser::parseBlock): + (JSC::DFG::ByteCodeParser::processPhiStack): + (JSC::DFG::ByteCodeParser::linkBlock): + (JSC::DFG::ByteCodeParser::parseCodeBlock): + (JSC::DFG::ByteCodeParser::parse): + * dfg/DFGCFAPhase.cpp: + (JSC::DFG::CFAPhase::performBlockCFA): + * dfg/DFGCFGSimplificationPhase.cpp: + (JSC::DFG::CFGSimplificationPhase::run): + (JSC::DFG::CFGSimplificationPhase::keepOperandAlive): + (JSC::DFG::CFGSimplificationPhase::fixPossibleGetLocal): + (JSC::DFG::CFGSimplificationPhase::fixPhis): + (JSC::DFG::CFGSimplificationPhase::removePotentiallyDeadPhiReference): + (JSC::DFG::CFGSimplificationPhase::OperandSubstitution::OperandSubstitution): + (JSC::DFG::CFGSimplificationPhase::OperandSubstitution::dump): + (OperandSubstitution): + (JSC::DFG::CFGSimplificationPhase::skipGetLocal): + (JSC::DFG::CFGSimplificationPhase::recordNewTarget): + (JSC::DFG::CFGSimplificationPhase::fixTailOperand): + (JSC::DFG::CFGSimplificationPhase::mergeBlocks): + * dfg/DFGCSEPhase.cpp: + (JSC::DFG::CSEPhase::canonicalize): + (JSC::DFG::CSEPhase::endIndexForPureCSE): + (JSC::DFG::CSEPhase::pureCSE): + (JSC::DFG::CSEPhase::constantCSE): + (JSC::DFG::CSEPhase::weakConstantCSE): + (JSC::DFG::CSEPhase::getCalleeLoadElimination): + (JSC::DFG::CSEPhase::getArrayLengthElimination): + (JSC::DFG::CSEPhase::globalVarLoadElimination): + (JSC::DFG::CSEPhase::scopedVarLoadElimination): + (JSC::DFG::CSEPhase::globalVarWatchpointElimination): + (JSC::DFG::CSEPhase::globalVarStoreElimination): + (JSC::DFG::CSEPhase::scopedVarStoreElimination): + (JSC::DFG::CSEPhase::getByValLoadElimination): + (JSC::DFG::CSEPhase::checkFunctionElimination): + (JSC::DFG::CSEPhase::checkExecutableElimination): + (JSC::DFG::CSEPhase::checkStructureElimination): + (JSC::DFG::CSEPhase::structureTransitionWatchpointElimination): + (JSC::DFG::CSEPhase::putStructureStoreElimination): + (JSC::DFG::CSEPhase::getByOffsetLoadElimination): + (JSC::DFG::CSEPhase::putByOffsetStoreElimination): + (JSC::DFG::CSEPhase::getPropertyStorageLoadElimination): + (JSC::DFG::CSEPhase::checkArrayElimination): + (JSC::DFG::CSEPhase::getIndexedPropertyStorageLoadElimination): + (JSC::DFG::CSEPhase::getMyScopeLoadElimination): + (JSC::DFG::CSEPhase::getLocalLoadElimination): + (JSC::DFG::CSEPhase::setLocalStoreElimination): + (JSC::DFG::CSEPhase::performSubstitution): + (JSC::DFG::CSEPhase::eliminateIrrelevantPhantomChildren): + (JSC::DFG::CSEPhase::setReplacement): + (JSC::DFG::CSEPhase::eliminate): + (JSC::DFG::CSEPhase::performNodeCSE): + (JSC::DFG::CSEPhase::performBlockCSE): + (CSEPhase): + * dfg/DFGCommon.cpp: Added. + (DFG): + (JSC::DFG::NodePointerTraits::dump): + * dfg/DFGCommon.h: + (DFG): + (JSC::DFG::NodePointerTraits::defaultValue): + (NodePointerTraits): + (JSC::DFG::verboseCompilationEnabled): + (JSC::DFG::shouldDumpGraphAtEachPhase): + (JSC::DFG::validationEnabled): + * dfg/DFGConstantFoldingPhase.cpp: + (JSC::DFG::ConstantFoldingPhase::foldConstants): + (JSC::DFG::ConstantFoldingPhase::isCapturedAtOrAfter): + (JSC::DFG::ConstantFoldingPhase::addStructureTransitionCheck): + (JSC::DFG::ConstantFoldingPhase::paintUnreachableCode): + * dfg/DFGDisassembler.cpp: + (JSC::DFG::Disassembler::Disassembler): + (JSC::DFG::Disassembler::createDumpList): + (JSC::DFG::Disassembler::dumpDisassembly): + * dfg/DFGDisassembler.h: + (JSC::DFG::Disassembler::setForNode): + (Disassembler): + * dfg/DFGDriver.cpp: + (JSC::DFG::compile): + * dfg/DFGEdge.cpp: Added. + (DFG): + (JSC::DFG::Edge::dump): + * dfg/DFGEdge.h: + (JSC::DFG::Edge::Edge): + (JSC::DFG::Edge::node): + (JSC::DFG::Edge::operator*): + (JSC::DFG::Edge::operator->): + (Edge): + (JSC::DFG::Edge::setNode): + (JSC::DFG::Edge::useKind): + (JSC::DFG::Edge::setUseKind): + (JSC::DFG::Edge::isSet): + (JSC::DFG::Edge::shift): + (JSC::DFG::Edge::makeWord): + (JSC::DFG::operator==): + (JSC::DFG::operator!=): + * dfg/DFGFixupPhase.cpp: + (JSC::DFG::FixupPhase::fixupBlock): + (JSC::DFG::FixupPhase::fixupNode): + (JSC::DFG::FixupPhase::checkArray): + (JSC::DFG::FixupPhase::blessArrayOperation): + (JSC::DFG::FixupPhase::fixIntEdge): + (JSC::DFG::FixupPhase::fixDoubleEdge): + (JSC::DFG::FixupPhase::injectInt32ToDoubleNode): + (FixupPhase): + * 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::node): + (JSC::DFG::GenerationInfo::noticeOSRBirth): + (JSC::DFG::GenerationInfo::use): + (JSC::DFG::GenerationInfo::appendFill): + (JSC::DFG::GenerationInfo::appendSpill): + * dfg/DFGGraph.cpp: + (JSC::DFG::Graph::Graph): + (JSC::DFG::Graph::~Graph): + (DFG): + (JSC::DFG::Graph::dumpCodeOrigin): + (JSC::DFG::Graph::amountOfNodeWhiteSpace): + (JSC::DFG::Graph::printNodeWhiteSpace): + (JSC::DFG::Graph::dump): + (JSC::DFG::Graph::dumpBlockHeader): + (JSC::DFG::Graph::refChildren): + (JSC::DFG::Graph::derefChildren): + (JSC::DFG::Graph::predictArgumentTypes): + (JSC::DFG::Graph::collectGarbage): + (JSC::DFG::Graph::determineReachability): + (JSC::DFG::Graph::resetExitStates): + * dfg/DFGGraph.h: + (Graph): + (JSC::DFG::Graph::ref): + (JSC::DFG::Graph::deref): + (JSC::DFG::Graph::changeChild): + (JSC::DFG::Graph::compareAndSwap): + (JSC::DFG::Graph::clearAndDerefChild): + (JSC::DFG::Graph::clearAndDerefChild1): + (JSC::DFG::Graph::clearAndDerefChild2): + (JSC::DFG::Graph::clearAndDerefChild3): + (JSC::DFG::Graph::convertToConstant): + (JSC::DFG::Graph::getJSConstantSpeculation): + (JSC::DFG::Graph::addSpeculationMode): + (JSC::DFG::Graph::valueAddSpeculationMode): + (JSC::DFG::Graph::arithAddSpeculationMode): + (JSC::DFG::Graph::addShouldSpeculateInteger): + (JSC::DFG::Graph::mulShouldSpeculateInteger): + (JSC::DFG::Graph::negateShouldSpeculateInteger): + (JSC::DFG::Graph::isConstant): + (JSC::DFG::Graph::isJSConstant): + (JSC::DFG::Graph::isInt32Constant): + (JSC::DFG::Graph::isDoubleConstant): + (JSC::DFG::Graph::isNumberConstant): + (JSC::DFG::Graph::isBooleanConstant): + (JSC::DFG::Graph::isCellConstant): + (JSC::DFG::Graph::isFunctionConstant): + (JSC::DFG::Graph::isInternalFunctionConstant): + (JSC::DFG::Graph::valueOfJSConstant): + (JSC::DFG::Graph::valueOfInt32Constant): + (JSC::DFG::Graph::valueOfNumberConstant): + (JSC::DFG::Graph::valueOfBooleanConstant): + (JSC::DFG::Graph::valueOfFunctionConstant): + (JSC::DFG::Graph::valueProfileFor): + (JSC::DFG::Graph::methodOfGettingAValueProfileFor): + (JSC::DFG::Graph::numSuccessors): + (JSC::DFG::Graph::successor): + (JSC::DFG::Graph::successorForCondition): + (JSC::DFG::Graph::isPredictedNumerical): + (JSC::DFG::Graph::byValIsPure): + (JSC::DFG::Graph::clobbersWorld): + (JSC::DFG::Graph::varArgNumChildren): + (JSC::DFG::Graph::numChildren): + (JSC::DFG::Graph::varArgChild): + (JSC::DFG::Graph::child): + (JSC::DFG::Graph::voteNode): + (JSC::DFG::Graph::voteChildren): + (JSC::DFG::Graph::substitute): + (JSC::DFG::Graph::substituteGetLocal): + (JSC::DFG::Graph::addImmediateShouldSpeculateInteger): + (JSC::DFG::Graph::mulImmediateShouldSpeculateInteger): + * dfg/DFGInsertionSet.h: + (JSC::DFG::Insertion::Insertion): + (JSC::DFG::Insertion::element): + (Insertion): + (JSC::DFG::InsertionSet::insert): + (InsertionSet): + * dfg/DFGJITCompiler.cpp: + * dfg/DFGJITCompiler.h: + (JSC::DFG::JITCompiler::setForNode): + (JSC::DFG::JITCompiler::addressOfDoubleConstant): + (JSC::DFG::JITCompiler::noticeOSREntry): + * dfg/DFGLongLivedState.cpp: Added. + (DFG): + (JSC::DFG::LongLivedState::LongLivedState): + (JSC::DFG::LongLivedState::~LongLivedState): + (JSC::DFG::LongLivedState::shrinkToFit): + * dfg/DFGLongLivedState.h: Added. + (DFG): + (LongLivedState): + * dfg/DFGMinifiedID.h: + (JSC::DFG::MinifiedID::MinifiedID): + (JSC::DFG::MinifiedID::node): + * dfg/DFGMinifiedNode.cpp: + (JSC::DFG::MinifiedNode::fromNode): + * dfg/DFGMinifiedNode.h: + (MinifiedNode): + * dfg/DFGNode.cpp: Added. + (DFG): + (JSC::DFG::Node::index): + (WTF): + (WTF::printInternal): + * dfg/DFGNode.h: + (DFG): + (JSC::DFG::Node::Node): + (Node): + (JSC::DFG::Node::convertToGetByOffset): + (JSC::DFG::Node::convertToPutByOffset): + (JSC::DFG::Node::ref): + (JSC::DFG::Node::shouldSpeculateInteger): + (JSC::DFG::Node::shouldSpeculateIntegerForArithmetic): + (JSC::DFG::Node::shouldSpeculateIntegerExpectingDefined): + (JSC::DFG::Node::shouldSpeculateDoubleForArithmetic): + (JSC::DFG::Node::shouldSpeculateNumber): + (JSC::DFG::Node::shouldSpeculateNumberExpectingDefined): + (JSC::DFG::Node::shouldSpeculateFinalObject): + (JSC::DFG::Node::shouldSpeculateArray): + (JSC::DFG::Node::dumpChildren): + (WTF): + * dfg/DFGNodeAllocator.h: Added. + (DFG): + (operator new ): + * dfg/DFGOSRExit.cpp: + (JSC::DFG::OSRExit::OSRExit): + * dfg/DFGOSRExit.h: + (OSRExit): + (SpeculationFailureDebugInfo): + * dfg/DFGOSRExitCompiler.cpp: + * dfg/DFGOSRExitCompiler32_64.cpp: + (JSC::DFG::OSRExitCompiler::compileExit): + * dfg/DFGOSRExitCompiler64.cpp: + (JSC::DFG::OSRExitCompiler::compileExit): + * dfg/DFGOperations.cpp: + * dfg/DFGPhase.cpp: + (DFG): + (JSC::DFG::Phase::beginPhase): + (JSC::DFG::Phase::endPhase): + * dfg/DFGPhase.h: + (Phase): + (JSC::DFG::runAndLog): + * dfg/DFGPredictionPropagationPhase.cpp: + (JSC::DFG::PredictionPropagationPhase::setPrediction): + (JSC::DFG::PredictionPropagationPhase::mergePrediction): + (JSC::DFG::PredictionPropagationPhase::isNotNegZero): + (JSC::DFG::PredictionPropagationPhase::isNotZero): + (JSC::DFG::PredictionPropagationPhase::isWithinPowerOfTwoForConstant): + (JSC::DFG::PredictionPropagationPhase::isWithinPowerOfTwoNonRecursive): + (JSC::DFG::PredictionPropagationPhase::isWithinPowerOfTwo): + (JSC::DFG::PredictionPropagationPhase::propagate): + (JSC::DFG::PredictionPropagationPhase::mergeDefaultFlags): + (JSC::DFG::PredictionPropagationPhase::propagateForward): + (JSC::DFG::PredictionPropagationPhase::propagateBackward): + (JSC::DFG::PredictionPropagationPhase::doDoubleVoting): + (PredictionPropagationPhase): + (JSC::DFG::PredictionPropagationPhase::doRoundOfDoubleVoting): + * dfg/DFGScoreBoard.h: + (JSC::DFG::ScoreBoard::ScoreBoard): + (JSC::DFG::ScoreBoard::use): + (JSC::DFG::ScoreBoard::useIfHasResult): + (ScoreBoard): + * dfg/DFGSilentRegisterSavePlan.h: + (JSC::DFG::SilentRegisterSavePlan::SilentRegisterSavePlan): + (JSC::DFG::SilentRegisterSavePlan::node): + (SilentRegisterSavePlan): + * dfg/DFGSlowPathGenerator.h: + (JSC::DFG::SlowPathGenerator::SlowPathGenerator): + (JSC::DFG::SlowPathGenerator::generate): + (SlowPathGenerator): + * dfg/DFGSpeculativeJIT.cpp: + (JSC::DFG::SpeculativeJIT::SpeculativeJIT): + (JSC::DFG::SpeculativeJIT::speculationCheck): + (JSC::DFG::SpeculativeJIT::speculationWatchpoint): + (JSC::DFG::SpeculativeJIT::convertLastOSRExitToForward): + (JSC::DFG::SpeculativeJIT::forwardSpeculationCheck): + (JSC::DFG::SpeculativeJIT::terminateSpeculativeExecution): + (JSC::DFG::SpeculativeJIT::silentSavePlanForGPR): + (JSC::DFG::SpeculativeJIT::silentSavePlanForFPR): + (JSC::DFG::SpeculativeJIT::silentSpill): + (JSC::DFG::SpeculativeJIT::silentFill): + (JSC::DFG::SpeculativeJIT::checkArray): + (JSC::DFG::SpeculativeJIT::arrayify): + (JSC::DFG::SpeculativeJIT::fillStorage): + (JSC::DFG::SpeculativeJIT::useChildren): + (JSC::DFG::SpeculativeJIT::isStrictInt32): + (JSC::DFG::SpeculativeJIT::isKnownInteger): + (JSC::DFG::SpeculativeJIT::isKnownNumeric): + (JSC::DFG::SpeculativeJIT::isKnownCell): + (JSC::DFG::SpeculativeJIT::isKnownNotCell): + (JSC::DFG::SpeculativeJIT::isKnownNotInteger): + (JSC::DFG::SpeculativeJIT::isKnownNotNumber): + (JSC::DFG::SpeculativeJIT::writeBarrier): + (JSC::DFG::SpeculativeJIT::nonSpeculativeCompare): + (JSC::DFG::SpeculativeJIT::nonSpeculativeStrictEq): + (JSC::DFG::GPRTemporary::GPRTemporary): + (JSC::DFG::FPRTemporary::FPRTemporary): + (JSC::DFG::SpeculativeJIT::compilePeepHoleDoubleBranch): + (JSC::DFG::SpeculativeJIT::compilePeepHoleObjectEquality): + (JSC::DFG::SpeculativeJIT::compilePeepHoleIntegerBranch): + (JSC::DFG::SpeculativeJIT::compilePeepHoleBranch): + (JSC::DFG::SpeculativeJIT::noticeOSRBirth): + (JSC::DFG::SpeculativeJIT::compileMovHint): + (JSC::DFG::SpeculativeJIT::compile): + (JSC::DFG::SpeculativeJIT::checkArgumentTypes): + (JSC::DFG::SpeculativeJIT::computeValueRecoveryFor): + (JSC::DFG::SpeculativeJIT::compileDoublePutByVal): + (JSC::DFG::SpeculativeJIT::compileGetCharCodeAt): + (JSC::DFG::SpeculativeJIT::compileGetByValOnString): + (JSC::DFG::SpeculativeJIT::checkGeneratedTypeForToInt32): + (JSC::DFG::SpeculativeJIT::compileValueToInt32): + (JSC::DFG::SpeculativeJIT::compileUInt32ToNumber): + (JSC::DFG::SpeculativeJIT::compileDoubleAsInt32): + (JSC::DFG::SpeculativeJIT::compileInt32ToDouble): + (JSC::DFG::SpeculativeJIT::compileGetByValOnIntTypedArray): + (JSC::DFG::SpeculativeJIT::compilePutByValForIntTypedArray): + (JSC::DFG::SpeculativeJIT::compileGetByValOnFloatTypedArray): + (JSC::DFG::SpeculativeJIT::compilePutByValForFloatTypedArray): + (JSC::DFG::SpeculativeJIT::compileInstanceOfForObject): + (JSC::DFG::SpeculativeJIT::compileInstanceOf): + (JSC::DFG::SpeculativeJIT::compileSoftModulo): + (JSC::DFG::SpeculativeJIT::compileAdd): + (JSC::DFG::SpeculativeJIT::compileArithSub): + (JSC::DFG::SpeculativeJIT::compileArithNegate): + (JSC::DFG::SpeculativeJIT::compileArithMul): + (JSC::DFG::SpeculativeJIT::compileIntegerArithDivForX86): + (JSC::DFG::SpeculativeJIT::compileArithMod): + (JSC::DFG::SpeculativeJIT::compare): + (JSC::DFG::SpeculativeJIT::compileStrictEqForConstant): + (JSC::DFG::SpeculativeJIT::compileStrictEq): + (JSC::DFG::SpeculativeJIT::compileGetIndexedPropertyStorage): + (JSC::DFG::SpeculativeJIT::compileGetByValOnArguments): + (JSC::DFG::SpeculativeJIT::compileGetArgumentsLength): + (JSC::DFG::SpeculativeJIT::compileGetArrayLength): + (JSC::DFG::SpeculativeJIT::compileNewFunctionNoCheck): + (JSC::DFG::SpeculativeJIT::compileNewFunctionExpression): + (JSC::DFG::SpeculativeJIT::compileRegExpExec): + (JSC::DFG::SpeculativeJIT::compileAllocatePropertyStorage): + (JSC::DFG::SpeculativeJIT::compileReallocatePropertyStorage): + * dfg/DFGSpeculativeJIT.h: + (SpeculativeJIT): + (JSC::DFG::SpeculativeJIT::canReuse): + (JSC::DFG::SpeculativeJIT::isFilled): + (JSC::DFG::SpeculativeJIT::isFilledDouble): + (JSC::DFG::SpeculativeJIT::use): + (JSC::DFG::SpeculativeJIT::isConstant): + (JSC::DFG::SpeculativeJIT::isJSConstant): + (JSC::DFG::SpeculativeJIT::isInt32Constant): + (JSC::DFG::SpeculativeJIT::isDoubleConstant): + (JSC::DFG::SpeculativeJIT::isNumberConstant): + (JSC::DFG::SpeculativeJIT::isBooleanConstant): + (JSC::DFG::SpeculativeJIT::isFunctionConstant): + (JSC::DFG::SpeculativeJIT::valueOfInt32Constant): + (JSC::DFG::SpeculativeJIT::valueOfNumberConstant): + (JSC::DFG::SpeculativeJIT::valueOfNumberConstantAsInt32): + (JSC::DFG::SpeculativeJIT::addressOfDoubleConstant): + (JSC::DFG::SpeculativeJIT::valueOfJSConstant): + (JSC::DFG::SpeculativeJIT::valueOfBooleanConstant): + (JSC::DFG::SpeculativeJIT::valueOfFunctionConstant): + (JSC::DFG::SpeculativeJIT::isNullConstant): + (JSC::DFG::SpeculativeJIT::valueOfJSConstantAsImm64): + (JSC::DFG::SpeculativeJIT::detectPeepHoleBranch): + (JSC::DFG::SpeculativeJIT::integerResult): + (JSC::DFG::SpeculativeJIT::noResult): + (JSC::DFG::SpeculativeJIT::cellResult): + (JSC::DFG::SpeculativeJIT::booleanResult): + (JSC::DFG::SpeculativeJIT::jsValueResult): + (JSC::DFG::SpeculativeJIT::storageResult): + (JSC::DFG::SpeculativeJIT::doubleResult): + (JSC::DFG::SpeculativeJIT::initConstantInfo): + (JSC::DFG::SpeculativeJIT::appendCallWithExceptionCheck): + (JSC::DFG::SpeculativeJIT::isInteger): + (JSC::DFG::SpeculativeJIT::temporaryRegisterForPutByVal): + (JSC::DFG::SpeculativeJIT::emitAllocateBasicStorage): + (JSC::DFG::SpeculativeJIT::setNodeForOperand): + (JSC::DFG::IntegerOperand::IntegerOperand): + (JSC::DFG::IntegerOperand::node): + (JSC::DFG::IntegerOperand::gpr): + (JSC::DFG::IntegerOperand::use): + (IntegerOperand): + (JSC::DFG::DoubleOperand::DoubleOperand): + (JSC::DFG::DoubleOperand::node): + (JSC::DFG::DoubleOperand::fpr): + (JSC::DFG::DoubleOperand::use): + (DoubleOperand): + (JSC::DFG::JSValueOperand::JSValueOperand): + (JSC::DFG::JSValueOperand::node): + (JSC::DFG::JSValueOperand::gpr): + (JSC::DFG::JSValueOperand::fill): + (JSC::DFG::JSValueOperand::use): + (JSValueOperand): + (JSC::DFG::StorageOperand::StorageOperand): + (JSC::DFG::StorageOperand::node): + (JSC::DFG::StorageOperand::gpr): + (JSC::DFG::StorageOperand::use): + (StorageOperand): + (JSC::DFG::SpeculateIntegerOperand::SpeculateIntegerOperand): + (JSC::DFG::SpeculateIntegerOperand::node): + (JSC::DFG::SpeculateIntegerOperand::gpr): + (JSC::DFG::SpeculateIntegerOperand::use): + (SpeculateIntegerOperand): + (JSC::DFG::SpeculateStrictInt32Operand::SpeculateStrictInt32Operand): + (JSC::DFG::SpeculateStrictInt32Operand::node): + (JSC::DFG::SpeculateStrictInt32Operand::gpr): + (JSC::DFG::SpeculateStrictInt32Operand::use): + (SpeculateStrictInt32Operand): + (JSC::DFG::SpeculateDoubleOperand::SpeculateDoubleOperand): + (JSC::DFG::SpeculateDoubleOperand::node): + (JSC::DFG::SpeculateDoubleOperand::fpr): + (JSC::DFG::SpeculateDoubleOperand::use): + (SpeculateDoubleOperand): + (JSC::DFG::SpeculateCellOperand::SpeculateCellOperand): + (JSC::DFG::SpeculateCellOperand::node): + (JSC::DFG::SpeculateCellOperand::gpr): + (JSC::DFG::SpeculateCellOperand::use): + (SpeculateCellOperand): + (JSC::DFG::SpeculateBooleanOperand::SpeculateBooleanOperand): + (JSC::DFG::SpeculateBooleanOperand::node): + (JSC::DFG::SpeculateBooleanOperand::gpr): + (JSC::DFG::SpeculateBooleanOperand::use): + (SpeculateBooleanOperand): + * dfg/DFGSpeculativeJIT32_64.cpp: + (JSC::DFG::SpeculativeJIT::fillInteger): + (JSC::DFG::SpeculativeJIT::fillDouble): + (JSC::DFG::SpeculativeJIT::fillJSValue): + (JSC::DFG::SpeculativeJIT::nonSpeculativeValueToNumber): + (JSC::DFG::SpeculativeJIT::nonSpeculativeValueToInt32): + (JSC::DFG::SpeculativeJIT::nonSpeculativeUInt32ToNumber): + (JSC::DFG::SpeculativeJIT::cachedPutById): + (JSC::DFG::SpeculativeJIT::nonSpeculativeNonPeepholeCompareNull): + (JSC::DFG::SpeculativeJIT::nonSpeculativePeepholeBranchNull): + (JSC::DFG::SpeculativeJIT::nonSpeculativeCompareNull): + (JSC::DFG::SpeculativeJIT::nonSpeculativePeepholeBranch): + (JSC::DFG::SpeculativeJIT::nonSpeculativeNonPeepholeCompare): + (JSC::DFG::SpeculativeJIT::nonSpeculativePeepholeStrictEq): + (JSC::DFG::SpeculativeJIT::nonSpeculativeNonPeepholeStrictEq): + (JSC::DFG::SpeculativeJIT::emitCall): + (JSC::DFG::SpeculativeJIT::fillSpeculateIntInternal): + (JSC::DFG::SpeculativeJIT::fillSpeculateInt): + (JSC::DFG::SpeculativeJIT::fillSpeculateIntStrict): + (JSC::DFG::SpeculativeJIT::fillSpeculateDouble): + (JSC::DFG::SpeculativeJIT::fillSpeculateCell): + (JSC::DFG::SpeculativeJIT::fillSpeculateBoolean): + (JSC::DFG::SpeculativeJIT::compileObjectEquality): + (JSC::DFG::SpeculativeJIT::compileObjectToObjectOrOtherEquality): + (JSC::DFG::SpeculativeJIT::compilePeepHoleObjectToObjectOrOtherEquality): + (JSC::DFG::SpeculativeJIT::compileIntegerCompare): + (JSC::DFG::SpeculativeJIT::compileDoubleCompare): + (JSC::DFG::SpeculativeJIT::compileValueAdd): + (JSC::DFG::SpeculativeJIT::compileNonStringCellOrOtherLogicalNot): + (JSC::DFG::SpeculativeJIT::compileLogicalNot): + (JSC::DFG::SpeculativeJIT::emitNonStringCellOrOtherBranch): + (JSC::DFG::SpeculativeJIT::emitBranch): + (JSC::DFG::SpeculativeJIT::compileContiguousPutByVal): + (JSC::DFG::SpeculativeJIT::compile): + * dfg/DFGSpeculativeJIT64.cpp: + (JSC::DFG::SpeculativeJIT::fillInteger): + (JSC::DFG::SpeculativeJIT::fillDouble): + (JSC::DFG::SpeculativeJIT::fillJSValue): + (JSC::DFG::SpeculativeJIT::nonSpeculativeValueToNumber): + (JSC::DFG::SpeculativeJIT::nonSpeculativeValueToInt32): + (JSC::DFG::SpeculativeJIT::nonSpeculativeUInt32ToNumber): + (JSC::DFG::SpeculativeJIT::cachedPutById): + (JSC::DFG::SpeculativeJIT::nonSpeculativeNonPeepholeCompareNull): + (JSC::DFG::SpeculativeJIT::nonSpeculativePeepholeBranchNull): + (JSC::DFG::SpeculativeJIT::nonSpeculativeCompareNull): + (JSC::DFG::SpeculativeJIT::nonSpeculativePeepholeBranch): + (JSC::DFG::SpeculativeJIT::nonSpeculativeNonPeepholeCompare): + (JSC::DFG::SpeculativeJIT::nonSpeculativePeepholeStrictEq): + (JSC::DFG::SpeculativeJIT::nonSpeculativeNonPeepholeStrictEq): + (JSC::DFG::SpeculativeJIT::emitCall): + (JSC::DFG::SpeculativeJIT::fillSpeculateIntInternal): + (JSC::DFG::SpeculativeJIT::fillSpeculateInt): + (JSC::DFG::SpeculativeJIT::fillSpeculateIntStrict): + (JSC::DFG::SpeculativeJIT::fillSpeculateDouble): + (JSC::DFG::SpeculativeJIT::fillSpeculateCell): + (JSC::DFG::SpeculativeJIT::fillSpeculateBoolean): + (JSC::DFG::SpeculativeJIT::compileObjectEquality): + (JSC::DFG::SpeculativeJIT::compileObjectToObjectOrOtherEquality): + (JSC::DFG::SpeculativeJIT::compilePeepHoleObjectToObjectOrOtherEquality): + (JSC::DFG::SpeculativeJIT::compileIntegerCompare): + (JSC::DFG::SpeculativeJIT::compileDoubleCompare): + (JSC::DFG::SpeculativeJIT::compileValueAdd): + (JSC::DFG::SpeculativeJIT::compileNonStringCellOrOtherLogicalNot): + (JSC::DFG::SpeculativeJIT::compileLogicalNot): + (JSC::DFG::SpeculativeJIT::emitNonStringCellOrOtherBranch): + (JSC::DFG::SpeculativeJIT::emitBranch): + (JSC::DFG::SpeculativeJIT::compile): + * dfg/DFGStructureAbstractValue.h: + (StructureAbstractValue): + * dfg/DFGStructureCheckHoistingPhase.cpp: + (JSC::DFG::StructureCheckHoistingPhase::run): + * dfg/DFGValidate.cpp: + (DFG): + (Validate): + (JSC::DFG::Validate::validate): + (JSC::DFG::Validate::reportValidationContext): + * dfg/DFGValidate.h: + * dfg/DFGValueSource.cpp: + (JSC::DFG::ValueSource::dump): + * dfg/DFGValueSource.h: + (JSC::DFG::ValueSource::ValueSource): + * dfg/DFGVirtualRegisterAllocationPhase.cpp: + (JSC::DFG::VirtualRegisterAllocationPhase::run): + * runtime/FunctionExecutableDump.cpp: Added. + (JSC): + (JSC::FunctionExecutableDump::dump): + * runtime/FunctionExecutableDump.h: Added. + (JSC): + (FunctionExecutableDump): + (JSC::FunctionExecutableDump::FunctionExecutableDump): + * runtime/JSGlobalData.cpp: + (JSC::JSGlobalData::JSGlobalData): + * runtime/JSGlobalData.h: + (JSC): + (DFG): + (JSGlobalData): + * runtime/Options.h: + (JSC): + +2013-01-28 Laszlo Gombos <l.gombos@samsung.com> + + Collapse testing for a list of PLATFORM() into OS() and USE() tests + https://bugs.webkit.org/show_bug.cgi?id=108018 + + Reviewed by Eric Seidel. + + No functional change as "OS(DARWIN) && USE(CF)" equals to the + following platforms: MAC, WX, QT and CHROMIUM. CHROMIUM + is not using JavaScriptCore. + + * runtime/DatePrototype.cpp: + (JSC): + +2013-01-28 Geoffrey Garen <ggaren@apple.com> + + Static size inference for JavaScript objects + https://bugs.webkit.org/show_bug.cgi?id=108093 + + Reviewed by Phil Pizlo. + + * API/JSObjectRef.cpp: + * JavaScriptCore.order: + * JavaScriptCore.xcodeproj/project.pbxproj: Pay the tax man. + + * bytecode/CodeBlock.cpp: + (JSC::CodeBlock::dumpBytecode): op_new_object and op_create_this now + have an extra inferredInlineCapacity argument. This is the statically + inferred inline capacity, just from analyzing source text. op_new_object + also gets a pointer to an allocation profile. (For op_create_this, the + profile is in the construtor function.) + + (JSC::CodeBlock::CodeBlock): Link op_new_object. + + (JSC::CodeBlock::stronglyVisitStrongReferences): Mark our profiles. + + * bytecode/CodeBlock.h: + (CodeBlock): Removed some dead code. Added object allocation profiles. + + * bytecode/Instruction.h: + (JSC): New union type, since an instruction operand may point to an + object allocation profile now. + + * bytecode/ObjectAllocationProfile.h: Added. + (JSC): + (ObjectAllocationProfile): + (JSC::ObjectAllocationProfile::offsetOfAllocator): + (JSC::ObjectAllocationProfile::offsetOfStructure): + (JSC::ObjectAllocationProfile::ObjectAllocationProfile): + (JSC::ObjectAllocationProfile::isNull): + (JSC::ObjectAllocationProfile::initialize): + (JSC::ObjectAllocationProfile::structure): + (JSC::ObjectAllocationProfile::inlineCapacity): + (JSC::ObjectAllocationProfile::clear): + (JSC::ObjectAllocationProfile::visitAggregate): + (JSC::ObjectAllocationProfile::possibleDefaultPropertyCount): New class + for tracking a prediction about object allocation: structure, inline + capacity, allocator to use. + + * bytecode/Opcode.h: + (JSC): + (JSC::padOpcodeName): Updated instruction sizes. + + * bytecode/UnlinkedCodeBlock.cpp: + (JSC::UnlinkedCodeBlock::UnlinkedCodeBlock): + * bytecode/UnlinkedCodeBlock.h: + (JSC): + (JSC::UnlinkedCodeBlock::addObjectAllocationProfile): + (JSC::UnlinkedCodeBlock::numberOfObjectAllocationProfiles): + (UnlinkedCodeBlock): Unlinked support for allocation profiles. + + * bytecompiler/BytecodeGenerator.cpp: + (JSC::BytecodeGenerator::generate): Kill all remaining analyses at the + end of codegen, since this is our last opportunity. + + (JSC::BytecodeGenerator::BytecodeGenerator): Added a static property + analyzer to bytecode generation. It tracks initializing assignments and + makes a guess about how many will happen. + + (JSC::BytecodeGenerator::newObjectAllocationProfile): + (JSC): + (JSC::BytecodeGenerator::emitProfiledOpcode): + (JSC::BytecodeGenerator::emitMove): + (JSC::BytecodeGenerator::emitResolve): + (JSC::BytecodeGenerator::emitResolveBase): + (JSC::BytecodeGenerator::emitResolveBaseForPut): + (JSC::BytecodeGenerator::emitResolveWithBaseForPut): + (JSC::BytecodeGenerator::emitResolveWithThis): + (JSC::BytecodeGenerator::emitGetById): + (JSC::BytecodeGenerator::emitPutById): + (JSC::BytecodeGenerator::emitDirectPutById): + (JSC::BytecodeGenerator::emitPutGetterSetter): + (JSC::BytecodeGenerator::emitGetArgumentByVal): + (JSC::BytecodeGenerator::emitGetByVal): Added hooks to the static property + analyzer, so it can observe allocations and stores. + + (JSC::BytecodeGenerator::emitCreateThis): Factored this into a helper + function because it was a significant amount of logic, and I wanted to + add to it. + + (JSC::BytecodeGenerator::emitNewObject): + (JSC::BytecodeGenerator::emitExpectedFunctionSnippet): + (JSC::BytecodeGenerator::emitCall): + (JSC::BytecodeGenerator::emitCallVarargs): + (JSC::BytecodeGenerator::emitConstruct): Added a hook to profiled opcodes + to track their stores, in case a store kills a profiled allocation. Since + profiled opcodes are basically the only interesting stores we do, this + is a convenient place to notice any store that might kill an allocation. + + * bytecompiler/BytecodeGenerator.h: + (BytecodeGenerator): As above. + + * bytecompiler/StaticPropertyAnalysis.h: Added. + (JSC): + (StaticPropertyAnalysis): + (JSC::StaticPropertyAnalysis::create): + (JSC::StaticPropertyAnalysis::addPropertyIndex): + (JSC::StaticPropertyAnalysis::record): + (JSC::StaticPropertyAnalysis::propertyIndexCount): + (JSC::StaticPropertyAnalysis::StaticPropertyAnalysis): Simple helper + class for tracking allocations and stores. + + * bytecompiler/StaticPropertyAnalyzer.h: Added. + (StaticPropertyAnalyzer): + (JSC::StaticPropertyAnalyzer::StaticPropertyAnalyzer): + (JSC::StaticPropertyAnalyzer::createThis): + (JSC::StaticPropertyAnalyzer::newObject): + (JSC::StaticPropertyAnalyzer::putById): + (JSC::StaticPropertyAnalyzer::mov): + (JSC::StaticPropertyAnalyzer::kill): Helper class for observing allocations + and stores and making an inline capacity guess. The heuristics here are + intentionally minimal because we don't want this one class to try to + re-create something like a DFG or a runtime analysis. If we discover that + we need those kinds of analyses, we should just replace this class with + something else. + + This class tracks multiple registers that alias the same object -- that + happens a lot, when moving locals into temporary registers -- but it + doesn't track control flow or multiple objects that alias the same register. + + * dfg/DFGAbstractState.cpp: + (JSC::DFG::AbstractState::execute): Updated for rename. + + * dfg/DFGByteCodeParser.cpp: + (JSC::DFG::ByteCodeParser::parseBlock): Updated for inline capacity and + allocation profile. + + * dfg/DFGNode.h: + (JSC::DFG::Node::hasInlineCapacity): + (Node): + (JSC::DFG::Node::inlineCapacity): + (JSC::DFG::Node::hasFunction): Give the graph a good way to represent + inline capacity for an allocation. + + * dfg/DFGNodeType.h: + (DFG): Updated for rename. + + * dfg/DFGOperations.cpp: Updated for interface change. + + * dfg/DFGOperations.h: We pass the inline capacity to the slow case as + an argument. This is the simplest way, since it's stored as a bytecode operand. + + * dfg/DFGPredictionPropagationPhase.cpp: + (JSC::DFG::PredictionPropagationPhase::propagate): Updated for rename. + + * dfg/DFGRepatch.cpp: + (JSC::DFG::tryCacheGetByID): Fixed a horrible off-by-one-half bug that only + appears when doing an inline cached load for property number 64 on a 32-bit + system. In JSVALUE32_64 land, "offsetRelativeToPatchedStorage" is the + offset of the 64bit JSValue -- but we'll actually issue two loads, one for + the payload at that offset, and one for the tag at that offset + 4. We need + to ensure that both loads have a compact representation, or we'll corrupt + the instruction stream. + + * dfg/DFGSpeculativeJIT.cpp: + (JSC::DFG::SpeculativeJIT::emitAllocateJSArray): + * dfg/DFGSpeculativeJIT.h: + (JSC::DFG::SpeculativeJIT::callOperation): + (JSC::DFG::SpeculativeJIT::emitAllocateBasicStorage): + (SpeculativeJIT): + (JSC::DFG::SpeculativeJIT::emitAllocateJSObject): + * dfg/DFGSpeculativeJIT32_64.cpp: + (JSC::DFG::SpeculativeJIT::compile): + * dfg/DFGSpeculativeJIT64.cpp: + (JSC::DFG::SpeculativeJIT::compile): Lots of refactoring to support + passing an allocator to our allocation function, and/or passing a Structure + as a register instead of an immediate. + + * heap/MarkedAllocator.h: + (DFG): + (MarkedAllocator): + (JSC::MarkedAllocator::offsetOfFreeListHead): Added an accessor to simplify + JIT code generation of allocation from an arbitrary allocator. + + * jit/JIT.h: + (JSC): + * jit/JITInlines.h: + (JSC): + (JSC::JIT::emitAllocateJSObject): + * jit/JITOpcodes.cpp: + (JSC::JIT::emit_op_new_object): + (JSC::JIT::emitSlow_op_new_object): + (JSC::JIT::emit_op_create_this): + (JSC::JIT::emitSlow_op_create_this): + * jit/JITOpcodes32_64.cpp: + (JSC::JIT::emit_op_new_object): + (JSC::JIT::emitSlow_op_new_object): + (JSC::JIT::emit_op_create_this): + (JSC::JIT::emitSlow_op_create_this): Same refactoring as done for the DFG. + + * jit/JITStubs.cpp: + (JSC::tryCacheGetByID): Fixed the same bug mentioned above. + + (JSC::DEFINE_STUB_FUNCTION): Updated for interface changes. + + * llint/LLIntData.cpp: + (JSC::LLInt::Data::performAssertions): Updated for interface changes. + + * llint/LLIntSlowPaths.cpp: + (JSC::LLInt::LLINT_SLOW_PATH_DECL): + * llint/LowLevelInterpreter.asm: + * llint/LowLevelInterpreter32_64.asm: + * llint/LowLevelInterpreter64.asm: Same refactoring as for the JITs. + + * profiler/ProfilerBytecode.cpp: + * profiler/ProfilerBytecodes.cpp: + * profiler/ProfilerCompilation.cpp: + * profiler/ProfilerCompiledBytecode.cpp: + * profiler/ProfilerDatabase.cpp: + * profiler/ProfilerOSRExit.cpp: + * profiler/ProfilerOrigin.cpp: + * profiler/ProfilerProfiledBytecodes.cpp: Include ObjectConstructor.h + because that's where createEmptyObject() lives now. + + * runtime/Executable.h: + (JSC::JSFunction::JSFunction): Updated for rename. + + * runtime/JSCellInlines.h: + (JSC::allocateCell): Updated to match the allocator selection code in + the JIT, so it's clearer that both are correct. + + * runtime/JSFunction.cpp: + (JSC::JSFunction::JSFunction): + (JSC::JSFunction::createAllocationProfile): + (JSC::JSFunction::visitChildren): + (JSC::JSFunction::getOwnPropertySlot): + (JSC::JSFunction::put): + (JSC::JSFunction::defineOwnProperty): + (JSC::JSFunction::getConstructData): + * runtime/JSFunction.h: + (JSC::JSFunction::offsetOfScopeChain): + (JSC::JSFunction::offsetOfExecutable): + (JSC::JSFunction::offsetOfAllocationProfile): + (JSC::JSFunction::allocationProfile): + (JSFunction): + (JSC::JSFunction::tryGetAllocationProfile): + (JSC::JSFunction::addAllocationProfileWatchpoint): Changed inheritorID + data member to be an ObjectAllocationProfile, which includes a pointer + to the desired allocator. This simplifies JIT code, since we don't have + to compute the allocator on the fly. I verified by code inspection that + JSFunction is still only 64 bytes. + + * runtime/JSGlobalObject.cpp: + (JSC::JSGlobalObject::reset): + (JSC::JSGlobalObject::visitChildren): + * runtime/JSGlobalObject.h: + (JSGlobalObject): + (JSC::JSGlobalObject::dateStructure): No direct pointer to the empty + object structure anymore, because now clients need to specify how much + inline capacity they want. + + * runtime/JSONObject.cpp: + * runtime/JSObject.h: + (JSC): + (JSFinalObject): + (JSC::JSFinalObject::defaultInlineCapacity): + (JSC::JSFinalObject::maxInlineCapacity): + (JSC::JSFinalObject::createStructure): A little refactoring to try to + clarify where some of these constants derive from. + + (JSC::maxOffsetRelativeToPatchedStorage): Used for bug fix, above. + + * runtime/JSProxy.cpp: + (JSC::JSProxy::setTarget): Ugly, but effective. + + * runtime/LiteralParser.cpp: + * runtime/ObjectConstructor.cpp: + (JSC::constructObject): + (JSC::constructWithObjectConstructor): + (JSC::callObjectConstructor): + (JSC::objectConstructorCreate): Updated for interface changes. + + * runtime/ObjectConstructor.h: + (JSC::constructEmptyObject): Clarified your options for how to allocate + an empty object, to emphasize what things can actually vary. + + * runtime/PropertyOffset.h: These constants have moved because they're + really higher level concepts to do with the layout of objects and the + collector. PropertyOffset is just an abstract number line, independent + of those things. + + * runtime/PrototypeMap.cpp: + (JSC::PrototypeMap::emptyObjectStructureForPrototype): + (JSC::PrototypeMap::clearEmptyObjectStructureForPrototype): + * runtime/PrototypeMap.h: + (PrototypeMap): The map key is now a pair of prototype and inline capacity, + since Structure encodes inline capacity. + + * runtime/Structure.cpp: + (JSC::Structure::Structure): + (JSC::Structure::materializePropertyMap): + (JSC::Structure::addPropertyTransition): + (JSC::Structure::nonPropertyTransition): + (JSC::Structure::copyPropertyTableForPinning): + * runtime/Structure.h: + (Structure): + (JSC::Structure::totalStorageSize): + (JSC::Structure::transitionCount): + (JSC::Structure::create): Fixed a nasty refactoring bug that only shows + up after enabling variable-sized inline capacities: we were passing our + type info where our inline capacity was expected. The compiler didn't + notice because both have type int :(. + +2013-01-28 Oliver Hunt <oliver@apple.com> + + Add more assertions to the property storage use in arrays + https://bugs.webkit.org/show_bug.cgi?id=107728 + + Reviewed by Filip Pizlo. + + Add a bunch of assertions to array and object butterfly + usage. This should make debugging somewhat easier. + + I also converted a couple of assertions to release asserts + as they were so low cost it seemed a sensible thing to do. + + * runtime/JSArray.cpp: + (JSC::JSArray::sortVector): + (JSC::JSArray::compactForSorting): + * runtime/JSObject.h: + (JSC::JSObject::getHolyIndexQuickly): + +2013-01-28 Adam Barth <abarth@webkit.org> + + Remove webkitNotifications.createHTMLNotification + https://bugs.webkit.org/show_bug.cgi?id=107598 + + Reviewed by Benjamin Poulain. + + * Configurations/FeatureDefines.xcconfig: + +2013-01-28 Michael Saboff <msaboff@apple.com> + + Cleanup ARM version of debugName() in DFGFPRInfo.h + https://bugs.webkit.org/show_bug.cgi?id=108090 + + Reviewed by David Kilzer. + + Fixed debugName() so it will compile by adding static_cast<int> and missing commas. + + * dfg/DFGFPRInfo.h: + (JSC::DFG::FPRInfo::debugName): + +2013-01-27 Andreas Kling <akling@apple.com> + + JSC: FunctionParameters are memory hungry. + <http://webkit.org/b/108033> + <rdar://problem/13094803> + + Reviewed by Sam Weinig. + + Instead of inheriting from Vector<Identifier>, make FunctionParameters a simple fixed-size array + with a custom-allocating create() function. Removes one step of indirection and cuts memory usage + roughly in half. + + 2.73 MB progression on Membuster3. + + * bytecode/UnlinkedCodeBlock.cpp: + (JSC::UnlinkedFunctionExecutable::paramString): + * bytecompiler/BytecodeGenerator.cpp: + (JSC::BytecodeGenerator::BytecodeGenerator): + * parser/Nodes.cpp: + (JSC::FunctionParameters::create): + (JSC::FunctionParameters::FunctionParameters): + (JSC::FunctionParameters::~FunctionParameters): + * parser/Nodes.h: + (FunctionParameters): + (JSC::FunctionParameters::size): + (JSC::FunctionParameters::at): + (JSC::FunctionParameters::identifiers): + +2013-01-27 Andreas Kling <akling@apple.com> + + JSC: SourceProviderCache is memory hungry. + <http://webkit.org/b/108029> + <rdar://problem/13094806> + + Reviewed by Sam Weinig. + + Use fixed-size arrays for SourceProviderCacheItem's lists of captured variables. + Since the lists never change after the object is created, there's no need to keep them in Vectors + and we can instead create the whole cache item in a single allocation. + + 13.37 MB progression on Membuster3. + + * parser/Parser.cpp: + (JSC::::parseFunctionInfo): + * parser/Parser.h: + (JSC::Scope::copyCapturedVariablesToVector): + (JSC::Scope::fillParametersForSourceProviderCache): + (JSC::Scope::restoreFromSourceProviderCache): + * parser/SourceProviderCacheItem.h: + (SourceProviderCacheItemCreationParameters): + (SourceProviderCacheItem): + (JSC::SourceProviderCacheItem::approximateByteSize): + (JSC::SourceProviderCacheItem::usedVariables): + (JSC::SourceProviderCacheItem::writtenVariables): + (JSC::SourceProviderCacheItem::~SourceProviderCacheItem): + (JSC::SourceProviderCacheItem::create): + (JSC::SourceProviderCacheItem::SourceProviderCacheItem): + +2013-01-27 Zoltan Arvai <zarvai@inf.u-szeged.hu> + + Fixing atomicIncrement implementation for Windows by dropping support before XP SP2. + https://bugs.webkit.org/show_bug.cgi?id=106740 + + Reviewed by Benjamin Poulain. + + * config.h: + +2013-01-25 Filip Pizlo <fpizlo@apple.com> + + DFG variable event stream shouldn't use NodeIndex + https://bugs.webkit.org/show_bug.cgi?id=107996 + + Reviewed by Oliver Hunt. + + Introduce the notion of a DFG::MinifiedID, which is just a unique ID of a DFG Node. + Internally it currently uses a NodeIndex, but we could change this without having + to recode all of the users of MinifiedID. This effectively decouples the OSR exit + compiler's way of identifying nodes from the speculative JIT's way of identifying + nodes, and should make it easier to make changes to the speculative JIT's internals + in the future. + + Also changed variable event stream logging to exclude information about births and + deaths of constants, since the OSR exit compiler never cares about which register + holds a constant; if a value is constant then the OSR exit compiler can reify it. + + Also changed the variable event stream's value recovery computation to use a + HashMap keyed by MinifiedID rather than a Vector indexed by NodeIndex. + + This appears to be performance-neutral. It's primarily meant as a small step + towards https://bugs.webkit.org/show_bug.cgi?id=106868. + + * GNUmakefile.list.am: + * JavaScriptCore.xcodeproj/project.pbxproj: + * 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): + (JSC::DFG::GenerationInfo::noticeOSRBirth): + (JSC::DFG::GenerationInfo::use): + (JSC::DFG::GenerationInfo::appendFill): + (JSC::DFG::GenerationInfo::appendSpill): + (GenerationInfo): + * dfg/DFGJITCompiler.cpp: + (JSC::DFG::JITCompiler::link): + * dfg/DFGMinifiedGraph.h: + (JSC::DFG::MinifiedGraph::at): + (MinifiedGraph): + * dfg/DFGMinifiedID.h: Added. + (DFG): + (MinifiedID): + (JSC::DFG::MinifiedID::MinifiedID): + (JSC::DFG::MinifiedID::operator!): + (JSC::DFG::MinifiedID::nodeIndex): + (JSC::DFG::MinifiedID::operator==): + (JSC::DFG::MinifiedID::operator!=): + (JSC::DFG::MinifiedID::operator<): + (JSC::DFG::MinifiedID::operator>): + (JSC::DFG::MinifiedID::operator<=): + (JSC::DFG::MinifiedID::operator>=): + (JSC::DFG::MinifiedID::hash): + (JSC::DFG::MinifiedID::dump): + (JSC::DFG::MinifiedID::isHashTableDeletedValue): + (JSC::DFG::MinifiedID::invalidID): + (JSC::DFG::MinifiedID::otherInvalidID): + (JSC::DFG::MinifiedID::fromBits): + (JSC::DFG::MinifiedIDHash::hash): + (JSC::DFG::MinifiedIDHash::equal): + (MinifiedIDHash): + (WTF): + * dfg/DFGMinifiedNode.cpp: + (JSC::DFG::MinifiedNode::fromNode): + * dfg/DFGMinifiedNode.h: + (JSC::DFG::MinifiedNode::id): + (JSC::DFG::MinifiedNode::child1): + (JSC::DFG::MinifiedNode::getID): + (JSC::DFG::MinifiedNode::compareByNodeIndex): + (MinifiedNode): + * dfg/DFGSpeculativeJIT.cpp: + (JSC::DFG::SpeculativeJIT::compileMovHint): + (JSC::DFG::SpeculativeJIT::computeValueRecoveryFor): + * dfg/DFGSpeculativeJIT.h: + (JSC::DFG::SpeculativeJIT::setNodeIndexForOperand): + * dfg/DFGValueSource.cpp: + (JSC::DFG::ValueSource::dump): + * dfg/DFGValueSource.h: + (JSC::DFG::ValueSource::ValueSource): + (JSC::DFG::ValueSource::isSet): + (JSC::DFG::ValueSource::kind): + (JSC::DFG::ValueSource::id): + (ValueSource): + (JSC::DFG::ValueSource::idFromKind): + (JSC::DFG::ValueSource::kindFromID): + * dfg/DFGVariableEvent.cpp: + (JSC::DFG::VariableEvent::dump): + (JSC::DFG::VariableEvent::dumpFillInfo): + (JSC::DFG::VariableEvent::dumpSpillInfo): + * dfg/DFGVariableEvent.h: + (JSC::DFG::VariableEvent::fillGPR): + (JSC::DFG::VariableEvent::fillPair): + (JSC::DFG::VariableEvent::fillFPR): + (JSC::DFG::VariableEvent::spill): + (JSC::DFG::VariableEvent::death): + (JSC::DFG::VariableEvent::movHint): + (JSC::DFG::VariableEvent::id): + (VariableEvent): + * dfg/DFGVariableEventStream.cpp: + (DFG): + (JSC::DFG::VariableEventStream::tryToSetConstantRecovery): + (JSC::DFG::VariableEventStream::reconstruct): + * dfg/DFGVariableEventStream.h: + (VariableEventStream): + +2013-01-25 Roger Fong <roger_fong@apple.com> + + Unreviewed. Rename LLInt projects folder and make appropriate changes to solutions. + + * JavaScriptCore.vcxproj/JavaScriptCore.sln: + * JavaScriptCore.vcxproj/LLInt: Copied from JavaScriptCore.vcxproj/LLInt.vcproj. + * JavaScriptCore.vcxproj/LLInt.vcproj: Removed. + * JavaScriptCore.vcxproj/LLInt.vcproj/LLIntAssembly: Removed. + * JavaScriptCore.vcxproj/LLInt.vcproj/LLIntAssembly/LLIntAssembly.make: Removed. + * JavaScriptCore.vcxproj/LLInt.vcproj/LLIntAssembly/LLIntAssembly.vcxproj: Removed. + * JavaScriptCore.vcxproj/LLInt.vcproj/LLIntAssembly/LLIntAssembly.vcxproj.user: Removed. + * JavaScriptCore.vcxproj/LLInt.vcproj/LLIntAssembly/build-LLIntAssembly.sh: Removed. + * JavaScriptCore.vcxproj/LLInt.vcproj/LLIntDesiredOffsets: Removed. + * JavaScriptCore.vcxproj/LLInt.vcproj/LLIntDesiredOffsets/LLIntDesiredOffsets.make: Removed. + * JavaScriptCore.vcxproj/LLInt.vcproj/LLIntDesiredOffsets/LLIntDesiredOffsets.vcxproj: Removed. + * JavaScriptCore.vcxproj/LLInt.vcproj/LLIntDesiredOffsets/LLIntDesiredOffsets.vcxproj.user: Removed. + * JavaScriptCore.vcxproj/LLInt.vcproj/LLIntDesiredOffsets/build-LLIntDesiredOffsets.sh: Removed. + * JavaScriptCore.vcxproj/LLInt.vcproj/LLIntOffsetsExtractor: Removed. + * JavaScriptCore.vcxproj/LLInt.vcproj/LLIntOffsetsExtractor/LLIntOffsetsExtractor.vcxproj: Removed. + * JavaScriptCore.vcxproj/LLInt.vcproj/LLIntOffsetsExtractor/LLIntOffsetsExtractor.vcxproj.user: Removed. + * JavaScriptCore.vcxproj/LLInt.vcproj/LLIntOffsetsExtractor/LLIntOffsetsExtractorCommon.props: Removed. + * JavaScriptCore.vcxproj/LLInt.vcproj/LLIntOffsetsExtractor/LLIntOffsetsExtractorDebug.props: Removed. + * JavaScriptCore.vcxproj/LLInt.vcproj/LLIntOffsetsExtractor/LLIntOffsetsExtractorRelease.props: Removed. + +2013-01-24 Roger Fong <roger_fong@apple.com> + + VS2010 JavascriptCore: Clean up property sheets, add a JSC solution, add testRegExp and testAPI projects. + https://bugs.webkit.org/show_bug.cgi?id=106987 + + Reviewed by Brent Fulgham. + + * JavaScriptCore.vcxproj/JavaScriptCore.sln: Added. + * JavaScriptCore.vcxproj/JavaScriptCoreCF.props: + * JavaScriptCore.vcxproj/JavaScriptCoreCommon.props: + * JavaScriptCore.vcxproj/JavaScriptCorePreLink.cmd: + * JavaScriptCore.vcxproj/LLInt.vcproj/LLIntOffsetsExtractor/LLIntOffsetsExtractorCommon.props: + * JavaScriptCore.vcxproj/jsc/jscCommon.props: + * JavaScriptCore.vcxproj/jsc/jscDebug.props: + * JavaScriptCore.vcxproj/jsc/jscPostBuild.cmd: + * JavaScriptCore.vcxproj/jsc/jscPreLink.cmd: + * JavaScriptCore.vcxproj/testRegExp: Added. + * JavaScriptCore.vcxproj/testRegExp/testRegExp.vcxproj: Added. + * JavaScriptCore.vcxproj/testRegExp/testRegExp.vcxproj.filters: Added. + * JavaScriptCore.vcxproj/testRegExp/testRegExp.vcxproj.user: Added. + * JavaScriptCore.vcxproj/testRegExp/testRegExpCommon.props: Added. + * JavaScriptCore.vcxproj/testRegExp/testRegExpDebug.props: Added. + * JavaScriptCore.vcxproj/testRegExp/testRegExpPostBuild.cmd: Added. + * JavaScriptCore.vcxproj/testRegExp/testRegExpPreBuild.cmd: Added. + * JavaScriptCore.vcxproj/testRegExp/testRegExpPreLink.cmd: Added. + * JavaScriptCore.vcxproj/testRegExp/testRegExpRelease.props: Added. + * JavaScriptCore.vcxproj/testapi: Added. + * JavaScriptCore.vcxproj/testapi/testapi.vcxproj: Added. + * JavaScriptCore.vcxproj/testapi/testapi.vcxproj.filters: Added. + * JavaScriptCore.vcxproj/testapi/testapi.vcxproj.user: Added. + * JavaScriptCore.vcxproj/testapi/testapiCommon.props: Added. + * JavaScriptCore.vcxproj/testapi/testapiDebug.props: Added. + * JavaScriptCore.vcxproj/testapi/testapiPostBuild.cmd: Added. + * JavaScriptCore.vcxproj/testapi/testapiPreBuild.cmd: Added. + * JavaScriptCore.vcxproj/testapi/testapiPreLink.cmd: Added. + * JavaScriptCore.vcxproj/testapi/testapiRelease.props: Added. + +2013-01-24 Roger Fong <roger_fong@apple.com> + + Unreviewed. Windows build fix. + + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCoreExports.def: + +2013-01-24 Filip Pizlo <fpizlo@apple.com> + + DFG::JITCompiler::getSpeculation() methods are badly named and superfluous + https://bugs.webkit.org/show_bug.cgi?id=107860 + + Reviewed by Mark Hahnenberg. + + * dfg/DFGJITCompiler.h: + (JITCompiler): + * dfg/DFGSpeculativeJIT64.cpp: + (JSC::DFG::SpeculativeJIT::compileLogicalNot): + (JSC::DFG::SpeculativeJIT::emitBranch): + +2013-01-24 Mark Hahnenberg <mhahnenberg@apple.com> + + Objective-C API: Rename JSValue.h/APIJSValue.h to JSCJSValue.h/JSValue.h + https://bugs.webkit.org/show_bug.cgi?id=107327 + + Reviewed by Filip Pizlo. + + We're renaming these two files, so we have to replace the names everywhere. + + * API/APICast.h: + * API/APIJSValue.h: Removed. + * API/JSBlockAdaptor.mm: + * API/JSStringRefCF.cpp: + * API/JSValue.h: Copied from Source/JavaScriptCore/API/APIJSValue.h. + * API/JSValue.mm: + * API/JSValueInternal.h: + * API/JSValueRef.cpp: + * API/JSWeakObjectMapRefPrivate.cpp: + * API/JavaScriptCore.h: + * CMakeLists.txt: + * GNUmakefile.list.am: + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: + * JavaScriptCore.xcodeproj/project.pbxproj: + * Target.pri: + * bytecode/CallLinkStatus.h: + * bytecode/CodeBlock.cpp: + * bytecode/MethodOfGettingAValueProfile.h: + * bytecode/ResolveGlobalStatus.cpp: + * bytecode/ResolveGlobalStatus.h: + * bytecode/SpeculatedType.h: + * bytecode/ValueRecovery.h: + * dfg/DFGByteCodeParser.cpp: + * dfg/DFGJITCompiler.cpp: + * dfg/DFGNode.h: + * dfg/DFGSpeculativeJIT.cpp: + * dfg/DFGSpeculativeJIT64.cpp: + * heap/CopiedBlock.h: + * heap/HandleStack.cpp: + * heap/HandleTypes.h: + * heap/WeakImpl.h: + * interpreter/Interpreter.h: + * interpreter/Register.h: + * interpreter/VMInspector.h: + * jit/HostCallReturnValue.cpp: + * jit/HostCallReturnValue.h: + * jit/JITCode.h: + * jit/JITExceptions.cpp: + * jit/JITExceptions.h: + * jit/JSInterfaceJIT.h: + * llint/LLIntCLoop.h: + * llint/LLIntData.h: + * llint/LLIntSlowPaths.cpp: + * profiler/ProfilerBytecode.h: + * profiler/ProfilerBytecodeSequence.h: + * profiler/ProfilerBytecodes.h: + * profiler/ProfilerCompilation.h: + * profiler/ProfilerCompiledBytecode.h: + * profiler/ProfilerDatabase.h: + * profiler/ProfilerOSRExit.h: + * profiler/ProfilerOSRExitSite.h: + * profiler/ProfilerOrigin.h: + * profiler/ProfilerOriginStack.h: + * runtime/ArgList.cpp: + * runtime/CachedTranscendentalFunction.h: + * runtime/CallData.h: + * runtime/Completion.h: + * runtime/ConstructData.h: + * runtime/DateConstructor.cpp: + * runtime/DateInstance.cpp: + * runtime/DatePrototype.cpp: + * runtime/JSAPIValueWrapper.h: + * runtime/JSCJSValue.cpp: Copied from Source/JavaScriptCore/runtime/JSValue.cpp. + * runtime/JSCJSValue.h: Copied from Source/JavaScriptCore/runtime/JSValue.h. + (JSValue): + * runtime/JSCJSValueInlines.h: Copied from Source/JavaScriptCore/runtime/JSValueInlines.h. + * runtime/JSGlobalData.h: + * runtime/JSGlobalObject.cpp: + * runtime/JSGlobalObjectFunctions.h: + * runtime/JSStringJoiner.h: + * runtime/JSValue.cpp: Removed. + * runtime/JSValue.h: Removed. + * runtime/JSValueInlines.h: Removed. + * runtime/LiteralParser.h: + * runtime/Operations.h: + * runtime/PropertyDescriptor.h: + * runtime/PropertySlot.h: + * runtime/Protect.h: + * runtime/RegExpPrototype.cpp: + * runtime/Structure.h: + +2013-01-23 Oliver Hunt <oliver@apple.com> + + Harden JSC a bit with RELEASE_ASSERT + https://bugs.webkit.org/show_bug.cgi?id=107766 + + Reviewed by Mark Hahnenberg. + + Went through and replaced a pile of ASSERTs that were covering + significantly important details (bounds checks, etc) where + having the checks did not impact release performance in any + measurable way. + + * API/JSContextRef.cpp: + (JSContextCreateBacktrace): + * assembler/MacroAssembler.h: + (JSC::MacroAssembler::branchAdd32): + (JSC::MacroAssembler::branchMul32): + * bytecode/CodeBlock.cpp: + (JSC::CodeBlock::dumpBytecode): + (JSC::CodeBlock::handlerForBytecodeOffset): + (JSC::CodeBlock::lineNumberForBytecodeOffset): + (JSC::CodeBlock::bytecodeOffset): + * bytecode/CodeBlock.h: + (JSC::CodeBlock::bytecodeOffsetForCallAtIndex): + (JSC::CodeBlock::bytecodeOffset): + (JSC::CodeBlock::exceptionHandler): + (JSC::CodeBlock::codeOrigin): + (JSC::CodeBlock::immediateSwitchJumpTable): + (JSC::CodeBlock::characterSwitchJumpTable): + (JSC::CodeBlock::stringSwitchJumpTable): + (JSC::CodeBlock::setIdentifiers): + (JSC::baselineCodeBlockForInlineCallFrame): + (JSC::ExecState::uncheckedR): + * bytecode/CodeOrigin.cpp: + (JSC::CodeOrigin::inlineStack): + * bytecode/CodeOrigin.h: + (JSC::CodeOrigin::CodeOrigin): + * dfg/DFGCSEPhase.cpp: + * dfg/DFGOSRExit.cpp: + * dfg/DFGScratchRegisterAllocator.h: + (JSC::DFG::ScratchRegisterAllocator::preserveUsedRegistersToScratchBuffer): + (JSC::DFG::ScratchRegisterAllocator::restoreUsedRegistersFromScratchBuffer): + * dfg/DFGSpeculativeJIT.h: + (JSC::DFG::SpeculativeJIT::allocate): + (JSC::DFG::SpeculativeJIT::spill): + (JSC::DFG::SpeculativeJIT::integerResult): + * dfg/DFGSpeculativeJIT64.cpp: + (JSC::DFG::SpeculativeJIT::fillInteger): + (JSC::DFG::SpeculativeJIT::fillDouble): + (JSC::DFG::SpeculativeJIT::fillJSValue): + (JSC::DFG::SpeculativeJIT::nonSpeculativeCompareNull): + (JSC::DFG::SpeculativeJIT::emitCall): + (JSC::DFG::SpeculativeJIT::fillSpeculateIntInternal): + (JSC::DFG::SpeculativeJIT::fillSpeculateIntStrict): + (JSC::DFG::SpeculativeJIT::fillSpeculateDouble): + (JSC::DFG::SpeculativeJIT::fillSpeculateCell): + (JSC::DFG::SpeculativeJIT::fillSpeculateBoolean): + (JSC::DFG::SpeculativeJIT::compile): + * dfg/DFGValueSource.h: + (JSC::DFG::dataFormatToValueSourceKind): + (JSC::DFG::ValueSource::ValueSource): + * dfg/DFGVirtualRegisterAllocationPhase.cpp: + * heap/BlockAllocator.cpp: + (JSC::BlockAllocator::BlockAllocator): + (JSC::BlockAllocator::releaseFreeRegions): + (JSC::BlockAllocator::blockFreeingThreadMain): + * heap/Heap.cpp: + (JSC::Heap::lastChanceToFinalize): + (JSC::Heap::collect): + * interpreter/Interpreter.cpp: + (JSC::Interpreter::throwException): + (JSC::Interpreter::execute): + * jit/GCAwareJITStubRoutine.cpp: + (JSC::GCAwareJITStubRoutine::observeZeroRefCount): + * jit/JIT.cpp: + (JSC::JIT::privateCompileMainPass): + (JSC::JIT::privateCompileSlowCases): + * jit/JITExceptions.cpp: + (JSC::genericThrow): + * jit/JITInlines.h: + (JSC::JIT::emitLoad): + * jit/JITOpcodes.cpp: + (JSC::JIT::emit_op_end): + (JSC::JIT::emit_resolve_operations): + * jit/JITStubRoutine.cpp: + (JSC::JITStubRoutine::observeZeroRefCount): + * jit/JITStubs.cpp: + (JSC::returnToThrowTrampoline): + * runtime/Arguments.cpp: + (JSC::Arguments::getOwnPropertySlot): + (JSC::Arguments::getOwnPropertyDescriptor): + (JSC::Arguments::deleteProperty): + (JSC::Arguments::defineOwnProperty): + (JSC::Arguments::didTearOffActivation): + * runtime/ArrayPrototype.cpp: + (JSC::shift): + (JSC::unshift): + (JSC::arrayProtoFuncLastIndexOf): + * runtime/ButterflyInlines.h: + (JSC::Butterfly::growPropertyStorage): + * runtime/CodeCache.cpp: + (JSC::CodeCache::getFunctionExecutableFromGlobalCode): + * runtime/CodeCache.h: + (JSC::CacheMap::add): + * runtime/Completion.cpp: + (JSC::checkSyntax): + (JSC::evaluate): + * runtime/Executable.cpp: + (JSC::FunctionExecutable::FunctionExecutable): + (JSC::EvalExecutable::unlinkCalls): + (JSC::ProgramExecutable::compileOptimized): + (JSC::ProgramExecutable::unlinkCalls): + (JSC::ProgramExecutable::initializeGlobalProperties): + (JSC::FunctionExecutable::baselineCodeBlockFor): + (JSC::FunctionExecutable::compileOptimizedForCall): + (JSC::FunctionExecutable::compileOptimizedForConstruct): + (JSC::FunctionExecutable::compileForCallInternal): + (JSC::FunctionExecutable::compileForConstructInternal): + (JSC::FunctionExecutable::unlinkCalls): + (JSC::NativeExecutable::hashFor): + * runtime/Executable.h: + (JSC::EvalExecutable::compile): + (JSC::ProgramExecutable::compile): + (JSC::FunctionExecutable::compileForCall): + (JSC::FunctionExecutable::compileForConstruct): + * runtime/IndexingHeader.h: + (JSC::IndexingHeader::setVectorLength): + * runtime/JSArray.cpp: + (JSC::JSArray::pop): + (JSC::JSArray::shiftCountWithArrayStorage): + (JSC::JSArray::shiftCountWithAnyIndexingType): + (JSC::JSArray::unshiftCountWithArrayStorage): + * runtime/JSGlobalObjectFunctions.cpp: + (JSC::jsStrDecimalLiteral): + * runtime/JSObject.cpp: + (JSC::JSObject::copyButterfly): + (JSC::JSObject::defineOwnIndexedProperty): + (JSC::JSObject::putByIndexBeyondVectorLengthWithoutAttributes): + * runtime/JSString.cpp: + (JSC::JSRopeString::getIndexSlowCase): + * yarr/YarrInterpreter.cpp: + (JSC::Yarr::Interpreter::popParenthesesDisjunctionContext): + +2013-01-23 Filip Pizlo <fpizlo@apple.com> + + Constant folding an access to an uncaptured variable that is captured later in the same basic block shouldn't lead to assertion failures + https://bugs.webkit.org/show_bug.cgi?id=107750 + <rdar://problem/12387265> + + Reviewed by Mark Hahnenberg. + + The point of this assertion was that if there is no variable capturing going on, then there should only be one GetLocal + for the variable anywhere in the basic block. But if there is some capturing, then we'll have an unbounded number of + GetLocals. The assertion was too imprecise for the latter case. I want to keep this assertion, so I introduced a + checker that verifies this precisely: if there are any captured accesses to the variable anywhere at or after the + GetLocal we are eliminating, then we allow redundant GetLocals. + + * dfg/DFGConstantFoldingPhase.cpp: + (JSC::DFG::ConstantFoldingPhase::foldConstants): + (ConstantFoldingPhase): + (JSC::DFG::ConstantFoldingPhase::isCapturedAtOrAfter): + +2013-01-23 Oliver Hunt <oliver@apple.com> + + Replace ASSERT_NOT_REACHED with RELEASE_ASSERT_NOT_REACHED in JSC + https://bugs.webkit.org/show_bug.cgi?id=107736 + + Reviewed by Mark Hahnenberg. + + Mechanical change with no performance impact. + + * API/JSBlockAdaptor.mm: + (BlockArgumentTypeDelegate::typeVoid): + * API/JSCallbackObjectFunctions.h: + (JSC::::construct): + (JSC::::call): + * API/JSScriptRef.cpp: + * API/ObjCCallbackFunction.mm: + (ArgumentTypeDelegate::typeVoid): + * assembler/ARMv7Assembler.h: + (JSC::ARMv7Assembler::link): + (JSC::ARMv7Assembler::replaceWithLoad): + (JSC::ARMv7Assembler::replaceWithAddressComputation): + * assembler/MacroAssembler.h: + (JSC::MacroAssembler::invert): + * assembler/MacroAssemblerARM.h: + (JSC::MacroAssemblerARM::countLeadingZeros32): + (JSC::MacroAssemblerARM::divDouble): + * assembler/MacroAssemblerMIPS.h: + (JSC::MacroAssemblerMIPS::absDouble): + (JSC::MacroAssemblerMIPS::replaceWithJump): + (JSC::MacroAssemblerMIPS::maxJumpReplacementSize): + * assembler/MacroAssemblerSH4.h: + (JSC::MacroAssemblerSH4::absDouble): + (JSC::MacroAssemblerSH4::replaceWithJump): + (JSC::MacroAssemblerSH4::maxJumpReplacementSize): + * assembler/SH4Assembler.h: + (JSC::SH4Assembler::shllImm8r): + (JSC::SH4Assembler::shlrImm8r): + (JSC::SH4Assembler::cmplRegReg): + (JSC::SH4Assembler::branch): + * assembler/X86Assembler.h: + (JSC::X86Assembler::replaceWithLoad): + (JSC::X86Assembler::replaceWithAddressComputation): + * bytecode/CallLinkInfo.cpp: + (JSC::CallLinkInfo::unlink): + * bytecode/CodeBlock.cpp: + (JSC::debugHookName): + (JSC::CodeBlock::printGetByIdOp): + (JSC::CodeBlock::printGetByIdCacheStatus): + (JSC::CodeBlock::visitAggregate): + (JSC::CodeBlock::finalizeUnconditionally): + (JSC::CodeBlock::usesOpcode): + * bytecode/DataFormat.h: + (JSC::needDataFormatConversion): + * bytecode/ExitKind.cpp: + (JSC::exitKindToString): + (JSC::exitKindIsCountable): + * bytecode/MethodOfGettingAValueProfile.cpp: + (JSC::MethodOfGettingAValueProfile::getSpecFailBucket): + * bytecode/Opcode.h: + (JSC::opcodeLength): + * bytecode/PolymorphicPutByIdList.cpp: + (JSC::PutByIdAccess::fromStructureStubInfo): + (JSC::PutByIdAccess::visitWeak): + * bytecode/StructureStubInfo.cpp: + (JSC::StructureStubInfo::deref): + * bytecompiler/BytecodeGenerator.cpp: + (JSC::ResolveResult::checkValidity): + (JSC::BytecodeGenerator::emitGetLocalVar): + (JSC::BytecodeGenerator::beginSwitch): + * bytecompiler/NodesCodegen.cpp: + (JSC::BinaryOpNode::emitBytecode): + (JSC::emitReadModifyAssignment): + * dfg/DFGAbstractState.cpp: + (JSC::DFG::AbstractState::execute): + (JSC::DFG::AbstractState::mergeStateAtTail): + (JSC::DFG::AbstractState::mergeToSuccessors): + * dfg/DFGByteCodeParser.cpp: + (JSC::DFG::ByteCodeParser::makeSafe): + (JSC::DFG::ByteCodeParser::parseBlock): + * dfg/DFGCFGSimplificationPhase.cpp: + (JSC::DFG::CFGSimplificationPhase::fixPossibleGetLocal): + (JSC::DFG::CFGSimplificationPhase::fixTailOperand): + * dfg/DFGCSEPhase.cpp: + (JSC::DFG::CSEPhase::setLocalStoreElimination): + * dfg/DFGCapabilities.cpp: + (JSC::DFG::canHandleOpcodes): + * dfg/DFGCommon.h: + (JSC::DFG::useKindToString): + * dfg/DFGDoubleFormatState.h: + (JSC::DFG::mergeDoubleFormatStates): + (JSC::DFG::doubleFormatStateToString): + * dfg/DFGFixupPhase.cpp: + (JSC::DFG::FixupPhase::blessArrayOperation): + * dfg/DFGGraph.h: + (JSC::DFG::Graph::clobbersWorld): + * dfg/DFGNode.h: + (JSC::DFG::Node::valueOfJSConstant): + (JSC::DFG::Node::successor): + * dfg/DFGNodeFlags.cpp: + (JSC::DFG::nodeFlagsAsString): + * dfg/DFGNodeType.h: + (JSC::DFG::defaultFlags): + * dfg/DFGRepatch.h: + (JSC::DFG::dfgResetGetByID): + (JSC::DFG::dfgResetPutByID): + * dfg/DFGSlowPathGenerator.h: + (JSC::DFG::SlowPathGenerator::call): + * dfg/DFGSpeculativeJIT.cpp: + (JSC::DFG::SpeculativeJIT::silentSavePlanForGPR): + (JSC::DFG::SpeculativeJIT::silentSpill): + (JSC::DFG::SpeculativeJIT::silentFill): + (JSC::DFG::SpeculativeJIT::checkArray): + (JSC::DFG::SpeculativeJIT::checkGeneratedTypeForToInt32): + (JSC::DFG::SpeculativeJIT::compileValueToInt32): + (JSC::DFG::SpeculativeJIT::compileGetByValOnFloatTypedArray): + (JSC::DFG::SpeculativeJIT::compilePutByValForFloatTypedArray): + * dfg/DFGSpeculativeJIT.h: + (JSC::DFG::SpeculativeJIT::bitOp): + (JSC::DFG::SpeculativeJIT::shiftOp): + (JSC::DFG::SpeculativeJIT::integerResult): + * 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/DFGStructureCheckHoistingPhase.cpp: + (JSC::DFG::StructureCheckHoistingPhase::run): + * dfg/DFGValueSource.h: + (JSC::DFG::ValueSource::valueRecovery): + * dfg/DFGVariableEvent.cpp: + (JSC::DFG::VariableEvent::dump): + * dfg/DFGVariableEventStream.cpp: + (JSC::DFG::VariableEventStream::reconstruct): + * heap/BlockAllocator.h: + (JSC::BlockAllocator::regionSetFor): + * heap/GCThread.cpp: + (JSC::GCThread::gcThreadMain): + * heap/MarkedBlock.cpp: + (JSC::MarkedBlock::sweepHelper): + * heap/MarkedBlock.h: + (JSC::MarkedBlock::isLive): + * interpreter/CallFrame.h: + (JSC::ExecState::inlineCallFrame): + * interpreter/Interpreter.cpp: + (JSC::getCallerInfo): + (JSC::getStackFrameCodeType): + (JSC::Interpreter::execute): + * jit/ExecutableAllocatorFixedVMPool.cpp: + (JSC::FixedVMPoolExecutableAllocator::notifyPageIsFree): + * jit/JIT.cpp: + (JSC::JIT::privateCompileMainPass): + (JSC::JIT::privateCompileSlowCases): + (JSC::JIT::privateCompile): + * jit/JITArithmetic.cpp: + (JSC::JIT::emitSlow_op_mod): + * jit/JITArithmetic32_64.cpp: + (JSC::JIT::emitBinaryDoubleOp): + (JSC::JIT::emitSlow_op_mod): + * jit/JITPropertyAccess.cpp: + (JSC::JIT::isDirectPutById): + * jit/JITStubs.cpp: + (JSC::getPolymorphicAccessStructureListSlot): + (JSC::DEFINE_STUB_FUNCTION): + * llint/LLIntSlowPaths.cpp: + (JSC::LLInt::jitCompileAndSetHeuristics): + * parser/Lexer.cpp: + (JSC::::lex): + * parser/Nodes.h: + (JSC::ExpressionNode::emitBytecodeInConditionContext): + * parser/Parser.h: + (JSC::Parser::getTokenName): + (JSC::Parser::updateErrorMessageSpecialCase): + * parser/SyntaxChecker.h: + (JSC::SyntaxChecker::operatorStackPop): + * runtime/Arguments.cpp: + (JSC::Arguments::tearOffForInlineCallFrame): + * runtime/DatePrototype.cpp: + (JSC::formatLocaleDate): + * runtime/Executable.cpp: + (JSC::samplingDescription): + * runtime/Executable.h: + (JSC::ScriptExecutable::unlinkCalls): + * runtime/Identifier.cpp: + (JSC): + * runtime/InternalFunction.cpp: + (JSC::InternalFunction::getCallData): + * runtime/JSArray.cpp: + (JSC::JSArray::push): + (JSC::JSArray::sort): + * runtime/JSCell.cpp: + (JSC::JSCell::defaultValue): + (JSC::JSCell::getOwnPropertyNames): + (JSC::JSCell::getOwnNonIndexPropertyNames): + (JSC::JSCell::className): + (JSC::JSCell::getPropertyNames): + (JSC::JSCell::customHasInstance): + (JSC::JSCell::putDirectVirtual): + (JSC::JSCell::defineOwnProperty): + (JSC::JSCell::getOwnPropertyDescriptor): + * runtime/JSCell.h: + (JSCell): + * runtime/JSNameScope.cpp: + (JSC::JSNameScope::put): + * runtime/JSObject.cpp: + (JSC::JSObject::getOwnPropertySlotByIndex): + (JSC::JSObject::putByIndex): + (JSC::JSObject::ensureArrayStorageSlow): + (JSC::JSObject::deletePropertyByIndex): + (JSC::JSObject::getOwnPropertyNames): + (JSC::JSObject::putByIndexBeyondVectorLength): + (JSC::JSObject::putDirectIndexBeyondVectorLength): + (JSC::JSObject::getOwnPropertyDescriptor): + * runtime/JSObject.h: + (JSC::JSObject::canGetIndexQuickly): + (JSC::JSObject::getIndexQuickly): + (JSC::JSObject::tryGetIndexQuickly): + (JSC::JSObject::canSetIndexQuickly): + (JSC::JSObject::canSetIndexQuicklyForPutDirect): + (JSC::JSObject::setIndexQuickly): + (JSC::JSObject::initializeIndex): + (JSC::JSObject::hasSparseMap): + (JSC::JSObject::inSparseIndexingMode): + * runtime/JSScope.cpp: + (JSC::JSScope::isDynamicScope): + * runtime/JSSymbolTableObject.cpp: + (JSC::JSSymbolTableObject::putDirectVirtual): + * runtime/JSSymbolTableObject.h: + (JSSymbolTableObject): + * runtime/LiteralParser.cpp: + (JSC::::parse): + * runtime/RegExp.cpp: + (JSC::RegExp::compile): + (JSC::RegExp::compileMatchOnly): + * runtime/StructureTransitionTable.h: + (JSC::newIndexingType): + * tools/CodeProfile.cpp: + (JSC::CodeProfile::sample): + * yarr/YarrCanonicalizeUCS2.h: + (JSC::Yarr::getCanonicalPair): + (JSC::Yarr::areCanonicallyEquivalent): + * yarr/YarrInterpreter.cpp: + (JSC::Yarr::Interpreter::matchCharacterClass): + (JSC::Yarr::Interpreter::matchBackReference): + (JSC::Yarr::Interpreter::backtrackParenthesesTerminalEnd): + (JSC::Yarr::Interpreter::matchParentheses): + (JSC::Yarr::Interpreter::backtrackParentheses): + (JSC::Yarr::Interpreter::matchDisjunction): + * yarr/YarrJIT.cpp: + (JSC::Yarr::YarrGenerator::generateTerm): + (JSC::Yarr::YarrGenerator::backtrackTerm): + * yarr/YarrParser.h: + (JSC::Yarr::Parser::CharacterClassParserDelegate::assertionWordBoundary): + (JSC::Yarr::Parser::CharacterClassParserDelegate::atomBackReference): + * yarr/YarrPattern.cpp: + (JSC::Yarr::YarrPatternConstructor::atomCharacterClassBuiltIn): + +2013-01-23 Tony Chang <tony@chromium.org> + + Unreviewed, set svn:eol-style to CRLF on Windows .sln files. + + * JavaScriptCore.vcproj/JavaScriptCore.sln: Modified property svn:eol-style. + * JavaScriptCore.vcproj/JavaScriptCoreSubmit.sln: Modified property svn:eol-style. + +2013-01-23 Oliver Hunt <oliver@apple.com> + + Replace numerous manual CRASH's in JSC with RELEASE_ASSERT + https://bugs.webkit.org/show_bug.cgi?id=107726 + + Reviewed by Filip Pizlo. + + Fairly manual change from if (foo) CRASH(); to RELEASE_ASSERT(!foo); + + * assembler/MacroAssembler.h: + (JSC::MacroAssembler::branchAdd32): + (JSC::MacroAssembler::branchMul32): + * bytecode/CodeBlockHash.cpp: + (JSC::CodeBlockHash::CodeBlockHash): + * heap/BlockAllocator.h: + (JSC::Region::create): + (JSC::Region::createCustomSize): + * heap/GCAssertions.h: + * heap/HandleSet.cpp: + (JSC::HandleSet::visitStrongHandles): + (JSC::HandleSet::writeBarrier): + * heap/HandleSet.h: + (JSC::HandleSet::allocate): + * heap/Heap.cpp: + (JSC::Heap::collect): + * heap/SlotVisitor.cpp: + (JSC::SlotVisitor::validate): + * interpreter/Interpreter.cpp: + (JSC::Interpreter::execute): + * jit/ExecutableAllocator.cpp: + (JSC::DemandExecutableAllocator::allocateNewSpace): + (JSC::ExecutableAllocator::allocate): + * jit/ExecutableAllocator.h: + (JSC::roundUpAllocationSize): + * jit/ExecutableAllocatorFixedVMPool.cpp: + (JSC::FixedVMPoolExecutableAllocator::FixedVMPoolExecutableAllocator): + (JSC::ExecutableAllocator::allocate): + * runtime/ButterflyInlines.h: + (JSC::Butterfly::createUninitialized): + * runtime/Completion.cpp: + (JSC::evaluate): + * runtime/JSArray.h: + (JSC::constructArray): + * runtime/JSGlobalObject.cpp: + (JSC::slowValidateCell): + * runtime/JSObject.cpp: + (JSC::JSObject::enterDictionaryIndexingModeWhenArrayStorageAlreadyExists): + (JSC::JSObject::createArrayStorage): + * tools/TieredMMapArray.h: + (JSC::TieredMMapArray::append): + * yarr/YarrInterpreter.cpp: + (JSC::Yarr::Interpreter::allocDisjunctionContext): + (JSC::Yarr::Interpreter::allocParenthesesDisjunctionContext): + (JSC::Yarr::Interpreter::InputStream::readChecked): + (JSC::Yarr::Interpreter::InputStream::uncheckInput): + (JSC::Yarr::Interpreter::InputStream::atEnd): + (JSC::Yarr::Interpreter::interpret): + +2013-01-22 Filip Pizlo <fpizlo@apple.com> + + Convert CSE phase to not rely too much on NodeIndex + https://bugs.webkit.org/show_bug.cgi?id=107616 + + Reviewed by Geoffrey Garen. + + - Instead of looping over the graph (which assumes that you can simply loop over all + nodes without considering blocks first) to reset node.replacement, do that in the + loop that sets up relevantToOSR, just before running CSE on the block. + + - Instead of having a relevantToOSR bitvector indexed by NodeIndex, made + NodeRelevantToOSR be a NodeFlag. We had exactly one bit left in NodeFlags, so I did + some reshuffling to fit it in. + + * dfg/DFGCSEPhase.cpp: + (JSC::DFG::CSEPhase::CSEPhase): + (JSC::DFG::CSEPhase::eliminateIrrelevantPhantomChildren): + (JSC::DFG::CSEPhase::performNodeCSE): + (JSC::DFG::CSEPhase::performBlockCSE): + (CSEPhase): + * dfg/DFGNodeFlags.h: + (DFG): + * dfg/DFGNodeType.h: + (DFG): + +2013-01-21 Kentaro Hara <haraken@chromium.org> + + Implement UIEvent constructor + https://bugs.webkit.org/show_bug.cgi?id=107430 + + Reviewed by Adam Barth. + + Editor's draft: https://dvcs.w3.org/hg/d4e/raw-file/tip/source_respec.htm + + UIEvent constructor is implemented under a DOM4_EVENTS_CONSTRUCTOR flag, + which is enabled on Safari and Chromium for now. + + * Configurations/FeatureDefines.xcconfig: + +2013-01-22 Roger Fong <roger_fong@apple.com> + + Unreviewed VS2010 build fix following r140259. + + * JavaScriptCore.vcxproj/JavaScriptCore.vcxproj: + * JavaScriptCore.vcxproj/JavaScriptCore.vcxproj.filters: + +2013-01-22 Roger Fong <roger_fong@apple.com> + + JavaScriptCore property sheets, project files and modified build scripts. + https://bugs.webkit.org/show_bug.cgi?id=106987 + + Reviewed by Brent Fulgham. + + * JavaScriptCore.vcxproj: Added. + * JavaScriptCore.vcxproj/JavaScriptCore.resources: Added. + * JavaScriptCore.vcxproj/JavaScriptCore.resources/Info.plist: Added. + * JavaScriptCore.vcxproj/JavaScriptCore.vcxproj: Added. + * JavaScriptCore.vcxproj/JavaScriptCore.vcxproj.filters: Added. + * JavaScriptCore.vcxproj/JavaScriptCore.vcxproj.user: Added. + * JavaScriptCore.vcxproj/JavaScriptCoreCF.props: Added. + * JavaScriptCore.vcxproj/JavaScriptCoreCommon.props: Added. + * JavaScriptCore.vcxproj/JavaScriptCoreDebug.props: Added. + * JavaScriptCore.vcxproj/JavaScriptCoreExports.def: Added. + * JavaScriptCore.vcxproj/JavaScriptCoreGenerated.make: Added. + * JavaScriptCore.vcxproj/JavaScriptCoreGenerated.vcxproj: Added. + * JavaScriptCore.vcxproj/JavaScriptCoreGenerated.vcxproj.filters: Added. + * JavaScriptCore.vcxproj/JavaScriptCoreGenerated.vcxproj.user: Added. + * JavaScriptCore.vcxproj/JavaScriptCoreGeneratedCommon.props: Added. + * JavaScriptCore.vcxproj/JavaScriptCoreGeneratedDebug.props: Added. + * JavaScriptCore.vcxproj/JavaScriptCoreGeneratedRelease.props: Added. + * JavaScriptCore.vcxproj/JavaScriptCorePostBuild.cmd: Added. + * JavaScriptCore.vcxproj/JavaScriptCorePreBuild.cmd: Added. + * JavaScriptCore.vcxproj/JavaScriptCorePreLink.cmd: Added. + * JavaScriptCore.vcxproj/JavaScriptCoreRelease.props: Added. + * JavaScriptCore.vcxproj/LLInt.vcproj: Added. + * JavaScriptCore.vcxproj/LLInt.vcproj/LLIntAssembly: Added. + * JavaScriptCore.vcxproj/LLInt.vcproj/LLIntAssembly/LLIntAssembly.make: Added. + * JavaScriptCore.vcxproj/LLInt.vcproj/LLIntAssembly/LLIntAssembly.vcxproj: Added. + * JavaScriptCore.vcxproj/LLInt.vcproj/LLIntAssembly/LLIntAssembly.vcxproj.user: Added. + * JavaScriptCore.vcxproj/LLInt.vcproj/LLIntAssembly/build-LLIntAssembly.sh: Added. + * JavaScriptCore.vcxproj/LLInt.vcproj/LLIntDesiredOffsets: Added. + * JavaScriptCore.vcxproj/LLInt.vcproj/LLIntDesiredOffsets/LLIntDesiredOffsets.make: Added. + * JavaScriptCore.vcxproj/LLInt.vcproj/LLIntDesiredOffsets/LLIntDesiredOffsets.vcxproj: Added. + * JavaScriptCore.vcxproj/LLInt.vcproj/LLIntDesiredOffsets/LLIntDesiredOffsets.vcxproj.user: Added. + * JavaScriptCore.vcxproj/LLInt.vcproj/LLIntDesiredOffsets/build-LLIntDesiredOffsets.sh: Added. + * JavaScriptCore.vcxproj/LLInt.vcproj/LLIntOffsetsExtractor: Added. + * JavaScriptCore.vcxproj/LLInt.vcproj/LLIntOffsetsExtractor/LLIntOffsetsExtractor.vcxproj: Added. + * JavaScriptCore.vcxproj/LLInt.vcproj/LLIntOffsetsExtractor/LLIntOffsetsExtractor.vcxproj.user: Added. + * JavaScriptCore.vcxproj/LLInt.vcproj/LLIntOffsetsExtractor/LLIntOffsetsExtractorCommon.props: Added. + * JavaScriptCore.vcxproj/LLInt.vcproj/LLIntOffsetsExtractor/LLIntOffsetsExtractorDebug.props: Added. + * JavaScriptCore.vcxproj/LLInt.vcproj/LLIntOffsetsExtractor/LLIntOffsetsExtractorRelease.props: Added. + * JavaScriptCore.vcxproj/build-generated-files.sh: Added. + * JavaScriptCore.vcxproj/copy-files.cmd: Added. + * JavaScriptCore.vcxproj/jsc: Added. + * JavaScriptCore.vcxproj/jsc/jsc.vcxproj: Added. + * JavaScriptCore.vcxproj/jsc/jsc.vcxproj.filters: Added. + * JavaScriptCore.vcxproj/jsc/jsc.vcxproj.user: Added. + * JavaScriptCore.vcxproj/jsc/jscCommon.props: Added. + * JavaScriptCore.vcxproj/jsc/jscDebug.props: Added. + * JavaScriptCore.vcxproj/jsc/jscPostBuild.cmd: Added. + * JavaScriptCore.vcxproj/jsc/jscPreBuild.cmd: Added. + * JavaScriptCore.vcxproj/jsc/jscPreLink.cmd: Added. + * JavaScriptCore.vcxproj/jsc/jscRelease.props: Added. + * config.h: + +2013-01-22 Joseph Pecoraro <pecoraro@apple.com> + + [Mac] Enable Page Visibility (PAGE_VISIBILITY_API) + https://bugs.webkit.org/show_bug.cgi?id=107230 + + Reviewed by David Kilzer. + + * Configurations/FeatureDefines.xcconfig: + +2013-01-22 Tobias Netzel <tobias.netzel@googlemail.com> + + Yarr JIT isn't big endian compatible + https://bugs.webkit.org/show_bug.cgi?id=102897 + + Reviewed by Oliver Hunt. + + This patch was tested in the current mozilla codebase only and has passed the regexp tests there. + + * yarr/YarrJIT.cpp: + (JSC::Yarr::YarrGenerator::generatePatternCharacterOnce): + +2013-01-22 David Kilzer <ddkilzer@apple.com> + + Fix DateMath.cpp to compile with -Wshorten-64-to-32 + <http://webkit.org/b/107503> + + Reviewed by Darin Adler. + + * runtime/JSDateMath.cpp: + (JSC::parseDateFromNullTerminatedCharacters): Remove unneeded + static_cast<int>(). + +2013-01-22 Tim Horton <timothy_horton@apple.com> + + PDFPlugin: Build PDFPlugin everywhere, enable at runtime + https://bugs.webkit.org/show_bug.cgi?id=107117 + + Reviewed by Alexey Proskuryakov. + + Since PDFLayerController SPI is all forward-declared, the plugin should build + on all Mac platforms, and can be enabled at runtime. + + * Configurations/FeatureDefines.xcconfig: + +2013-01-21 Justin Schuh <jschuh@chromium.org> + + [CHROMIUM] Suppress c4267 build warnings for Win64 targets + https://bugs.webkit.org/show_bug.cgi?id=107499 + + Reviewed by Abhishek Arya. + + * JavaScriptCore.gyp/JavaScriptCore.gyp: + +2013-01-21 Dirk Schulze <dschulze@adobe.com> + + Add build flag for Canvas's Path object (disabled by default) + https://bugs.webkit.org/show_bug.cgi?id=107473 + + Reviewed by Dean Jackson. + + Add CANVAS_PATH build flag to build systems. + + * Configurations/FeatureDefines.xcconfig: + +2013-01-20 Geoffrey Garen <ggaren@apple.com> + + Weak GC maps should be easier to use + https://bugs.webkit.org/show_bug.cgi?id=107312 + + Reviewed by Sam Weinig. + + Follow-up fix. + + * runtime/PrototypeMap.cpp: + (JSC::PrototypeMap::emptyObjectStructureForPrototype): Restored this + ASSERT, which was disabled because of a bug in WeakGCMap. + + * runtime/WeakGCMap.h: + (JSC::WeakGCMap::add): We can't pass our passed-in value to add() because + a PassWeak() clears itself when passed to another function. So, we pass + nullptr instead, and fix things up afterwards. + +2013-01-20 Geoffrey Garen <ggaren@apple.com> + + Unreviewed. + + Temporarily disabling this ASSERT to get the bots green + while I investigate a fix. + + * runtime/PrototypeMap.cpp: + (JSC::PrototypeMap::emptyObjectStructureForPrototype): + +2013-01-20 Filip Pizlo <fpizlo@apple.com> + + Inserting a node into the DFG graph should not require five lines of code + https://bugs.webkit.org/show_bug.cgi?id=107381 + + Reviewed by Sam Weinig. + + This adds fairly comprehensive support for inserting a node into a DFG graph in one + method call. A common example of this is: + + m_insertionSet.insertNode(indexInBlock, DontRefChildren, DontRefNode, SpecNone, ForceOSRExit, codeOrigin); + + The arguments to insert() specify what reference counting you need to have happen + (RefChildren => recursively refs all children, RefNode => non-recursively refs the node + that was created), the prediction to set (SpecNone is a common default), followed by + the arguments to the Node() constructor. InsertionSet::insertNode() and similar methods + (Graph::addNode() and BasicBlock::appendNode()) all use a common variadic template + function macro from DFGVariadicFunction.h. Also, all of these methods will automatically + non-recursively ref() the node being created if the flags say NodeMustGenerate. + + In all, this new mechanism retains the flexibility of the old approach (you get to + manage ref counts yourself, albeit in less code) while ensuring that most code that adds + nodes to the graph now needs less code to do it. + + In the future, we should revisit the reference counting methodology in the DFG: we could + do like most compilers and get rid of it entirely, or we could make it automatic. This + patch doesn't attempt to make any such major changes, and only seeks to simplify the + technique we were already using (manual ref counting). + + * GNUmakefile.list.am: + * JavaScriptCore.xcodeproj/project.pbxproj: + * bytecode/Operands.h: + (JSC::dumpOperands): + * dfg/DFGAdjacencyList.h: + (AdjacencyList): + (JSC::DFG::AdjacencyList::kind): + * dfg/DFGArgumentsSimplificationPhase.cpp: + (JSC::DFG::ArgumentsSimplificationPhase::run): + * dfg/DFGBasicBlock.h: + (DFG): + (BasicBlock): + * dfg/DFGBasicBlockInlines.h: Added. + (DFG): + * dfg/DFGCFGSimplificationPhase.cpp: + (JSC::DFG::CFGSimplificationPhase::run): + (JSC::DFG::CFGSimplificationPhase::keepOperandAlive): + * dfg/DFGCommon.h: + * dfg/DFGConstantFoldingPhase.cpp: + (JSC::DFG::ConstantFoldingPhase::ConstantFoldingPhase): + (JSC::DFG::ConstantFoldingPhase::foldConstants): + (JSC::DFG::ConstantFoldingPhase::addStructureTransitionCheck): + (JSC::DFG::ConstantFoldingPhase::paintUnreachableCode): + (ConstantFoldingPhase): + * dfg/DFGFixupPhase.cpp: + (JSC::DFG::FixupPhase::FixupPhase): + (JSC::DFG::FixupPhase::fixupBlock): + (JSC::DFG::FixupPhase::fixupNode): + (FixupPhase): + (JSC::DFG::FixupPhase::checkArray): + (JSC::DFG::FixupPhase::blessArrayOperation): + (JSC::DFG::FixupPhase::injectInt32ToDoubleNode): + * dfg/DFGGraph.h: + (JSC::DFG::Graph::ref): + (Graph): + * dfg/DFGInsertionSet.h: + (DFG): + (JSC::DFG::Insertion::Insertion): + (JSC::DFG::Insertion::element): + (Insertion): + (JSC::DFG::InsertionSet::InsertionSet): + (JSC::DFG::InsertionSet::insert): + (InsertionSet): + (JSC::DFG::InsertionSet::execute): + * dfg/DFGNode.h: + (JSC::DFG::Node::Node): + (Node): + * dfg/DFGStructureCheckHoistingPhase.cpp: + (JSC::DFG::StructureCheckHoistingPhase::run): + * dfg/DFGVariadicFunction.h: Added. + +2013-01-19 Geoffrey Garen <ggaren@apple.com> + + Track inheritance structures in a side table, instead of using a private + name in each prototype + https://bugs.webkit.org/show_bug.cgi?id=107378 + + Reviewed by Sam Weinig and Phil Pizlo. + + This is a step toward object size inference. + + Using a side table frees us to use a more complex key (a pair of + prototype and expected inline capacity). + + It also avoids ruining inline caches for prototypes. (Adding a new private + name for a new inline capacity would change the prototype's structure, + possibly firing watchpoints, making inline caches go polymorphic, and + generally causing us to have a bad time.) + + * CMakeLists.txt: + * GNUmakefile.list.am: + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: + * JavaScriptCore.xcodeproj/project.pbxproj: + * Target.pri: Buildage. + + * runtime/ArrayPrototype.cpp: + (JSC::ArrayPrototype::finishCreation): Updated to use new side table API. + + * runtime/JSFunction.cpp: + (JSC::JSFunction::cacheInheritorID): Updated to use new side table API. + + (JSC::JSFunction::visitChildren): Fixed a long-standing bug where JSFunction + forgot to visit one of its data members (m_cachedInheritorID). This + wasn't a user-visible problem before because JSFunction would always + visit its .prototype property, which visited its m_cachedInheritorID. + But now, function.prototype only weakly owns function.m_cachedInheritorID. + + * runtime/JSGlobalData.h: + (JSGlobalData): Added the map, taking care to make sure that its + destructor would run after the heap destructor. + + * runtime/JSGlobalObject.cpp: + (JSC::JSGlobalObject::reset): Updated to use new side table API. + + * runtime/JSObject.cpp: + (JSC::JSObject::notifyPresenceOfIndexedAccessors): + (JSC::JSObject::setPrototype): + * runtime/JSObject.h: + (JSObject): Updated to use new side table API, and removed lots of code + that used to manage the per-object private name. + + * runtime/JSProxy.cpp: + (JSC::JSProxy::setTarget): + * runtime/ObjectConstructor.cpp: + (JSC::objectConstructorCreate): + * runtime/ObjectPrototype.cpp: + (JSC::ObjectPrototype::finishCreation): Updated to use new side table API. + + * runtime/PrototypeMap.cpp: Added. + (JSC): + (JSC::PrototypeMap::addPrototype): + (JSC::PrototypeMap::emptyObjectStructureForPrototype): + * runtime/PrototypeMap.h: Added. + (PrototypeMap): + (JSC::PrototypeMap::isPrototype): + (JSC::PrototypeMap::clearEmptyObjectStructureForPrototype): New side table. + This is a simple weak map, mapping an object to the structure you should + use when inheriting from that object. (In future, inline capacity will + be a part of the mapping.) + + I used two maps to preserve existing behavior that allowed us to speculate + about an object becoming a prototype, even if it wasn't one at the moment. + However, I suspect that behavior can be removed without harm. + + * runtime/WeakGCMap.h: + (JSC::WeakGCMap::contains): + (WeakGCMap): I would rate myself a 6 / 10 in C++. + +2013-01-18 Dan Bernstein <mitz@apple.com> + + Removed duplicate references to two headers in the project files. + + Rubber-stamped by Mark Rowe. + + * JavaScriptCore.xcodeproj/project.pbxproj: + +2013-01-18 Michael Saboff <msaboff@apple.com> + + Unreviewed build fix for building JSC with DFG_ENABLE_DEBUG_PROPAGATION_VERBOSE enabled in DFGCommon.h. + Fixes the case where the argument node in fixupNode is freed due to the Vector storage being reallocated. + + * dfg/DFGFixupPhase.cpp: + (JSC::DFG::FixupPhase::fixupNode): + +2013-01-18 Michael Saboff <msaboff@apple.com> + + Unreviewed build fix for release builds when DFG_ENABLE_DEBUG_PROPAGATION_VERBOSE is set to 1 in DFGCommon.h. + + * dfg/DFGCFAPhase.cpp: Added #include "Operations.h" + +2013-01-18 Michael Saboff <msaboff@apple.com> + + Change set r140201 broke editing/selection/move-by-word-visually-multi-line.html + https://bugs.webkit.org/show_bug.cgi?id=107340 + + Reviewed by Filip Pizlo. + + Due to the change landed in r140201, more nodes might end up + generating Int32ToDouble nodes. Therefore, changed the JSVALUE64 + constant path of compileInt32ToDouble() to use the more + restrictive isInt32Constant() check on the input. This check was + the same as the existing ASSERT() so the ASSERT was eliminated. + + * dfg/DFGSpeculativeJIT.cpp: + (JSC::DFG::SpeculativeJIT::compileInt32ToDouble): + +2013-01-18 Viatcheslav Ostapenko <sl.ostapenko@samsung.com> + + Weak GC maps should be easier to use + https://bugs.webkit.org/show_bug.cgi?id=107312 + + Reviewed by Ryosuke Niwa. + + Build fix for linux platforms after r140194. + + * runtime/WeakGCMap.h: + (WeakGCMap): + +2013-01-18 Michael Saboff <msaboff@apple.com> + + Harden ArithDiv of integers fix-up by inserting Int32ToDouble node directly + https://bugs.webkit.org/show_bug.cgi?id=107321 + + Reviewed by Filip Pizlo. + + Split out the Int32ToDouble node insertion from fixDoubleEdge() and used it directly when we're fixing up + an ArithDiv node with integer inputs and output for platforms that don't have integer division. + Since we are checking that our inputs should be ints, we can just insert the Int32ToDouble node + without any further checks. + + * dfg/DFGFixupPhase.cpp: + (JSC::DFG::FixupPhase::fixupNode): + (JSC::DFG::FixupPhase::fixDoubleEdge): + (FixupPhase): + (JSC::DFG::FixupPhase::injectInt32ToDoubleNode): + +2013-01-18 Michael Saboff <msaboff@apple.com> + + Fix up of ArithDiv nodes for non-x86 CPUs is broken + https://bugs.webkit.org/show_bug.cgi?id=107309 + + Reviewed by Filip Pizlo. + + Changed the logic so that we insert an Int32ToDouble node when the existing edge is not SpecDouble. + + * dfg/DFGFixupPhase.cpp: + (JSC::DFG::FixupPhase::fixDoubleEdge): + +2013-01-18 Dan Bernstein <mitz@apple.com> + + Tried to fix the build after r140194. + + * API/JSWrapperMap.mm: + (-[JSWrapperMap wrapperForObject:]): + +2013-01-18 Mark Hahnenberg <mhahnenberg@apple.com> + + Objective-C API: Update documentation for JSValue and JSContext + https://bugs.webkit.org/show_bug.cgi?id=107313 + + Reviewed by Geoffrey Garen. + + After changing the semantics of object lifetime we need to update the API documentation to reflect the new semantics. + + * API/APIJSValue.h: + * API/JSContext.h: + +2013-01-18 Balazs Kilvady <kilvadyb@homejinni.com> + + r134080 causes heap problem on linux systems where PAGESIZE != 4096 + https://bugs.webkit.org/show_bug.cgi?id=102828 + + Reviewed by Mark Hahnenberg. + + Make MarkStackSegment::blockSize as the capacity of segments of a MarkStackArray. + + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCoreExports.def: + * heap/MarkStack.cpp: + (JSC): + (JSC::MarkStackArray::MarkStackArray): + (JSC::MarkStackArray::expand): + (JSC::MarkStackArray::donateSomeCellsTo): + (JSC::MarkStackArray::stealSomeCellsFrom): + * heap/MarkStack.h: + (JSC::MarkStackSegment::data): + (CapacityFromSize): + (MarkStackArray): + * heap/MarkStackInlines.h: + (JSC::MarkStackArray::setTopForFullSegment): + (JSC::MarkStackArray::append): + (JSC::MarkStackArray::isEmpty): + (JSC::MarkStackArray::size): + * runtime/Options.h: + (JSC): + +2013-01-18 Geoffrey Garen <ggaren@apple.com> + + Weak GC maps should be easier to use + https://bugs.webkit.org/show_bug.cgi?id=107312 + + Reviewed by Sam Weinig. + + This patch changes WeakGCMap to not use a WeakImpl finalizer to remove + items from the map, and to instead have the map automatically remove + stale items itself upon insertion. This has a few advantages: + + (1) WeakGCMap is now compatible with all the specializations you would + use for HashMap. + + (2) There's no need for clients to write special finalization munging + functions. + + (3) Clients can specify custom value finalizers if they like. + + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCoreExports.def: Def! + + * API/JSWeakObjectMapRefPrivate.cpp: Setter no longer requires a global + data, since we've reduced interdependency. + + * heap/Handle.h: No more need to forward declare, since we've reduced + interdependency. + + * heap/Weak.h: + (Weak): Use explicit so we can assign directly to a weak map iterator + without ambiguity between Weak<T> and PassWeak<T>. + + * runtime/Structure.cpp: + (JSC::StructureTransitionTable::add): See above. + + * runtime/Structure.h: + (JSC): + * runtime/StructureTransitionTable.h: + (StructureTransitionTable): Bad code goes away, programmer happy. + + * runtime/WeakGCMap.h: + (JSC): + (WeakGCMap): + (JSC::WeakGCMap::WeakGCMap): + (JSC::WeakGCMap::set): + (JSC::WeakGCMap::add): + (JSC::WeakGCMap::find): + (JSC::WeakGCMap::contains): + (JSC::WeakGCMap::gcMap): + (JSC::WeakGCMap::gcMapIfNeeded): Inherit from HashMap and override any + function that might observe a Weak<T> that has died, just enough to + make such items appear as if they are not in the table. + +2013-01-18 Michael Saboff <msaboff@apple.com> + + Refactor isPowerOf2() and add getLSBSet() + https://bugs.webkit.org/show_bug.cgi?id=107306 + + Reviewed by Filip Pizlo. + + Moved implementation of isPowerOf2() to new hasOneBitSet() in wtf/MathExtras.h. + + * runtime/PropertyMapHashTable.h: + (JSC::isPowerOf2): + +2013-01-17 Mark Hahnenberg <mhahnenberg@apple.com> + + Objective-C API: Clean up JSValue.mm + https://bugs.webkit.org/show_bug.cgi?id=107163 + + Reviewed by Darin Adler. + + m_context is no longer weak, so there is now a lot of dead code in in JSValue.mm, and a wasted message send + on every API call. In the head of just about every method in JSValue.mm we're doing: + + JSContext *context = [self context]; + if (!context) + return nil; + + This is getting a retained copy of the context, which is no longer necessary now m_context is no longer weak. + We can just delete all these lines from all functions doing this, and where they were referring to the local + variable 'context', instead we can just access m_context directly. + + Since we're already going to be modifying most of JSValue.mm, we'll also do the following: + + 1) context @property is no longer weak – the context property is declared as: + + @property(readonly, weak) JSContext *context; + + This is really only informative (since we're not presently synthesizing the ivar), but it is now misleading. + We should change it to: + + @property(readonly, retain) JSContext *context; + + 2) the JSContext ivar and accessor can be automatically generated. Since we're no longer doing anything + special with m_context, we can just let the compiler handle the ivar for us. We'll delete: + + JSContext *m_context; + + and: + + - (JSContext *)context + { + return m_context; + + } + + and find&replace "m_context" to "_context" in JSValue.mm. + + * API/APIJSValue.h: + * API/JSValue.mm: + (-[JSValue toObject]): + (-[JSValue toBool]): + (-[JSValue toDouble]): + (-[JSValue toNumber]): + (-[JSValue toString]): + (-[JSValue toDate]): + (-[JSValue toArray]): + (-[JSValue toDictionary]): + (-[JSValue valueForProperty:]): + (-[JSValue setValue:forProperty:]): + (-[JSValue deleteProperty:]): + (-[JSValue hasProperty:]): + (-[JSValue defineProperty:descriptor:]): + (-[JSValue valueAtIndex:]): + (-[JSValue setValue:atIndex:]): + (-[JSValue isUndefined]): + (-[JSValue isNull]): + (-[JSValue isBoolean]): + (-[JSValue isNumber]): + (-[JSValue isString]): + (-[JSValue isObject]): + (-[JSValue isEqualToObject:]): + (-[JSValue isEqualWithTypeCoercionToObject:]): + (-[JSValue isInstanceOf:]): + (-[JSValue callWithArguments:]): + (-[JSValue constructWithArguments:]): + (-[JSValue invokeMethod:withArguments:]): + (-[JSValue objectForKeyedSubscript:]): + (-[JSValue setObject:forKeyedSubscript:]): + (-[JSValue initWithValue:inContext:]): + (-[JSValue dealloc]): + (-[JSValue description]): + +2013-01-17 Mark Hahnenberg <mhahnenberg@apple.com> + + Objective-C API: Clean up JSValue + https://bugs.webkit.org/show_bug.cgi?id=107156 + + Reviewed by Oliver Hunt. + + JSContext m_protectCounts, protect, unprotect are all now unnecessary overhead, and should all be removed. + These exist to handle the context going away before the value does; the context needs to be able to unprotect + values early. Since the value is now keeping the context alive there is no longer any danger of this happening; + instead we should just protect/unprotect the value in JSValue's init/dealloc methods. + + * API/JSContext.mm: + (-[JSContext dealloc]): + * API/JSContextInternal.h: + * API/JSValue.mm: + (-[JSValue initWithValue:inContext:]): + (-[JSValue dealloc]): + +2013-01-17 Filip Pizlo <fpizlo@apple.com> + + DFG Node::ref() and Node::deref() should not return bool, and should have postfixRef variants + https://bugs.webkit.org/show_bug.cgi?id=107147 + + Reviewed by Mark Hahnenberg. + + This small refactoring will enable a world where ref() returns Node*, which is useful for + https://bugs.webkit.org/show_bug.cgi?id=106868. Also, while this refactoring does lead to + slightly less terse code, it's also slightly more self-explanatory. I could never quite + remember what the meaning of the bool return from ref() and deref() was. + + * dfg/DFGGraph.cpp: + (JSC::DFG::Graph::collectGarbage): + * dfg/DFGGraph.h: + (JSC::DFG::Graph::ref): + (JSC::DFG::Graph::deref): + * dfg/DFGNode.h: + (JSC::DFG::Node::ref): + (Node): + (JSC::DFG::Node::postfixRef): + (JSC::DFG::Node::deref): + (JSC::DFG::Node::postfixDeref): + +2013-01-17 Alexey Proskuryakov <ap@apple.com> + + Added svn:ignore=*.pyc, so that ud_opcode.pyc and ud_optable.pyc don't show up + in svn stat. + + * disassembler/udis86: Added property svn:ignore. + +2013-01-16 Filip Pizlo <fpizlo@apple.com> + + DFG 32_64 backend doesn't check for hasArrayStorage() in NewArrayWithSize + https://bugs.webkit.org/show_bug.cgi?id=107081 + + Reviewed by Michael Saboff. + + This bug led to the 32_64 backend emitting contiguous allocation code to allocate + ArrayStorage arrays. This then led to all manner of heap corruption, since + subsequent array accesses would be accessing the contiguous array "as if" it was + an arraystorage array. + + * dfg/DFGSpeculativeJIT32_64.cpp: + (JSC::DFG::SpeculativeJIT::compile): + +2013-01-16 Jonathan Liu <net147@gmail.com> + + Add missing sys/mman.h include on Mac + https://bugs.webkit.org/show_bug.cgi?id=98089 + + Reviewed by Darin Adler. + + The madvise function and MADV_FREE constant require sys/mman.h. + + * jit/ExecutableAllocatorFixedVMPool.cpp: + +2013-01-15 Michael Saboff <msaboff@apple.com> + + DFG X86: division in the used-as-int case doesn't correctly check for -2^31/-1 + https://bugs.webkit.org/show_bug.cgi?id=106978 + + Reviewed by Filip Pizlo. + + Changed the numerator equal to -2^31 check to just return if we expect an integer + result, since the check is after we have determined that the denominator is -1. + The int result of -2^31 / -1 is -2^31, so just return the numerator as the result. + + * dfg/DFGSpeculativeJIT.cpp: + (JSC::DFG::SpeculativeJIT::compileIntegerArithDivForX86): + +2013-01-15 Levi Weintraub <leviw@chromium.org> + + Unreviewed, rolling out r139792. + http://trac.webkit.org/changeset/139792 + https://bugs.webkit.org/show_bug.cgi?id=106970 + + Broke the windows build. + + * bytecode/GlobalResolveInfo.h: Removed property svn:mergeinfo. + +2013-01-15 Pratik Solanki <psolanki@apple.com> + + Use MADV_FREE_REUSABLE to return JIT memory to OS + https://bugs.webkit.org/show_bug.cgi?id=106830 + <rdar://problem/11437701> + + Reviewed by Geoffrey Garen. + + Use MADV_FREE_REUSABLE to return JIT memory on OSes that have the underlying madvise bug + fixed. + + * jit/ExecutableAllocatorFixedVMPool.cpp: + (JSC::FixedVMPoolExecutableAllocator::notifyPageIsFree): + +2013-01-15 Levi Weintraub <leviw@chromium.org> + + Unreviewed, rolling out r139790. + http://trac.webkit.org/changeset/139790 + https://bugs.webkit.org/show_bug.cgi?id=106948 + + The patch is failing its own test. + + * bytecode/GlobalResolveInfo.h: Removed property svn:mergeinfo. + +2013-01-15 Zan Dobersek <zandobersek@gmail.com> + + [Autotools] Unify JavaScriptCore sources list, regardless of target OS + https://bugs.webkit.org/show_bug.cgi?id=106007 + + Reviewed by Gustavo Noronha Silva. + + Include the Source/JavaScriptCore/jit/ExecutableAllocatorFixedVMPool.cpp target + in the general sources list as it is guarded by the ENABLE_EXECUTABLE_ALLOCATOR_FIXED + feature define. This define is only used on 64-bit architecture and indirectly depends + on enabling either JIT or YARR JIT feature. Both of these defines are disabled on + Windows OS when using 64-bit architecture so there's no need to add this target to + sources only when the target OS is Windows. + + * GNUmakefile.list.am: + +2013-01-11 Filip Pizlo <fpizlo@apple.com> + + DFG should not forget that it had proved something to be a constant during a merge just because it's merging against the empty value + https://bugs.webkit.org/show_bug.cgi?id=106727 + + Reviewed by Oliver Hunt. + + The problem was this statement: + + if (m_value != other.m_value) + m_value = JSValue(); + + This is well-intentioned, in the sense that if we want our abstract value (i.e. this) to become the superset of the other + abstract value, and the two abstract values have proven different constants, then our abstract value should rescind its + claim that it has been proven to be constant. But this misses the special case that if the other abstract value is + completely clear (meaning that it wishes to contribute zero information and so the superset operation shouldn't change + this), it will have a clear m_value. So, the code prior to this patch would rescind the constant proof even though it + didn't have to. + + This comes up rarely and I don't believe it will be a performance win, but it is good to have the CFA been consistently + precise as often as possible. + + * dfg/DFGAbstractValue.h: + (JSC::DFG::AbstractValue::merge): + +2013-01-11 Filip Pizlo <fpizlo@apple.com> + + Python implementation reports "MemoryError" instead of doing things + https://bugs.webkit.org/show_bug.cgi?id=106690 + + Reviewed by Oliver Hunt. + + The bug was that the CFA was assuming that a variable is dead at the end of a basic block and hence doesn't need to + be merged to the next block if the last mention of the variable was dead. This is almost correct, except that it + doesn't work if the last mention is a GetLocal - the GetLocal itself may be dead, but that doesn't mean that the + variable is dead - it may still be live. The appropriate thing to do is to look at the GetLocal's Phi. If the + variable is used in the next block then the next block will have a reference to the last mention in our block unless + that last mention is a GetLocal, in which case it will link to the Phi. Doing it this way captures everything that + the CFA wants: if the last use is a live GetLocal then the CFA needs to consider the GetLocal itself for possible + refinements to the proof of the value in the variable, but if the GetLocal is dead, then this must mean that the + variable is not mentioned in the block but may still be "passed through" it, which is what the Phi will tell us. + Note that it is not possible for the GetLocal to refer to anything other than a Phi, and it is also not possible + for the last mention of a variable to be a dead GetLocal while there are other mentions that aren't dead - if + there had been SetLocals or GetLocals prior to the dead one then the dead one wouldn't have been emitted by the + parser. + + This also fixes a similar bug in the handling of captured variables. If a variable is captured, then it doesn't + matter if the last mention is dead, or not. Either way, we already know that a captured variable will be live in + the next block, so we must merge it no matter what. + + Finally, this change makes the output of Operands dumping a bit more verbose: it now prints the variable name next + to each variable's dump. I've often found the lack of this information confusing particularly for operand dumps + that involve a lot of variables. + + * bytecode/Operands.h: + (JSC::dumpOperands): + * dfg/DFGAbstractState.cpp: + (JSC::DFG::AbstractState::mergeStateAtTail): + +2013-01-14 Roger Fong <roger_fong@apple.com> + + Unreviewed. Fix vcproj file. Missing file tag after http://trac.webkit.org/changeset/139541. + + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: + +2013-01-13 Filip Pizlo <fpizlo@apple.com> + + DFG phases that store per-node information should store it in Node itself rather than using a secondary vector + https://bugs.webkit.org/show_bug.cgi?id=106753 + + Reviewed by Geoffrey Garen. + + * dfg/DFGAbstractState.cpp: + (JSC::DFG::AbstractState::AbstractState): + (JSC::DFG::AbstractState::beginBasicBlock): + (JSC::DFG::AbstractState::dump): + * dfg/DFGAbstractState.h: + (JSC::DFG::AbstractState::forNode): + (AbstractState): + * dfg/DFGCFGSimplificationPhase.cpp: + * dfg/DFGCSEPhase.cpp: + (JSC::DFG::CSEPhase::CSEPhase): + (JSC::DFG::CSEPhase::performSubstitution): + (JSC::DFG::CSEPhase::setReplacement): + (CSEPhase): + * dfg/DFGNode.h: + (Node): + +2013-01-12 Tim Horton <timothy_horton@apple.com> + + Unreviewed build fix. + + * API/JSBlockAdaptor.mm: + * API/JSContext.mm: + * API/JSValue.mm: + +2013-01-12 Csaba Osztrogonác <ossy@webkit.org> + + Unreviewed 64 bit buildfix after r139496. + + * dfg/DFGOperations.cpp: + +2013-01-11 Filip Pizlo <fpizlo@apple.com> + + Unreviewed, speculative build fix. + + * API/JSWrapperMap.mm: + +2013-01-10 Filip Pizlo <fpizlo@apple.com> + + JITThunks should not compile only because of luck + https://bugs.webkit.org/show_bug.cgi?id=105696 + + Rubber stamped by Sam Weinig and Geoffrey Garen. + + This patch was supposed to just move JITThunks into its own file. But then I + realized that there is a horrible circular dependency chain between JSCell, + JSGlobalData, CallFrame, and Weak, which only works because of magical include + order in JITStubs.h, and the fact that JSGlobalData.h includes JITStubs.h + before it includes JSCell or JSValue. + + I first tried to just get JITThunks.h to just magically do the same pointless + includes that JITStubs.h had, but then I decided to actually fix the underflying + problem, which was that JSCell needed CallFrame, CallFrame needed JSGlobalData, + JSGlobalData needed JITThunks, JITThunks needed Weak, and Weak needed JSCell. + Now, all of JSCell's outgoing dependencies are placed in JSCellInlines.h. This + also gave me an opportunity to move JSValue inline methods from JSCell.h into + JSValueInlines.h. But to make this really work, I needed to remove includes of + *Inlines.h from other headers (CodeBlock.h for example included JSValueInlines.h, + which defeats the whole entire purpose of having an Inlines.h file), and I needed + to add includes of *Inlines.h into a bunch of .cpp files. I did this mostly by + having .cpp files include Operations.h. In future, if you're adding a .cpp file + to JSC, you'll almost certainly have to include Operations.h unless you enjoy + link errors. + + * API/JSBase.cpp: + * API/JSCallbackConstructor.cpp: + * API/JSCallbackFunction.cpp: + * API/JSCallbackObject.cpp: + * API/JSClassRef.cpp: + * API/JSContextRef.cpp: + * API/JSObjectRef.cpp: + * API/JSScriptRef.cpp: + * API/JSWeakObjectMapRefPrivate.cpp: + * JSCTypedArrayStubs.h: + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: + * JavaScriptCore.xcodeproj/project.pbxproj: + * bytecode/ArrayAllocationProfile.cpp: + * bytecode/CodeBlock.cpp: + * bytecode/GetByIdStatus.cpp: + * bytecode/LazyOperandValueProfile.cpp: + * bytecode/ResolveGlobalStatus.cpp: + * bytecode/SpeculatedType.cpp: + * bytecode/UnlinkedCodeBlock.cpp: + * bytecompiler/BytecodeGenerator.cpp: + * debugger/Debugger.cpp: + * debugger/DebuggerActivation.cpp: + * debugger/DebuggerCallFrame.cpp: + * dfg/DFGArgumentsSimplificationPhase.cpp: + * dfg/DFGArrayMode.cpp: + * dfg/DFGByteCodeParser.cpp: + * dfg/DFGConstantFoldingPhase.cpp: + * dfg/DFGDriver.cpp: + * dfg/DFGFixupPhase.cpp: + * dfg/DFGGraph.cpp: + * dfg/DFGJITCompiler.cpp: + * dfg/DFGOSREntry.cpp: + * dfg/DFGOSRExitCompiler.cpp: + * dfg/DFGOSRExitCompiler32_64.cpp: + * dfg/DFGOSRExitCompiler64.cpp: + * dfg/DFGPredictionPropagationPhase.cpp: + * dfg/DFGSpeculativeJIT.cpp: + (JSC::DFG::SpeculativeJIT::silentSavePlanForGPR): + (DFG): + (JSC::DFG::SpeculativeJIT::silentSavePlanForFPR): + (JSC::DFG::SpeculativeJIT::silentSpill): + (JSC::DFG::SpeculativeJIT::silentFill): + * dfg/DFGSpeculativeJIT.h: + (SpeculativeJIT): + * dfg/DFGSpeculativeJIT32_64.cpp: + * dfg/DFGSpeculativeJIT64.cpp: + * dfg/DFGStructureCheckHoistingPhase.cpp: + * dfg/DFGVariableEventStream.cpp: + * heap/CopiedBlock.h: + * heap/CopiedSpace.cpp: + * heap/HandleSet.cpp: + * heap/Heap.cpp: + * heap/HeapStatistics.cpp: + * heap/SlotVisitor.cpp: + * heap/WeakBlock.cpp: + * interpreter/CallFrame.cpp: + * interpreter/CallFrame.h: + * jit/ClosureCallStubRoutine.cpp: + * jit/GCAwareJITStubRoutine.cpp: + * jit/JIT.cpp: + * jit/JITArithmetic.cpp: + * jit/JITArithmetic32_64.cpp: + * jit/JITCall.cpp: + * jit/JITCall32_64.cpp: + * jit/JITCode.h: + * jit/JITExceptions.cpp: + * jit/JITStubs.h: + * jit/JITThunks.h: + * jsc.cpp: + * llint/LLIntExceptions.cpp: + * profiler/LegacyProfiler.cpp: + * profiler/ProfileGenerator.cpp: + * profiler/ProfilerBytecode.cpp: + * profiler/ProfilerBytecodeSequence.cpp: + * profiler/ProfilerBytecodes.cpp: + * profiler/ProfilerCompilation.cpp: + * profiler/ProfilerCompiledBytecode.cpp: + * profiler/ProfilerDatabase.cpp: + * profiler/ProfilerOSRExit.cpp: + * profiler/ProfilerOSRExitSite.cpp: + * profiler/ProfilerOrigin.cpp: + * profiler/ProfilerOriginStack.cpp: + * profiler/ProfilerProfiledBytecodes.cpp: + * runtime/ArgList.cpp: + * runtime/Arguments.cpp: + * runtime/ArrayConstructor.cpp: + * runtime/BooleanConstructor.cpp: + * runtime/BooleanObject.cpp: + * runtime/BooleanPrototype.cpp: + * runtime/CallData.cpp: + * runtime/CodeCache.cpp: + * runtime/Completion.cpp: + * runtime/ConstructData.cpp: + * runtime/DateConstructor.cpp: + * runtime/DateInstance.cpp: + * runtime/DatePrototype.cpp: + * runtime/Error.cpp: + * runtime/ErrorConstructor.cpp: + * runtime/ErrorInstance.cpp: + * runtime/ErrorPrototype.cpp: + * runtime/ExceptionHelpers.cpp: + * runtime/Executable.cpp: + * runtime/FunctionConstructor.cpp: + * runtime/FunctionPrototype.cpp: + * runtime/GetterSetter.cpp: + * runtime/Identifier.cpp: + * runtime/InternalFunction.cpp: + * runtime/JSActivation.cpp: + * runtime/JSBoundFunction.cpp: + * runtime/JSCell.cpp: + * runtime/JSCell.h: + (JSC): + * runtime/JSCellInlines.h: Added. + (JSC): + (JSC::JSCell::JSCell): + (JSC::JSCell::finishCreation): + (JSC::JSCell::structure): + (JSC::JSCell::visitChildren): + (JSC::allocateCell): + (JSC::isZapped): + (JSC::JSCell::isObject): + (JSC::JSCell::isString): + (JSC::JSCell::isGetterSetter): + (JSC::JSCell::isProxy): + (JSC::JSCell::isAPIValueWrapper): + (JSC::JSCell::setStructure): + (JSC::JSCell::methodTable): + (JSC::JSCell::inherits): + (JSC::JSCell::fastGetOwnPropertySlot): + (JSC::JSCell::fastGetOwnProperty): + (JSC::JSCell::toBoolean): + * runtime/JSDateMath.cpp: + * runtime/JSFunction.cpp: + * runtime/JSFunction.h: + (JSC): + * runtime/JSGlobalData.h: + (JSC): + (JSGlobalData): + * runtime/JSGlobalObject.cpp: + * runtime/JSGlobalObjectFunctions.cpp: + * runtime/JSLock.cpp: + * runtime/JSNameScope.cpp: + * runtime/JSNotAnObject.cpp: + * runtime/JSONObject.cpp: + * runtime/JSObject.h: + (JSC): + * runtime/JSProxy.cpp: + * runtime/JSScope.cpp: + * runtime/JSSegmentedVariableObject.cpp: + * runtime/JSString.h: + (JSC): + * runtime/JSStringJoiner.cpp: + * runtime/JSSymbolTableObject.cpp: + * runtime/JSValue.cpp: + * runtime/JSValueInlines.h: + (JSC::JSValue::toInt32): + (JSC::JSValue::toUInt32): + (JSC): + (JSC::JSValue::isUInt32): + (JSC::JSValue::asUInt32): + (JSC::JSValue::asNumber): + (JSC::jsNaN): + (JSC::JSValue::JSValue): + (JSC::JSValue::encode): + (JSC::JSValue::decode): + (JSC::JSValue::operator bool): + (JSC::JSValue::operator==): + (JSC::JSValue::operator!=): + (JSC::JSValue::isEmpty): + (JSC::JSValue::isUndefined): + (JSC::JSValue::isNull): + (JSC::JSValue::isUndefinedOrNull): + (JSC::JSValue::isCell): + (JSC::JSValue::isInt32): + (JSC::JSValue::isDouble): + (JSC::JSValue::isTrue): + (JSC::JSValue::isFalse): + (JSC::JSValue::tag): + (JSC::JSValue::payload): + (JSC::JSValue::asInt32): + (JSC::JSValue::asDouble): + (JSC::JSValue::asCell): + (JSC::JSValue::isNumber): + (JSC::JSValue::isBoolean): + (JSC::JSValue::asBoolean): + (JSC::reinterpretDoubleToInt64): + (JSC::reinterpretInt64ToDouble): + (JSC::JSValue::isString): + (JSC::JSValue::isPrimitive): + (JSC::JSValue::isGetterSetter): + (JSC::JSValue::isObject): + (JSC::JSValue::getString): + (JSC::::getString): + (JSC::JSValue::getObject): + (JSC::JSValue::getUInt32): + (JSC::JSValue::toPrimitive): + (JSC::JSValue::getPrimitiveNumber): + (JSC::JSValue::toNumber): + (JSC::JSValue::toObject): + (JSC::JSValue::isFunction): + (JSC::JSValue::inherits): + (JSC::JSValue::toThisObject): + (JSC::JSValue::get): + (JSC::JSValue::put): + (JSC::JSValue::putByIndex): + (JSC::JSValue::structureOrUndefined): + (JSC::JSValue::equal): + (JSC::JSValue::equalSlowCaseInline): + (JSC::JSValue::strictEqualSlowCaseInline): + (JSC::JSValue::strictEqual): + * runtime/JSVariableObject.cpp: + * runtime/JSWithScope.cpp: + * runtime/JSWrapperObject.cpp: + * runtime/LiteralParser.cpp: + * runtime/Lookup.cpp: + * runtime/NameConstructor.cpp: + * runtime/NameInstance.cpp: + * runtime/NamePrototype.cpp: + * runtime/NativeErrorConstructor.cpp: + * runtime/NativeErrorPrototype.cpp: + * runtime/NumberConstructor.cpp: + * runtime/NumberObject.cpp: + * runtime/ObjectConstructor.cpp: + * runtime/ObjectPrototype.cpp: + * runtime/Operations.h: + (JSC): + * runtime/PropertySlot.cpp: + * runtime/RegExp.cpp: + * runtime/RegExpCache.cpp: + * runtime/RegExpCachedResult.cpp: + * runtime/RegExpConstructor.cpp: + * runtime/RegExpMatchesArray.cpp: + * runtime/RegExpObject.cpp: + * runtime/RegExpPrototype.cpp: + * runtime/SmallStrings.cpp: + * runtime/SparseArrayValueMap.cpp: + * runtime/StrictEvalActivation.cpp: + * runtime/StringConstructor.cpp: + * runtime/StringObject.cpp: + * runtime/StringRecursionChecker.cpp: + * runtime/Structure.h: + (JSC): + * runtime/StructureChain.cpp: + * runtime/TimeoutChecker.cpp: + * testRegExp.cpp: + +2013-01-11 Filip Pizlo <fpizlo@apple.com> + + If you use Phantom to force something to be live across an OSR exit, you should put it after the OSR exit + https://bugs.webkit.org/show_bug.cgi?id=106724 + + Reviewed by Oliver Hunt. + + In cases where we were getting it wrong, I think it was benign because we would either already have an + OSR exit prior to there, or the operand would be a constant. But still, it's good to get this right. + + * dfg/DFGByteCodeParser.cpp: + (JSC::DFG::ByteCodeParser::parseBlock): + +2013-01-11 Filip Pizlo <fpizlo@apple.com> + + Phantom(GetLocal) should be treated as relevant to OSR + https://bugs.webkit.org/show_bug.cgi?id=106715 + + Reviewed by Mark Hahnenberg. + + * dfg/DFGCSEPhase.cpp: + (JSC::DFG::CSEPhase::performBlockCSE): + +2013-01-11 Pratik Solanki <psolanki@apple.com> + + Fix function name typo ProgramExecutable::initalizeGlobalProperties() + https://bugs.webkit.org/show_bug.cgi?id=106701 + + Reviewed by Geoffrey Garen. + + * interpreter/Interpreter.cpp: + (JSC::Interpreter::execute): + * runtime/Executable.cpp: + (JSC::ProgramExecutable::initializeGlobalProperties): + * runtime/Executable.h: + +2013-01-11 Mark Hahnenberg <mhahnenberg@apple.com> + + testapi is failing with a block-related error in the Objc API + https://bugs.webkit.org/show_bug.cgi?id=106055 + + Reviewed by Filip Pizlo. + + Same bug as in testapi.mm. We need to actually call the static block, rather than casting the block to a bool. + + * API/ObjCCallbackFunction.mm: + (blockSignatureContainsClass): + +2013-01-11 Filip Pizlo <fpizlo@apple.com> + + Add a run-time option to print bytecode at DFG compile time + https://bugs.webkit.org/show_bug.cgi?id=106704 + + Reviewed by Mark Hahnenberg. + + * dfg/DFGByteCodeParser.cpp: + (JSC::DFG::ByteCodeParser::parseCodeBlock): + * runtime/Options.h: + (JSC): + +2013-01-11 Filip Pizlo <fpizlo@apple.com> + + It should be possible to enable verbose printing of each OSR exit at run-time (rather than compile-time) and it should print register state + https://bugs.webkit.org/show_bug.cgi?id=106700 + + Reviewed by Mark Hahnenberg. + + * dfg/DFGAssemblyHelpers.h: + (DFG): + (JSC::DFG::AssemblyHelpers::debugCall): + * dfg/DFGCommon.h: + * dfg/DFGOSRExit.h: + (DFG): + * dfg/DFGOSRExitCompiler32_64.cpp: + (JSC::DFG::OSRExitCompiler::compileExit): + * dfg/DFGOSRExitCompiler64.cpp: + (JSC::DFG::OSRExitCompiler::compileExit): + * dfg/DFGOperations.cpp: + * dfg/DFGOperations.h: + * runtime/Options.h: + (JSC): + +2013-01-11 Geoffrey Garen <ggaren@apple.com> + + Removed getDirectLocation and offsetForLocation and all their uses + https://bugs.webkit.org/show_bug.cgi?id=106692 + + Reviewed by Filip Pizlo. + + getDirectLocation() and its associated offsetForLocation() relied on + detailed knowledge of the rules of PropertyOffset, JSObject, and + Structure, which is a hard thing to reverse-engineer reliably. Luckily, + it wasn't needed, and all clients either wanted a true value or a + PropertyOffset. So, I refactored accordingly. + + * dfg/DFGOperations.cpp: Renamed putDirectOffset to putDirect, to clarify + that we are not putting an offset. + + * runtime/JSActivation.cpp: + (JSC::JSActivation::getOwnPropertySlot): Get a value instead of a value + pointer, since we never wanted a pointer to begin with. + + * runtime/JSFunction.cpp: + (JSC::JSFunction::getOwnPropertySlot): Use a PropertyOffset instead of a pointer, + so we don't have to reverse-engineer the offset from the pointer. + + * runtime/JSObject.cpp: + (JSC::JSObject::put): + (JSC::JSObject::resetInheritorID): + (JSC::JSObject::inheritorID): + (JSC::JSObject::removeDirect): + (JSC::JSObject::fillGetterPropertySlot): + (JSC::JSObject::getOwnPropertyDescriptor): Renamed getDirectOffset and + putDirectOffset, as explaind above. We want to use the name "getDirectOffset" + for when the thing you're getting is the offset. + + * runtime/JSObject.h: + (JSC::JSObject::getDirect): + (JSC::JSObject::getDirectOffset): Changed getDirectLocation to getDirectOffset, + since clients really wants PropertyOffsets and not locations. + + (JSObject::offsetForLocation): Removed this function because it was hard + to get right. + + (JSC::JSObject::putDirect): + (JSC::JSObject::putDirectUndefined): + (JSC::JSObject::inlineGetOwnPropertySlot): + (JSC::JSObject::putDirectInternal): + (JSC::JSObject::putDirectWithoutTransition): + * runtime/JSScope.cpp: + (JSC::executeResolveOperations): + (JSC::JSScope::resolvePut): + * runtime/JSValue.cpp: + (JSC::JSValue::putToPrimitive): Updated for renames. + + * runtime/Lookup.cpp: + (JSC::setUpStaticFunctionSlot): Use a PropertyOffset instead of a pointer, + so we don't have to reverse-engineer the offset from the pointer. + + * runtime/Structure.cpp: + (JSC::Structure::flattenDictionaryStructure): Updated for renames. + +2013-01-11 Geoffrey Garen <ggaren@apple.com> + + Removed an unused version of getDirectLocation + https://bugs.webkit.org/show_bug.cgi?id=106691 + + Reviewed by Gavin Barraclough. + + getDirectLocation is a weird operation. Removing the unused version is + the easy part. + + * runtime/JSObject.h: + (JSObject): + +2013-01-11 Mark Hahnenberg <mhahnenberg@apple.com> + + Objective-C objects that are passed to JavaScript leak (until the JSContext is destroyed) + https://bugs.webkit.org/show_bug.cgi?id=106056 + + Reviewed by Darin Adler. + + * API/APIJSValue.h: + * API/JSValue.mm: Make the reference to the JSContext strong. + (-[JSValue context]): + (-[JSValue initWithValue:inContext:]): + (-[JSValue dealloc]): + * API/JSWrapperMap.mm: Make the reference back from wrappers to Obj-C objects weak instead of strong. + Also add an explicit WeakGCMap in the JSWrapperMap rather than using Obj-C associated object API which + was causing memory leaks. + (wrapperClass): + (-[JSObjCClassInfo wrapperForObject:]): + (-[JSWrapperMap initWithContext:]): + (-[JSWrapperMap dealloc]): + (-[JSWrapperMap wrapperForObject:]): + +2013-01-11 Geoffrey Garen <ggaren@apple.com> + + Fixed some bogus PropertyOffset ASSERTs + https://bugs.webkit.org/show_bug.cgi?id=106686 + + Reviewed by Gavin Barraclough. + + The ASSERTs were passing a JSType instead of an inlineCapacity, due to + an incomplete refactoring. + + The compiler didn't catch this because both types are int underneath. + + * runtime/JSObject.h: + (JSC::JSObject::getDirect): + (JSC::JSObject::getDirectLocation): + (JSC::JSObject::offsetForLocation): + * runtime/Structure.cpp: + (JSC::Structure::addPropertyTransitionToExistingStructure): Validate against + our inline capacity, as we intended. + +2013-01-11 Geoffrey Garen <ggaren@apple.com> + + Rename propertyOffsetFor => offsetForPropertyNumber + https://bugs.webkit.org/show_bug.cgi?id=106685 + + Reviewed by Gavin Barraclough. + + Since the argument is just a typedef and not an object, I wanted to clarify the meaning. + + * runtime/PropertyMapHashTable.h: + (JSC::PropertyTable::nextOffset): Updated for rename. + + * runtime/PropertyOffset.h: + (JSC::offsetForPropertyNumber): Renamed. Also changed some PropertyOffset variables + to plain ints, because they're not actually on the PropertyOffsets number line. + + * runtime/Structure.cpp: + (JSC::Structure::flattenDictionaryStructure): + * runtime/Structure.h: + (JSC::Structure::lastValidOffset): Updated for rename. + +2013-01-10 Zan Dobersek <zandobersek@gmail.com> + + Remove the ENABLE_ANIMATION_API feature define occurences + https://bugs.webkit.org/show_bug.cgi?id=106544 + + Reviewed by Simon Fraser. + + The Animation API code was removed in r137243. The ENABLE_ANIMATION_API + feature define handling still lingers in various build systems and configurations + but is of no use, so it should be removed. + + * Configurations/FeatureDefines.xcconfig: + +2013-01-09 Roger Fong <roger_fong@apple.com> + + Unreviewed. Just move the JavaScriptCore exports file around in the vcproj to make things clearer. + + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: + +2013-01-09 Filip Pizlo <fpizlo@apple.com> + + Dont use a node reference after appending to the graph. + https://bugs.webkit.org/show_bug.cgi?id=103305 + <rdar://problem/12753096> + + Reviewed by Mark Hahnenberg. + + * dfg/DFGArgumentsSimplificationPhase.cpp: + (JSC::DFG::ArgumentsSimplificationPhase::run): + +2013-01-09 Roger Fong <roger_fong@apple.com> + + Rename export files to make them more easily findable. + https://bugs.webkit.org/show_bug.cgi?id=98695. + + Reviewed by Timothy Horton. + + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.def: Removed. + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCoreCommon.vsprops: + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCoreExports.def: Copied from Source/JavaScriptCore/JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.def. + +2013-01-09 Carlos Garcia Campos <cgarcia@igalia.com> + + Unreviewed. Fix make distcheck. + + * GNUmakefile.list.am: Add mips.rb to offlineasm_nosources. + +2013-01-08 Oliver Hunt <oliver@apple.com> + + Support op_typeof in the DFG + https://bugs.webkit.org/show_bug.cgi?id=98898 + + Reviewed by Filip Pizlo. + + Adds a TypeOf node to the DFG to support op_typeof. + + To avoid adding too much GC horror, this also makes the + common strings portion of the SmallString cache strongly + referenced. + + * dfg/DFGAbstractState.cpp: + (JSC::DFG::AbstractState::execute): + We try to determine the result early here, and substitute in a constant. + Otherwise we leave the node intact, and set the result type to SpecString. + * dfg/DFGByteCodeParser.cpp: + (JSC::DFG::ByteCodeParser::parseBlock): + Parse op_typeof + * dfg/DFGCSEPhase.cpp: + (JSC::DFG::CSEPhase::performNodeCSE): + TypeOf nodes can be subjected to pure CSE + * dfg/DFGCapabilities.h: + (JSC::DFG::canCompileOpcode): + We can handle typeof. + * dfg/DFGNodeType.h: + (DFG): + Define the node. + * dfg/DFGOperations.cpp: + * dfg/DFGOperations.h: + Add operationTypeOf to support the non-trivial cases. + * dfg/DFGPredictionPropagationPhase.cpp: + (JSC::DFG::PredictionPropagationPhase::propagate): + * dfg/DFGSpeculativeJIT32_64.cpp: + (JSC::DFG::SpeculativeJIT::compile): + * dfg/DFGSpeculativeJIT64.cpp: + (JSC::DFG::SpeculativeJIT::compile): + Actual codegen + * runtime/Operations.cpp: + (JSC::jsTypeStringForValue): + (JSC): + * runtime/Operations.h: + (JSC): + Some refactoring to allow us to get the type string for an + object without needing a callframe. + + +2013-01-08 Filip Pizlo <fpizlo@apple.com> + + DFG shouldn't treat the 'this' argument as being captured if a code block uses arguments + https://bugs.webkit.org/show_bug.cgi?id=106398 + <rdar://problem/12439776> + + Reviewed by Mark Hahnenberg. + + This is a possible optimization for inlined calls, and fixes crashes for inlined constructors, in the case + that the inlined code used arguments. The problem was that assuming that 'this' was captured implies the + assumption that it was initialized by the caller, which is wrong for constructors and this. + + Also added a pretty essential DFG IR validation rule: we shouldn't have any live locals at the top of the + root block. This helps to catch this bug: our assumption that 'this' was captured in an inlined constructor + that used arguments led to liveness for the temporary that would have held 'this' in the caller being + propagated all the way up to the entrypoint of the function. + + * bytecode/CodeBlock.h: + (JSC::CodeBlock::isCaptured): + * dfg/DFGValidate.cpp: + (JSC::DFG::Validate::validate): + (JSC::DFG::Validate::reportValidationContext): + (Validate): + (JSC::DFG::Validate::dumpGraphIfAppropriate): + +2013-01-08 Filip Pizlo <fpizlo@apple.com> + + REGRESSION (r138921): Crash in JSC::Arguments::create + https://bugs.webkit.org/show_bug.cgi?id=106329 + <rdar://problem/12974196> + + Reviewed by Mark Hahnenberg. + + Arguments::finishCreation() that takes an InlineCallFrame* needs to understand that the callee can + be unset, indicating that the callee needs to be loaded from the true call frame. This adds a + method to InlineCallFrame to do just that. + + * bytecode/CodeOrigin.cpp: + (JSC::InlineCallFrame::calleeForCallFrame): + * bytecode/CodeOrigin.h: + (InlineCallFrame): + * runtime/Arguments.h: + (JSC::Arguments::finishCreation): + +2013-01-08 Filip Pizlo <fpizlo@apple.com> + + DFG initrinsic handling should ensure that we backwards propagate the fact that all operands may escape + https://bugs.webkit.org/show_bug.cgi?id=106365 + + Reviewed by Mark Hahnenberg. + + Use the fact that Phantom means that things escaped, and just insert Phantoms for all + of the operands. + + * dfg/DFGByteCodeParser.cpp: + (JSC::DFG::ByteCodeParser::handleCall): + +2013-01-08 Filip Pizlo <fpizlo@apple.com> + + If array allocation profiling causes a new_array to allocate double arrays, then the holes should end up being correctly initialized + https://bugs.webkit.org/show_bug.cgi?id=106363 + + Reviewed by Mark Hahnenberg. + + * runtime/JSArray.h: + (JSC::JSArray::tryCreateUninitialized): + +2013-01-07 Filip Pizlo <fpizlo@apple.com> + + DFG should backwards-propagate NodeUsedAsValue for Phantom + https://bugs.webkit.org/show_bug.cgi?id=106299 + + Reviewed by Mark Hahnenberg. + + This is currently benign because Phantom is only inserted by the bytecode parser for + things that already happen to be used in contexts that backwards propagate + NodeUsedAsValue. But that doesn't change the fact that the semantics of Phantom are + that the value can be arbitrarily used by the baseline JIT. + + * dfg/DFGPredictionPropagationPhase.cpp: + (JSC::DFG::PredictionPropagationPhase::propagate): + +2013-01-07 Filip Pizlo <fpizlo@apple.com> + + Rationalize closure call heuristics and profiling + https://bugs.webkit.org/show_bug.cgi?id=106270 + + Reviewed by Oliver Hunt. + + Did a number of things: + + - CallLinkInfo now remembers if it was ever a closure call, and CallLinkStatus uses + this. Reduces the likelihood that we will inline a closure call as if it was a + normal call. + + - Made InlineCallFrame print inferred function names, and refactored + CodeBlock::inferredName() to better use FunctionExecutable's API. + + - Made bytecode dumping print frequent exit sites that led to recompilation. + + - Made bytecode dumping for op_call and op_construct print what the CallLinkStatus + saw. + + * bytecode/CallLinkInfo.h: + (JSC::CallLinkInfo::CallLinkInfo): + (CallLinkInfo): + * bytecode/CallLinkStatus.cpp: + (JSC::CallLinkStatus::computeFor): + * bytecode/CodeBlock.cpp: + (JSC::CodeBlock::inferredName): + (JSC::CodeBlock::dumpBytecodeCommentAndNewLine): + (JSC::CodeBlock::printCallOp): + * bytecode/CodeOrigin.cpp: + (JSC::CodeOrigin::dump): + (JSC::InlineCallFrame::inferredName): + (JSC): + (JSC::InlineCallFrame::dumpBriefFunctionInformation): + (JSC::InlineCallFrame::dump): + * bytecode/CodeOrigin.h: + (InlineCallFrame): + * bytecode/DFGExitProfile.cpp: + (JSC::DFG::ExitProfile::exitSitesFor): + (DFG): + * bytecode/DFGExitProfile.h: + (ExitProfile): + * jit/JITStubs.cpp: + (JSC::DEFINE_STUB_FUNCTION): + +2013-01-07 Ryosuke Niwa <rniwa@webkit.org> + + Sorted the xcodeproj file. + + * JavaScriptCore.xcodeproj/project.pbxproj: + +2013-01-07 Filip Pizlo <fpizlo@apple.com> + + Unreviewed, it should be possible to build JSC on ARM. + + * API/JSBase.h: + * jit/JITStubs.cpp: + (JSC::performPlatformSpecificJITAssertions): + (JSC): + * jit/JITStubs.h: + (JSC): + * jit/JITThunks.cpp: + (JSC::JITThunks::JITThunks): + * jit/JITThunks.h: + (JITThunks): + * offlineasm/armv7.rb: + * runtime/JSGlobalData.cpp: + (JSC::JSGlobalData::JSGlobalData): + +2013-01-07 Balazs Kilvady <kilvadyb@homejinni.com> + + MIPS LLInt implementation. + https://bugs.webkit.org/show_bug.cgi?id=99706 + + Reviewed by Filip Pizlo. + + LLInt implementation for MIPS. + + * assembler/MacroAssemblerMIPS.h: + (JSC::MacroAssemblerMIPS::jump): + * dfg/DFGOperations.cpp: + (JSC): + * jit/JITStubs.cpp: + (JSC): + * jit/JITStubs.h: + (JITStackFrame): + * llint/LLIntOfflineAsmConfig.h: + * llint/LowLevelInterpreter.asm: + * llint/LowLevelInterpreter32_64.asm: + * offlineasm/backends.rb: + * offlineasm/instructions.rb: + * offlineasm/mips.rb: Added. + +2013-01-07 Mark Hahnenberg <mhahnenberg@apple.com> + + testapi is failing with a block-related error in the Objc API + https://bugs.webkit.org/show_bug.cgi?id=106055 + + Reviewed by Geoffrey Garen. + + Casting a block to a bool will always return true, which isn't the behavior that is intended here. + Instead we need to call the block, but C semantics don't allow this, so we need to change + testapi.m to be Objective-C++ and therefore testapi.mm. + + * API/tests/testapi.m: Removed. + * API/tests/testapi.mm: Copied from Source/JavaScriptCore/API/tests/testapi.m. + (blockSignatureContainsClass): + * JavaScriptCore.xcodeproj/project.pbxproj: + +2013-01-06 Filip Pizlo <fpizlo@apple.com> + + Simplify slow case profiling + https://bugs.webkit.org/show_bug.cgi?id=106208 + + Reviewed by Mark Rowe. + + Removing the minimum execution ratio portion of slow case profiling, which allows + the removal of a field from CodeBlock. This appears to be performance neutral, + implying that the complexity incurred by the previous heuristic was purely + harmful: it made the code more complicated, and it made CodeBlock larger, without + resulting in any measurable benefits. + + * bytecode/CodeBlock.cpp: + (JSC::CodeBlock::CodeBlock): + * bytecode/CodeBlock.h: + (JSC::CodeBlock::likelyToTakeSlowCase): + (JSC::CodeBlock::couldTakeSlowCase): + (JSC::CodeBlock::likelyToTakeSpecialFastCase): + (JSC::CodeBlock::couldTakeSpecialFastCase): + (JSC::CodeBlock::likelyToTakeDeepestSlowCase): + (JSC::CodeBlock::likelyToTakeAnySlowCase): + * jit/JIT.cpp: + (JSC::JIT::privateCompile): + * runtime/Options.h: + +2013-01-05 Filip Pizlo <fpizlo@apple.com> + + DFG should inline closure calls + https://bugs.webkit.org/show_bug.cgi?id=106067 + + Reviewed by Gavin Barraclough. + + This adds initial support for inlining closure calls to the DFG. A call is considered + to be a closure call when the JSFunction* varies, but always has the same executable. + We already have closure call inline caching in both JITs, which works by checking that + the callee has an expected structure (as a cheap way of detecting that it is in fact + a JSFunction) and an expected executable. Closure call inlining uses profiling data + aggregated by CallLinkStatus to decide when to specialize the call to the particular + structure/executable, and inline the call rather than emitting a call sequence. When + we choose to do a closure inline rather than an ordinary inline, a number of things + change about how inlining is performed: + + - The inline is guarded by a CheckStructure/CheckExecutable rather than a + CheckFunction. + + - Instead of propagating a constant value for the scope, we emit GetMyScope every time + that the scope is needed, which loads the scope from a local variable. We do similar + things for the callee. + + - The prologue of the inlined code includes SetMyScope and SetCallee nodes to eagerly + plant the scope and callee into the "true call frame", i.e. the place on the stack + where the call frame would have been if the call had been actually performed. This + allows GetMyScope/GetCallee to work as they would if the code wasn't inlined. It + also allows for trivial handling of scope and callee for call frame reconstruction + upon stack introspection and during OSR. + + - A new node called GetScope is introduced, which just gets the scope of a function. + This node has the expected CSE support. This allows for the + SetMyScope(GetScope(@function)) sequence to set up the scope in the true call frame. + + - GetMyScope/GetCallee CSE can match against SetMyScope/SetCallee, which means that + the GetMyScope/GetCallee nodes emitted during parsing are often removed during CSE, + if we can prove that it is safe to do so. + + - Inlining heuristics are adjusted to grok the cost of inlining a closure. We are + less likely to inline a closure call than we are to inline a normal call, since we + end up emitting more code for closures due to CheckStructure, CheckExecutable, + GetScope, SetMyScope, and SetCallee. + + Additionally, I've fixed the VariableEventStream to ensure that we don't attempt to + plant Undefined into the true call frames. This was previously a harmless oversight, + but it becomes quite bad if OSR is relying on the scope/callee already having been + set and not subsequently clobbered by the OSR itself. + + This is a ~60% speed-up on programs that frequently make calls to closures. It's + neutral on V8v7 and other major benchmark suites. + + The lack of a definite speed-up is likely due the fact that closure inlining currently + does not do any cardinality [1] optimizations. We don't observe when a closure was + constructed within its caller, and so used the scope from its caller; and furthermore + we have no facility to detect when the scope is single. All scoped variable accesses + are assumed to be multiple instead. A subsequent step will be to ensure that closure + call inlining will be single and loving it. + + [1] Single and loving it: Must-alias analysis for higher-order languages. Suresh + Jagannathan, Peter Thiemann, Stephen Weeks, and Andrew Wright. In POPL '98. + + * bytecode/CallLinkStatus.cpp: + (JSC::CallLinkStatus::dump): + * bytecode/CallLinkStatus.h: + (JSC::CallLinkStatus::isClosureCall): + (CallLinkStatus): + * bytecode/CodeBlock.cpp: + (JSC::CodeBlock::globalObjectFor): + (JSC): + * bytecode/CodeBlock.h: + (CodeBlock): + * bytecode/CodeOrigin.cpp: + (JSC::InlineCallFrame::dump): + * dfg/DFGAbstractState.cpp: + (JSC::DFG::AbstractState::execute): + * dfg/DFGByteCodeParser.cpp: + (ByteCodeParser): + (JSC::DFG::ByteCodeParser::handleCall): + (JSC::DFG::ByteCodeParser::emitFunctionChecks): + (JSC::DFG::ByteCodeParser::handleInlining): + * dfg/DFGCSEPhase.cpp: + (JSC::DFG::CSEPhase::pureCSE): + (CSEPhase): + (JSC::DFG::CSEPhase::getCalleeLoadElimination): + (JSC::DFG::CSEPhase::checkExecutableElimination): + (JSC::DFG::CSEPhase::getMyScopeLoadElimination): + (JSC::DFG::CSEPhase::performNodeCSE): + * dfg/DFGCapabilities.cpp: + (JSC::DFG::mightInlineFunctionForClosureCall): + * dfg/DFGCapabilities.h: + (DFG): + (JSC::DFG::mightInlineFunctionForClosureCall): + (JSC::DFG::canInlineFunctionForClosureCall): + (JSC::DFG::canInlineFunctionFor): + * dfg/DFGNode.h: + (Node): + (JSC::DFG::Node::hasExecutable): + (JSC::DFG::Node::executable): + * 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): + * dfg/DFGVariableEventStream.cpp: + (JSC::DFG::VariableEventStream::reconstruct): + * runtime/Options.h: + (JSC): + +2013-01-05 Filip Pizlo <fpizlo@apple.com> + + Data flow paths that carry non-numbers, non-undefined, non-null values should not cause subtractions and arithmetic additions (i.e. ++) to speculate double + https://bugs.webkit.org/show_bug.cgi?id=106190 + + Reviewed by Sam Weinig. + + The problem is that the DFG logic for deciding when to speculate integer was + confusing the special case of ValueAdd (where non-numeric values should cause us + to not speculate integer, because we want to fall off into the generic case) with + the more normal case of ArithAdd and ArithSub (where we want to speculate integer + unless we have evidence that the operands are doubles, since the DFG doesn't have + generic handling of non-numeric arithmetic). Prior to this change doing a - b where + either a or b were possibly non-numeric would always force the subtraction to be + done using doubles. + + * dfg/DFGGraph.h: + (JSC::DFG::Graph::addSpeculationMode): + (Graph): + (JSC::DFG::Graph::valueAddSpeculationMode): + (JSC::DFG::Graph::arithAddSpeculationMode): + (JSC::DFG::Graph::addImmediateShouldSpeculateInteger): + +2013-01-04 Filip Pizlo <fpizlo@apple.com> + + DFG should trust array profiling over value profiling + https://bugs.webkit.org/show_bug.cgi?id=106155 + + Reviewed by Gavin Barraclough. + + The real problem is that prediction propagation is not flow-sensitive. We had code + like: + + var a = (some load from memory); // returns either an array or false + if (a) + a[i] = v; + + Because 'a' could be 'false', we were emitting a fully generic unoptimized PutByVal. + This patch changes ArrayMode to ignore the type of the base of an array access, if + array profiling tells us that the array access can be optimized. + + In the future, we could probably make this work even better with some flow + sensitivity in the prediction propagator, but I also tend to think that this is a + more robust overall solution. If we ever did want to support array accesses on + array-or-false then we should change the array profiler to be able to tell us that + this is what is going on. + + 3.7% speed-up on V8/earley. + + * dfg/DFGArrayMode.cpp: + (JSC::DFG::ArrayMode::refine): + +2013-01-04 Filip Pizlo <fpizlo@apple.com> + + Rationalize exit site profiling for calls + https://bugs.webkit.org/show_bug.cgi?id=106150 + + Reviewed by Sam Weinig. + + This adds two new exit kinds for calls: BadFunction and BadExecutable. The latter is not used + yet, but is already integrated with profiling. CheckFunction uses a BadFunction speculation + instead of BadCache, now. This allows CallLinkStatus to turn itself into a closure call status + if we had a BadFunction exit site but the CallLinkInfo told us to use a non-closure call. This + might happen if we had call unlinking that led to information loss along the way. + + No performance impact. This is meant as another step towards inlining closure calls. + + * bytecode/CallLinkStatus.cpp: + * bytecode/CallLinkStatus.h: + (JSC::CallLinkStatus::setIsProved): + (JSC::CallLinkStatus::setHasBadFunctionExitSite): + (CallLinkStatus): + (JSC::CallLinkStatus::setHasBadCacheExitSite): + (JSC::CallLinkStatus::setHasBadExecutableExitSite): + * bytecode/ExitKind.cpp: + (JSC::exitKindToString): + * bytecode/ExitKind.h: + * dfg/DFGByteCodeParser.cpp: + (JSC::DFG::ByteCodeParser::handleCall): + * dfg/DFGSpeculativeJIT32_64.cpp: + (JSC::DFG::SpeculativeJIT::compile): + * dfg/DFGSpeculativeJIT64.cpp: + (JSC::DFG::SpeculativeJIT::compile): + +2013-01-03 Filip Pizlo <fpizlo@apple.com> + + DFG should not elide CheckStructure if it's needed to perform a cell check + https://bugs.webkit.org/show_bug.cgi?id=106074 + + Reviewed by Ryosuke Niwa. + + The problem here was that the constant folding phase was misinterpreting the meaning of the sets + in DFG::AbstractValue. AbstractValue describes a constraint on the values that a variable (i.e. + a DFG Node, or a virtual register, i.e. local or argument) may have. It does so by containing + four sets: the set of JSValues (either empty, the singleton set containing one JSValue, or the + set of all JSValues); the set of "current known" structures, i.e. the set of structures that you + already know that this value may have right now (also either empty, the singleton set, or the set + of all structures); the set of "future possible" structures, i.e. the set of structures that this + value could have in the future if none of the structure transition watchpoints for those + structures had fired (also empty, singleton, or all); and the set of types, which is a + SpeculatedType bitmask. The correct way to interpret the sets is to think of the AbstractValue as + the intersection of these three sets of values: + + - The set of JSValues that have a type that belongs to the m_type set. + - If m_value is not the empty value then: the set of all JSValues that are == m_value; + else: the set of all JSValues. + where '==' is as defined by JSValue::operator==. + - Union of { the set of all cells that have a structure that belongs to m_currentKnownStructure } + and { the set of all JSValues that are not cells }. + + You can then further intersect this set with the following set, if you guard the code with + watchpoints on all structures in the m_futurePossibleStructure: + + - Union of { the set of all cells that have a structure that belongs to m_futurePossibleStructure } + and { the set of all JSValues that are not cells }. + + One way to think of this is that m_currentKnownStructure is filtered by m_futurePossibleStructure + (i.e. is set to the intersection of m_currentKnownStructure and m_futurePossibleStructure), if the + code for which you're doing this is always preceded by watchpoints on all structures in + m_futurePossibleStructure, and is always before any side-effects that could change the structures + of objects. + + The incorrect optimization related to CheckStructure. CheckStructure checks that the value is a + cell, and that it has a particular structure. It was incorrectly assuming that you could eliminate + the CheckStructure, if m_currentKnownStructure contained the structure that CheckStructure was + checking. But this is not the case, since m_currentKnownStructure does not prove that the value is + a cell with a particular structure; it only proves that if the value was a cell then it would have + a particular structure. Hence, to eliminate CheckStructure, it is also necessary to check that + AbstractValue::m_type contains only cells (i.e. isCellSpeculation(m_type) == true). + + It wasn't doing that, and this changes makes sure that it does do that. + + * dfg/DFGConstantFoldingPhase.cpp: + (JSC::DFG::ConstantFoldingPhase::foldConstants): + +2013-01-04 Adam Klein <adamk@chromium.org> + + Remove ENABLE_MUTATION_OBSERVERS #define + https://bugs.webkit.org/show_bug.cgi?id=105459 + + Reviewed by Ryosuke Niwa. + + * Configurations/FeatureDefines.xcconfig: + +2013-01-03 Filip Pizlo <fpizlo@apple.com> + + DFG::ByteCodeCache serves little or no purpose ever since we decided to keep bytecode around permanently + https://bugs.webkit.org/show_bug.cgi?id=106058 + + Reviewed by Michael Saboff. + + All baseline code blocks now always have bytecode, so the bytecode cache's ability to minimize the + number of times that the DFG produces bytecode sequences for code blocks is superfluous. + + * GNUmakefile.list.am: + * JavaScriptCore.xcodeproj/project.pbxproj: + * dfg/DFGByteCodeCache.h: Removed. + * dfg/DFGByteCodeParser.cpp: + (ByteCodeParser): + (JSC::DFG::ByteCodeParser::handleInlining): + * runtime/Executable.cpp: + (JSC): + * runtime/Executable.h: + (FunctionExecutable): + +2013-01-03 Filip Pizlo <fpizlo@apple.com> + + Unreviewed, fix build for DFG JIT disabled. + + * bytecode/CodeBlock.cpp: + (JSC::CodeBlock::dumpValueProfiling): + (JSC::CodeBlock::dumpArrayProfiling): + * runtime/Executable.cpp: + (JSC): + (JSC::ExecutableBase::intrinsic): + +2013-01-03 Filip Pizlo <fpizlo@apple.com> + + CallLinkStatus should be aware of closure calls, and the DFG bytecode parser should use that as its sole internal notion of how to optimize calls + https://bugs.webkit.org/show_bug.cgi?id=106027 + + Reviewed by Mark Hahnenberg. + + Previously, the DFG bytecode parser had its own internal notion of exactly what CallLinkStatus was + meant to do, in the form of a CallType, expectedFunction, intrinsic, etc. This change makes CallLinkStatus + smart enough to do all of that, and also gives it the ability to understand closure calls. + + * bytecode/CallLinkStatus.cpp: + (JSC::CallLinkStatus::CallLinkStatus): + (JSC): + (JSC::CallLinkStatus::function): + (JSC::CallLinkStatus::internalFunction): + (JSC::CallLinkStatus::intrinsicFor): + (JSC::CallLinkStatus::setIsProved): + (JSC::CallLinkStatus::computeFromLLInt): + (JSC::CallLinkStatus::computeFor): + (JSC::CallLinkStatus::dump): + * bytecode/CallLinkStatus.h: + (JSC): + (JSC::CallLinkStatus::CallLinkStatus): + (CallLinkStatus): + (JSC::CallLinkStatus::takesSlowPath): + (JSC::CallLinkStatus::isSet): + (JSC::CallLinkStatus::isClosureCall): + (JSC::CallLinkStatus::callTarget): + (JSC::CallLinkStatus::executable): + (JSC::CallLinkStatus::structure): + (JSC::CallLinkStatus::isProved): + (JSC::CallLinkStatus::canOptimize): + * dfg/DFGByteCodeParser.cpp: + (JSC::DFG::ByteCodeParser::handleCall): + * dfg/DFGGraph.h: + (JSC::DFG::Graph::valueOfFunctionConstant): + +2013-01-02 Simon Hausmann <simon.hausmann@digia.com> + + [MinGW-w64] Centralize workaround for pow() implementation + https://bugs.webkit.org/show_bug.cgi?id=105925 + + Reviewed by Sam Weinig. + + As suggested by Sam, move the MinGW-w64 workaround into MathExtras.h + away from the JSC usage. + + * runtime/MathObject.cpp: + (JSC::mathPow): + +2013-01-02 Gavin Barraclough <barraclough@apple.com> + + Objective-C API for JavaScriptCore + https://bugs.webkit.org/show_bug.cgi?id=105889 + + Reviewed by Geoff Garen. + + Fixes for more issues raised by Darin. + + * API/JSBlockAdaptor.mm: + (BlockArgument): + (BlockArgumentStruct::BlockArgumentStruct): + (BlockArgumentTypeDelegate::typeStruct): + (BlockResult): + (BlockResultStruct::BlockResultStruct): + (buildBlockSignature): + (-[JSBlockAdaptor initWithBlockSignatureFromProtocol:]): + (-[JSBlockAdaptor blockFromValue:inContext:withException:]): + - fix * position for Objective-C types + * API/JSContext.h: + - fix * position for Objective-C types + * API/JSContext.mm: + (-[JSContext initWithVirtualMachine:]): + (-[JSContext virtualMachine]): + (contextInternalContext): + - fix * position for Objective-C types + (-[JSContext dealloc]): + (-[JSContext protect:]): + (-[JSContext unprotect:]): + - HashMap<JSValueRef, size_t> -> HashCountedSet<JSValueRef> + * API/JSContextInternal.h: + (WeakContextRef): + - fix * position for Objective-C types + * API/JSValue.mm: + (valueToString): + - fix * position for Objective-C types + (isNSBoolean): + - Added helper to check for booleans. + (objectToValueWithoutCopy): + - Added contextRef + - fix * position for Objective-C types + - Remove @YES, @NO literal usage, use isNSBoolean instead + (objectToValue): + - Added contextRef + (+[JSValue valueWithValue:inContext:]): + (-[JSValue initWithValue:inContext:]): + - fix * position for Objective-C types + (createStructHandlerMap): + (handerForStructTag): + - getStructTagHandler -> handerForStructTag + - Split out createStructHandlerMap + - strncmp -> memcmp + - String(type).impl() -> StringImpl::create(type) + (+[JSValue selectorForStructToValue:]): + (+[JSValue selectorForValueToStruct:]): + - getStructTagHandler -> handerForStructTag + (typeToValueInvocationFor): + (valueToTypeInvocationFor): + - fix * position for Objective-C types + * API/JSValueInternal.h: + - fix * position for Objective-C types + * API/JSVirtualMachineInternal.h: + - fix * position for Objective-C types + * API/JSWrapperMap.h: + - fix * position for Objective-C types + * API/JSWrapperMap.mm: + (selectorToPropertyName): + (createObjectWithCustomBrand): + (createRenameMap): + (putNonEnumerable): + (copyMethodsToObject): + (copyPrototypeProperties): + (-[JSObjCClassInfo initWithContext:forClass:superClassInfo:]): + (-[JSWrapperMap initWithContext:]): + (-[JSWrapperMap wrapperForObject:]): + (getJSExportProtocol): + - fix * position for Objective-C types + * API/ObjCCallbackFunction.h: + - fix * position for Objective-C types + * API/ObjCCallbackFunction.mm: + (CallbackArgument): + (CallbackArgumentStruct::CallbackArgumentStruct): + - fix * position for Objective-C types + (CallbackArgumentBlockCallback::createAdoptingJSBlockAdaptor): + - Added to make adopt explicit + (CallbackArgumentBlockCallback): + (CallbackArgumentBlockCallback::CallbackArgumentBlockCallback): + (ArgumentTypeDelegate::typeBlock): + - Call createAdoptingJSBlockAdaptor + (ArgumentTypeDelegate::typeStruct): + (CallbackResult): + (CallbackResultStruct::CallbackResultStruct): + (ResultTypeDelegate::typeStruct): + (ObjCCallbackFunction::ObjCCallbackFunction): + (ObjCCallbackFunction::context): + (objCCallbackFunctionForInvocation): + (objCCallbackFunctionForMethod): + (objCCallbackFunctionForBlock): + - fix * position for Objective-C types + * API/ObjcRuntimeExtras.h: + (protocolImplementsProtocol): + (forEachProtocolImplementingProtocol): + (forEachMethodInProtocol): + (forEachPropertyInProtocol): + - fix * position for Objective-C types + * API/tests/testapi.m: + (-[TestObject testArgumentTypesWithInt:double:boolean:string:number:array:dictionary:]): + (testObjectiveCAPI): + - fix * position for Objective-C types + +2013-01-02 Geoffrey Garen <ggaren@apple.com> + + Some renaming in the CodeCache + https://bugs.webkit.org/show_bug.cgi?id=105966 + + Reviewed by Gavin Barraclough. + + CodeBlockKey => SourceCodeKey because the key is not a CodeBlock. + + m_recentlyUsedFunctionCode => m_recentlyUsedFunctions to match other names. + + GlobalFunctionKey => FunctionKey because the key is not unique to globalness. + + m_cachedGlobalFunctions => m_globalFunctions because "cached" is redundant + for data members in an object called "CodeCache". + + kMaxRootCodeBlockEntries => kMaxRootEntries because there are no non-CodeBlock + entries in a CodeBlock cache. + + kMaxFunctionCodeBlocks => kMaxChildFunctionEntries to clarify that this + number models a parent-child relationship. + + Also removed the initial "k" from enum constants. That's an interesting + style for calling out constants, but it's not the WebKit style. + + Finally, a behavior change: Use MaxRootEntries for the limit on global + functions, and not MaxChildFunctionEntries. Previously, there was an + unused constant that seemed to have been intended for this purpose. + + * runtime/CodeCache.cpp: + (JSC::CodeCache::makeSourceCodeKey): + (JSC::CodeCache::getCodeBlock): + (JSC::CodeCache::generateFunctionCodeBlock): + (JSC::CodeCache::makeFunctionKey): + (JSC::CodeCache::getFunctionExecutableFromGlobalCode): + (JSC::CodeCache::usedFunctionCode): + * runtime/CodeCache.h: + (JSC::CodeCache::clear): + +2013-01-02 Filip Pizlo <fpizlo@apple.com> + + DFG inlining machinery should be robust against the inline callee varying while the executable stays the same + https://bugs.webkit.org/show_bug.cgi?id=105953 + + Reviewed by Mark Hahnenberg. + + This institutes the policy that if InlineCallFrame::callee is null, then the callee and scope have already + been stored into the true call frame (i.e. the place where the call frame of the inlined call would have + been) and so any attempt to access the callee or scope should do a load instead of assuming that the value + is constant. This wires the changes through the bytecode parser, the stack scanning logic, and the compiler + optimization phases and backends. + + * bytecode/CodeOrigin.cpp: + (JSC::InlineCallFrame::dump): + * bytecode/CodeOrigin.h: + (CodeOrigin): + (InlineCallFrame): + (JSC::InlineCallFrame::isClosureCall): + (JSC::CodeOrigin::stackOffset): + (JSC): + * dfg/DFGAssemblyHelpers.h: + * dfg/DFGByteCodeParser.cpp: + (JSC::DFG::ByteCodeParser::get): + (InlineStackEntry): + (JSC::DFG::ByteCodeParser::getScope): + (JSC::DFG::ByteCodeParser::InlineStackEntry::InlineStackEntry): + * dfg/DFGCSEPhase.cpp: + (CSEPhase): + (JSC::DFG::CSEPhase::genericPureCSE): + (JSC::DFG::CSEPhase::pureCSE): + (JSC::DFG::CSEPhase::pureCSERequiringSameInlineCallFrame): + (JSC::DFG::CSEPhase::getMyScopeLoadElimination): + (JSC::DFG::CSEPhase::performNodeCSE): + * dfg/DFGOSRExitCompiler32_64.cpp: + (JSC::DFG::OSRExitCompiler::compileExit): + * dfg/DFGOSRExitCompiler64.cpp: + (JSC::DFG::OSRExitCompiler::compileExit): + * dfg/DFGSpeculativeJIT32_64.cpp: + (JSC::DFG::SpeculativeJIT::compile): + * dfg/DFGSpeculativeJIT64.cpp: + (JSC::DFG::SpeculativeJIT::compile): + * interpreter/CallFrame.cpp: + (JSC::CallFrame::trueCallFrame): + +2013-01-02 Gavin Barraclough <barraclough@apple.com> + + Objective-C API for JavaScriptCore + https://bugs.webkit.org/show_bug.cgi?id=105889 + + Reviewed by Geoff Garen. + + Fixes for a number of issues raised by Darin. + + * API/APIJSValue.h: + - Fix typos in comment + - Add newline before NS_CLASS_AVAILABLE(10_9, NA) + - cls -> expectedClass + - key type for -setObject:forKeyedSubscript: is now NSObject <NSCopying> * + * API/JSBase.h: + - JS_OBJC_API_ENABLED no longer implies __OBJC__ + * API/JSBlockAdaptor.mm: + (BlockArgumentStruct::BlockArgumentStruct): + (BlockArgumentStruct): + - mark virtual functions as virtual, override, and private + - refactor out buffer allocation for struct types + (BlockArgumentTypeDelegate::typeVoid): + (BlockArgumentTypeDelegate::typeBlock): + (BlockArgumentTypeDelegate::typeStruct): + - return nil -> return 0 + (BlockResultStruct::BlockResultStruct): + (BlockResultStruct): + - mark virtual functions as virtual, override, and private + - refactor out buffer allocation for struct types + (buildBlockSignature): + - %lu is not an appropriate format specifier for NSInteger + (-[JSBlockAdaptor initWithBlockSignatureFromProtocol:]): + - nil check [super init] + (-[JSBlockAdaptor blockMatchesSignature:]): + (-[JSBlockAdaptor blockFromValue:inContext:withException:]): + - ctx -> contextRef + * API/JSContext.h: + - Fix typos in comment + - Add newline before NS_CLASS_AVAILABLE(10_9, NA) + - key type for -setObject:forKeyedSubscript: is now NSObject <NSCopying> * + * API/JSContext.mm: + (-[JSContext initWithVirtualMachine:]): + - nil check [super init] + (+[JSContext currentArguments]): + - args -> argumentArray + (-[JSContext setObject:forKeyedSubscript:]): + - key type for -setObject:forKeyedSubscript: is now NSObject <NSCopying> * + (-[JSContext dealloc]): + (-[JSContext protect:]): + (-[JSContext unprotect:]): + - m_protected -> m_protectCounts + * API/JSValue.mm: + (-[JSValue toObjectOfClass:]): + - cls -> expectedClass + (-[JSValue toBool]): + (-[JSValue deleteProperty:]): + (-[JSValue hasProperty:]): + (-[JSValue isUndefined]): + (-[JSValue isNull]): + (-[JSValue isBoolean]): + (-[JSValue isNumber]): + (-[JSValue isString]): + (-[JSValue isObject]): + (-[JSValue isEqualToObject:]): + (-[JSValue isEqualWithTypeCoercionToObject:]): + (-[JSValue isInstanceOf:]): + - removed ? YES : NO + (-[JSValue callWithArguments:]): + (-[JSValue constructWithArguments:]): + (-[JSValue invokeMethod:withArguments:]): + - args -> argumentArray + (+[JSValue valueWithPoint:inContext:]): + (+[JSValue valueWithRange:inContext:]): + (+[JSValue valueWithRect:inContext:]): + (+[JSValue valueWithSize:inContext:]): + - [NSNumber numberWithFloat:] -> @() + (-[JSValue objectForKeyedSubscript:]): + (-[JSValue setObject:forKeyedSubscript:]): + - key type for -setObject:forKeyedSubscript: is now NSObject <NSCopying> * + (JSContainerConvertor): + (JSContainerConvertor::isWorkListEmpty): + (JSContainerConvertor::convert): + (ObjcContainerConvertor): + (ObjcContainerConvertor::isWorkListEmpty): + - remove WTF:: + - isWorkListEmpty is const + (objectToValue): + - use fast enumeration + (-[JSValue initWithValue:inContext:]): + - nil check [super init] + (getStructTagHandler): + - m_structHandlers -> structHandlers + * API/JSVirtualMachine.h: + - Add newline before NS_CLASS_AVAILABLE(10_9, NA) + * API/JSVirtualMachine.mm: + (-[JSVirtualMachine init]): + - nil check [super init] + * API/JSWrapperMap.mm: + (selectorToPropertyName): + (copyPrototypeProperties): + - remove WTF:: + - use static_cast + (-[JSObjCClassInfo initWithContext:forClass:superClassInfo:]): + (-[JSWrapperMap initWithContext:]): + - nil check [super init] + (-[JSWrapperMap wrapperForObject:]): + (tryUnwrapObjcObject): + - enable ASSERT + (getJSExportProtocol): + (getNSBlockClass): + - remove if check on initializing static + * API/JavaScriptCore.h: + - JS_OBJC_API_ENABLED no longer implies __OBJC__ + * API/ObjCCallbackFunction.mm: + (CallbackArgumentOfClass): + (CallbackArgumentOfClass::~CallbackArgumentOfClass): + (CallbackArgumentStruct::CallbackArgumentStruct): + (CallbackArgumentStruct): + (CallbackArgumentBlockCallback): + - mark virtual functions as virtual, override, and private + - refactor out buffer allocation for struct types + (ArgumentTypeDelegate::typeVoid): + (ArgumentTypeDelegate::typeOfClass): + (ArgumentTypeDelegate::typeStruct): + - return nil -> return 0 + (CallbackResultStruct::CallbackResultStruct): + (CallbackResultStruct): + - mark virtual functions as virtual, override, and private + - refactor out buffer allocation for struct types + (ResultTypeDelegate::typeStruct): + - return nil -> return 0 + (ObjCCallbackFunction): + - remove WTF:: + (objCCallbackFunctionFinalize): + - use static_cast + (objCCallbackFunctionCallAsFunction): + - Fix typos in comment + (createObjCCallbackFunctionClass): + (objCCallbackFunctionClass): + - Split out createObjCCallbackFunctionClass from objCCallbackFunctionClass + (ObjCCallbackFunction::call): + - ctx -> contextRef + (blockSignatureContainsClass): + - Remove tri-state enum. + (skipNumber): + - isdigit -> isASCIIDigit + (objCCallbackFunctionForInvocation): + - clean up & comment blockSignatureContainsClass() usage + (tryUnwrapBlock): + - use static_cast + * API/ObjcRuntimeExtras.h: + (forEachProtocolImplementingProtocol): + (forEachMethodInClass): + (forEachMethodInProtocol): + (forEachPropertyInProtocol): + - Remove WTF:: + - Remove if (count) checks + (skipPair): + - NSUInteger -> size_t + (StringRange): + (StringRange::operator const char*): + (StringRange::get): + (StructBuffer): + (StructBuffer::StructBuffer): + (StructBuffer::~StructBuffer): + (StructBuffer::operator void*): + - Added helper for creating an aligned buffer, used by struct conversion invocations. + (parseObjCType): + - *(position++) -> *position++ + * API/tests/testapi.c: + - PLATFORM(MAC) -> JS_OBJC_API_ENABLED + * API/tests/testapi.m: + (blockSignatureContainsClass): + - Remove tri-state enum. + (testObjectiveCAPI): + - Added more result type checks. + +2013-01-02 Filip Pizlo <fpizlo@apple.com> + + DFG should not use the InlineCallFrame's callee when it could have used the executable istead + https://bugs.webkit.org/show_bug.cgi?id=105947 + + Reviewed by Mark Hahnenberg. + + We shouldn't use the callee to get the executable when we have the executable already. Not only + does this make the logic more clear, but it also allows for a world where the executable is known + but the callee isn't. + + * dfg/DFGAssemblyHelpers.h: + (JSC::DFG::AssemblyHelpers::strictModeFor): + +2013-01-02 Filip Pizlo <fpizlo@apple.com> + + DFG inliner should not use the callee's bytecode variable for resolving references to the callee in inlined code + https://bugs.webkit.org/show_bug.cgi?id=105938 + + Reviewed by Mark Hahnenberg. + + This simplifies a bunch of code for referring to the callee. It also ought to simplify how we do + closure call inlining: for inlined closure call frames we will simply require that the callee is + already stashed on the stack in the Callee slot in the inline call frame header. + + * dfg/DFGByteCodeParser.cpp: + (ByteCodeParser): + (JSC::DFG::ByteCodeParser::getDirect): + (JSC::DFG::ByteCodeParser::get): + (InlineStackEntry): + (JSC::DFG::ByteCodeParser::InlineStackEntry::remapOperand): + (JSC::DFG::ByteCodeParser::handleCall): + (JSC::DFG::ByteCodeParser::handleInlining): + (JSC::DFG::ByteCodeParser::InlineStackEntry::InlineStackEntry): + (JSC::DFG::ByteCodeParser::parse): + +2013-01-02 Ryosuke Niwa <rniwa@webkit.org> + + Another Windows port build fix attempt. Try not exporting this symbol from JSC + since it's also compiled in WebCore. + + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.def: + +2013-01-02 Csaba Osztrogonác <ossy@webkit.org> + + One more unreviewed buildfix after r138609. + + * jit/JITCall.cpp: Add a missing include. + +2013-01-02 Csaba Osztrogonác <ossy@webkit.org> + + Unreviewed buildfix after r138609. + + * jit/JITCall32_64.cpp: Add a missing include. + +2013-01-01 Filip Pizlo <fpizlo@apple.com> + + Baseline JIT should have closure call caching + https://bugs.webkit.org/show_bug.cgi?id=105900 + + Reviewed by Gavin Barraclough. + + This is not a speed-up by itself, but is meant to allow the DFG inliner to + accurately discern between closure calls and non-closure calls, so that it can + do closure call inlining in the future. + + * bytecode/CallLinkStatus.cpp: + (JSC::CallLinkStatus::computeFromLLInt): + (JSC::CallLinkStatus::computeFor): + * bytecode/CallLinkStatus.h: + (JSC::CallLinkStatus::CallLinkStatus): + (JSC::CallLinkStatus::isClosureCall): + (CallLinkStatus): + * dfg/DFGByteCodeParser.cpp: + (JSC::DFG::ByteCodeParser::handleCall): + * jit/JIT.cpp: + (JSC::JIT::linkFor): + (JSC::JIT::linkSlowCall): + * jit/JIT.h: + (JSC::JIT::compileClosureCall): + * jit/JITCall.cpp: + (JSC::JIT::privateCompileClosureCall): + * jit/JITCall32_64.cpp: + (JSC::JIT::privateCompileClosureCall): + * jit/JITStubs.cpp: + (JSC::DEFINE_STUB_FUNCTION): + * jit/JITStubs.h: + * jit/ThunkGenerators.cpp: + (JSC::linkClosureCallGenerator): + * jit/ThunkGenerators.h: + +2013-01-01 Dan Bernstein <mitz@apple.com> + + <rdar://problem/12942239> Update copyright strings + + Reviewed by Sam Weinig. + + * Info.plist: + +2012-12-31 Gavin Barraclough <barraclough@apple.com> + + Objective-C API for JavaScriptCore + https://bugs.webkit.org/show_bug.cgi?id=105889 + + Reviewed by Filip Pizlo. + + For a detailed description of the API implemented here, see: + JSContext.h + APIJSValue.h + JSVirtualMachine.h + JSExport.h + Still to do - + (1) Shoud rename APIJSValue.h -> JSValue.h (but we'll have to rename JSValue.h first). + (2) Numerous FIXMEs, all with separate bugs filed. + + * API/APIJSValue.h: Added. + - this Objective-C class is used to reference a JavaScript object. + * API/JSBase.h: + - added JS_OBJC_API_ENABLED macro to control ObjC API support. + * API/JSBlockAdaptor.h: Added. + - this Objective-C class is used in creating a special NSBlock proxying a JavaScript function. + * API/JSBlockAdaptor.mm: Added. + (BlockArgument): + (BlockArgument::~BlockArgument): + (BlockArgumentBoolean): + (BlockArgumentBoolean::get): + (BlockArgumentNumeric): + (BlockArgumentNumeric::get): + (BlockArgumentId): + (BlockArgumentId::get): + (BlockArgumentStruct): + (BlockArgumentStruct::BlockArgumentStruct): + (BlockArgumentStruct::~BlockArgumentStruct): + (BlockArgumentStruct::get): + - decoded arguent type information of a JSBlockAdaptor. + (BlockArgumentTypeDelegate): + (BlockArgumentTypeDelegate::typeInteger): + (BlockArgumentTypeDelegate::typeDouble): + (BlockArgumentTypeDelegate::typeBool): + (BlockArgumentTypeDelegate::typeVoid): + (BlockArgumentTypeDelegate::typeId): + (BlockArgumentTypeDelegate::typeOfClass): + (BlockArgumentTypeDelegate::typeBlock): + (BlockArgumentTypeDelegate::typeStruct): + - delegate for use in conjunction with parseObjCType. + (BlockResult): + (BlockResult::~BlockResult): + (BlockResultVoid): + (BlockResultVoid::set): + (BlockResultInteger): + (BlockResultInteger::set): + (BlockResultDouble): + (BlockResultDouble::set): + (BlockResultBoolean): + (BlockResultBoolean::set): + (BlockResultStruct): + (BlockResultStruct::BlockResultStruct): + (BlockResultStruct::~BlockResultStruct): + (BlockResultStruct::set): + - decoded result type information of a JSBlockAdaptor. + (buildBlockSignature): + - partial step in constructing a signature with stack offset information from one without. + (-[JSBlockAdaptor initWithBlockSignatureFromProtocol:]): + - constructor. + (-[JSBlockAdaptor blockMatchesSignature:]): + - check whether signature strings match, where only one contains stack frame offsets. + (-[JSBlockAdaptor blockFromValue:inContext:withException:]): + - use the adaptor to create a special forwarding block. + * API/JSCallbackObjectFunctions.h: + (JSC::::inherits): + - add missing braces to multiline for statement. + * API/JSContext.h: Added. + - this Objective-C class is used to reference a JavaScript context. + * API/JSContext.mm: Added. + (-[JSContext init]): + - constructor. + (-[JSContext initWithVirtualMachine:]): + - construct in a given VM (JSGlobalData). + (-[JSContext evaluateScript:]): + (-[JSContext globalObject]): + - evaluate a script, global object accessor. + (+[JSContext currentContext]): + (+[JSContext currentThis]): + (+[JSContext currentArguments]): + - These methods obtain context, this, arguments from within a callback. + (-[JSContext virtualMachine]): + - implementation for .virtualMachine property. + (-[JSContext objectForKeyedSubscript:]): + (-[JSContext setObject:forKeyedSubscript:]): + - support for subscript property access. + (contextInternalContext): + - internal accessor to m_context. + (-[JSContext dealloc]): + - desctructor. + (-[JSContext notifyException:]): + (-[JSContext valueFromNotifyException:]): + (-[JSContext boolFromNotifyException:]): + - internal method to record an exception was thrown. + (-[JSContext beginCallbackWithData:thisValue:argumentCount:arguments:]): + (-[JSContext endCallbackWithData:]): + - internal methods to push/pop a callback record. + (-[JSContext protect:]): + (-[JSContext unprotect:]): + - internal methods to add a value to a protect set (used to protect the internal property of JSValue). + (-[JSContext wrapperForObject:]): + - internal method to create a wrapper object. + (WeakContextRef::WeakContextRef): + (WeakContextRef::~WeakContextRef): + (WeakContextRef::get): + (WeakContextRef::set): + - Helper class to implement a weak reference to a JSContext. + * API/JSContextInternal.h: Added. + (CallbackData): + (WeakContextRef): + - see API/JSContext.mm for description of internal methods. + * API/JSExport.h: Added. + - Provides JSExport protocol & JSExportAs macro. + * API/JSValue.mm: Added. + (+[JSValue valueWithObject:inContext:]): + (+[JSValue valueWithBool:inContext:]): + (+[JSValue valueWithDouble:inContext:]): + (+[JSValue valueWithInt32:inContext:]): + (+[JSValue valueWithUInt32:inContext:]): + (+[JSValue valueWithNewObjectInContext:]): + (+[JSValue valueWithNewArrayInContext:]): + (+[JSValue valueWithNewRegularExpressionFromPattern:flags:inContext:]): + (+[JSValue valueWithNewErrorFromMessage:inContext:]): + (+[JSValue valueWithNullInContext:]): + (+[JSValue valueWithUndefinedInContext:]): + - Constructors. + (-[JSValue toObject]): + (-[JSValue toObjectOfClass:]): + (-[JSValue toBool]): + (-[JSValue toDouble]): + (-[JSValue toInt32]): + (-[JSValue toUInt32]): + (-[JSValue toNumber]): + (-[JSValue toString]): + (-[JSValue toDate]): + (-[JSValue toArray]): + (-[JSValue toDictionary]): + - Conversion to Objective-C types. + (-[JSValue valueForProperty:]): + (-[JSValue setValue:forProperty:]): + (-[JSValue deleteProperty:]): + (-[JSValue hasProperty:]): + (-[JSValue defineProperty:descriptor:]): + - Property access by property name. + (-[JSValue valueAtIndex:]): + (-[JSValue setValue:atIndex:]): + - Property access by index. + (-[JSValue isUndefined]): + (-[JSValue isNull]): + (-[JSValue isBoolean]): + (-[JSValue isNumber]): + (-[JSValue isString]): + (-[JSValue isObject]): + - Test JavaScript type. + (-[JSValue isEqualToObject:]): + (-[JSValue isEqualWithTypeCoercionToObject:]): + (-[JSValue isInstanceOf:]): + - ===, ==, instanceof operators. + (-[JSValue callWithArguments:]): + (-[JSValue constructWithArguments:]): + (-[JSValue invokeMethod:withArguments:]): + - Call & construct. + (-[JSValue context]): + - implementation for .context property. + (-[JSValue toPoint]): + (-[JSValue toRange]): + (-[JSValue toRect]): + (-[JSValue toSize]): + (+[JSValue valueWithPoint:inContext:]): + (+[JSValue valueWithRange:inContext:]): + (+[JSValue valueWithRect:inContext:]): + (+[JSValue valueWithSize:inContext:]): + - Support for NS struct types. + (-[JSValue objectForKeyedSubscript:]): + (-[JSValue objectAtIndexedSubscript:]): + (-[JSValue setObject:forKeyedSubscript:]): + (-[JSValue setObject:atIndexedSubscript:]): + - support for subscript property access. + (isDate): + (isArray): + - internal helper functions to check for instances of JS Date, Array types. + (JSContainerConvertor): + (Task): + (JSContainerConvertor::JSContainerConvertor): + (JSContainerConvertor::isWorkListEmpty): + (JSContainerConvertor::convert): + (JSContainerConvertor::add): + (JSContainerConvertor::take): + - helper class for tracking state while converting to Array/Dictionary objects. + (valueToObjectWithoutCopy): + (containerValueToObject): + (valueToObject): + (valueToNumber): + (valueToString): + (valueToDate): + (valueToArray): + (valueToDictionary): + - function for converting JavaScript values to Objective-C objects. + (ObjcContainerConvertor): + (ObjcContainerConvertor::ObjcContainerConvertor): + (ObjcContainerConvertor::isWorkListEmpty): + (ObjcContainerConvertor::convert): + (ObjcContainerConvertor::add): + (ObjcContainerConvertor::take): + - helper class for tracking state while converting to Array/Dictionary values. + (objectToValueWithoutCopy): + (objectToValue): + (valueInternalValue): + - function for converting Objective-C objects to JavaScript values. + (+[JSValue valueWithValue:inContext:]): + (-[JSValue initWithValue:inContext:]): + - internal constructors. + (StructTagHandler): + (getStructTagHandler): + (+[JSValue selectorForStructToValue:]): + (+[JSValue selectorForValueToStruct:]): + - methods to tracking struct types that support conversion to/from JSValue. + (-[JSValue dealloc]): + - destructor. + (-[JSValue description]): + - Objective-C to-NSString conversion. + (typeToValueInvocationFor): + (valueToTypeInvocationFor): + - create invocation objects for conversion to/from JSValue. + * API/JSValueInternal.h: Added. + - see API/JSValue.mm for description of internal methods. + * API/JSVirtualMachine.h: Added. + - this Objective-C class is used to reference a JavaScript virtual machine (JSGlobalData). + * API/JSVirtualMachine.mm: Added. + (-[JSVirtualMachine init]): + (-[JSVirtualMachine dealloc]): + - constructor & destructor. + (getGroupFromVirtualMachine): + - internal accessor for m_group property. + * API/JSVirtualMachineInternal.h: Added. + - see API/JSVirtualMachine.mm for description of internal methods. + * API/JSWrapperMap.h: Added. + * API/JSWrapperMap.mm: Added. + (wrapperClass): + - singleton root for detction (& unwrapping) of wrapper objects. + (selectorToPropertyName): + - default selector to property name conversion. + (createObjectWithCustomBrand): + - creates a JSObject with a custom NativeBrand (class name). + (createRenameMap): + - parse @optional properties of a JSExport protocol. + (putNonEnumerable): + - property put with enumerable=false. + (copyMethodsToObject): + - iterate methods in a protocol; add functions to a JSObject. + (parsePropertyAttributes): + - examine protocol property metadata. + (makeSetterName): + - "foo" -> "setFoo" + (copyPrototypeProperties): + - create properties on a Protocol object reflecting the instance methods & properties of a protocol. + (-[JSObjCClassInfo initWithContext:forClass:superClassInfo:]): + (-[JSObjCClassInfo dealloc]): + (-[JSObjCClassInfo wrapperForObject:]): + (-[JSObjCClassInfo constructor]): + - cache the Protocol/Constructor objects for an Objective-C type. + (-[JSWrapperMap initWithContext:]): + (-[JSWrapperMap dealloc]): + - constructor & desctructor. + (-[JSWrapperMap classInfoForClass:]): + - maps Class -> JSObjCClassInfo. + (-[JSWrapperMap wrapperForObject:]): + - cretae or retrieve a cached wrapper value for an object. + (tryUnwrapObjcObject): + - check whether a value is a wrapper object; unwrap if so. + * API/JavaScriptCore.h: + - Added includes for new API headers. + * API/ObjCCallbackFunction.h: Added. + - this class is used to wrap Objective-C instance methods, class methods & blocks as JSFunction objects. + * API/ObjCCallbackFunction.mm: Added. + (CallbackArgument): + (CallbackArgument::~CallbackArgument): + (CallbackArgumentBoolean): + (CallbackArgumentBoolean::set): + (CallbackArgumentInteger): + (CallbackArgumentInteger::set): + (CallbackArgumentDouble): + (CallbackArgumentDouble::set): + (CallbackArgumentJSValue): + (CallbackArgumentJSValue::set): + (CallbackArgumentId): + (CallbackArgumentId::set): + (CallbackArgumentOfClass): + (CallbackArgumentOfClass::CallbackArgumentOfClass): + (CallbackArgumentOfClass::~CallbackArgumentOfClass): + (CallbackArgumentOfClass::set): + (CallbackArgumentNSNumber): + (CallbackArgumentNSNumber::set): + (CallbackArgumentNSString): + (CallbackArgumentNSString::set): + (CallbackArgumentNSDate): + (CallbackArgumentNSDate::set): + (CallbackArgumentNSArray): + (CallbackArgumentNSArray::set): + (CallbackArgumentNSDictionary): + (CallbackArgumentNSDictionary::set): + (CallbackArgumentStruct): + (CallbackArgumentStruct::CallbackArgumentStruct): + (CallbackArgumentStruct::~CallbackArgumentStruct): + (CallbackArgumentStruct::set): + (CallbackArgumentBlockCallback): + (CallbackArgumentBlockCallback::CallbackArgumentBlockCallback): + (CallbackArgumentBlockCallback::~CallbackArgumentBlockCallback): + (CallbackArgumentBlockCallback::set): + - decoded arguent type information of a ObjCCallbackFunction. + (ArgumentTypeDelegate): + (ArgumentTypeDelegate::typeInteger): + (ArgumentTypeDelegate::typeDouble): + (ArgumentTypeDelegate::typeBool): + (ArgumentTypeDelegate::typeVoid): + (ArgumentTypeDelegate::typeId): + (ArgumentTypeDelegate::typeOfClass): + (ArgumentTypeDelegate::typeBlock): + (ArgumentTypeDelegate::typeStruct): + - delegate for use in conjunction with parseObjCType. + (CallbackResult): + (CallbackResult::~CallbackResult): + (CallbackResultVoid): + (CallbackResultVoid::get): + (CallbackResultId): + (CallbackResultId::get): + (CallbackResultNumeric): + (CallbackResultNumeric::get): + (CallbackResultBoolean): + (CallbackResultBoolean::get): + (CallbackResultStruct): + (CallbackResultStruct::CallbackResultStruct): + (CallbackResultStruct::~CallbackResultStruct): + (CallbackResultStruct::get): + - decoded result type information of a ObjCCallbackFunction. + (ResultTypeDelegate): + (ResultTypeDelegate::typeInteger): + (ResultTypeDelegate::typeDouble): + (ResultTypeDelegate::typeBool): + (ResultTypeDelegate::typeVoid): + (ResultTypeDelegate::typeId): + (ResultTypeDelegate::typeOfClass): + (ResultTypeDelegate::typeBlock): + (ResultTypeDelegate::typeStruct): + - delegate for use in conjunction with parseObjCType. + (ObjCCallbackFunction): + (ObjCCallbackFunction::ObjCCallbackFunction): + (ObjCCallbackFunction::~ObjCCallbackFunction): + - constructor & destructor. + (ObjCCallbackFunction::context): + - accessor. + (ObjCCallbackFunction::wrappedBlock): + - attemmpt to unwrap a block object. + (objCCallbackFunctionFinalize): + (objCCallbackFunctionCallAsFunction): + (objCCallbackFunctionClass): + - JSClassRef used to represent ObjCCallbackFunction objects. + (ObjCCallbackFunction::call): + (blockSignatureContainsClass): + - helper function to determine if we're running on a recent Clang. + (skipNumber): + - helper used in parsing signature strings. + (objCCallbackFunctionForInvocation): + (objCCallbackFunctionForMethod): + (objCCallbackFunctionForBlock): + - functions to try to create ObjCCallbackFunction instances for methods/blocks. + (tryUnwrapBlock): + - attemmpt to unwrap a block object. + * API/ObjcRuntimeExtras.h: Added. + (protocolImplementsProtocol): + (forEachProtocolImplementingProtocol): + (forEachMethodInClass): + (forEachMethodInProtocol): + (forEachPropertyInProtocol): + - functions used in reflecting on Objective-C types. + (skipPair): + - parsing helper used by parseObjCType, scans for matching parentheses. + (StringRange): + (StringRange::StringRange): + (StringRange::~StringRange): + (StringRange::operator const char*): + (StringRange::get): + - Helper class - create a c string copy of a range of an existing string. + (parseObjCType): + - function to parse Objective-C type strings, makes callbacks to a deleagte. + * API/tests/testapi.c: + (main): + - added call to testObjectiveCAPI (in testapi.m). + * API/tests/testapi.m: Added. + (+[ParentObject parentTest]): + (+[TestObject testObject]): + (+[TestObject classTest]): + (-[TestObject getString]): + (-[TestObject testArgumentTypesWithInt:double:boolean:string:number:array:dictionary:]): + (-[TestObject callback:]): + (-[TextXYZ test:]): + - test object, used in various test vases. + (checkResult): + - helper function. + (blockSignatureContainsClass): + - helper function to determine if we're running on a recent Clang. + (testObjectiveCAPI): + - new test cases. + * JavaScriptCore.xcodeproj/project.pbxproj: + - added new files. + * runtime/JSGlobalData.cpp: + (JSC::JSGlobalData::JSGlobalData): + * runtime/JSGlobalData.h: + (JSGlobalData): + - added m_apiData - provide convenient storage for use by the API. + * runtime/JSGlobalObject.cpp: + (JSC::JSGlobalObject::JSGlobalObject): + * runtime/JSGlobalObject.h: + (JSGlobalObject): + - added m_apiData - provide convenient storage for use by the API. + +2012-12-27 Csaba Osztrogonác <ossy@webkit.org> + + One more unreviwed holiday MIPS and SH4 buildfixes after r138516. + + * jit/ThunkGenerators.cpp: + +2012-12-27 Csaba Osztrogonác <ossy@webkit.org> + + Unreviwed holiday ARM and SH4 buildfixes after r138516. + + * jit/ThunkGenerators.cpp: + (JSC::nativeForGenerator): + +2012-12-26 Filip Pizlo <fpizlo@apple.com> + + All JIT stubs should go through the getCTIStub API + https://bugs.webkit.org/show_bug.cgi?id=105750 + + Reviewed by Sam Weinig. + + Previously JITThunks had two sets of thunks: one static set stored in a struct, + which was filled by JIT::privateCompileCTITrampolines, and another set stored in + a HashMap. Moreover, the code to generate the code for the CTI trampoline struct + had loads of copy-paste between JSVALUE32_64 and JSVALUE64, and was total + unmodular with respect to calls versus constructors, among other things. + + This changeset removes this struct and rationalizes the code that generates those + thunks. All of thunks are now generated through the getCTIStub HashMap API. All + thunks for the baseline JIT now use the JSInterfaceJIT and have their codegen + located in ThunkGenerators.cpp. All thunks now share as much code as possible - + it turns out that they are almost 100% identical between 32_64 and 64, so that + works out great. A bunch of call vs. construct duplication was eliminated. And, + most of the call link versus virtual call duplication was also eliminated. + + This does not change behavior but it does make it easier to add more thunks in + the future. + + * bytecode/CallLinkInfo.cpp: + (JSC::CallLinkInfo::unlink): + * jit/JIT.cpp: + (JSC::JIT::linkFor): + * jit/JIT.h: + (JIT): + * jit/JITCall.cpp: + (JSC::JIT::compileCallEvalSlowCase): + (JSC::JIT::compileOpCallSlowCase): + * jit/JITCall32_64.cpp: + (JSC::JIT::compileCallEvalSlowCase): + (JSC::JIT::compileOpCallSlowCase): + * jit/JITInlines.h: + (JSC): + * jit/JITOpcodes.cpp: + (JSC): + (JSC::JIT::privateCompileCTINativeCall): + * jit/JITOpcodes32_64.cpp: + (JSC): + * jit/JITStubs.cpp: + (JSC::tryCacheGetByID): + * jit/JITThunks.cpp: + (JSC::JITThunks::JITThunks): + (JSC::JITThunks::ctiNativeCall): + (JSC::JITThunks::ctiNativeConstruct): + (JSC): + (JSC::JITThunks::hostFunctionStub): + * jit/JITThunks.h: + (JSC): + (JITThunks): + * jit/JSInterfaceJIT.h: + (JSInterfaceJIT): + (JSC::JSInterfaceJIT::emitJumpIfNotJSCell): + (JSC): + (JSC::JSInterfaceJIT::emitFastArithIntToImmNoCheck): + (JSC::JSInterfaceJIT::emitJumpIfNotType): + (JSC::JSInterfaceJIT::emitGetFromCallFrameHeaderPtr): + (JSC::JSInterfaceJIT::emitPutToCallFrameHeader): + (JSC::JSInterfaceJIT::emitPutImmediateToCallFrameHeader): + (JSC::JSInterfaceJIT::emitPutCellToCallFrameHeader): + (JSC::JSInterfaceJIT::preserveReturnAddressAfterCall): + (JSC::JSInterfaceJIT::restoreReturnAddressBeforeReturn): + (JSC::JSInterfaceJIT::restoreArgumentReference): + * jit/ThunkGenerators.cpp: + (JSC::generateSlowCaseFor): + (JSC): + (JSC::linkForGenerator): + (JSC::linkCallGenerator): + (JSC::linkConstructGenerator): + (JSC::virtualForGenerator): + (JSC::virtualCallGenerator): + (JSC::virtualConstructGenerator): + (JSC::stringLengthTrampolineGenerator): + (JSC::nativeForGenerator): + (JSC::nativeCallGenerator): + (JSC::nativeConstructGenerator): + (JSC::charCodeAtThunkGenerator): + (JSC::charAtThunkGenerator): + (JSC::fromCharCodeThunkGenerator): + (JSC::sqrtThunkGenerator): + (JSC::floorThunkGenerator): + (JSC::ceilThunkGenerator): + (JSC::roundThunkGenerator): + (JSC::expThunkGenerator): + (JSC::logThunkGenerator): + (JSC::absThunkGenerator): + (JSC::powThunkGenerator): + * jit/ThunkGenerators.h: + (JSC): + * runtime/Executable.h: + (NativeExecutable): + (JSC::NativeExecutable::nativeFunctionFor): + (JSC::NativeExecutable::offsetOfNativeFunctionFor): + +2012-12-25 Gyuyoung Kim <gyuyoung.kim@samsung.com> + + [CMAKE] Remove header files in JavaScriptCore/CMakeLists.txt + https://bugs.webkit.org/show_bug.cgi?id=105753 + + Reviewed by Laszlo Gombos. + + * CMakeLists.txt: Remove header files in source list. + +2012-12-25 Filip Pizlo <fpizlo@apple.com> + + JITThunks should be in its own file + https://bugs.webkit.org/show_bug.cgi?id=105744 + + Rubber stamped by Sam Weinig. + + Moved JITThunks into its own file and removed some static methods from it + that were not related to what JITThunks currently does. Performed various + pagan rituals to get it to build - apparently there is a circular dependency + between JSCell, Weak, and JITThunks, which magically resolves itself if you + make sure to first include Register.h. Making it so that fewer pagan rituals + need to be performed if this code changes in the future is covered by + https://bugs.webkit.org/show_bug.cgi?id=105696. + + * CMakeLists.txt: + * GNUmakefile.list.am: + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: + * JavaScriptCore.xcodeproj/project.pbxproj: + * Target.pri: + * jit/JITStubs.cpp: + (JSC::tryCachePutByID): + (JSC::tryCacheGetByID): + * jit/JITStubs.h: + (JSC::JITStackFrame::returnAddressSlot): + (JSC::returnAddressIsInCtiTrampoline): + * jit/JITThunks.cpp: Added. + (JSC::JITThunks::JITThunks): + (JSC::JITThunks::~JITThunks): + (JSC::JITThunks::ctiStub): + (JSC::JITThunks::hostFunctionStub): + (JSC::JITThunks::clearHostFunctionStubs): + * jit/JITThunks.h: Added. + (JSC::JITThunks::ctiStringLengthTrampoline): + (JSC::JITThunks::ctiVirtualCallLink): + (JSC::JITThunks::ctiVirtualConstructLink): + (JSC::JITThunks::ctiVirtualCall): + (JSC::JITThunks::ctiVirtualConstruct): + (JSC::JITThunks::ctiNativeCall): + (JSC::JITThunks::ctiNativeConstruct): + * jit/ThunkGenerator.h: Added. + * jit/ThunkGenerators.cpp: + * jit/ThunkGenerators.h: + * runtime/JSGlobalData.h: + +2012-12-25 Ilya Tikhonovsky <loislo@chromium.org> + + Unreviewed follow-up for r138455. + + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.def: + +2012-12-24 Ilya Tikhonovsky <loislo@chromium.org> + + Unreviewed compilation fix for r138452. + + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.def: + +2012-12-24 Laszlo Gombos <l.gombos@samsung.com> + + Remove wtf/Platform.h includes from {c|cpp} files + https://bugs.webkit.org/show_bug.cgi?id=105678 + + Reviewed by Kentaro Hara. + + Remove wtf/Platform.h from the include list as it is already + included in config.h. + + * disassembler/udis86/udis86.c: + * disassembler/udis86/udis86_decode.c: + * disassembler/udis86/udis86_input.c: + * disassembler/udis86/udis86_itab_holder.c: + * disassembler/udis86/udis86_syn-att.c: + * disassembler/udis86/udis86_syn-intel.c: + * disassembler/udis86/udis86_syn.c: + * heap/VTableSpectrum.cpp: + +2012-12-21 Filip Pizlo <fpizlo@apple.com> + + DFG Arrayify slow path should be out-of-line + https://bugs.webkit.org/show_bug.cgi?id=105400 + + Reviewed by Gavin Barraclough. + + The interesting bit of this change is allowing out-of-line slow path generators + to emit speculation checks. This is accomplished by having a version of + speculationCheck() that returns a jump placeholder instead of taking a jump (or + jump list) as an argument. You can then fill in that jump placeholder at a + later time, so long as you do it before OSR exit linking. Slow path generators + run before linking, so that just naturally ends up working. + + This isn't really a big win, but we know that out-of-lining slow paths is + generally a good thing to do, so it's fair to assume that this is a move in the + right direction. + + * CMakeLists.txt: + * GNUmakefile.list.am: + * JavaScriptCore.xcodeproj/project.pbxproj: + * Target.pri: + * dfg/DFGArrayifySlowPathGenerator.h: Added. + (DFG): + (ArrayifySlowPathGenerator): + (JSC::DFG::ArrayifySlowPathGenerator::ArrayifySlowPathGenerator): + (JSC::DFG::ArrayifySlowPathGenerator::generateInternal): + * dfg/DFGOSRExitJumpPlaceholder.cpp: Added. + (DFG): + (JSC::DFG::OSRExitJumpPlaceholder::fill): + * dfg/DFGOSRExitJumpPlaceholder.h: Added. + (DFG): + (OSRExitJumpPlaceholder): + (JSC::DFG::OSRExitJumpPlaceholder::OSRExitJumpPlaceholder): + (JSC::DFG::OSRExitJumpPlaceholder::operator!): + * dfg/DFGSpeculativeJIT.cpp: + (JSC::DFG::SpeculativeJIT::speculationCheck): + (DFG): + (JSC::DFG::SpeculativeJIT::arrayify): + * dfg/DFGSpeculativeJIT.h: + (SpeculativeJIT): + +2012-12-20 Oliver Hunt <oliver@apple.com> + + Finally found the problem. Using the wrong JSContextGroup. + + * API/tests/testapi.c: + (main): + +2012-12-20 Oliver Hunt <oliver@apple.com> + + Try to convince bots to be happy with testapi. + + * API/JSScriptRefPrivate.h: + +2012-12-20 Michael Saboff <msaboff@apple.com> + + JIT: Change uninitialized pointer value -1 to constant + https://bugs.webkit.org/show_bug.cgi?id=105576 + + Rubber stamped by Gavin Barraclough. + + Changed the use of -1 as a pointer value in the JITs to be the constant unusedPointer defined in the + new file jit/UnusedPointer.h. Made it's value 0xd1e7beef, which is a bad pointer on most architectures + because it is odd, and to distinguish it from other common values. + + * GNUmakefile.list.am: + * JavaScriptCore.xcodeproj/project.pbxproj: + * dfg/DFGRepatch.cpp: + (JSC::DFG::dfgResetGetByID): + (JSC::DFG::dfgResetPutByID): + * dfg/DFGSpeculativeJIT32_64.cpp: + (JSC::DFG::SpeculativeJIT::cachedGetById): + (JSC::DFG::SpeculativeJIT::cachedPutById): + * dfg/DFGSpeculativeJIT64.cpp: + (JSC::DFG::SpeculativeJIT::cachedGetById): + (JSC::DFG::SpeculativeJIT::cachedPutById): + * jit/JIT.h: + * jit/JITPropertyAccess.cpp: + (JSC::JIT::resetPatchGetById): + (JSC::JIT::resetPatchPutById): + * jit/JITPropertyAccess32_64.cpp: + (JSC::JIT::resetPatchGetById): + (JSC::JIT::resetPatchPutById): + * jit/JITWriteBarrier.h: + (JSC::JITWriteBarrierBase::clearToUnusedPointer): + (JSC::JITWriteBarrierBase::get): + * jit/UnusedPointer.h: Added. + +2012-12-20 Filip Pizlo <fpizlo@apple.com> + + DFG shouldn't emit CheckStructure on array accesses if exit profiling tells it not to + https://bugs.webkit.org/show_bug.cgi?id=105577 + + Reviewed by Mark Hahnenberg. + + I don't know why this wasn't there from the beginning. + + * dfg/DFGByteCodeParser.cpp: + (JSC::DFG::ByteCodeParser::getArrayModeAndEmitChecks): + +2012-12-19 Filip Pizlo <fpizlo@apple.com> + + DFG speculation checks that take JumpList should consolidate OSRExits + https://bugs.webkit.org/show_bug.cgi?id=105401 + + Reviewed by Oliver Hunt. + + Change OSRExitCompilationInfo to always contain a JumpList, and change JumpList + to be more compact. This way, a speculationCheck that takes a JumpList only has + to emit one OSRExit structure, and one OSRExit landing pad. + + The downside is that we get less precise information about *where* we exited + from. So, this also includes changes to the profiler to be more relaxed about + what an ExitSite is. + + * assembler/AbstractMacroAssembler.h: + (JumpList): + * dfg/DFGJITCompiler.cpp: + (JSC::DFG::JITCompiler::linkOSRExits): + (JSC::DFG::JITCompiler::link): + * dfg/DFGJITCompiler.h: + (DFG): + (JSC::DFG::JITCompiler::appendExitInfo): + (JITCompiler): + * dfg/DFGOSRExitCompilationInfo.h: + (OSRExitCompilationInfo): + * dfg/DFGSpeculativeJIT.cpp: + (JSC::DFG::SpeculativeJIT::speculationCheck): + (JSC::DFG::SpeculativeJIT::speculationWatchpoint): + (JSC::DFG::SpeculativeJIT::forwardSpeculationCheck): + * profiler/ProfilerCompilation.cpp: + (JSC::Profiler::Compilation::addOSRExitSite): + * profiler/ProfilerCompilation.h: + (Compilation): + * profiler/ProfilerOSRExitSite.cpp: + (JSC::Profiler::OSRExitSite::toJS): + * profiler/ProfilerOSRExitSite.h: + (JSC::Profiler::OSRExitSite::OSRExitSite): + (JSC::Profiler::OSRExitSite::codeAddress): + (OSRExitSite): + +2012-12-19 Oliver Hunt <oliver@apple.com> + + Fix some incorrect tests in testapi.c + + Reviewed by Simon Fraser. + + * API/tests/testapi.c: + (main): + +2012-12-19 Filip Pizlo <fpizlo@apple.com> + + JSObject::ensure<IndexingType> should gracefully handle InterceptsGetOwn..., and should never be called when the 'this' is not an object + https://bugs.webkit.org/show_bug.cgi?id=105468 + + Reviewed by Mark Hahnenberg, Oliver Hunt, and Gavin Barraclough. + + Changed JSObject::ensure<IndexingType> methods to gracefully handle + InterceptsGetOwnPropertySlotByIndexEvenWhenLengthIsNotZero. Most of them handle it by returning + null as a result of indexingShouldBeSparse() returning true, while ensureArrayStorage handles it + by entering dictionary indexing mode, which forces the object to behave correctly even if there + is proxying or weird prototype stuff going on. + + Changed DFGOperations entrypoints to reject non-objects, so that JSObject doesn't have to deal + with pretending to be JSString. In particular, this would go wrong in the ArrayStorage case + since we'd try to resize a butterfly on a JSString, but JSString has something other than + m_butterfly at that offset. + + Finally, removed all InterceptsGetOwnPropertySlotByIndexEvenWhenLengthIsNotZero from JIT code + since those are now redundant. + + * dfg/DFGOperations.cpp: + * dfg/DFGOperations.h: + * dfg/DFGSpeculativeJIT.cpp: + (JSC::DFG::SpeculativeJIT::arrayify): + * dfg/DFGSpeculativeJIT.h: + (JSC::DFG::SpeculativeJIT::callOperation): + * runtime/JSObject.cpp: + (JSC::JSObject::enterDictionaryIndexingMode): + (JSC::JSObject::ensureInt32Slow): + (JSC::JSObject::ensureDoubleSlow): + (JSC::JSObject::ensureContiguousSlow): + (JSC::JSObject::ensureArrayStorageSlow): + (JSC): + (JSC::JSObject::putByIndexBeyondVectorLengthWithoutAttributes): + * runtime/JSObject.h: + (JSObject): + +2012-12-19 Oliver Hunt <oliver@apple.com> + + Tidy up JSScriptRef API + https://bugs.webkit.org/show_bug.cgi?id=105470 + + Reviewed by Anders Carlsson. + + People found the API's use of a context confusing, so we'll switch to a JSContextGroup based + API, and drop a number of the unnecessary uses of contexts. + + * API/JSScriptRef.cpp: + (OpaqueJSScript::globalData): + (parseScript): + * API/JSScriptRefPrivate.h: + * API/tests/testapi.c: + (main): + +2012-12-19 Alexis Menard <alexis@webkit.org> + + Implement CSS parsing for CSS transitions unprefixed. + https://bugs.webkit.org/show_bug.cgi?id=104804 + + Reviewed by Dean Jackson. + + Add a new flag ENABLE_CSS_TRANSFORMS_ANIMATIONS_TRANSITIONS_UNPREFIXED + to cover the work of unprefixing Transforms, Animations and + Transitions. It will let the possibility of each ports to turn it off + in their release branches until we're confident that these CSS + properties are ready to be unprefixed. + + * Configurations/FeatureDefines.xcconfig: + +2012-12-18 Filip Pizlo <fpizlo@apple.com> + + Proxies should set InterceptsGetOwnPropertySlotByIndexEvenWhenLengthIsNotZero + https://bugs.webkit.org/show_bug.cgi?id=105379 + + Reviewed by Gavin Barraclough. + + Forgetting to set this flag led to the DFG trying to ensure array storage on a proxy. I've + now hardened the code with a release assertion as well as fixing the bug. A release assertion + is appropriate here since this is slow-path code. + + * runtime/JSObject.cpp: + (JSC::JSObject::enterDictionaryIndexingMode): + (JSC::JSObject::ensureInt32Slow): + (JSC::JSObject::ensureDoubleSlow): + (JSC::JSObject::ensureContiguousSlow): + (JSC::JSObject::ensureArrayStorageSlowNoCheck): + (JSC::JSObject::ensureArrayStorageSlow): + (JSC): + (JSC::JSObject::putByIndexBeyondVectorLengthWithoutAttributes): + * runtime/JSObject.h: + (JSObject): + * runtime/JSProxy.h: + (JSProxy): + +2012-12-18 Oliver Hunt <oliver@apple.com> + + Add a JSScriptRef API to JSC so that we can allow API users to avoid the full cost of reparsing everytime the execute a script. + https://bugs.webkit.org/show_bug.cgi?id=105340 + + Reviewed by Gavin Barraclough. + + This patch adds a (currently private) API to allow users of the JSC API to create a JSScript object + that references a reusable version of the script that they wish to evaluate. This can help us avoid + numeorus copies that are otherwise induced by our existing API and gives us an opaque object that we + can hang various caches off. Currently this is simply a simple SourceProvider, but in future we may + be able to add more caching without requiring new/replacement APIs. + + * API/JSScriptRef.cpp: Added. + * API/JSScriptRefPrivate.h: Added. + * API/tests/testapi.c: + Add tests for new APIs. + * JavaScriptCore.xcodeproj/project.pbxproj: + +2012-12-18 Filip Pizlo <fpizlo@apple.com> + + DFG::SpeculativeJIT::jumpSlowForUnwantedArrayMode incorrectly checks for non-array array storage when it should be checking for array array storage + https://bugs.webkit.org/show_bug.cgi?id=105365 + + Reviewed by Mark Hahnenberg. + + * dfg/DFGSpeculativeJIT.cpp: + (JSC::DFG::SpeculativeJIT::jumpSlowForUnwantedArrayMode): + +2012-12-18 Filip Pizlo <fpizlo@apple.com> + + SunSpider/date-format-tofte shouldn't compile each of the tiny worthless eval's only to OSR exit in the prologue every time + https://bugs.webkit.org/show_bug.cgi?id=105335 + + Reviewed by Geoffrey Garen. + + The first thing I did was restructure the logic of canInlineResolveOperations(), + because I didn't understand it. This was relevant because the OSR exits are + caused by a resolve that the DFG cannot handle. + + I was then going to make it so that we didn't compile the resolve at all, but + realized that this would not be the best fix: it didn't seem sensible to me to + be optimizing these evals after only 60 invocations. Evals should have a higher + threshold, since they often contain code for which the baseline JIT does a + pretty good job already (if all you've got is a single heap access or a single + hard-to-inline call, then the baseline JIT has got you covered), and typically + if we see one eval code block we expect to see more (from the same eval site): + so our typical low threshold could lead to a *lot* of compilation. As such, the + main effect of this patch is to introduce an evalThresholdMultiplier, which is + now set to 10. + + This is a ~5% speed-up on data-format-tofte. No regressions anywhere as far as + I can see. + + * bytecode/CodeBlock.cpp: + (JSC::CodeBlock::codeTypeThresholdMultiplier): + (JSC): + (JSC::CodeBlock::optimizationThresholdScalingFactor): + (JSC::CodeBlock::exitCountThresholdForReoptimization): + (JSC::CodeBlock::exitCountThresholdForReoptimizationFromLoop): + * bytecode/CodeBlock.h: + (CodeBlock): + * dfg/DFGCapabilities.h: + (JSC::DFG::canInlineResolveOperations): + * dfg/DFGOSRExitCompiler.cpp: + * runtime/Options.h: + (JSC): + +2012-12-18 Filip Pizlo <fpizlo@apple.com> + + Convert indexingTypeToString to IndexingTypeDump + https://bugs.webkit.org/show_bug.cgi?id=105351 + + Reviewed by Mark Hahnenberg. + + This gets rid of another case of static char buffer[thingy]. + + * dfg/DFGGraph.cpp: + (JSC::DFG::Graph::dump): + * runtime/IndexingType.cpp: + (JSC::dumpIndexingType): + * runtime/IndexingType.h: + (JSC): + * runtime/JSValue.cpp: + (JSC::JSValue::dump): + +2012-12-18 Beth Dakin <bdakin@apple.com> + + https://bugs.webkit.org/show_bug.cgi?id=102579 + [mac] Enable scaled cursors + + Reviewed by Dean Jackson. + + * Configurations/FeatureDefines.xcconfig: + +2012-12-18 Mark Hahnenberg <mhahnenberg@apple.com> + + Restrictions on oversize CopiedBlock allocations should be relaxed + https://bugs.webkit.org/show_bug.cgi?id=105339 + + Reviewed by Filip Pizlo. + + Currently the DFG has a single branch in the inline allocation path for property/array storage where + it checks to see if the number of bytes requested will fit in the current block. This does not match + what the C++ allocation path does; it checks if the requested number of bytes is oversize, and then + if it's not, it tries to fit it in the current block. The garbage collector assumes that ALL allocations + that are greater than 16KB are in oversize blocks. Therefore, this mismatch can lead to crashes when + the collector tries to perform some operation on a CopiedBlock. + + To avoid adding an extra branch to the inline allocation path in the JIT, we should make it so that + oversize blocks are allocated on the same alignment boundaries so that there is a single mask to find + the block header of any CopiedBlock (rather than two, one for normal and one for oversize blocks), and + we should figure out if a block is oversize by some other method than just whatever the JSObject says + it is. One way we could record this info Region of the block, since we allocate a one-off Region for + oversize blocks. + + * heap/BlockAllocator.h: + (JSC::Region::isCustomSize): + (Region): + (JSC::Region::createCustomSize): + (JSC::Region::Region): + (JSC::BlockAllocator::deallocateCustomSize): + * heap/CopiedBlock.h: + (CopiedBlock): + (JSC::CopiedBlock::isOversize): + (JSC): + * heap/CopiedSpace.cpp: + (JSC::CopiedSpace::tryAllocateOversize): + (JSC::CopiedSpace::tryReallocate): + (JSC::CopiedSpace::tryReallocateOversize): + * heap/CopiedSpace.h: + (CopiedSpace): + * heap/CopiedSpaceInlines.h: + (JSC::CopiedSpace::contains): + (JSC::CopiedSpace::tryAllocate): + (JSC): + * heap/CopyVisitor.h: + (CopyVisitor): + * heap/CopyVisitorInlines.h: + (JSC::CopyVisitor::checkIfShouldCopy): + (JSC::CopyVisitor::didCopy): + * heap/SlotVisitorInlines.h: + (JSC::SlotVisitor::copyLater): + * runtime/JSObject.cpp: + (JSC::JSObject::copyButterfly): + +2012-12-18 Joseph Pecoraro <pecoraro@apple.com> + + [Mac] Add Build Phase to Check Headers for Inappropriate Macros (Platform.h macros) + https://bugs.webkit.org/show_bug.cgi?id=104279 + + Reviewed by David Kilzer. + + Add a build phase to check the public JavaScriptCore headers for + inappropriate macros. + + * JavaScriptCore.xcodeproj/project.pbxproj: + +2012-12-18 Michael Saboff <msaboff@apple.com> + + [Qt] Fix the ARMv7 build after r137976 + https://bugs.webkit.org/show_bug.cgi?id=105270 + + Reviewed by Csaba Osztrogonác. + + Add default value for Jump parameter to fix build. + + * assembler/AbstractMacroAssembler.h: + (JSC::AbstractMacroAssembler::Jump::Jump): + +2012-12-17 Geoffrey Garen <ggaren@apple.com> + + Constant fold !{number} in the parser + https://bugs.webkit.org/show_bug.cgi?id=105232 + + Reviewed by Filip Pizlo. + + Typically, we wait for hot execution and constant fold in the DFG. + However, !0 and !1 are common enough in minifiers that it can be good + to get them out of the way early, for faster/smaller parsing and startup. + + * parser/ASTBuilder.h: + (JSC::ASTBuilder::createLogicalNot): !{literal} is super simple, especially + since there's no literal form of NaN or Inf. + +2012-12-17 Filip Pizlo <fpizlo@apple.com> + + DFG is too aggressive eliding overflow checks for additions involving large constants + https://bugs.webkit.org/show_bug.cgi?id=105239 + + Reviewed by Gavin Barraclough. + + If we elide overflow checks on an addition (or subtraction) involving a larger-than-2^32 immediate, + then make sure that the non-constant child of the addition knows that he's got to do an overflow + check, by flowing the UsedAsNumber property at him. + + * dfg/DFGGraph.h: + (JSC::DFG::Graph::addSpeculationMode): + (Graph): + (JSC::DFG::Graph::addShouldSpeculateInteger): + (JSC::DFG::Graph::addImmediateShouldSpeculateInteger): + * dfg/DFGPredictionPropagationPhase.cpp: + (JSC::DFG::PredictionPropagationPhase::propagate): + +2012-12-17 Michael Saboff <msaboff@apple.com> + + DFG: Refactor DFGCorrectableJumpPoint to reduce size of OSRExit data + https://bugs.webkit.org/show_bug.cgi?id=105237 + + Reviewed by Filip Pizlo. + + Replaced DFGCorrectableJumpPoint with OSRExitCompilationInfo which is used and kept alive only while we are + compiling in the DFG. Moved the patchable branch offset directly into OSRExit. + + * CMakeLists.txt: + * GNUmakefile.list.am: + * JavaScriptCore.xcodeproj/project.pbxproj: + * Target.pri: + * assembler/AbstractMacroAssembler.h: + * dfg/DFGCorrectableJumpPoint.cpp: Removed. + * dfg/DFGCorrectableJumpPoint.h: Removed. + * dfg/DFGJITCompiler.cpp: + (JSC::DFG::JITCompiler::linkOSRExits): + (JSC::DFG::JITCompiler::link): + * dfg/DFGJITCompiler.h: + (JSC::DFG::JITCompiler::appendExitJump): + (JITCompiler): + * dfg/DFGOSRExit.cpp: + (JSC::DFG::OSRExit::OSRExit): + (JSC::DFG::OSRExit::setPatchableCodeOffset): + (JSC::DFG::OSRExit::getPatchableCodeOffsetAsJump): + (JSC::DFG::OSRExit::codeLocationForRepatch): + (JSC::DFG::OSRExit::correctJump): + * dfg/DFGOSRExit.h: + (OSRExit): + * dfg/DFGOSRExitCompilationInfo.h: Added. + (OSRExitCompilationInfo): + (JSC::DFG::OSRExitCompilationInfo::OSRExitCompilationInfo): + (JSC::DFG::OSRExitCompilationInfo::failureJump): + * dfg/DFGOSRExitCompiler.cpp: + * dfg/DFGSpeculativeJIT.cpp: + (JSC::DFG::SpeculativeJIT::speculationCheck): + (JSC::DFG::SpeculativeJIT::speculationWatchpoint): + +2012-12-17 Filip Pizlo <fpizlo@apple.com> + + DFG is too aggressive with eliding overflow checks in loops + https://bugs.webkit.org/show_bug.cgi?id=105226 + + Reviewed by Mark Hahnenberg and Oliver Hunt. + + If we see a variable's live range cross basic block boundaries, conservatively assume that it may + be part of a data-flow back-edge, and as a result, we may have entirely integer operations that + could lead to the creation of an integer that is out of range of 2^52 (the significand of a double + float). This does not seem to regress any of the benchmarks we care about, and it fixes the bug. + + In future we may want to actually look at whether or not there was a data-flow back-edge instead + of being super conservative about it. But we have no evidence, yet, that this would help us on + real code. + + * dfg/DFGNodeFlags.h: + (DFG): + * dfg/DFGPredictionPropagationPhase.cpp: + (JSC::DFG::PredictionPropagationPhase::propagate): + +2012-12-17 Mark Hahnenberg <mhahnenberg@apple.com> + + Butterfly::growArrayRight shouldn't be called on null Butterfly objects + https://bugs.webkit.org/show_bug.cgi?id=105221 + + Reviewed by Filip Pizlo. + + Currently we depend upon the fact that Butterfly::growArrayRight works with null Butterfly + objects purely by coincidence. We should add a new static function that null checks the old + Butterfly object and creates a new one if it's null, or calls growArrayRight if it isn't for + use in the couple of places in JSObject that expect such behavior to work. + + * runtime/Butterfly.h: + (Butterfly): + * runtime/ButterflyInlines.h: + (JSC::Butterfly::createOrGrowArrayRight): + (JSC): + * runtime/JSObject.cpp: + (JSC::JSObject::createInitialIndexedStorage): + (JSC::JSObject::createArrayStorage): + +2012-12-17 Filip Pizlo <fpizlo@apple.com> + + javascript integer overflow + https://bugs.webkit.org/show_bug.cgi?id=104967 + + Reviewed by Mark Hahnenberg. + + Fix PutScopedVar backward flow. + + * dfg/DFGPredictionPropagationPhase.cpp: + (JSC::DFG::PredictionPropagationPhase::propagate): + +2012-12-16 Filip Pizlo <fpizlo@apple.com> + + Rationalize array profiling for out-of-bounds and hole cases + https://bugs.webkit.org/show_bug.cgi?id=105139 + + Reviewed by Geoffrey Garen. + + This makes ArrayProfile track whether or not we had out-of-bounds, which allows + for more precise decision-making in the DFG. + + Also cleaned up ExitKinds for out-of-bounds and hole cases to make it easier to + look at them in the profiler. + + Slight speed-up (5-8%) on SunSpider/crypto-md5. + + * bytecode/ArrayProfile.cpp: + (JSC::ArrayProfile::computeUpdatedPrediction): + (JSC::ArrayProfile::briefDescription): + * bytecode/ArrayProfile.h: + (JSC::ArrayProfile::ArrayProfile): + (JSC::ArrayProfile::addressOfOutOfBounds): + (JSC::ArrayProfile::expectedStructure): + (JSC::ArrayProfile::structureIsPolymorphic): + (JSC::ArrayProfile::outOfBounds): + (JSC::ArrayProfile::polymorphicStructure): + * bytecode/CodeBlock.cpp: + (JSC::dumpChain): + * bytecode/ExitKind.cpp: + (JSC::exitKindToString): + (JSC::exitKindIsCountable): + * bytecode/ExitKind.h: + * dfg/DFGByteCodeParser.cpp: + (JSC::DFG::ByteCodeParser::getArrayModeAndEmitChecks): + * dfg/DFGSpeculativeJIT.cpp: + (JSC::DFG::SpeculativeJIT::compileDoublePutByVal): + * dfg/DFGSpeculativeJIT32_64.cpp: + (JSC::DFG::SpeculativeJIT::compileContiguousPutByVal): + (JSC::DFG::SpeculativeJIT::compile): + * dfg/DFGSpeculativeJIT64.cpp: + (JSC::DFG::SpeculativeJIT::compile): + * jit/JIT.h: + * jit/JITInlines.h: + (JSC::JIT::emitArrayProfileOutOfBoundsSpecialCase): + * jit/JITPropertyAccess.cpp: + (JSC::JIT::emitSlow_op_get_by_val): + (JSC::JIT::emitSlow_op_put_by_val): + * jit/JITPropertyAccess32_64.cpp: + (JSC::JIT::emitSlow_op_get_by_val): + (JSC::JIT::emitSlow_op_put_by_val): + * llint/LowLevelInterpreter32_64.asm: + * llint/LowLevelInterpreter64.asm: + +2012-12-17 Balazs Kilvady <kilvadyb@homejinni.com> + + Implement add64 for MIPS assembler after r136601 + https://bugs.webkit.org/show_bug.cgi?id=104106 + + Reviewed by Zoltan Herczeg. + + Added add64 function to MacroAssebler of MIPS. + + * assembler/MacroAssemblerMIPS.h: + (JSC::MacroAssemblerMIPS::add32): + (JSC::MacroAssemblerMIPS::add64): + (MacroAssemblerMIPS): + +2012-12-17 Jonathan Liu <net147@gmail.com> + + Fix Math.pow implementation with MinGW-w64 + https://bugs.webkit.org/show_bug.cgi?id=105087 + + Reviewed by Simon Hausmann. + + The MinGW-w64 runtime has different behaviour for pow() + compared to other C runtimes. This results in the following + test262 tests failing with the latest MinGW-w64 runtime: + - S15.8.2.13_A14 + - S15.8.2.13_A16 + - S15.8.2.13_A20 + - S15.8.2.13_A22 + + Handle the special cases that are different with MinGW-w64. + + * runtime/MathObject.cpp: + (JSC::mathPow): + +2012-12-16 Filip Pizlo <fpizlo@apple.com> + + Bytecode dumping should show rare case profiles + https://bugs.webkit.org/show_bug.cgi?id=105133 + + Reviewed by Geoffrey Garen. + + Refactored the dumper to call dumpBytecodeCommandAndNewLine in just one place, + rather than in all of the places. Changed the rare case profile getters to use + tryBinarySearch rather than binarySearch, so that they can be used speculatively + even if you don't know that the bytecode has rare case profiles. This actually + increases our assertion level, since it means that in release builds we will get + null and crash rather than getting some random adjacent profile. And then this + adds some printing of the rare case profiles. + + * bytecode/CodeBlock.cpp: + (JSC::CodeBlock::printUnaryOp): + (JSC::CodeBlock::printBinaryOp): + (JSC::CodeBlock::printConditionalJump): + (JSC::CodeBlock::printCallOp): + (JSC::CodeBlock::printPutByIdOp): + (JSC::CodeBlock::beginDumpProfiling): + (JSC): + (JSC::CodeBlock::dumpValueProfiling): + (JSC::CodeBlock::dumpArrayProfiling): + (JSC::CodeBlock::dumpRareCaseProfile): + (JSC::CodeBlock::dumpBytecode): + * bytecode/CodeBlock.h: + (JSC::CodeBlock::rareCaseProfileForBytecodeOffset): + (JSC::CodeBlock::specialFastCaseProfileForBytecodeOffset): + +2012-12-13 Filip Pizlo <fpizlo@apple.com> + + Attempt to rationalize and simplify WTF::binarySearch + https://bugs.webkit.org/show_bug.cgi?id=104890 + + Reviewed by Maciej Stachowiak. + + Switch to using the new binarySearch() API. No change in behavior. + + * bytecode/CodeBlock.cpp: + (JSC::CodeBlock::bytecodeOffset): + (JSC::CodeBlock::codeOriginForReturn): + * bytecode/CodeBlock.h: + (JSC::CodeBlock::getStubInfo): + (JSC::CodeBlock::getByValInfo): + (JSC::CodeBlock::getCallLinkInfo): + (JSC::CodeBlock::dfgOSREntryDataForBytecodeIndex): + (JSC::CodeBlock::valueProfileForBytecodeOffset): + (JSC::CodeBlock::rareCaseProfileForBytecodeOffset): + (JSC::CodeBlock::specialFastCaseProfileForBytecodeOffset): + * dfg/DFGGraph.h: + (JSC::DFG::Graph::blockIndexForBytecodeOffset): + * dfg/DFGMinifiedGraph.h: + (JSC::DFG::MinifiedGraph::at): + * dfg/DFGOSRExitCompiler32_64.cpp: + (JSC::DFG::OSRExitCompiler::compileExit): + * dfg/DFGOSRExitCompiler64.cpp: + (JSC::DFG::OSRExitCompiler::compileExit): + * llint/LLIntSlowPaths.cpp: + (JSC::LLInt::LLINT_SLOW_PATH_DECL): + * profiler/ProfilerBytecodeSequence.cpp: + (JSC::Profiler::BytecodeSequence::indexForBytecodeIndex): + +2012-12-13 Filip Pizlo <fpizlo@apple.com> + + Don't assert that flags <= 0x3ff in JSTypeInfo + https://bugs.webkit.org/show_bug.cgi?id=104988 + + Reviewed by Sam Weinig. + + This assertion doesn't accomplish anything other than crashes. + + * runtime/JSTypeInfo.h: + (JSC::TypeInfo::TypeInfo): + +2012-12-13 Filip Pizlo <fpizlo@apple.com> + + Named lookups on HTML documents produce inconsistent results in JavaScriptCore bindings + https://bugs.webkit.org/show_bug.cgi?id=104623 + + Reviewed by Geoffrey Garen. + + Add the notion of objects that HasImpureGetOwnPropertySlot, and use that to inhibit prototype chain caching + in some cases. This appears to be perf-neutral on benchmarks that we track. + + * dfg/DFGRepatch.cpp: + (JSC::DFG::tryCacheGetByID): + (JSC::DFG::tryBuildGetByIDProtoList): + * jit/JITStubs.cpp: + (JSC::JITThunks::tryCacheGetByID): + (JSC::DEFINE_STUB_FUNCTION): + * runtime/JSTypeInfo.h: + (JSC): + (JSC::TypeInfo::hasImpureGetOwnPropertySlot): + * runtime/Operations.h: + (JSC::normalizePrototypeChainForChainAccess): + +2012-12-13 Filip Pizlo <fpizlo@apple.com> + + Unreviewed, roll out http://trac.webkit.org/changeset/137683. + It broke gmail. + + * dfg/DFGAbstractState.cpp: + (JSC::DFG::AbstractState::execute): + * dfg/DFGByteCodeParser.cpp: + (JSC::DFG::ByteCodeParser::parseBlock): + * dfg/DFGCSEPhase.cpp: + (JSC::DFG::CSEPhase::putStructureStoreElimination): + (JSC::DFG::CSEPhase::performNodeCSE): + * dfg/DFGCapabilities.h: + (JSC::DFG::canCompileOpcode): + * dfg/DFGNodeType.h: + (DFG): + * dfg/DFGOperations.cpp: + * dfg/DFGOperations.h: + * dfg/DFGPredictionPropagationPhase.cpp: + (JSC::DFG::PredictionPropagationPhase::propagate): + * dfg/DFGSpeculativeJIT32_64.cpp: + (JSC::DFG::SpeculativeJIT::compile): + * dfg/DFGSpeculativeJIT64.cpp: + (JSC::DFG::SpeculativeJIT::compile): + * runtime/Operations.cpp: + (JSC::jsTypeStringForValue): + (JSC): + * runtime/Operations.h: + (JSC): + +2012-13-11 Oliver Hunt <oliver@apple.com> + + Support op_typeof in the DFG + https://bugs.webkit.org/show_bug.cgi?id=98898 + + Reviewed by Filip Pizlo. + + Adds a TypeOf node to the DFG to support op_typeof. + + * dfg/DFGAbstractState.cpp: + (JSC::DFG::AbstractState::execute): + We try to determine the result early here, and substitute in a constant. + Otherwise we leave the node intact, and set the result type to SpecString. + * dfg/DFGByteCodeParser.cpp: + (JSC::DFG::ByteCodeParser::parseBlock): + Parse op_typeof + * dfg/DFGCSEPhase.cpp: + (JSC::DFG::CSEPhase::performNodeCSE): + TypeOf nodes can be subjected to pure CSE + * dfg/DFGCapabilities.h: + (JSC::DFG::canCompileOpcode): + We can handle typeof. + * dfg/DFGNodeType.h: + (DFG): + Define the node. + * dfg/DFGOperations.cpp: + * dfg/DFGOperations.h: + Add operationTypeOf to support the non-trivial cases. + * dfg/DFGPredictionPropagationPhase.cpp: + (JSC::DFG::PredictionPropagationPhase::propagate): + * dfg/DFGSpeculativeJIT32_64.cpp: + (JSC::DFG::SpeculativeJIT::compile): + * dfg/DFGSpeculativeJIT64.cpp: + (JSC::DFG::SpeculativeJIT::compile): + Actual codegen + * runtime/Operations.cpp: + (JSC::jsTypeStringForValue): + (JSC): + * runtime/Operations.h: + (JSC): + Some refactoring to allow us to get the type string for an + object without needing a callframe. + +2012-12-12 Filip Pizlo <fpizlo@apple.com> + + OSR exit compiler should emit code for resetting the execution counter that matches the logic of ExecutionCounter.cpp + https://bugs.webkit.org/show_bug.cgi?id=104791 + + Reviewed by Oliver Hunt. + + The OSR exit compiler wants to make it so that every OSR exit does the equivalent + of: + + codeBlock->m_jitExecuteCounter.setNewThreshold( + codeBlock->counterValueForOptimizeAfterLongWarmUp()); + + This logically involves: + + - Resetting the counter to zero. + - Setting m_activeThreshold to counterValueForOptimizeAfterLongWarmUp(). + - Figuring out the scaled threshold, subtracting the count so far (which is zero, + so this part is a no-op), and clipping (ExecuteCounter::clippedThreshold()). + - Setting m_counter to the negated clipped threshold. + - Setting m_totalCount to the previous count so far (which is zero) plus the + clipped threshold. + + Because of the reset, which sets the count-so-far to zero, this amounts to: + + - Setting m_activeThreshold to counterValueForOptimizeAfterLongWarmUp(). + - Figuring out the clipped scaled threshold. + - Setting m_counter to the negated clipped scaled threshold. + - Setting m_totalCount to the (positive) clipped scaled threshold. + + The code was previously not doing this, but now is. This is performance neutral. + The only change in behavior over what the code was previously doing (setting the + m_counter to the negated scaled threshold, without clipping, and then setting + the m_totalCount to the clipped scaled threshold) is that this will respond more + gracefully under memory pressure and will ensure that we get more value profile + LUBing before triggering recompilation. More LUBing is almost always a good + thing. + + * dfg/DFGOSRExitCompiler.cpp: + (JSC::DFG::OSRExitCompiler::handleExitCounts): + +2012-12-12 Ilya Tikhonovsky <loislo@chromium.org> + + Web Inspector: Native Memory Instrumentation: remove fake root MemoryObjectInfo. + https://bugs.webkit.org/show_bug.cgi?id=104796 + + Reviewed by Yury Semikhatsky. + + It was not a good idea to introduce a fake root MemoryObjectInfo. + It makes a problem when we visit an object without its own MemoryObjectType. + + Example: RenderBox has a global pointer to a hash map. + HashMap doesn't have its own object type because it is a generic container. + It will inherit object type from the fake root memory object info. + The same could happen for another container in another class with other MemoryObjectType. + + This fact forces me to create custom process method for root objects + because they need to have their own MemoryObjectInfo with customisable memory object type. + + Drive by fix: InstrumentedPointer* was replaced with Wrapper* because actually it is using + for instrumented and not instrumented object classes. + + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.def: + +2012-12-11 Gabor Ballabas <gaborb@inf.u-szeged.hu> + + Implement add64 for ARM traditional assembler after r136601 + https://bugs.webkit.org/show_bug.cgi?id=104103 + + Reviewed by Zoltan Herczeg. + + Implement add64 function for ARM traditional macroassembler. + + * assembler/MacroAssemblerARM.h: + (JSC::MacroAssemblerARM::add64): + (MacroAssemblerARM): + +2012-12-11 Filip Pizlo <fpizlo@apple.com> + + Unreviewed. Fix build with DFG_ENABLE(DEBUG_PROPAGATION_VERBOSE). + + * bytecode/CodeBlock.cpp: + (JSC::CodeBlock::tallyFrequentExitSites): + +2012-12-11 Filip Pizlo <fpizlo@apple.com> + + Profiler should show bytecode dumps as they would have been visible to the JITs, including the profiling data that the JITs would see + https://bugs.webkit.org/show_bug.cgi?id=104647 + + Reviewed by Oliver Hunt. + + Adds more profiling data to bytecode dumps, and adds the ability to do a secondary + bytecode dump for each JIT compilation of a code block. This is relevant because both + the bytecodes, and the profiling data, may change after some number of executions. + + Also fixes some random dumping code to use PrintStream& rather than + static const char[thingy]. + + * CMakeLists.txt: + * GNUmakefile.list.am: + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: + * JavaScriptCore.xcodeproj/project.pbxproj: + * Target.pri: + * bytecode/ArrayProfile.cpp: + (JSC::dumpArrayModes): + (JSC::ArrayProfile::briefDescription): + * bytecode/ArrayProfile.h: + * bytecode/CodeBlock.cpp: + (JSC::CodeBlock::printGetByIdOp): + (JSC::CodeBlock::printGetByIdCacheStatus): + (JSC::CodeBlock::printCallOp): + (JSC::CodeBlock::dumpValueProfiling): + (JSC::CodeBlock::dumpArrayProfiling): + (JSC::CodeBlock::dumpBytecode): + * bytecode/CodeBlock.h: + * bytecode/ValueProfile.h: + (JSC::ValueProfileBase::briefDescription): + * dfg/DFGAbstractValue.h: + (JSC::DFG::AbstractValue::dump): + * dfg/DFGByteCodeParser.cpp: + (JSC::DFG::ByteCodeParser::parseCodeBlock): + * jit/JIT.cpp: + (JSC::JIT::privateCompile): + * profiler/ProfilerBytecodeSequence.cpp: Added. + (JSC::Profiler::BytecodeSequence::BytecodeSequence): + (JSC::Profiler::BytecodeSequence::~BytecodeSequence): + (JSC::Profiler::BytecodeSequence::indexForBytecodeIndex): + (JSC::Profiler::BytecodeSequence::forBytecodeIndex): + (JSC::Profiler::BytecodeSequence::addSequenceProperties): + * profiler/ProfilerBytecodeSequence.h: Added. + (JSC::Profiler::BytecodeSequence::size): + (JSC::Profiler::BytecodeSequence::at): + * profiler/ProfilerBytecodes.cpp: + (JSC::Profiler::Bytecodes::Bytecodes): + (JSC::Profiler::Bytecodes::toJS): + * profiler/ProfilerBytecodes.h: + (JSC::Profiler::Bytecodes::instructionCount): + * profiler/ProfilerCompilation.cpp: + (JSC::Profiler::Compilation::addProfiledBytecodes): + (JSC::Profiler::Compilation::toJS): + * profiler/ProfilerCompilation.h: + (JSC::Profiler::Compilation::profiledBytecodesSize): + (JSC::Profiler::Compilation::profiledBytecodesAt): + * profiler/ProfilerDatabase.cpp: + (JSC::Profiler::Database::ensureBytecodesFor): + * profiler/ProfilerDatabase.h: + * profiler/ProfilerProfiledBytecodes.cpp: Added. + (JSC::Profiler::ProfiledBytecodes::ProfiledBytecodes): + (JSC::Profiler::ProfiledBytecodes::~ProfiledBytecodes): + (JSC::Profiler::ProfiledBytecodes::toJS): + * profiler/ProfilerProfiledBytecodes.h: Added. + (JSC::Profiler::ProfiledBytecodes::bytecodes): + * runtime/CommonIdentifiers.h: + +2012-12-11 Oswald Buddenhagen <oswald.buddenhagen@digia.com> + + [Qt] delete dead include paths + + Reviewed by Simon Hausmann. + + followup to https://bugs.webkit.org/show_bug.cgi?id=93446 + + * JavaScriptCore.pri: + +2012-12-11 Julien BRIANCEAU <jbrianceau@nds.com> + + Implement add64 for SH4 assembler to fix build after r136601 + https://bugs.webkit.org/show_bug.cgi?id=104377 + + Reviewed by Zoltan Herczeg. + + * assembler/MacroAssemblerSH4.h: + (JSC::MacroAssemblerSH4::add64): + (MacroAssemblerSH4): + +2012-12-10 Yury Semikhatsky <yurys@chromium.org> + + Memory instrumentation: make sure each edge is reported only once + https://bugs.webkit.org/show_bug.cgi?id=104630 + + Reviewed by Pavel Feldman. + + Changed exported symbols for MemoryInstrumentation. + + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.def: + +2012-12-10 Filip Pizlo <fpizlo@apple.com> + + Don't OSR exit just because a string is a rope + https://bugs.webkit.org/show_bug.cgi?id=104621 + + Reviewed by Michael Saboff. + + Slight SunSpider speed-up at around the 0.7% level. This patch does the obvious + thing of calling a slow path to resolve ropes rather than OSR exiting if the + string is a rope. + + * dfg/DFGAbstractState.cpp: + (JSC::DFG::AbstractState::execute): + * dfg/DFGArrayMode.h: + (JSC::DFG::ArrayMode::getIndexedPropertyStorageMayTriggerGC): + (ArrayMode): + * dfg/DFGCSEPhase.cpp: + (JSC::DFG::CSEPhase::putStructureStoreElimination): + * dfg/DFGOperations.cpp: + * dfg/DFGOperations.h: + * dfg/DFGSpeculativeJIT.cpp: + (JSC::DFG::SpeculativeJIT::compileGetIndexedPropertyStorage): + * dfg/DFGSpeculativeJIT.h: + (JSC::DFG::SpeculativeJIT::callOperation): + +2012-12-10 Gustavo Noronha Silva <gns@gnome.org> + + Unreviewed distcheck fix. + + * GNUmakefile.list.am: + +2012-12-10 Filip Pizlo <fpizlo@apple.com> + + JSC profiling and debug dump code should use inferred names when possible + https://bugs.webkit.org/show_bug.cgi?id=104519 + + Reviewed by Oliver Hunt. + + This does as advertised: the profiler now knows the inferred name of all code blocks, + and all uses of CodeBlock::dump() dump it along with the hash. + + * bytecode/CodeBlock.cpp: + (JSC::CodeBlock::inferredName): + (JSC::CodeBlock::dumpAssumingJITType): + * bytecode/CodeBlock.h: + * profiler/ProfilerBytecodes.cpp: + (JSC::Profiler::Bytecodes::Bytecodes): + (JSC::Profiler::Bytecodes::toJS): + * profiler/ProfilerBytecodes.h: + (JSC::Profiler::Bytecodes::inferredName): + * profiler/ProfilerDatabase.cpp: + (JSC::Profiler::Database::addBytecodes): + (JSC::Profiler::Database::ensureBytecodesFor): + * profiler/ProfilerDatabase.h: + * runtime/CommonIdentifiers.h: + +2012-12-09 Filip Pizlo <fpizlo@apple.com> + + Profiler should say things about OSR exits + https://bugs.webkit.org/show_bug.cgi?id=104497 + + Reviewed by Oliver Hunt. + + This adds support for profiling OSR exits. For each exit that is taken, the profiler + records the machine code address that the exit occurred on, the exit kind, the origin + stack, and the number of times that it happened. + + * CMakeLists.txt: + * GNUmakefile.list.am: + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: + * JavaScriptCore.xcodeproj/project.pbxproj: + * Target.pri: + * assembler/AbstractMacroAssembler.h: + (Jump): + (JSC::AbstractMacroAssembler::Jump::label): + * bytecode/CodeBlock.h: + (JSC::CodeBlock::saveCompilation): + (CodeBlock): + (JSC::CodeBlock::compilation): + (DFGData): + * bytecode/DFGExitProfile.h: + (DFG): + * bytecode/ExitKind.cpp: Added. + (JSC): + (JSC::exitKindToString): + (JSC::exitKindIsCountable): + (WTF): + (WTF::printInternal): + * bytecode/ExitKind.h: Added. + (JSC): + (WTF): + * dfg/DFGGraph.h: + (Graph): + * dfg/DFGJITCompiler.cpp: + (JSC::DFG::JITCompiler::linkOSRExits): + (JSC::DFG::JITCompiler::link): + (JSC::DFG::JITCompiler::compile): + (JSC::DFG::JITCompiler::compileFunction): + * dfg/DFGJITCompiler.h: + (JITCompiler): + * dfg/DFGOSRExitCompiler.cpp: + * jit/JIT.cpp: + (JSC::JIT::JIT): + (JSC::JIT::privateCompile): + * jit/JIT.h: + (JIT): + * jit/JumpReplacementWatchpoint.h: + (JSC::JumpReplacementWatchpoint::sourceLabel): + (JumpReplacementWatchpoint): + * profiler/ProfilerCompilation.cpp: + (JSC::Profiler::Compilation::addOSRExitSite): + (Profiler): + (JSC::Profiler::Compilation::addOSRExit): + (JSC::Profiler::Compilation::toJS): + * profiler/ProfilerCompilation.h: + (Compilation): + * profiler/ProfilerDatabase.cpp: + (JSC::Profiler::Database::newCompilation): + * profiler/ProfilerDatabase.h: + (Database): + * profiler/ProfilerOSRExit.cpp: Added. + (Profiler): + (JSC::Profiler::OSRExit::OSRExit): + (JSC::Profiler::OSRExit::~OSRExit): + (JSC::Profiler::OSRExit::toJS): + * profiler/ProfilerOSRExit.h: Added. + (Profiler): + (OSRExit): + (JSC::Profiler::OSRExit::id): + (JSC::Profiler::OSRExit::origin): + (JSC::Profiler::OSRExit::exitKind): + (JSC::Profiler::OSRExit::isWatchpoint): + (JSC::Profiler::OSRExit::counterAddress): + (JSC::Profiler::OSRExit::count): + * profiler/ProfilerOSRExitSite.cpp: Added. + (Profiler): + (JSC::Profiler::OSRExitSite::toJS): + * profiler/ProfilerOSRExitSite.h: Added. + (Profiler): + (OSRExitSite): + (JSC::Profiler::OSRExitSite::OSRExitSite): + (JSC::Profiler::OSRExitSite::codeAddress): + * runtime/CommonIdentifiers.h: + +2012-12-10 Alexis Menard <alexis@webkit.org> + + [CSS3 Backgrounds and Borders] Remove CSS3_BACKGROUND feature flag. + https://bugs.webkit.org/show_bug.cgi?id=104539 + + Reviewed by Antonio Gomes. + + As discussed on webkit-dev it is not needed to keep this feature flag + as support for <position> type is a small feature that is already + implemented by three other UAs. It was useful while landing this + feature as partial bits were landed one after one. + + * Configurations/FeatureDefines.xcconfig: + +2012-12-09 Filip Pizlo <fpizlo@apple.com> + + DFG ArrayPush/Pop should not pass their second child as the index for blessArrayOperation() + https://bugs.webkit.org/show_bug.cgi?id=104500 + + Reviewed by Oliver Hunt. + + Slight across-the-board speed-up. + + * dfg/DFGAbstractState.cpp: + (JSC::DFG::AbstractState::execute): + * dfg/DFGFixupPhase.cpp: + (JSC::DFG::FixupPhase::fixupNode): + +2012-12-08 Filip Pizlo <fpizlo@apple.com> + + JSC should scale the optimization threshold for a code block according to the cost of compiling it + https://bugs.webkit.org/show_bug.cgi?id=104406 + + Reviewed by Oliver Hunt. + + We've long known that we want to scale the execution count threshold needed for the DFG + to kick in to scale according to some estimate of the cost of compiling that code block. + This institutes a relationship like this: + + threshold = thresholdSetting * (a * sqrt(instructionCount + b) + abs(c * instructionCount) + d + + Where a, b, c, d are coefficients derived from fitting the above expression to various + data points, which I chose based on looking at one benchmark (3d-cube) and from my + own intuitions. + + Making this work well also required changing the thresholdForOptimizeAfterLongWarmUp + from 5000 to 1000. + + This is a >1% speed-up on SunSpider, a >3% speed-up on V8Spider, ~1% speed-up on V8v7, + neutral on Octane, and neutral on Kraken. + + I also out-of-lined a bunch of methods related to these heuristics, because I couldn't + stand having them defined in the header anymore. I also made improvements to debugging + code because I needed it for tuning this change. + + * CMakeLists.txt: + * GNUmakefile.list.am: + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: + * JavaScriptCore.xcodeproj/project.pbxproj: + * Target.pri: + * bytecode/CodeBlock.cpp: + (JSC::CodeBlock::sourceCodeForTools): + (JSC::CodeBlock::sourceCodeOnOneLine): + (JSC::CodeBlock::dumpBytecode): + (JSC::CodeBlock::CodeBlock): + (JSC::CodeBlock::reoptimizationRetryCounter): + (JSC::CodeBlock::countReoptimization): + (JSC::CodeBlock::optimizationThresholdScalingFactor): + (JSC::clipThreshold): + (JSC::CodeBlock::counterValueForOptimizeAfterWarmUp): + (JSC::CodeBlock::counterValueForOptimizeAfterLongWarmUp): + (JSC::CodeBlock::counterValueForOptimizeSoon): + (JSC::CodeBlock::checkIfOptimizationThresholdReached): + (JSC::CodeBlock::optimizeNextInvocation): + (JSC::CodeBlock::dontOptimizeAnytimeSoon): + (JSC::CodeBlock::optimizeAfterWarmUp): + (JSC::CodeBlock::optimizeAfterLongWarmUp): + (JSC::CodeBlock::optimizeSoon): + (JSC::CodeBlock::adjustedExitCountThreshold): + (JSC::CodeBlock::exitCountThresholdForReoptimization): + (JSC::CodeBlock::exitCountThresholdForReoptimizationFromLoop): + (JSC::CodeBlock::shouldReoptimizeNow): + (JSC::CodeBlock::shouldReoptimizeFromLoopNow): + * bytecode/CodeBlock.h: + * bytecode/ExecutionCounter.cpp: + (JSC::ExecutionCounter::hasCrossedThreshold): + * bytecode/ReduceWhitespace.cpp: Added. + (JSC::reduceWhitespace): + * bytecode/ReduceWhitespace.h: Added. + * dfg/DFGCapabilities.cpp: + (JSC::DFG::mightCompileEval): + (JSC::DFG::mightCompileProgram): + (JSC::DFG::mightCompileFunctionForCall): + (JSC::DFG::mightCompileFunctionForConstruct): + (JSC::DFG::mightInlineFunctionForCall): + (JSC::DFG::mightInlineFunctionForConstruct): + * dfg/DFGCapabilities.h: + * dfg/DFGDisassembler.cpp: + (JSC::DFG::Disassembler::dumpHeader): + * dfg/DFGOSREntry.cpp: + (JSC::DFG::prepareOSREntry): + * jit/JITDisassembler.cpp: + (JSC::JITDisassembler::dumpHeader): + * jit/JITStubs.cpp: + (JSC::DEFINE_STUB_FUNCTION): + * llint/LLIntSlowPaths.cpp: + (JSC::LLInt::entryOSR): + (JSC::LLInt::LLINT_SLOW_PATH_DECL): + * profiler/ProfilerDatabase.cpp: + (JSC::Profiler::Database::ensureBytecodesFor): + * runtime/Options.h: + +2012-12-07 Jonathan Liu <net147@gmail.com> + + Add missing forward declaration for JSC::ArrayAllocationProfile + https://bugs.webkit.org/show_bug.cgi?id=104425 + + Reviewed by Kentaro Hara. + + The header for the JSC::ArrayConstructor class is missing a forward + declaration for the JSC::ArrayAllocationProfile class which causes + compilation to fail when compiling with MinGW-w64. + + * runtime/ArrayConstructor.h: + (JSC): + +2012-12-07 Jonathan Liu <net147@gmail.com> + + Add missing const qualifier to JSC::CodeBlock::getJITType() + https://bugs.webkit.org/show_bug.cgi?id=104424 + + Reviewed by Laszlo Gombos. + + JSC::CodeBlock::getJITType() has the const qualifier when JIT is + enabled but is missing the const qualifier when JIT is disabled. + + * bytecode/CodeBlock.h: + (JSC::CodeBlock::getJITType): + +2012-12-07 Oliver Hunt <oliver@apple.com> + + Make function code cache proportional to main codeblock cache + https://bugs.webkit.org/show_bug.cgi?id=104420 + + Reviewed by Geoffrey Garen. + + Makes the constants determining the recently used function cache proportional + to the number of root codeblocks in the cache. Also renames the constants to + make them more clear. + + * runtime/CodeCache.h: + +2012-12-06 Filip Pizlo <fpizlo@apple.com> + + Strange results calculating a square root in a loop + https://bugs.webkit.org/show_bug.cgi?id=104247 + <rdar://problem/12826880> + + Reviewed by Oliver Hunt. + + Fixed the CFG simplification phase to ignore dead GetLocals in the first of the blocks + under the merge. This fixes the assertion, and is also cleaner: our general rule is + to not "revive" things that we've already proved to be dead. + + Also fixed some rotted debug code. + + * dfg/DFGCFGSimplificationPhase.cpp: + (JSC::DFG::CFGSimplificationPhase::fixPossibleGetLocal): + * dfg/DFGStructureCheckHoistingPhase.cpp: + (JSC::DFG::StructureCheckHoistingPhase::run): + +2012-12-07 Geoffrey Garen <ggaren@apple.com> + + Crash in JSC::Bindings::RootObject::globalObject() sync'ing notes in Evernote + https://bugs.webkit.org/show_bug.cgi?id=104321 + <rdar://problem/12770497> + + Reviewed by Sam Weinig. + + Work around a JSValueUnprotect(NULL) in Evernote. + + * API/JSValueRef.cpp: + (evernoteHackNeeded): + (JSValueUnprotect): + +2012-12-06 Filip Pizlo <fpizlo@apple.com> + + Incorrect inequality for checking whether a statement is within bounds of a handler + https://bugs.webkit.org/show_bug.cgi?id=104313 + <rdar://problem/12808934> + + Reviewed by Geoffrey Garen. + + The most relevant change is in handlerForBytecodeOffset(), which fixes the inequality + used for checking whether a handler is pertinent to the current instruction. '<' is + correct, but '<=' isn't, since the 'end' is not inclusive. + + Also found, and addressed, a benign goof in how the finally inliner works: sometimes + we will have end > start. This falls out naturally from how the inliner works and how + we pop scopes in the bytecompiler, but it's sufficiently surprising that, to avoid any + future confusion, I added a comment and some code to prune those handlers out. Because + of how the handler resolution works, these handlers would have been skipped anyway. + + Also made various fixes to debugging code, which was necessary for tracking this down. + + * bytecode/CodeBlock.cpp: + (JSC::CodeBlock::dumpBytecode): + (JSC::CodeBlock::handlerForBytecodeOffset): + * bytecompiler/BytecodeGenerator.cpp: + (JSC::BytecodeGenerator::generate): + * bytecompiler/Label.h: + (JSC::Label::bind): + * interpreter/Interpreter.cpp: + (JSC::Interpreter::throwException): + * llint/LLIntExceptions.cpp: + (JSC::LLInt::interpreterThrowInCaller): + (JSC::LLInt::returnToThrow): + (JSC::LLInt::callToThrow): + * llint/LLIntSlowPaths.cpp: + (JSC::LLInt::LLINT_SLOW_PATH_DECL): + (JSC::LLInt::handleHostCall): + +2012-12-06 Rick Byers <rbyers@chromium.org> + + CSS cursor property should support webkit-image-set + https://bugs.webkit.org/show_bug.cgi?id=99493 + + Reviewed by Beth Dakin. + + Add ENABLE_MOUSE_CURSOR_SCALE (disabled by default) + + * Configurations/FeatureDefines.xcconfig: + +2012-12-06 Laszlo Gombos <l.gombos@samsung.com> + + [CMake] Consolidate list of files to build for JavaScriptCore + https://bugs.webkit.org/show_bug.cgi?id=104287 + + Reviewed by Gyuyoung Kim. + + Add MemoryStatistics.cpp and ExecutableAllocator.cpp to the common + list of files and remove them from the port specific lists. + + * CMakeLists.txt: + * PlatformBlackBerry.cmake: + * PlatformEfl.cmake: + * PlatformWinCE.cmake: + +2012-12-06 Oliver Hunt <oliver@apple.com> + + Tell heap that we've released all the compiled code. + + Reviewed by Geoff Garen. + + When we discard compiled code, inform the heap that we've + released an entire object graph. This informs the heap that + it might want to perform a GC soon. + + * runtime/JSGlobalData.cpp: + (JSC::JSGlobalData::discardAllCode): + +2012-12-06 Laszlo Gombos <l.gombos@samsung.com> + + [EFL] Remove ENABLE_GLIB_SUPPORT CMake variable + https://bugs.webkit.org/show_bug.cgi?id=104278 + + Reviewed by Brent Fulgham. + + The conditional is not required as it is always set for EFL. + + * PlatformEfl.cmake: + +2012-12-06 Oliver Hunt <oliver@apple.com> + + Build fix, last patch rolled out logic that is now needed on ToT. + + * parser/ASTBuilder.h: + (ASTBuilder): + (JSC::ASTBuilder::setFunctionStart): + * parser/Nodes.h: + (JSC::FunctionBodyNode::setFunctionStart): + (JSC::FunctionBodyNode::functionStart): + (FunctionBodyNode): + * parser/Parser.cpp: + (JSC::::parseFunctionInfo): + * parser/SyntaxChecker.h: + (JSC::SyntaxChecker::setFunctionStart): + +2012-12-05 Oliver Hunt <oliver@apple.com> + + Remove harmful string->function cache + https://bugs.webkit.org/show_bug.cgi?id=104193 + + Reviewed by Alexey Proskuryakov. + + Remove the string->function code cache that turned out to actually + be quite harmful. + + * runtime/CodeCache.cpp: + (JSC::CodeCache::getFunctionCodeBlock): + * runtime/CodeCache.h: + (JSC::CodeCache::clear): + +2012-12-05 Halton Huo <halton.huo@intel.com> + + [CMake] Unify coding style for CMake files + https://bugs.webkit.org/show_bug.cgi?id=103605 + + Reviewed by Laszlo Gombos. + + Update cmake files(.cmake, CMakeLists.txt) with following style rules: + 1. Indentation + 1.1 Use spaces, not tabs. + 1.2 Four spaces as indent. + 2. Spacing + 2.1 Place one space between control statements and their parentheses. + For eg, if (), else (), elseif (), endif (), foreach (), + endforeach (), while (), endwhile (), break (). + 2.2 Do not place spaces between function and macro statements and + their parentheses. For eg, macro(), endmacro(), function(), + endfunction(). + 2.3 Do not place spaces between a command or function or macro and its + parentheses, or between a parenthesis and its content. For eg, + message("testing") not message( "testing") or message ("testing" ) + 2.4 No space at line ending. + 3. Lowercase when call commands macros and functions. For eg, + add_executable() not ADD_EXECUTABLE(), set() not SET(). + + * CMakeLists.txt: + * PlatformBlackBerry.cmake: + * PlatformEfl.cmake: + * PlatformWinCE.cmake: + * shell/CMakeLists.txt: + * shell/PlatformBlackBerry.cmake: + * shell/PlatformEfl.cmake: + * shell/PlatformWinCE.cmake: + +2012-12-05 Oliver Hunt <oliver@apple.com> + + Empty parse cache when receiving a low memory warning + https://bugs.webkit.org/show_bug.cgi?id=104161 + + Reviewed by Filip Pizlo. + + This adds a function to the globaldata to empty all code related data + structures (code in the heap and the code cache). + It also adds a function to allow the CodeCache to actually be cleared + at all. + + * runtime/CodeCache.h: + (CacheMap): + (JSC::CacheMap::clear): + (JSC::CodeCache::clear): + (CodeCache): + * runtime/JSGlobalData.cpp: + (JSC::JSGlobalData::discardAllCode): + (JSC): + * runtime/JSGlobalData.h: + (JSGlobalData): + +2012-12-05 Filip Pizlo <fpizlo@apple.com> + + JSC profiler should not count executions of op_call_put_result because doing so changes DFG codegen + https://bugs.webkit.org/show_bug.cgi?id=104102 + + Reviewed by Oliver Hunt. + + This removes op_call_put_result from profiling, since profiling it has an effect on + codegen. This fix enables all of SunSpider, V8, and Kraken to be profiled with the + new profiler. + + To make this all fit together, the profiler now also reports in its output the exact + bytecode opcode name for each instruction (in addition to the stringified dump of that + bytecode), so that tools that grok the output can take note of op_call_put_result and + work around the fact that it has no counts. + + * dfg/DFGByteCodeParser.cpp: + (JSC::DFG::ByteCodeParser::parseBlock): + (JSC::DFG::ByteCodeParser::parseCodeBlock): + * dfg/DFGDriver.cpp: + (JSC::DFG::compile): + * jit/JIT.cpp: + (JSC::JIT::privateCompileMainPass): + * profiler/ProfilerBytecode.cpp: + (JSC::Profiler::Bytecode::toJS): + * profiler/ProfilerBytecode.h: + (JSC::Profiler::Bytecode::Bytecode): + (JSC::Profiler::Bytecode::opcodeID): + (Bytecode): + * profiler/ProfilerDatabase.cpp: + (JSC::Profiler::Database::ensureBytecodesFor): + * runtime/CommonIdentifiers.h: + +2012-12-04 Filip Pizlo <fpizlo@apple.com> + + display-profiler-output should be able to show source code + https://bugs.webkit.org/show_bug.cgi?id=104073 + + Reviewed by Oliver Hunt. + + Modify the profiler database to store source code. For functions, we store the + function including the function signature. + + * bytecode/CodeBlock.h: + (JSC::CodeBlock::unlinkedCodeBlock): + (CodeBlock): + * profiler/ProfilerBytecodes.cpp: + (JSC::Profiler::Bytecodes::Bytecodes): + (JSC::Profiler::Bytecodes::toJS): + * profiler/ProfilerBytecodes.h: + (Bytecodes): + (JSC::Profiler::Bytecodes::sourceCode): + * profiler/ProfilerDatabase.cpp: + (JSC::Profiler::Database::addBytecodes): + (JSC::Profiler::Database::ensureBytecodesFor): + * profiler/ProfilerDatabase.h: + (Database): + * runtime/CommonIdentifiers.h: + * runtime/Executable.h: + (FunctionExecutable): + (JSC::FunctionExecutable::unlinkedExecutable): + +2012-12-02 Filip Pizlo <fpizlo@apple.com> + + JSC should be able to report profiling data associated with the IR dumps and disassembly + https://bugs.webkit.org/show_bug.cgi?id=102999 + + Reviewed by Gavin Barraclough. + + Added a new profiler to JSC. It's simply called "Profiler" in anticipation of it + ultimately replacing the previous profiling infrastructure. This profiler counts the + number of times that a bytecode executes in various engines, and will record both the + counts and all disassembly and bytecode dumps, into a database that can be at any + time turned into either a JS object using any global object or global data of your + choice, or can be turned into a JSON string, or saved to a file. + + Currently the only use of this is the new '-p <file>' flag to the jsc command-line. + + The profiler is always compiled in and normally incurs no execution time cost, but is + only activated when you create a Profiler::Database and install it in + JSGlobalData::m_perBytecodeProfiler. From that point on, all code blocks will be + compiled along with disassembly and bytecode dumps stored into the Profiler::Database, + and all code blocks will have execution counts, which are also stored in the database. + The database will continue to keep information about code blocks alive even after they + are otherwise GC'd. + + This currently still has some glitches, like the fact that it only counts executions + in the JITs. Doing execution counting in the LLInt might require a bit of a rethink + about how the counting is expressed - currently it is implicit in bytecode, so there + is no easy way to "turn it on" in the LLInt. Also, right now there is no information + recorded about OSR exits or out-of-line stubs. But, even so, it's quite cool, and + gives you a peek into what JSC is doing that would otherwise not be possible. + + * CMakeLists.txt: + * GNUmakefile.list.am: + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.def: + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: + * JavaScriptCore.xcodeproj/project.pbxproj: + * Target.pri: + * bytecode/CodeBlock.cpp: + (JSC::CodeBlock::~CodeBlock): + * bytecode/CodeBlock.h: + (CodeBlock): + (JSC::CodeBlock::baselineVersion): + * bytecode/CodeOrigin.cpp: + (JSC::InlineCallFrame::baselineCodeBlock): + (JSC): + * bytecode/CodeOrigin.h: + (InlineCallFrame): + * dfg/DFGAbstractState.cpp: + (JSC::DFG::AbstractState::execute): + * dfg/DFGByteCodeParser.cpp: + (JSC::DFG::ByteCodeParser::parseBlock): + * dfg/DFGDisassembler.cpp: + (JSC::DFG::Disassembler::dump): + (DFG): + (JSC::DFG::Disassembler::reportToProfiler): + (JSC::DFG::Disassembler::dumpHeader): + (JSC::DFG::Disassembler::append): + (JSC::DFG::Disassembler::createDumpList): + * dfg/DFGDisassembler.h: + (Disassembler): + (JSC::DFG::Disassembler::DumpedOp::DumpedOp): + (DumpedOp): + * dfg/DFGGraph.cpp: + (JSC::DFG::Graph::Graph): + (JSC::DFG::Graph::dumpCodeOrigin): + (JSC::DFG::Graph::dump): + * dfg/DFGGraph.h: + (Graph): + * dfg/DFGJITCompiler.cpp: + (JSC::DFG::JITCompiler::JITCompiler): + (JSC::DFG::JITCompiler::compile): + (JSC::DFG::JITCompiler::compileFunction): + * dfg/DFGNode.h: + (Node): + (JSC::DFG::Node::hasExecutionCounter): + (JSC::DFG::Node::executionCounter): + * 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): + * jit/JIT.cpp: + (JSC::JIT::JIT): + (JSC::JIT::privateCompileMainPass): + (JSC::JIT::privateCompile): + * jit/JIT.h: + (JIT): + * jit/JITDisassembler.cpp: + (JSC::JITDisassembler::dump): + (JSC::JITDisassembler::reportToProfiler): + (JSC): + (JSC::JITDisassembler::dumpHeader): + (JSC::JITDisassembler::firstSlowLabel): + (JSC::JITDisassembler::dumpVectorForInstructions): + (JSC::JITDisassembler::dumpForInstructions): + (JSC::JITDisassembler::reportInstructions): + * jit/JITDisassembler.h: + (JITDisassembler): + (DumpedOp): + * jsc.cpp: + (CommandLine::CommandLine): + (CommandLine): + (printUsageStatement): + (CommandLine::parseArguments): + (jscmain): + * profiler/ProfilerBytecode.cpp: Added. + (Profiler): + (JSC::Profiler::Bytecode::toJS): + * profiler/ProfilerBytecode.h: Added. + (Profiler): + (Bytecode): + (JSC::Profiler::Bytecode::Bytecode): + (JSC::Profiler::Bytecode::bytecodeIndex): + (JSC::Profiler::Bytecode::description): + (JSC::Profiler::getBytecodeIndexForBytecode): + * profiler/ProfilerBytecodes.cpp: Added. + (Profiler): + (JSC::Profiler::Bytecodes::Bytecodes): + (JSC::Profiler::Bytecodes::~Bytecodes): + (JSC::Profiler::Bytecodes::indexForBytecodeIndex): + (JSC::Profiler::Bytecodes::forBytecodeIndex): + (JSC::Profiler::Bytecodes::dump): + (JSC::Profiler::Bytecodes::toJS): + * profiler/ProfilerBytecodes.h: Added. + (Profiler): + (Bytecodes): + (JSC::Profiler::Bytecodes::append): + (JSC::Profiler::Bytecodes::id): + (JSC::Profiler::Bytecodes::hash): + (JSC::Profiler::Bytecodes::size): + (JSC::Profiler::Bytecodes::at): + * profiler/ProfilerCompilation.cpp: Added. + (Profiler): + (JSC::Profiler::Compilation::Compilation): + (JSC::Profiler::Compilation::~Compilation): + (JSC::Profiler::Compilation::addDescription): + (JSC::Profiler::Compilation::executionCounterFor): + (JSC::Profiler::Compilation::toJS): + * profiler/ProfilerCompilation.h: Added. + (Profiler): + (Compilation): + (JSC::Profiler::Compilation::bytecodes): + (JSC::Profiler::Compilation::kind): + * profiler/ProfilerCompilationKind.cpp: Added. + (WTF): + (WTF::printInternal): + * profiler/ProfilerCompilationKind.h: Added. + (Profiler): + (WTF): + * profiler/ProfilerCompiledBytecode.cpp: Added. + (Profiler): + (JSC::Profiler::CompiledBytecode::CompiledBytecode): + (JSC::Profiler::CompiledBytecode::~CompiledBytecode): + (JSC::Profiler::CompiledBytecode::toJS): + * profiler/ProfilerCompiledBytecode.h: Added. + (Profiler): + (CompiledBytecode): + (JSC::Profiler::CompiledBytecode::originStack): + (JSC::Profiler::CompiledBytecode::description): + * profiler/ProfilerDatabase.cpp: Added. + (Profiler): + (JSC::Profiler::Database::Database): + (JSC::Profiler::Database::~Database): + (JSC::Profiler::Database::addBytecodes): + (JSC::Profiler::Database::ensureBytecodesFor): + (JSC::Profiler::Database::notifyDestruction): + (JSC::Profiler::Database::newCompilation): + (JSC::Profiler::Database::toJS): + (JSC::Profiler::Database::toJSON): + (JSC::Profiler::Database::save): + * profiler/ProfilerDatabase.h: Added. + (Profiler): + (Database): + * profiler/ProfilerExecutionCounter.h: Added. + (Profiler): + (ExecutionCounter): + (JSC::Profiler::ExecutionCounter::ExecutionCounter): + (JSC::Profiler::ExecutionCounter::address): + (JSC::Profiler::ExecutionCounter::count): + * profiler/ProfilerOrigin.cpp: Added. + (Profiler): + (JSC::Profiler::Origin::Origin): + (JSC::Profiler::Origin::dump): + (JSC::Profiler::Origin::toJS): + * profiler/ProfilerOrigin.h: Added. + (JSC): + (Profiler): + (Origin): + (JSC::Profiler::Origin::Origin): + (JSC::Profiler::Origin::operator!): + (JSC::Profiler::Origin::bytecodes): + (JSC::Profiler::Origin::bytecodeIndex): + (JSC::Profiler::Origin::operator!=): + (JSC::Profiler::Origin::operator==): + (JSC::Profiler::Origin::hash): + (JSC::Profiler::Origin::isHashTableDeletedValue): + (JSC::Profiler::OriginHash::hash): + (JSC::Profiler::OriginHash::equal): + (OriginHash): + (WTF): + * profiler/ProfilerOriginStack.cpp: Added. + (Profiler): + (JSC::Profiler::OriginStack::OriginStack): + (JSC::Profiler::OriginStack::~OriginStack): + (JSC::Profiler::OriginStack::append): + (JSC::Profiler::OriginStack::operator==): + (JSC::Profiler::OriginStack::hash): + (JSC::Profiler::OriginStack::dump): + (JSC::Profiler::OriginStack::toJS): + * profiler/ProfilerOriginStack.h: Added. + (JSC): + (Profiler): + (OriginStack): + (JSC::Profiler::OriginStack::OriginStack): + (JSC::Profiler::OriginStack::operator!): + (JSC::Profiler::OriginStack::size): + (JSC::Profiler::OriginStack::fromBottom): + (JSC::Profiler::OriginStack::fromTop): + (JSC::Profiler::OriginStack::isHashTableDeletedValue): + (JSC::Profiler::OriginStackHash::hash): + (JSC::Profiler::OriginStackHash::equal): + (OriginStackHash): + (WTF): + * runtime/CommonIdentifiers.h: + * runtime/ExecutionHarness.h: + (JSC::prepareForExecution): + (JSC::prepareFunctionForExecution): + * runtime/JSGlobalData.cpp: + (JSC::JSGlobalData::JSGlobalData): + (JSC::JSGlobalData::~JSGlobalData): + * runtime/JSGlobalData.h: + (JSGlobalData): + * runtime/Options.h: + (JSC): + +2012-12-04 Filip Pizlo <fpizlo@apple.com> + + Rename Profiler to LegacyProfiler + https://bugs.webkit.org/show_bug.cgi?id=104031 + + Rubber stamped by Mark Hahnenberg + + Make room in the namespace for https://bugs.webkit.org/show_bug.cgi?id=102999. + + * API/JSProfilerPrivate.cpp: + (JSStartProfiling): + (JSEndProfiling): + * CMakeLists.txt: + * GNUmakefile.list.am: + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.def: + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: + * JavaScriptCore.xcodeproj/project.pbxproj: + * Target.pri: + * interpreter/Interpreter.cpp: + (JSC::Interpreter::throwException): + (JSC::Interpreter::execute): + (JSC::Interpreter::executeCall): + (JSC::Interpreter::executeConstruct): + * jit/JIT.h: + * jit/JITCode.h: + * jit/JITStubs.cpp: + (JSC::DEFINE_STUB_FUNCTION): + * jit/JITStubs.h: + (JSC): + * llint/LLIntSlowPaths.cpp: + (JSC::LLInt::LLINT_SLOW_PATH_DECL): + * profiler/LegacyProfiler.cpp: Added. + (JSC): + (JSC::LegacyProfiler::profiler): + (JSC::LegacyProfiler::startProfiling): + (JSC::LegacyProfiler::stopProfiling): + (JSC::dispatchFunctionToProfiles): + (JSC::LegacyProfiler::willExecute): + (JSC::LegacyProfiler::didExecute): + (JSC::LegacyProfiler::exceptionUnwind): + (JSC::LegacyProfiler::createCallIdentifier): + (JSC::createCallIdentifierFromFunctionImp): + * profiler/LegacyProfiler.h: Added. + (JSC): + (LegacyProfiler): + (JSC::LegacyProfiler::currentProfiles): + * profiler/ProfileGenerator.cpp: + (JSC::ProfileGenerator::addParentForConsoleStart): + * profiler/ProfileNode.cpp: + * profiler/Profiler.cpp: Removed. + * profiler/Profiler.h: Removed. + * runtime/JSGlobalData.h: + (JSC): + (JSC::JSGlobalData::enabledProfiler): + (JSGlobalData): + * runtime/JSGlobalObject.cpp: + (JSC::JSGlobalObject::~JSGlobalObject): + +2012-12-03 Filip Pizlo <fpizlo@apple.com> + + DFG should inline code blocks that use scoped variable access + https://bugs.webkit.org/show_bug.cgi?id=103974 + + Reviewed by Oliver Hunt. + + This mostly just turns on something we could have done all along, but also adds a few key + necessities to make this right: + + 1) Constant folding of SkipScope, since if we inline with a known JSFunction* then the + scope is constant. + + 2) Interference analysis for GetLocal<->PutScopedVar and SetLocal<->GetScopedVar. + + This is not meant to be a speed-up on major benchmarks since we don't yet inline most + closure calls for entirely unrelated reasons. But on toy programs it can be >2x faster. + + * dfg/DFGAbstractState.cpp: + (JSC::DFG::AbstractState::execute): + * dfg/DFGByteCodeParser.cpp: + (JSC::DFG::ByteCodeParser::getScope): + (JSC::DFG::ByteCodeParser::parseResolveOperations): + * dfg/DFGCSEPhase.cpp: + (JSC::DFG::CSEPhase::scopedVarLoadElimination): + (JSC::DFG::CSEPhase::scopedVarStoreElimination): + (JSC::DFG::CSEPhase::getLocalLoadElimination): + (JSC::DFG::CSEPhase::setLocalStoreElimination): + * dfg/DFGCapabilities.h: + (JSC::DFG::canInlineResolveOperations): + +2012-12-03 Filip Pizlo <fpizlo@apple.com> + + Replace JSValue::description() with JSValue::dump(PrintStream&) + https://bugs.webkit.org/show_bug.cgi?id=103866 + + Reviewed by Darin Adler. + + JSValue now has a dump() method. Anywhere that you would have wanted to use + description(), you can either do toCString(value).data(), or if the callee + is a print()/dataLog() method then you just pass the value directly. + + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.def: + * bytecode/CodeBlock.cpp: + (JSC::valueToSourceString): + (JSC::CodeBlock::finalizeUnconditionally): + * bytecode/ValueProfile.h: + (JSC::ValueProfileBase::dump): + * bytecode/ValueRecovery.h: + (JSC::ValueRecovery::dump): + * dfg/DFGAbstractValue.h: + (JSC::DFG::AbstractValue::dump): + * dfg/DFGGraph.cpp: + (JSC::DFG::Graph::dump): + * interpreter/Interpreter.cpp: + (JSC::Interpreter::dumpRegisters): + * jsc.cpp: + (functionDescribe): + * llint/LLIntSlowPaths.cpp: + (JSC::LLInt::llint_trace_value): + * runtime/JSValue.cpp: + (JSC::JSValue::dump): + * runtime/JSValue.h: + +2012-12-04 Filip Pizlo <fpizlo@apple.com> + + jsc command line tool's support for typed arrays should be robust against array buffer allocation errors + https://bugs.webkit.org/show_bug.cgi?id=104020 + <rdar://problem/12802478> + + Reviewed by Mark Hahnenberg. + + Check for null buffers, since that's what typed array allocators are supposed to do. WebCore does it, + and that is indeed the contract of ArrayBuffer and TypedArrayBase. + + * JSCTypedArrayStubs.h: + (JSC): + +2012-12-03 Peter Rybin <prybin@chromium.org> + + Web Inspector: make ASSERTION FAILED: foundPropertiesCount == object->size() more useful + https://bugs.webkit.org/show_bug.cgi?id=103254 + + Reviewed by Pavel Feldman. + + Missing symbol WTFReportFatalError is added to the linker list. + + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.def: + +2012-12-03 Alexis Menard <alexis@webkit.org> + + [Mac] Enable CSS3 background-position offset by default. + https://bugs.webkit.org/show_bug.cgi?id=103905 + + Reviewed by Simon Fraser. + + Turn the flag on by default. + + * Configurations/FeatureDefines.xcconfig: + +2012-12-02 Filip Pizlo <fpizlo@apple.com> + + DFG should trigger rage conversion from double to contiguous if it sees a GetByVal on Double being used in an integer context + https://bugs.webkit.org/show_bug.cgi?id=103858 + + Reviewed by Gavin Barraclough. + + A rage conversion from double to contiguous is one where you try to convert each + double to an int32. + + This is probably not the last we'll hear of rage conversion from double to contiguous. + It may be better to do this right during parsing, which will result in fewer cases of + Arrayification. But even so, this looks like a straight win already - 1% speed-up on + Kraken, no major regression anywhere else. + + * dfg/DFGAbstractState.cpp: + (JSC::DFG::AbstractState::execute): + * dfg/DFGArrayMode.cpp: + (JSC::DFG::ArrayMode::refine): + (JSC::DFG::arrayConversionToString): + (JSC::DFG::ArrayMode::dump): + (WTF): + (WTF::printInternal): + * dfg/DFGArrayMode.h: + (JSC::DFG::ArrayMode::withConversion): + (ArrayMode): + (JSC::DFG::ArrayMode::doesConversion): + (WTF): + * dfg/DFGFixupPhase.cpp: + (JSC::DFG::FixupPhase::fixupBlock): + (JSC::DFG::FixupPhase::fixupNode): + (JSC::DFG::FixupPhase::checkArray): + (FixupPhase): + * dfg/DFGGraph.cpp: + (JSC::DFG::Graph::dump): + * dfg/DFGNodeFlags.h: + (DFG): + * dfg/DFGOperations.cpp: + * dfg/DFGOperations.h: + * dfg/DFGPredictionPropagationPhase.cpp: + (JSC::DFG::PredictionPropagationPhase::propagate): + * dfg/DFGSpeculativeJIT.cpp: + (JSC::DFG::SpeculativeJIT::arrayify): + * dfg/DFGStructureCheckHoistingPhase.cpp: + (JSC::DFG::StructureCheckHoistingPhase::run): + * runtime/JSObject.cpp: + (JSC): + (JSC::JSObject::genericConvertDoubleToContiguous): + (JSC::JSObject::convertDoubleToContiguous): + (JSC::JSObject::rageConvertDoubleToContiguous): + (JSC::JSObject::ensureContiguousSlow): + (JSC::JSObject::rageEnsureContiguousSlow): + * runtime/JSObject.h: + (JSObject): + (JSC::JSObject::rageEnsureContiguous): + +2012-12-02 Filip Pizlo <fpizlo@apple.com> + + DFG CSE should not keep alive things that aren't relevant to OSR + https://bugs.webkit.org/show_bug.cgi?id=103849 + + Reviewed by Oliver Hunt. + + Most Phantom nodes are inserted by CSE, and by default have the same children as the + node that CSE had eliminated. This change makes CSE inspect all Phantom nodes (both + those it creates and those that were created by other phases) to see if they have + children that are redundant - i.e. children that are not interesting to OSR, which + is the only reason why Phantoms exist in the first place. Being relevant to OSR is + defined as one of: (1) you're a Phi, (2) you're a SetLocal, (3) somewhere between + your definition and the Phantom there was a SetLocal that referred to you. + + This is a slight speed-up in a few places. + + * dfg/DFGCSEPhase.cpp: + (JSC::DFG::CSEPhase::CSEPhase): + (JSC::DFG::CSEPhase::run): + (JSC::DFG::CSEPhase::performSubstitution): + (CSEPhase): + (JSC::DFG::CSEPhase::eliminateIrrelevantPhantomChildren): + (JSC::DFG::CSEPhase::setReplacement): + (JSC::DFG::CSEPhase::eliminate): + (JSC::DFG::CSEPhase::performNodeCSE): + (JSC::DFG::CSEPhase::performBlockCSE): + +2012-12-02 Filip Pizlo <fpizlo@apple.com> + + It should be possible to build and run with DFG_ENABLE(PROPAGATION_VERBOSE) + https://bugs.webkit.org/show_bug.cgi?id=103848 + + Reviewed by Sam Weinig. + + Fix random dataLog() and print() statements. + + * dfg/DFGArgumentsSimplificationPhase.cpp: + (JSC::DFG::ArgumentsSimplificationPhase::run): + * dfg/DFGByteCodeParser.cpp: + (JSC::DFG::ByteCodeParser::parseCodeBlock): + * dfg/DFGGraph.cpp: + (JSC::DFG::Graph::dumpBlockHeader): + * dfg/DFGPredictionPropagationPhase.cpp: + (JSC::DFG::PredictionPropagationPhase::propagate): + * dfg/DFGStructureCheckHoistingPhase.cpp: + (JSC::DFG::StructureCheckHoistingPhase::run): + +2012-12-01 Filip Pizlo <fpizlo@apple.com> + + CodeBlock should be able to dump bytecode to something other than WTF::dataFile() + https://bugs.webkit.org/show_bug.cgi?id=103832 + + Reviewed by Oliver Hunt. + + Add a PrintStream& argument to all of the CodeBlock bytecode dumping methods. + + * bytecode/CodeBlock.cpp: + (JSC::CodeBlock::dumpBytecodeCommentAndNewLine): + (JSC::CodeBlock::printUnaryOp): + (JSC::CodeBlock::printBinaryOp): + (JSC::CodeBlock::printConditionalJump): + (JSC::CodeBlock::printGetByIdOp): + (JSC::dumpStructure): + (JSC::dumpChain): + (JSC::CodeBlock::printGetByIdCacheStatus): + (JSC::CodeBlock::printCallOp): + (JSC::CodeBlock::printPutByIdOp): + (JSC::CodeBlock::printStructure): + (JSC::CodeBlock::printStructures): + (JSC::CodeBlock::dumpBytecode): + * bytecode/CodeBlock.h: + (CodeBlock): + * jit/JITDisassembler.cpp: + (JSC::JITDisassembler::dumpForInstructions): + +2012-11-30 Pierre Rossi <pierre.rossi@gmail.com> + + [Qt] Unreviewed speculative Mac build fix after r136232 + + Update the include path so that LLIntAssembly.h is picked up. + The bot didn't break until later when a clean build was triggered. + + * JavaScriptCore.pri: + +2012-11-30 Oliver Hunt <oliver@apple.com> + + Optimise more cases of op_typeof + https://bugs.webkit.org/show_bug.cgi?id=103783 + + Reviewed by Mark Hahnenberg. + + Increase our coverage of typeof based typechecks by + making sure that the codegenerators always uses + consistent operand ordering when feeding typeof operations + into equality operations. + + * bytecompiler/NodesCodegen.cpp: + (JSC::BinaryOpNode::emitBytecode): + (JSC::EqualNode::emitBytecode): + (JSC::StrictEqualNode::emitBytecode): + +2012-11-30 Filip Pizlo <fpizlo@apple.com> + + Rationalize and clean up DFG handling of scoped accesses + https://bugs.webkit.org/show_bug.cgi?id=103715 + + Reviewed by Oliver Hunt. + + Previously, we had a GetScope node that specified the depth to which you wanted + to travel to get a JSScope, and the backend implementation of the node would + perform all of the necessary footwork, including potentially skipping the top + scope if necessary, and doing however many loads were needed. But there were + strange things. First, if you had accesses at different scope depths, then the + loads to get to the common depth could not be CSE'd - CSE would match only + GetScope's that had identical depth. Second, GetScope would be emitted even if + we already had the scope, for example in put_to_base. And finally, even though + the ResolveOperations could tell us whether or not we had to skip the top scope, + the backend would recompute this information itself, often pessimistically. + + This eliminates GetScope and replaces it with the following: + + GetMyScope: just get the JSScope from the call frame header. This will forever + mean getting the JSScope associated with the machine call frame; it will not + mean getting the scope of an inlined function. Or at least that's the intent. + + SkipTopScope: check if there is an activation, and if so, skip a scope. This + takes a scope as a child and returns a scope. + + SkipScope: skip one scope level. + + The bytecode parser now emits the right combination of the above, and + potentially emits multiple SkipScope's, based on the ResolveOperations. + + This change also includes some fixups to debug logging. We now always print + the ExecutableBase* in addition to the CodeBlock* in the CodeBlock's dump, + and we are now more verbose when dumping CodeOrigins and InlineCallFrames. + + This is performance-neutral. It's just meant to be a clean-up. + + * bytecode/CodeBlock.cpp: + (JSC::CodeBlock::dumpAssumingJITType): + * bytecode/CodeOrigin.cpp: + (JSC::CodeOrigin::inlineStack): + (JSC::CodeOrigin::dump): + (JSC): + (JSC::InlineCallFrame::dump): + * bytecode/CodeOrigin.h: + (CodeOrigin): + (InlineCallFrame): + * dfg/DFGAbstractState.cpp: + (JSC::DFG::AbstractState::execute): + * dfg/DFGByteCodeParser.cpp: + (ByteCodeParser): + (JSC::DFG::ByteCodeParser::getScope): + (DFG): + (JSC::DFG::ByteCodeParser::parseResolveOperations): + (JSC::DFG::ByteCodeParser::parseBlock): + * dfg/DFGCSEPhase.cpp: + (JSC::DFG::CSEPhase::scopedVarLoadElimination): + (JSC::DFG::CSEPhase::scopedVarStoreElimination): + (JSC::DFG::CSEPhase::getMyScopeLoadElimination): + (JSC::DFG::CSEPhase::setLocalStoreElimination): + (JSC::DFG::CSEPhase::performNodeCSE): + * dfg/DFGDisassembler.cpp: + (JSC::DFG::Disassembler::dump): + * dfg/DFGGraph.cpp: + (JSC::DFG::Graph::dumpCodeOrigin): + (JSC::DFG::Graph::dumpBlockHeader): + * dfg/DFGNode.h: + (Node): + * 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): + * jit/JITDisassembler.cpp: + (JSC::JITDisassembler::dump): + +2012-11-30 Oliver Hunt <oliver@apple.com> + + Add direct string->function code cache + https://bugs.webkit.org/show_bug.cgi?id=103764 + + Reviewed by Michael Saboff. + + A fairly logically simple patch. We now track the start of the + unique portion of a functions body, and use that as our key for + unlinked function code. This allows us to cache identical code + in different contexts, leading to a small but consistent improvement + on the benchmarks we track. + + * bytecode/UnlinkedCodeBlock.cpp: + (JSC::UnlinkedFunctionExecutable::UnlinkedFunctionExecutable): + * bytecode/UnlinkedCodeBlock.h: + (JSC::UnlinkedFunctionExecutable::functionStartOffset): + (UnlinkedFunctionExecutable): + * parser/ASTBuilder.h: + (ASTBuilder): + (JSC::ASTBuilder::setFunctionStart): + * parser/Nodes.cpp: + * parser/Nodes.h: + (JSC::FunctionBodyNode::setFunctionStart): + (JSC::FunctionBodyNode::functionStart): + (FunctionBodyNode): + * parser/Parser.cpp: + (JSC::::parseFunctionInfo): + * parser/Parser.h: + (JSC::Parser::findCachedFunctionInfo): + * parser/SyntaxChecker.h: + (JSC::SyntaxChecker::setFunctionStart): + * runtime/CodeCache.cpp: + (JSC::CodeCache::generateFunctionCodeBlock): + (JSC::CodeCache::getFunctionCodeBlock): + (JSC::CodeCache::usedFunctionCode): + * runtime/CodeCache.h: + +2012-11-30 Allan Sandfeld Jensen <allan.jensen@digia.com> + + Crash in conversion of empty OpaqueJSString to Identifier + https://bugs.webkit.org/show_bug.cgi?id=101867 + + Reviewed by Michael Saboff. + + The constructor call used for both null and empty OpaqueJSStrings results + in an assertion voilation and crash. This patch instead uses the Identifier + constructors which are specifically for null and empty Identifier. + + * API/OpaqueJSString.cpp: + (OpaqueJSString::identifier): + +2012-11-30 Tor Arne Vestbø <tor.arne.vestbo@digia.com> + + [Qt] Place the LLIntOffsetsExtractor binaries in debug/release subdirs on Mac + + Otherwise we'll end up using the same LLIntAssembly.h for both build + configs of JavaScriptCore -- one of them which will be for the wrong + config. + + Reviewed by Simon Hausmann. + + * LLIntOffsetsExtractor.pro: + +2012-11-30 Julien BRIANCEAU <jbrianceau@nds.com> + + [sh4] Fix compilation warnings in JavaScriptCore JIT for sh4 arch + https://bugs.webkit.org/show_bug.cgi?id=103378 + + Reviewed by Filip Pizlo. + + * assembler/MacroAssemblerSH4.h: + (JSC::MacroAssemblerSH4::branchTest32): + (JSC::MacroAssemblerSH4::branchAdd32): + (JSC::MacroAssemblerSH4::branchMul32): + (JSC::MacroAssemblerSH4::branchSub32): + (JSC::MacroAssemblerSH4::branchOr32): + +2012-11-29 Rafael Weinstein <rafaelw@chromium.org> + + [HTMLTemplateElement] Add feature flag + https://bugs.webkit.org/show_bug.cgi?id=103694 + + Reviewed by Adam Barth. + + This flag will guard the implementation of the HTMLTemplateElement. + http://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/templates/index.html + + * Configurations/FeatureDefines.xcconfig: + +2012-11-29 Filip Pizlo <fpizlo@apple.com> + + It should be easy to find code blocks in debug dumps + https://bugs.webkit.org/show_bug.cgi?id=103623 + + Reviewed by Goeffrey Garen. + + This gives CodeBlock a relatively strong, but also relatively compact, hash. We compute + it lazily so that it only impacts run-time when debug support is enabled. We stringify + it smartly so that it's short and easy to type. We base it on the source code so that + the optimization level is irrelevant. And, we use SHA1 since it's already in our code + base. Now, when a piece of code wants to print some debugging to say that it's operating + on some code block, it can use this CodeBlockHash instead of memory addresses. + + This also takes CodeBlock debugging into the new world of print() and dataLog(). In + particular, CodeBlock::dump() corresponds to the thing you want printed if you do: + + dataLog("I heart ", *myCodeBlock); + + Probably, you want to just print some identifying information at this point rather than + the full bytecode dump. So, the existing CodeBlock::dump() has been renamed to + CodeBlock::dumpBytecode(), and CodeBlock::dump() now prints the CodeBlockHash plus just + a few little tidbits. + + Here's an example of CodeBlock::dump() output: + + EkILzr:[0x103883a00, BaselineFunctionCall] + + EkILzr is the CodeBlockHash. 0x103883a00 is the CodeBlock's address in memory. The other + part is self-explanatory. + + Finally, this new notion of CodeBlockHash is available for other purposes like bisecting + breakage. As such CodeBlockHash has all of the comparison operator overloads. When + bisecting in DFGDriver.cpp, you can now say things like: + + if (codeBlock->hash() < CodeBlockHash("CAAAAA")) + return false; + + And yes, CAAAAA is near the median hash, and the largest one is smaller than E99999. Such + is life when you use base 62 to encode a 32-bit number. + + * CMakeLists.txt: + * GNUmakefile.list.am: + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: + * JavaScriptCore.xcodeproj/project.pbxproj: + * Target.pri: + * bytecode/CallLinkInfo.h: + (CallLinkInfo): + (JSC::CallLinkInfo::specializationKind): + * bytecode/CodeBlock.cpp: + (JSC::CodeBlock::hash): + (JSC): + (JSC::CodeBlock::dumpAssumingJITType): + (JSC::CodeBlock::dump): + (JSC::CodeBlock::dumpBytecode): + (JSC::CodeBlock::CodeBlock): + (JSC::CodeBlock::finalizeUnconditionally): + (JSC::CodeBlock::resetStubInternal): + (JSC::CodeBlock::reoptimize): + (JSC::ProgramCodeBlock::jettison): + (JSC::EvalCodeBlock::jettison): + (JSC::FunctionCodeBlock::jettison): + (JSC::CodeBlock::shouldOptimizeNow): + (JSC::CodeBlock::tallyFrequentExitSites): + (JSC::CodeBlock::dumpValueProfiles): + * bytecode/CodeBlock.h: + (JSC::CodeBlock::specializationKind): + (CodeBlock): + (JSC::CodeBlock::getJITType): + * bytecode/CodeBlockHash.cpp: Added. + (JSC): + (JSC::CodeBlockHash::CodeBlockHash): + (JSC::CodeBlockHash::dump): + * bytecode/CodeBlockHash.h: Added. + (JSC): + (CodeBlockHash): + (JSC::CodeBlockHash::CodeBlockHash): + (JSC::CodeBlockHash::hash): + (JSC::CodeBlockHash::operator==): + (JSC::CodeBlockHash::operator!=): + (JSC::CodeBlockHash::operator<): + (JSC::CodeBlockHash::operator>): + (JSC::CodeBlockHash::operator<=): + (JSC::CodeBlockHash::operator>=): + * bytecode/CodeBlockWithJITType.h: Added. + (JSC): + (CodeBlockWithJITType): + (JSC::CodeBlockWithJITType::CodeBlockWithJITType): + (JSC::CodeBlockWithJITType::dump): + * bytecode/CodeOrigin.cpp: Added. + (JSC): + (JSC::CodeOrigin::inlineDepthForCallFrame): + (JSC::CodeOrigin::inlineDepth): + (JSC::CodeOrigin::inlineStack): + (JSC::InlineCallFrame::hash): + * bytecode/CodeOrigin.h: + (InlineCallFrame): + (JSC::InlineCallFrame::specializationKind): + (JSC): + * bytecode/CodeType.cpp: Added. + (WTF): + (WTF::printInternal): + * bytecode/CodeType.h: + (WTF): + * bytecode/ExecutionCounter.cpp: + (JSC::ExecutionCounter::dump): + * bytecode/ExecutionCounter.h: + (ExecutionCounter): + * dfg/DFGByteCodeParser.cpp: + (JSC::DFG::ByteCodeParser::parseCodeBlock): + * dfg/DFGDisassembler.cpp: + (JSC::DFG::Disassembler::dump): + * dfg/DFGGraph.cpp: + (JSC::DFG::Graph::dumpCodeOrigin): + * dfg/DFGOSRExitCompiler.cpp: + * dfg/DFGOperations.cpp: + * dfg/DFGRepatch.cpp: + (JSC::DFG::generateProtoChainAccessStub): + (JSC::DFG::tryCacheGetByID): + (JSC::DFG::tryBuildGetByIDList): + (JSC::DFG::emitPutReplaceStub): + (JSC::DFG::emitPutTransitionStub): + (JSC::DFG::dfgLinkClosureCall): + * interpreter/Interpreter.cpp: + (JSC::Interpreter::dumpCallFrame): + * jit/JITCode.cpp: Added. + (WTF): + (WTF::printInternal): + * jit/JITCode.h: + (JSC::JITCode::jitType): + (WTF): + * jit/JITDisassembler.cpp: + (JSC::JITDisassembler::dump): + (JSC::JITDisassembler::dumpForInstructions): + * jit/JITPropertyAccess.cpp: + (JSC::JIT::privateCompilePutByIdTransition): + (JSC::JIT::privateCompilePatchGetArrayLength): + (JSC::JIT::privateCompileGetByIdProto): + (JSC::JIT::privateCompileGetByIdSelfList): + (JSC::JIT::privateCompileGetByIdProtoList): + (JSC::JIT::privateCompileGetByIdChainList): + (JSC::JIT::privateCompileGetByIdChain): + (JSC::JIT::privateCompileGetByVal): + (JSC::JIT::privateCompilePutByVal): + * 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/JITStubs.cpp: + (JSC::DEFINE_STUB_FUNCTION): + * runtime/CodeSpecializationKind.cpp: Added. + (WTF): + (WTF::printInternal): + * runtime/CodeSpecializationKind.h: + (JSC::specializationFromIsCall): + (JSC): + (JSC::specializationFromIsConstruct): + (WTF): + * runtime/Executable.cpp: + (JSC::ExecutableBase::hashFor): + (JSC): + (JSC::NativeExecutable::hashFor): + (JSC::ScriptExecutable::hashFor): + * runtime/Executable.h: + (ExecutableBase): + (NativeExecutable): + (ScriptExecutable): + (JSC::ScriptExecutable::source): + +2012-11-29 Michael Saboff <msaboff@apple.com> + + Speculative Windows build fix after r136086. + + Unreviewed build fix. + + Suspect that ?setDumpsGeneratedCode@BytecodeGenerator@JSC@@SAX_N@Z needs to be removed from Windows + export list since the symbol was removed in r136086. + + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.def: + +2012-11-28 Filip Pizlo <fpizlo@apple.com> + + SpeculatedType dumping should not use the static char buffer[thingy] idiom + https://bugs.webkit.org/show_bug.cgi?id=103584 + + Reviewed by Michael Saboff. + + Changed SpeculatedType to be "dumpable" by saying things like: + + dataLog("thingy = ", SpeculationDump(thingy)) + + Removed the old stringification functions, and changed all code that referred to them + to use the new dataLog()/print() style. + + * CMakeLists.txt: + * GNUmakefile.list.am: + * JavaScriptCore.xcodeproj/project.pbxproj: + * Target.pri: + * bytecode/SpeculatedType.cpp: + (JSC::dumpSpeculation): + (JSC::speculationToAbbreviatedString): + (JSC::dumpSpeculationAbbreviated): + * bytecode/SpeculatedType.h: + * bytecode/ValueProfile.h: + (JSC::ValueProfileBase::dump): + * bytecode/VirtualRegister.h: + (WTF::printInternal): + * dfg/DFGAbstractValue.h: + (JSC::DFG::AbstractValue::dump): + * dfg/DFGByteCodeParser.cpp: + (JSC::DFG::ByteCodeParser::injectLazyOperandSpeculation): + (JSC::DFG::ByteCodeParser::getPredictionWithoutOSRExit): + * dfg/DFGGraph.cpp: + (JSC::DFG::Graph::dump): + (JSC::DFG::Graph::predictArgumentTypes): + * dfg/DFGGraph.h: + (Graph): + * dfg/DFGStructureAbstractValue.h: + * dfg/DFGVariableAccessDataDump.cpp: Added. + (JSC::DFG::VariableAccessDataDump::VariableAccessDataDump): + (JSC::DFG::VariableAccessDataDump::dump): + * dfg/DFGVariableAccessDataDump.h: Added. + (VariableAccessDataDump): + +2012-11-28 Michael Saboff <msaboff@apple.com> + + Change Bytecompiler s_dumpsGeneratedCode to an Options value + https://bugs.webkit.org/show_bug.cgi?id=103588 + + Reviewed by Filip Pizlo. + + Moved the control of dumping bytecodes to Options::dumpGeneratedBytecodes. + + * bytecode/CodeBlock.cpp: + (JSC::CodeBlock::CodeBlock): + * bytecompiler/BytecodeGenerator.cpp: + * bytecompiler/BytecodeGenerator.h: + * jsc.cpp: + (runWithScripts): + * runtime/Options.h: + +2012-11-28 Mark Hahnenberg <mhahnenberg@apple.com> + + Copying phase should use work lists + https://bugs.webkit.org/show_bug.cgi?id=101390 + + Reviewed by Filip Pizlo. + + * JavaScriptCore.xcodeproj/project.pbxproj: + * heap/BlockAllocator.cpp: + (JSC::BlockAllocator::BlockAllocator): + * heap/BlockAllocator.h: New RegionSet for CopyWorkListSegments. + (BlockAllocator): + (JSC::CopyWorkListSegment): + * heap/CopiedBlock.h: Added a per-block CopyWorkList to keep track of the JSCells that need to be revisited during the copying + phase to copy their backing stores. + (CopiedBlock): + (JSC::CopiedBlock::CopiedBlock): + (JSC::CopiedBlock::didSurviveGC): + (JSC::CopiedBlock::didEvacuateBytes): There is now a one-to-one relationship between GCThreads and the CopiedBlocks they're + responsible for evacuating, we no longer need any of that fancy compare and swap stuff. + (JSC::CopiedBlock::pin): + (JSC::CopiedBlock::hasWorkList): + (JSC::CopiedBlock::workList): + * heap/CopiedBlockInlines.h: Added. + (JSC::CopiedBlock::reportLiveBytes): Since we now have to grab a SpinLock to perform operations on the CopyWorkList during marking, + we don't need to do any of that fancy compare and swap stuff we were doing for tracking live bytes. + * heap/CopiedSpace.h: + (CopiedSpace): + * heap/CopiedSpaceInlines.h: + (JSC::CopiedSpace::pin): + * heap/CopyVisitor.cpp: + (JSC::CopyVisitor::copyFromShared): We now iterate over a range of CopiedBlocks rather than MarkedBlocks and revisit the cells in those + blocks' CopyWorkLists. + * heap/CopyVisitor.h: + (CopyVisitor): + * heap/CopyVisitorInlines.h: + (JSC::CopyVisitor::visitCell): The function responsible for calling the correct copyBackingStore() function for each JSCell from + a CopiedBlock's CopyWorkList. + (JSC::CopyVisitor::didCopy): We no longer need to check if the block is empty here because we know exactly when we're done + evacuating a CopiedBlock, which is when we've gone through all of the CopiedBlock's CopyWorkList. + * heap/CopyWorkList.h: Added. + (CopyWorkListSegment): Individual chunk of a CopyWorkList that is allocated from the BlockAllocator. + (JSC::CopyWorkListSegment::create): + (JSC::CopyWorkListSegment::size): + (JSC::CopyWorkListSegment::isFull): + (JSC::CopyWorkListSegment::get): + (JSC::CopyWorkListSegment::append): + (JSC::CopyWorkListSegment::CopyWorkListSegment): + (JSC::CopyWorkListSegment::data): + (JSC::CopyWorkListSegment::endOfBlock): + (CopyWorkListIterator): Responsible for giving CopyVisitors a contiguous notion of access across the separate CopyWorkListSegments + that make up each CopyWorkList. + (JSC::CopyWorkListIterator::get): + (JSC::CopyWorkListIterator::operator*): + (JSC::CopyWorkListIterator::operator->): + (JSC::CopyWorkListIterator::operator++): + (JSC::CopyWorkListIterator::operator==): + (JSC::CopyWorkListIterator::operator!=): + (JSC::CopyWorkListIterator::CopyWorkListIterator): + (CopyWorkList): Data structure that keeps track of the JSCells that need copying in a particular CopiedBlock. + (JSC::CopyWorkList::CopyWorkList): + (JSC::CopyWorkList::~CopyWorkList): + (JSC::CopyWorkList::append): + (JSC::CopyWorkList::begin): + (JSC::CopyWorkList::end): + * heap/GCThreadSharedData.cpp: + (JSC::GCThreadSharedData::GCThreadSharedData): We no longer use the m_blockSnapshot from the Heap during the copying phase. + (JSC::GCThreadSharedData::didStartCopying): We now copy the set of all blocks in the CopiedSpace to a separate vector for + iterating over during the copying phase since the set stored in the CopiedSpace will change as blocks are evacuated and + recycled throughout the copying phase. + * heap/GCThreadSharedData.h: + (GCThreadSharedData): + * heap/Heap.h: + (Heap): + * heap/SlotVisitor.h: We now need to know the object who is being marked that has a backing store so that we can store it + in a CopyWorkList to revisit later during the copying phase. + * heap/SlotVisitorInlines.h: + (JSC::SlotVisitor::copyLater): + * runtime/JSObject.cpp: + (JSC::JSObject::visitButterfly): + +2012-11-28 Filip Pizlo <fpizlo@apple.com> + + Disassembly methods should be able to disassemble to any PrintStream& rather than always using WTF::dataFile() + https://bugs.webkit.org/show_bug.cgi?id=103492 + + Reviewed by Mark Hahnenberg. + + Switched disassembly code to use PrintStream&, and to use print() rather than printf(). + + * dfg/DFGDisassembler.cpp: + (JSC::DFG::Disassembler::dump): + (DFG): + (JSC::DFG::Disassembler::dumpDisassembly): + * dfg/DFGDisassembler.h: + (Disassembler): + * dfg/DFGGraph.cpp: + (JSC::DFG::printWhiteSpace): + (JSC::DFG::Graph::dumpCodeOrigin): + (JSC::DFG::Graph::printNodeWhiteSpace): + (JSC::DFG::Graph::dump): + (DFG): + (JSC::DFG::Graph::dumpBlockHeader): + * dfg/DFGGraph.h: + (Graph): + * jit/JITDisassembler.cpp: + (JSC::JITDisassembler::dump): + (JSC::JITDisassembler::dumpForInstructions): + (JSC::JITDisassembler::dumpDisassembly): + * jit/JITDisassembler.h: + (JITDisassembler): + +2012-11-28 Filip Pizlo <fpizlo@apple.com> + + It should be possible to say dataLog("count = ", count, "\n") instead of dataLogF("count = %d\n", count) + https://bugs.webkit.org/show_bug.cgi?id=103009 + + Reviewed by Michael Saboff. + + Instead of converting all of JSC to use the new dataLog()/print() methods, I just changed + one place: dumping of abstract values. This is mainly just to ensure that the code I + added to WTF is actually doing things. + + * bytecode/CodeBlock.cpp: + (JSC::CodeBlock::dump): + * dfg/DFGAbstractValue.h: + (JSC::DFG::AbstractValue::dump): + (WTF): + (WTF::printInternal): + * dfg/DFGStructureAbstractValue.h: + (JSC::DFG::StructureAbstractValue::dump): + (WTF): + (WTF::printInternal): + +2012-11-28 Oliver Hunt <oliver@apple.com> + + Make source cache include more information about the function extent. + https://bugs.webkit.org/show_bug.cgi?id=103552 + + Reviewed by Gavin Barraclough. + + Add a bit more information to the source cache. + + * parser/Parser.cpp: + (JSC::::parseFunctionInfo): + Store the function start offset + * parser/SourceProviderCacheItem.h: + (JSC::SourceProviderCacheItem::SourceProviderCacheItem): + (SourceProviderCacheItem): + Add additional field for the start of the real function string, and re-arrange + fields to avoid growing the struct. + +2012-11-27 Filip Pizlo <fpizlo@apple.com> + + Convert some remaining uses of FILE* to PrintStream&. + + Rubber stamped by Mark Hahnenberg. + + * bytecode/ValueProfile.h: + (JSC::ValueProfileBase::dump): + * bytecode/ValueRecovery.h: + (JSC::ValueRecovery::dump): + * dfg/DFGByteCodeParser.cpp: + (JSC::DFG::ByteCodeParser::parseCodeBlock): + * dfg/DFGNode.h: + (JSC::DFG::Node::dumpChildren): + +2012-11-27 Filip Pizlo <fpizlo@apple.com> + + Fix indentation in JSValue.h + + Rubber stamped by Mark Hahnenberg. + + * runtime/JSValue.h: + +2012-11-26 Filip Pizlo <fpizlo@apple.com> + + DFG SetLocal should use forwardSpeculationCheck instead of its own half-baked version of same + https://bugs.webkit.org/show_bug.cgi?id=103353 + + Reviewed by Oliver Hunt and Gavin Barraclough. + + Made it possible to use forward speculations for most of the operand classes. Changed the conditional + direction parameter from being 'bool isForward' to an enum (SpeculationDirection). Changed SetLocal + to use forward speculations and got rid of its half-baked version of same. + + Also added the ability to force the DFG's disassembler to dump all nodes, even ones that are dead. + + * dfg/DFGByteCodeParser.cpp: + (JSC::DFG::ByteCodeParser::parseBlock): + * dfg/DFGDisassembler.cpp: + (JSC::DFG::Disassembler::dump): + * dfg/DFGDriver.cpp: + (JSC::DFG::compile): + * dfg/DFGSpeculativeJIT.cpp: + (JSC::DFG::SpeculativeJIT::speculationCheck): + (DFG): + (JSC::DFG::SpeculativeJIT::convertLastOSRExitToForward): + (JSC::DFG::SpeculativeJIT::speculationWatchpoint): + (JSC::DFG::SpeculativeJIT::terminateSpeculativeExecution): + (JSC::DFG::SpeculativeJIT::fillStorage): + * dfg/DFGSpeculativeJIT.h: + (SpeculativeJIT): + (JSC::DFG::SpeculateIntegerOperand::SpeculateIntegerOperand): + (JSC::DFG::SpeculateIntegerOperand::gpr): + (SpeculateIntegerOperand): + (JSC::DFG::SpeculateDoubleOperand::SpeculateDoubleOperand): + (JSC::DFG::SpeculateDoubleOperand::fpr): + (SpeculateDoubleOperand): + (JSC::DFG::SpeculateCellOperand::SpeculateCellOperand): + (JSC::DFG::SpeculateCellOperand::gpr): + (SpeculateCellOperand): + (JSC::DFG::SpeculateBooleanOperand::SpeculateBooleanOperand): + (JSC::DFG::SpeculateBooleanOperand::gpr): + (SpeculateBooleanOperand): + * dfg/DFGSpeculativeJIT32_64.cpp: + (JSC::DFG::SpeculativeJIT::fillSpeculateIntInternal): + (JSC::DFG::SpeculativeJIT::fillSpeculateInt): + (JSC::DFG::SpeculativeJIT::fillSpeculateIntStrict): + (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::fillSpeculateInt): + (JSC::DFG::SpeculativeJIT::fillSpeculateIntStrict): + (JSC::DFG::SpeculativeJIT::fillSpeculateDouble): + (JSC::DFG::SpeculativeJIT::fillSpeculateCell): + (JSC::DFG::SpeculativeJIT::fillSpeculateBoolean): + (JSC::DFG::SpeculativeJIT::compile): + * runtime/Options.h: + (JSC): + +2012-11-26 Daniel Bates <dbates@webkit.org> + + Substitute "allSeparators8Bit" for "allSeperators8Bit" in JSC::jsSpliceSubstringsWithSeparators() + <https://bugs.webkit.org/show_bug.cgi?id=103303> + + Reviewed by Simon Fraser. + + Fix misspelled word, "Seperators" [sic], in a local variable name in JSC::jsSpliceSubstringsWithSeparators(). + + * runtime/StringPrototype.cpp: + (JSC::jsSpliceSubstringsWithSeparators): + +2012-11-26 Daniel Bates <dbates@webkit.org> + + JavaScript fails to handle String.replace() with large replacement string + https://bugs.webkit.org/show_bug.cgi?id=102956 + <rdar://problem/12738012> + + Reviewed by Oliver Hunt. + + Fix an issue where we didn't check for overflow when computing the length + of the result of String.replace() with a large replacement string. + + * runtime/StringPrototype.cpp: + (JSC::jsSpliceSubstringsWithSeparators): + +2012-11-26 Zeno Albisser <zeno@webkit.org> + + [Qt] Fix the LLInt build on Mac + https://bugs.webkit.org/show_bug.cgi?id=97587 + + Reviewed by Simon Hausmann. + + * DerivedSources.pri: + * JavaScriptCore.pro: + +2012-11-26 Oliver Hunt <oliver@apple.com> + + 32-bit build fix. Move the method decalration outside of the X86_64 only section. + + * assembler/MacroAssembler.h: + (MacroAssembler): + (JSC::MacroAssembler::shouldConsiderBlinding): + +2012-11-26 Oliver Hunt <oliver@apple.com> + + Don't blind all the things. + https://bugs.webkit.org/show_bug.cgi?id=102572 + + Reviewed by Gavin Barraclough. + + No longer blind all the constants in the instruction stream. We use a + simple non-deterministic filter to avoid blinding everything. Also modified + the basic integer blinding logic to avoid blinding small negative values. + + * assembler/MacroAssembler.h: + (MacroAssembler): + (JSC::MacroAssembler::shouldConsiderBlinding): + (JSC::MacroAssembler::shouldBlind): + +2012-11-26 Mark Hahnenberg <mhahnenberg@apple.com> + + JSObject::copyButterfly doesn't handle undecided indexing types correctly + https://bugs.webkit.org/show_bug.cgi?id=102573 + + Reviewed by Filip Pizlo. + + We don't do any copying into the newly allocated vector and we don't zero-initialize CopiedBlocks + during the copying phase, so we end up with uninitialized memory in arrays which have undecided indexing + types. We should just do the actual memcpy from the old block to the new one. + + * runtime/JSObject.cpp: + (JSC::JSObject::copyButterfly): Just do the same thing that we do for other contiguous indexing types. + +2012-11-26 Julien BRIANCEAU <jbrianceau@nds.com> + + [sh4] JavaScriptCore JIT build is broken since r135330 + Add missing implementation for sh4 arch. + https://bugs.webkit.org/show_bug.cgi?id=103145 + + Reviewed by Oliver Hunt. + + * assembler/MacroAssemblerSH4.h: + (JSC::MacroAssemblerSH4::canJumpReplacePatchableBranchPtrWithPatch): + (MacroAssemblerSH4): + (JSC::MacroAssemblerSH4::startOfBranchPtrWithPatchOnRegister): + (JSC::MacroAssemblerSH4::revertJumpReplacementToBranchPtrWithPatch): + (JSC::MacroAssemblerSH4::startOfPatchableBranchPtrWithPatchOnAddress): + (JSC::MacroAssemblerSH4::revertJumpReplacementToPatchableBranchPtrWithPatch): + * assembler/SH4Assembler.h: + (JSC::SH4Assembler::revertJump): + (SH4Assembler): + (JSC::SH4Assembler::printInstr): + +2012-11-26 Yuqiang Xian <yuqiang.xian@intel.com> + + Use load64 instead of loadPtr to load a JSValue on JSVALUE64 platforms + https://bugs.webkit.org/show_bug.cgi?id=100909 + + Reviewed by Brent Fulgham. + + This is a (trivial) fix after r132701. + + * dfg/DFGOSRExitCompiler64.cpp: + (JSC::DFG::OSRExitCompiler::compileExit): + +2012-11-26 Gabor Ballabas <gaborb@inf.u-szeged.hu> + + [Qt][ARM] REGRESSION(r130826): It made 33 JSC test and 466 layout tests crash + https://bugs.webkit.org/show_bug.cgi?id=98857 + + Reviewed by Zoltan Herczeg. + + Implement a new version of patchableBranch32 to fix crashing JSC + tests. + + * assembler/MacroAssembler.h: + (MacroAssembler): + * assembler/MacroAssemblerARM.h: + (JSC::MacroAssemblerARM::patchableBranch32): + (MacroAssemblerARM): + +2012-11-21 Filip Pizlo <fpizlo@apple.com> + + Any function that can log things should be able to easily log them to a memory buffer as well + https://bugs.webkit.org/show_bug.cgi?id=103000 + + Reviewed by Sam Weinig. + + Change all users of WTF::dataFile() to expect a PrintStream& rather than a FILE*. + + * bytecode/Operands.h: + (JSC::OperandValueTraits::dump): + (JSC::dumpOperands): + (JSC): + * dfg/DFGAbstractState.cpp: + (JSC::DFG::AbstractState::dump): + * dfg/DFGAbstractState.h: + (AbstractState): + * dfg/DFGAbstractValue.h: + (JSC::DFG::AbstractValue::dump): + * dfg/DFGCommon.h: + (JSC::DFG::NodeIndexTraits::dump): + * dfg/DFGStructureAbstractValue.h: + (JSC::DFG::StructureAbstractValue::dump): + * dfg/DFGVariableEvent.cpp: + (JSC::DFG::VariableEvent::dump): + (JSC::DFG::VariableEvent::dumpFillInfo): + (JSC::DFG::VariableEvent::dumpSpillInfo): + * dfg/DFGVariableEvent.h: + (VariableEvent): + * disassembler/Disassembler.h: + (JSC): + (JSC::tryToDisassemble): + * disassembler/UDis86Disassembler.cpp: + (JSC::tryToDisassemble): + +2012-11-23 Alexis Menard <alexis@webkit.org> + + [CSS3 Backgrounds and Borders] Implement new CSS3 background-position parsing. + https://bugs.webkit.org/show_bug.cgi?id=102104 + + Reviewed by Julien Chaffraix. + + Protect the new feature behind a feature flag. + + * Configurations/FeatureDefines.xcconfig: + +2012-11-23 Gabor Ballabas <gaborb@inf.u-szeged.hu> + + Fix the ARM traditional build after r135330 + https://bugs.webkit.org/show_bug.cgi?id=102871 + + Reviewed by Zoltan Herczeg. + + Added missing functionality to traditional ARM architecture. + + * assembler/ARMAssembler.h: + (JSC::ARMAssembler::revertJump): + (ARMAssembler): + * assembler/MacroAssemblerARM.h: + (JSC::MacroAssemblerARM::startOfPatchableBranchPtrWithPatchOnAddress): + (JSC::MacroAssemblerARM::startOfBranchPtrWithPatchOnRegister): + (MacroAssemblerARM): + (JSC::MacroAssemblerARM::revertJumpReplacementToBranchPtrWithPatch): + +2012-11-16 Yury Semikhatsky <yurys@chromium.org> + + Memory instrumentation: extract MemoryObjectInfo declaration into a separate file + https://bugs.webkit.org/show_bug.cgi?id=102510 + + Reviewed by Pavel Feldman. + + Added new symbols for the methods that have moved into .../wtf/MemoryInstrumentation.cpp + + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.def: + +2012-11-23 Julien BRIANCEAU <jbrianceau@nds.com> + + [sh4] JavaScriptCore JIT build is broken since r130839 + Add missing implementation for sh4 arch. + https://bugs.webkit.org/show_bug.cgi?id=101479 + + Reviewed by Filip Pizlo. + + * assembler/MacroAssemblerSH4.h: + (JSC::MacroAssemblerSH4::load8Signed): + (MacroAssemblerSH4): + (JSC::MacroAssemblerSH4::load16Signed): + (JSC::MacroAssemblerSH4::store8): + (JSC::MacroAssemblerSH4::store16): + (JSC::MacroAssemblerSH4::moveDoubleToInts): + (JSC::MacroAssemblerSH4::moveIntsToDouble): + (JSC::MacroAssemblerSH4::loadFloat): + (JSC::MacroAssemblerSH4::loadDouble): + (JSC::MacroAssemblerSH4::storeFloat): + (JSC::MacroAssemblerSH4::storeDouble): + (JSC::MacroAssemblerSH4::addDouble): + (JSC::MacroAssemblerSH4::convertFloatToDouble): + (JSC::MacroAssemblerSH4::convertDoubleToFloat): + (JSC::MacroAssemblerSH4::urshift32): + * assembler/SH4Assembler.h: + (JSC::SH4Assembler::sublRegReg): + (JSC::SH4Assembler::subvlRegReg): + (JSC::SH4Assembler::floatfpulfrn): + (JSC::SH4Assembler::fldsfpul): + (JSC::SH4Assembler::fstsfpul): + (JSC::SH4Assembler::dcnvsd): + (SH4Assembler): + (JSC::SH4Assembler::movbRegMem): + (JSC::SH4Assembler::sizeOfConstantPool): + (JSC::SH4Assembler::linkJump): + (JSC::SH4Assembler::printInstr): + (JSC::SH4Assembler::printBlockInstr): + +2012-11-22 Balazs Kilvady <kilvadyb@homejinni.com> + + Fix the MIPS build after r135330 + https://bugs.webkit.org/show_bug.cgi?id=102872 + + Reviewed by Gavin Barraclough. + + Revert/replace functions added to MIPS port. + + * assembler/MIPSAssembler.h: + (JSC::MIPSAssembler::revertJumpToMove): + (MIPSAssembler): + (JSC::MIPSAssembler::replaceWithJump): + * assembler/MacroAssemblerMIPS.h: + (MacroAssemblerMIPS): + (JSC::MacroAssemblerMIPS::startOfBranchPtrWithPatchOnRegister): + (JSC::MacroAssemblerMIPS::revertJumpReplacementToBranchPtrWithPatch): + (JSC::MacroAssemblerMIPS::startOfPatchableBranchPtrWithPatchOnAddress): + +2012-11-21 Filip Pizlo <fpizlo@apple.com> + + Rename dataLog() and dataLogV() to dataLogF() and dataLogFV() + https://bugs.webkit.org/show_bug.cgi?id=103001 + + Rubber stamped by Dan Bernstein. + + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.def: + * assembler/LinkBuffer.cpp: + (JSC::LinkBuffer::finalizeCodeWithDisassembly): + (JSC::LinkBuffer::dumpLinkStatistics): + (JSC::LinkBuffer::dumpCode): + * assembler/LinkBuffer.h: + (JSC): + * assembler/SH4Assembler.h: + (JSC::SH4Assembler::vprintfStdoutInstr): + * bytecode/CodeBlock.cpp: + (JSC::CodeBlock::dumpBytecodeCommentAndNewLine): + (JSC::CodeBlock::printUnaryOp): + (JSC::CodeBlock::printBinaryOp): + (JSC::CodeBlock::printConditionalJump): + (JSC::CodeBlock::printGetByIdOp): + (JSC::dumpStructure): + (JSC::dumpChain): + (JSC::CodeBlock::printGetByIdCacheStatus): + (JSC::CodeBlock::printCallOp): + (JSC::CodeBlock::printPutByIdOp): + (JSC::CodeBlock::printStructure): + (JSC::CodeBlock::printStructures): + (JSC::CodeBlock::dump): + (JSC::CodeBlock::dumpStatistics): + (JSC::CodeBlock::finalizeUnconditionally): + (JSC::CodeBlock::resetStubInternal): + (JSC::CodeBlock::reoptimize): + (JSC::ProgramCodeBlock::jettison): + (JSC::EvalCodeBlock::jettison): + (JSC::FunctionCodeBlock::jettison): + (JSC::CodeBlock::shouldOptimizeNow): + (JSC::CodeBlock::tallyFrequentExitSites): + (JSC::CodeBlock::dumpValueProfiles): + * bytecode/Opcode.cpp: + (JSC::OpcodeStats::~OpcodeStats): + * bytecode/SamplingTool.cpp: + (JSC::SamplingFlags::stop): + (JSC::SamplingRegion::dumpInternal): + (JSC::SamplingTool::dump): + * dfg/DFGAbstractState.cpp: + (JSC::DFG::AbstractState::initialize): + (JSC::DFG::AbstractState::endBasicBlock): + (JSC::DFG::AbstractState::mergeStateAtTail): + (JSC::DFG::AbstractState::mergeToSuccessors): + * dfg/DFGAbstractValue.h: + (JSC::DFG::AbstractValue::dump): + * dfg/DFGArgumentsSimplificationPhase.cpp: + (JSC::DFG::ArgumentsSimplificationPhase::run): + * dfg/DFGByteCodeParser.cpp: + (JSC::DFG::ByteCodeParser::injectLazyOperandSpeculation): + (JSC::DFG::ByteCodeParser::getPredictionWithoutOSRExit): + (JSC::DFG::ByteCodeParser::getArrayModeAndEmitChecks): + (JSC::DFG::ByteCodeParser::makeSafe): + (JSC::DFG::ByteCodeParser::makeDivSafe): + (JSC::DFG::ByteCodeParser::handleCall): + (JSC::DFG::ByteCodeParser::handleInlining): + (JSC::DFG::ByteCodeParser::parseBlock): + (JSC::DFG::ByteCodeParser::processPhiStack): + (JSC::DFG::ByteCodeParser::linkBlock): + (JSC::DFG::ByteCodeParser::InlineStackEntry::InlineStackEntry): + (JSC::DFG::ByteCodeParser::parseCodeBlock): + (JSC::DFG::ByteCodeParser::parse): + * dfg/DFGCFAPhase.cpp: + (JSC::DFG::CFAPhase::performBlockCFA): + (JSC::DFG::CFAPhase::performForwardCFA): + * dfg/DFGCFGSimplificationPhase.cpp: + (JSC::DFG::CFGSimplificationPhase::run): + (JSC::DFG::CFGSimplificationPhase::fixPossibleGetLocal): + (JSC::DFG::CFGSimplificationPhase::fixPhis): + (JSC::DFG::CFGSimplificationPhase::fixJettisonedPredecessors): + (JSC::DFG::CFGSimplificationPhase::removePotentiallyDeadPhiReference): + (JSC::DFG::CFGSimplificationPhase::mergeBlocks): + * dfg/DFGCSEPhase.cpp: + (JSC::DFG::CSEPhase::endIndexForPureCSE): + (JSC::DFG::CSEPhase::setReplacement): + (JSC::DFG::CSEPhase::eliminate): + (JSC::DFG::CSEPhase::performNodeCSE): + * dfg/DFGCapabilities.cpp: + (JSC::DFG::debugFail): + * dfg/DFGConstantFoldingPhase.cpp: + (JSC::DFG::ConstantFoldingPhase::foldConstants): + (JSC::DFG::ConstantFoldingPhase::paintUnreachableCode): + * dfg/DFGDisassembler.cpp: + (JSC::DFG::Disassembler::dump): + * dfg/DFGDriver.cpp: + (JSC::DFG::compile): + * dfg/DFGFixupPhase.cpp: + (JSC::DFG::FixupPhase::fixupNode): + (JSC::DFG::FixupPhase::fixDoubleEdge): + * dfg/DFGGraph.cpp: + (JSC::DFG::printWhiteSpace): + (JSC::DFG::Graph::dumpCodeOrigin): + (JSC::DFG::Graph::dump): + (JSC::DFG::Graph::dumpBlockHeader): + (JSC::DFG::Graph::predictArgumentTypes): + * dfg/DFGJITCompiler.cpp: + (JSC::DFG::JITCompiler::link): + * dfg/DFGOSREntry.cpp: + (JSC::DFG::prepareOSREntry): + * dfg/DFGOSRExitCompiler.cpp: + * dfg/DFGOSRExitCompiler32_64.cpp: + (JSC::DFG::OSRExitCompiler::compileExit): + * dfg/DFGOSRExitCompiler64.cpp: + (JSC::DFG::OSRExitCompiler::compileExit): + * dfg/DFGOperations.cpp: + * dfg/DFGPhase.cpp: + (JSC::DFG::Phase::beginPhase): + * dfg/DFGPhase.h: + (JSC::DFG::runAndLog): + * dfg/DFGPredictionPropagationPhase.cpp: + (JSC::DFG::PredictionPropagationPhase::propagate): + (JSC::DFG::PredictionPropagationPhase::propagateForward): + (JSC::DFG::PredictionPropagationPhase::propagateBackward): + (JSC::DFG::PredictionPropagationPhase::doRoundOfDoubleVoting): + * dfg/DFGRegisterBank.h: + (JSC::DFG::RegisterBank::dump): + * dfg/DFGScoreBoard.h: + (JSC::DFG::ScoreBoard::use): + (JSC::DFG::ScoreBoard::dump): + * dfg/DFGSlowPathGenerator.h: + (JSC::DFG::SlowPathGenerator::generate): + * dfg/DFGSpeculativeJIT.cpp: + (JSC::DFG::SpeculativeJIT::terminateSpeculativeExecution): + (JSC::DFG::SpeculativeJIT::terminateSpeculativeExecutionWithConditionalDirection): + (JSC::DFG::SpeculativeJIT::runSlowPathGenerators): + (JSC::DFG::SpeculativeJIT::dump): + (JSC::DFG::SpeculativeJIT::checkConsistency): + (JSC::DFG::SpeculativeJIT::compile): + (JSC::DFG::SpeculativeJIT::checkGeneratedTypeForToInt32): + * dfg/DFGSpeculativeJIT32_64.cpp: + (JSC::DFG::SpeculativeJIT::fillSpeculateIntInternal): + (JSC::DFG::SpeculativeJIT::fillSpeculateDouble): + (JSC::DFG::SpeculativeJIT::fillSpeculateCell): + (JSC::DFG::SpeculativeJIT::fillSpeculateBoolean): + * dfg/DFGSpeculativeJIT64.cpp: + (JSC::DFG::SpeculativeJIT::fillSpeculateIntInternal): + (JSC::DFG::SpeculativeJIT::fillSpeculateDouble): + (JSC::DFG::SpeculativeJIT::fillSpeculateCell): + (JSC::DFG::SpeculativeJIT::fillSpeculateBoolean): + * dfg/DFGStructureCheckHoistingPhase.cpp: + (JSC::DFG::StructureCheckHoistingPhase::run): + * dfg/DFGValidate.cpp: + (Validate): + (JSC::DFG::Validate::reportValidationContext): + (JSC::DFG::Validate::dumpData): + (JSC::DFG::Validate::dumpGraphIfAppropriate): + * dfg/DFGVariableEventStream.cpp: + (JSC::DFG::VariableEventStream::logEvent): + (JSC::DFG::VariableEventStream::reconstruct): + * dfg/DFGVirtualRegisterAllocationPhase.cpp: + (JSC::DFG::VirtualRegisterAllocationPhase::run): + * heap/Heap.cpp: + * heap/HeapStatistics.cpp: + (JSC::HeapStatistics::logStatistics): + (JSC::HeapStatistics::showObjectStatistics): + * heap/MarkStack.h: + * heap/MarkedBlock.h: + * heap/SlotVisitor.cpp: + (JSC::SlotVisitor::validate): + * interpreter/CallFrame.cpp: + (JSC::CallFrame::dumpCaller): + * interpreter/Interpreter.cpp: + (JSC::Interpreter::dumpRegisters): + * jit/JIT.cpp: + (JSC::JIT::privateCompileMainPass): + (JSC::JIT::privateCompileSlowCases): + (JSC::JIT::privateCompile): + * jit/JITDisassembler.cpp: + (JSC::JITDisassembler::dump): + (JSC::JITDisassembler::dumpForInstructions): + * jit/JITStubRoutine.h: + (JSC): + * jit/JITStubs.cpp: + (JSC::DEFINE_STUB_FUNCTION): + * jit/JumpReplacementWatchpoint.cpp: + (JSC::JumpReplacementWatchpoint::fireInternal): + * llint/LLIntExceptions.cpp: + (JSC::LLInt::interpreterThrowInCaller): + (JSC::LLInt::returnToThrow): + (JSC::LLInt::callToThrow): + * llint/LLIntSlowPaths.cpp: + (JSC::LLInt::llint_trace_operand): + (JSC::LLInt::llint_trace_value): + (JSC::LLInt::LLINT_SLOW_PATH_DECL): + (JSC::LLInt::traceFunctionPrologue): + (JSC::LLInt::jitCompileAndSetHeuristics): + (JSC::LLInt::entryOSR): + (JSC::LLInt::handleHostCall): + (JSC::LLInt::setUpCall): + * profiler/Profile.cpp: + (JSC::Profile::debugPrintData): + (JSC::Profile::debugPrintDataSampleStyle): + * profiler/ProfileNode.cpp: + (JSC::ProfileNode::debugPrintData): + (JSC::ProfileNode::debugPrintDataSampleStyle): + * runtime/JSGlobalData.cpp: + (JSC::JSGlobalData::dumpRegExpTrace): + * runtime/RegExp.cpp: + (JSC::RegExp::matchCompareWithInterpreter): + * runtime/SamplingCounter.cpp: + (JSC::AbstractSamplingCounter::dump): + * runtime/Structure.cpp: + (JSC::Structure::dumpStatistics): + (JSC::PropertyMapStatisticsExitLogger::~PropertyMapStatisticsExitLogger): + * tools/CodeProfile.cpp: + (JSC::CodeProfile::report): + * tools/ProfileTreeNode.h: + (JSC::ProfileTreeNode::dumpInternal): + * yarr/YarrInterpreter.cpp: + (JSC::Yarr::ByteCompiler::dumpDisjunction): + +2012-11-21 Filip Pizlo <fpizlo@apple.com> + + It should be possible to say disassemble(stuff) instead of having to say if (!tryToDisassemble(stuff)) dataLog("I failed") + https://bugs.webkit.org/show_bug.cgi?id=103010 + + Reviewed by Anders Carlsson. + + You can still say tryToDisassemble(), which will tell you if it failed; you can then + decide what to do instead. But it's better to say disassemble(), which will just print + the instruction ranges if tryToDisassemble() failed. This is particularly appropriate + since that's what all previous users of tryToDisassemble() would have done in some + form or another. + + * CMakeLists.txt: + * GNUmakefile.list.am: + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: + * JavaScriptCore.xcodeproj/project.pbxproj: + * Target.pri: + * assembler/LinkBuffer.cpp: + (JSC::LinkBuffer::finalizeCodeWithDisassembly): + * dfg/DFGDisassembler.cpp: + (JSC::DFG::Disassembler::dumpDisassembly): + * disassembler/Disassembler.cpp: Added. + (JSC): + (JSC::disassemble): + * disassembler/Disassembler.h: + (JSC): + * jit/JITDisassembler.cpp: + (JSC::JITDisassembler::dumpDisassembly): + +2012-11-21 Filip Pizlo <fpizlo@apple.com> + + dumpOperands() claims that it needs a non-const Operands& when that is completely false + https://bugs.webkit.org/show_bug.cgi?id=103005 + + Reviewed by Eric Carlson. + + * bytecode/Operands.h: + (JSC::dumpOperands): + (JSC): + +2012-11-20 Filip Pizlo <fpizlo@apple.com> + + Baseline JIT's disassembly should be just as pretty as the DFG's + https://bugs.webkit.org/show_bug.cgi?id=102873 + + Reviewed by Sam Weinig. + + Integrated the CodeBlock's bytecode dumper with the JIT's disassembler. Also fixed + some type goof-ups (instructions are not in a Vector<Instruction> so using a Vector + iterator makes no sense) and stream-lined some things (you don't actually need a + full-fledged ExecState* to dump bytecode). + + * CMakeLists.txt: + * GNUmakefile.list.am: + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: + * JavaScriptCore.xcodeproj/project.pbxproj: + * Target.pri: + * bytecode/CodeBlock.cpp: + (JSC::CodeBlock::printUnaryOp): + (JSC::CodeBlock::printBinaryOp): + (JSC::CodeBlock::printConditionalJump): + (JSC::CodeBlock::printGetByIdOp): + (JSC::CodeBlock::printCallOp): + (JSC::CodeBlock::printPutByIdOp): + (JSC::CodeBlock::dump): + (JSC): + (JSC::CodeBlock::CodeBlock): + * bytecode/CodeBlock.h: + (CodeBlock): + * interpreter/Interpreter.cpp: + (JSC::Interpreter::dumpCallFrame): + * jit/JIT.cpp: + (JSC::JIT::privateCompileMainPass): + (JSC::JIT::privateCompileSlowCases): + (JSC::JIT::privateCompile): + * jit/JIT.h: + (JIT): + * jit/JITDisassembler.cpp: Added. + (JSC): + (JSC::JITDisassembler::JITDisassembler): + (JSC::JITDisassembler::~JITDisassembler): + (JSC::JITDisassembler::dump): + (JSC::JITDisassembler::dumpForInstructions): + (JSC::JITDisassembler::dumpDisassembly): + * jit/JITDisassembler.h: Added. + (JSC): + (JITDisassembler): + (JSC::JITDisassembler::setStartOfCode): + (JSC::JITDisassembler::setForBytecodeMainPath): + (JSC::JITDisassembler::setForBytecodeSlowPath): + (JSC::JITDisassembler::setEndOfSlowPath): + (JSC::JITDisassembler::setEndOfCode): + +2012-11-21 Daniel Bates <dbates@webkit.org> + + JavaScript fails to concatenate large strings + <https://bugs.webkit.org/show_bug.cgi?id=102963> + + Reviewed by Michael Saboff. + + Fixes an issue where we inadvertently didn't check the length of + a JavaScript string for overflow. + + * runtime/Operations.h: + (JSC::jsString): + (JSC::jsStringFromArguments): + +2012-11-20 Filip Pizlo <fpizlo@apple.com> + + DFG should be able to cache closure calls (part 2/2) + https://bugs.webkit.org/show_bug.cgi?id=102662 + + Reviewed by Gavin Barraclough. + + Added caching of calls where the JSFunction* varies, but the Structure* and ExecutableBase* + stay the same. This is accomplished by replacing the branch that compares against a constant + JSFunction* with a jump to a closure call stub. The closure call stub contains a fast path, + and jumps slow directly to the virtual call thunk. + + Looks like a 1% win on V8v7. + + * CMakeLists.txt: + * GNUmakefile.list.am: + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: + * JavaScriptCore.xcodeproj/project.pbxproj: + * Target.pri: + * bytecode/CallLinkInfo.cpp: + (JSC::CallLinkInfo::unlink): + * bytecode/CallLinkInfo.h: + (CallLinkInfo): + (JSC::CallLinkInfo::isLinked): + (JSC::getCallLinkInfoBytecodeIndex): + * bytecode/CodeBlock.cpp: + (JSC::CodeBlock::finalizeUnconditionally): + (JSC): + (JSC::CodeBlock::findClosureCallForReturnPC): + (JSC::CodeBlock::bytecodeOffset): + (JSC::CodeBlock::codeOriginForReturn): + * bytecode/CodeBlock.h: + (JSC::CodeBlock::getCallLinkInfo): + (CodeBlock): + (JSC::CodeBlock::isIncomingCallAlreadyLinked): + * dfg/DFGJITCompiler.cpp: + (JSC::DFG::JITCompiler::link): + * dfg/DFGJITCompiler.h: + (JSC::DFG::JITCompiler::addJSCall): + (JSC::DFG::JITCompiler::JSCallRecord::JSCallRecord): + (JSCallRecord): + * dfg/DFGOperations.cpp: + * dfg/DFGOperations.h: + * dfg/DFGRepatch.cpp: + (JSC::DFG::linkSlowFor): + (DFG): + (JSC::DFG::dfgLinkFor): + (JSC::DFG::dfgLinkSlowFor): + (JSC::DFG::dfgLinkClosureCall): + * dfg/DFGRepatch.h: + (DFG): + * dfg/DFGSpeculativeJIT32_64.cpp: + (JSC::DFG::SpeculativeJIT::emitCall): + * dfg/DFGSpeculativeJIT64.cpp: + (JSC::DFG::SpeculativeJIT::emitCall): + * dfg/DFGThunks.cpp: + (DFG): + (JSC::DFG::linkClosureCallThunkGenerator): + * dfg/DFGThunks.h: + (DFG): + * heap/Heap.h: + (Heap): + (JSC::Heap::jitStubRoutines): + * heap/JITStubRoutineSet.h: + (JSC::JITStubRoutineSet::size): + (JSC::JITStubRoutineSet::at): + (JITStubRoutineSet): + * jit/ClosureCallStubRoutine.cpp: Added. + (JSC): + (JSC::ClosureCallStubRoutine::ClosureCallStubRoutine): + (JSC::ClosureCallStubRoutine::~ClosureCallStubRoutine): + (JSC::ClosureCallStubRoutine::markRequiredObjectsInternal): + * jit/ClosureCallStubRoutine.h: Added. + (JSC): + (ClosureCallStubRoutine): + (JSC::ClosureCallStubRoutine::structure): + (JSC::ClosureCallStubRoutine::executable): + (JSC::ClosureCallStubRoutine::codeOrigin): + * jit/GCAwareJITStubRoutine.cpp: + (JSC::GCAwareJITStubRoutine::GCAwareJITStubRoutine): + * jit/GCAwareJITStubRoutine.h: + (GCAwareJITStubRoutine): + (JSC::GCAwareJITStubRoutine::isClosureCall): + * jit/JIT.cpp: + (JSC::JIT::privateCompile): + +2012-11-20 Filip Pizlo <fpizlo@apple.com> + + DFG should be able to cache closure calls (part 1/2) + https://bugs.webkit.org/show_bug.cgi?id=102662 + + Reviewed by Gavin Barraclough. + + Add ability to revert a jump replacement back to + branchPtrWithPatch(Condition, RegisterID, TrustedImmPtr). This is meant to be + a mandatory piece of functionality for all assemblers. I also renamed some of + the functions for reverting jump replacements back to + patchableBranchPtrWithPatch(Condition, Address, TrustedImmPtr), so as to avoid + confusion. + + * assembler/ARMv7Assembler.h: + (JSC::ARMv7Assembler::BadReg): + (ARMv7Assembler): + (JSC::ARMv7Assembler::revertJumpTo_movT3): + * assembler/LinkBuffer.h: + (JSC): + * assembler/MacroAssemblerARMv7.h: + (JSC::MacroAssemblerARMv7::startOfBranchPtrWithPatchOnRegister): + (MacroAssemblerARMv7): + (JSC::MacroAssemblerARMv7::revertJumpReplacementToBranchPtrWithPatch): + (JSC::MacroAssemblerARMv7::startOfPatchableBranchPtrWithPatchOnAddress): + * assembler/MacroAssemblerX86.h: + (JSC::MacroAssemblerX86::startOfBranchPtrWithPatchOnRegister): + (MacroAssemblerX86): + (JSC::MacroAssemblerX86::startOfPatchableBranchPtrWithPatchOnAddress): + (JSC::MacroAssemblerX86::revertJumpReplacementToBranchPtrWithPatch): + * assembler/MacroAssemblerX86_64.h: + (JSC::MacroAssemblerX86_64::startOfBranchPtrWithPatchOnRegister): + (JSC::MacroAssemblerX86_64::startOfPatchableBranchPtrWithPatchOnAddress): + (MacroAssemblerX86_64): + (JSC::MacroAssemblerX86_64::revertJumpReplacementToBranchPtrWithPatch): + * assembler/RepatchBuffer.h: + (JSC::RepatchBuffer::startOfBranchPtrWithPatchOnRegister): + (RepatchBuffer): + (JSC::RepatchBuffer::startOfPatchableBranchPtrWithPatchOnAddress): + (JSC::RepatchBuffer::revertJumpReplacementToBranchPtrWithPatch): + * assembler/X86Assembler.h: + (JSC::X86Assembler::revertJumpTo_cmpl_ir_force32): + (X86Assembler): + * dfg/DFGRepatch.cpp: + (JSC::DFG::replaceWithJump): + (JSC::DFG::dfgResetGetByID): + (JSC::DFG::dfgResetPutByID): + +2012-11-20 Yong Li <yoli@rim.com> + + [ARMv7] Neither linkCall() nor linkPointer() should flush code. + https://bugs.webkit.org/show_bug.cgi?id=99213 + + Reviewed by George Staikos. + + LinkBuffer doesn't need to flush code during linking. It will + eventually flush the whole executable. Fixing this gives >%5 + sunspider boost (on QNX). + + Also make replaceWithLoad() and replaceWithAddressComputation() flush + only when necessary. + + * assembler/ARMv7Assembler.h: + (JSC::ARMv7Assembler::linkCall): + (JSC::ARMv7Assembler::linkPointer): + (JSC::ARMv7Assembler::relinkCall): + (JSC::ARMv7Assembler::repatchInt32): + (JSC::ARMv7Assembler::repatchPointer): + (JSC::ARMv7Assembler::replaceWithLoad): Flush only after it did write. + (JSC::ARMv7Assembler::replaceWithAddressComputation): Flush only after it did write. + (JSC::ARMv7Assembler::setInt32): + (JSC::ARMv7Assembler::setPointer): + +2012-11-19 Filip Pizlo <fpizlo@apple.com> + + Remove support for ARMv7 errata from the jump code + https://bugs.webkit.org/show_bug.cgi?id=102759 + + Reviewed by Oliver Hunt. + + The jump replacement code was wrong to begin with since it wasn't doing + a cache flush on the inserted padding. And, to my knowledge, we don't need + this anymore, so this patch removes all errata code from the ARMv7 port. + + * assembler/ARMv7Assembler.h: + (JSC::ARMv7Assembler::computeJumpType): + (JSC::ARMv7Assembler::replaceWithJump): + (JSC::ARMv7Assembler::maxJumpReplacementSize): + (JSC::ARMv7Assembler::canBeJumpT3): + (JSC::ARMv7Assembler::canBeJumpT4): + +2012-11-19 Patrick Gansterer <paroga@webkit.org> + + [CMake] Create JavaScriptCore ForwardingHeaders + https://bugs.webkit.org/show_bug.cgi?id=92665 + + Reviewed by Brent Fulgham. + + When using CMake to build the Windows port, we need + to generate the forwarding headers with it too. + + * CMakeLists.txt: + +2012-11-19 Kihong Kwon <kihong.kwon@samsung.com> + + Add PROXIMITY_EVENTS feature + https://bugs.webkit.org/show_bug.cgi?id=102658 + + Reviewed by Kentaro Hara. + + Add PROXIMITY_EVENTS feature to xcode project for JavaScriptCore. + + * Configurations/FeatureDefines.xcconfig: + +2012-11-18 Dan Bernstein <mitz@apple.com> + + Try to fix the DFG build after r135099. + + * dfg/DFGCommon.h: + (JSC::DFG::shouldShowDisassembly): + +2012-11-18 Filip Pizlo <fpizlo@apple.com> + + Unreviewed, build fix for !ENABLE(DFG_JIT). + + * dfg/DFGCommon.h: + (JSC::DFG::shouldShowDisassembly): + (DFG): + +2012-11-18 Filip Pizlo <fpizlo@apple.com> + + JSC should have more logging in structure-related code + https://bugs.webkit.org/show_bug.cgi?id=102630 + + Reviewed by Simon Fraser. + + - JSValue::description() now tells you if something is a structure, and if so, + what kind of structure it is. + + - Jettisoning logic now tells you why things are being jettisoned. + + - It's now possible to turn off GC-triggered jettisoning entirely. + + * bytecode/CodeBlock.cpp: + (JSC::CodeBlock::finalizeUnconditionally): + (JSC::CodeBlock::reoptimize): + (JSC::ProgramCodeBlock::jettison): + (JSC::EvalCodeBlock::jettison): + (JSC::FunctionCodeBlock::jettison): + * bytecode/CodeBlock.h: + (JSC::CodeBlock::shouldImmediatelyAssumeLivenessDuringScan): + * runtime/JSValue.cpp: + (JSC::JSValue::description): + * runtime/Options.h: + (JSC): + +2012-11-18 Filip Pizlo <fpizlo@apple.com> + + DFG constant folding phase should say 'changed = true' whenever it changes the graph + https://bugs.webkit.org/show_bug.cgi?id=102550 + + Rubber stamped by Mark Hahnenberg. + + * dfg/DFGConstantFoldingPhase.cpp: + (JSC::DFG::ConstantFoldingPhase::foldConstants): + +2012-11-17 Elliott Sprehn <esprehn@chromium.org> + + Expose JSObject removeDirect and PrivateName to WebCore + https://bugs.webkit.org/show_bug.cgi?id=102546 + + Reviewed by Geoffrey Garen. + + Export removeDirect for use in WebCore so JSDependentRetained works. + + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.def: + +2012-11-16 Filip Pizlo <fpizlo@apple.com> + + Given a PutById or GetById with a proven structure, the DFG should be able to emit a PutByOffset or GetByOffset instead + https://bugs.webkit.org/show_bug.cgi?id=102327 + + Reviewed by Mark Hahnenberg. + + If the profiler tells us that a GetById or PutById may be polymorphic but our + control flow analysis proves that it isn't, we should trust the control flow + analysis over the profiler. This arises in cases where GetById or PutById were + inlined: the inlined function may have been called from other places that led + to polymorphism, but in the current inlined context, there is no polymorphism. + + * bytecode/CodeBlock.cpp: + (JSC::CodeBlock::dump): + * bytecode/GetByIdStatus.cpp: + (JSC::GetByIdStatus::computeFor): + (JSC): + * bytecode/GetByIdStatus.h: + (JSC::GetByIdStatus::GetByIdStatus): + (GetByIdStatus): + * bytecode/PutByIdStatus.cpp: + (JSC::PutByIdStatus::computeFor): + (JSC): + * bytecode/PutByIdStatus.h: + (JSC): + (JSC::PutByIdStatus::PutByIdStatus): + (PutByIdStatus): + * dfg/DFGAbstractState.cpp: + (JSC::DFG::AbstractState::execute): + * dfg/DFGAbstractValue.h: + (JSC::DFG::AbstractValue::bestProvenStructure): + (AbstractValue): + * dfg/DFGConstantFoldingPhase.cpp: + (JSC::DFG::ConstantFoldingPhase::foldConstants): + (JSC::DFG::ConstantFoldingPhase::addStructureTransitionCheck): + (ConstantFoldingPhase): + * dfg/DFGNode.h: + (JSC::DFG::Node::convertToGetByOffset): + (Node): + (JSC::DFG::Node::convertToPutByOffset): + (JSC::DFG::Node::hasStorageResult): + * runtime/JSGlobalObject.h: + (JSC::Structure::prototypeChain): + (JSC): + (JSC::Structure::isValid): + * runtime/Operations.h: + (JSC::isPrototypeChainNormalized): + (JSC): + * runtime/Structure.h: + (Structure): + (JSC::Structure::transitionDidInvolveSpecificValue): + +2012-11-16 Tony Chang <tony@chromium.org> + + Remove ENABLE_CSS_HIERARCHIES since it's no longer in use + https://bugs.webkit.org/show_bug.cgi?id=102554 + + Reviewed by Andreas Kling. + + As mentioned in https://bugs.webkit.org/show_bug.cgi?id=79939#c41 , + we're going to revist this feature once additional vendor support is + achieved. + + * Configurations/FeatureDefines.xcconfig: + +2012-11-16 Patrick Gansterer <paroga@webkit.org> + + Build fix for WinCE after r133688. + + Use numeric_limits<uint32_t>::max() instead of UINT32_MAX. + + * runtime/CodeCache.h: + (JSC::CacheMap::CacheMap): + +2012-11-15 Filip Pizlo <fpizlo@apple.com> + + ClassInfo.h should have correct indentation. + + Rubber stamped by Mark Hahnenberg. + + ClassInfo.h had some true creativity in its use of whitespace. Some things within + the namespace were indented four spaces and others where not. One #define had its + contents indented four spaces, while another didn't. I applied the following rule: + + - Non-macro things in the namespace should not be indented (that's our current + accepted practice). + + - Macros should never be indented but if they are multi-line then their subsequent + bodies should be indented four spaces. I believe that is consistent with what we + do elsewhere. + + * runtime/ClassInfo.h: + (JSC): + (MethodTable): + (ClassInfo): + (JSC::ClassInfo::propHashTable): + (JSC::ClassInfo::isSubClassOf): + (JSC::ClassInfo::hasStaticProperties): + +2012-11-15 Filip Pizlo <fpizlo@apple.com> + + DFG should copy propagate trivially no-op ConvertThis + https://bugs.webkit.org/show_bug.cgi?id=102445 + + Reviewed by Oliver Hunt. + + Copy propagation is always a good thing, since it reveals must-alias relationships + to the CFA and CSE. This accomplishes copy propagation for ConvertThis by first + converting it to an Identity node (which is done by the constant folder since it + has access to CFA results) and then performing substitution of references to + Identity with references to Identity's child in the CSE. + + I'm not aiming for a big speed-up here; I just think that this will be useful for + the work on https://bugs.webkit.org/show_bug.cgi?id=102327. + + * dfg/DFGAbstractState.cpp: + (JSC::DFG::AbstractState::execute): + * dfg/DFGCSEPhase.cpp: + (JSC::DFG::CSEPhase::performNodeCSE): + * dfg/DFGConstantFoldingPhase.cpp: + (JSC::DFG::ConstantFoldingPhase::foldConstants): + * 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-11-15 Filip Pizlo <fpizlo@apple.com> + + CallData.h should have correct indentation. + + Rubber stamped by Mark Hahneberg. + + * runtime/CallData.h: + (JSC): + +2012-11-15 Filip Pizlo <fpizlo@apple.com> + + Remove methodCallDummy since it is not used anymore. + + Rubber stamped by Mark Hahnenberg. + + * runtime/JSGlobalObject.cpp: + (JSC::JSGlobalObject::reset): + (JSC): + (JSC::JSGlobalObject::visitChildren): + * runtime/JSGlobalObject.h: + (JSGlobalObject): + +2012-11-14 Filip Pizlo <fpizlo@apple.com> + + Structure should be able to easily tell if the prototype chain might intercept a store + https://bugs.webkit.org/show_bug.cgi?id=102326 + + Reviewed by Geoffrey Garen. + + This improves our ability to reason about the correctness of the more optimized + prototype chain walk in JSObject::put(), while also making it straight forward to + check if the prototype chain will do strange things to a property store by just + looking at the structure. + + * runtime/JSObject.cpp: + (JSC::JSObject::put): + * runtime/Structure.cpp: + (JSC::Structure::prototypeChainMayInterceptStoreTo): + (JSC): + * runtime/Structure.h: + (Structure): + +2012-11-15 Thiago Marcos P. Santos <thiago.santos@intel.com> + + [CMake] Do not regenerate LLIntAssembly.h on every incremental build + https://bugs.webkit.org/show_bug.cgi?id=102248 + + Reviewed by Kenneth Rohde Christiansen. + + Update LLIntAssembly.h's mtime after running asm.rb to make the build + system dependency tracking consistent. + + * CMakeLists.txt: + +2012-11-15 Thiago Marcos P. Santos <thiago.santos@intel.com> + + Fix compiler warnings about signed/unsigned comparison on i386 + https://bugs.webkit.org/show_bug.cgi?id=102249 + + Reviewed by Kenneth Rohde Christiansen. + + Add casting to unsigned to shut up gcc warnings. Build was broken on + JSVALUE32_64 ports compiling with -Werror. + + * llint/LLIntData.cpp: + (JSC::LLInt::Data::performAssertions): + +2012-11-14 Brent Fulgham <bfulgham@webkit.org> + + [Windows, WinCairo] Unreviewed build fix. + + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.def: + Missed one of the exports that was part of the WebKit2.def. + +2012-11-14 Brent Fulgham <bfulgham@webkit.org> + + [Windows, WinCairo] Correct build failure. + https://bugs.webkit.org/show_bug.cgi?id=102302 + + WebCore symbols were mistakenly added to the JavaScriptCore + library definition file. + + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.def: Remove + WebCore symbols that were incorrectly added to the export file. + +2012-11-14 Mark Lam <mark.lam@apple.com> + + Change JSEventListener::m_jsFunction to be a weak ref. + https://bugs.webkit.org/show_bug.cgi?id=101989. + + Reviewed by Geoffrey Garen. + + Added infrastructure for scanning weak ref slots. + + * heap/SlotVisitor.cpp: Added #include "SlotVisitorInlines.h". + * heap/SlotVisitor.h: + (SlotVisitor): Added SlotVisitor::appendUnbarrieredWeak(). + * heap/SlotVisitorInlines.h: Added #include "Weak.h". + (JSC::SlotVisitor::appendUnbarrieredWeak): Added. + * heap/Weak.h: + (JSC::operator==): Added operator==() for Weak. + * runtime/JSCell.h: Removed #include "SlotVisitorInlines.h". + * runtime/JSObject.h: Added #include "SlotVisitorInlines.h". + +2012-11-14 Filip Pizlo <fpizlo@apple.com> + + Read-only properties created with putDirect() should tell the structure that there are read-only properties + https://bugs.webkit.org/show_bug.cgi?id=102292 + + Reviewed by Gavin Barraclough. + + This mostly affects things like function.length. + + * runtime/JSObject.h: + (JSC::JSObject::putDirectInternal): + +2012-11-13 Filip Pizlo <fpizlo@apple.com> + + Don't access Node& after adding nodes to the graph. + https://bugs.webkit.org/show_bug.cgi?id=102005 + + Reviewed by Oliver Hunt. + + * dfg/DFGFixupPhase.cpp: + (JSC::DFG::FixupPhase::fixupNode): + +2012-11-14 Valery Ignatyev <valery.ignatyev@ispras.ru> + + Replace (typeof(x) != <"object", "undefined", ...>) with + !(typeof(x) == <"object",..>). Later is_object, is_<...> bytecode operation + will be used. + + https://bugs.webkit.org/show_bug.cgi?id=98893 + + Reviewed by Filip Pizlo. + + This eliminates expensive typeof implementation and + allows to use DFG optimizations, which doesn't support 'typeof'. + + * bytecompiler/NodesCodegen.cpp: + (JSC::BinaryOpNode::emitBytecode): + +2012-11-14 Peter Gal <galpeter@inf.u-szeged.hu> + + [Qt][ARM]REGRESSION(r133985): It broke the build + https://bugs.webkit.org/show_bug.cgi?id=101740 + + Reviewed by Csaba Osztrogonác. + + Changed the emitGenericContiguousPutByVal to accept the additional IndexingType argument. + This information was passed as a template parameter. + + * jit/JIT.h: + (JSC::JIT::emitInt32PutByVal): + (JSC::JIT::emitDoublePutByVal): + (JSC::JIT::emitContiguousPutByVal): + (JIT): + * jit/JITPropertyAccess.cpp: + (JSC::JIT::emitGenericContiguousPutByVal): + * jit/JITPropertyAccess32_64.cpp: + (JSC::JIT::emitGenericContiguousPutByVal): + +2012-11-14 Peter Gal <galpeter@inf.u-szeged.hu> + + Fix the MIPS build after r134332 + https://bugs.webkit.org/show_bug.cgi?id=102227 + + Reviewed by Csaba Osztrogonác. + + Added missing methods for the MacroAssemblerMIPS, based on the MacroAssemblerARMv7. + + * assembler/MacroAssemblerMIPS.h: + (JSC::MacroAssemblerMIPS::canJumpReplacePatchableBranchPtrWithPatch): + (MacroAssemblerMIPS): + (JSC::MacroAssemblerMIPS::startOfPatchableBranchPtrWithPatch): + (JSC::MacroAssemblerMIPS::revertJumpReplacementToPatchableBranchPtrWithPatch): + +2012-11-14 Peter Gal <galpeter@inf.u-szeged.hu> + + Fix the [-Wreturn-type] warning in JavaScriptCore/assembler/MacroAssemblerARM.h + https://bugs.webkit.org/show_bug.cgi?id=102206 + + Reviewed by Csaba Osztrogonác. + + Add a return value for the function to suppress the warning. + + * assembler/MacroAssemblerARM.h: + (JSC::MacroAssemblerARM::startOfPatchableBranchPtrWithPatch): + +2012-11-14 Sheriff Bot <webkit.review.bot@gmail.com> + + Unreviewed, rolling out r134599. + http://trac.webkit.org/changeset/134599 + https://bugs.webkit.org/show_bug.cgi?id=102225 + + It broke the 32 bit EFL build (Requested by Ossy on #webkit). + + * jit/JITPropertyAccess.cpp: + * jit/JITPropertyAccess32_64.cpp: + (JSC): + (JSC::JIT::emitGenericContiguousPutByVal): + +2012-11-14 Balazs Kilvady <kilvadyb@homejinni.com> + + [Qt][ARM]REGRESSION(r133985): It broke the build + https://bugs.webkit.org/show_bug.cgi?id=101740 + + Reviewed by Csaba Osztrogonác. + + Template function body moved to fix VALUE_PROFILER disabled case. + + * jit/JITPropertyAccess.cpp: + (JSC): + (JSC::JIT::emitGenericContiguousPutByVal): + * jit/JITPropertyAccess32_64.cpp: + +2012-11-13 Filip Pizlo <fpizlo@apple.com> + + DFG CreateThis should be able to statically account for the structure of the object it creates, if profiling indicates that this structure is always the same + https://bugs.webkit.org/show_bug.cgi?id=102017 + + Reviewed by Geoffrey Garen. + + This adds a watchpoint in JSFunction on the cached inheritor ID. It also changes + NewObject to take a structure as an operand (previously it implicitly used the owning + global object's empty object structure). Any GetCallee where the callee is predictable + is turned into a CheckFunction + WeakJSConstant, and any CreateThis on a WeakJSConstant + where the inheritor ID watchpoint is still valid is turned into an InheritorIDWatchpoint + followed by a NewObject. NewObject already accounts for the structure it uses for object + creation in the CFA. + + * dfg/DFGAbstractState.cpp: + (JSC::DFG::AbstractState::execute): + * dfg/DFGByteCodeParser.cpp: + (JSC::DFG::ByteCodeParser::parseBlock): + * dfg/DFGCSEPhase.cpp: + (JSC::DFG::CSEPhase::checkFunctionElimination): + * dfg/DFGGraph.cpp: + (JSC::DFG::Graph::dump): + * dfg/DFGNode.h: + (JSC::DFG::Node::hasFunction): + (JSC::DFG::Node::function): + (JSC::DFG::Node::hasStructure): + * 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/Executable.h: + (JSC::JSFunction::JSFunction): + * runtime/JSBoundFunction.cpp: + (JSC): + * runtime/JSFunction.cpp: + (JSC::JSFunction::JSFunction): + (JSC::JSFunction::put): + (JSC::JSFunction::defineOwnProperty): + * runtime/JSFunction.h: + (JSC::JSFunction::tryGetKnownInheritorID): + (JSFunction): + (JSC::JSFunction::addInheritorIDWatchpoint): + +2012-11-13 Filip Pizlo <fpizlo@apple.com> + + JSFunction and its descendants should be destructible + https://bugs.webkit.org/show_bug.cgi?id=102062 + + Reviewed by Mark Hahnenberg. + + This will make it easy to place an InlineWatchpointSet inside JSFunction. In the + future, we could make JSFunction non-destructible again by making a version of + WatchpointSet that is entirely GC'd, but this seems like overkill for now. + + This is performance-neutral. + + * runtime/JSBoundFunction.cpp: + (JSC::JSBoundFunction::destroy): + (JSC): + * runtime/JSBoundFunction.h: + (JSBoundFunction): + * runtime/JSFunction.cpp: + (JSC): + (JSC::JSFunction::destroy): + * runtime/JSFunction.h: + (JSFunction): + +2012-11-13 Cosmin Truta <ctruta@rim.com> + + Uninitialized fields in class JSLock + https://bugs.webkit.org/show_bug.cgi?id=101695 + + Reviewed by Mark Hahnenberg. + + Initialize JSLock::m_ownerThread and JSLock::m_lockDropDepth. + + * runtime/JSLock.cpp: + (JSC::JSLock::JSLock): + +2012-11-13 Peter Gal <galpeter@inf.u-szeged.hu> + + Fix the ARM traditional build after r134332 + https://bugs.webkit.org/show_bug.cgi?id=102044 + + Reviewed by Zoltan Herczeg. + + Added missing methods for the MacroAssemblerARM, based on the MacroAssemblerARMv7. + + * assembler/MacroAssemblerARM.h: + (JSC::MacroAssemblerARM::canJumpReplacePatchableBranchPtrWithPatch): + (MacroAssemblerARM): + (JSC::MacroAssemblerARM::startOfPatchableBranchPtrWithPatch): + (JSC::MacroAssemblerARM::revertJumpReplacementToPatchableBranchPtrWithPatch): + +2012-11-12 Filip Pizlo <fpizlo@apple.com> + + op_get_callee should have value profiling + https://bugs.webkit.org/show_bug.cgi?id=102047 + + Reviewed by Sam Weinig. + + This will allow us to detect if the callee is always the same, which is probably + the common case for a lot of constructors. + + * bytecode/CodeBlock.cpp: + (JSC::CodeBlock::CodeBlock): + * bytecode/Opcode.h: + (JSC): + (JSC::padOpcodeName): + * bytecompiler/BytecodeGenerator.cpp: + (JSC::BytecodeGenerator::BytecodeGenerator): + * jit/JITOpcodes.cpp: + (JSC::JIT::emit_op_get_callee): + * jit/JITOpcodes32_64.cpp: + (JSC::JIT::emit_op_get_callee): + * llint/LowLevelInterpreter32_64.asm: + * llint/LowLevelInterpreter64.asm: + +2012-11-12 Filip Pizlo <fpizlo@apple.com> + + The act of getting the callee during 'this' construction should be explicit in bytecode + https://bugs.webkit.org/show_bug.cgi?id=102016 + + Reviewed by Michael Saboff. + + This is mostly a rollout of http://trac.webkit.org/changeset/116673, but also includes + changes to have create_this use the result of get_callee. + + No performance or behavioral impact. This is just meant to allow us to profile + get_callee in the future. + + * bytecode/CodeBlock.cpp: + (JSC::CodeBlock::dump): + * bytecode/Opcode.h: + (JSC): + (JSC::padOpcodeName): + * bytecompiler/BytecodeGenerator.cpp: + (JSC::BytecodeGenerator::BytecodeGenerator): + * dfg/DFGByteCodeParser.cpp: + (JSC::DFG::ByteCodeParser::parseBlock): + * dfg/DFGCapabilities.h: + (JSC::DFG::canCompileOpcode): + * jit/JIT.cpp: + (JSC::JIT::privateCompileMainPass): + * jit/JIT.h: + (JIT): + * jit/JITOpcodes.cpp: + (JSC::JIT::emit_op_get_callee): + (JSC): + (JSC::JIT::emit_op_create_this): + * jit/JITOpcodes32_64.cpp: + (JSC::JIT::emit_op_get_callee): + (JSC): + (JSC::JIT::emit_op_create_this): + * llint/LLIntSlowPaths.cpp: + (JSC::LLInt::LLINT_SLOW_PATH_DECL): + * llint/LowLevelInterpreter32_64.asm: + * llint/LowLevelInterpreter64.asm: + +2012-11-12 Filip Pizlo <fpizlo@apple.com> + + Unreviewed, fix ARMv7 build. + + * assembler/MacroAssemblerARMv7.h: + (JSC::MacroAssemblerARMv7::startOfPatchableBranchPtrWithPatch): + (JSC::MacroAssemblerARMv7::revertJumpReplacementToPatchableBranchPtrWithPatch): + +2012-11-12 Filip Pizlo <fpizlo@apple.com> + + Patching of jumps to stubs should use jump replacement rather than branch destination overwrite + https://bugs.webkit.org/show_bug.cgi?id=101909 + + Reviewed by Geoffrey Garen. + + This saves a few instructions in inline cases, on those architectures where it is + easy to figure out where to put the jump replacement. Sub-1% speed-up across the + board. + + * assembler/MacroAssemblerARMv7.h: + (MacroAssemblerARMv7): + (JSC::MacroAssemblerARMv7::canJumpReplacePatchableBranchPtrWithPatch): + (JSC::MacroAssemblerARMv7::startOfPatchableBranchPtrWithPatch): + (JSC::MacroAssemblerARMv7::revertJumpReplacementToPatchableBranchPtrWithPatch): + * assembler/MacroAssemblerX86.h: + (JSC::MacroAssemblerX86::canJumpReplacePatchableBranchPtrWithPatch): + (MacroAssemblerX86): + (JSC::MacroAssemblerX86::startOfPatchableBranchPtrWithPatch): + (JSC::MacroAssemblerX86::revertJumpReplacementToPatchableBranchPtrWithPatch): + * assembler/MacroAssemblerX86_64.h: + (JSC::MacroAssemblerX86_64::canJumpReplacePatchableBranchPtrWithPatch): + (MacroAssemblerX86_64): + (JSC::MacroAssemblerX86_64::startOfPatchableBranchPtrWithPatch): + (JSC::MacroAssemblerX86_64::revertJumpReplacementToPatchableBranchPtrWithPatch): + * assembler/RepatchBuffer.h: + (JSC::RepatchBuffer::startOfPatchableBranchPtrWithPatch): + (RepatchBuffer): + (JSC::RepatchBuffer::replaceWithJump): + (JSC::RepatchBuffer::revertJumpReplacementToPatchableBranchPtrWithPatch): + * assembler/X86Assembler.h: + (X86Assembler): + (JSC::X86Assembler::revertJumpTo_movq_i64r): + (JSC::X86Assembler::revertJumpTo_cmpl_im_force32): + (X86InstructionFormatter): + * bytecode/StructureStubInfo.h: + * dfg/DFGRepatch.cpp: + (JSC::DFG::replaceWithJump): + (DFG): + (JSC::DFG::tryCacheGetByID): + (JSC::DFG::tryBuildGetByIDList): + (JSC::DFG::tryBuildGetByIDProtoList): + (JSC::DFG::tryCachePutByID): + (JSC::DFG::dfgResetGetByID): + (JSC::DFG::dfgResetPutByID): + +2012-11-11 Filip Pizlo <fpizlo@apple.com> + + DFG ArithMul overflow check elimination is too aggressive + https://bugs.webkit.org/show_bug.cgi?id=101871 + + Reviewed by Oliver Hunt. + + The code was ignoring the fact that ((a * b) | 0) == (((a | 0) * (b | 0)) | 0) + only holds if a * b < 2^53. So, I changed it to only enable the optimization + when a < 2^22 and b is an int32 (and vice versa), using a super trivial peephole + analysis to prove the inequality. I considered writing an epic forward flow + formulation that tracks the ranges of integer values but then I thought better + of it. + + This also rewires the ArithMul integer speculation logic. Previously, we would + assume that an ArithMul was only UsedAsNumber if it escaped, and separately we + would decide whether to speculate integer based on a proof of the <2^22 + inequality. Now, we treat the double rounding behavior of ArithMul as if the + result was UsedAsNumber even if it did not escape. Then we try to prove that + double rounding cannot happen by attemping to prove that a < 2^22. This then + feeds back into the decision of whether or not to speculate integer (if we fail + to prove a < 2^22 then we're UsedAsNumber, and if we're also MayOverflow then + that forces double speculation). + + No performance impact. It just fixes a bug. + + * dfg/DFGGraph.h: + (JSC::DFG::Graph::mulShouldSpeculateInteger): + * dfg/DFGPredictionPropagationPhase.cpp: + (PredictionPropagationPhase): + (JSC::DFG::PredictionPropagationPhase::isWithinPowerOfTwoForConstant): + (JSC::DFG::PredictionPropagationPhase::isWithinPowerOfTwoNonRecursive): + (JSC::DFG::PredictionPropagationPhase::isWithinPowerOfTwo): + (JSC::DFG::PredictionPropagationPhase::propagate): + +2012-11-11 Filip Pizlo <fpizlo@apple.com> + + DFG should not emit function checks if we've already proved that the operand is that exact function + https://bugs.webkit.org/show_bug.cgi?id=101885 + + Reviewed by Oliver Hunt. + + * dfg/DFGAbstractState.cpp: + (JSC::DFG::AbstractState::execute): + * dfg/DFGAbstractValue.h: + (JSC::DFG::AbstractValue::filterByValue): + (AbstractValue): + * dfg/DFGConstantFoldingPhase.cpp: + (JSC::DFG::ConstantFoldingPhase::foldConstants): + +2012-11-12 Kentaro Hara <haraken@chromium.org> + + [V8][JSC] ScriptProfileNode::callUID needs not to be [Custom] + https://bugs.webkit.org/show_bug.cgi?id=101892 + + Reviewed by Adam Barth. + + Added callUID(), which enables us to kill custom bindings for ScriptProfileNode::callUID. + + * profiler/ProfileNode.h: + (JSC::ProfileNode::callUID): + +2012-11-12 Carlos Garcia Campos <cgarcia@igalia.com> + + Unreviewed. Fix make distcheck. + + * GNUmakefile.list.am: Add missing header. + +2012-11-11 Michael Pruett <michael@68k.org> + + Fix assertion failure in JSObject::tryGetIndexQuickly() + https://bugs.webkit.org/show_bug.cgi?id=101869 + + Reviewed by Filip Pizlo. + + Currently JSObject::tryGetIndexQuickly() triggers an assertion + failure when the object has an undecided indexing type. This + case should be treated the same as a blank indexing type. + + * runtime/JSObject.h: + (JSC::JSObject::tryGetIndexQuickly): + +2012-11-11 Filip Pizlo <fpizlo@apple.com> + + DFG register allocation should be greedy rather than round-robin + https://bugs.webkit.org/show_bug.cgi?id=101870 + + Reviewed by Geoffrey Garen. + + This simplifies the code, reduces some code duplication, and shows some slight + performance improvements in a few places, likely due to the fact that lower-numered + registers also typically have smaller encodings. + + * dfg/DFGRegisterBank.h: + (JSC::DFG::RegisterBank::RegisterBank): + (JSC::DFG::RegisterBank::tryAllocate): + (JSC::DFG::RegisterBank::allocate): + (JSC::DFG::RegisterBank::allocateInternal): + (RegisterBank): + +2012-11-11 Kenichi Ishibashi <bashi@chromium.org> + + WTFString::utf8() should have a mode of conversion to use replacement character + https://bugs.webkit.org/show_bug.cgi?id=101678 + + Reviewed by Alexey Proskuryakov. + + Follow the change on String::utf8() + + * runtime/JSGlobalObjectFunctions.cpp: + (JSC::encode): Pass String::StrictConversion instead of true to String::utf8(). + +2012-11-10 Filip Pizlo <fpizlo@apple.com> + + DFG should optimize out the NaN check on loads from double arrays if the array prototype chain is having a great time + https://bugs.webkit.org/show_bug.cgi?id=101718 + + Reviewed by Geoffrey Garen. + + If we're reading from a JSArray in double mode, where the array's structure is + primordial (all aspects of the structure are unchanged except for indexing type), + and the result of the load is used in arithmetic that is known to not distinguish + between NaN and undefined, then we should not emit a NaN check. Looks like a 5% + win on navier-stokes. + + Also fixed an OpInfo initialization goof for String ops that was revealed by this + change. + + * dfg/DFGAbstractState.cpp: + (JSC::DFG::AbstractState::execute): + * dfg/DFGArrayMode.cpp: + (JSC::DFG::arraySpeculationToString): + * dfg/DFGArrayMode.h: + (JSC::DFG::ArrayMode::isSaneChain): + (ArrayMode): + (JSC::DFG::ArrayMode::isInBounds): + * dfg/DFGByteCodeParser.cpp: + (JSC::DFG::ByteCodeParser::handleIntrinsic): + * dfg/DFGFixupPhase.cpp: + (JSC::DFG::FixupPhase::fixupNode): + * dfg/DFGNodeFlags.cpp: + (JSC::DFG::nodeFlagsAsString): + * dfg/DFGNodeFlags.h: + (DFG): + * dfg/DFGPredictionPropagationPhase.cpp: + (JSC::DFG::PredictionPropagationPhase::propagate): + * dfg/DFGSpeculativeJIT32_64.cpp: + (JSC::DFG::SpeculativeJIT::compile): + * dfg/DFGSpeculativeJIT64.cpp: + (JSC::DFG::SpeculativeJIT::compile): + * runtime/JSGlobalObject.cpp: + (JSC::JSGlobalObject::arrayPrototypeChainIsSane): + (JSC): + * runtime/JSGlobalObject.h: + (JSGlobalObject): + +2012-11-10 Filip Pizlo <fpizlo@apple.com> + + DFG constant folding and CFG simplification should be smart enough to know that if a logical op's operand is proven to have a non-masquerading structure then it always evaluates to true + https://bugs.webkit.org/show_bug.cgi?id=101511 + + Reviewed by Geoffrey Garen. + + This is the second attempt at this patch, which fixes the !"" case. + + To make life easier, this moves BranchDirection into BasicBlock so that after + running the CFA, we always know, for each block, what direction the CFA + proved. CFG simplification now both uses and preserves cfaBranchDirection in + its transformations. + + Also made both LogicalNot and Branch check whether the operand is a known cell + with a known structure, and if so, made them do the appropriate folding. + + 5% speed-up on V8/raytrace because it makes raytrace's own null checks + evaporate (i.e. idioms like 'if (!x) throw "unhappiness"') thanks to the fact + that we were already doing structure check hoisting. + + * JavaScriptCore.xcodeproj/project.pbxproj: + * dfg/DFGAbstractState.cpp: + (JSC::DFG::AbstractState::endBasicBlock): + (JSC::DFG::AbstractState::execute): + (JSC::DFG::AbstractState::mergeToSuccessors): + * dfg/DFGAbstractState.h: + (AbstractState): + * dfg/DFGBasicBlock.h: + (JSC::DFG::BasicBlock::BasicBlock): + (BasicBlock): + * dfg/DFGBranchDirection.h: Added. + (DFG): + (JSC::DFG::branchDirectionToString): + (JSC::DFG::isKnownDirection): + (JSC::DFG::branchCondition): + * dfg/DFGCFGSimplificationPhase.cpp: + (JSC::DFG::CFGSimplificationPhase::run): + (JSC::DFG::CFGSimplificationPhase::mergeBlocks): + +2012-11-10 Sheriff Bot <webkit.review.bot@gmail.com> + + Unreviewed, rolling out r133971. + http://trac.webkit.org/changeset/133971 + https://bugs.webkit.org/show_bug.cgi?id=101839 + + Causes WebProcess to hang at 100% on www.apple.com (Requested + by kling on #webkit). + + * JavaScriptCore.xcodeproj/project.pbxproj: + * dfg/DFGAbstractState.cpp: + (JSC::DFG::AbstractState::endBasicBlock): + (JSC::DFG::AbstractState::execute): + (JSC::DFG::AbstractState::mergeToSuccessors): + * dfg/DFGAbstractState.h: + (JSC::DFG::AbstractState::branchDirectionToString): + (AbstractState): + * dfg/DFGBasicBlock.h: + (JSC::DFG::BasicBlock::BasicBlock): + (BasicBlock): + * dfg/DFGBranchDirection.h: Removed. + * dfg/DFGCFGSimplificationPhase.cpp: + (JSC::DFG::CFGSimplificationPhase::run): + (JSC::DFG::CFGSimplificationPhase::mergeBlocks): + +2012-11-09 Filip Pizlo <fpizlo@apple.com> + + If the DFG ArrayMode says that an access is on an OriginalArray, then the checks should always enforce this + https://bugs.webkit.org/show_bug.cgi?id=101720 + + Reviewed by Mark Hahnenberg. + + Previously, "original" arrays was just a hint that we could find the structure + of the array if we needed to even if the array profile didn't have it due to + polymorphism. Now, "original" arrays are a property that is actually checked: + if an array access has ArrayMode::arrayClass() == Array::OriginalArray, then we + can be sure that the code performing the access is dealing with not just a + JSArray, but a JSArray that has no named properties, no indexed accessors, and + the ArrayPrototype as its prototype. This will be useful for optimizations that + are being done as part of https://bugs.webkit.org/show_bug.cgi?id=101720. + + * dfg/DFGAbstractState.cpp: + (JSC::DFG::AbstractState::execute): + * dfg/DFGArrayMode.cpp: + (JSC::DFG::ArrayMode::originalArrayStructure): + (DFG): + (JSC::DFG::ArrayMode::alreadyChecked): + * dfg/DFGArrayMode.h: + (JSC): + (DFG): + (JSC::DFG::ArrayMode::withProfile): + (ArrayMode): + (JSC::DFG::ArrayMode::benefitsFromOriginalArray): + * dfg/DFGConstantFoldingPhase.cpp: + (JSC::DFG::ConstantFoldingPhase::foldConstants): + * dfg/DFGFixupPhase.cpp: + (JSC::DFG::FixupPhase::checkArray): + * dfg/DFGSpeculativeJIT.cpp: + (JSC::DFG::SpeculativeJIT::jumpSlowForUnwantedArrayMode): + (JSC::DFG::SpeculativeJIT::checkArray): + (JSC::DFG::SpeculativeJIT::compileGetByValOnString): + (JSC::DFG::SpeculativeJIT::compileGetByValOnIntTypedArray): + (JSC::DFG::SpeculativeJIT::compileGetByValOnFloatTypedArray): + (JSC::DFG::SpeculativeJIT::compilePutByValForFloatTypedArray): + (JSC::DFG::SpeculativeJIT::compileGetByValOnArguments): + (JSC::DFG::SpeculativeJIT::compileGetArgumentsLength): + +2012-11-09 Filip Pizlo <fpizlo@apple.com> + + Fix indentation of BooleanPrototype.h + + Rubber stamped by Mark Hahnenberg. + + * runtime/BooleanPrototype.h: + +2012-11-09 Filip Pizlo <fpizlo@apple.com> + + Fix indentation of BooleanObject.h + + Rubber stamped by Mark Hahnenberg. + + * runtime/BooleanObject.h: + +2012-11-09 Filip Pizlo <fpizlo@apple.com> + + Fix indentation of BooleanConstructor.h + + Rubber stamped by Mark Hahnenberg. + + * runtime/BooleanConstructor.h: + +2012-11-09 Filip Pizlo <fpizlo@apple.com> + + Fix indentation of BatchedTransitionOptimizer.h + + Rubber stamped by Mark Hahnenberg. + + * runtime/BatchedTransitionOptimizer.h: + +2012-11-09 Oliver Hunt <oliver@apple.com> + + So Thingy probably isn't the best name for a class, so + renamed to CacheMap. + + RS=Geoff + + * runtime/CodeCache.h: + (JSC::CacheMap::CacheMap): + +2012-11-09 Filip Pizlo <fpizlo@apple.com> + + ArrayPrototype should start out with a blank indexing type + https://bugs.webkit.org/show_bug.cgi?id=101719 + + Reviewed by Mark Hahnenberg. + + This allows us to track if the array prototype ever ends up with indexed + properties. + + * runtime/ArrayPrototype.cpp: + (JSC::ArrayPrototype::create): + (JSC::ArrayPrototype::ArrayPrototype): + * runtime/ArrayPrototype.h: + (ArrayPrototype): + (JSC::ArrayPrototype::createStructure): + +2012-11-08 Mark Hahnenberg <mhahnenberg@apple.com> + + MarkStackArray should use the BlockAllocator instead of the MarkStackSegmentAllocator + https://bugs.webkit.org/show_bug.cgi?id=101642 + + Reviewed by Filip Pizlo. + + MarkStackSegmentAllocator is like a miniature version of the BlockAllocator. Now that the BlockAllocator has support + for a variety of block sizes, we should get rid of the MarkStackSegmentAllocator in favor of the BlockAllocator. + + * heap/BlockAllocator.h: Add new specializations of regionSetFor for the new MarkStackSegments. + (JSC): + (JSC::MarkStackSegment): + * heap/GCThreadSharedData.cpp: + (JSC::GCThreadSharedData::GCThreadSharedData): + (JSC::GCThreadSharedData::reset): + * heap/GCThreadSharedData.h: + (GCThreadSharedData): + * heap/MarkStack.cpp: + (JSC::MarkStackArray::MarkStackArray): We now have a doubly linked list of MarkStackSegments, so we need to refactor + all the places that used the old custom tail/previous logic. + (JSC::MarkStackArray::~MarkStackArray): + (JSC::MarkStackArray::expand): + (JSC::MarkStackArray::refill): + (JSC::MarkStackArray::donateSomeCellsTo): Refactor to use the new linked list. + (JSC::MarkStackArray::stealSomeCellsFrom): Ditto. + * heap/MarkStack.h: + (JSC): + (MarkStackSegment): + (JSC::MarkStackSegment::MarkStackSegment): + (JSC::MarkStackSegment::sizeFromCapacity): + (MarkStackArray): + * heap/MarkStackInlines.h: + (JSC::MarkStackSegment::create): + (JSC): + (JSC::MarkStackArray::postIncTop): + (JSC::MarkStackArray::preDecTop): + (JSC::MarkStackArray::setTopForFullSegment): + (JSC::MarkStackArray::setTopForEmptySegment): + (JSC::MarkStackArray::top): + (JSC::MarkStackArray::validatePrevious): + (JSC::MarkStackArray::append): + (JSC::MarkStackArray::removeLast): + (JSC::MarkStackArray::isEmpty): + (JSC::MarkStackArray::size): + * heap/SlotVisitor.cpp: + (JSC::SlotVisitor::SlotVisitor): + +2012-11-09 Gabor Ballabas <gaborb@inf.u-szeged.hu> + + [Qt] r133953 broke the ARM_TRADITIONAL build + https://bugs.webkit.org/show_bug.cgi?id=101706 + + Reviewed by Csaba Osztrogonác. + + Fix for both hardfp and softfp. + + * dfg/DFGCCallHelpers.h: + (CCallHelpers): + (JSC::DFG::CCallHelpers::setupArgumentsWithExecState): + +2012-11-09 Sheriff Bot <webkit.review.bot@gmail.com> + + Unreviewed, rolling out r134051. + http://trac.webkit.org/changeset/134051 + https://bugs.webkit.org/show_bug.cgi?id=101757 + + It didn't fix the build (Requested by Ossy on #webkit). + + * dfg/DFGCCallHelpers.h: + (JSC::DFG::CCallHelpers::setupArgumentsWithExecState): + +2012-11-09 Gabor Ballabas <gaborb@inf.u-szeged.hu> + + [Qt] r133953 broke the ARM_TRADITIONAL build + https://bugs.webkit.org/show_bug.cgi?id=101706 + + Reviewed by Csaba Osztrogonác. + + Fix the ARM_TRADITIONAL build after r133953 + + * dfg/DFGCCallHelpers.h: + (JSC::DFG::CCallHelpers::setupArgumentsWithExecState): + (CCallHelpers): + +2012-11-09 Csaba Osztrogonác <ossy@webkit.org> + + [Qt] Fix the LLINT build from ARMv7 platform + https://bugs.webkit.org/show_bug.cgi?id=101712 + + Reviewed by Simon Hausmann. + + Enable generating of LLIntAssembly.h on ARM platforms. + + * DerivedSources.pri: + * JavaScriptCore.pro: + +2012-11-08 Filip Pizlo <fpizlo@apple.com> + + ArrayPrototype.h should have correct indentation + + Rubber stamped by Sam Weinig. + + * runtime/ArrayPrototype.h: + +2012-11-08 Mark Lam <mark.lam@apple.com> + + Renamed ...InlineMethods.h files to ...Inlines.h. + https://bugs.webkit.org/show_bug.cgi?id=101145. + + Reviewed by Geoffrey Garen. + + This is only a refactoring effort to rename the files. There are no + functionality changes. + + * API/JSObjectRef.cpp: + * GNUmakefile.list.am: + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: + * JavaScriptCore.xcodeproj/project.pbxproj: + * bytecode/CodeBlock.cpp: + * dfg/DFGOperations.cpp: + * heap/ConservativeRoots.cpp: + * heap/CopiedBlock.h: + * heap/CopiedSpace.cpp: + * heap/CopiedSpaceInlineMethods.h: Removed. + * heap/CopiedSpaceInlines.h: Copied from Source/JavaScriptCore/heap/CopiedSpaceInlineMethods.h. + * heap/CopyVisitor.cpp: + * heap/CopyVisitorInlineMethods.h: Removed. + * heap/CopyVisitorInlines.h: Copied from Source/JavaScriptCore/heap/CopyVisitorInlineMethods.h. + * heap/GCThread.cpp: + * heap/GCThreadSharedData.cpp: + * heap/HandleStack.cpp: + * heap/Heap.cpp: + * heap/HeapRootVisitor.h: + * heap/MarkStack.cpp: + * heap/MarkStackInlineMethods.h: Removed. + * heap/MarkStackInlines.h: Copied from Source/JavaScriptCore/heap/MarkStackInlineMethods.h. + * heap/SlotVisitor.cpp: + * heap/SlotVisitor.h: + * heap/SlotVisitorInlineMethods.h: Removed. + * heap/SlotVisitorInlines.h: Copied from Source/JavaScriptCore/heap/SlotVisitorInlineMethods.h. + * jit/HostCallReturnValue.cpp: + * jit/JIT.cpp: + * jit/JITArithmetic.cpp: + * jit/JITArithmetic32_64.cpp: + * jit/JITCall.cpp: + * jit/JITCall32_64.cpp: + * jit/JITInlineMethods.h: Removed. + * jit/JITInlines.h: Copied from Source/JavaScriptCore/jit/JITInlineMethods.h. + * jit/JITOpcodes.cpp: + * jit/JITOpcodes32_64.cpp: + * jit/JITPropertyAccess.cpp: + * jit/JITPropertyAccess32_64.cpp: + * jsc.cpp: + * runtime/ArrayConstructor.cpp: + * runtime/ArrayPrototype.cpp: + * runtime/ButterflyInlineMethods.h: Removed. + * runtime/ButterflyInlines.h: Copied from Source/JavaScriptCore/runtime/ButterflyInlineMethods.h. + * runtime/IndexingHeaderInlineMethods.h: Removed. + * runtime/IndexingHeaderInlines.h: Copied from Source/JavaScriptCore/runtime/IndexingHeaderInlineMethods.h. + * runtime/JSActivation.h: + * runtime/JSArray.cpp: + * runtime/JSArray.h: + * runtime/JSCell.h: + * runtime/JSObject.cpp: + * runtime/JSValueInlineMethods.h: Removed. + * runtime/JSValueInlines.h: Copied from Source/JavaScriptCore/runtime/JSValueInlineMethods.h. + * runtime/LiteralParser.cpp: + * runtime/ObjectConstructor.cpp: + * runtime/Operations.h: + * runtime/RegExpMatchesArray.cpp: + * runtime/RegExpObject.cpp: + * runtime/StringPrototype.cpp: + +2012-11-08 Filip Pizlo <fpizlo@apple.com> + + ArrayConstructor.h should have correct indentation + + Rubber stamped by Sam Weinig. + + * runtime/ArrayConstructor.h: + +2012-11-08 Filip Pizlo <fpizlo@apple.com> + + DFG should know that int == null is always false + https://bugs.webkit.org/show_bug.cgi?id=101665 + + Reviewed by Oliver Hunt. + + * dfg/DFGAbstractState.cpp: + (JSC::DFG::AbstractState::execute): + +2012-11-08 Filip Pizlo <fpizlo@apple.com> + + Arguments.h should have correct indentation + + Rubber stamped by Sam Weinig. + + * runtime/Arguments.h: + +2012-11-08 Filip Pizlo <fpizlo@apple.com> + + It should be possible to JIT compile get_by_vals and put_by_vals even if the DFG is disabled. + + Reviewed by Oliver Hunt. + + * jit/JITInlineMethods.h: + (JSC::JIT::chooseArrayMode): + +2012-11-08 Filip Pizlo <fpizlo@apple.com> + + op_call should have LLInt call link info even if the DFG is disabled + https://bugs.webkit.org/show_bug.cgi?id=101672 + + Reviewed by Oliver Hunt. + + Get rid of the evil uses of fall-through. + + * bytecode/CodeBlock.cpp: + (JSC::CodeBlock::CodeBlock): + +2012-11-08 Oliver Hunt <oliver@apple.com> + + Improve effectiveness of function-level caching + https://bugs.webkit.org/show_bug.cgi?id=101667 + + Reviewed by Filip Pizlo. + + Added a random-eviction based cache for unlinked functions, and switch + UnlinkedFunctionExecutable's code references to Weak<>, thereby letting + us remove the explicit UnlinkedFunctionExecutable::clearCode() calls that + were being triggered by GC. + + Refactored the random eviction part of the CodeCache into a separate data + structure so that I didn't have to duplicate the code again, and then used + that for the new function cache. + + * bytecode/UnlinkedCodeBlock.cpp: + (JSC::UnlinkedFunctionExecutable::visitChildren): + (JSC::UnlinkedFunctionExecutable::codeBlockFor): + * bytecode/UnlinkedCodeBlock.h: + (JSC::UnlinkedFunctionExecutable::clearCodeForRecompilation): + (UnlinkedFunctionExecutable): + * debugger/Debugger.cpp: + * runtime/CodeCache.cpp: + (JSC::CodeCache::getCodeBlock): + (JSC::CodeCache::generateFunctionCodeBlock): + (JSC::CodeCache::getFunctionExecutableFromGlobalCode): + (JSC::CodeCache::usedFunctionCode): + (JSC): + * runtime/Executable.cpp: + (JSC::FunctionExecutable::clearUnlinkedCodeForRecompilationIfNotCompiling): + (JSC::FunctionExecutable::clearCode): + * runtime/Executable.h: + (FunctionExecutable): + +2012-11-07 Filip Pizlo <fpizlo@apple.com> + + DFG constant folding and CFG simplification should be smart enough to know that if a logical op's operand is proven to have a non-masquerading structure then it always evaluates to true + https://bugs.webkit.org/show_bug.cgi?id=101511 + + Reviewed by Oliver Hunt. + + To make life easier, this moves BranchDirection into BasicBlock so that after + running the CFA, we always know, for each block, what direction the CFA + proved. CFG simplification now both uses and preserves cfaBranchDirection in + its transformations. + + Also made both LogicalNot and Branch check whether the operand is a known cell + with a known structure, and if so, made them do the appropriate folding. + + 5% speed-up on V8/raytrace because it makes raytrace's own null checks + evaporate (i.e. idioms like 'if (!x) throw "unhappiness"') thanks to the fact + that we were already doing structure check hoisting. + + * JavaScriptCore.xcodeproj/project.pbxproj: + * dfg/DFGAbstractState.cpp: + (JSC::DFG::AbstractState::endBasicBlock): + (JSC::DFG::AbstractState::execute): + (JSC::DFG::AbstractState::mergeToSuccessors): + * dfg/DFGAbstractState.h: + (AbstractState): + * dfg/DFGBasicBlock.h: + (JSC::DFG::BasicBlock::BasicBlock): + (BasicBlock): + * dfg/DFGBranchDirection.h: Added. + (DFG): + (JSC::DFG::branchDirectionToString): + (JSC::DFG::isKnownDirection): + (JSC::DFG::branchCondition): + * dfg/DFGCFGSimplificationPhase.cpp: + (JSC::DFG::CFGSimplificationPhase::run): + (JSC::DFG::CFGSimplificationPhase::mergeBlocks): + +2012-11-08 Christophe Dumez <christophe.dumez@intel.com> + + [JSC] HTML extensions to String.prototype should escape " as " in argument values + https://bugs.webkit.org/show_bug.cgi?id=90667 + + Reviewed by Benjamin Poulain. + + Escape quotation mark as " in argument values to: + - String.prototype.anchor(name) + - String.prototype.fontcolor(color) + - String.prototype.fontsize(size) + - String.prototype.link(href) + + This behavior matches Chromium/V8 and Firefox/Spidermonkey + implementations and is requited by: + http://mathias.html5.org/specs/javascript/#escapeattributevalue + + This also fixes a potential security risk (XSS vector). + + * runtime/StringPrototype.cpp: + (JSC::stringProtoFuncFontcolor): + (JSC::stringProtoFuncFontsize): + (JSC::stringProtoFuncAnchor): + (JSC::stringProtoFuncLink): + +2012-11-08 Anders Carlsson <andersca@apple.com> + + HeapStatistics::s_pauseTimeStarts and s_pauseTimeEnds should be Vectors + https://bugs.webkit.org/show_bug.cgi?id=101651 + + Reviewed by Andreas Kling. + + HeapStatistics uses Deques when Vectors would work just as good. + + * heap/HeapStatistics.cpp: + * heap/HeapStatistics.h: + (HeapStatistics): + +2012-11-07 Filip Pizlo <fpizlo@apple.com> + + DFG should not assume that something is a double just because it might be undefined + https://bugs.webkit.org/show_bug.cgi?id=101438 + + Reviewed by Oliver Hunt. + + This changes all non-bitop arithmetic to (a) statically expect that variables are + defined prior to use in arithmetic and (b) not fall off into double paths just + because a value may not be a number. This is accomplished with two new notions of + speculation: + + shouldSpeculateIntegerExpectingDefined: Should we speculate that the value is an + integer if we ignore undefined (i.e. SpecOther) predictions? + + shouldSpeculateIntegerForArithmetic: Should we speculate that the value is an + integer if we ignore non-numeric predictions? + + This is a ~2x speed-up on programs that seem to our prediction propagator to have + paths in which otherwise numeric variables are undefined. + + * bytecode/SpeculatedType.h: + (JSC::isInt32SpeculationForArithmetic): + (JSC): + (JSC::isInt32SpeculationExpectingDefined): + (JSC::isDoubleSpeculationForArithmetic): + (JSC::isNumberSpeculationExpectingDefined): + * dfg/DFGAbstractState.cpp: + (JSC::DFG::AbstractState::execute): + * dfg/DFGFixupPhase.cpp: + (JSC::DFG::FixupPhase::fixupNode): + * dfg/DFGGraph.h: + (JSC::DFG::Graph::addShouldSpeculateInteger): + (JSC::DFG::Graph::mulShouldSpeculateInteger): + (JSC::DFG::Graph::negateShouldSpeculateInteger): + (JSC::DFG::Graph::addImmediateShouldSpeculateInteger): + (JSC::DFG::Graph::mulImmediateShouldSpeculateInteger): + * dfg/DFGNode.h: + (JSC::DFG::Node::shouldSpeculateIntegerForArithmetic): + (Node): + (JSC::DFG::Node::shouldSpeculateIntegerExpectingDefined): + (JSC::DFG::Node::shouldSpeculateDoubleForArithmetic): + (JSC::DFG::Node::shouldSpeculateNumberExpectingDefined): + * dfg/DFGPredictionPropagationPhase.cpp: + (JSC::DFG::PredictionPropagationPhase::propagate): + (JSC::DFG::PredictionPropagationPhase::doRoundOfDoubleVoting): + * dfg/DFGSpeculativeJIT.cpp: + (JSC::DFG::SpeculativeJIT::compileAdd): + (JSC::DFG::SpeculativeJIT::compileArithMod): + * dfg/DFGSpeculativeJIT32_64.cpp: + (JSC::DFG::SpeculativeJIT::compile): + * dfg/DFGSpeculativeJIT64.cpp: + (JSC::DFG::SpeculativeJIT::compile): + * jit/JITArithmetic.cpp: + (JSC::JIT::emit_op_div): + +2012-11-06 Filip Pizlo <fpizlo@apple.com> + + JSC should infer when indexed storage contains only integers or doubles + https://bugs.webkit.org/show_bug.cgi?id=98606 + + Reviewed by Oliver Hunt. + + This adds two new indexing types: int32 and double. It also adds array allocation profiling, + which allows array allocations to converge to allocating arrays using those types to which + those arrays would have been converted. + + 20% speed-up on navier-stokes. 40% speed-up on various Kraken DSP tests. Some slow-downs too, + but a performance win overall on all benchmarks we track. + + * API/JSObjectRef.cpp: + (JSObjectMakeArray): + * CMakeLists.txt: + * GNUmakefile.list.am: + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.def: + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: + * JavaScriptCore.xcodeproj/project.pbxproj: + * Target.pri: + * assembler/AbstractMacroAssembler.h: + (JumpList): + (JSC::AbstractMacroAssembler::JumpList::JumpList): + * assembler/MacroAssemblerX86Common.h: + (JSC::MacroAssemblerX86Common::branchDouble): + * assembler/X86Assembler.h: + (JSC::X86Assembler::jnp): + (X86Assembler): + (JSC::X86Assembler::X86InstructionFormatter::emitRex): + * bytecode/ArrayAllocationProfile.cpp: Added. + (JSC): + (JSC::ArrayAllocationProfile::updateIndexingType): + * bytecode/ArrayAllocationProfile.h: Added. + (JSC): + (ArrayAllocationProfile): + (JSC::ArrayAllocationProfile::ArrayAllocationProfile): + (JSC::ArrayAllocationProfile::selectIndexingType): + (JSC::ArrayAllocationProfile::updateLastAllocation): + (JSC::ArrayAllocationProfile::selectIndexingTypeFor): + (JSC::ArrayAllocationProfile::updateLastAllocationFor): + * bytecode/ArrayProfile.cpp: + (JSC::ArrayProfile::updatedObservedArrayModes): + (JSC): + * bytecode/ArrayProfile.h: + (JSC): + (JSC::arrayModesInclude): + (JSC::shouldUseSlowPutArrayStorage): + (JSC::shouldUseFastArrayStorage): + (JSC::shouldUseContiguous): + (JSC::shouldUseDouble): + (JSC::shouldUseInt32): + (ArrayProfile): + * bytecode/ByValInfo.h: + (JSC::isOptimizableIndexingType): + (JSC::jitArrayModeForIndexingType): + * bytecode/CodeBlock.cpp: + (JSC::CodeBlock::dump): + (JSC::CodeBlock::CodeBlock): + (JSC::CodeBlock::updateAllPredictionsAndCountLiveness): + (JSC): + (JSC::CodeBlock::updateAllValueProfilePredictions): + (JSC::CodeBlock::updateAllArrayPredictions): + (JSC::CodeBlock::updateAllPredictions): + (JSC::CodeBlock::shouldOptimizeNow): + * bytecode/CodeBlock.h: + (CodeBlock): + (JSC::CodeBlock::numberOfArrayAllocationProfiles): + (JSC::CodeBlock::addArrayAllocationProfile): + (JSC::CodeBlock::updateAllValueProfilePredictions): + (JSC::CodeBlock::updateAllArrayPredictions): + * bytecode/DFGExitProfile.h: + (JSC::DFG::exitKindToString): + * bytecode/Instruction.h: + (JSC): + (JSC::Instruction::Instruction): + * bytecode/Opcode.h: + (JSC): + (JSC::padOpcodeName): + * bytecode/SpeculatedType.h: + (JSC): + (JSC::isRealNumberSpeculation): + * bytecode/UnlinkedCodeBlock.cpp: + (JSC::UnlinkedCodeBlock::UnlinkedCodeBlock): + * bytecode/UnlinkedCodeBlock.h: + (JSC): + (JSC::UnlinkedCodeBlock::addArrayAllocationProfile): + (JSC::UnlinkedCodeBlock::numberOfArrayAllocationProfiles): + (UnlinkedCodeBlock): + * bytecompiler/BytecodeGenerator.cpp: + (JSC::BytecodeGenerator::newArrayAllocationProfile): + (JSC): + (JSC::BytecodeGenerator::emitNewArray): + (JSC::BytecodeGenerator::emitExpectedFunctionSnippet): + * bytecompiler/BytecodeGenerator.h: + (BytecodeGenerator): + * dfg/DFGAbstractState.cpp: + (JSC::DFG::AbstractState::execute): + * dfg/DFGArrayMode.cpp: + (JSC::DFG::ArrayMode::fromObserved): + (JSC::DFG::ArrayMode::refine): + (DFG): + (JSC::DFG::ArrayMode::alreadyChecked): + (JSC::DFG::arrayTypeToString): + * dfg/DFGArrayMode.h: + (JSC::DFG::ArrayMode::withType): + (ArrayMode): + (JSC::DFG::ArrayMode::withTypeAndConversion): + (JSC::DFG::ArrayMode::usesButterfly): + (JSC::DFG::ArrayMode::isSpecific): + (JSC::DFG::ArrayMode::supportsLength): + (JSC::DFG::ArrayMode::arrayModesThatPassFiltering): + * dfg/DFGByteCodeParser.cpp: + (JSC::DFG::ByteCodeParser::getArrayMode): + (ByteCodeParser): + (JSC::DFG::ByteCodeParser::handleIntrinsic): + (JSC::DFG::ByteCodeParser::handleConstantInternalFunction): + (JSC::DFG::ByteCodeParser::parseBlock): + * dfg/DFGCCallHelpers.h: + (JSC::DFG::CCallHelpers::setupArgumentsWithExecState): + (CCallHelpers): + * dfg/DFGCallArrayAllocatorSlowPathGenerator.h: + (JSC::DFG::CallArrayAllocatorSlowPathGenerator::generateInternal): + (JSC::DFG::CallArrayAllocatorWithVariableSizeSlowPathGenerator::generateInternal): + * dfg/DFGFixupPhase.cpp: + (JSC::DFG::FixupPhase::fixupNode): + (JSC::DFG::FixupPhase::checkArray): + * dfg/DFGGraph.cpp: + (JSC::DFG::Graph::dump): + * dfg/DFGGraph.h: + (JSC::DFG::Graph::byValIsPure): + * dfg/DFGNode.h: + (NewArrayBufferData): + (JSC::DFG::Node::hasIndexingType): + (Node): + (JSC::DFG::Node::indexingType): + (JSC::DFG::Node::setIndexingType): + * dfg/DFGOperations.cpp: + * dfg/DFGOperations.h: + * dfg/DFGPredictionPropagationPhase.cpp: + (JSC::DFG::PredictionPropagationPhase::doRoundOfDoubleVoting): + * dfg/DFGSpeculativeJIT.cpp: + (JSC::DFG::SpeculativeJIT::emitAllocateJSArray): + (JSC::DFG::SpeculativeJIT::jumpSlowForUnwantedArrayMode): + (DFG): + (JSC::DFG::SpeculativeJIT::checkArray): + (JSC::DFG::SpeculativeJIT::arrayify): + (JSC::DFG::SpeculativeJIT::compileDoublePutByVal): + (JSC::DFG::SpeculativeJIT::compileGetArrayLength): + * dfg/DFGSpeculativeJIT.h: + (JSC::DFG::SpeculativeJIT::callOperation): + (SpeculativeJIT): + (SpeculateIntegerOperand): + (JSC::DFG::SpeculateIntegerOperand::use): + (SpeculateDoubleOperand): + (JSC::DFG::SpeculateDoubleOperand::use): + * dfg/DFGSpeculativeJIT32_64.cpp: + (DFG): + (JSC::DFG::SpeculativeJIT::compileContiguousPutByVal): + (JSC::DFG::SpeculativeJIT::compile): + * dfg/DFGSpeculativeJIT64.cpp: + (JSC::DFG::SpeculativeJIT::compile): + * jit/JIT.h: + (JSC::JIT::emitInt32GetByVal): + (JIT): + (JSC::JIT::emitInt32PutByVal): + (JSC::JIT::emitDoublePutByVal): + (JSC::JIT::emitContiguousPutByVal): + * jit/JITExceptions.cpp: + (JSC::genericThrow): + * jit/JITInlineMethods.h: + (JSC::arrayProfileSaw): + (JSC::JIT::chooseArrayMode): + * jit/JITOpcodes.cpp: + (JSC::JIT::emit_op_new_array): + (JSC::JIT::emit_op_new_array_with_size): + (JSC::JIT::emit_op_new_array_buffer): + * jit/JITPropertyAccess.cpp: + (JSC::JIT::emit_op_get_by_val): + (JSC::JIT::emitDoubleGetByVal): + (JSC): + (JSC::JIT::emitContiguousGetByVal): + (JSC::JIT::emit_op_put_by_val): + (JSC::JIT::emitGenericContiguousPutByVal): + (JSC::JIT::emitSlow_op_put_by_val): + (JSC::JIT::privateCompileGetByVal): + (JSC::JIT::privateCompilePutByVal): + * jit/JITPropertyAccess32_64.cpp: + (JSC::JIT::emit_op_get_by_val): + (JSC::JIT::emitContiguousGetByVal): + (JSC::JIT::emitDoubleGetByVal): + (JSC): + (JSC::JIT::emit_op_put_by_val): + (JSC::JIT::emitGenericContiguousPutByVal): + (JSC::JIT::emitSlow_op_put_by_val): + * jit/JITStubs.cpp: + (JSC::DEFINE_STUB_FUNCTION): + * jit/JITStubs.h: + (JSC): + * jsc.cpp: + (GlobalObject::finishCreation): + * llint/LLIntSlowPaths.cpp: + (JSC::LLInt::jitCompileAndSetHeuristics): + (JSC::LLInt::LLINT_SLOW_PATH_DECL): + * llint/LowLevelInterpreter.asm: + * llint/LowLevelInterpreter32_64.asm: + * llint/LowLevelInterpreter64.asm: + * offlineasm/x86.rb: + * runtime/ArrayConstructor.cpp: + (JSC::constructArrayWithSizeQuirk): + * runtime/ArrayConstructor.h: + (JSC): + * runtime/ArrayPrototype.cpp: + (JSC::arrayProtoFuncConcat): + (JSC::arrayProtoFuncSlice): + (JSC::arrayProtoFuncSplice): + (JSC::arrayProtoFuncFilter): + (JSC::arrayProtoFuncMap): + * runtime/Butterfly.h: + (JSC::Butterfly::contiguousInt32): + (JSC::Butterfly::contiguousDouble): + (JSC::Butterfly::fromContiguous): + * runtime/ButterflyInlineMethods.h: + (JSC::Butterfly::createUninitializedDuringCollection): + * runtime/FunctionPrototype.cpp: + (JSC::functionProtoFuncBind): + * runtime/IndexingHeaderInlineMethods.h: + (JSC::IndexingHeader::indexingPayloadSizeInBytes): + * runtime/IndexingType.cpp: + (JSC::leastUpperBoundOfIndexingTypes): + (JSC): + (JSC::leastUpperBoundOfIndexingTypeAndType): + (JSC::leastUpperBoundOfIndexingTypeAndValue): + (JSC::indexingTypeToString): + * runtime/IndexingType.h: + (JSC): + (JSC::hasUndecided): + (JSC::hasInt32): + (JSC::hasDouble): + * runtime/JSArray.cpp: + (JSC::JSArray::setLength): + (JSC::JSArray::pop): + (JSC::JSArray::push): + (JSC::JSArray::shiftCountWithAnyIndexingType): + (JSC::JSArray::unshiftCountWithAnyIndexingType): + (JSC::compareNumbersForQSortWithInt32): + (JSC): + (JSC::compareNumbersForQSortWithDouble): + (JSC::JSArray::sortNumericVector): + (JSC::JSArray::sortNumeric): + (JSC::JSArray::sortCompactedVector): + (JSC::JSArray::sort): + (JSC::JSArray::sortVector): + (JSC::JSArray::fillArgList): + (JSC::JSArray::copyToArguments): + (JSC::JSArray::compactForSorting): + * runtime/JSArray.h: + (JSArray): + (JSC::createContiguousArrayButterfly): + (JSC::JSArray::create): + (JSC::JSArray::tryCreateUninitialized): + * runtime/JSGlobalObject.cpp: + (JSC::JSGlobalObject::reset): + (JSC): + (JSC::JSGlobalObject::haveABadTime): + (JSC::JSGlobalObject::visitChildren): + * runtime/JSGlobalObject.h: + (JSGlobalObject): + (JSC::JSGlobalObject::originalArrayStructureForIndexingType): + (JSC::JSGlobalObject::arrayStructureForIndexingTypeDuringAllocation): + (JSC::JSGlobalObject::arrayStructureForProfileDuringAllocation): + (JSC::JSGlobalObject::isOriginalArrayStructure): + (JSC::constructEmptyArray): + (JSC::constructArray): + * runtime/JSObject.cpp: + (JSC::JSObject::copyButterfly): + (JSC::JSObject::getOwnPropertySlotByIndex): + (JSC::JSObject::putByIndex): + (JSC::JSObject::enterDictionaryIndexingMode): + (JSC::JSObject::createInitialIndexedStorage): + (JSC): + (JSC::JSObject::createInitialUndecided): + (JSC::JSObject::createInitialInt32): + (JSC::JSObject::createInitialDouble): + (JSC::JSObject::createInitialContiguous): + (JSC::JSObject::convertUndecidedToInt32): + (JSC::JSObject::convertUndecidedToDouble): + (JSC::JSObject::convertUndecidedToContiguous): + (JSC::JSObject::constructConvertedArrayStorageWithoutCopyingElements): + (JSC::JSObject::convertUndecidedToArrayStorage): + (JSC::JSObject::convertInt32ToDouble): + (JSC::JSObject::convertInt32ToContiguous): + (JSC::JSObject::convertInt32ToArrayStorage): + (JSC::JSObject::convertDoubleToContiguous): + (JSC::JSObject::convertDoubleToArrayStorage): + (JSC::JSObject::convertContiguousToArrayStorage): + (JSC::JSObject::convertUndecidedForValue): + (JSC::JSObject::convertInt32ForValue): + (JSC::JSObject::setIndexQuicklyToUndecided): + (JSC::JSObject::convertInt32ToDoubleOrContiguousWhilePerformingSetIndex): + (JSC::JSObject::convertDoubleToContiguousWhilePerformingSetIndex): + (JSC::JSObject::ensureInt32Slow): + (JSC::JSObject::ensureDoubleSlow): + (JSC::JSObject::ensureContiguousSlow): + (JSC::JSObject::ensureArrayStorageSlow): + (JSC::JSObject::ensureArrayStorageExistsAndEnterDictionaryIndexingMode): + (JSC::JSObject::switchToSlowPutArrayStorage): + (JSC::JSObject::deletePropertyByIndex): + (JSC::JSObject::getOwnPropertyNames): + (JSC::JSObject::putByIndexBeyondVectorLengthWithoutAttributes): + (JSC::JSObject::putByIndexBeyondVectorLength): + (JSC::JSObject::putDirectIndexBeyondVectorLength): + (JSC::JSObject::getNewVectorLength): + (JSC::JSObject::countElements): + (JSC::JSObject::ensureLengthSlow): + (JSC::JSObject::getOwnPropertyDescriptor): + * runtime/JSObject.h: + (JSC::JSObject::getArrayLength): + (JSC::JSObject::getVectorLength): + (JSC::JSObject::canGetIndexQuickly): + (JSC::JSObject::getIndexQuickly): + (JSC::JSObject::tryGetIndexQuickly): + (JSC::JSObject::canSetIndexQuickly): + (JSC::JSObject::canSetIndexQuicklyForPutDirect): + (JSC::JSObject::setIndexQuickly): + (JSC::JSObject::initializeIndex): + (JSC::JSObject::hasSparseMap): + (JSC::JSObject::inSparseIndexingMode): + (JSObject): + (JSC::JSObject::ensureInt32): + (JSC::JSObject::ensureDouble): + (JSC::JSObject::ensureLength): + (JSC::JSObject::indexingData): + (JSC::JSObject::currentIndexingData): + (JSC::JSObject::getHolyIndexQuickly): + (JSC::JSObject::relevantLength): + (JSC::JSObject::currentRelevantLength): + * runtime/JSValue.cpp: + (JSC::JSValue::description): + * runtime/LiteralParser.cpp: + (JSC::::parse): + * runtime/ObjectConstructor.cpp: + (JSC::objectConstructorGetOwnPropertyNames): + (JSC::objectConstructorKeys): + * runtime/StringPrototype.cpp: + (JSC::stringProtoFuncMatch): + (JSC::stringProtoFuncSplit): + * runtime/Structure.cpp: + (JSC::Structure::nonPropertyTransition): + * runtime/StructureTransitionTable.h: + (JSC::newIndexingType): + +2012-11-08 Balazs Kilvady <kilvadyb@homejinni.com> + + ASSERT problem on MIPS + https://bugs.webkit.org/show_bug.cgi?id=100589 + + Reviewed by Oliver Hunt. + + ASSERT fix for MIPS arch. + + * jit/JITOpcodes.cpp: + (JSC::JIT::emit_resolve_operations): + +2012-11-08 Michael Saboff <msaboff@apple.com> + + OpaqueJSClassContextData() should use StringImpl::isolatedCopy() to make string copies + https://bugs.webkit.org/show_bug.cgi?id=101507 + + Reviewed by Andreas Kling. + + Changed to use isolatedCopy() for key Strings. + + * API/JSClassRef.cpp: + (OpaqueJSClassContextData::OpaqueJSClassContextData): + +2012-11-07 Mark Hahnenberg <mhahnenberg@apple.com> + + WeakBlocks should be HeapBlocks + https://bugs.webkit.org/show_bug.cgi?id=101411 + + Reviewed by Oliver Hunt. + + Currently WeakBlocks use fastMalloc memory. They are very similar to the other HeapBlocks, however, + so we should change them to being allocated with the BlockAllocator. + + * heap/BlockAllocator.cpp: + (JSC::BlockAllocator::BlockAllocator): + * heap/BlockAllocator.h: Added a new RegionSet for WeakBlocks. + (JSC): + (BlockAllocator): + (JSC::WeakBlock): + * heap/Heap.h: Friended WeakSet to allow access to the BlockAllocator. + (Heap): + * heap/WeakBlock.cpp: + (JSC::WeakBlock::create): Refactored to use HeapBlocks rather than fastMalloc. + (JSC::WeakBlock::WeakBlock): + * heap/WeakBlock.h: Changed the WeakBlock size to 4 KB so that it divides evenly into the Region size. + (JSC): + (WeakBlock): + * heap/WeakSet.cpp: + (JSC::WeakSet::~WeakSet): + (JSC::WeakSet::addAllocator): + +2012-11-07 Filip Pizlo <fpizlo@apple.com> + + Indentation of ArgList.h is wrong + https://bugs.webkit.org/show_bug.cgi?id=101441 + + Reviewed by Andreas Kling. + + Just unindented by 4 spaces. + + * runtime/ArgList.h: + +2012-11-07 Gabor Ballabas <gaborb@inf.u-szeged.hu> + + [Qt][ARM] REGRESSION(r133688): It made all JSC and layout tests crash on ARM traditional platform + https://bugs.webkit.org/show_bug.cgi?id=101465 + + Reviewed by Oliver Hunt. + + Fix failing javascriptcore tests on ARM after r133688 + + * bytecode/CodeBlock.cpp: + (JSC::CodeBlock::CodeBlock): + +2012-11-06 Oliver Hunt <oliver@apple.com> + + Reduce parser overhead in JSC + https://bugs.webkit.org/show_bug.cgi?id=101127 + + Reviewed by Filip Pizlo. + + An exciting journey into the world of architecture in which our hero + adds yet another layer to JSC codegeneration. + + This patch adds a marginally more compact form of bytecode that is + free from any data specific to a given execution context, and that + does store any data structures necessary for execution. To actually + execute this UnlinkedBytecode we still need to instantiate a real + CodeBlock, but this is a much faster linear time operation than any + of the earlier parsing or code generation passes. + + As the unlinked code is context free we can then simply use a cache + from source to unlinked code mapping to completely avoid all of the + old parser overhead. The cache is currently very simple and memory + heavy, using the complete source text as a key (rather than SourceCode + or equivalent), and a random eviction policy. + + This seems to produce a substantial win when loading identical content + in different contexts. + + * API/tests/testapi.c: + (main): + * CMakeLists.txt: + * GNUmakefile.list.am: + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: + * JavaScriptCore.xcodeproj/project.pbxproj: + * bytecode/CodeBlock.cpp: + * bytecode/CodeBlock.h: + Moved a number of fields, and a bunch of logic to UnlinkedCodeBlock.h/cpp + * bytecode/Opcode.h: + Added a global const init no op instruction needed to get correct + behaviour without any associated semantics. + * bytecode/UnlinkedCodeBlock.cpp: Added. + * bytecode/UnlinkedCodeBlock.h: Added. + A fairly shallow, GC allocated version of the old CodeBlock + classes with a 32bit instruction size, and just metadata + size tracking. + * bytecompiler/BytecodeGenerator.cpp: + * bytecompiler/BytecodeGenerator.h: + Replace direct access to m_symbolTable with access through + symbolTable(). ProgramCode no longer has a symbol table at + all so some previously unconditional (and pointless) uses + of symbolTable get null checks. + A few other changes to deal with type changes due to us generating + unlinked code (eg. pointer free, so profile indices rather than + pointers). + * dfg/DFGByteCodeParser.cpp: + * dfg/DFGCapabilities.h: + Support global_init_nop + * interpreter/Interpreter.cpp: + Now get the ProgramExecutable to initialise new global properties + before starting execution. + * jit/JIT.cpp: + * jit/JITDriver.h: + * jit/JITStubs.cpp: + * llint/LLIntData.cpp: + * llint/LLIntSlowPaths.cpp: + * llint/LowLevelInterpreter.asm: + * llint/LowLevelInterpreter32_64.asm: + * llint/LowLevelInterpreter64.asm: + Adding init_global_const_nop everywhere else + * parser/Parser.h: + * parser/ParserModes.h: Added. + * parser/ParserTokens.h: + Parser no longer needs a global object or callframe to function + * runtime/CodeCache.cpp: Added. + * runtime/CodeCache.h: Added. + A simple, random eviction, Source->UnlinkedCode cache + * runtime/Executable.cpp: + * runtime/Executable.h: + Executables now reference their unlinked counterparts, and + request code specifically for the target global object. + * runtime/JSGlobalData.cpp: + * runtime/JSGlobalData.h: + GlobalData now owns a CodeCache and a set of new structures + for the unlinked code types. + * runtime/JSGlobalObject.cpp: + * runtime/JSGlobalObject.h: + Utility functions used by executables to perform compilation + + * runtime/JSType.h: + Add new JSTypes for unlinked code + +2012-11-06 Michael Saboff <msaboff@apple.com> + + JSStringCreateWithCFString() Should create an 8 bit String if possible + https://bugs.webkit.org/show_bug.cgi?id=101104 + + Reviewed by Darin Adler. + + Try converting the CFString to an 8 bit string using CFStringGetBytes(..., + kCFStringEncodingISOLatin1, ...) and return the 8 bit string if successful. + If not proceed with 16 bit conversion. + + * API/JSStringRefCF.cpp: + (JSStringCreateWithCFString): + +2012-11-06 Oliver Hunt <oliver@apple.com> + + Reduce direct m_symbolTable usage in CodeBlock + https://bugs.webkit.org/show_bug.cgi?id=101391 + + Reviewed by Sam Weinig. + + Simple refactoring. + + * bytecode/CodeBlock.cpp: + (JSC::CodeBlock::dump): + (JSC::CodeBlock::dumpStatistics): + (JSC::CodeBlock::nameForRegister): + * bytecode/CodeBlock.h: + (JSC::CodeBlock::isCaptured): + +2012-11-06 Michael Saboff <msaboff@apple.com> + + Lexer::scanRegExp, create 8 bit pattern and flag Identifiers from 16 bit source when possible + https://bugs.webkit.org/show_bug.cgi?id=101013 + + Reviewed by Darin Adler. + + Changed scanRegExp so that it will create 8 bit identifiers from 8 bit sources and from 16 bit sources + whan all the characters are 8 bit. Using two templated helpers, the "is all 8 bit" check is only performed + on 16 bit sources. The first helper is orCharacter() that will accumulate the or value of all characters + only for 16 bit sources. Replaced the helper Lexer::makeIdentifierSameType() with Lexer::makeRightSizedIdentifier(). + + * parser/Lexer.cpp: + (JSC::orCharacter<LChar>): Explicit template that serves as a placeholder. + (JSC::orCharacter<UChar>): Explicit template that actually or accumulates characters. + (JSC::Lexer::scanRegExp): + * parser/Lexer.h: + (Lexer): + (JSC::Lexer::makeRightSizedIdentifier<LChar>): New template that always creates an 8 bit Identifier. + (JSC::Lexer::makeRightSizedIdentifier<UChar>): New template that creates an 8 bit Identifier for 8 bit + data in a 16 bit source. + +2012-11-06 Filip Pizlo <fpizlo@apple.com> + + Indentation of JSCell.h is wrong + https://bugs.webkit.org/show_bug.cgi?id=101379 + + Rubber stamped by Alexey Proskuryakov. + + Just removed four spaces on a bunch of lines. + + * runtime/JSCell.h: + +2012-11-05 Filip Pizlo <fpizlo@apple.com> + + Indentation of JSObject.h is wrong + https://bugs.webkit.org/show_bug.cgi?id=101313 + + Rubber stamped by Alexey Proskuryakov. + + Just unindented code, since namespace bodies shouldn't be indented. + + * runtime/JSObject.h: + +2012-11-05 Filip Pizlo <fpizlo@apple.com> + + Indentation of JSArray.h is wrong + https://bugs.webkit.org/show_bug.cgi?id=101314 + + Rubber stamped by Alexey Proskuryakov. + + Just removing the indentation inside the namespace body. + + * runtime/JSArray.h: + +2012-11-05 Filip Pizlo <fpizlo@apple.com> + + DFG should not fall down to patchable GetById just because a prototype had things added to it + https://bugs.webkit.org/show_bug.cgi?id=101299 + + Reviewed by Geoffrey Garen. + + This looks like a slight win on V8v7 and SunSpider. + + * bytecode/DFGExitProfile.h: + (JSC::DFG::exitKindToString): + * dfg/DFGSpeculativeJIT64.cpp: + (JSC::DFG::SpeculativeJIT::compile): + +2012-11-05 Filip Pizlo <fpizlo@apple.com> + + Get rid of method_check + https://bugs.webkit.org/show_bug.cgi?id=101147 + + Reviewed by Geoffrey Garen. + + op_method_check no longer buys us anything, since get_by_id proto caching + gives just as much profiling information and the DFG inlines monomorphic + proto accesses anyway. + + This also has the potential for a speed-up since it makes parsing of + profiling data easier. No longer do we have to deal with the confusion of + the get_by_id portion of a method_check appearing monomorphic even though + we're really dealing with a bimorphic access (method_check specializes for + one case and get_by_id for another). + + This looks like a 1% speed-up on both SunSpider and V8v7. + + * CMakeLists.txt: + * GNUmakefile.list.am: + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: + * JavaScriptCore.xcodeproj/project.pbxproj: + * Target.pri: + * bytecode/CodeBlock.cpp: + (JSC::CodeBlock::printGetByIdCacheStatus): + (JSC::CodeBlock::dump): + (JSC::CodeBlock::finalizeUnconditionally): + (JSC::CodeBlock::shrinkToFit): + (JSC::CodeBlock::unlinkCalls): + * bytecode/CodeBlock.h: + (JSC::CodeBlock::getCallLinkInfo): + (JSC::CodeBlock::callLinkInfo): + (CodeBlock): + * bytecode/GetByIdStatus.cpp: + (JSC::GetByIdStatus::computeFromLLInt): + * bytecode/MethodCallLinkInfo.cpp: Removed. + * bytecode/MethodCallLinkInfo.h: Removed. + * bytecode/MethodCallLinkStatus.cpp: Removed. + * bytecode/MethodCallLinkStatus.h: Removed. + * bytecode/Opcode.h: + (JSC): + (JSC::padOpcodeName): + * bytecompiler/BytecodeGenerator.cpp: + (JSC): + * bytecompiler/BytecodeGenerator.h: + (BytecodeGenerator): + * bytecompiler/NodesCodegen.cpp: + (JSC::FunctionCallDotNode::emitBytecode): + * dfg/DFGByteCodeParser.cpp: + (JSC::DFG::ByteCodeParser::parseBlock): + * dfg/DFGCapabilities.h: + (JSC::DFG::canCompileOpcode): + * jit/JIT.cpp: + (JSC::JIT::privateCompileMainPass): + (JSC::JIT::privateCompileSlowCases): + (JSC::PropertyStubCompilationInfo::copyToStubInfo): + (JSC::JIT::privateCompile): + * jit/JIT.h: + (JSC::PropertyStubCompilationInfo::slowCaseInfo): + (PropertyStubCompilationInfo): + (JSC): + (JIT): + * jit/JITPropertyAccess.cpp: + (JSC): + (JSC::JIT::emitSlow_op_get_by_id): + (JSC::JIT::compileGetByIdSlowCase): + * jit/JITPropertyAccess32_64.cpp: + (JSC): + (JSC::JIT::compileGetByIdSlowCase): + * jit/JITStubs.cpp: + (JSC): + * jit/JITStubs.h: + * llint/LowLevelInterpreter.asm: + +2012-11-05 Yuqiang Xian <yuqiang.xian@intel.com> + + Refactor LLInt64 to distinguish the pointer operations from the 64-bit integer operations + https://bugs.webkit.org/show_bug.cgi?id=100321 + + Reviewed by Filip Pizlo. + + We have refactored the MacroAssembler and JIT compilers to distinguish + the pointer operations from the 64-bit integer operations (see bug #99154). + Now we want to do the similar work for LLInt, and the goal is same as + the one mentioned in 99154. + + This is the second part of the modification: in the low level interpreter, + changing the operations on 64-bit integers to use the "<foo>q" instructions. + This also removes some unused/meaningless "<foo>p" instructions. + + * llint/LowLevelInterpreter.asm: + * llint/LowLevelInterpreter.cpp: + (JSC::CLoop::execute): + * llint/LowLevelInterpreter64.asm: + * offlineasm/armv7.rb: + * offlineasm/cloop.rb: + * offlineasm/instructions.rb: + * offlineasm/x86.rb: + +2012-11-05 Filip Pizlo <fpizlo@apple.com> + + Prototype chain caching should check that the path from the base object to the slot base involves prototype hops only + https://bugs.webkit.org/show_bug.cgi?id=101276 + + Reviewed by Gavin Barraclough. + + Changed normalizePrototypeChain() to report an invalid prototype chain if any object is a proxy. + This catches cases where our prototype chain checks would have been insufficient to guard against + newly introduced properties, despecialized properties, or deleted properties in the chain of + objects involved in the access. + + * dfg/DFGRepatch.cpp: + (JSC::DFG::tryCacheGetByID): + (JSC::DFG::tryBuildGetByIDProtoList): + (JSC::DFG::tryCachePutByID): + (JSC::DFG::tryBuildPutByIdList): + * jit/JITStubs.cpp: + (JSC::JITThunks::tryCachePutByID): + (JSC::JITThunks::tryCacheGetByID): + (JSC::DEFINE_STUB_FUNCTION): + * llint/LLIntSlowPaths.cpp: + (JSC::LLInt::LLINT_SLOW_PATH_DECL): + * runtime/Operations.h: + (JSC): + (JSC::normalizePrototypeChain): + +2012-11-05 Dima Gorbik <dgorbik@apple.com> + + Back out controversial changes from Bug 98665. + https://bugs.webkit.org/show_bug.cgi?id=101244 + + Reviewed by David Kilzer. + + Backing out changes from Bug 98665 until further discussions take place on rules for including Platform.h in Assertions.h. + + * API/tests/minidom.c: + * API/tests/testapi.c: + +2012-11-04 Filip Pizlo <fpizlo@apple.com> + + Reduce the verbosity of referring to QNaN in JavaScriptCore + https://bugs.webkit.org/show_bug.cgi?id=101174 + + Reviewed by Geoffrey Garen. + + Introduces a #define QNaN in JSValue.h, and replaces all previous uses of + std::numeric_limits<double>::quiet_NaN() with QNaN. + + * API/JSValueRef.cpp: + (JSValueMakeNumber): + (JSValueToNumber): + * dfg/DFGSpeculativeJIT.cpp: + (JSC::DFG::SpeculativeJIT::compileGetByValOnFloatTypedArray): + * jit/JITPropertyAccess.cpp: + (JSC::JIT::emitFloatTypedArrayGetByVal): + * runtime/CachedTranscendentalFunction.h: + (JSC::CachedTranscendentalFunction::initialize): + * runtime/DateConstructor.cpp: + (JSC::constructDate): + * runtime/DateInstanceCache.h: + (JSC::DateInstanceData::DateInstanceData): + (JSC::DateInstanceCache::reset): + * runtime/ExceptionHelpers.cpp: + (JSC::InterruptedExecutionError::defaultValue): + (JSC::TerminatedExecutionError::defaultValue): + * runtime/JSCell.h: + (JSC::JSValue::getPrimitiveNumber): + * runtime/JSDateMath.cpp: + (JSC::parseDateFromNullTerminatedCharacters): + * runtime/JSGlobalData.cpp: + (JSC::JSGlobalData::JSGlobalData): + (JSC::JSGlobalData::resetDateCache): + * runtime/JSGlobalObjectFunctions.cpp: + (JSC::parseInt): + (JSC::jsStrDecimalLiteral): + (JSC::toDouble): + (JSC::jsToNumber): + (JSC::parseFloat): + * runtime/JSValue.cpp: + (JSC::JSValue::toNumberSlowCase): + * runtime/JSValue.h: + (JSC): + * runtime/JSValueInlineMethods.h: + (JSC::jsNaN): + * runtime/MathObject.cpp: + (JSC::mathProtoFuncMax): + (JSC::mathProtoFuncMin): + +2012-11-03 Filip Pizlo <fpizlo@apple.com> + + Baseline JIT should use structure watchpoints whenever possible + https://bugs.webkit.org/show_bug.cgi?id=101146 + + Reviewed by Sam Weinig. + + No speed-up yet except on toy programs. I think that it will start to show + speed-ups with https://bugs.webkit.org/show_bug.cgi?id=101147, which this is + a step towards. + + * jit/JIT.h: + (JIT): + * jit/JITPropertyAccess.cpp: + (JSC::JIT::privateCompilePutByIdTransition): + (JSC::JIT::privateCompileGetByIdProto): + (JSC::JIT::privateCompileGetByIdProtoList): + (JSC::JIT::privateCompileGetByIdChainList): + (JSC::JIT::privateCompileGetByIdChain): + (JSC::JIT::addStructureTransitionCheck): + (JSC): + (JSC::JIT::testPrototype): + * jit/JITPropertyAccess32_64.cpp: + (JSC::JIT::privateCompilePutByIdTransition): + (JSC::JIT::privateCompileGetByIdProto): + (JSC::JIT::privateCompileGetByIdProtoList): + (JSC::JIT::privateCompileGetByIdChainList): + (JSC::JIT::privateCompileGetByIdChain): + +2012-11-04 Csaba Osztrogonác <ossy@webkit.org> + + [Qt] udis86_itab.c is always regenerated + https://bugs.webkit.org/show_bug.cgi?id=100756 + + Reviewed by Simon Hausmann. + + * DerivedSources.pri: Generate sources to the generated directory. + * disassembler/udis86/differences.txt: + * disassembler/udis86/itab.py: Add --outputDir option. + (UdItabGenerator.__init__): + (genItabH): + (genItabC): + (main): + +2012-11-02 Filip Pizlo <fpizlo@apple.com> + + LLInt 32-bit put_by_val ArrayStorage case should use the right register (t3, not t2) for the index in the publicLength updating path + https://bugs.webkit.org/show_bug.cgi?id=101118 + + Reviewed by Gavin Barraclough. + + * llint/LowLevelInterpreter32_64.asm: + +2012-11-02 Filip Pizlo <fpizlo@apple.com> + + DFG::Node::converToStructureTransitionWatchpoint should take kindly to ArrayifyToStructure + https://bugs.webkit.org/show_bug.cgi?id=101117 + + Reviewed by Gavin Barraclough. + + We have logic to convert ArrayifyToStructure to StructureTransitionWatchpoint, which is awesome, except + that previously convertToStructureTransitionWatchpoint was (a) asserting that it never saw an + ArrayifyToStructure and (b) would incorrectly create a ForwardStructureTransitionWatchpoint if it did. + + * dfg/DFGNode.h: + (JSC::DFG::Node::convertToStructureTransitionWatchpoint): + +2012-11-02 Filip Pizlo <fpizlo@apple.com> + + DFG::SpeculativeJIT::typedArrayDescriptor should use the Float64Array descriptor for Float64Arrays + https://bugs.webkit.org/show_bug.cgi?id=101114 + + Reviewed by Gavin Barraclough. + + As in https://bugs.webkit.org/show_bug.cgi?id=101112, this was only wrong when Float64Array descriptors + hadn't been initialized yet. That happens rarely, but when it does happen, we would crash. + + This would also become much more wrong if we ever put type size info (num bytes, etc) in the descriptor + and used that directly. So it's good to fix it. + + * dfg/DFGSpeculativeJIT.cpp: + (JSC::DFG::SpeculativeJIT::typedArrayDescriptor): + +2012-11-02 Filip Pizlo <fpizlo@apple.com> + + JIT::privateCompileGetByVal should use the uint8ClampedArrayDescriptor for compiling accesses to Uint8ClampedArrays + https://bugs.webkit.org/show_bug.cgi?id=101112 + + Reviewed by Gavin Barraclough. + + The only reason why the code was wrong to use uint8ArrayDescriptor instead is that if we're just using + Uint8ClampedArrays then the descriptor for Uint8Array may not have been initialized. + + * jit/JITPropertyAccess.cpp: + (JSC::JIT::privateCompileGetByVal): + +2012-11-02 Mark Hahnenberg <mhahnenberg@apple.com> + + MarkedBlocks should use something other than the mark bits to indicate liveness for newly allocated objects + https://bugs.webkit.org/show_bug.cgi?id=100877 + + Reviewed by Filip Pizlo. + + Currently when we canonicalize cell liveness data in MarkedBlocks, we set the mark bit for every cell in the + block except for those in the free list. This allows us to consider objects that were allocated since the + previous collection to be considered live until they have a chance to be properly marked by the collector. + + If we want to use the mark bits to signify other types of information, e.g. using sticky mark bits for generational + collection, we will have to keep track of newly allocated objects in a different fashion when we canonicalize cell liveness. + + One method would be to allocate a separate set of bits while canonicalizing liveness data. These bits would + track the newly allocated objects in the block separately from those objects who had already been marked. We would + then check these bits, along with the mark bits, when determining liveness. + + * heap/Heap.h: + (Heap): + (JSC::Heap::isLive): We now check for the presence of the newlyAllocated Bitmap. + (JSC): + * heap/MarkedBlock.cpp: + (JSC::MarkedBlock::specializedSweep): We clear the newlyAllocated Bitmap if we're creating a free list. This + will happen if we canonicalize liveness data for some other reason than collection (e.g. forEachCell) and + then start allocating again. + (JSC::SetNewlyAllocatedFunctor::SetNewlyAllocatedFunctor): + (SetNewlyAllocatedFunctor): + (JSC::SetNewlyAllocatedFunctor::operator()): We set the newlyAllocated bits for all the objects + that aren't already marked. We undo the bits for the objects in the free list later in canonicalizeCellLivenessData. + (JSC::MarkedBlock::canonicalizeCellLivenessData): We should never have a FreeListed block with a newlyAllocated Bitmap. + We allocate the new Bitmap, set the bits for all the objects that aren't already marked, and then unset all of the + bits for the items currently in the FreeList. + * heap/MarkedBlock.h: + (JSC::MarkedBlock::clearMarks): We clear the newlyAllocated bitmap if it exists because at this point we don't need it + any more. + (JSC::MarkedBlock::isEmpty): If we have some objects that are newlyAllocated, we are not empty. + (JSC::MarkedBlock::isNewlyAllocated): + (JSC): + (JSC::MarkedBlock::setNewlyAllocated): + (JSC::MarkedBlock::clearNewlyAllocated): + (JSC::MarkedBlock::isLive): We now check the newlyAllocated Bitmap, if it exists, when determining liveness of a cell in + a block that is Marked. + * heap/WeakBlock.cpp: + (JSC::WeakBlock::visit): We need to make sure we don't finalize objects that are in the newlyAllocated Bitmap. + (JSC::WeakBlock::reap): Ditto. + +2012-11-02 Filip Pizlo <fpizlo@apple.com> + + JIT::privateCompileGetByVal should use MacroAssemblerCodePtr::createFromExecutableAddress like JIT::privateCompilePutByVal + https://bugs.webkit.org/show_bug.cgi?id=101109 + + Reviewed by Gavin Barraclough. + + This fixes crashes on ARMv7 resulting from the return address already being tagged with the THUMB2 bit. + + * jit/JITPropertyAccess.cpp: + (JSC::JIT::privateCompileGetByVal): + +2012-11-02 Simon Fraser <simon.fraser@apple.com> + + Enable SUBPIXEL_LAYOUT on Mac + https://bugs.webkit.org/show_bug.cgi?id=101076 + + Reviewed by Dave Hyatt. + + Define ENABLE_SUBPIXEL_LAYOUT and include it in FEATURE_DEFINES. + + * Configurations/FeatureDefines.xcconfig: + +2012-11-02 Michael Saboff <msaboff@apple.com> + + RegExp.prototype.toString Should Produce an 8 bit JSString if possible. + https://bugs.webkit.org/show_bug.cgi?id=101003 + + Reviewed by Geoffrey Garen. + + Took the logic of regExpObjectSource() and created two templated helpers that uses the + source character type when appending to the StringBuilder. + + * runtime/RegExpObject.cpp: + (JSC::appendLineTerminatorEscape): Checks line terminate type to come up with escaped version. + (JSC::regExpObjectSourceInternal): Templated version of original. + (JSC::regExpObjectSource): Wrapper function. + +2012-11-02 Adam Barth <abarth@webkit.org> + + ENABLE(UNDO_MANAGER) is disabled everywhere and is not under active development + https://bugs.webkit.org/show_bug.cgi?id=100711 + + Reviewed by Eric Seidel. + + * Configurations/FeatureDefines.xcconfig: + +2012-11-02 Simon Hausmann <simon.hausmann@digia.com> + + [Qt] Fix build on Windows when Qt is configured with -release + https://bugs.webkit.org/show_bug.cgi?id=101041 + + Reviewed by Jocelyn Turcotte. + + When Qt is configured with -debug or -release, the release/debug build of for example + QtCore is not available by default. For LLIntExtractor we always need to build debug + _and_ release versions, but we do not actually need any Qt libraries nor qtmain(d).lib. + Therefore we can disable all these features but need to keep $$QT.core.includes in the + INCLUDEPATH for some defines from qglobal.h. + + * LLIntOffsetsExtractor.pro: + +2012-11-01 Mark Lam <mark.lam@apple.com> + + A llint workaround for a toolchain issue. + https://bugs.webkit.org/show_bug.cgi?id=101012. + + Reviewed by Michael Saboff. + + * llint/LowLevelInterpreter.asm: + - use a local label to workaround the toolchain issue with undeclared + global labels. + +2012-11-01 Oliver Hunt <oliver@apple.com> + + Remove GlobalObject constant register that is typically unused + https://bugs.webkit.org/show_bug.cgi?id=101005 + + Reviewed by Geoffrey Garen. + + The GlobalObject constant register is frequently allocated even when it + is not used, it is also getting in the way of some other optimisations. + + * bytecode/CodeBlock.cpp: + (JSC::CodeBlock::CodeBlock): + * bytecode/CodeBlock.h: + (CodeBlock): + * bytecompiler/BytecodeGenerator.cpp: + (JSC::BytecodeGenerator::BytecodeGenerator): + * dfg/DFGByteCodeParser.cpp: + (JSC::DFG::ByteCodeParser::parseResolveOperations): + +2012-10-31 Filip Pizlo <fpizlo@apple.com> + + DFG optimized string access code should be enabled + https://bugs.webkit.org/show_bug.cgi?id=100825 + + Reviewed by Oliver Hunt. + + - Removes prediction checks from the parser. + + - Fixes the handling of array mode refinement for strings. I.e. we don't do + any refinement - we already know it's going to be a string. We could + revisit this in the future, but for now the DFG lacks the ability to + handle any array modes other than Array::String for string intrinsics, so + this is as good as it gets. + + - Removes uses of isBlahSpeculation for checking if a mode is already + checked. isBlahSpeculation implicitly checks if the SpeculatedType is not + BOTTOM ("empty"), which breaks for checking if a mode is already checked + since a mode may already be "checked" in the sense that we've proven that + the code is unreachable. + + ~1% speed-up on V8v7, mostly from a speed-up on crypto, which uses string + intrinsics in one of the hot functions. + + * bytecode/SpeculatedType.h: + (JSC::speculationChecked): + (JSC): + * dfg/DFGArrayMode.cpp: + (JSC::DFG::ArrayMode::alreadyChecked): + * dfg/DFGByteCodeParser.cpp: + (JSC::DFG::ByteCodeParser::handleIntrinsic): + * dfg/DFGFixupPhase.cpp: + (JSC::DFG::FixupPhase::fixupNode): + * dfg/DFGSpeculativeJIT.cpp: + (JSC::DFG::SpeculativeJIT::compileGetCharCodeAt): + +2012-10-31 Filip Pizlo <fpizlo@apple.com> + + Sparse array size threshold should be increased to 100000 + https://bugs.webkit.org/show_bug.cgi?id=100827 + + Reviewed by Oliver Hunt. + + This enables the use of contiguous arrays in programs that previously + couldn't use them. And I so far can't see any examples of this being + a downside. To the extent that there is a downside, it ought to be + addressed by GC: https://bugs.webkit.org/show_bug.cgi?id=100828 + + * runtime/ArrayConventions.h: + (JSC): + +2012-10-31 Mark Lam <mark.lam@apple.com> + + C++ llint 64-bit backend needs to zero extend results of int32 operations. + https://bugs.webkit.org/show_bug.cgi?id=100899. + + Reviewed by Filip Pizlo. + + llint asm instructions ending in "i" for a 64-bit machine expects the + high 32-bit of registers to be zero'ed out when a 32-bit instruction + writes into a register. Fixed the C++ llint to honor this. + + Fixed the index register used in BaseIndex addressing to be of size + intptr_t as expected. + + Updated CLoopRegister to handle different endiannesss configurations. + + * llint/LowLevelInterpreter.cpp: + (JSC::CLoopRegister::clearHighWord): + - new method to clear the high 32-bit of a 64-bit register. + It's a no-op for the 32-bit build. + (CLoopRegister): + - CLoopRegister now takes care of packing and byte endianness order. + (JSC::CLoop::execute): - Added an assert. + * offlineasm/cloop.rb: + - Add calls to clearHighWord() wherever needed. + +2012-10-31 Mark Lam <mark.lam@apple.com> + + A JSC printf (support for %J+s and %b). + https://bugs.webkit.org/show_bug.cgi?id=100566. + + Reviewed by Michael Saboff. + + Added VMInspector::printf(), fprintf(), sprintf(), and snprintf(). + - %b prints ints as boolean TRUE (non-zero) or FALSE (zero). + - %Js prints a WTF::String* like a %s prints a char*. + Also works for 16bit WTF::Strings (prints wchar_t* using %S). + - '+' is a modifier meaning 'use verbose mode', and %J+s is an example + of its use. + + * JavaScriptCore.xcodeproj/project.pbxproj: + * interpreter/VMInspector.cpp: + (FormatPrinter): + (JSC::FormatPrinter::~FormatPrinter): + (JSC::FormatPrinter::print): + (JSC::FormatPrinter::printArg): + (JSC::FormatPrinter::printWTFString): + (JSC::FileFormatPrinter::FileFormatPrinter): + (JSC::FileFormatPrinter::printArg): + (JSC::StringFormatPrinter::StringFormatPrinter): + (JSC::StringFormatPrinter::printArg): + (JSC::StringNFormatPrinter::StringNFormatPrinter): + (JSC::StringNFormatPrinter::printArg): + (JSC::VMInspector::fprintf): + (JSC::VMInspector::printf): + (JSC::VMInspector::sprintf): + (JSC::VMInspector::snprintf): + * interpreter/VMInspector.h: + (VMInspector): + +2012-10-31 Mark Lam <mark.lam@apple.com> + + 64-bit llint PC offset can be negative: using an unsigned shift is a bug. + https://bugs.webkit.org/show_bug.cgi?id=100896. + + Reviewed by Filip Pizlo. + + Fixed the PC offset divisions in the 64-bit llint asm to use rshift instead of urshift. + + * llint/LowLevelInterpreter64.asm: + +2012-10-30 Yuqiang Xian <yuqiang.xian@intel.com> + + glsl-function-atan.html WebGL conformance test fails after https://bugs.webkit.org/show_bug.cgi?id=99154 + https://bugs.webkit.org/show_bug.cgi?id=100789 + + Reviewed by Filip Pizlo. + + We accidently missed a bitwise double to int64 conversion. + + * dfg/DFGSpeculativeJIT.h: + (JSC::DFG::SpeculativeJIT::silentFill): + +2012-10-30 Joseph Pecoraro <pecoraro@apple.com> + + [Mac] Sync up FeatureDefine Configuration Files + https://bugs.webkit.org/show_bug.cgi?id=100171 + + Reviewed by David Kilzer. + + Follow up to better coordinate with iOS feature defines. Make: + + - ENABLE_FILTERS always on + - ENABLE_INPUT_* iphonesimulator values point to the iphoneos values + + * Configurations/FeatureDefines.xcconfig: + +2012-10-30 Joseph Pecoraro <pecoraro@apple.com> + + [Mac] Sync up FeatureDefine Configuration Files + https://bugs.webkit.org/show_bug.cgi?id=100171 + + Reviewed by David Kilzer. + + Ensure an identical FeatureDefine files across all projects. Changes: + + - ENABLE_CSS_BOX_DECORATION_BREAK should be in all + - ENABLE_PDFKIT_PLUGIN should be in all + - ENABLE_RESOLUTION_MEDIA_QUERY should be in all + - ENABLE_ENCRYPTED_MEDIA should be in all + - ENABLE_HIDDEN_PAGE_DOM_TIMER_THROTTLING with corrected value + - Some alphabetical ordering cleanup + + * Configurations/FeatureDefines.xcconfig: + +2012-10-30 Mark Hahnenberg <mhahnenberg@apple.com> + + Arrays can change IndexingType in the middle of sorting + https://bugs.webkit.org/show_bug.cgi?id=100773 + + Reviewed by Filip Pizlo. + + Instead of giving up, we just fetch the appropriate vector based on the current + IndexingType of the array. + + * runtime/JSArray.cpp: + (JSC::JSArray::sortVector): + * runtime/JSObject.h: + (JSObject): + (JSC::JSObject::currentIndexingData): + (JSC::JSObject::currentRelevantLength): + +2012-10-29 Anders Carlsson <andersca@apple.com> + + Build WebKit as C++11 on Mac + https://bugs.webkit.org/show_bug.cgi?id=100720 + + Reviewed by Daniel Bates. + + * Configurations/Base.xcconfig: + Add CLANG_CXX_LANGUAGE_STANDARD=gnu++0x. + + * bytecompiler/BytecodeGenerator.cpp: + (JSC::BytecodeGenerator::generate): + (JSC::BytecodeGenerator::pushFinallyContext): + (JSC::BytecodeGenerator::beginSwitch): + * llint/LLIntOffsetsExtractor.cpp: + * runtime/Identifier.cpp: + (JSC::Identifier::add8): + * runtime/Identifier.h: + (JSC::Identifier::add): + * runtime/JSONObject.cpp: + (JSC::appendStringToStringBuilder): + * runtime/StringPrototype.cpp: + (JSC::replaceUsingStringSearch): + Add static_casts to prevent implicit type conversions in non-constant initializer lists. + +2012-10-28 Mark Rowe <mrowe@apple.com> + + Simplify Xcode configuration settings that used to vary between OS versions. + + Reviewed by Dan Bernstein. + + * Configurations/Base.xcconfig: + * Configurations/DebugRelease.xcconfig: + * Configurations/JavaScriptCore.xcconfig: + +2012-10-28 Mark Rowe <mrowe@apple.com> + + Remove references to unsupported OS and Xcode versions. + + Reviewed by Anders Carlsson. + + * Configurations/Base.xcconfig: + * Configurations/CompilerVersion.xcconfig: Removed. + * Configurations/DebugRelease.xcconfig: + * Configurations/Version.xcconfig: + * JavaScriptCore.xcodeproj/project.pbxproj: + +2012-10-29 Michael Saboff <msaboff@apple.com> + + Non-special escape character sequences cause JSC::Lexer::parseString to create 16 bit strings + https://bugs.webkit.org/show_bug.cgi?id=100576 + + Reviewed by Darin Adler. + + Changed singleEscape() processing to be based on a lookup of a static table. The table + covers ASCII characters SPACE through DEL. If a character can be a single character escape, + then the table provides the non-zero result of that escape. Updated the result of + singleEscape to be an LChar to make the table as small as possible. + Added a new test fast/js/normal-character-escapes-in-string-literals.html to validated + the behavior. + + * parser/Lexer.cpp: + (JSC::singleEscape): + (JSC::Lexer::parseString): + (JSC::Lexer::parseStringSlowCase): + +2012-10-29 Enrica Casucci <enrica@apple.com> + + Add ENABLE_USERSELECT_ALL feature flag. + https://bugs.webkit.org/show_bug.cgi?id=100559 + + Reviewed by Eric Seidel. + + * Configurations/FeatureDefines.xcconfig: + +2012-10-28 Filip Pizlo <fpizlo@apple.com> + + DFG should be able to emit effectful structure checks + https://bugs.webkit.org/show_bug.cgi?id=99260 + + Reviewed by Oliver Hunt. + + This change allows us to find out if an array access that has gone polymorphic + is operating over known structures - i.e. the primordial array structures of the + global object that the code block containing the array access belongs to. We + term this state "OriginalArray" for short. The fact that the access has gone + polymorphic means that the array profile will not be able to report the set of + structures it had seen - but if it can tell us that all of the structures were + primordial then it just so happens that we can deduce what the structure set + would have been by just querying the code block's global object. This allows us + to emit an ArrayifyToStructure instead of an Arrayify if we find that we need to + do conversions. The fast path of an ArrayifyToStructure is exactly like the fast + path of a CheckStructure and is mostly subject to the same optimizations. It + also burns one fewer registers. + + Essentially the notion of OriginalArray is a super cheap way of getting the + array profile to tell us a structure set instead of a singleton structure. + Currently, the array profile can only tell us the structure seen at an array + access if there was exactly one structure. If there were multiple structures, it + won't tell us anything other than the array modes and other auxiliary profiling + data (whether there were stores to holes, for example). With OriginalArray, we + cheaply get a structure set if all of the structures were primordial for the + code block's global object, since in that case the array mode set (ArrayModes) + can directly tell us the structure set. In the future, we might consider adding + complete structure sets to the array profiles, but I suspect that we would hit + diminishing returns if we did so - it would only help if we have array accesses + that are both polymorphic and are cross-global-object accesses (rare) or if the + arrays had named properties or other structure transitions that are unrelated to + indexing type (also rare). + + This also does away with Arrayify (and the new ArrayifyToStructure) returning + the butterfly pointer. This turns out to be faster and easier to CSE. + + And, this also changes constant folding to be able to eliminate CheckStructure, + ForwardCheckStructure, and ArrayifyToStructure in addition to being able to + transform them into structure transition watchpoints. This is great for + ArrayifyToStructure because then CSE and CFA know that there is no side effect. + Converting CheckStructure and ForwardCheckStructure to also behave this way is + just a matter of elegance. + + This has no performance impact right now. It's intended to alleviate some of the + regressions seen in the early implementation of + https://bugs.webkit.org/show_bug.cgi?id=98606. + + * bytecode/ArrayProfile.cpp: + (JSC::ArrayProfile::computeUpdatedPrediction): + * bytecode/ArrayProfile.h: + (JSC): + (JSC::ArrayProfile::ArrayProfile): + (ArrayProfile): + (JSC::ArrayProfile::usesOriginalArrayStructures): + * bytecode/CodeBlock.cpp: + (JSC::CodeBlock::updateAllPredictionsAndCountLiveness): + * dfg/DFGAbstractState.cpp: + (JSC::DFG::AbstractState::execute): + * dfg/DFGArrayMode.cpp: + (JSC::DFG::ArrayMode::fromObserved): + (JSC::DFG::ArrayMode::alreadyChecked): + (JSC::DFG::arrayClassToString): + * dfg/DFGArrayMode.h: + (JSC::DFG::ArrayMode::withProfile): + (JSC::DFG::ArrayMode::isJSArray): + (ArrayMode): + (JSC::DFG::ArrayMode::isJSArrayWithOriginalStructure): + (JSC::DFG::ArrayMode::supportsLength): + (JSC::DFG::ArrayMode::arrayModesWithIndexingShape): + * dfg/DFGByteCodeParser.cpp: + (JSC::DFG::ByteCodeParser::getArrayMode): + (JSC::DFG::ByteCodeParser::getArrayModeAndEmitChecks): + (JSC::DFG::ByteCodeParser::handleGetByOffset): + * dfg/DFGCSEPhase.cpp: + (JSC::DFG::CSEPhase::checkStructureElimination): + (JSC::DFG::CSEPhase::structureTransitionWatchpointElimination): + (JSC::DFG::CSEPhase::getPropertyStorageLoadElimination): + (JSC::DFG::CSEPhase::checkArrayElimination): + (JSC::DFG::CSEPhase::getScopeRegistersLoadElimination): + * dfg/DFGConstantFoldingPhase.cpp: + (JSC::DFG::ConstantFoldingPhase::foldConstants): + * dfg/DFGFixupPhase.cpp: + (JSC::DFG::FixupPhase::fixupNode): + (JSC::DFG::FixupPhase::checkArray): + * dfg/DFGNode.h: + (JSC::DFG::Node::hasStructure): + (JSC::DFG::Node::hasArrayMode): + (JSC::DFG::Node::arrayMode): + * dfg/DFGNodeType.h: + (DFG): + * dfg/DFGPredictionPropagationPhase.cpp: + (JSC::DFG::PredictionPropagationPhase::propagate): + * dfg/DFGSpeculativeJIT.cpp: + (JSC::DFG::SpeculativeJIT::jumpSlowForUnwantedArrayMode): + (JSC::DFG::SpeculativeJIT::arrayify): + * dfg/DFGSpeculativeJIT.h: + (SpeculativeJIT): + * dfg/DFGSpeculativeJIT32_64.cpp: + (JSC::DFG::SpeculativeJIT::compile): + * dfg/DFGSpeculativeJIT64.cpp: + (JSC::DFG::SpeculativeJIT::compile): + * runtime/JSGlobalObject.h: + (JSC::JSGlobalObject::isOriginalArrayStructure): + * runtime/Structure.cpp: + (JSC::Structure::nonPropertyTransition): + +2012-10-28 Filip Pizlo <fpizlo@apple.com> + + There should not be blind spots in array length array profiling + https://bugs.webkit.org/show_bug.cgi?id=100620 + + Reviewed by Oliver Hunt. + + I don't think this has any performance impact. But it's good to not have random + programs occasionally emit a GetById for array length accesses. + + * jit/JITPropertyAccess.cpp: + (JSC::JIT::compileGetByIdHotPath): + (JSC::JIT::privateCompilePatchGetArrayLength): + * jit/JITPropertyAccess32_64.cpp: + (JSC::JIT::compileGetByIdHotPath): + (JSC::JIT::privateCompilePatchGetArrayLength): + +2012-10-28 Filip Pizlo <fpizlo@apple.com> + + Unreviewed, make always-true enum-to-int comparisons use casts. + + * dfg/DFGFPRInfo.h: + (JSC::DFG::FPRInfo::debugName): + * dfg/DFGGPRInfo.h: + (JSC::DFG::JSValueSource::tagGPR): + (JSC::DFG::GPRInfo::toIndex): + (JSC::DFG::GPRInfo::debugName): + * runtime/JSTypeInfo.h: + (JSC::TypeInfo::TypeInfo): + +2012-10-27 Filip Pizlo <fpizlo@apple.com> + + OSR exit compilation should defend against argument recoveries from code blocks that are no longer on the inline stack + https://bugs.webkit.org/show_bug.cgi?id=100601 + + Reviewed by Oliver Hunt. + + This happened to me while I was fixing bugs for https://bugs.webkit.org/show_bug.cgi?id=100599. + I'm not sure how to reproduce this. + + * dfg/DFGAssemblyHelpers.h: + (JSC::DFG::AssemblyHelpers::baselineCodeBlockFor): + (AssemblyHelpers): + * dfg/DFGOSRExitCompiler32_64.cpp: + (JSC::DFG::OSRExitCompiler::compileExit): + * dfg/DFGOSRExitCompiler64.cpp: + (JSC::DFG::OSRExitCompiler::compileExit): + +2012-10-27 Filip Pizlo <fpizlo@apple.com> + + DFG::Array::Mode needs to be cleaned up + https://bugs.webkit.org/show_bug.cgi?id=100599 + + Reviewed by Oliver Hunt. + + Turn the previous massive Array::Mode enum into a class that contains four + fields, the type, whether it's a JSArray, the level of speculation, and the + kind of conversion to perform. + + No performance or behavioral change. + + * dfg/DFGAbstractState.cpp: + (JSC::DFG::AbstractState::execute): + * dfg/DFGArgumentsSimplificationPhase.cpp: + (JSC::DFG::ArgumentsSimplificationPhase::run): + * dfg/DFGArrayMode.cpp: + (JSC::DFG::ArrayMode::fromObserved): + (JSC::DFG::ArrayMode::refine): + (JSC::DFG::ArrayMode::alreadyChecked): + (JSC::DFG::arrayTypeToString): + (JSC::DFG::arrayClassToString): + (DFG): + (JSC::DFG::arraySpeculationToString): + (JSC::DFG::arrayConversionToString): + (JSC::DFG::ArrayMode::toString): + * dfg/DFGArrayMode.h: + (DFG): + (ArrayMode): + (JSC::DFG::ArrayMode::ArrayMode): + (JSC::DFG::ArrayMode::type): + (JSC::DFG::ArrayMode::arrayClass): + (JSC::DFG::ArrayMode::speculation): + (JSC::DFG::ArrayMode::conversion): + (JSC::DFG::ArrayMode::asWord): + (JSC::DFG::ArrayMode::fromWord): + (JSC::DFG::ArrayMode::withSpeculation): + (JSC::DFG::ArrayMode::usesButterfly): + (JSC::DFG::ArrayMode::isJSArray): + (JSC::DFG::ArrayMode::isInBounds): + (JSC::DFG::ArrayMode::mayStoreToHole): + (JSC::DFG::ArrayMode::isOutOfBounds): + (JSC::DFG::ArrayMode::isSlowPut): + (JSC::DFG::ArrayMode::canCSEStorage): + (JSC::DFG::ArrayMode::lengthNeedsStorage): + (JSC::DFG::ArrayMode::modeForPut): + (JSC::DFG::ArrayMode::isSpecific): + (JSC::DFG::ArrayMode::supportsLength): + (JSC::DFG::ArrayMode::benefitsFromStructureCheck): + (JSC::DFG::ArrayMode::doesConversion): + (JSC::DFG::ArrayMode::arrayModesThatPassFiltering): + (JSC::DFG::ArrayMode::operator==): + (JSC::DFG::ArrayMode::operator!=): + (JSC::DFG::ArrayMode::arrayModesWithIndexingShape): + (JSC::DFG::canCSEStorage): + (JSC::DFG::lengthNeedsStorage): + * dfg/DFGByteCodeParser.cpp: + (JSC::DFG::ByteCodeParser::getArrayMode): + (JSC::DFG::ByteCodeParser::getArrayModeAndEmitChecks): + (JSC::DFG::ByteCodeParser::handleIntrinsic): + (JSC::DFG::ByteCodeParser::parseBlock): + * dfg/DFGCSEPhase.cpp: + (JSC::DFG::CSEPhase::getArrayLengthElimination): + (JSC::DFG::CSEPhase::checkArrayElimination): + (JSC::DFG::CSEPhase::getIndexedPropertyStorageLoadElimination): + (JSC::DFG::CSEPhase::performNodeCSE): + * dfg/DFGConstantFoldingPhase.cpp: + (JSC::DFG::ConstantFoldingPhase::foldConstants): + * dfg/DFGFixupPhase.cpp: + (JSC::DFG::FixupPhase::fixupNode): + (JSC::DFG::FixupPhase::checkArray): + (JSC::DFG::FixupPhase::blessArrayOperation): + * dfg/DFGGraph.cpp: + (JSC::DFG::Graph::dump): + * dfg/DFGGraph.h: + (JSC::DFG::Graph::byValIsPure): + * dfg/DFGNode.h: + (JSC::DFG::Node::arrayMode): + (JSC::DFG::Node::setArrayMode): + * dfg/DFGSpeculativeJIT.cpp: + (JSC::DFG::SpeculativeJIT::typedArrayDescriptor): + (JSC::DFG::SpeculativeJIT::jumpSlowForUnwantedArrayMode): + (JSC::DFG::SpeculativeJIT::checkArray): + (JSC::DFG::SpeculativeJIT::arrayify): + (JSC::DFG::SpeculativeJIT::compileGetByValOnString): + (JSC::DFG::SpeculativeJIT::compileGetByValOnIntTypedArray): + (JSC::DFG::SpeculativeJIT::compileGetByValOnFloatTypedArray): + (JSC::DFG::SpeculativeJIT::compilePutByValForFloatTypedArray): + (JSC::DFG::SpeculativeJIT::compileGetIndexedPropertyStorage): + (JSC::DFG::SpeculativeJIT::compileGetByValOnArguments): + (JSC::DFG::SpeculativeJIT::compileGetArgumentsLength): + (JSC::DFG::SpeculativeJIT::compileGetArrayLength): + (JSC::DFG::SpeculativeJIT::temporaryRegisterForPutByVal): + * dfg/DFGSpeculativeJIT.h: + (JSC::DFG::SpeculativeJIT::putByValWillNeedExtraRegister): + (SpeculativeJIT): + * dfg/DFGSpeculativeJIT32_64.cpp: + (JSC::DFG::SpeculativeJIT::compile): + * dfg/DFGSpeculativeJIT64.cpp: + (JSC::DFG::SpeculativeJIT::compile): + +2012-10-27 Dan Bernstein <mitz@apple.com> + + REAL_PLATFORM_NAME build setting is no longer needed + https://bugs.webkit.org/show_bug.cgi?id=100587 + + Reviewed by Mark Rowe. + + Removed the definition of REAL_PLATFORM_NAME and replaced references to it with references + to PLATFORM_NAME. + + * Configurations/Base.xcconfig: + * Configurations/CompilerVersion.xcconfig: + * Configurations/DebugRelease.xcconfig: + * Configurations/FeatureDefines.xcconfig: + * Configurations/JSC.xcconfig: + * Configurations/JavaScriptCore.xcconfig: + * Configurations/ToolExecutable.xcconfig: + +2012-10-25 Filip Pizlo <fpizlo@apple.com> + + Forward OSR calculation is wrong in the presence of multiple SetLocals, or a mix of SetLocals and Phantoms + https://bugs.webkit.org/show_bug.cgi?id=100461 + + Reviewed by Oliver Hunt and Gavin Barraclough. + + This does a couple of things. First, it removes the part of the change in r131822 that made the forward + OSR exit calculator capable of handling multiple SetLocals. That change was wrong, because it would + blindly assume that all SetLocals had the same ValueRecovery, and would ignore the possibility that if + there is no value recovery then a ForwardCheckStructure on the first SetLocal would not know how to + recover the state associated with the second SetLocal. Then, it introduces the invariant that any bytecode + op that decomposes into multiple SetLocals must first emit dead SetLocals as hints and then emit a second + set of SetLocals to actually do the setting of the locals. This means that if a ForwardCheckStructure (or + any other hoisted forward speculation) is inserted, it will always be inserted on the second set of + SetLocals (since hoisting only touches the live ones), at which point OSR will already know about the + mov hints implied by the first set of (dead) SetLocals. This gives us the behavior we wanted, namely, that + a ForwardCheckStructure applied to a variant set by a resolve_with_base-like operation can correctly do a + forward exit while also ensuring that prior to exiting we set the appropriate locals. + + * dfg/DFGByteCodeParser.cpp: + (JSC::DFG::ByteCodeParser::parseBlock): + * dfg/DFGOSRExit.cpp: + (JSC::DFG::OSRExit::OSRExit): + * dfg/DFGOSRExit.h: + (OSRExit): + * dfg/DFGOSRExitCompiler.cpp: + * dfg/DFGOSRExitCompiler32_64.cpp: + (JSC::DFG::OSRExitCompiler::compileExit): + * dfg/DFGOSRExitCompiler64.cpp: + (JSC::DFG::OSRExitCompiler::compileExit): + * dfg/DFGSpeculativeJIT.cpp: + (JSC::DFG::SpeculativeJIT::convertLastOSRExitToForward): + +2012-10-26 Simon Hausmann <simon.hausmann@digia.com> + + [Qt] Fix the LLInt build on Windows + https://bugs.webkit.org/show_bug.cgi?id=97648 + + Reviewed by Tor Arne Vestbø. + + The main change for the port on Windows is changing the way offsets are extracted + and the LLIntAssembly.h is generated to accomodate release and debug configurations. + + Firstly the LLIntOffsetsExtractor binary is now built as-is (no DESTDIR set) and + placed into debug\LLIntOffsetsExtractor.exe and release\LLIntOffsetsExtractor.exe + on Windows debug_and_release builds. On other patforms it remainds in the regular + out directory. + + Secondly the LLIntAssembly.h files must be different for different build types, + so the LLIntAssembly.h generator in DerivedSources.pri operates no on the extractor + binary files as input. Using a simple exists() check we verify the presence of either + a regular, a debug\LLIntOffsetsExtractor and a release\LLIntOffsetsExtractor binary + and process all of them. The resulting assembly files consequently end up in + generated\debug\LLIntAssembly.h and generated\release\LLIntAssembly.h. + + In Target.pri we have to also make sure that those directories are in the include + path according to the release or debug configuration. + + Lastly a small tweak - swapping WTF.pri and JSC.pri inclusions - in the + LLIntOffsetsExtractor build was needed to make sure that we include + JavaScriptCore/config.h instead of WTF/config.h, required to fix the + build issues originally pasted in bug #97648. + + * DerivedSources.pri: + * JavaScriptCore.pro: + * LLIntOffsetsExtractor.pro: + * Target.pri: + +2012-10-26 Gabor Ballabas <gaborb@inf.u-szeged.hu> + + [Qt] Enable JSC's disassembler on x86, x86_64 Linux + https://bugs.webkit.org/show_bug.cgi?id=100386 + + Reviewed by Simon Hausmann. + + It works fine on Linux x86, x86_64 just needs to be enabled in the + QtWebKit build system. + + * DerivedSources.pri: + * JavaScriptCore.pri: + * Target.pri: + +2012-10-26 Thiago Marcos P. Santos <thiago.santos@intel.com> + + Add feature flags for CSS Device Adaptation + https://bugs.webkit.org/show_bug.cgi?id=95960 + + Reviewed by Kenneth Rohde Christiansen. + + * Configurations/FeatureDefines.xcconfig: + +2012-10-26 Simon Hausmann <simon.hausmann@digia.com> + + [WIN] Make LLInt offsets extractor work on Windows + https://bugs.webkit.org/show_bug.cgi?id=100369 + + Reviewed by Kenneth Rohde Christiansen. + + Open the input file explicitly in binary mode to prevent ruby/Windows from thinking that + it's a text mode file that needs even new line conversions. The binary mode parameter is + ignored on other platforms. + + * offlineasm/offsets.rb: + +2012-10-25 Michael Saboff <msaboff@apple.com> + + SymbolTableIndexHashTraits::needsDestruction should be set to true + https://bugs.webkit.org/show_bug.cgi?id=100437 + + Reviewed by Mark Hahnenberg. + + For correctness, set SymbolTableIndexHashTraits::needsDestruction to true since SymbolTableEntry's do + need to have their destructor called due to the possibility of rare data. + + * runtime/SymbolTable.h: + (SymbolTableIndexHashTraits): + +2012-10-25 Filip Pizlo <fpizlo@apple.com> + + DFG Arrayify elimination should replace it with GetButterfly rather than Phantom + https://bugs.webkit.org/show_bug.cgi?id=100441 + + Reviewed by Oliver Hunt and Gavin Barraclough. + + Made array profiler's to-string helper behave correctly. + + Made Arrayify elimination do the right thing (convert to GetButterfly). + + Made CFA's interference analysis track clobbered array modes correctly, mostly by + simplifying the machinery. + + * bytecode/ArrayProfile.cpp: + (JSC::arrayModesToString): + * dfg/DFGAbstractState.cpp: + (JSC::DFG::AbstractState::execute): + * dfg/DFGAbstractValue.h: + (JSC::DFG::AbstractValue::clobberArrayModes): + (AbstractValue): + * dfg/DFGConstantFoldingPhase.cpp: + (JSC::DFG::ConstantFoldingPhase::foldConstants): + +2012-10-25 Filip Pizlo <fpizlo@apple.com> + + REGRESSION (r131793-r131826): Crash going to wikifonia.org + https://bugs.webkit.org/show_bug.cgi?id=100281 + + Reviewed by Oliver Hunt. + + Restore something that got lost in the resolve refactoring: the ability to give up on life if + we see a resolve of 'arguments'. + + * runtime/JSScope.cpp: + (JSC::JSScope::resolveContainingScopeInternal): + +2012-10-25 Dominik Röttsches <dominik.rottsches@intel.com> + + Conditionalize XHR timeout support + https://bugs.webkit.org/show_bug.cgi?id=100356 + + Reviewed by Adam Barth. + + Adding XHR_TIMEOUT feature to conditionalize this on ports without network backend support. + + * Configurations/FeatureDefines.xcconfig: + +2012-10-25 Michael Saboff <msaboff@apple.com> + + REGRESSION (r131836): failures in list styles tests on EFL, GTK + https://bugs.webkit.org/show_bug.cgi?id=99824 + + Reviewed by Oliver Hunt. + + Saved start of string since it is modified by call convertUTF8ToUTF16(). + + * API/JSStringRef.cpp: + (JSStringCreateWithUTF8CString): + +2012-10-24 Filip Pizlo <fpizlo@apple.com> + + DFG NewArrayBuffer node should keep its data in a structure on the side to free up one of the opInfos + https://bugs.webkit.org/show_bug.cgi?id=100328 + + Reviewed by Oliver Hunt. + + * dfg/DFGByteCodeParser.cpp: + (JSC::DFG::ByteCodeParser::parseBlock): + * dfg/DFGGraph.h: + (Graph): + * dfg/DFGNode.h: + (NewArrayBufferData): + (DFG): + (JSC::DFG::Node::newArrayBufferData): + (Node): + (JSC::DFG::Node::startConstant): + (JSC::DFG::Node::numConstants): + +2012-10-25 Mark Lam <mark.lam@apple.com> + + Update the C++ llint to work with the latest op_resolve... changes. + https://bugs.webkit.org/show_bug.cgi?id=100345. + + Reviewed by Oliver Hunt. + + * llint/LowLevelInterpreter.cpp: + (JSC::CLoop::execute): + - emit opcode name as label when not using COMPUTED_GOTOs. The new op_resolve + opcodes have jumps to these labels. + - declare all opcode labels as UNUSED_LABEL()s to keep the compiler happy + for opcodes that are not referenced by anyone. + * offlineasm/asm.rb: + - strip llint_ prefix from opcode names used as labels. + +2012-10-24 Yuqiang Xian <yuqiang.xian@intel.com> + + Refactor LLInt64 to distinguish the pointer operations from the 64-bit integer operations + https://bugs.webkit.org/show_bug.cgi?id=100321 + + Reviewed by Filip Pizlo. + + We have refactored the MacroAssembler and JIT compilers to distinguish + the pointer operations from the 64-bit integer operations (see bug #99154). + Now we want to do the similar work for LLInt, and the goal is same as + the one mentioned in 99154. + + This is the first part of the modification: in the offline assembler, + adding the support of the "<foo>q" instructions which will be used for + 64-bit integer operations. + + * llint/LowLevelInterpreter.cpp: + (JSC::CLoop::execute): + * offlineasm/cloop.rb: + * offlineasm/instructions.rb: + * offlineasm/x86.rb: + +2012-10-24 Filip Pizlo <fpizlo@apple.com> + + DFG compileBlahBlahByVal methods for Contiguous and ArrayStorage have only one caller and should be removed + https://bugs.webkit.org/show_bug.cgi?id=100311 + + Reviewed by Mark Hahnenberg. + + Just trying to simplify things before I make them more complicated again. + + * dfg/DFGSpeculativeJIT.h: + (SpeculativeJIT): + (JSC::DFG::SpeculativeJIT::temporaryRegisterForPutByVal): + * dfg/DFGSpeculativeJIT32_64.cpp: + (DFG): + (JSC::DFG::SpeculativeJIT::compile): + * dfg/DFGSpeculativeJIT64.cpp: + (DFG): + (JSC::DFG::SpeculativeJIT::compile): + +2012-10-23 Andreas Kling <kling@webkit.org> + + CodeBlock: Give m_putToBaseOperations an inline capacity. + <http://webkit.org/b/100190> + <rdar://problem/12562466> + + Reviewed by Oliver Hunt. + + Since the CodeBlock constructor always inserts a single PutToBaseOperation, but there's no + guarantee that more will follow, give the m_putToBaseOperations vector an inline capacity of 1. + There are 4009 of these Vectors on Membuster3, and only 126 of them have more than a single entry. + + This change yields a 1.90MB reduction in memory usage. + + * bytecode/CodeBlock.h: + (CodeBlock): + +2012-10-23 Christophe Dumez <christophe.dumez@intel.com> + + Regression(r132143): Assertion hit in JSC::Interpreter::StackPolicy::StackPolicy(JSC::Interpreter&, const WTF::StackBounds&) + https://bugs.webkit.org/show_bug.cgi?id=100109 + + Reviewed by Oliver Hunt. + + Fix possible integer overflow in StackPolicy constructor by + using size_t type instead of int for stack sizes. The value + returned by StackBounds::size() is of type size_t but was + assigned to an int, which may overflow. + + * interpreter/Interpreter.cpp: + (JSC): + (JSC::Interpreter::StackPolicy::StackPolicy): + +2012-10-23 Carlos Garcia Campos <cgarcia@igalia.com> + + Unreviewed. Fix make distcheck. + + * GNUmakefile.list.am: Add missing header file. + +2012-10-23 Mark Lam <mark.lam@apple.com> + + Make topCallFrame reliable. + https://bugs.webkit.org/show_bug.cgi?id=98928. + + Reviewed by Geoffrey Garen. + + - VM entry points and the GC now uses topCallFrame. + - The callerFrame value in CallFrames are now always the previous + frame on the stack, except for the first frame which has a + callerFrame of 0 (not counting the HostCallFrameFlag). + Hence, we can now traverse every frame on the stack all the way + back to the first frame. + - GlobalExec's will no longer be used as the callerFrame values in + call frames. + - Added fences and traps for debugging the JSStack in debug builds. + + * bytecode/SamplingTool.h: + (SamplingTool): + (JSC::SamplingTool::CallRecord::CallRecord): + * dfg/DFGOperations.cpp: + - Fixed 2 DFG helper functions to flush topCallFrame as expected. + * dfg/DFGSpeculativeJIT.h: + (JSC::DFG::SpeculativeJIT::prepareForExternalCall): + * interpreter/CallFrame.h: + (JSC::ExecState::callerFrameNoFlags): + (ExecState): + (JSC::ExecState::argIndexForRegister): + (JSC::ExecState::getArgumentUnsafe): + * interpreter/CallFrameClosure.h: + (CallFrameClosure): + * interpreter/Interpreter.cpp: + (JSC): + (JSC::eval): + (JSC::Interpreter::Interpreter): + (JSC::Interpreter::throwException): + (JSC::Interpreter::execute): + (JSC::Interpreter::executeCall): + (JSC::Interpreter::executeConstruct): + (JSC::Interpreter::prepareForRepeatCall): + (JSC::Interpreter::endRepeatCall): + * interpreter/Interpreter.h: + (JSC): + (Interpreter): + * interpreter/JSStack.cpp: + (JSC::JSStack::JSStack): + (JSC::JSStack::gatherConservativeRoots): + (JSC::JSStack::disableErrorStackReserve): + * interpreter/JSStack.h: + (JSC): + (JSStack): + (JSC::JSStack::installFence): + (JSC::JSStack::validateFence): + (JSC::JSStack::installTrapsAfterFrame): + * interpreter/JSStackInlines.h: Added. + (JSC): + (JSC::JSStack::getTopOfFrame): + (JSC::JSStack::getTopOfStack): + (JSC::JSStack::getStartOfFrame): + (JSC::JSStack::pushFrame): + (JSC::JSStack::popFrame): + (JSC::JSStack::generateFenceValue): + (JSC::JSStack::installFence): + (JSC::JSStack::validateFence): + (JSC::JSStack::installTrapsAfterFrame): + * jit/JITStubs.cpp: + (JSC::jitCompileFor): + (JSC::lazyLinkFor): + - Set frame->codeBlock to 0 for both the above because they are called + with partially intitialized frames (cb uninitialized), but may + trigger a GC. + (JSC::DEFINE_STUB_FUNCTION): + * runtime/JSGlobalData.cpp: + (JSC::JSGlobalData::JSGlobalData): + +2012-10-22 Filip Pizlo <fpizlo@apple.com> + + DFG::Array::Undecided should be called DFG::Array::SelectUsingPredictions + https://bugs.webkit.org/show_bug.cgi?id=100052 + + Reviewed by Oliver Hunt. + + No functional change, just renaming. It's a clearer name that more accurately + reflects the meaning, and it eliminates the namespace confusion that will happen + with the Undecided indexing type in https://bugs.webkit.org/show_bug.cgi?id=98606 + + * 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): + * dfg/DFGFixupPhase.cpp: + (JSC::DFG::FixupPhase::fixupNode): + (JSC::DFG::FixupPhase::blessArrayOperation): + * dfg/DFGSpeculativeJIT.cpp: + (JSC::DFG::SpeculativeJIT::arrayify): + * dfg/DFGSpeculativeJIT32_64.cpp: + (JSC::DFG::SpeculativeJIT::compile): + * dfg/DFGSpeculativeJIT64.cpp: + (JSC::DFG::SpeculativeJIT::compile): + +2012-10-22 Mark Lam <mark.lam@apple.com> + + Change stack recursion checks to be based on stack availability. + https://bugs.webkit.org/show_bug.cgi?id=99872. + + Reviewed by Filip Pizlo and Geoffrey Garen. + + - Remove m_reentryDepth, ThreadStackType which are now obsolete. + - Replaced the reentryDepth checks with a StackBounds check. + - Added the Interpreter::StackPolicy class to compute a reasonable + stack capacity requirement given the native stack that the + interpreter is executing on at that time. + - Reserved an amount of JSStack space for the use of error handling + and enable its use (using Interpreter::ErrorHandlingMode) when + we're about to throw or report an exception. + - Interpreter::StackPolicy also allows more native stack space + to be used when in ErrorHandlingMode. This is needed in the case + of native stack overflows. + - Fixed the parser so that it throws a StackOverflowError instead of + a SyntaxError when it encounters a stack overflow. + + * API/JSContextRef.cpp: + (JSContextGroupCreate): + (JSGlobalContextCreateInGroup): + * JavaScriptCore.order: + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.def: + * interpreter/Interpreter.cpp: + (JSC::Interpreter::ErrorHandlingMode::ErrorHandlingMode): + (JSC): + (JSC::Interpreter::ErrorHandlingMode::~ErrorHandlingMode): + (JSC::Interpreter::StackPolicy::StackPolicy): + (JSC::Interpreter::Interpreter): + (JSC::Interpreter::execute): + (JSC::Interpreter::executeCall): + (JSC::Interpreter::executeConstruct): + (JSC::Interpreter::prepareForRepeatCall): + * interpreter/Interpreter.h: + (JSC): + (Interpreter): + (ErrorHandlingMode): + (StackPolicy): + (JSC::Interpreter::StackPolicy::requiredCapacity): + * interpreter/JSStack.cpp: + (JSC): + (JSC::JSStack::JSStack): + (JSC::JSStack::growSlowCase): + (JSC::JSStack::enableErrorStackReserve): + (JSC::JSStack::disableErrorStackReserve): + * interpreter/JSStack.h: + (JSStack): + (JSC::JSStack::reservationEnd): + (JSC): + * jsc.cpp: + (jscmain): + * parser/Parser.cpp: + (JSC::::Parser): + * parser/Parser.h: + (Parser): + (JSC::::parse): + * runtime/ExceptionHelpers.cpp: + (JSC::throwStackOverflowError): + * runtime/JSGlobalData.cpp: + (JSC::JSGlobalData::JSGlobalData): + (JSC::JSGlobalData::createContextGroup): + (JSC::JSGlobalData::create): + (JSC::JSGlobalData::createLeaked): + (JSC::JSGlobalData::sharedInstance): + * runtime/JSGlobalData.h: + (JSC): + (JSGlobalData): + * runtime/StringRecursionChecker.h: + (JSC::StringRecursionChecker::performCheck): + * testRegExp.cpp: + (realMain): + +2012-10-20 Martin Robinson <mrobinson@igalia.com> + + Fix 'make dist' for the GTK+ port + + * GNUmakefile.list.am: Add missing files to the source list. + +2012-10-21 Raphael Kubo da Costa <raphael.kubo.da.costa@intel.com> + + [CMake][JSC] Depend on risc.rb to decide when to run the LLInt scripts. + https://bugs.webkit.org/show_bug.cgi?id=99917 + + Reviewed by Geoffrey Garen. + + Depend on the newly-added risc.rb to make sure we always run the + LLInt scripts when one of them changes. + + * CMakeLists.txt: + +2012-10-20 Filip Pizlo <fpizlo@apple.com> + + LLInt backends of non-ARM RISC platforms should be able to share code with the existing ARMv7 backend + https://bugs.webkit.org/show_bug.cgi?id=99745 + + Reviewed by Geoffrey Garen. + + This moves all of the things in armv7.rb that I thought are generally useful out + into risc.rb. It also separates some phases (branch ops is separated into one + phase that does sensible things, and another that does things that are painfully + ARM-specific), and removes ARM assumptions from others by using a callback to + drive exactly what lowering must happen. The goal here is to minimize the future + maintenance burden of LLInt by ensuring that the various platforms share as much + lowering code as possible. + + * offlineasm/armv7.rb: + * offlineasm/risc.rb: Added. + +2012-10-19 Filip Pizlo <fpizlo@apple.com> + + DFG should have some facility for recognizing redundant CheckArrays and Arrayifies + https://bugs.webkit.org/show_bug.cgi?id=99287 + + Reviewed by Mark Hahnenberg. + + Adds reasoning about indexing type sets (i.e. ArrayModes) to AbstractValue, which + then enables us to fold away CheckArray's and Arrayify's that are redundant. + + * bytecode/ArrayProfile.cpp: + (JSC::arrayModesToString): + (JSC): + * bytecode/ArrayProfile.h: + (JSC): + (JSC::mergeArrayModes): + (JSC::arrayModesAlreadyChecked): + * bytecode/StructureSet.h: + (JSC::StructureSet::arrayModesFromStructures): + (StructureSet): + * dfg/DFGAbstractState.cpp: + (JSC::DFG::AbstractState::execute): + * dfg/DFGAbstractValue.h: + (JSC::DFG::AbstractValue::AbstractValue): + (JSC::DFG::AbstractValue::clear): + (JSC::DFG::AbstractValue::isClear): + (JSC::DFG::AbstractValue::makeTop): + (JSC::DFG::AbstractValue::clobberStructures): + (AbstractValue): + (JSC::DFG::AbstractValue::setMostSpecific): + (JSC::DFG::AbstractValue::set): + (JSC::DFG::AbstractValue::operator==): + (JSC::DFG::AbstractValue::merge): + (JSC::DFG::AbstractValue::filter): + (JSC::DFG::AbstractValue::filterArrayModes): + (JSC::DFG::AbstractValue::validate): + (JSC::DFG::AbstractValue::checkConsistency): + (JSC::DFG::AbstractValue::dump): + (JSC::DFG::AbstractValue::clobberArrayModes): + (JSC::DFG::AbstractValue::clobberArrayModesSlow): + (JSC::DFG::AbstractValue::setFuturePossibleStructure): + (JSC::DFG::AbstractValue::filterFuturePossibleStructure): + * dfg/DFGArrayMode.cpp: + (JSC::DFG::modeAlreadyChecked): + * dfg/DFGArrayMode.h: + (JSC::DFG::arrayModesFor): + (DFG): + * dfg/DFGConstantFoldingPhase.cpp: + (JSC::DFG::ConstantFoldingPhase::foldConstants): + * dfg/DFGSpeculativeJIT.cpp: + (JSC::DFG::SpeculativeJIT::arrayify): + +2012-10-19 Filip Pizlo <fpizlo@apple.com> + + Baseline JIT should not inline array allocations, to make them easier to instrument + https://bugs.webkit.org/show_bug.cgi?id=99905 + + Reviewed by Mark Hahnenberg. + + This will make it easier to instrument array allocations for the purposes of profiling. + It also allows us to kill off a bunch of code. And, this doesn't appear to hurt + performance at all. That's expected because these days any hot allocation will end up + in the DFG JIT, which does inline these allocations. + + * jit/JIT.cpp: + (JSC::JIT::privateCompileSlowCases): + * jit/JIT.h: + (JIT): + * jit/JITInlineMethods.h: + (JSC): + * jit/JITOpcodes.cpp: + (JSC::JIT::emit_op_new_array): + +2012-10-19 Oliver Hunt <oliver@apple.com> + + Fix some of the regression cause by the non-local variable reworking + https://bugs.webkit.org/show_bug.cgi?id=99896 + + Reviewed by Filip Pizlo. + + The non0local variable reworking led to some of the optimisations performed by + the bytecode generator being dropped. This in turn put more pressure on the DFG + optimisations. This exposed a short coming in our double speculation propogation. + Now we try to distinguish between places where we should SpecDoubleReal vs generic + SpecDouble. + + * dfg/DFGPredictionPropagationPhase.cpp: + (PredictionPropagationPhase): + (JSC::DFG::PredictionPropagationPhase::speculatedDoubleTypeForPrediction): + (JSC::DFG::PredictionPropagationPhase::speculatedDoubleTypeForPredictions): + (JSC::DFG::PredictionPropagationPhase::propagate): + +2012-10-19 Michael Saboff <msaboff@apple.com> + + Lexer should create 8 bit Identifiers for RegularExpressions and ASCII identifiers + https://bugs.webkit.org/show_bug.cgi?id=99855 + + Reviewed by Filip Pizlo. + + Added makeIdentifier helpers that will always make an 8 bit Identifier or make an + Identifier that is the same size as the template parameter. Used the first in the fast + path when looking for a JS identifier and the second when scanning regular expressions. + + * parser/Lexer.cpp: + (JSC::::scanRegExp): + * parser/Lexer.h: + (Lexer): + (JSC::::makeIdentifierSameType): + (JSC::::makeLCharIdentifier): + (JSC::::lexExpectIdentifier): + +2012-10-19 Mark Lam <mark.lam@apple.com> + + Added WTF::StackStats mechanism. + https://bugs.webkit.org/show_bug.cgi?id=99805. + + Reviewed by Geoffrey Garen. + + Added StackStats checkpoints and probes. + + * bytecompiler/BytecodeGenerator.h: + (JSC::BytecodeGenerator::emitNode): + (JSC::BytecodeGenerator::emitNodeInConditionContext): + * heap/SlotVisitor.cpp: + (JSC::SlotVisitor::append): + (JSC::visitChildren): + (JSC::SlotVisitor::donateKnownParallel): + (JSC::SlotVisitor::drain): + (JSC::SlotVisitor::drainFromShared): + (JSC::SlotVisitor::mergeOpaqueRoots): + (JSC::SlotVisitor::internalAppend): + (JSC::SlotVisitor::harvestWeakReferences): + (JSC::SlotVisitor::finalizeUnconditionalFinalizers): + * interpreter/Interpreter.cpp: + (JSC::Interpreter::execute): + (JSC::Interpreter::executeCall): + (JSC::Interpreter::executeConstruct): + (JSC::Interpreter::prepareForRepeatCall): + * parser/Parser.h: + (JSC::Parser::canRecurse): + * runtime/StringRecursionChecker.h: + (StringRecursionChecker): + +2012-10-19 Oliver Hunt <oliver@apple.com> + + REGRESSION(r131822): It made 500+ tests crash on 32 bit platforms + https://bugs.webkit.org/show_bug.cgi?id=99814 + + Reviewed by Filip Pizlo. + + Call the correct macro in 32bit. + + * llint/LowLevelInterpreter.asm: + +2012-10-19 Dongwoo Joshua Im <dw.im@samsung.com> + + Rename ENABLE_CSS3_TEXT_DECORATION to ENABLE_CSS3_TEXT + https://bugs.webkit.org/show_bug.cgi?id=99804 + + Reviewed by Julien Chaffraix. + + CSS3 text related properties will be implemented under this flag, + including text decoration, text-align-last, and text-justify. + + * Configurations/FeatureDefines.xcconfig: + +2012-10-18 Anders Carlsson <andersca@apple.com> + + Clean up RegExpKey + https://bugs.webkit.org/show_bug.cgi?id=99798 + + Reviewed by Darin Adler. + + RegExpHash doesn't need to be a class template specialization when the class template is specialized + for JSC::RegExpKey only. Make it a nested class of RegExp instead. Also, make operator== a friend function + so Hash::equal can see it. + + * runtime/RegExpKey.h: + (JSC::RegExpKey::RegExpKey): + (JSC::RegExpKey::operator==): + (RegExpKey): + (JSC::RegExpKey::Hash::hash): + (JSC::RegExpKey::Hash::equal): + (Hash): + +2012-10-19 Mark Lam <mark.lam@apple.com> + + Bot greening: Follow up to r131877 to fix the Windows build. + https://bugs.webkit.org/show_bug.cgi?id=99739. + + Not reviewed. + + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.def: + +2012-10-19 Mark Lam <mark.lam@apple.com> + + Bot greening: Attempt to fix broken Window build after r131836. + https://bugs.webkit.org/show_bug.cgi?id=99739. + + Not reviewed. + + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.def: + +2012-10-19 Yuqiang Xian <yuqiang.xian@intel.com> + + Unreviewed fix after r131868. + + On JSVALUE64 platforms, JSValue constants can be Imm64 instead of ImmPtr for JIT compilers. + + * dfg/DFGOSRExitCompiler64.cpp: + (JSC::DFG::OSRExitCompiler::compileExit): + +2012-10-18 Filip Pizlo <fpizlo@apple.com> + + Baseline array profiling should be less accurate, and DFG OSR exit should update array profiles on CheckArray and CheckStructure failure + https://bugs.webkit.org/show_bug.cgi?id=99261 + + Reviewed by Oliver Hunt. + + This makes array profiling stochastic, like value profiling. The point is to avoid + noticing one-off indexing types that we'll never see again, but instead to: + + Notice the big ones: We want the DFG to compile based on the things that happen with + high probability. So, this change makes array profiling do like value profiling and + only notice a random subsampling of indexing types that flowed through an array + access. Prior to this patch array profiles noticed all indexing types and weighted + them identically. + + Bias the recent: Often an array access will see awkward indexing types during the + first handful of executions because of artifacts of program startup. So, we want to + bias towards the indexing types that we saw most recently. With this change, array + profiling does like value profiling and usually tells use a random sampling that + is biased to what happened recently. + + Have a backup plan: The above two things don't work by themselves because our + randomness is not that random (nor do we care enough to make it more random), and + because some procedures will have a <1/10 probability event that we must handle + without bailing because it dominates a hot loop. So, like value profiling, this + patch makes array profiling use OSR exits to tell us why we are bailing out, so + that we don't make the same mistake again in the future. + + This change also makes the way that the 32-bit OSR exit compiler snatches scratch + registers more uniform. We don't need a scratch buffer when we can push and pop. + + * bytecode/DFGExitProfile.h: + * dfg/DFGOSRExitCompiler32_64.cpp: + (JSC::DFG::OSRExitCompiler::compileExit): + * dfg/DFGOSRExitCompiler64.cpp: + (JSC::DFG::OSRExitCompiler::compileExit): + * dfg/DFGSpeculativeJIT.cpp: + (JSC::DFG::SpeculativeJIT::checkArray): + (JSC::DFG::SpeculativeJIT::arrayify): + * dfg/DFGSpeculativeJIT32_64.cpp: + (JSC::DFG::SpeculativeJIT::compile): + * dfg/DFGSpeculativeJIT64.cpp: + (JSC::DFG::SpeculativeJIT::compile): + * jit/JITInlineMethods.h: + (JSC::JIT::emitArrayProfilingSite): + * llint/LowLevelInterpreter.asm: + +2012-10-18 Yuqiang Xian <yuqiang.xian@intel.com> + + [Qt] REGRESSION(r131858): It broke the ARM build + https://bugs.webkit.org/show_bug.cgi?id=99809 + + Reviewed by Csaba Osztrogonác. + + * dfg/DFGCCallHelpers.h: + (CCallHelpers): + (JSC::DFG::CCallHelpers::setupArgumentsWithExecState): + +2012-10-18 Yuqiang Xian <yuqiang.xian@intel.com> + + Refactor MacroAssembler interfaces to differentiate the pointer operands from the 64-bit integer operands + https://bugs.webkit.org/show_bug.cgi?id=99154 + + Reviewed by Gavin Barraclough. + + In current JavaScriptCore implementation for JSVALUE64 platform (i.e., + the X64 platform), we assume that the JSValue size is same to the + pointer size, and thus EncodedJSValue is simply type defined as a + "void*". In the JIT compiler, we also take this assumption and invoke + the same macro assembler interfaces for both JSValue and pointer + operands. We need to differentiate the operations on pointers from the + operations on JSValues, and let them invoking different macro + assembler interfaces. For example, we now use the interface of + "loadPtr" to load either a pointer or a JSValue, and we need to switch + to using "loadPtr" to load a pointer and some new "load64" interface + to load a JSValue. This would help us supporting other JSVALUE64 + platforms where pointer size is not necessarily 64-bits, for example + x32 (bug #99153). + + The major modification I made is to introduce the "*64" interfaces in + the MacroAssembler for those operations on JSValues, keep the "*Ptr" + interfaces for those operations on real pointers, and go through all + the JIT compiler code to correct the usage. + + This is the second part of the work, i.e, to correct the usage of the + new MacroAssembler interfaces in the JIT compilers, which also means + that now EncodedJSValue is defined as a 64-bit integer, and the "*64" + interfaces are used for it. + + * assembler/MacroAssembler.h: JSValue immediates should be in Imm64 instead of ImmPtr. + (MacroAssembler): + (JSC::MacroAssembler::shouldBlind): + * dfg/DFGAssemblyHelpers.cpp: Correct the JIT compilers usage of the new interfaces. + (JSC::DFG::AssemblyHelpers::jitAssertIsInt32): + (JSC::DFG::AssemblyHelpers::jitAssertIsJSInt32): + (JSC::DFG::AssemblyHelpers::jitAssertIsJSNumber): + (JSC::DFG::AssemblyHelpers::jitAssertIsJSDouble): + (JSC::DFG::AssemblyHelpers::jitAssertIsCell): + * dfg/DFGAssemblyHelpers.h: + (JSC::DFG::AssemblyHelpers::emitPutToCallFrameHeader): + (JSC::DFG::AssemblyHelpers::branchIfNotCell): + (JSC::DFG::AssemblyHelpers::debugCall): + (JSC::DFG::AssemblyHelpers::boxDouble): + (JSC::DFG::AssemblyHelpers::unboxDouble): + (JSC::DFG::AssemblyHelpers::emitExceptionCheck): + * dfg/DFGCCallHelpers.h: + (JSC::DFG::CCallHelpers::setupArgumentsWithExecState): + (CCallHelpers): + * dfg/DFGOSRExitCompiler64.cpp: + (JSC::DFG::OSRExitCompiler::compileExit): + * dfg/DFGRepatch.cpp: + (JSC::DFG::generateProtoChainAccessStub): + (JSC::DFG::tryCacheGetByID): + (JSC::DFG::tryBuildGetByIDList): + (JSC::DFG::emitPutReplaceStub): + (JSC::DFG::emitPutTransitionStub): + * dfg/DFGScratchRegisterAllocator.h: + (JSC::DFG::ScratchRegisterAllocator::preserveUsedRegistersToScratchBuffer): + (JSC::DFG::ScratchRegisterAllocator::restoreUsedRegistersFromScratchBuffer): + * dfg/DFGSilentRegisterSavePlan.h: + * dfg/DFGSpeculativeJIT.cpp: + (JSC::DFG::SpeculativeJIT::checkArgumentTypes): + (JSC::DFG::SpeculativeJIT::compileValueToInt32): + (JSC::DFG::SpeculativeJIT::compileInt32ToDouble): + (JSC::DFG::SpeculativeJIT::compileInstanceOfForObject): + (JSC::DFG::SpeculativeJIT::compileInstanceOf): + (JSC::DFG::SpeculativeJIT::compileStrictEqForConstant): + (JSC::DFG::SpeculativeJIT::compileGetByValOnArguments): + * dfg/DFGSpeculativeJIT.h: + (SpeculativeJIT): + (JSC::DFG::SpeculativeJIT::silentSavePlanForGPR): + (JSC::DFG::SpeculativeJIT::silentSpill): + (JSC::DFG::SpeculativeJIT::silentFill): + (JSC::DFG::SpeculativeJIT::spill): + (JSC::DFG::SpeculativeJIT::valueOfJSConstantAsImm64): + (JSC::DFG::SpeculativeJIT::callOperation): + (JSC::DFG::SpeculativeJIT::branch64): + * dfg/DFGSpeculativeJIT64.cpp: + (JSC::DFG::SpeculativeJIT::fillInteger): + (JSC::DFG::SpeculativeJIT::fillDouble): + (JSC::DFG::SpeculativeJIT::fillJSValue): + (JSC::DFG::SpeculativeJIT::nonSpeculativeValueToNumber): + (JSC::DFG::SpeculativeJIT::nonSpeculativeValueToInt32): + (JSC::DFG::SpeculativeJIT::nonSpeculativeUInt32ToNumber): + (JSC::DFG::SpeculativeJIT::cachedGetById): + (JSC::DFG::SpeculativeJIT::cachedPutById): + (JSC::DFG::SpeculativeJIT::nonSpeculativeNonPeepholeCompareNull): + (JSC::DFG::SpeculativeJIT::nonSpeculativePeepholeBranchNull): + (JSC::DFG::SpeculativeJIT::nonSpeculativePeepholeBranch): + (JSC::DFG::SpeculativeJIT::nonSpeculativeNonPeepholeCompare): + (JSC::DFG::SpeculativeJIT::nonSpeculativePeepholeStrictEq): + (JSC::DFG::SpeculativeJIT::nonSpeculativeNonPeepholeStrictEq): + (JSC::DFG::SpeculativeJIT::emitCall): + (JSC::DFG::SpeculativeJIT::fillSpeculateIntInternal): + (JSC::DFG::SpeculativeJIT::fillSpeculateDouble): + (JSC::DFG::SpeculativeJIT::fillSpeculateCell): + (JSC::DFG::SpeculativeJIT::fillSpeculateBoolean): + (JSC::DFG::SpeculativeJIT::convertToDouble): + (JSC::DFG::SpeculativeJIT::compileObjectEquality): + (JSC::DFG::SpeculativeJIT::compileObjectToObjectOrOtherEquality): + (JSC::DFG::SpeculativeJIT::compilePeepHoleObjectToObjectOrOtherEquality): + (JSC::DFG::SpeculativeJIT::compileDoubleCompare): + (JSC::DFG::SpeculativeJIT::compileNonStringCellOrOtherLogicalNot): + (JSC::DFG::SpeculativeJIT::compileLogicalNot): + (JSC::DFG::SpeculativeJIT::emitNonStringCellOrOtherBranch): + (JSC::DFG::SpeculativeJIT::emitBranch): + (JSC::DFG::SpeculativeJIT::compileContiguousGetByVal): + (JSC::DFG::SpeculativeJIT::compileArrayStorageGetByVal): + (JSC::DFG::SpeculativeJIT::compileContiguousPutByVal): + (JSC::DFG::SpeculativeJIT::compileArrayStoragePutByVal): + (JSC::DFG::SpeculativeJIT::compile): + * dfg/DFGThunks.cpp: + (JSC::DFG::osrExitGenerationThunkGenerator): + (JSC::DFG::throwExceptionFromCallSlowPathGenerator): + (JSC::DFG::slowPathFor): + (JSC::DFG::virtualForThunkGenerator): + * interpreter/Interpreter.cpp: + (JSC::Interpreter::dumpRegisters): + * jit/JIT.cpp: + (JSC::JIT::privateCompile): + * jit/JIT.h: + (JIT): + * jit/JITArithmetic.cpp: + (JSC::JIT::emit_op_negate): + (JSC::JIT::emitSlow_op_negate): + (JSC::JIT::emit_op_rshift): + (JSC::JIT::emitSlow_op_urshift): + (JSC::JIT::emit_compareAndJumpSlow): + (JSC::JIT::emit_op_bitand): + (JSC::JIT::compileBinaryArithOpSlowCase): + (JSC::JIT::emit_op_div): + * jit/JITCall.cpp: + (JSC::JIT::compileLoadVarargs): + (JSC::JIT::compileCallEval): + (JSC::JIT::compileCallEvalSlowCase): + (JSC::JIT::compileOpCall): + * jit/JITInlineMethods.h: Have some clean-up work as well. + (JSC): + (JSC::JIT::emitPutCellToCallFrameHeader): + (JSC::JIT::emitPutIntToCallFrameHeader): + (JSC::JIT::emitPutToCallFrameHeader): + (JSC::JIT::emitGetFromCallFrameHeader32): + (JSC::JIT::emitGetFromCallFrameHeader64): + (JSC::JIT::emitAllocateJSArray): + (JSC::JIT::emitValueProfilingSite): + (JSC::JIT::emitGetJITStubArg): + (JSC::JIT::emitGetVirtualRegister): + (JSC::JIT::emitPutVirtualRegister): + (JSC::JIT::emitInitRegister): + (JSC::JIT::emitJumpIfJSCell): + (JSC::JIT::emitJumpIfBothJSCells): + (JSC::JIT::emitJumpIfNotJSCell): + (JSC::JIT::emitLoadInt32ToDouble): + (JSC::JIT::emitJumpIfImmediateInteger): + (JSC::JIT::emitJumpIfNotImmediateInteger): + (JSC::JIT::emitJumpIfNotImmediateIntegers): + (JSC::JIT::emitFastArithReTagImmediate): + (JSC::JIT::emitFastArithIntToImmNoCheck): + * jit/JITOpcodes.cpp: + (JSC::JIT::privateCompileCTINativeCall): + (JSC::JIT::emit_op_mov): + (JSC::JIT::emit_op_instanceof): + (JSC::JIT::emit_op_is_undefined): + (JSC::JIT::emit_op_is_boolean): + (JSC::JIT::emit_op_is_number): + (JSC::JIT::emit_op_tear_off_activation): + (JSC::JIT::emit_op_not): + (JSC::JIT::emit_op_jfalse): + (JSC::JIT::emit_op_jeq_null): + (JSC::JIT::emit_op_jneq_null): + (JSC::JIT::emit_op_jtrue): + (JSC::JIT::emit_op_bitxor): + (JSC::JIT::emit_op_bitor): + (JSC::JIT::emit_op_get_pnames): + (JSC::JIT::emit_op_next_pname): + (JSC::JIT::compileOpStrictEq): + (JSC::JIT::emit_op_catch): + (JSC::JIT::emit_op_throw_static_error): + (JSC::JIT::emit_op_eq_null): + (JSC::JIT::emit_op_neq_null): + (JSC::JIT::emit_op_create_activation): + (JSC::JIT::emit_op_create_arguments): + (JSC::JIT::emit_op_init_lazy_reg): + (JSC::JIT::emitSlow_op_convert_this): + (JSC::JIT::emitSlow_op_not): + (JSC::JIT::emit_op_get_argument_by_val): + (JSC::JIT::emit_op_put_to_base): + (JSC::JIT::emit_resolve_operations): + * jit/JITPropertyAccess.cpp: + (JSC::JIT::emit_op_get_by_val): + (JSC::JIT::emitContiguousGetByVal): + (JSC::JIT::emitArrayStorageGetByVal): + (JSC::JIT::emitSlow_op_get_by_val): + (JSC::JIT::compileGetDirectOffset): + (JSC::JIT::emit_op_get_by_pname): + (JSC::JIT::emitContiguousPutByVal): + (JSC::JIT::emitArrayStoragePutByVal): + (JSC::JIT::compileGetByIdHotPath): + (JSC::JIT::emit_op_put_by_id): + (JSC::JIT::compilePutDirectOffset): + (JSC::JIT::emit_op_init_global_const): + (JSC::JIT::emit_op_init_global_const_check): + (JSC::JIT::emitIntTypedArrayGetByVal): + (JSC::JIT::emitFloatTypedArrayGetByVal): + (JSC::JIT::emitFloatTypedArrayPutByVal): + * jit/JITStubCall.h: + (JITStubCall): + (JSC::JITStubCall::JITStubCall): + (JSC::JITStubCall::addArgument): + (JSC::JITStubCall::call): + (JSC::JITStubCall::callWithValueProfiling): + * jit/JSInterfaceJIT.h: + (JSC::JSInterfaceJIT::emitJumpIfImmediateNumber): + (JSC::JSInterfaceJIT::emitJumpIfNotImmediateNumber): + (JSC::JSInterfaceJIT::emitLoadJSCell): + (JSC::JSInterfaceJIT::emitLoadInt32): + (JSC::JSInterfaceJIT::emitLoadDouble): + * jit/SpecializedThunkJIT.h: + (JSC::SpecializedThunkJIT::returnDouble): + (JSC::SpecializedThunkJIT::tagReturnAsInt32): + * runtime/JSValue.cpp: + (JSC::JSValue::description): + * runtime/JSValue.h: Define JSVALUE64 EncodedJSValue as int64_t, which is also unified with JSVALUE32_64. + (JSC): + * runtime/JSValueInlineMethods.h: New implementation of some JSValue methods to make them more conformant + with the new rule that "JSValue is a 64-bit integer rather than a pointer" for JSVALUE64 platforms. + (JSC): + (JSC::JSValue::JSValue): + (JSC::JSValue::operator bool): + (JSC::JSValue::operator==): + (JSC::JSValue::operator!=): + (JSC::reinterpretDoubleToInt64): + (JSC::reinterpretInt64ToDouble): + (JSC::JSValue::asDouble): + +2012-10-18 Michael Saboff <msaboff@apple.com> + + convertUTF8ToUTF16() Should Check for ASCII Input + ihttps://bugs.webkit.org/show_bug.cgi?id=99739 + + Reviewed by Geoffrey Garen. + + Using the updated convertUTF8ToUTF16() , we can determine if is makes more sense to + create a string using the 8 bit source. Added a new OpaqueJSString::create(LChar*, unsigned). + Had to add a cast n JSStringCreateWithCFString to differentiate which create() to call. + + * API/JSStringRef.cpp: + (JSStringCreateWithUTF8CString): + * API/JSStringRefCF.cpp: + (JSStringCreateWithCFString): + * API/OpaqueJSString.h: + (OpaqueJSString::create): + (OpaqueJSString): + (OpaqueJSString::OpaqueJSString): + +2012-10-18 Oliver Hunt <oliver@apple.com> + + Unbreak jsc tests. Last minute "clever"-ness is clearly just not + a good plan. + + * dfg/DFGByteCodeParser.cpp: + (JSC::DFG::ByteCodeParser::parseBlock): + +2012-10-18 Oliver Hunt <oliver@apple.com> + + Bytecode should not have responsibility for determining how to perform non-local resolves + https://bugs.webkit.org/show_bug.cgi?id=99349 + + Reviewed by Gavin Barraclough. + + This patch removes lexical analysis from the bytecode generation. This allows + us to delay lookup of a non-local variables until the lookup is actually necessary, + and simplifies a lot of the resolve logic in BytecodeGenerator. + + Once a lookup is performed we cache the lookup information in a set of out-of-line + buffers in CodeBlock. This allows subsequent lookups to avoid unnecessary hashing, + etc, and allows the respective JITs to recreated optimal lookup code. + + This is currently still a performance regression in LLInt, but most of the remaining + regression is caused by a lot of indirection that I'll remove in future work, as well + as some work necessary to allow LLInt to perform in line instruction repatching. + We will also want to improve the behaviour of the baseline JIT for some of the lookup + operations, however this patch was getting quite large already so I'm landing it now + that we've reached the bar of "performance-neutral". + + Basic browsing seems to work. + + * GNUmakefile.list.am: + * JavaScriptCore.xcodeproj/project.pbxproj: + * bytecode/CodeBlock.cpp: + (JSC::CodeBlock::printStructures): + (JSC::CodeBlock::dump): + (JSC::CodeBlock::CodeBlock): + (JSC::CodeBlock::visitStructures): + (JSC): + (JSC::CodeBlock::finalizeUnconditionally): + (JSC::CodeBlock::shrinkToFit): + * bytecode/CodeBlock.h: + (JSC::CodeBlock::addResolve): + (JSC::CodeBlock::addPutToBase): + (CodeBlock): + (JSC::CodeBlock::resolveOperations): + (JSC::CodeBlock::putToBaseOperation): + (JSC::CodeBlock::numberOfResolveOperations): + (JSC::CodeBlock::numberOfPutToBaseOperations): + (JSC::CodeBlock::addPropertyAccessInstruction): + (JSC::CodeBlock::globalObjectConstant): + (JSC::CodeBlock::setGlobalObjectConstant): + * bytecode/Opcode.h: + (JSC): + (JSC::padOpcodeName): + * bytecode/ResolveGlobalStatus.cpp: + (JSC::computeForStructure): + (JSC::ResolveGlobalStatus::computeFor): + * bytecode/ResolveGlobalStatus.h: + (JSC): + (ResolveGlobalStatus): + * bytecompiler/BytecodeGenerator.cpp: + (JSC::ResolveResult::checkValidity): + (JSC): + (JSC::BytecodeGenerator::BytecodeGenerator): + (JSC::BytecodeGenerator::resolve): + (JSC::BytecodeGenerator::resolveConstDecl): + (JSC::BytecodeGenerator::shouldAvoidResolveGlobal): + (JSC::BytecodeGenerator::emitResolve): + (JSC::BytecodeGenerator::emitResolveBase): + (JSC::BytecodeGenerator::emitResolveBaseForPut): + (JSC::BytecodeGenerator::emitResolveWithBaseForPut): + (JSC::BytecodeGenerator::emitResolveWithThis): + (JSC::BytecodeGenerator::emitGetLocalVar): + (JSC::BytecodeGenerator::emitInitGlobalConst): + (JSC::BytecodeGenerator::emitPutToBase): + * bytecompiler/BytecodeGenerator.h: + (JSC::ResolveResult::registerResolve): + (JSC::ResolveResult::dynamicResolve): + (ResolveResult): + (JSC::ResolveResult::ResolveResult): + (JSC): + (NonlocalResolveInfo): + (JSC::NonlocalResolveInfo::NonlocalResolveInfo): + (JSC::NonlocalResolveInfo::~NonlocalResolveInfo): + (JSC::NonlocalResolveInfo::resolved): + (JSC::NonlocalResolveInfo::put): + (BytecodeGenerator): + (JSC::BytecodeGenerator::getResolveOperations): + (JSC::BytecodeGenerator::getResolveWithThisOperations): + (JSC::BytecodeGenerator::getResolveBaseOperations): + (JSC::BytecodeGenerator::getResolveBaseForPutOperations): + (JSC::BytecodeGenerator::getResolveWithBaseForPutOperations): + (JSC::BytecodeGenerator::getPutToBaseOperation): + * bytecompiler/NodesCodegen.cpp: + (JSC::ResolveNode::isPure): + (JSC::FunctionCallResolveNode::emitBytecode): + (JSC::PostfixNode::emitResolve): + (JSC::PrefixNode::emitResolve): + (JSC::ReadModifyResolveNode::emitBytecode): + (JSC::AssignResolveNode::emitBytecode): + (JSC::ConstDeclNode::emitCodeSingle): + (JSC::ForInNode::emitBytecode): + * dfg/DFGAbstractState.cpp: + (JSC::DFG::AbstractState::execute): + * dfg/DFGByteCodeParser.cpp: + (ByteCodeParser): + (InlineStackEntry): + (JSC::DFG::ByteCodeParser::handleGetByOffset): + (DFG): + (JSC::DFG::ByteCodeParser::parseResolveOperations): + (JSC::DFG::ByteCodeParser::parseBlock): + (JSC::DFG::ByteCodeParser::InlineStackEntry::InlineStackEntry): + * dfg/DFGCapabilities.h: + (JSC::DFG::canInlineResolveOperations): + (DFG): + (JSC::DFG::canCompileOpcode): + (JSC::DFG::canInlineOpcode): + * dfg/DFGGraph.h: + (ResolveGlobalData): + (ResolveOperationData): + (DFG): + (PutToBaseOperationData): + (Graph): + * dfg/DFGNode.h: + (JSC::DFG::Node::hasIdentifier): + (JSC::DFG::Node::resolveOperationsDataIndex): + (Node): + * dfg/DFGNodeType.h: + (DFG): + * dfg/DFGOSRExit.cpp: + (JSC::DFG::OSRExit::OSRExit): + * dfg/DFGOSRExit.h: + (OSRExit): + * dfg/DFGOSRExitCompiler.cpp: + * dfg/DFGOSRExitCompiler32_64.cpp: + (JSC::DFG::OSRExitCompiler::compileExit): + * dfg/DFGOSRExitCompiler64.cpp: + (JSC::DFG::OSRExitCompiler::compileExit): + * dfg/DFGOperations.cpp: + * dfg/DFGOperations.h: + * dfg/DFGPredictionPropagationPhase.cpp: + (JSC::DFG::PredictionPropagationPhase::propagate): + * dfg/DFGRepatch.cpp: + (JSC::DFG::tryCacheGetByID): + * dfg/DFGSpeculativeJIT.cpp: + (JSC::DFG::SpeculativeJIT::convertLastOSRExitToForward): + * dfg/DFGSpeculativeJIT.h: + (JSC::DFG::SpeculativeJIT::resolveOperations): + (SpeculativeJIT): + (JSC::DFG::SpeculativeJIT::putToBaseOperation): + (JSC::DFG::SpeculativeJIT::callOperation): + * dfg/DFGSpeculativeJIT32_64.cpp: + (JSC::DFG::SpeculativeJIT::compile): + * dfg/DFGSpeculativeJIT64.cpp: + (JSC::DFG::SpeculativeJIT::compile): + * dfg/DFGStructureCheckHoistingPhase.cpp: + (JSC::DFG::StructureCheckHoistingPhase::run): + * jit/JIT.cpp: + (JSC::JIT::privateCompileMainPass): + (JSC::JIT::privateCompileSlowCases): + * jit/JIT.h: + (JIT): + * jit/JITOpcodes.cpp: + (JSC::JIT::emit_op_put_to_base): + (JSC): + (JSC::JIT::emit_resolve_operations): + (JSC::JIT::emitSlow_link_resolve_operations): + (JSC::JIT::emit_op_resolve): + (JSC::JIT::emitSlow_op_resolve): + (JSC::JIT::emit_op_resolve_base): + (JSC::JIT::emitSlow_op_resolve_base): + (JSC::JIT::emit_op_resolve_with_base): + (JSC::JIT::emitSlow_op_resolve_with_base): + (JSC::JIT::emit_op_resolve_with_this): + (JSC::JIT::emitSlow_op_resolve_with_this): + (JSC::JIT::emitSlow_op_put_to_base): + * jit/JITOpcodes32_64.cpp: + (JSC::JIT::emit_op_put_to_base): + (JSC): + * jit/JITPropertyAccess.cpp: + (JSC::JIT::emit_op_init_global_const): + (JSC::JIT::emit_op_init_global_const_check): + (JSC::JIT::emitSlow_op_init_global_const_check): + * jit/JITPropertyAccess32_64.cpp: + (JSC::JIT::emit_op_init_global_const): + (JSC::JIT::emit_op_init_global_const_check): + (JSC::JIT::emitSlow_op_init_global_const_check): + * jit/JITStubs.cpp: + (JSC::DEFINE_STUB_FUNCTION): + (JSC): + * jit/JITStubs.h: + * llint/LLIntSlowPaths.cpp: + (LLInt): + (JSC::LLInt::LLINT_SLOW_PATH_DECL): + * llint/LLIntSlowPaths.h: + (LLInt): + * llint/LowLevelInterpreter.asm: + * llint/LowLevelInterpreter32_64.asm: + * llint/LowLevelInterpreter64.asm: + * runtime/JSScope.cpp: + (JSC::LookupResult::base): + (JSC::LookupResult::value): + (JSC::LookupResult::setBase): + (JSC::LookupResult::setValue): + (LookupResult): + (JSC): + (JSC::setPutPropertyAccessOffset): + (JSC::executeResolveOperations): + (JSC::JSScope::resolveContainingScopeInternal): + (JSC::JSScope::resolveContainingScope): + (JSC::JSScope::resolve): + (JSC::JSScope::resolveBase): + (JSC::JSScope::resolveWithBase): + (JSC::JSScope::resolveWithThis): + (JSC::JSScope::resolvePut): + (JSC::JSScope::resolveGlobal): + * runtime/JSScope.h: + (JSScope): + * runtime/JSVariableObject.cpp: + (JSC): + * runtime/JSVariableObject.h: + (JSVariableObject): + * runtime/Structure.h: + (JSC::Structure::propertyAccessesAreCacheable): + (Structure): + +2012-10-18 Mark Hahnenberg <mhahnenberg@apple.com> + + Live oversize copied blocks should count toward overall heap fragmentation + https://bugs.webkit.org/show_bug.cgi?id=99548 + + Reviewed by Filip Pizlo. + + The CopiedSpace uses overall heap fragmentation to determine whether or not it should do any copying. + Currently it doesn't include live oversize CopiedBlocks in the calculation, but it should. We should + treat them as 100% utilized, since running a copying phase won't be able to free/compact any of their + memory. We can also free any dead oversize CopiedBlocks while we're iterating over them, rather than + iterating over them again at the end of the copying phase. + + * heap/CopiedSpace.cpp: + (JSC::CopiedSpace::doneFillingBlock): + (JSC::CopiedSpace::startedCopying): + (JSC::CopiedSpace::doneCopying): Also removed a branch when iterating over from-space at the end of + copying. Since we eagerly recycle blocks as soon as they're fully evacuated, we should see no + unpinned blocks in from-space at the end of copying. + * heap/CopiedSpaceInlineMethods.h: + (JSC::CopiedSpace::recycleBorrowedBlock): + * heap/CopyVisitorInlineMethods.h: + (JSC::CopyVisitor::checkIfShouldCopy): + +2012-10-18 Roger Fong <roger_fong@apple.com> + + Unreviewed. Build fix after r131701 and r131777. + + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.def: + +2012-10-18 Mark Hahnenberg <mhahnenberg@apple.com> + + Race condition between GCThread and main thread during copying phase + https://bugs.webkit.org/show_bug.cgi?id=99641 + + Reviewed by Filip Pizlo. + + When a GCThread returns from copyFromShared(), it then calls doneCopying(), which returns + its borrowed CopiedBlock to the CopiedSpace. This final block allows the CopiedSpace to + continue and finish the cleanup of the copying phase. However, the GCThread can loop back + around, see that m_currentPhase is still "Copy", and try to go through the copying phase again. + This can cause all sorts of issues. To fix this, we should add a cyclic barrier to GCThread::waitForNextPhase(). + + * heap/GCThread.cpp: + (JSC::GCThread::waitForNextPhase): All GCThreads will wait when they finish one iteration until the main thread + notifies them to move down to the second while loop, where they wait for the next GCPhase to start. They also + decrement the m_numberOfActiveGCThreads counter as they begin to wait for the next phase and increment it as + they enter the next phase. This allows the main thread to wait in endCurrentPhase() until all the threads have + finished the current phase and are waiting on the next phase to begin. Without the counter, there would be + no way to ensure that every thread was available for each GCPhase. + (JSC::GCThread::gcThreadMain): We now use the m_phaseLock to synchronize with the main thread when we're being created. + * heap/GCThreadSharedData.cpp: + (JSC::GCThreadSharedData::GCThreadSharedData): As we create each GCThread, we increment the m_numberOfActiveGCThreads + counter. When we are done creating the threads, we wait until they're all waiting for the next GCPhase. This prevents + us from leaving some GCThreads behind during the first GCPhase, which could hurt us on our very short-running + benchmarks (e.g. SunSpider). + (JSC::GCThreadSharedData::~GCThreadSharedData): + (JSC::GCThreadSharedData::startNextPhase): We atomically swap the two flags, m_gcThreadsShouldWait and m_currentPhase, + so that if the threads finish very quickly, they will wait until the main thread is ready to end the current phase. + (JSC::GCThreadSharedData::endCurrentPhase): Here atomically we swap the two flags again to allow the threads to + advance to waiting on the next GCPhase. We wait until all of the GCThreads have settled into the second wait loop + before allowing the main thread to continue. This prevents us from leaving one of the GCThreads stuck in the first + wait loop if we were to call startNextPhase() before it had time to wake up and move on to the second wait loop. + (JSC): + (JSC::GCThreadSharedData::didStartMarking): We now use startNextPhase() to properly swap the flags. + (JSC::GCThreadSharedData::didFinishMarking): Ditto for endCurrentPhase(). + (JSC::GCThreadSharedData::didStartCopying): Ditto. + (JSC::GCThreadSharedData::didFinishCopying): Ditto. + * heap/GCThreadSharedData.h: + (GCThreadSharedData): + * heap/Heap.cpp: + (JSC::Heap::copyBackingStores): No reason to use the extra reference. + +2012-10-18 Pablo Flouret <pablof@motorola.com> + + Implement css3-conditional's @supports rule + https://bugs.webkit.org/show_bug.cgi?id=86146 + + Reviewed by Antti Koivisto. + + * Configurations/FeatureDefines.xcconfig: + Add an ENABLE_CSS3_CONDITIONAL_RULES flag. + +2012-10-18 Michael Saboff <msaboff@apple.com> + + Make conversion between JSStringRef and WKStringRef work without character size conversions + https://bugs.webkit.org/show_bug.cgi?id=99727 + + Reviewed by Anders Carlsson. + + Export the string() method for use in WebKit. + + * API/OpaqueJSString.h: + (OpaqueJSString::string): + +2012-10-18 Raphael Kubo da Costa <raphael.kubo.da.costa@intel.com> + + [CMake] Avoid unnecessarily running the LLInt generation commands. + https://bugs.webkit.org/show_bug.cgi?id=99708 + + Reviewed by Rob Buis. + + As described in the comments in the change itself, in some cases + the Ruby generation scripts used when LLInt is on would each be + run twice in every build even if nothing had changed. + + Fix that by not setting the OBJECT_DEPENDS property of some source + files to depend on the generated headers; instead, they are now + just part of the final binaries/libraries which use them. + + * CMakeLists.txt: + +2012-10-17 Zoltan Horvath <zoltan@webkit.org> + + Remove the JSHeap memory measurement of the PageLoad performacetests since it creates bogus JSGlobalDatas + https://bugs.webkit.org/show_bug.cgi?id=99609 + + Reviewed by Ryosuke Niwa. + + Remove the implementation since it creates bogus JSGlobalDatas in the layout tests. + + * heap/HeapStatistics.cpp: + (JSC): + * heap/HeapStatistics.h: + (HeapStatistics): + +2012-10-17 Sam Weinig <sam@webkit.org> + + Attempt to fix the build. + + * bytecode/GlobalResolveInfo.h: Copied from bytecode/GlobalResolveInfo.h. + +2012-10-17 Filip Pizlo <fpizlo@apple.com> + + REGRESSION (r130826 or r130828): Twitter top bar is dysfunctional + https://bugs.webkit.org/show_bug.cgi?id=99577 + <rdar://problem/12518883> + + Reviewed by Mark Hahnenberg. + + It turns out that it's a good idea to maintain the invariants of your object model, such as that + elements past publicLength should have the hole value. + + * dfg/DFGGraph.cpp: + (JSC::DFG::Graph::dump): + * dfg/DFGSpeculativeJIT32_64.cpp: + (JSC::DFG::SpeculativeJIT::compile): + * dfg/DFGSpeculativeJIT64.cpp: + (JSC::DFG::SpeculativeJIT::compile): + +2012-10-17 Anders Carlsson <andersca@apple.com> + + Clean up Vector.h + https://bugs.webkit.org/show_bug.cgi?id=99622 + + Reviewed by Benjamin Poulain. + + Fix fallout from removing std::max and std::min using declarations. + + * runtime/StringPrototype.cpp: + (JSC::jsSpliceSubstrings): + (JSC::jsSpliceSubstringsWithSeparators): + (JSC::stringProtoFuncIndexOf): + * yarr/YarrPattern.cpp: + (JSC::Yarr::YarrPatternConstructor::setupDisjunctionOffsets): + +2012-10-17 Oliver Hunt <oliver@apple.com> + + Committing new files is so overrated. + + * bytecode/ResolveOperation.h: Added. + (JSC): + (JSC::ResolveOperation::getAndReturnScopedVar): + (JSC::ResolveOperation::checkForDynamicEntriesBeforeGlobalScope): + (ResolveOperation): + (JSC::ResolveOperation::getAndReturnGlobalVar): + (JSC::ResolveOperation::getAndReturnGlobalProperty): + (JSC::ResolveOperation::resolveFail): + (JSC::ResolveOperation::skipTopScopeNode): + (JSC::ResolveOperation::skipScopes): + (JSC::ResolveOperation::returnGlobalObjectAsBase): + (JSC::ResolveOperation::setBaseToGlobal): + (JSC::ResolveOperation::setBaseToUndefined): + (JSC::ResolveOperation::setBaseToScope): + (JSC::ResolveOperation::returnScopeAsBase): + (JSC::PutToBaseOperation::PutToBaseOperation): + +2012-10-17 Michael Saboff <msaboff@apple.com> + + StringPrototype::jsSpliceSubstringsWithSeparators() doesn't optimally handle 8 bit strings + https://bugs.webkit.org/show_bug.cgi?id=99230 + + Reviewed by Geoffrey Garen. + + Added code to select characters8() or characters16() on the not all 8 bit path for both the + processing of the source and the separators. + + * runtime/StringPrototype.cpp: + (JSC::jsSpliceSubstringsWithSeparators): + +2012-10-17 Filip Pizlo <fpizlo@apple.com> + + Array and object allocations via 'new Object' or 'new Array' should be inlined in bytecode to allow allocation site profiling + https://bugs.webkit.org/show_bug.cgi?id=99557 + + Reviewed by Geoffrey Garen. + + Removed an inaccurate and misleading comment as per Geoff's review. (I forgot + to make this change as part of http://trac.webkit.org/changeset/131644). + + * bytecompiler/NodesCodegen.cpp: + (JSC::FunctionCallResolveNode::emitBytecode): + +2012-10-17 Oliver Hunt <oliver@apple.com> + + Bytecode should not have responsibility for determining how to perform non-local resolves + https://bugs.webkit.org/show_bug.cgi?id=99349 + + Reviewed by Gavin Barraclough. + + This patch removes lexical analysis from the bytecode generation. This allows + us to delay lookup of a non-local variables until the lookup is actually necessary, + and simplifies a lot of the resolve logic in BytecodeGenerator. + + Once a lookup is performed we cache the lookup information in a set of out-of-line + buffers in CodeBlock. This allows subsequent lookups to avoid unnecessary hashing, + etc, and allows the respective JITs to recreated optimal lookup code. + + This is currently still a performance regression in LLInt, but most of the remaining + regression is caused by a lot of indirection that I'll remove in future work, as well + as some work necessary to allow LLInt to perform in line instruction repatching. + We will also want to improve the behaviour of the baseline JIT for some of the lookup + operations, however this patch was getting quite large already so I'm landing it now + that we've reached the bar of "performance-neutral". + + * GNUmakefile.list.am: + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: + * JavaScriptCore.xcodeproj/project.pbxproj: + * bytecode/CodeBlock.cpp: + (JSC::CodeBlock::printStructures): + (JSC::CodeBlock::dump): + (JSC::CodeBlock::CodeBlock): + (JSC::CodeBlock::visitStructures): + (JSC): + (JSC::CodeBlock::finalizeUnconditionally): + (JSC::CodeBlock::shrinkToFit): + * bytecode/CodeBlock.h: + (JSC::CodeBlock::addResolve): + (JSC::CodeBlock::addPutToBase): + (CodeBlock): + (JSC::CodeBlock::resolveOperations): + (JSC::CodeBlock::putToBaseOperation): + (JSC::CodeBlock::numberOfResolveOperations): + (JSC::CodeBlock::numberOfPutToBaseOperations): + (JSC::CodeBlock::addPropertyAccessInstruction): + (JSC::CodeBlock::globalObjectConstant): + (JSC::CodeBlock::setGlobalObjectConstant): + * bytecode/GlobalResolveInfo.h: Removed. + * bytecode/Opcode.h: + (JSC): + (JSC::padOpcodeName): + * bytecode/ResolveGlobalStatus.cpp: + (JSC::computeForStructure): + (JSC::ResolveGlobalStatus::computeFor): + * bytecode/ResolveGlobalStatus.h: + (JSC): + (ResolveGlobalStatus): + * bytecode/ResolveOperation.h: Added. + The new types and logic we use to perform the cached lookups. + (JSC): + (ResolveOperation): + (JSC::ResolveOperation::getAndReturnScopedVar): + (JSC::ResolveOperation::checkForDynamicEntriesBeforeGlobalScope): + (JSC::ResolveOperation::getAndReturnGlobalVar): + (JSC::ResolveOperation::getAndReturnGlobalProperty): + (JSC::ResolveOperation::resolveFail): + (JSC::ResolveOperation::skipTopScopeNode): + (JSC::ResolveOperation::skipScopes): + (JSC::ResolveOperation::returnGlobalObjectAsBase): + (JSC::ResolveOperation::setBaseToGlobal): + (JSC::ResolveOperation::setBaseToUndefined): + (JSC::ResolveOperation::setBaseToScope): + (JSC::ResolveOperation::returnScopeAsBase): + (JSC::PutToBaseOperation::PutToBaseOperation): + * bytecompiler/BytecodeGenerator.cpp: + (JSC::ResolveResult::checkValidity): + (JSC): + (JSC::BytecodeGenerator::BytecodeGenerator): + (JSC::BytecodeGenerator::resolve): + (JSC::BytecodeGenerator::resolveConstDecl): + (JSC::BytecodeGenerator::shouldAvoidResolveGlobal): + (JSC::BytecodeGenerator::emitResolve): + (JSC::BytecodeGenerator::emitResolveBase): + (JSC::BytecodeGenerator::emitResolveBaseForPut): + (JSC::BytecodeGenerator::emitResolveWithBaseForPut): + (JSC::BytecodeGenerator::emitResolveWithThis): + (JSC::BytecodeGenerator::emitGetLocalVar): + (JSC::BytecodeGenerator::emitInitGlobalConst): + (JSC::BytecodeGenerator::emitPutToBase): + * bytecompiler/BytecodeGenerator.h: + (JSC::ResolveResult::registerResolve): + (JSC::ResolveResult::dynamicResolve): + (ResolveResult): + (JSC::ResolveResult::ResolveResult): + (JSC): + (NonlocalResolveInfo): + (JSC::NonlocalResolveInfo::NonlocalResolveInfo): + (JSC::NonlocalResolveInfo::~NonlocalResolveInfo): + (JSC::NonlocalResolveInfo::resolved): + (JSC::NonlocalResolveInfo::put): + (BytecodeGenerator): + (JSC::BytecodeGenerator::getResolveOperations): + (JSC::BytecodeGenerator::getResolveWithThisOperations): + (JSC::BytecodeGenerator::getResolveBaseOperations): + (JSC::BytecodeGenerator::getResolveBaseForPutOperations): + (JSC::BytecodeGenerator::getResolveWithBaseForPutOperations): + (JSC::BytecodeGenerator::getPutToBaseOperation): + * bytecompiler/NodesCodegen.cpp: + (JSC::ResolveNode::isPure): + (JSC::FunctionCallResolveNode::emitBytecode): + (JSC::PostfixNode::emitResolve): + (JSC::PrefixNode::emitResolve): + (JSC::ReadModifyResolveNode::emitBytecode): + (JSC::AssignResolveNode::emitBytecode): + (JSC::ConstDeclNode::emitCodeSingle): + (JSC::ForInNode::emitBytecode): + * dfg/DFGAbstractState.cpp: + (JSC::DFG::AbstractState::execute): + * dfg/DFGByteCodeParser.cpp: + (ByteCodeParser): + (InlineStackEntry): + (JSC::DFG::ByteCodeParser::handleGetByOffset): + (DFG): + (JSC::DFG::ByteCodeParser::parseResolveOperations): + (JSC::DFG::ByteCodeParser::parseBlock): + (JSC::DFG::ByteCodeParser::InlineStackEntry::InlineStackEntry): + * dfg/DFGCapabilities.h: + (JSC::DFG::canCompileResolveOperations): + (DFG): + (JSC::DFG::canCompilePutToBaseOperation): + (JSC::DFG::canCompileOpcode): + (JSC::DFG::canInlineOpcode): + * dfg/DFGGraph.h: + (ResolveGlobalData): + (ResolveOperationData): + (DFG): + (PutToBaseOperationData): + (Graph): + * dfg/DFGNode.h: + (JSC::DFG::Node::hasIdentifier): + (JSC::DFG::Node::resolveOperationsDataIndex): + (Node): + * dfg/DFGNodeType.h: + (DFG): + * dfg/DFGOSRExit.cpp: + (JSC::DFG::OSRExit::OSRExit): + * dfg/DFGOSRExit.h: + (OSRExit): + * dfg/DFGOSRExitCompiler.cpp: + * dfg/DFGOSRExitCompiler32_64.cpp: + (JSC::DFG::OSRExitCompiler::compileExit): + * dfg/DFGOSRExitCompiler64.cpp: + (JSC::DFG::OSRExitCompiler::compileExit): + * dfg/DFGOperations.cpp: + * dfg/DFGOperations.h: + * dfg/DFGPredictionPropagationPhase.cpp: + (JSC::DFG::PredictionPropagationPhase::propagate): + * dfg/DFGRepatch.cpp: + (JSC::DFG::tryCacheGetByID): + * dfg/DFGSpeculativeJIT.cpp: + (JSC::DFG::SpeculativeJIT::convertLastOSRExitToForward): + * dfg/DFGSpeculativeJIT.h: + (JSC::DFG::SpeculativeJIT::resolveOperations): + (SpeculativeJIT): + (JSC::DFG::SpeculativeJIT::putToBaseOperation): + (JSC::DFG::SpeculativeJIT::callOperation): + * dfg/DFGSpeculativeJIT32_64.cpp: + (JSC::DFG::SpeculativeJIT::compile): + * dfg/DFGSpeculativeJIT64.cpp: + (JSC::DFG::SpeculativeJIT::compile): + * dfg/DFGStructureCheckHoistingPhase.cpp: + (JSC::DFG::StructureCheckHoistingPhase::run): + * jit/JIT.cpp: + (JSC::JIT::privateCompileMainPass): + (JSC::JIT::privateCompileSlowCases): + * jit/JIT.h: + (JIT): + * jit/JITOpcodes.cpp: + (JSC::JIT::emit_op_put_to_base): + (JSC): + (JSC::JIT::emit_resolve_operations): + (JSC::JIT::emitSlow_link_resolve_operations): + (JSC::JIT::emit_op_resolve): + (JSC::JIT::emitSlow_op_resolve): + (JSC::JIT::emit_op_resolve_base): + (JSC::JIT::emitSlow_op_resolve_base): + (JSC::JIT::emit_op_resolve_with_base): + (JSC::JIT::emitSlow_op_resolve_with_base): + (JSC::JIT::emit_op_resolve_with_this): + (JSC::JIT::emitSlow_op_resolve_with_this): + (JSC::JIT::emitSlow_op_put_to_base): + * jit/JITOpcodes32_64.cpp: + (JSC::JIT::emit_op_put_to_base): + (JSC): + * jit/JITPropertyAccess.cpp: + (JSC::JIT::emit_op_init_global_const): + (JSC::JIT::emit_op_init_global_const_check): + (JSC::JIT::emitSlow_op_init_global_const_check): + * jit/JITPropertyAccess32_64.cpp: + (JSC::JIT::emit_op_init_global_const): + (JSC::JIT::emit_op_init_global_const_check): + (JSC::JIT::emitSlow_op_init_global_const_check): + * jit/JITStubs.cpp: + (JSC::DEFINE_STUB_FUNCTION): + (JSC): + * jit/JITStubs.h: + * llint/LLIntSlowPaths.cpp: + (LLInt): + (JSC::LLInt::LLINT_SLOW_PATH_DECL): + * llint/LLIntSlowPaths.h: + (LLInt): + * llint/LowLevelInterpreter.asm: + * llint/LowLevelInterpreter32_64.asm: + * llint/LowLevelInterpreter64.asm: + * runtime/JSScope.cpp: + (JSC::LookupResult::base): + (JSC::LookupResult::value): + (JSC::LookupResult::setBase): + (JSC::LookupResult::setValue): + (LookupResult): + (JSC): + (JSC::setPutPropertyAccessOffset): + (JSC::executeResolveOperations): + (JSC::JSScope::resolveContainingScopeInternal): + (JSC::JSScope::resolveContainingScope): + (JSC::JSScope::resolve): + (JSC::JSScope::resolveBase): + (JSC::JSScope::resolveWithBase): + (JSC::JSScope::resolveWithThis): + (JSC::JSScope::resolvePut): + (JSC::JSScope::resolveGlobal): + * runtime/JSScope.h: + (JSScope): + * runtime/JSVariableObject.cpp: + (JSC): + * runtime/JSVariableObject.h: + (JSVariableObject): + * runtime/Structure.h: + (JSC::Structure::propertyAccessesAreCacheable): + (Structure): + +2012-10-17 Filip Pizlo <fpizlo@apple.com> + + Array and object allocations via 'new Object' or 'new Array' should be inlined in bytecode to allow allocation site profiling + https://bugs.webkit.org/show_bug.cgi?id=99557 + + Reviewed by Geoffrey Garen. + + This uses the old jneq_ptr trick to allow for the bytecode to "see" that the + operation in question is what we almost certainly know it to be. + + * bytecode/CodeBlock.cpp: + (JSC::CodeBlock::dump): + * bytecode/Opcode.h: + (JSC): + (JSC::padOpcodeName): + * bytecode/SpecialPointer.h: + * bytecompiler/BytecodeGenerator.cpp: + (JSC::BytecodeGenerator::emitCall): + (JSC::BytecodeGenerator::emitCallEval): + (JSC::BytecodeGenerator::expectedFunctionForIdentifier): + (JSC): + (JSC::BytecodeGenerator::emitExpectedFunctionSnippet): + (JSC::BytecodeGenerator::emitConstruct): + * bytecompiler/BytecodeGenerator.h: + (BytecodeGenerator): + * bytecompiler/NodesCodegen.cpp: + (JSC::NewExprNode::emitBytecode): + (JSC::FunctionCallValueNode::emitBytecode): + (JSC::FunctionCallResolveNode::emitBytecode): + (JSC::FunctionCallBracketNode::emitBytecode): + (JSC::FunctionCallDotNode::emitBytecode): + (JSC::CallFunctionCallDotNode::emitBytecode): + (JSC::ApplyFunctionCallDotNode::emitBytecode): + * dfg/DFGByteCodeParser.cpp: + (JSC::DFG::ByteCodeParser::parseBlock): + * dfg/DFGCapabilities.h: + (JSC::DFG::canCompileOpcode): + * jit/JIT.cpp: + (JSC::JIT::privateCompileMainPass): + * jit/JIT.h: + (JIT): + * jit/JITOpcodes.cpp: + (JSC::JIT::emit_op_new_array_with_size): + (JSC): + * 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/LowLevelInterpreter.asm: + * runtime/ArrayConstructor.cpp: + (JSC::constructArrayWithSizeQuirk): + (JSC): + * runtime/ArrayConstructor.h: + (JSC): + * runtime/CommonIdentifiers.h: + * runtime/JSGlobalObject.cpp: + (JSC::JSGlobalObject::reset): + (JSC): + +2012-10-17 Filip Pizlo <fpizlo@apple.com> + + JIT op_get_by_pname should call cti_get_by_val_generic and not cti_get_by_val + https://bugs.webkit.org/show_bug.cgi?id=99631 + <rdar://problem/12483221> + + Reviewed by Mark Hahnenberg. + + cti_get_by_val assumes that the return address has patching metadata associated with it, which won't + be true for op_get_by_pname. cti_get_by_val_generic makes no such assumptions. + + * jit/JITPropertyAccess.cpp: + (JSC::JIT::emitSlow_op_get_by_pname): + * jit/JITPropertyAccess32_64.cpp: + (JSC::JIT::emitSlow_op_get_by_pname): + +2012-10-17 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. + + r130212 didn't fully fix the problem. + + * heap/BlockAllocator.cpp: + (JSC::BlockAllocator::blockFreeingThreadMain): We would just continue to the next iteration if + we found that we had zero blocks to copy. We should move the indefinite wait up to where that + check is done so that we properly detect the "no more blocks to copy, wait for more" condition. + +2012-10-16 Csaba Osztrogonác <ossy@webkit.org> + + Unreviewed, rolling out r131516 and r131550. + http://trac.webkit.org/changeset/131516 + http://trac.webkit.org/changeset/131550 + https://bugs.webkit.org/show_bug.cgi?id=99349 + + It caused zillion different problem on different platforms + + * GNUmakefile.list.am: + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: + * JavaScriptCore.xcodeproj/project.pbxproj: + * bytecode/CodeBlock.cpp: + (JSC): + (JSC::isGlobalResolve): + (JSC::instructionOffsetForNth): + (JSC::printGlobalResolveInfo): + (JSC::CodeBlock::printStructures): + (JSC::CodeBlock::dump): + (JSC::CodeBlock::CodeBlock): + (JSC::CodeBlock::visitStructures): + (JSC::CodeBlock::finalizeUnconditionally): + (JSC::CodeBlock::hasGlobalResolveInfoAtBytecodeOffset): + (JSC::CodeBlock::globalResolveInfoForBytecodeOffset): + (JSC::CodeBlock::shrinkToFit): + * bytecode/CodeBlock.h: + (CodeBlock): + (JSC::CodeBlock::addGlobalResolveInstruction): + (JSC::CodeBlock::addGlobalResolveInfo): + (JSC::CodeBlock::globalResolveInfo): + (JSC::CodeBlock::numberOfGlobalResolveInfos): + (JSC::CodeBlock::globalResolveInfoCount): + * bytecode/GlobalResolveInfo.h: Copied from Source/JavaScriptCore/bytecode/ResolveGlobalStatus.cpp. + (JSC): + (JSC::GlobalResolveInfo::GlobalResolveInfo): + (GlobalResolveInfo): + (JSC::getGlobalResolveInfoBytecodeOffset): + * bytecode/Opcode.h: + (JSC): + (JSC::padOpcodeName): + * bytecode/ResolveGlobalStatus.cpp: + (JSC): + (JSC::computeForStructure): + (JSC::computeForLLInt): + (JSC::ResolveGlobalStatus::computeFor): + * bytecode/ResolveGlobalStatus.h: + (JSC): + (ResolveGlobalStatus): + * bytecode/ResolveOperation.h: Removed. + * bytecompiler/BytecodeGenerator.cpp: + (JSC::ResolveResult::checkValidity): + (JSC::ResolveResult::registerPointer): + (JSC): + (JSC::BytecodeGenerator::BytecodeGenerator): + (JSC::BytecodeGenerator::resolve): + (JSC::BytecodeGenerator::resolveConstDecl): + (JSC::BytecodeGenerator::shouldAvoidResolveGlobal): + (JSC::BytecodeGenerator::emitResolve): + (JSC::BytecodeGenerator::emitResolveBase): + (JSC::BytecodeGenerator::emitResolveBaseForPut): + (JSC::BytecodeGenerator::emitResolveWithBase): + (JSC::BytecodeGenerator::emitResolveWithThis): + (JSC::BytecodeGenerator::emitGetStaticVar): + (JSC::BytecodeGenerator::emitInitGlobalConst): + (JSC::BytecodeGenerator::emitPutStaticVar): + * bytecompiler/BytecodeGenerator.h: + (JSC::ResolveResult::registerResolve): + (JSC::ResolveResult::dynamicResolve): + (JSC::ResolveResult::lexicalResolve): + (JSC::ResolveResult::indexedGlobalResolve): + (JSC::ResolveResult::dynamicIndexedGlobalResolve): + (JSC::ResolveResult::globalResolve): + (JSC::ResolveResult::dynamicGlobalResolve): + (JSC::ResolveResult::type): + (JSC::ResolveResult::index): + (JSC::ResolveResult::depth): + (JSC::ResolveResult::globalObject): + (ResolveResult): + (JSC::ResolveResult::isStatic): + (JSC::ResolveResult::isIndexed): + (JSC::ResolveResult::isScoped): + (JSC::ResolveResult::isGlobal): + (JSC::ResolveResult::ResolveResult): + (BytecodeGenerator): + * bytecompiler/NodesCodegen.cpp: + (JSC::ResolveNode::isPure): + (JSC::FunctionCallResolveNode::emitBytecode): + (JSC::PostfixNode::emitResolve): + (JSC::PrefixNode::emitResolve): + (JSC::ReadModifyResolveNode::emitBytecode): + (JSC::AssignResolveNode::emitBytecode): + (JSC::ConstDeclNode::emitCodeSingle): + (JSC::ForInNode::emitBytecode): + * dfg/DFGAbstractState.cpp: + (JSC::DFG::AbstractState::execute): + * dfg/DFGByteCodeParser.cpp: + (ByteCodeParser): + (InlineStackEntry): + (JSC::DFG::ByteCodeParser::handleGetByOffset): + (JSC::DFG::ByteCodeParser::parseBlock): + (JSC::DFG::ByteCodeParser::InlineStackEntry::InlineStackEntry): + * dfg/DFGCapabilities.h: + (JSC::DFG::canCompileOpcode): + (JSC::DFG::canInlineOpcode): + * dfg/DFGGraph.h: + (ResolveGlobalData): + (DFG): + (Graph): + * dfg/DFGNode.h: + (JSC::DFG::Node::hasIdentifier): + * dfg/DFGNodeType.h: + (DFG): + * dfg/DFGOSRExit.cpp: + (JSC::DFG::OSRExit::OSRExit): + * dfg/DFGOSRExit.h: + (OSRExit): + * dfg/DFGOSRExitCompiler.cpp: + * dfg/DFGOSRExitCompiler32_64.cpp: + (JSC::DFG::OSRExitCompiler::compileExit): + * dfg/DFGOSRExitCompiler64.cpp: + (JSC::DFG::OSRExitCompiler::compileExit): + * dfg/DFGOperations.cpp: + * dfg/DFGOperations.h: + (JSC): + * dfg/DFGPredictionPropagationPhase.cpp: + (JSC::DFG::PredictionPropagationPhase::propagate): + * dfg/DFGRepatch.cpp: + (JSC::DFG::tryCacheGetByID): + * dfg/DFGSpeculativeJIT.cpp: + (JSC::DFG::SpeculativeJIT::convertLastOSRExitToForward): + * dfg/DFGSpeculativeJIT.h: + (JSC::DFG::SpeculativeJIT::callOperation): + * dfg/DFGSpeculativeJIT32_64.cpp: + (JSC::DFG::SpeculativeJIT::compile): + * dfg/DFGSpeculativeJIT64.cpp: + (JSC::DFG::SpeculativeJIT::compile): + * dfg/DFGStructureCheckHoistingPhase.cpp: + (JSC::DFG::StructureCheckHoistingPhase::run): + * jit/JIT.cpp: + (JSC::JIT::privateCompileMainPass): + (JSC::JIT::privateCompileSlowCases): + * jit/JIT.h: + (JIT): + (JSC::JIT::emit_op_get_global_var_watchable): + * jit/JITOpcodes.cpp: + (JSC::JIT::emit_op_resolve): + (JSC): + (JSC::JIT::emit_op_resolve_base): + (JSC::JIT::emit_op_resolve_skip): + (JSC::JIT::emit_op_resolve_global): + (JSC::JIT::emitSlow_op_resolve_global): + (JSC::JIT::emit_op_resolve_with_base): + (JSC::JIT::emit_op_resolve_with_this): + (JSC::JIT::emit_op_resolve_global_dynamic): + (JSC::JIT::emitSlow_op_resolve_global_dynamic): + * jit/JITOpcodes32_64.cpp: + (JSC::JIT::emit_op_resolve): + (JSC): + (JSC::JIT::emit_op_resolve_base): + (JSC::JIT::emit_op_resolve_skip): + (JSC::JIT::emit_op_resolve_global): + (JSC::JIT::emitSlow_op_resolve_global): + (JSC::JIT::emit_op_resolve_with_base): + (JSC::JIT::emit_op_resolve_with_this): + * jit/JITPropertyAccess.cpp: + (JSC::JIT::emit_op_get_scoped_var): + (JSC): + (JSC::JIT::emit_op_put_scoped_var): + (JSC::JIT::emit_op_get_global_var): + (JSC::JIT::emit_op_put_global_var): + (JSC::JIT::emit_op_put_global_var_check): + (JSC::JIT::emitSlow_op_put_global_var_check): + * jit/JITPropertyAccess32_64.cpp: + (JSC::JIT::emit_op_get_scoped_var): + (JSC): + (JSC::JIT::emit_op_put_scoped_var): + (JSC::JIT::emit_op_get_global_var): + (JSC::JIT::emit_op_put_global_var): + (JSC::JIT::emit_op_put_global_var_check): + (JSC::JIT::emitSlow_op_put_global_var_check): + * jit/JITStubs.cpp: + (JSC::DEFINE_STUB_FUNCTION): + (JSC): + * jit/JITStubs.h: + * llint/LLIntSlowPaths.cpp: + (LLInt): + (JSC::LLInt::LLINT_SLOW_PATH_DECL): + * llint/LLIntSlowPaths.h: + (LLInt): + * llint/LowLevelInterpreter.asm: + * llint/LowLevelInterpreter32_64.asm: + * llint/LowLevelInterpreter64.asm: + * runtime/JSScope.cpp: + (JSC::JSScope::resolve): + (JSC::JSScope::resolveSkip): + (JSC::JSScope::resolveGlobal): + (JSC::JSScope::resolveGlobalDynamic): + (JSC::JSScope::resolveBase): + (JSC::JSScope::resolveWithBase): + (JSC::JSScope::resolveWithThis): + * runtime/JSScope.h: + (JSScope): + * runtime/JSVariableObject.cpp: + * runtime/JSVariableObject.h: + * runtime/Structure.h: + +2012-10-16 Dongwoo Joshua Im <dw.im@samsung.com> + + [GTK] Fix build break - ResolveOperations.h is not in WebKit. + https://bugs.webkit.org/show_bug.cgi?id=99538 + + Unreviewed build fix. + + There are some files including ResolveOperations.h which is not exist at all. + + * GNUmakefile.list.am: s/ResolveOperations.h/ResolveOperation.h/ + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: s/ResolveOperations.h/ResolveOperation.h/ + +2012-10-16 Jian Li <jianli@chromium.org> + + Rename feature define ENABLE_WIDGET_REGION to ENABLE_DRAGGBALE_REGION + https://bugs.webkit.org/show_bug.cgi?id=98975 + + Reviewed by Adam Barth. + + Renaming is needed to better match with the draggable region code. + + * Configurations/FeatureDefines.xcconfig: + +2012-10-15 Oliver Hunt <oliver@apple.com> + + Bytecode should not have responsibility for determining how to perform non-local resolves + https://bugs.webkit.org/show_bug.cgi?id=99349 + + Reviewed by Gavin Barraclough. + + This patch removes lexical analysis from the bytecode generation. This allows + us to delay lookup of a non-local variables until the lookup is actually necessary, + and simplifies a lot of the resolve logic in BytecodeGenerator. + + Once a lookup is performed we cache the lookup information in a set of out-of-line + buffers in CodeBlock. This allows subsequent lookups to avoid unnecessary hashing, + etc, and allows the respective JITs to recreated optimal lookup code. + + This is currently still a performance regression in LLInt, but most of the remaining + regression is caused by a lot of indirection that I'll remove in future work, as well + as some work necessary to allow LLInt to perform in line instruction repatching. + We will also want to improve the behaviour of the baseline JIT for some of the lookup + operations, however this patch was getting quite large already so I'm landing it now + that we've reached the bar of "performance-neutral". + + * GNUmakefile.list.am: + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: + * JavaScriptCore.xcodeproj/project.pbxproj: + * bytecode/CodeBlock.cpp: + (JSC::CodeBlock::printStructures): + (JSC::CodeBlock::dump): + (JSC::CodeBlock::CodeBlock): + (JSC::CodeBlock::visitStructures): + (JSC): + (JSC::CodeBlock::finalizeUnconditionally): + (JSC::CodeBlock::shrinkToFit): + * bytecode/CodeBlock.h: + (JSC::CodeBlock::addResolve): + (JSC::CodeBlock::addPutToBase): + (CodeBlock): + (JSC::CodeBlock::resolveOperations): + (JSC::CodeBlock::putToBaseOperation): + (JSC::CodeBlock::numberOfResolveOperations): + (JSC::CodeBlock::numberOfPutToBaseOperations): + (JSC::CodeBlock::addPropertyAccessInstruction): + (JSC::CodeBlock::globalObjectConstant): + (JSC::CodeBlock::setGlobalObjectConstant): + * bytecode/GlobalResolveInfo.h: Removed. + * bytecode/Opcode.h: + (JSC): + (JSC::padOpcodeName): + * bytecode/ResolveGlobalStatus.cpp: + (JSC::computeForStructure): + (JSC::ResolveGlobalStatus::computeFor): + * bytecode/ResolveGlobalStatus.h: + (JSC): + (ResolveGlobalStatus): + * bytecode/ResolveOperation.h: Added. + The new types and logic we use to perform the cached lookups. + (JSC): + (ResolveOperation): + (JSC::ResolveOperation::getAndReturnScopedVar): + (JSC::ResolveOperation::checkForDynamicEntriesBeforeGlobalScope): + (JSC::ResolveOperation::getAndReturnGlobalVar): + (JSC::ResolveOperation::getAndReturnGlobalProperty): + (JSC::ResolveOperation::resolveFail): + (JSC::ResolveOperation::skipTopScopeNode): + (JSC::ResolveOperation::skipScopes): + (JSC::ResolveOperation::returnGlobalObjectAsBase): + (JSC::ResolveOperation::setBaseToGlobal): + (JSC::ResolveOperation::setBaseToUndefined): + (JSC::ResolveOperation::setBaseToScope): + (JSC::ResolveOperation::returnScopeAsBase): + (JSC::PutToBaseOperation::PutToBaseOperation): + * bytecompiler/BytecodeGenerator.cpp: + (JSC::ResolveResult::checkValidity): + (JSC): + (JSC::BytecodeGenerator::BytecodeGenerator): + (JSC::BytecodeGenerator::resolve): + (JSC::BytecodeGenerator::resolveConstDecl): + (JSC::BytecodeGenerator::shouldAvoidResolveGlobal): + (JSC::BytecodeGenerator::emitResolve): + (JSC::BytecodeGenerator::emitResolveBase): + (JSC::BytecodeGenerator::emitResolveBaseForPut): + (JSC::BytecodeGenerator::emitResolveWithBaseForPut): + (JSC::BytecodeGenerator::emitResolveWithThis): + (JSC::BytecodeGenerator::emitGetLocalVar): + (JSC::BytecodeGenerator::emitInitGlobalConst): + (JSC::BytecodeGenerator::emitPutToBase): + * bytecompiler/BytecodeGenerator.h: + (JSC::ResolveResult::registerResolve): + (JSC::ResolveResult::dynamicResolve): + (ResolveResult): + (JSC::ResolveResult::ResolveResult): + (JSC): + (NonlocalResolveInfo): + (JSC::NonlocalResolveInfo::NonlocalResolveInfo): + (JSC::NonlocalResolveInfo::~NonlocalResolveInfo): + (JSC::NonlocalResolveInfo::resolved): + (JSC::NonlocalResolveInfo::put): + (BytecodeGenerator): + (JSC::BytecodeGenerator::getResolveOperations): + (JSC::BytecodeGenerator::getResolveWithThisOperations): + (JSC::BytecodeGenerator::getResolveBaseOperations): + (JSC::BytecodeGenerator::getResolveBaseForPutOperations): + (JSC::BytecodeGenerator::getResolveWithBaseForPutOperations): + (JSC::BytecodeGenerator::getPutToBaseOperation): + * bytecompiler/NodesCodegen.cpp: + (JSC::ResolveNode::isPure): + (JSC::FunctionCallResolveNode::emitBytecode): + (JSC::PostfixNode::emitResolve): + (JSC::PrefixNode::emitResolve): + (JSC::ReadModifyResolveNode::emitBytecode): + (JSC::AssignResolveNode::emitBytecode): + (JSC::ConstDeclNode::emitCodeSingle): + (JSC::ForInNode::emitBytecode): + * dfg/DFGAbstractState.cpp: + (JSC::DFG::AbstractState::execute): + * dfg/DFGByteCodeParser.cpp: + (ByteCodeParser): + (InlineStackEntry): + (JSC::DFG::ByteCodeParser::handleGetByOffset): + (DFG): + (JSC::DFG::ByteCodeParser::parseResolveOperations): + (JSC::DFG::ByteCodeParser::parseBlock): + (JSC::DFG::ByteCodeParser::InlineStackEntry::InlineStackEntry): + * dfg/DFGCapabilities.h: + (JSC::DFG::canCompileResolveOperations): + (DFG): + (JSC::DFG::canCompilePutToBaseOperation): + (JSC::DFG::canCompileOpcode): + (JSC::DFG::canInlineOpcode): + * dfg/DFGGraph.h: + (ResolveGlobalData): + (ResolveOperationData): + (DFG): + (PutToBaseOperationData): + (Graph): + * dfg/DFGNode.h: + (JSC::DFG::Node::hasIdentifier): + (JSC::DFG::Node::resolveOperationsDataIndex): + (Node): + * dfg/DFGNodeType.h: + (DFG): + * dfg/DFGOSRExit.cpp: + (JSC::DFG::OSRExit::OSRExit): + * dfg/DFGOSRExit.h: + (OSRExit): + * dfg/DFGOSRExitCompiler.cpp: + * dfg/DFGOSRExitCompiler32_64.cpp: + (JSC::DFG::OSRExitCompiler::compileExit): + * dfg/DFGOSRExitCompiler64.cpp: + (JSC::DFG::OSRExitCompiler::compileExit): + * dfg/DFGOperations.cpp: + * dfg/DFGOperations.h: + * dfg/DFGPredictionPropagationPhase.cpp: + (JSC::DFG::PredictionPropagationPhase::propagate): + * dfg/DFGRepatch.cpp: + (JSC::DFG::tryCacheGetByID): + * dfg/DFGSpeculativeJIT.cpp: + (JSC::DFG::SpeculativeJIT::convertLastOSRExitToForward): + * dfg/DFGSpeculativeJIT.h: + (JSC::DFG::SpeculativeJIT::resolveOperations): + (SpeculativeJIT): + (JSC::DFG::SpeculativeJIT::putToBaseOperation): + (JSC::DFG::SpeculativeJIT::callOperation): + * dfg/DFGSpeculativeJIT32_64.cpp: + (JSC::DFG::SpeculativeJIT::compile): + * dfg/DFGSpeculativeJIT64.cpp: + (JSC::DFG::SpeculativeJIT::compile): + * dfg/DFGStructureCheckHoistingPhase.cpp: + (JSC::DFG::StructureCheckHoistingPhase::run): + * jit/JIT.cpp: + (JSC::JIT::privateCompileMainPass): + (JSC::JIT::privateCompileSlowCases): + * jit/JIT.h: + (JIT): + * jit/JITOpcodes.cpp: + (JSC::JIT::emit_op_put_to_base): + (JSC): + (JSC::JIT::emit_resolve_operations): + (JSC::JIT::emitSlow_link_resolve_operations): + (JSC::JIT::emit_op_resolve): + (JSC::JIT::emitSlow_op_resolve): + (JSC::JIT::emit_op_resolve_base): + (JSC::JIT::emitSlow_op_resolve_base): + (JSC::JIT::emit_op_resolve_with_base): + (JSC::JIT::emitSlow_op_resolve_with_base): + (JSC::JIT::emit_op_resolve_with_this): + (JSC::JIT::emitSlow_op_resolve_with_this): + (JSC::JIT::emitSlow_op_put_to_base): + * jit/JITOpcodes32_64.cpp: + (JSC::JIT::emit_op_put_to_base): + (JSC): + * jit/JITPropertyAccess.cpp: + (JSC::JIT::emit_op_init_global_const): + (JSC::JIT::emit_op_init_global_const_check): + (JSC::JIT::emitSlow_op_init_global_const_check): + * jit/JITPropertyAccess32_64.cpp: + (JSC::JIT::emit_op_init_global_const): + (JSC::JIT::emit_op_init_global_const_check): + (JSC::JIT::emitSlow_op_init_global_const_check): + * jit/JITStubs.cpp: + (JSC::DEFINE_STUB_FUNCTION): + (JSC): + * jit/JITStubs.h: + * llint/LLIntSlowPaths.cpp: + (LLInt): + (JSC::LLInt::LLINT_SLOW_PATH_DECL): + * llint/LLIntSlowPaths.h: + (LLInt): + * llint/LowLevelInterpreter.asm: + * llint/LowLevelInterpreter32_64.asm: + * llint/LowLevelInterpreter64.asm: + * runtime/JSScope.cpp: + (JSC::LookupResult::base): + (JSC::LookupResult::value): + (JSC::LookupResult::setBase): + (JSC::LookupResult::setValue): + (LookupResult): + (JSC): + (JSC::setPutPropertyAccessOffset): + (JSC::executeResolveOperations): + (JSC::JSScope::resolveContainingScopeInternal): + (JSC::JSScope::resolveContainingScope): + (JSC::JSScope::resolve): + (JSC::JSScope::resolveBase): + (JSC::JSScope::resolveWithBase): + (JSC::JSScope::resolveWithThis): + (JSC::JSScope::resolvePut): + (JSC::JSScope::resolveGlobal): + * runtime/JSScope.h: + (JSScope): + * runtime/JSVariableObject.cpp: + (JSC): + * runtime/JSVariableObject.h: + (JSVariableObject): + * runtime/Structure.h: + (JSC::Structure::propertyAccessesAreCacheable): + (Structure): + +2012-10-16 Filip Pizlo <fpizlo@apple.com> + + Accidental switch fall-through in DFG::FixupPhase + https://bugs.webkit.org/show_bug.cgi?id=96956 + <rdar://problem/12313242> + + Reviewed by Mark Hahnenberg. + + * dfg/DFGFixupPhase.cpp: + (JSC::DFG::FixupPhase::fixupNode): + +2012-10-16 Filip Pizlo <fpizlo@apple.com> + + GetScopedVar CSE matches dead GetScopedVar's leading to IR corruption + https://bugs.webkit.org/show_bug.cgi?id=99470 + <rdar://problem/12363698> + + Reviewed by Mark Hahnenberg. + + All it takes is to follow the "if (!shouldGenerate) continue" idiom and everything will be OK. + + * dfg/DFGCSEPhase.cpp: + (JSC::DFG::CSEPhase::globalVarLoadElimination): + (JSC::DFG::CSEPhase::scopedVarLoadElimination): + (JSC::DFG::CSEPhase::globalVarWatchpointElimination): + (JSC::DFG::CSEPhase::getByValLoadElimination): + (JSC::DFG::CSEPhase::checkStructureElimination): + (JSC::DFG::CSEPhase::structureTransitionWatchpointElimination): + (JSC::DFG::CSEPhase::getByOffsetLoadElimination): + +2012-10-16 Dima Gorbik <dgorbik@apple.com> + + Remove Platform.h include from the header files. + https://bugs.webkit.org/show_bug.cgi?id=98665 + + Reviewed by Eric Seidel. + + We don't want other clients that include WebKit headers to know about Platform.h. + + * API/tests/minidom.c: + * API/tests/testapi.c: + +2012-10-16 Balazs Kilvady <kilvadyb@homejinni.com> + + Add missing MIPS functions to assembler. + https://bugs.webkit.org/show_bug.cgi?id=98856 + + Reviewed by Oliver Hunt. + + Implement missing functions in MacroAssemblerMIPS and MIPSAssembler. + + * assembler/MIPSAssembler.h: + (JSC::MIPSAssembler::lb): + (MIPSAssembler): + (JSC::MIPSAssembler::lh): + (JSC::MIPSAssembler::cvtds): + (JSC::MIPSAssembler::cvtsd): + (JSC::MIPSAssembler::vmov): + * assembler/MacroAssemblerMIPS.h: + (MacroAssemblerMIPS): + (JSC::MacroAssemblerMIPS::load8Signed): + (JSC::MacroAssemblerMIPS::load16Signed): + (JSC::MacroAssemblerMIPS::moveDoubleToInts): + (JSC::MacroAssemblerMIPS::moveIntsToDouble): + (JSC::MacroAssemblerMIPS::loadFloat): + (JSC::MacroAssemblerMIPS::loadDouble): + (JSC::MacroAssemblerMIPS::storeFloat): + (JSC::MacroAssemblerMIPS::storeDouble): + (JSC::MacroAssemblerMIPS::addDouble): + (JSC::MacroAssemblerMIPS::convertFloatToDouble): + (JSC::MacroAssemblerMIPS::convertDoubleToFloat): + +2012-10-16 Balazs Kilvady <kilvadyb@homejinni.com> + + MIPS assembler coding-style fix. + https://bugs.webkit.org/show_bug.cgi?id=99359 + + Reviewed by Oliver Hunt. + + Coding style fix of existing MIPS assembler header files. + + * assembler/MIPSAssembler.h: + (JSC::MIPSAssembler::addiu): + (JSC::MIPSAssembler::addu): + (JSC::MIPSAssembler::subu): + (JSC::MIPSAssembler::mul): + (JSC::MIPSAssembler::andInsn): + (JSC::MIPSAssembler::andi): + (JSC::MIPSAssembler::nor): + (JSC::MIPSAssembler::orInsn): + (JSC::MIPSAssembler::ori): + (JSC::MIPSAssembler::xorInsn): + (JSC::MIPSAssembler::xori): + (JSC::MIPSAssembler::slt): + (JSC::MIPSAssembler::sltu): + (JSC::MIPSAssembler::sltiu): + (JSC::MIPSAssembler::sll): + (JSC::MIPSAssembler::sllv): + (JSC::MIPSAssembler::sra): + (JSC::MIPSAssembler::srav): + (JSC::MIPSAssembler::srl): + (JSC::MIPSAssembler::srlv): + (JSC::MIPSAssembler::lbu): + (JSC::MIPSAssembler::lw): + (JSC::MIPSAssembler::lwl): + (JSC::MIPSAssembler::lwr): + (JSC::MIPSAssembler::lhu): + (JSC::MIPSAssembler::sb): + (JSC::MIPSAssembler::sh): + (JSC::MIPSAssembler::sw): + (JSC::MIPSAssembler::addd): + (JSC::MIPSAssembler::subd): + (JSC::MIPSAssembler::muld): + (JSC::MIPSAssembler::divd): + (JSC::MIPSAssembler::lwc1): + (JSC::MIPSAssembler::ldc1): + (JSC::MIPSAssembler::swc1): + (JSC::MIPSAssembler::sdc1): + (MIPSAssembler): + (JSC::MIPSAssembler::relocateJumps): + (JSC::MIPSAssembler::linkWithOffset): + * assembler/MacroAssemblerMIPS.h: + (JSC::MacroAssemblerMIPS::add32): + (JSC::MacroAssemblerMIPS::and32): + (JSC::MacroAssemblerMIPS::sub32): + (MacroAssemblerMIPS): + (JSC::MacroAssemblerMIPS::load8): + (JSC::MacroAssemblerMIPS::load32): + (JSC::MacroAssemblerMIPS::load32WithUnalignedHalfWords): + (JSC::MacroAssemblerMIPS::load16): + (JSC::MacroAssemblerMIPS::store8): + (JSC::MacroAssemblerMIPS::store16): + (JSC::MacroAssemblerMIPS::store32): + (JSC::MacroAssemblerMIPS::nearCall): + (JSC::MacroAssemblerMIPS::test8): + (JSC::MacroAssemblerMIPS::test32): + +2012-10-16 Yuqiang Xian <yuqiang.xian@intel.com> + + Refactor MacroAssembler interfaces to differentiate the pointer operands from the 64-bit integer operands + https://bugs.webkit.org/show_bug.cgi?id=99154 + + Reviewed by Gavin Barraclough. + + In current JavaScriptCore implementation for JSVALUE64 platform (i.e., + the X64 platform), we assume that the JSValue size is same to the + pointer size, and thus EncodedJSValue is simply type defined as a + "void*". In the JIT compiler, we also take this assumption and invoke + the same macro assembler interfaces for both JSValue and pointer + operands. We need to differentiate the operations on pointers from the + operations on JSValues, and let them invoking different macro + assembler interfaces. For example, we now use the interface of + "loadPtr" to load either a pointer or a JSValue, and we need to switch + to using "loadPtr" to load a pointer and some new "load64" interface + to load a JSValue. This would help us supporting other JSVALUE64 + platforms where pointer size is not necessarily 64-bits, for example + x32 (bug #99153). + + The major modification I made is to introduce the "*64" interfaces in + the MacroAssembler for those operations on JSValues, keep the "*Ptr" + interfaces for those operations on real pointers, and go through all + the JIT compiler code to correct the usage. + + This is the first part of the work, i.e, to add the *64 interfaces to + the MacroAssembler. + + * assembler/AbstractMacroAssembler.h: Add the Imm64 interfaces. + (AbstractMacroAssembler): + (JSC::AbstractMacroAssembler::TrustedImm64::TrustedImm64): + (TrustedImm64): + (JSC::AbstractMacroAssembler::Imm64::Imm64): + (Imm64): + (JSC::AbstractMacroAssembler::Imm64::asTrustedImm64): + * assembler/MacroAssembler.h: map <foo>Ptr methods to <foo>64 for X86_64. + (MacroAssembler): + (JSC::MacroAssembler::peek64): + (JSC::MacroAssembler::poke): + (JSC::MacroAssembler::poke64): + (JSC::MacroAssembler::addPtr): + (JSC::MacroAssembler::andPtr): + (JSC::MacroAssembler::negPtr): + (JSC::MacroAssembler::orPtr): + (JSC::MacroAssembler::rotateRightPtr): + (JSC::MacroAssembler::subPtr): + (JSC::MacroAssembler::xorPtr): + (JSC::MacroAssembler::loadPtr): + (JSC::MacroAssembler::loadPtrWithAddressOffsetPatch): + (JSC::MacroAssembler::loadPtrWithCompactAddressOffsetPatch): + (JSC::MacroAssembler::storePtr): + (JSC::MacroAssembler::storePtrWithAddressOffsetPatch): + (JSC::MacroAssembler::movePtrToDouble): + (JSC::MacroAssembler::moveDoubleToPtr): + (JSC::MacroAssembler::comparePtr): + (JSC::MacroAssembler::testPtr): + (JSC::MacroAssembler::branchPtr): + (JSC::MacroAssembler::branchTestPtr): + (JSC::MacroAssembler::branchAddPtr): + (JSC::MacroAssembler::branchSubPtr): + (JSC::MacroAssembler::shouldBlindDouble): + (JSC::MacroAssembler::shouldBlind): + (JSC::MacroAssembler::RotatedImm64::RotatedImm64): + (RotatedImm64): + (JSC::MacroAssembler::rotationBlindConstant): + (JSC::MacroAssembler::loadRotationBlindedConstant): + (JSC::MacroAssembler::move): + (JSC::MacroAssembler::and64): + (JSC::MacroAssembler::store64): + * assembler/MacroAssemblerX86Common.h: + (JSC::MacroAssemblerX86Common::shouldBlindForSpecificArch): + (MacroAssemblerX86Common): + (JSC::MacroAssemblerX86Common::move): + * assembler/MacroAssemblerX86_64.h: Add the <foo>64 methods for X86_64. + (JSC::MacroAssemblerX86_64::branchAdd32): + (JSC::MacroAssemblerX86_64::add64): + (MacroAssemblerX86_64): + (JSC::MacroAssemblerX86_64::and64): + (JSC::MacroAssemblerX86_64::neg64): + (JSC::MacroAssemblerX86_64::or64): + (JSC::MacroAssemblerX86_64::rotateRight64): + (JSC::MacroAssemblerX86_64::sub64): + (JSC::MacroAssemblerX86_64::xor64): + (JSC::MacroAssemblerX86_64::load64): + (JSC::MacroAssemblerX86_64::load64WithAddressOffsetPatch): + (JSC::MacroAssemblerX86_64::load64WithCompactAddressOffsetPatch): + (JSC::MacroAssemblerX86_64::store64): + (JSC::MacroAssemblerX86_64::store64WithAddressOffsetPatch): + (JSC::MacroAssemblerX86_64::move64ToDouble): + (JSC::MacroAssemblerX86_64::moveDoubleTo64): + (JSC::MacroAssemblerX86_64::compare64): + (JSC::MacroAssemblerX86_64::branch64): + (JSC::MacroAssemblerX86_64::branchTest64): + (JSC::MacroAssemblerX86_64::test64): + (JSC::MacroAssemblerX86_64::branchAdd64): + (JSC::MacroAssemblerX86_64::branchSub64): + (JSC::MacroAssemblerX86_64::branchPtrWithPatch): + (JSC::MacroAssemblerX86_64::storePtrWithPatch): + +2012-10-15 Mark Hahnenberg <mhahnenberg@apple.com> + + Make CopiedSpace and MarkedSpace regions independent + https://bugs.webkit.org/show_bug.cgi?id=99222 + + Reviewed by Filip Pizlo. + + Right now CopiedSpace and MarkedSpace have the same block size and share the same regions, + but there's no reason that they can't have different block sizes while still sharing the + same underlying regions. We should factor the two "used" lists of regions apart so that + MarkedBlocks and CopiedBlocks can be different sizes. Regions will still be a uniform size + so that when they become empty they may be shared between the CopiedSpace and the MarkedSpace, + since benchmarks indicate that sharing is a boon for performance. + + * heap/BlockAllocator.cpp: + (JSC::BlockAllocator::BlockAllocator): + * heap/BlockAllocator.h: + (JSC): + (Region): + (JSC::Region::create): We now have a fixed size for Regions so that empty regions can continue to + be shared between the MarkedSpace and CopiedSpace. Once they are used for a specific type of block, + however, they can only be used for that type of block until they become empty again. + (JSC::Region::createCustomSize): + (JSC::Region::Region): + (JSC::Region::~Region): + (JSC::Region::reset): + (BlockAllocator): + (JSC::BlockAllocator::RegionSet::RegionSet): + (RegionSet): + (JSC::BlockAllocator::tryAllocateFromRegion): We change this function so that it correctly + moves blocks between empty, partial, and full lists. + (JSC::BlockAllocator::allocate): + (JSC::BlockAllocator::allocateCustomSize): + (JSC::BlockAllocator::deallocate): Ditto. + (JSC::CopiedBlock): + (JSC::MarkedBlock): + (JSC::BlockAllocator::regionSetFor): We use this so that we can use the same allocate/deallocate + functions with different RegionSets. We specialize the function for each type of block that we + want to allocate. + * heap/CopiedBlock.h: + (CopiedBlock): + * heap/CopiedSpace.h: + (CopiedSpace): + * heap/HeapBlock.h: + (HeapBlock): + * heap/MarkedBlock.cpp: + (JSC::MarkedBlock::MarkedBlock): For oversize MarkedBlocks, if the block size gets too big we can + underflow the endAtom, which will cause us to segfault when we try to sweep a block. If we're a + custom size MarkedBlock we need to calculate endAtom so it doesn't underflow. + +2012-10-14 Filip Pizlo <fpizlo@apple.com> + + JIT::JIT fails to initialize all of its fields + https://bugs.webkit.org/show_bug.cgi?id=99283 + + Reviewed by Andreas Kling. + + There were two groups of such fields, all of which are eventually initialized + prior to use inside of privateCompile(). But it's safer to make sure that they + are initialized in the constructor as well, since we may use the JIT to do a + stub compile without calling into privateCompile(). + + Unsigned index fields for dynamic repatching meta-data: this change + initializes them to UINT_MAX, so we should crash if we try to use those + indices without initializing them. + + Boolean flags for value profiling: this change initializes them to false, so + we at worst turn off value profiling. + + * jit/JIT.cpp: + (JSC::JIT::JIT): + +2012-10-15 Mark Hahnenberg <mhahnenberg@apple.com> + + We should avoid weakCompareAndSwap when parallel GC is disabled + https://bugs.webkit.org/show_bug.cgi?id=99331 + + Reviewed by Filip Pizlo. + + CopiedBlock::reportLiveBytes and didEvacuateBytes uses weakCompareAndSwap, which some platforms + don't support. For platforms that don't have parallel GC enabled, we should just use a normal store. + + * heap/CopiedBlock.h: + (JSC::CopiedBlock::reportLiveBytes): + (JSC::CopiedBlock::didEvacuateBytes): + +2012-10-15 Carlos Garcia Campos <cgarcia@igalia.com> + + Unreviewed. Fix make distcheck. + + * GNUmakefile.list.am: Add missing header file. + +2012-10-14 Filip Pizlo <fpizlo@apple.com> + + DFG should handle polymorphic array modes by eagerly transforming arrays into the most general applicable form + https://bugs.webkit.org/show_bug.cgi?id=99269 + + Reviewed by Geoffrey Garen. + + This kills off a bunch of code for "polymorphic" array modes in the DFG. It should + also be a performance win for code that uses a lot of array storage arrays. + + * 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::modeUsesButterfly): + (JSC::DFG::modeIsJSArray): + (JSC::DFG::mayStoreToTail): + (JSC::DFG::mayStoreToHole): + (JSC::DFG::canCSEStorage): + (JSC::DFG::modeSupportsLength): + (JSC::DFG::benefitsFromStructureCheck): + * dfg/DFGFixupPhase.cpp: + (JSC::DFG::FixupPhase::checkArray): + (JSC::DFG::FixupPhase::blessArrayOperation): + * dfg/DFGGraph.h: + (JSC::DFG::Graph::byValIsPure): + * dfg/DFGSpeculativeJIT.cpp: + (JSC::DFG::SpeculativeJIT::jumpSlowForUnwantedArrayMode): + (JSC::DFG::SpeculativeJIT::checkArray): + (JSC::DFG::SpeculativeJIT::arrayify): + (DFG): + (JSC::DFG::SpeculativeJIT::compileGetArrayLength): + * dfg/DFGSpeculativeJIT.h: + (JSC::DFG::SpeculativeJIT::putByValWillNeedExtraRegister): + (SpeculativeJIT): + * dfg/DFGSpeculativeJIT32_64.cpp: + (JSC::DFG::SpeculativeJIT::compile): + * dfg/DFGSpeculativeJIT64.cpp: + (JSC::DFG::SpeculativeJIT::compile): + +2012-10-14 Filip Pizlo <fpizlo@apple.com> + + REGRESSION(126886): Fat binary builds don't know how to handle architecture variants to which the LLInt is agnostic + https://bugs.webkit.org/show_bug.cgi?id=99270 + + Reviewed by Geoffrey Garen. + + The fix is to hash cons the offsets based on configuration index, not the offsets + themselves. + + * offlineasm/offsets.rb: + +2012-10-13 Filip Pizlo <fpizlo@apple.com> + + IndexingType should not have a bit for each type + https://bugs.webkit.org/show_bug.cgi?id=98997 + + Reviewed by Oliver Hunt. + + Somewhat incidentally, the introduction of butterflies led to each indexing + type being represented by a unique bit. This is superficially nice since it + allows you to test if a structure corresponds to a particular indexing type + by saying !!(structure->indexingType() & TheType). But the downside is that + given the 8 bits we have for the m_indexingType field, that leaves only a + small number of possible indexing types if we have one per bit. + + This changeset changes the indexing type to be: + + Bit #1: Tells you if you're an array. + + Bits #2 - #5: 16 possible indexing types, including the blank type for + objects that don't have indexed properties. + + Bits #6-8: Auxiliary bits that we could use for other things. Currently we + just use one of those bits, for MayHaveIndexedAccessors. + + This is performance-neutral, and is primarily intended to give us more + breathing room for introducing new inferred array modes. + + * assembler/AbstractMacroAssembler.h: + (JSC::AbstractMacroAssembler::JumpList::jumps): + * assembler/MacroAssembler.h: + (MacroAssembler): + (JSC::MacroAssembler::patchableBranch32): + * assembler/MacroAssemblerARMv7.h: + (JSC::MacroAssemblerARMv7::patchableBranch32): + (MacroAssemblerARMv7): + * dfg/DFGArrayMode.cpp: + (JSC::DFG::modeAlreadyChecked): + * dfg/DFGRepatch.cpp: + (JSC::DFG::tryCacheGetByID): + * dfg/DFGSpeculativeJIT.cpp: + (JSC::DFG::SpeculativeJIT::speculationCheck): + (JSC::DFG::SpeculativeJIT::forwardSpeculationCheck): + (JSC::DFG::SpeculativeJIT::jumpSlowForUnwantedArrayMode): + (DFG): + (JSC::DFG::SpeculativeJIT::checkArray): + (JSC::DFG::SpeculativeJIT::arrayify): + * dfg/DFGSpeculativeJIT.h: + (SpeculativeJIT): + * dfg/DFGSpeculativeJIT32_64.cpp: + (JSC::DFG::SpeculativeJIT::compile): + * dfg/DFGSpeculativeJIT64.cpp: + (JSC::DFG::SpeculativeJIT::compile): + * jit/JITInlineMethods.h: + (JSC::JIT::emitAllocateJSArray): + (JSC::JIT::chooseArrayMode): + * jit/JITPropertyAccess.cpp: + (JSC::JIT::emit_op_get_by_val): + (JSC::JIT::emitContiguousGetByVal): + (JSC::JIT::emitArrayStorageGetByVal): + (JSC::JIT::emit_op_put_by_val): + (JSC::JIT::emitContiguousPutByVal): + (JSC::JIT::emitArrayStoragePutByVal): + (JSC::JIT::privateCompilePatchGetArrayLength): + * jit/JITPropertyAccess32_64.cpp: + (JSC::JIT::emit_op_get_by_val): + (JSC::JIT::emitContiguousGetByVal): + (JSC::JIT::emitArrayStorageGetByVal): + (JSC::JIT::emit_op_put_by_val): + (JSC::JIT::emitContiguousPutByVal): + (JSC::JIT::emitArrayStoragePutByVal): + (JSC::JIT::privateCompilePatchGetArrayLength): + * llint/LowLevelInterpreter.asm: + * llint/LowLevelInterpreter32_64.asm: + * llint/LowLevelInterpreter64.asm: + * runtime/IndexingType.h: + (JSC): + (JSC::hasIndexedProperties): + (JSC::hasContiguous): + (JSC::hasFastArrayStorage): + (JSC::hasArrayStorage): + (JSC::shouldUseSlowPut): + * runtime/JSGlobalObject.cpp: + (JSC): + * runtime/StructureTransitionTable.h: + (JSC::newIndexingType): + +2012-10-14 Filip Pizlo <fpizlo@apple.com> + + DFG structure check hoisting should attempt to ignore side effects and make transformations that are sound even in their presence + https://bugs.webkit.org/show_bug.cgi?id=99262 + + Reviewed by Oliver Hunt. + + This hugely simplifies the structure check hoisting phase. It will no longer be necessary + to modify it when the effectfulness of operations changes. This also enables the hoister + to hoist effectful things in the future. + + The downside is that the hoister may end up adding strictly more checks than were present + in the original code, if the code truly has a lot of side-effects. I don't see evidence + of this happening. This patch does have some speed-ups and some slow-downs, but is + neutral in the average, and the slow-downs do not appear to have more structure checks + than ToT. + + * dfg/DFGStructureCheckHoistingPhase.cpp: + (JSC::DFG::StructureCheckHoistingPhase::run): + (JSC::DFG::StructureCheckHoistingPhase::noticeStructureCheck): + (StructureCheckHoistingPhase): + (CheckData): + (JSC::DFG::StructureCheckHoistingPhase::CheckData::CheckData): + +2012-10-14 Filip Pizlo <fpizlo@apple.com> + + Fix the build of universal binary with ARMv7s of JavaScriptCore + + * llint/LLIntOfflineAsmConfig.h: + * llint/LowLevelInterpreter.asm: + +2012-10-13 Filip Pizlo <fpizlo@apple.com> + + Array length array profiling is broken in the baseline JIT + https://bugs.webkit.org/show_bug.cgi?id=99258 + + Reviewed by Oliver Hunt. + + The code generator for array length stubs calls into + emitArrayProfilingSiteForBytecodeIndex(), which emits profiling only if + canBeOptimized() returns true. But m_canBeOptimized is only initialized during + full method compiles, so in a stub compile it may (or may not) be false, meaning + that we may, or may not, get meaningful profiling info. + + This appeared to not affect too many programs since the LLInt has good array + length array profiling. + + * jit/JIT.h: + (JSC::JIT::compilePatchGetArrayLength): + +2012-10-14 Patrick Gansterer <paroga@webkit.org> + + Build fix for WinCE after r131089. + + WinCE does not support getenv(). + + * runtime/Options.cpp: + (JSC::overrideOptionWithHeuristic): + +2012-10-12 Kangil Han <kangil.han@samsung.com> + + Fix build error on DFGSpeculativeJIT32_64.cpp + https://bugs.webkit.org/show_bug.cgi?id=99234 + + Reviewed by Anders Carlsson. + + Seems BUG 98608 causes build error on 32bit machine so fix it. + + * dfg/DFGSpeculativeJIT32_64.cpp: + (JSC::DFG::SpeculativeJIT::compile): + +2012-10-12 Filip Pizlo <fpizlo@apple.com> + + Contiguous array allocation should always be inlined + https://bugs.webkit.org/show_bug.cgi?id=98608 + + Reviewed by Oliver Hunt and Mark Hahnenberg. + + This inlines contiguous array allocation in the most obvious way possible. + + * JavaScriptCore.xcodeproj/project.pbxproj: + * assembler/MacroAssembler.h: + (JSC::MacroAssembler::branchSubPtr): + (MacroAssembler): + * assembler/MacroAssemblerX86_64.h: + (JSC::MacroAssemblerX86_64::branchSubPtr): + (MacroAssemblerX86_64): + * dfg/DFGAbstractState.cpp: + (JSC::DFG::AbstractState::execute): + * dfg/DFGCCallHelpers.h: + (JSC::DFG::CCallHelpers::setupArgumentsWithExecState): + (CCallHelpers): + * dfg/DFGCallArrayAllocatorSlowPathGenerator.h: Added. + (DFG): + (CallArrayAllocatorSlowPathGenerator): + (JSC::DFG::CallArrayAllocatorSlowPathGenerator::CallArrayAllocatorSlowPathGenerator): + (JSC::DFG::CallArrayAllocatorSlowPathGenerator::generateInternal): + (CallArrayAllocatorWithVariableSizeSlowPathGenerator): + (JSC::DFG::CallArrayAllocatorWithVariableSizeSlowPathGenerator::CallArrayAllocatorWithVariableSizeSlowPathGenerator): + (JSC::DFG::CallArrayAllocatorWithVariableSizeSlowPathGenerator::generateInternal): + * dfg/DFGSpeculativeJIT.cpp: + (JSC::DFG::SpeculativeJIT::emitAllocateJSArray): + (DFG): + (JSC::DFG::SpeculativeJIT::compileAllocatePropertyStorage): + (JSC::DFG::SpeculativeJIT::compileReallocatePropertyStorage): + * dfg/DFGSpeculativeJIT.h: + (JSC::DFG::SpeculativeJIT::callOperation): + (SpeculativeJIT): + (JSC::DFG::SpeculativeJIT::emitAllocateBasicStorage): + (JSC::DFG::SpeculativeJIT::emitAllocateBasicJSObject): + (JSC::DFG::SpeculativeJIT::emitAllocateJSFinalObject): + * dfg/DFGSpeculativeJIT32_64.cpp: + (JSC::DFG::SpeculativeJIT::compile): + * dfg/DFGSpeculativeJIT64.cpp: + (JSC::DFG::SpeculativeJIT::compile): + +2012-10-12 Mark Hahnenberg <mhahnenberg@apple.com> + + Race condition during CopyingPhase can lead to deadlock + https://bugs.webkit.org/show_bug.cgi?id=99226 + + Reviewed by Filip Pizlo. + + The main thread calls startCopying() for each of the GCThreads at the beginning of the copy phase. + It then proceeds to start copying. If copying completes before one of the GCThreads wakes up, the + main thread will set m_currentPhase back to NoPhase, the GCThread will wake up, see that there's + nothing to do, and then it will go back to sleep without ever calling CopyVisitor::doneCopying() + to return its borrowed block to the CopiedSpace. CopiedSpace::doneCopying() will then sleep forever + waiting on the block. + + The fix for this is to make sure we call CopiedSpace::doneCopying() on the main thread before we + call GCThreadSharedData::didFinishCopying(), which sets the m_currentPhase flag to NoPhase. This + way we will wait until all threads have woken up and given back their borrowed blocks before + clearing the flag. + + * heap/Heap.cpp: + (JSC::Heap::copyBackingStores): + +2012-10-12 Anders Carlsson <andersca@apple.com> + + Move macros from Parser.h to Parser.cpp + https://bugs.webkit.org/show_bug.cgi?id=99217 + + Reviewed by Andreas Kling. + + There are a bunch of macros in Parser.h that are only used in Parser.cpp. Move them to Parser.cpp + so they won't pollute the global namespace. + * parser/Parser.cpp: + * parser/Parser.h: + (JSC): + +2012-10-12 Mark Hahnenberg <mhahnenberg@apple.com> + + Another build fix after r131213 + + Added some symbol magic to placate the linker on some platforms. + + * JavaScriptCore.order: + +2012-10-12 Mark Hahnenberg <mhahnenberg@apple.com> + + Build fix after r131213 + + Removed an unused variable that was making compilers unhappy. + + * heap/GCThread.cpp: + (JSC::GCThread::GCThread): + * heap/GCThread.h: + (GCThread): + * heap/GCThreadSharedData.cpp: + (JSC::GCThreadSharedData::GCThreadSharedData): + +2012-10-09 Mark Hahnenberg <mhahnenberg@apple.com> + + Copying collection shouldn't require O(live bytes) memory overhead + https://bugs.webkit.org/show_bug.cgi?id=98792 + + Reviewed by Filip Pizlo. + + Currently our copying collection occurs simultaneously with the marking phase. We'd like + to be able to reuse CopiedBlocks as soon as they become fully evacuated, but this is not + currently possible because we don't know the liveness statistics of each old CopiedBlock + until marking/copying has already finished. Instead, we have to allocate additional memory + from the OS to use as our working set of CopiedBlocks while copying. We then return the + fully evacuated old CopiedBlocks back to the block allocator, thus giving our copying phase + an O(live bytes) overhead. + + To fix this, we should instead split the copying phase apart from the marking phase. This + way we have full liveness data for each CopiedBlock during the copying phase so that we + can reuse them the instant they become fully evacuated. With the additional liveness data + that each CopiedBlock accumulates, we can add some additional heuristics to the collector. + For example, we can calculate our global Heap fragmentation and only choose to do a copying + phase if that fragmentation exceeds some limit. As another example, we can skip copying + blocks that are already above a particular fragmentation limit, which allows older objects + to coalesce into blocks that are rarely copied. + + * JavaScriptCore.xcodeproj/project.pbxproj: + * heap/CopiedBlock.h: + (CopiedBlock): + (JSC::CopiedBlock::CopiedBlock): Added support for tracking live bytes in a CopiedBlock in a + thread-safe fashion. + (JSC::CopiedBlock::reportLiveBytes): Adds a number of live bytes to the block in a thread-safe + fashion using compare and swap. + (JSC): + (JSC::CopiedBlock::didSurviveGC): Called when a block survives a single GC without being + evacuated. This could be called for a couple reasons: (a) the block was pinned or (b) we + decided not to do any copying. A block can become pinned for a few reasons: (1) a pointer into + the block was found during the conservative scan. (2) the block was deemed full enough to + not warrant any copying. (3) The block is oversize and was found to be live. + (JSC::CopiedBlock::didEvacuateBytes): Called when some number of bytes are copied from this + block. If the number of live bytes ever hits zero, the block will return itself to the + BlockAllocator to be recycled. + (JSC::CopiedBlock::canBeRecycled): Indicates that a block has no live bytes and can be + immediately recycled. This is used for blocks that are found to have zero live bytes at the + beginning of the copying phase. + (JSC::CopiedBlock::shouldEvacuate): This function returns true if the current fragmentation + of the block is above our fragmentation threshold, and false otherwise. + (JSC::CopiedBlock::isPinned): Added an accessor for the pinned flag + (JSC::CopiedBlock::liveBytes): + * heap/CopiedSpace.cpp: + (JSC::CopiedSpace::CopiedSpace): + (JSC::CopiedSpace::doneFillingBlock): Changed so that we can exchange our filled block for a + fresh block. This avoids the situation where a thread returns its borrowed block, it's the last + borrowed block, so CopiedSpace thinks that copying has completed, and it starts doing all of the + copying phase cleanup. In actuality, the thread wanted another block after returning the current + block. So we allow the thread to atomically exchange its block for another block. + (JSC::CopiedSpace::startedCopying): Added the calculation of global Heap fragmentation to + determine if the copying phase should commence. We include the MarkedSpace in our fragmentation + calculation by assuming that the MarkedSpace is 0% fragmented since we can reuse any currently + free memory in it (i.e. we ignore any internal fragmentation in the MarkedSpace). While we're + calculating the fragmentation of CopiedSpace, we also return any free blocks we find along the + way (meaning liveBytes() == 0). + (JSC): + (JSC::CopiedSpace::doneCopying): We still have to iterate over all the blocks, regardless of + whether the copying phase took place or not so that we can reset all of the live bytes counters + and un-pin any pinned blocks. + * heap/CopiedSpace.h: + (CopiedSpace): + (JSC::CopiedSpace::shouldDoCopyPhase): + * heap/CopiedSpaceInlineMethods.h: + (JSC::CopiedSpace::recycleEvacuatedBlock): This function is distinct from recycling a borrowed block + because a borrowed block hasn't been added to the CopiedSpace yet, but an evacuated block is still + currently in CopiedSpace, so we have to make sure we properly remove all traces of the block from + CopiedSpace before returning it to BlockAllocator. + (JSC::CopiedSpace::recycleBorrowedBlock): Renamed to indicate the distinction mentioned above. + * heap/CopyVisitor.cpp: Added. + (JSC): + (JSC::CopyVisitor::CopyVisitor): + (JSC::CopyVisitor::copyFromShared): Main function for any thread participating in the copying phase. + Grabs chunks of MarkedBlocks from the shared list and copies the backing store of anybody who needs + it until there are no more chunks to copy. + * heap/CopyVisitor.h: Added. + (JSC): + (CopyVisitor): + * heap/CopyVisitorInlineMethods.h: Added. + (JSC): + (GCCopyPhaseFunctor): + (JSC::GCCopyPhaseFunctor::GCCopyPhaseFunctor): + (JSC::GCCopyPhaseFunctor::operator()): + (JSC::CopyVisitor::checkIfShouldCopy): We don't have to check shouldEvacuate() because all of those + checks are done during the marking phase. + (JSC::CopyVisitor::allocateNewSpace): + (JSC::CopyVisitor::allocateNewSpaceSlow): + (JSC::CopyVisitor::startCopying): Initialization function for a thread that is about to start copying. + (JSC::CopyVisitor::doneCopying): + (JSC::CopyVisitor::didCopy): This callback is called by an object that has just successfully copied its + backing store. It indicates to the CopiedBlock that somebody has just finished evacuating some number of + bytes from it, and, if the CopiedBlock now has no more live bytes, can be recycled immediately. + * heap/GCThread.cpp: Added. + (JSC): + (JSC::GCThread::GCThread): This is a new class that encapsulates a single thread responsible for participating + in a specific set of GC phases. Currently, that set of phases includes Mark, Copy, and Exit. Each thread + monitors a shared variable in its associated GCThreadSharedData. The main thread updates this m_currentPhase + variable as collection progresses through the various phases. Parallel marking still works exactly like it + has. In other words, the "run loop" for each of the GC threads sits above any individual phase, thus keeping + the separate phases of the collector orthogonal. + (JSC::GCThread::threadID): + (JSC::GCThread::initializeThreadID): + (JSC::GCThread::slotVisitor): + (JSC::GCThread::copyVisitor): + (JSC::GCThread::waitForNextPhase): + (JSC::GCThread::gcThreadMain): + (JSC::GCThread::gcThreadStartFunc): + * heap/GCThread.h: Added. + (JSC): + (GCThread): + * heap/GCThreadSharedData.cpp: The GCThreadSharedData now has a list of GCThread objects rather than raw + ThreadIdentifiers. + (JSC::GCThreadSharedData::resetChildren): + (JSC::GCThreadSharedData::childVisitCount): + (JSC::GCThreadSharedData::GCThreadSharedData): + (JSC::GCThreadSharedData::~GCThreadSharedData): + (JSC::GCThreadSharedData::reset): + (JSC::GCThreadSharedData::didStartMarking): Callback to let the GCThreadSharedData know that marking has + started and updates the m_currentPhase variable and notifies the GCThreads accordingly. + (JSC::GCThreadSharedData::didFinishMarking): Ditto for finishing marking. + (JSC::GCThreadSharedData::didStartCopying): Ditto for starting the copying phase. + (JSC::GCThreadSharedData::didFinishCopying): Ditto for finishing copying. + * heap/GCThreadSharedData.h: + (JSC): + (GCThreadSharedData): + (JSC::GCThreadSharedData::getNextBlocksToCopy): Atomically gets the next chunk of work for a copying thread. + * heap/Heap.cpp: + (JSC::Heap::Heap): + (JSC::Heap::markRoots): + (JSC): + (JSC::Heap::copyBackingStores): Responsible for setting up the copying phase, notifying the copying threads, + and doing any copying work if necessary. + (JSC::Heap::collect): + * heap/Heap.h: + (Heap): + (JSC): + (JSC::CopyFunctor::CopyFunctor): + (CopyFunctor): + (JSC::CopyFunctor::operator()): + * heap/IncrementalSweeper.cpp: Changed the incremental sweeper to have a reference to the list of MarkedBlocks + that need sweeping, since this now resides in the Heap so that it can be easily shared by the GCThreads. + (JSC::IncrementalSweeper::IncrementalSweeper): + (JSC::IncrementalSweeper::startSweeping): + * heap/IncrementalSweeper.h: + (JSC): + (IncrementalSweeper): + * heap/SlotVisitor.cpp: + (JSC::SlotVisitor::setup): + (JSC::SlotVisitor::drainFromShared): We no longer do any copying-related work here. + (JSC): + * heap/SlotVisitor.h: + (SlotVisitor): + * heap/SlotVisitorInlineMethods.h: + (JSC): + (JSC::SlotVisitor::copyLater): Notifies the CopiedBlock that there are some live bytes that may need + to be copied. + * runtime/Butterfly.h: + (JSC): + (Butterfly): + * runtime/ButterflyInlineMethods.h: + (JSC::Butterfly::createUninitializedDuringCollection): Uses the new CopyVisitor. + * runtime/ClassInfo.h: + (MethodTable): Added new "virtual" function copyBackingStore to method table. + (JSC): + * runtime/JSCell.cpp: + (JSC::JSCell::copyBackingStore): Default implementation that does nothing. + (JSC): + * runtime/JSCell.h: + (JSC): + (JSCell): + * runtime/JSObject.cpp: + (JSC::JSObject::copyButterfly): Does the actual copying of the butterfly. + (JSC): + (JSC::JSObject::visitButterfly): Calls copyLater for the butterfly. + (JSC::JSObject::copyBackingStore): + * runtime/JSObject.h: + (JSObject): + (JSC::JSCell::methodTable): + (JSC::JSCell::inherits): + * runtime/Options.h: Added two new constants, minHeapUtilization and minCopiedBlockUtilization, + to govern the amount of fragmentation we allow before doing copying. + (JSC): + +2012-10-12 Filip Pizlo <fpizlo@apple.com> + + DFG array allocation calls should not return an encoded JSValue + https://bugs.webkit.org/show_bug.cgi?id=99196 + + Reviewed by Mark Hahnenberg. + + The array allocation operations now return a pointer instead. This makes it + easier to share code between 32-bit and 64-bit. + + * dfg/DFGOperations.cpp: + * dfg/DFGOperations.h: + * dfg/DFGSpeculativeJIT.h: + (JSC::DFG::SpeculativeJIT::callOperation): + * dfg/DFGSpeculativeJIT32_64.cpp: + (JSC::DFG::SpeculativeJIT::compile): + +2012-10-01 Jer Noble <jer.noble@apple.com> + + Enable ENCRYPTED_MEDIA support on Mac. + https://bugs.webkit.org/show_bug.cgi?id=98044 + + Reviewed by Anders Carlsson. + + Enable the ENCRYPTED_MEDIA flag. + + * Configurations/FeatureDefines.xcconfig: + +2012-10-12 Filip Pizlo <fpizlo@apple.com> + + Unreviewed. It should be possible to build JSC on ARMv7. + + * assembler/MacroAssemblerARMv7.h: + (JSC::MacroAssemblerARMv7::patchableBranchPtr): + +2012-10-11 Mark Hahnenberg <mhahnenberg@apple.com> + + BlockAllocator should use regions as its VM allocation abstraction + https://bugs.webkit.org/show_bug.cgi?id=99107 + + Reviewed by Geoffrey Garen. + + Currently the BlockAllocator allocates a single block at a time directly from the OS. Our block + allocations are on the large-ish side (64 KB) to amortize across many allocations the expense of + mapping new virtual memory from the OS. These large blocks are then shared between the MarkedSpace + and the CopiedSpace. This design makes it difficult to vary the size of the blocks in different + parts of the Heap while still allowing us to amortize the VM allocation costs. + + We should redesign the BlockAllocator so that it has a layer of indirection between blocks that are + used by the allocator/collector and our primary unit of VM allocation from the OS. In particular, + the BlockAllocator should allocate Regions of virtual memory from the OS, which are then subdivided + into one or more Blocks to be used in our custom allocators. This design has the following nice properties: + + 1) We can remove the knowledge of PageAllocationAligned from HeapBlocks. Each HeapBlock will now + only know what Region it belongs to. The Region maintains all the metadata for how to allocate + and deallocate virtual memory from the OS. + + 2) We can easily allocate in larger chunks than we need to satisfy a particular request for a Block. + We can then continue to amortize our VM allocation costs while allowing for smaller block sizes, + which should increase locality in the mutator when allocating, lazy sweeping, etc. + + 3) By encapsulating the logic of where our memory comes from inside of the Region class, we can more + easily transition over to allocating VM from a specific range of pre-reserved address space. This + will be a necessary step along the way to 32-bit pointers. + + This particular patch will not change the size of MarkedBlocks or CopiedBlocks, nor will it change how + much VM we allocate per failed Block request. It only sets up the data structures that we need to make + these changes in future patches. + + Most of the changes in this patch relate to the addition of the Region class to be used by the + BlockAllocator and the threading of changes made to BlockAllocator's interface through to the call sites. + + * heap/BlockAllocator.cpp: The BlockAllocator now has three lists that track the three disjoint sets of + Regions that it cares about: empty regions, partially full regions, and completely full regions. + Empty regions have no blocks currently in use and can be freed immediately if the freeing thread + determines they should be. Partial regions have some blocks used, but aren't completely in use yet. + These regions are preferred for recycling before empty regions to mitigate fragmentation within regions. + Completely full regions are no longer able to be used for allocations. Regions move between these + three lists as they are created and their constituent blocks are allocated and deallocated. + (JSC::BlockAllocator::BlockAllocator): + (JSC::BlockAllocator::~BlockAllocator): + (JSC::BlockAllocator::releaseFreeRegions): + (JSC::BlockAllocator::waitForRelativeTimeWhileHoldingLock): + (JSC::BlockAllocator::waitForRelativeTime): + (JSC::BlockAllocator::blockFreeingThreadMain): + * heap/BlockAllocator.h: + (JSC): + (DeadBlock): + (JSC::DeadBlock::DeadBlock): + (Region): + (JSC::Region::blockSize): + (JSC::Region::isFull): + (JSC::Region::isEmpty): + (JSC::Region::create): This function is responsible for doing the actual VM allocation. This should be the + only function in the entire JSC object runtime that calls out the OS for virtual memory allocation. + (JSC::Region::Region): + (JSC::Region::~Region): + (JSC::Region::allocate): + (JSC::Region::deallocate): + (BlockAllocator): + (JSC::BlockAllocator::tryAllocateFromRegion): Helper function that encapsulates checking a particular list + of regions for a free block. + (JSC::BlockAllocator::allocate): + (JSC::BlockAllocator::allocateCustomSize): This function is responsible for allocating one-off custom size + regions for use in oversize allocations in both the MarkedSpace and the CopiedSpace. These regions are not + tracked by the BlockAllocator. The only pointer to them is in the HeapBlock that is returned. These regions + contain exactly one block. + (JSC::BlockAllocator::deallocate): + (JSC::BlockAllocator::deallocateCustomSize): This function is responsible for deallocating one-off custom size + regions. The regions are deallocated back to the OS eagerly. + * heap/CopiedBlock.h: Re-worked CopiedBlocks to use Regions instead of PageAllocationAligned. + (CopiedBlock): + (JSC::CopiedBlock::createNoZeroFill): + (JSC::CopiedBlock::create): + (JSC::CopiedBlock::CopiedBlock): + (JSC::CopiedBlock::payloadEnd): + (JSC::CopiedBlock::capacity): + * heap/CopiedSpace.cpp: + (JSC::CopiedSpace::~CopiedSpace): + (JSC::CopiedSpace::tryAllocateOversize): + (JSC::CopiedSpace::tryReallocateOversize): + (JSC::CopiedSpace::doneCopying): + * heap/CopiedSpaceInlineMethods.h: + (JSC::CopiedSpace::allocateBlockForCopyingPhase): + (JSC::CopiedSpace::allocateBlock): + * heap/HeapBlock.h: + (JSC::HeapBlock::destroy): + (JSC::HeapBlock::HeapBlock): + (JSC::HeapBlock::region): + (HeapBlock): + * heap/MarkedAllocator.cpp: + (JSC::MarkedAllocator::allocateBlock): + * heap/MarkedBlock.cpp: + (JSC::MarkedBlock::create): + (JSC::MarkedBlock::MarkedBlock): + * heap/MarkedBlock.h: + (JSC::MarkedBlock::capacity): + * heap/MarkedSpace.cpp: + (JSC::MarkedSpace::freeBlock): + +2012-10-11 Filip Pizlo <fpizlo@apple.com> + + UInt32ToNumber and OSR exit should be aware of copy propagation and correctly recover both versions of a variable that was subject to a UInt32ToNumber cast + https://bugs.webkit.org/show_bug.cgi?id=99100 + <rdar://problem/12480955> + + Reviewed by Michael Saboff and Mark Hahnenberg. + + Fixed by forcing UInt32ToNumber to use a different register. This "undoes" the copy propagation that we + would have been doing, since it has no performance effect in this case and has the benefit of making the + OSR exit compiler a lot simpler. + + * dfg/DFGSpeculativeJIT.cpp: + (JSC::DFG::SpeculativeJIT::compileUInt32ToNumber): + +2012-10-11 Geoffrey Garen <ggaren@apple.com> + + Removed some more static assumptions about inline object capacity + https://bugs.webkit.org/show_bug.cgi?id=98603 + + Reviewed by Filip Pizlo. + + * dfg/DFGSpeculativeJIT.h: + (JSC::DFG::SpeculativeJIT::emitAllocateBasicJSObject): Use JSObject::allocationSize() + for a little more flexibility. We still pass it a constant inline capacity + because the JIT doesn't have a strategy for selecting a size class based + on non-constant capacity yet. "INLINE_STORAGE_CAPACITY" is a marker for + code that makes static assumptions about object size. + + * jit/JITInlineMethods.h: + (JSC::JIT::emitAllocateBasicJSObject): + * llint/LLIntData.cpp: + (JSC::LLInt::Data::performAssertions): + * llint/LowLevelInterpreter32_64.asm: + * llint/LowLevelInterpreter64.asm: Ditto for the rest of our many execution engines. + + * runtime/JSObject.h: + (JSC::JSObject::allocationSize): + (JSC::JSFinalObject::finishCreation): + (JSC::JSFinalObject::create): New helper function for computing object + size dynamically, since we plan to have objects of different sizes. + + (JSC::JSFinalObject::JSFinalObject): Note that our m_inlineStorage used + to auto-generate an implicit C++ constructor with default null initialization. + This memory is not observed in its uninitialized state, and our LLInt and + JIT allocators do not initialize it, so I did not add any explicit code + to do so, now that the implicit code is gone. + + (JSC::JSObject::offsetOfInlineStorage): Changed the math here to match + inlineStorageUnsafe(), since we can rely on an explicit data member anymore. + +2012-10-11 Geoffrey Garen <ggaren@apple.com> + + Enable RUNTIME_HEURISTICS all the time, for easier testing + https://bugs.webkit.org/show_bug.cgi?id=99090 + + Reviewed by Filip Pizlo. + + I find myself using this a lot, and there doesn't seem to be an obvious + reason to compile it out, since it only runs once at startup. + + * runtime/Options.cpp: + (JSC::overrideOptionWithHeuristic): + (JSC::Options::initialize): + * runtime/Options.h: Removed the #ifdef. + +2012-10-11 Geoffrey Garen <ggaren@apple.com> + + Removed ASSERT_CLASS_FITS_IN_CELL + https://bugs.webkit.org/show_bug.cgi?id=97634 + + Reviewed by Mark Hahnenberg. + + Our collector now supports arbitrarily sized objects, so the ASSERT is not needed. + + * API/JSCallbackFunction.cpp: + * API/JSCallbackObject.cpp: + * heap/MarkedSpace.h: + * jsc.cpp: + * runtime/Arguments.cpp: + * runtime/ArrayConstructor.cpp: + * runtime/ArrayPrototype.cpp: + * runtime/BooleanConstructor.cpp: + * runtime/BooleanObject.cpp: + * runtime/BooleanPrototype.cpp: + * runtime/DateConstructor.cpp: + * runtime/DatePrototype.cpp: + * runtime/Error.cpp: + * runtime/ErrorConstructor.cpp: + * runtime/ErrorPrototype.cpp: + * runtime/FunctionConstructor.cpp: + * runtime/FunctionPrototype.cpp: + * runtime/InternalFunction.cpp: + * runtime/JSActivation.cpp: + * runtime/JSArray.cpp: + * runtime/JSBoundFunction.cpp: + * runtime/JSFunction.cpp: + * runtime/JSGlobalObject.cpp: + * runtime/JSGlobalThis.cpp: + * runtime/JSNameScope.cpp: + * runtime/JSNotAnObject.cpp: + * runtime/JSONObject.cpp: + * runtime/JSObject.cpp: + * runtime/JSPropertyNameIterator.cpp: + * runtime/JSScope.cpp: + * runtime/JSWithScope.cpp: + * runtime/JSWrapperObject.cpp: + * runtime/MathObject.cpp: + * runtime/NameConstructor.cpp: + * runtime/NamePrototype.cpp: + * runtime/NativeErrorConstructor.cpp: + * runtime/NativeErrorPrototype.cpp: + * runtime/NumberConstructor.cpp: + * runtime/NumberObject.cpp: + * runtime/NumberPrototype.cpp: + * runtime/ObjectConstructor.cpp: + * runtime/ObjectPrototype.cpp: + * runtime/RegExpConstructor.cpp: + * runtime/RegExpMatchesArray.cpp: + * runtime/RegExpObject.cpp: + * runtime/RegExpPrototype.cpp: + * runtime/StringConstructor.cpp: + * runtime/StringObject.cpp: + * runtime/StringPrototype.cpp: + * testRegExp.cpp: Removed the ASSERT. + +2012-10-11 Filip Pizlo <fpizlo@apple.com> + + DFG should inline code blocks that use new_array_buffer + https://bugs.webkit.org/show_bug.cgi?id=98996 + + Reviewed by Geoffrey Garen. + + This adds plumbing to drop in constant buffers from the inlinees to the inliner. + It's smart about not duplicating buffers needlessly but doesn't try to completely + hash-cons them, either. + + * bytecode/CodeBlock.h: + (JSC::CodeBlock::numberOfConstantBuffers): + (JSC::CodeBlock::addConstantBuffer): + (JSC::CodeBlock::constantBufferAsVector): + (JSC::CodeBlock::constantBuffer): + * dfg/DFGAbstractState.cpp: + (JSC::DFG::AbstractState::execute): + * dfg/DFGByteCodeParser.cpp: + (ConstantBufferKey): + (JSC::DFG::ConstantBufferKey::ConstantBufferKey): + (JSC::DFG::ConstantBufferKey::operator==): + (JSC::DFG::ConstantBufferKey::hash): + (JSC::DFG::ConstantBufferKey::isHashTableDeletedValue): + (JSC::DFG::ConstantBufferKey::codeBlock): + (JSC::DFG::ConstantBufferKey::index): + (DFG): + (JSC::DFG::ConstantBufferKeyHash::hash): + (JSC::DFG::ConstantBufferKeyHash::equal): + (ConstantBufferKeyHash): + (WTF): + (ByteCodeParser): + (InlineStackEntry): + (JSC::DFG::ByteCodeParser::parseBlock): + (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-10-10 Zoltan Horvath <zoltan@webkit.org> + + Pageload tests should measure memory usage + https://bugs.webkit.org/show_bug.cgi?id=93958 + + Reviewed by Ryosuke Niwa. + + Add JS Heap and Heap memory measurement to PageLoad tests. + + * heap/HeapStatistics.cpp: + (JSC::HeapStatistics::usedJSHeap): Add new private function to expose the used JS Heap size. + (JSC): + * heap/HeapStatistics.h: + (HeapStatistics): Add new private function to expose the used JS Heap size. + +2012-10-10 Balazs Kilvady <kilvadyb@homejinni.com> + + RegisterFile to JSStack rename fix for a struct member. + + Compilation problem in debug build on MIPS + https://bugs.webkit.org/show_bug.cgi?id=98808 + + Reviewed by Alexey Proskuryakov. + + In ASSERT conditions structure field name "registerFile" was replaced + with type name "JSStack" and it should be "stack". + + * jit/JITStubs.cpp: + (JSC::JITThunks::JITThunks): structure member name fix. + +2012-10-10 Michael Saboff <msaboff@apple.com> + + After r130344, OpaqueJSString::string() shouldn't directly return the wrapped String + https://bugs.webkit.org/show_bug.cgi?id=98801 + + Reviewed by Geoffrey Garen. + + Return a copy of the wrapped String so that the wrapped string cannot be turned into + an Identifier. + + * API/OpaqueJSString.cpp: + (OpaqueJSString::string): + * API/OpaqueJSString.h: + (OpaqueJSString): + +2012-10-10 Peter Gal <galpeter@inf.u-szeged.hu> + + Add moveDoubleToInts and moveIntsToDouble to MacroAssemblerARM + https://bugs.webkit.org/show_bug.cgi?id=98855 + + Reviewed by Filip Pizlo. + + Implement the missing moveDoubleToInts and moveIntsToDouble + methods in the MacroAssemblerARM after r130839. + + * assembler/MacroAssemblerARM.h: + (JSC::MacroAssemblerARM::moveDoubleToInts): + (MacroAssemblerARM): + (JSC::MacroAssemblerARM::moveIntsToDouble): + +2012-10-09 Filip Pizlo <fpizlo@apple.com> + + Typed arrays should not be 20x slower in the baseline JIT than in the DFG JIT + https://bugs.webkit.org/show_bug.cgi?id=98605 + + Reviewed by Oliver Hunt and Gavin Barraclough. + + This adds typed array get_by_val/put_by_val patching to the baseline JIT. It's + a big (~40%) win on benchmarks that have trouble staying in the DFG JIT. Even + if we fix those benchmarks, this functionality gives us the insurance that we + typically desire with all speculative optimizations: even if we bail to + baseline, we're still reasonably performant. + + * CMakeLists.txt: + * GNUmakefile.list.am: + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: + * JavaScriptCore.xcodeproj/project.pbxproj: + * Target.pri: + * assembler/MacroAssembler.cpp: Added. + (JSC): + * assembler/MacroAssembler.h: + (MacroAssembler): + (JSC::MacroAssembler::patchableBranchPtr): + * assembler/MacroAssemblerARMv7.h: + (MacroAssemblerARMv7): + (JSC::MacroAssemblerARMv7::moveDoubleToInts): + (JSC::MacroAssemblerARMv7::moveIntsToDouble): + (JSC::MacroAssemblerARMv7::patchableBranchPtr): + * assembler/MacroAssemblerX86.h: + (MacroAssemblerX86): + (JSC::MacroAssemblerX86::moveDoubleToInts): + (JSC::MacroAssemblerX86::moveIntsToDouble): + * bytecode/ByValInfo.h: + (JSC::hasOptimizableIndexingForClassInfo): + (JSC): + (JSC::hasOptimizableIndexing): + (JSC::jitArrayModeForClassInfo): + (JSC::jitArrayModeForStructure): + (JSC::ByValInfo::ByValInfo): + (ByValInfo): + * dfg/DFGAssemblyHelpers.cpp: + (DFG): + * dfg/DFGAssemblyHelpers.h: + (AssemblyHelpers): + (JSC::DFG::AssemblyHelpers::boxDouble): + (JSC::DFG::AssemblyHelpers::unboxDouble): + * dfg/DFGSpeculativeJIT.cpp: + (JSC::DFG::SpeculativeJIT::compileGetByValOnIntTypedArray): + (JSC::DFG::SpeculativeJIT::compilePutByValForIntTypedArray): + * dfg/DFGSpeculativeJIT.h: + (SpeculativeJIT): + * jit/JIT.h: + (JIT): + * jit/JITPropertyAccess.cpp: + (JSC::JIT::emit_op_get_by_val): + (JSC::JIT::emit_op_put_by_val): + (JSC::JIT::privateCompileGetByVal): + (JSC::JIT::privateCompilePutByVal): + (JSC::JIT::emitIntTypedArrayGetByVal): + (JSC): + (JSC::JIT::emitFloatTypedArrayGetByVal): + (JSC::JIT::emitIntTypedArrayPutByVal): + (JSC::JIT::emitFloatTypedArrayPutByVal): + * jit/JITPropertyAccess32_64.cpp: + (JSC::JIT::emit_op_get_by_val): + (JSC::JIT::emit_op_put_by_val): + * jit/JITStubs.cpp: + (JSC::DEFINE_STUB_FUNCTION): + * runtime/JSCell.h: + * runtime/JSGlobalData.h: + (JSGlobalData): + (JSC::JSGlobalData::typedArrayDescriptor): + * runtime/TypedArrayDescriptor.h: Added. + (JSC): + (JSC::TypedArrayDescriptor::TypedArrayDescriptor): + (TypedArrayDescriptor): + +2012-10-09 Michael Saboff <msaboff@apple.com> + + Add tests to testapi for null OpaqueJSStrings + https://bugs.webkit.org/show_bug.cgi?id=98805 + + Reviewed by Geoffrey Garen. + + Added tests that check that OpaqueJSString, which is wrapped via JSStringRef, properly returns + null strings and that a null string in a JSStringRef will return a NULL JSChar* and 0 length + via the JSStringGetCharactersPtr() and JSStringGetLength() APIs respectively. Added a check that + JSValueMakeFromJSONString() properly handles a null string as well. + + * API/tests/testapi.c: + (main): + +2012-10-09 Jian Li <jianli@chromium.org> + + Update the CSS property used to support draggable regions. + https://bugs.webkit.org/show_bug.cgi?id=97156 + + Reviewed by Adam Barth. + + The CSS property to support draggable regions, guarded under + WIDGET_REGION is now disabled from Mac WebKit, in order not to cause + confusion with DASHBOARD_SUPPORT feature. + + * Configurations/FeatureDefines.xcconfig: Disable WIDGET_REGION feature. + +2012-10-09 Filip Pizlo <fpizlo@apple.com> + + Unreviewed, adding forgotten files. + + * bytecode/ByValInfo.h: Added. + (JSC): + (JSC::isOptimizableIndexingType): + (JSC::jitArrayModeForIndexingType): + (JSC::ByValInfo::ByValInfo): + (ByValInfo): + (JSC::getByValInfoBytecodeIndex): + * runtime/IndexingType.cpp: Added. + (JSC): + (JSC::indexingTypeToString): + +2012-10-08 Filip Pizlo <fpizlo@apple.com> + + JSC should infer when indexed storage is contiguous, and optimize for it + https://bugs.webkit.org/show_bug.cgi?id=97288 + + Reviewed by Mark Hahnenberg. + + This introduces a new kind of indexed property storage called Contiguous, + which has the following properties: + + - No header bits beyond IndexedHeader. This results in a 16 byte reduction + in memory usage per array versus an ArrayStorage array. It also means + that the total memory usage for an empty array is now just 3 * 8 on both + 32-bit and 64-bit. Of that, only 8 bytes are array-specific; the rest is + our standard object header overhead. + + - No need for hole checks on store. This results in a ~4% speed-up on + Kraken and a ~1% speed-up on V8v7. + + - publicLength <= vectorLength. This means that doing new Array(blah) + immediately allocates room for blah elements. + + - No sparse map or index bias. + + If you ever do things to an array that would require publicLength > + vectorLength, a sparse map, or index bias, then we switch to ArrayStorage + mode. This seems to never happen in any benchmark we track, and is unlikely + to happen very frequently on any website. + + * CMakeLists.txt: + * GNUmakefile.list.am: + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: + * JavaScriptCore.xcodeproj/project.pbxproj: + * Target.pri: + * assembler/AbstractMacroAssembler.h: + (JSC::AbstractMacroAssembler::JumpList::append): + * assembler/MacroAssembler.h: + (MacroAssembler): + (JSC::MacroAssembler::patchableBranchTest32): + * bytecode/ByValInfo.h: Added. + (JSC): + (JSC::isOptimizableIndexingType): + (JSC::jitArrayModeForIndexingType): + (JSC::ByValInfo::ByValInfo): + (ByValInfo): + (JSC::getByValInfoBytecodeIndex): + * bytecode/CodeBlock.h: + (CodeBlock): + (JSC::CodeBlock::getByValInfo): + (JSC::CodeBlock::setNumberOfByValInfos): + (JSC::CodeBlock::numberOfByValInfos): + (JSC::CodeBlock::byValInfo): + * bytecode/SamplingTool.h: + * 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::modeUsesButterfly): + (JSC::DFG::modeIsJSArray): + (JSC::DFG::isInBoundsAccess): + (JSC::DFG::mayStoreToTail): + (JSC::DFG::mayStoreToHole): + (JSC::DFG::modeIsPolymorphic): + (JSC::DFG::polymorphicIncludesContiguous): + (JSC::DFG::polymorphicIncludesArrayStorage): + (JSC::DFG::canCSEStorage): + (JSC::DFG::modeSupportsLength): + (JSC::DFG::benefitsFromStructureCheck): + (JSC::DFG::isEffectful): + * dfg/DFGByteCodeParser.cpp: + (JSC::DFG::ByteCodeParser::handleIntrinsic): + * dfg/DFGCSEPhase.cpp: + (JSC::DFG::CSEPhase::getArrayLengthElimination): + (JSC::DFG::CSEPhase::getByValLoadElimination): + (JSC::DFG::CSEPhase::performNodeCSE): + * dfg/DFGFixupPhase.cpp: + (JSC::DFG::FixupPhase::fixupNode): + (JSC::DFG::FixupPhase::checkArray): + (JSC::DFG::FixupPhase::blessArrayOperation): + * dfg/DFGGraph.h: + (JSC::DFG::Graph::byValIsPure): + * dfg/DFGOperations.cpp: + * dfg/DFGOperations.h: + * dfg/DFGRepatch.cpp: + (JSC::DFG::tryCacheGetByID): + * dfg/DFGSpeculativeJIT.cpp: + (JSC::DFG::SpeculativeJIT::checkArray): + (JSC::DFG::SpeculativeJIT::arrayify): + (JSC::DFG::SpeculativeJIT::compileGetArrayLength): + (JSC::DFG::SpeculativeJIT::temporaryRegisterForPutByVal): + (DFG): + * dfg/DFGSpeculativeJIT.h: + (DFG): + (JSC::DFG::SpeculativeJIT::callOperation): + (SpeculativeJIT): + (JSC::DFG::SpeculativeJIT::putByValWillNeedExtraRegister): + (JSC::DFG::SpeculativeJIT::temporaryRegisterForPutByVal): + * dfg/DFGSpeculativeJIT32_64.cpp: + (JSC::DFG::SpeculativeJIT::compileContiguousGetByVal): + (DFG): + (JSC::DFG::SpeculativeJIT::compileArrayStorageGetByVal): + (JSC::DFG::SpeculativeJIT::compileContiguousPutByVal): + (JSC::DFG::SpeculativeJIT::compileArrayStoragePutByVal): + (JSC::DFG::SpeculativeJIT::compile): + * dfg/DFGSpeculativeJIT64.cpp: + (JSC::DFG::SpeculativeJIT::compileContiguousGetByVal): + (DFG): + (JSC::DFG::SpeculativeJIT::compileArrayStorageGetByVal): + (JSC::DFG::SpeculativeJIT::compileContiguousPutByVal): + (JSC::DFG::SpeculativeJIT::compileArrayStoragePutByVal): + (JSC::DFG::SpeculativeJIT::compile): + * interpreter/Interpreter.cpp: + (SamplingScope): + (JSC::SamplingScope::SamplingScope): + (JSC::SamplingScope::~SamplingScope): + (JSC): + (JSC::Interpreter::execute): + * jit/JIT.cpp: + (JSC::JIT::privateCompileSlowCases): + (JSC::JIT::privateCompile): + * jit/JIT.h: + (JSC::ByValCompilationInfo::ByValCompilationInfo): + (ByValCompilationInfo): + (JSC): + (JIT): + (JSC::JIT::compileGetByVal): + (JSC::JIT::compilePutByVal): + * jit/JITInlineMethods.h: + (JSC::JIT::emitAllocateJSArray): + (JSC::JIT::emitArrayProfileStoreToHoleSpecialCase): + (JSC): + (JSC::arrayProfileSaw): + (JSC::JIT::chooseArrayMode): + * jit/JITOpcodes.cpp: + (JSC::JIT::emitSlow_op_get_argument_by_val): + (JSC::JIT::emit_op_new_array): + (JSC::JIT::emitSlow_op_new_array): + * jit/JITOpcodes32_64.cpp: + (JSC::JIT::emitSlow_op_get_argument_by_val): + * jit/JITPropertyAccess.cpp: + (JSC::JIT::emit_op_get_by_val): + (JSC): + (JSC::JIT::emitContiguousGetByVal): + (JSC::JIT::emitArrayStorageGetByVal): + (JSC::JIT::emitSlow_op_get_by_val): + (JSC::JIT::emit_op_put_by_val): + (JSC::JIT::emitContiguousPutByVal): + (JSC::JIT::emitArrayStoragePutByVal): + (JSC::JIT::emitSlow_op_put_by_val): + (JSC::JIT::privateCompilePatchGetArrayLength): + (JSC::JIT::privateCompileGetByVal): + (JSC::JIT::privateCompilePutByVal): + * jit/JITPropertyAccess32_64.cpp: + (JSC::JIT::emit_op_get_by_val): + (JSC): + (JSC::JIT::emitContiguousGetByVal): + (JSC::JIT::emitArrayStorageGetByVal): + (JSC::JIT::emitSlow_op_get_by_val): + (JSC::JIT::emit_op_put_by_val): + (JSC::JIT::emitContiguousPutByVal): + (JSC::JIT::emitArrayStoragePutByVal): + (JSC::JIT::emitSlow_op_put_by_val): + * jit/JITStubs.cpp: + (JSC::getByVal): + (JSC): + (JSC::DEFINE_STUB_FUNCTION): + (JSC::putByVal): + * jit/JITStubs.h: + * llint/LowLevelInterpreter.asm: + * llint/LowLevelInterpreter32_64.asm: + * llint/LowLevelInterpreter64.asm: + * runtime/ArrayConventions.h: + (JSC::isDenseEnoughForVector): + * runtime/ArrayPrototype.cpp: + (JSC): + (JSC::shift): + (JSC::unshift): + (JSC::arrayProtoFuncPush): + (JSC::arrayProtoFuncShift): + (JSC::arrayProtoFuncSplice): + (JSC::arrayProtoFuncUnShift): + * runtime/Butterfly.h: + (Butterfly): + (JSC::Butterfly::fromPointer): + (JSC::Butterfly::pointer): + (JSC::Butterfly::publicLength): + (JSC::Butterfly::vectorLength): + (JSC::Butterfly::setPublicLength): + (JSC::Butterfly::setVectorLength): + (JSC::Butterfly::contiguous): + (JSC::Butterfly::fromContiguous): + * runtime/ButterflyInlineMethods.h: + (JSC::Butterfly::unshift): + (JSC::Butterfly::shift): + * runtime/IndexingHeaderInlineMethods.h: + (JSC::IndexingHeader::indexingPayloadSizeInBytes): + * runtime/IndexingType.cpp: Added. + (JSC): + (JSC::indexingTypeToString): + * runtime/IndexingType.h: + (JSC): + (JSC::hasContiguous): + * runtime/JSArray.cpp: + (JSC::JSArray::setLengthWithArrayStorage): + (JSC::JSArray::setLength): + (JSC): + (JSC::JSArray::pop): + (JSC::JSArray::push): + (JSC::JSArray::shiftCountWithArrayStorage): + (JSC::JSArray::shiftCountWithAnyIndexingType): + (JSC::JSArray::unshiftCountWithArrayStorage): + (JSC::JSArray::unshiftCountWithAnyIndexingType): + (JSC::JSArray::sortNumericVector): + (JSC::JSArray::sortNumeric): + (JSC::JSArray::sortCompactedVector): + (JSC::JSArray::sort): + (JSC::JSArray::sortVector): + (JSC::JSArray::fillArgList): + (JSC::JSArray::copyToArguments): + (JSC::JSArray::compactForSorting): + * runtime/JSArray.h: + (JSC::JSArray::shiftCountForShift): + (JSC::JSArray::shiftCountForSplice): + (JSArray): + (JSC::JSArray::shiftCount): + (JSC::JSArray::unshiftCountForShift): + (JSC::JSArray::unshiftCountForSplice): + (JSC::JSArray::unshiftCount): + (JSC::JSArray::isLengthWritable): + (JSC::createContiguousArrayButterfly): + (JSC): + (JSC::JSArray::create): + (JSC::JSArray::tryCreateUninitialized): + * runtime/JSGlobalObject.cpp: + (JSC::JSGlobalObject::reset): + (JSC): + (JSC::JSGlobalObject::haveABadTime): + (JSC::JSGlobalObject::visitChildren): + * runtime/JSGlobalObject.h: + (JSGlobalObject): + (JSC::JSGlobalObject::arrayStructureWithArrayStorage): + (JSC::JSGlobalObject::addressOfArrayStructureWithArrayStorage): + (JSC::constructEmptyArray): + * runtime/JSObject.cpp: + (JSC::JSObject::visitButterfly): + (JSC::JSObject::getOwnPropertySlotByIndex): + (JSC::JSObject::putByIndex): + (JSC::JSObject::enterDictionaryIndexingMode): + (JSC::JSObject::createInitialContiguous): + (JSC): + (JSC::JSObject::createArrayStorage): + (JSC::JSObject::convertContiguousToArrayStorage): + (JSC::JSObject::ensureContiguousSlow): + (JSC::JSObject::ensureArrayStorageSlow): + (JSC::JSObject::ensureIndexedStorageSlow): + (JSC::JSObject::ensureArrayStorageExistsAndEnterDictionaryIndexingMode): + (JSC::JSObject::switchToSlowPutArrayStorage): + (JSC::JSObject::setPrototype): + (JSC::JSObject::deletePropertyByIndex): + (JSC::JSObject::getOwnPropertyNames): + (JSC::JSObject::defineOwnIndexedProperty): + (JSC::JSObject::putByIndexBeyondVectorLengthContiguousWithoutAttributes): + (JSC::JSObject::putByIndexBeyondVectorLength): + (JSC::JSObject::putDirectIndexBeyondVectorLengthWithArrayStorage): + (JSC::JSObject::putDirectIndexBeyondVectorLength): + (JSC::JSObject::getNewVectorLength): + (JSC::JSObject::countElementsInContiguous): + (JSC::JSObject::increaseVectorLength): + (JSC::JSObject::ensureContiguousLengthSlow): + (JSC::JSObject::getOwnPropertyDescriptor): + * runtime/JSObject.h: + (JSC::JSObject::getArrayLength): + (JSC::JSObject::getVectorLength): + (JSC::JSObject::canGetIndexQuickly): + (JSC::JSObject::getIndexQuickly): + (JSC::JSObject::tryGetIndexQuickly): + (JSC::JSObject::canSetIndexQuickly): + (JSC::JSObject::canSetIndexQuicklyForPutDirect): + (JSC::JSObject::setIndexQuickly): + (JSC::JSObject::initializeIndex): + (JSC::JSObject::hasSparseMap): + (JSC::JSObject::inSparseIndexingMode): + (JSObject): + (JSC::JSObject::ensureContiguous): + (JSC::JSObject::ensureIndexedStorage): + (JSC::JSObject::ensureContiguousLength): + (JSC::JSObject::indexingData): + (JSC::JSObject::relevantLength): + * runtime/JSValue.cpp: + (JSC::JSValue::description): + * runtime/Options.cpp: + (JSC::Options::initialize): + * runtime/Structure.cpp: + (JSC::Structure::needsSlowPutIndexing): + (JSC): + (JSC::Structure::suggestedArrayStorageTransition): + * runtime/Structure.h: + (Structure): + * runtime/StructureTransitionTable.h: + (JSC::newIndexingType): + +2012-10-09 Michael Saboff <msaboff@apple.com> + + After r130344, OpaqueJSString::identifier() adds wrapped String to identifier table + https://bugs.webkit.org/show_bug.cgi?id=98693 + REGRESSION (r130344): Install failed in Install Environment + <rdar://problem/12450118> + + Reviewed by Mark Rowe. + + Use Identifier(LChar*, length) or Identifier(UChar*, length) constructors so that we don't + add the String instance in the OpaqueJSString to any identifier tables. + + * API/OpaqueJSString.cpp: + (OpaqueJSString::identifier): + +2012-10-08 Mark Lam <mark.lam@apple.com> + + Renamed RegisterFile to JSStack, and removed prototype of the + previously deleted Interpreter::privateExecute(). + https://bugs.webkit.org/show_bug.cgi?id=98717. + + Reviewed by Filip Pizlo. + + * CMakeLists.txt: + * GNUmakefile.list.am: + * JavaScriptCore.order: + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: + * JavaScriptCore.xcodeproj/project.pbxproj: + * Target.pri: + * bytecode/BytecodeConventions.h: + * bytecode/CodeBlock.cpp: + (JSC::CodeBlock::nameForRegister): + * bytecode/CodeBlock.h: + (CodeBlock): + * bytecode/ValueRecovery.h: + (JSC::ValueRecovery::alreadyInJSStack): + (JSC::ValueRecovery::alreadyInJSStackAsUnboxedInt32): + (JSC::ValueRecovery::alreadyInJSStackAsUnboxedCell): + (JSC::ValueRecovery::alreadyInJSStackAsUnboxedBoolean): + (JSC::ValueRecovery::alreadyInJSStackAsUnboxedDouble): + (JSC::ValueRecovery::displacedInJSStack): + (JSC::ValueRecovery::isAlreadyInJSStack): + (JSC::ValueRecovery::virtualRegister): + (JSC::ValueRecovery::dump): + * bytecompiler/BytecodeGenerator.cpp: + (JSC::BytecodeGenerator::resolveCallee): + (JSC::BytecodeGenerator::emitCall): + (JSC::BytecodeGenerator::emitConstruct): + * bytecompiler/BytecodeGenerator.h: + (JSC::BytecodeGenerator::registerFor): + * dfg/DFGAbstractState.h: + (AbstractState): + * dfg/DFGAssemblyHelpers.h: + (JSC::DFG::AssemblyHelpers::emitGetFromCallFrameHeaderPtr): + (JSC::DFG::AssemblyHelpers::emitPutToCallFrameHeader): + (JSC::DFG::AssemblyHelpers::emitPutImmediateToCallFrameHeader): + * dfg/DFGByteCodeParser.cpp: + (JSC::DFG::ByteCodeParser::getDirect): + (JSC::DFG::ByteCodeParser::findArgumentPositionForLocal): + (JSC::DFG::ByteCodeParser::addCall): + (JSC::DFG::ByteCodeParser::InlineStackEntry::remapOperand): + (JSC::DFG::ByteCodeParser::handleInlining): + (JSC::DFG::ByteCodeParser::parseBlock): + (JSC::DFG::ByteCodeParser::InlineStackEntry::InlineStackEntry): + * dfg/DFGGenerationInfo.h: + (GenerationInfo): + (JSC::DFG::GenerationInfo::needsSpill): + * dfg/DFGGraph.h: + * dfg/DFGJITCompiler.cpp: + (JSC::DFG::JITCompiler::compileEntry): + (JSC::DFG::JITCompiler::compileFunction): + * dfg/DFGJITCompiler.h: + (JSC::DFG::JITCompiler::beginCall): + * dfg/DFGOSREntry.cpp: + (JSC::DFG::prepareOSREntry): + * dfg/DFGOSRExitCompiler32_64.cpp: + (JSC::DFG::OSRExitCompiler::compileExit): + * dfg/DFGOSRExitCompiler64.cpp: + (JSC::DFG::OSRExitCompiler::compileExit): + * dfg/DFGRepatch.cpp: + (JSC::DFG::tryBuildGetByIDList): + * dfg/DFGSpeculativeJIT.cpp: + (JSC::DFG::SpeculativeJIT::compile): + (JSC::DFG::SpeculativeJIT::checkArgumentTypes): + (JSC::DFG::SpeculativeJIT::computeValueRecoveryFor): + * dfg/DFGSpeculativeJIT.h: + (SpeculativeJIT): + (JSC::DFG::SpeculativeJIT::spill): + * dfg/DFGSpeculativeJIT32_64.cpp: + (JSC::DFG::SpeculativeJIT::emitCall): + (JSC::DFG::SpeculativeJIT::compile): + * dfg/DFGSpeculativeJIT64.cpp: + (JSC::DFG::SpeculativeJIT::fillInteger): + (JSC::DFG::SpeculativeJIT::emitCall): + (JSC::DFG::SpeculativeJIT::compile): + * dfg/DFGThunks.cpp: + (JSC::DFG::throwExceptionFromCallSlowPathGenerator): + (JSC::DFG::slowPathFor): + (JSC::DFG::virtualForThunkGenerator): + * dfg/DFGValueSource.cpp: + (JSC::DFG::ValueSource::dump): + * dfg/DFGValueSource.h: + (JSC::DFG::dataFormatToValueSourceKind): + (JSC::DFG::valueSourceKindToDataFormat): + (JSC::DFG::isInJSStack): + (JSC::DFG::ValueSource::forSpeculation): + (JSC::DFG::ValueSource::isInJSStack): + (JSC::DFG::ValueSource::valueRecovery): + * dfg/DFGVariableEventStream.cpp: + (JSC::DFG::VariableEventStream::reconstruct): + * heap/Heap.cpp: + (JSC::Heap::stack): + (JSC::Heap::getConservativeRegisterRoots): + (JSC::Heap::markRoots): + * heap/Heap.h: + (JSC): + (Heap): + * interpreter/CallFrame.cpp: + (JSC::CallFrame::stack): + * interpreter/CallFrame.h: + (JSC::ExecState::calleeAsValue): + (JSC::ExecState::callee): + (JSC::ExecState::codeBlock): + (JSC::ExecState::scope): + (JSC::ExecState::callerFrame): + (JSC::ExecState::returnPC): + (JSC::ExecState::hasReturnPC): + (JSC::ExecState::clearReturnPC): + (JSC::ExecState::bytecodeOffsetForNonDFGCode): + (JSC::ExecState::setBytecodeOffsetForNonDFGCode): + (JSC::ExecState::inlineCallFrame): + (JSC::ExecState::codeOriginIndexForDFG): + (JSC::ExecState::currentVPC): + (JSC::ExecState::setCurrentVPC): + (JSC::ExecState::setCallerFrame): + (JSC::ExecState::setScope): + (JSC::ExecState::init): + (JSC::ExecState::argumentCountIncludingThis): + (JSC::ExecState::offsetFor): + (JSC::ExecState::setArgumentCountIncludingThis): + (JSC::ExecState::setCallee): + (JSC::ExecState::setCodeBlock): + (JSC::ExecState::setReturnPC): + (JSC::ExecState::setInlineCallFrame): + (ExecState): + * interpreter/Interpreter.cpp: + (JSC::Interpreter::slideRegisterWindowForCall): + (JSC::eval): + (JSC::loadVarargs): + (JSC::Interpreter::dumpRegisters): + (JSC::Interpreter::throwException): + (JSC::Interpreter::execute): + (JSC::Interpreter::executeCall): + (JSC::Interpreter::executeConstruct): + (JSC::Interpreter::prepareForRepeatCall): + (JSC::Interpreter::endRepeatCall): + * interpreter/Interpreter.h: + (JSC::Interpreter::stack): + (Interpreter): + (JSC::Interpreter::execute): + (JSC): + * interpreter/JSStack.cpp: Copied from Source/JavaScriptCore/interpreter/RegisterFile.cpp. + (JSC::stackStatisticsMutex): + (JSC::JSStack::~JSStack): + (JSC::JSStack::growSlowCase): + (JSC::JSStack::gatherConservativeRoots): + (JSC::JSStack::releaseExcessCapacity): + (JSC::JSStack::initializeThreading): + (JSC::JSStack::committedByteCount): + (JSC::JSStack::addToCommittedByteCount): + * interpreter/JSStack.h: Copied from Source/JavaScriptCore/interpreter/RegisterFile.h. + (JSStack): + (JSC::JSStack::JSStack): + (JSC::JSStack::shrink): + (JSC::JSStack::grow): + * interpreter/RegisterFile.cpp: Removed. + * interpreter/RegisterFile.h: Removed. + * interpreter/VMInspector.cpp: + (JSC::VMInspector::dumpFrame): + * jit/JIT.cpp: + (JSC::JIT::JIT): + (JSC::JIT::privateCompile): + * jit/JIT.h: + (JSC): + (JIT): + * jit/JITCall.cpp: + (JSC::JIT::compileLoadVarargs): + (JSC::JIT::compileCallEval): + (JSC::JIT::compileCallEvalSlowCase): + (JSC::JIT::compileOpCall): + * jit/JITCall32_64.cpp: + (JSC::JIT::emit_op_ret): + (JSC::JIT::emit_op_ret_object_or_this): + (JSC::JIT::compileLoadVarargs): + (JSC::JIT::compileCallEval): + (JSC::JIT::compileCallEvalSlowCase): + (JSC::JIT::compileOpCall): + * jit/JITCode.h: + (JSC): + (JSC::JITCode::execute): + * jit/JITInlineMethods.h: + (JSC::JIT::emitPutToCallFrameHeader): + (JSC::JIT::emitPutCellToCallFrameHeader): + (JSC::JIT::emitPutIntToCallFrameHeader): + (JSC::JIT::emitPutImmediateToCallFrameHeader): + (JSC::JIT::emitGetFromCallFrameHeaderPtr): + (JSC::JIT::emitGetFromCallFrameHeader32): + (JSC::JIT::updateTopCallFrame): + (JSC::JIT::unmap): + * jit/JITOpcodes.cpp: + (JSC::JIT::privateCompileCTIMachineTrampolines): + (JSC::JIT::privateCompileCTINativeCall): + (JSC::JIT::emit_op_end): + (JSC::JIT::emit_op_ret): + (JSC::JIT::emit_op_ret_object_or_this): + (JSC::JIT::emit_op_create_this): + (JSC::JIT::emit_op_get_arguments_length): + (JSC::JIT::emit_op_get_argument_by_val): + (JSC::JIT::emit_op_resolve_global_dynamic): + * jit/JITOpcodes32_64.cpp: + (JSC::JIT::privateCompileCTIMachineTrampolines): + (JSC::JIT::privateCompileCTINativeCall): + (JSC::JIT::emit_op_end): + (JSC::JIT::emit_op_create_this): + (JSC::JIT::emit_op_get_arguments_length): + (JSC::JIT::emit_op_get_argument_by_val): + * jit/JITPropertyAccess.cpp: + (JSC::JIT::emit_op_get_scoped_var): + (JSC::JIT::emit_op_put_scoped_var): + * jit/JITPropertyAccess32_64.cpp: + (JSC::JIT::emit_op_get_scoped_var): + (JSC::JIT::emit_op_put_scoped_var): + * jit/JITStubs.cpp: + (JSC::ctiTrampoline): + (JSC::JITThunks::JITThunks): + (JSC): + (JSC::DEFINE_STUB_FUNCTION): + * jit/JITStubs.h: + (JSC): + (JITStackFrame): + * jit/JSInterfaceJIT.h: + * jit/SpecializedThunkJIT.h: + (JSC::SpecializedThunkJIT::SpecializedThunkJIT): + (JSC::SpecializedThunkJIT::returnJSValue): + (JSC::SpecializedThunkJIT::returnDouble): + (JSC::SpecializedThunkJIT::returnInt32): + (JSC::SpecializedThunkJIT::returnJSCell): + * llint/LLIntData.cpp: + (JSC::LLInt::Data::performAssertions): + * llint/LLIntOffsetsExtractor.cpp: + * llint/LLIntSlowPaths.cpp: + (JSC::LLInt::LLINT_SLOW_PATH_DECL): + (JSC::LLInt::genericCall): + * llint/LLIntSlowPaths.h: + (LLInt): + * llint/LowLevelInterpreter.asm: + * runtime/Arguments.cpp: + (JSC::Arguments::tearOffForInlineCallFrame): + * runtime/CommonSlowPaths.h: + (JSC::CommonSlowPaths::arityCheckFor): + * runtime/InitializeThreading.cpp: + (JSC::initializeThreadingOnce): + * runtime/JSActivation.cpp: + (JSC::JSActivation::visitChildren): + * runtime/JSGlobalObject.cpp: + (JSC::JSGlobalObject::globalExec): + * runtime/JSGlobalObject.h: + (JSC): + (JSGlobalObject): + * runtime/JSLock.cpp: + (JSC): + * runtime/JSVariableObject.h: + (JSVariableObject): + * runtime/MemoryStatistics.cpp: + (JSC::globalMemoryStatistics): + +2012-10-08 Kiran Muppala <cmuppala@apple.com> + + Throttle DOM timers on hidden pages. + https://bugs.webkit.org/show_bug.cgi?id=98474 + + Reviewed by Maciej Stachowiak. + + Add HIDDEN_PAGE_DOM_TIMER_THROTTLING feature define. + + * Configurations/FeatureDefines.xcconfig: + +2012-10-08 Michael Saboff <msaboff@apple.com> + + After r130344, OpaqueJSString() creates an empty string which should be a null string + https://bugs.webkit.org/show_bug.cgi?id=98417 + + Reviewed by Sam Weinig. + + Changed create() of a null string to return 0. This is the same behavior as before r130344. + + * API/OpaqueJSString.cpp: + (OpaqueJSString::create): + +2012-10-07 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::::getOwnNonIndexPropertyNames): + * 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/SlotVisitor.cpp: + (JSC::SlotVisitor::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::getOwnNonIndexPropertyNames): + (JSC::JSActivation::symbolTablePutWithAttributes): + * runtime/JSArray.cpp: + (JSC::JSArray::setLength): + * runtime/JSObject.cpp: + (JSC::JSObject::getOwnPropertySlotByIndex): + (JSC::JSObject::enterDictionaryIndexingModeWhenArrayStorageAlreadyExists): + (JSC::JSObject::deletePropertyByIndex): + (JSC::JSObject::getOwnPropertyNames): + (JSC::JSObject::defineOwnIndexedProperty): + (JSC::JSObject::attemptToInterceptPutByIndexOnHoleForPrototype): + (JSC::JSObject::putByIndexBeyondVectorLengthWithArrayStorage): + (JSC::JSObject::putDirectIndexBeyondVectorLengthWithArrayStorage): + (JSC::JSObject::getOwnPropertyDescriptor): + * runtime/JSSymbolTableObject.cpp: + (JSC::JSSymbolTableObject::getOwnNonIndexPropertyNames): + * runtime/JSSymbolTableObject.h: + (JSC::symbolTableGet): + (JSC::symbolTablePut): + (JSC::symbolTablePutWithAttributes): + * runtime/RegExpCache.cpp: + (JSC::RegExpCache::invalidateCode): + * runtime/SparseArrayValueMap.cpp: + (JSC::SparseArrayValueMap::putEntry): + (JSC::SparseArrayValueMap::putDirect): + (JSC::SparseArrayValueMap::visitChildren): + * 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-10-05 Mark Hahnenberg <mhahnenberg@apple.com> + + JSC should have a way to gather and log Heap memory use and pause times + https://bugs.webkit.org/show_bug.cgi?id=98431 + + Reviewed by Geoffrey Garen. + + In order to improve our infrastructure for benchmark-driven development, we should + have a centralized method of gathering and logging various statistics about the state + of the JS heap. This would allow us to create and to use other tools to analyze the + output of the VM after running various workloads. + + The first two statistics that might be interesting is memory use by JSC and GC pause + times. We can control whether this recording happens through the use of the Options + class, allowing us to either use environment variables or command line flags. + + * JavaScriptCore.xcodeproj/project.pbxproj: + * heap/Heap.cpp: + (JSC::Heap::collect): If we finish a collection and are still over our set GC heap size, + we end the program immediately and report an error. Also added recording of pause times. + * heap/Heap.h: + (Heap): + (JSC::Heap::shouldCollect): When we set a specific GC heap size through Options, we + ignore all other heuristics on when we should collect and instead only ask if we're + greater than the amount specified in the Option value. This allows us to view time/memory + tradeoffs more clearly. + * heap/HeapStatistics.cpp: Added. + (JSC): + (JSC::HeapStatistics::initialize): + (JSC::HeapStatistics::recordGCPauseTime): + (JSC::HeapStatistics::logStatistics): + (JSC::HeapStatistics::exitWithFailure): + (JSC::HeapStatistics::reportSuccess): + (JSC::HeapStatistics::parseMemoryAmount): + (StorageStatistics): + (JSC::StorageStatistics::StorageStatistics): + (JSC::StorageStatistics::operator()): + (JSC::StorageStatistics::objectWithOutOfLineStorageCount): + (JSC::StorageStatistics::objectCount): + (JSC::StorageStatistics::storageSize): + (JSC::StorageStatistics::storageCapacity): + (JSC::HeapStatistics::showObjectStatistics): Moved the old showHeapStatistics (renamed to showObjectStatistics) + to try to start collecting our various memory statistics gathering/reporting mechanisms scattered throughout the + codebase into one place. + * heap/HeapStatistics.h: Added. + (JSC): + (HeapStatistics): + * jsc.cpp: + (main): + * runtime/InitializeThreading.cpp: + (JSC::initializeThreadingOnce): We need to initialize our data structures for recording + statistics if necessary. + * runtime/Options.cpp: Add new Options for the various types of statistics we'll be gathering. + (JSC::parse): + (JSC): + (JSC::Options::initialize): Initialize the various new options using environment variables. + (JSC::Options::dumpOption): + * runtime/Options.h: + (JSC): + +2012-10-04 Rik Cabanier <cabanier@adobe.com> + + Turn Compositing on by default in WebKit build + https://bugs.webkit.org/show_bug.cgi?id=98315 + + Reviewed by Simon Fraser. + + enable -webkit-blend-mode on trunk. + + * Configurations/FeatureDefines.xcconfig: + +2012-10-04 Michael Saboff <msaboff@apple.com> + + Crash in Safari at com.apple.JavaScriptCore: WTF::StringImpl::is8Bit const + 12 + https://bugs.webkit.org/show_bug.cgi?id=98433 + + Reviewed by Jessie Berlin. + + The problem is due to a String with a null StringImpl (i.e. a null string). + Added a length check before the is8Bit() check since length() checks for a null StringImpl. Changed the + characters16() call to characters() since it can handle a null StringImpl as well. + + * API/JSValueRef.cpp: + (JSValueMakeFromJSONString): + +2012-10-04 Benjamin Poulain <bpoulain@apple.com> + + Use copyLCharsFromUCharSource() for IdentifierLCharFromUCharTranslator translation + https://bugs.webkit.org/show_bug.cgi?id=98335 + + Reviewed by Michael Saboff. + + Michael Saboff added an optimized version of UChar->LChar conversion in r125846. + Use this function in JSC::Identifier. + + * runtime/Identifier.cpp: + (JSC::IdentifierLCharFromUCharTranslator::translate): + +2012-10-04 Michael Saboff <msaboff@apple.com> + + After r130344, OpaqueJSString() creates a empty string which should be a null string + https://bugs.webkit.org/show_bug.cgi?id=98417 + + Reviewed by Alexey Proskuryakov. + + Removed the setting of enclosed string to an empty string from default constructor. + Before changeset r130344, the semantic was the default constructor produced a null + string. + + * API/OpaqueJSString.h: + (OpaqueJSString::OpaqueJSString): + +2012-10-04 Csaba Osztrogonác <ossy@webkit.org> + + [Qt] Add missing LLInt dependencies to the build system + https://bugs.webkit.org/show_bug.cgi?id=98394 + + Reviewed by Geoffrey Garen. + + * DerivedSources.pri: + * LLIntOffsetsExtractor.pro: + +2012-10-03 Geoffrey Garen <ggaren@apple.com> + + Next step toward fixing Windows: add new symbol. + + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.def: + +2012-10-03 Geoffrey Garen <ggaren@apple.com> + + First step toward fixing Windows: remove old symbol. + + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.def: + +2012-10-03 Geoffrey Garen <ggaren@apple.com> + + Removed the assumption that "final" objects have a fixed number of inline slots + https://bugs.webkit.org/show_bug.cgi?id=98332 + + Reviewed by Filip Pizlo. + + This is a step toward object size inference. + + I replaced the inline storage capacity constant with a data member per + structure, set the the maximum supported value for the constant to 100, + then fixed what broke. (Note that even though this patch increases the + theoretical maximum inline capacity, it doesn't change any actual inline + capacity.) + + * dfg/DFGSpeculativeJIT32_64.cpp: + (JSC::DFG::SpeculativeJIT::compile): + * dfg/DFGSpeculativeJIT64.cpp: + (JSC::DFG::SpeculativeJIT::compile): + * jit/JITPropertyAccess.cpp: + (JSC::JIT::compileGetDirectOffset): These functions just get a rename: + the constant they need is the first out of line offset along the offset + number line, which is not necessarily the same thing (and is, in this + patch, never the same thing) as the inline capacity of any given object. + + (JSC::JIT::emit_op_get_by_pname): + * jit/JITPropertyAccess32_64.cpp: This function changes functionality, + since it needs to convert from the abstract offset number line to an + actual offset in memory, and it can't assume that inline and out-of-line + offsets are contiguous on the number line. + + (JSC::JIT::compileGetDirectOffset): Updated for rename. + + (JSC::JIT::emit_op_get_by_pname): Same as emit_op_get_by_pname above. + + * llint/LowLevelInterpreter.asm: Updated to mirror changes in PropertyOffset.h, + since we duplicate values from there. + + * llint/LowLevelInterpreter32_64.asm: + * llint/LowLevelInterpreter64.asm: Just like the JIT, most things are just + renames, and get_by_pname changes to do more math. I also standardized + offset calculations to use a hard-coded "-2", to match the JIT. This + isn't really better, but it makes global search and replace easier, + should we choose to refactor this code not to hard-code constants. + + I also renamed loadPropertyAtVariableOffsetKnownNotFinal to + loadPropertyAtVariableOffsetKnownNotInline in order to sever the assumption + that inline capacity is tied to object type, and I changed the 64bit LLInt + to use this -- not using this previously seems to have been an oversight. + + * runtime/JSObject.cpp: + (JSC::JSObject::visitChildren): + (JSC::JSFinalObject::visitChildren): + * runtime/JSObject.h: + (JSC::JSObject::offsetForLocation): + (JSNonFinalObject): + (JSC::JSFinalObject::createStructure): + (JSFinalObject): + (JSC::JSFinalObject::finishCreation): Updated for above changes. + + * runtime/JSPropertyNameIterator.h: + (JSPropertyNameIterator): + (JSC::JSPropertyNameIterator::finishCreation): Store the inline capacity + of our object, since it's not a constant. + + (JSC::JSPropertyNameIterator::getOffset): Removed. This function was + wrong. Luckily, it was also unused, since the C++ interpreter is gone. + + * runtime/PropertyMapHashTable.h: + (PropertyTable): Use a helper function instead of hard-coding assumptions + about object types. + + (JSC::PropertyTable::nextOffset): + * runtime/PropertyOffset.h: + (JSC): + (JSC::checkOffset): + (JSC::validateOffset): + (JSC::isInlineOffset): + (JSC::numberOfSlotsForLastOffset): + (JSC::propertyOffsetFor): Refactored these functions to take inline capacity + as an argument, since it's not fixed at compile time anymore. + + * runtime/Structure.cpp: + (JSC::Structure::Structure): + (JSC::Structure::flattenDictionaryStructure): + (JSC::Structure::putSpecificValue): + * runtime/Structure.h: + (Structure): + (JSC::Structure::outOfLineCapacity): + (JSC::Structure::hasInlineStorage): + (JSC::Structure::inlineCapacity): + (JSC::Structure::inlineSize): + (JSC::Structure::firstValidOffset): + (JSC::Structure::lastValidOffset): + (JSC::Structure::create): Removed some hard-coded assumptions about inline + capacity and object type, and replaced with more liberal use of helper functions. + +2012-10-03 Michael Saboff <msaboff@apple.com> + + OpaqueJSString doesn't optimally handle 8 bit strings + https://bugs.webkit.org/show_bug.cgi?id=98300 + + Reviewed by Geoffrey Garen. + + Change OpaqueJSString to store and manage a String instead of a UChar buffer. + The member string is a copy of any string used during creation. + + * API/OpaqueJSString.cpp: + (OpaqueJSString::create): + (OpaqueJSString::identifier): + * API/OpaqueJSString.h: + (OpaqueJSString::characters): + (OpaqueJSString::length): + (OpaqueJSString::string): + (OpaqueJSString::OpaqueJSString): + (OpaqueJSString): + +2012-10-03 Filip Pizlo <fpizlo@apple.com> + + Array.splice should be fast when it is used to remove elements other than the very first + https://bugs.webkit.org/show_bug.cgi?id=98236 + + Reviewed by Michael Saboff. + + Applied the same technique that was used to optimize the unshift case of splice in + http://trac.webkit.org/changeset/129676. This is a >20x speed-up on programs that + use splice for element removal. + + * runtime/ArrayPrototype.cpp: + (JSC::shift): + * runtime/JSArray.cpp: + (JSC::JSArray::shiftCount): + * runtime/JSArray.h: + (JSArray): + +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 Geoffrey Garen. + + 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 two static bools, needsDestruction and hasImmortalStructure, that classes can override + to indicate at compile time which part of the heap they should be allocated in. + (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): + +== Rolled over to ChangeLog-2012-10-02 == |