2017-06-02 Yusuke Suzuki ASSERTION FAILED: "We should only declare a function as a lexically scoped variable in scopes where var declarations aren't allowed. ..." for function redeclaration with async function module export https://bugs.webkit.org/show_bug.cgi?id=168844 Reviewed by Saam Barati. As the same to the exported function declaration, we should set statementDepth = 1 for exported async function declaration. * parser/Parser.cpp: (JSC::DepthManager::DepthManager): (JSC::Parser::parseExportDeclaration): * parser/Parser.h: (JSC::Parser::DepthManager::DepthManager): Deleted. (JSC::Parser::DepthManager::~DepthManager): Deleted. 2017-06-02 Keith Miller Defer installing mach breakpoint handler until watchdog is actually called https://bugs.webkit.org/show_bug.cgi?id=172885 Reviewed by Saam Barati. Eagerly installing the mach breakpoint handler causes issues with Xcode GUI debugging. This hides the issue, so it won't occur as often. * runtime/VMTraps.cpp: (JSC::VMTraps::SignalSender::send): (JSC::VMTraps::VMTraps): Deleted. * runtime/VMTraps.h: 2017-06-02 Filip Pizlo Atomics.load and Atomics.store need to be fully fenced https://bugs.webkit.org/show_bug.cgi?id=172844 Reviewed by Keith Miller. Implement fully fenced loads and stores in FTL using AtomicXchgAdd(0, ptr) for the load and AtomicXchg(value, ptr) for the store. DFG needed no changes because it implements all atomics using a CAS loop. AtomicsObject.cpp now uses new Atomic<> API for fully fences loads and stores. Prior to this change, we used half fences (acquire/release) for atomic loads and stores. This is not correct according to my current understanding of the SAB memory model, which requires that atomic operations are SC with respect to everything not just other atomics. * ftl/FTLLowerDFGToB3.cpp: (JSC::FTL::DFG::LowerDFGToB3::compileAtomicsReadModifyWrite): * ftl/FTLOutput.cpp: (JSC::FTL::Output::atomicWeakCAS): * ftl/FTLOutput.h: * runtime/AtomicsObject.cpp: 2017-06-02 Ryan Haddad Unreviewed, attempt to fix the iOS build after r217711. * assembler/MacroAssemblerARM64.h: (JSC::MacroAssemblerARM64::xor32): (JSC::MacroAssemblerARM64::xor64): 2017-06-01 Filip Pizlo GC should use scrambled free-lists https://bugs.webkit.org/show_bug.cgi?id=172793 Reviewed by Mark Lam. Previously, our bump'n'pop allocator would use a conventional linked-list for the free-list. The linked-list would be threaded through free memory, as is the usual convention. This scrambles the next pointers of that free-list. It also scrambles the head pointer, because this leads to a more natural fast-path structure and saves one register on ARM64. The secret with which pointers are scrambled is per-allocator. Allocators choose a new secret every time they do a sweep-to-pop. This doesn't change the behavior of the bump part of bump'n'pop, but it does refactor the code quite a bit. Previously, there were four copies of the allocator fast path: two in MarkedAllocatorInlines.h, one in MarkedAllocator.cpp, and one in AssemblyHelpers.h. The JIT one was obviously different-looking, but the other three were almost identical. This moves all of that logic into FreeList. There are now just two copies of the allocator: FreeListInlines.h and AssemblyHelpers.h. This appears to be just as fast as our previously allocator. * JavaScriptCore.xcodeproj/project.pbxproj: * heap/FreeList.cpp: (JSC::FreeList::FreeList): (JSC::FreeList::~FreeList): (JSC::FreeList::clear): (JSC::FreeList::initializeList): (JSC::FreeList::initializeBump): (JSC::FreeList::contains): (JSC::FreeList::dump): * heap/FreeList.h: (JSC::FreeList::allocationWillFail): (JSC::FreeList::originalSize): (JSC::FreeList::addressOfList): (JSC::FreeList::offsetOfBlock): (JSC::FreeList::offsetOfList): (JSC::FreeList::offsetOfIndex): (JSC::FreeList::offsetOfPayloadEnd): (JSC::FreeList::offsetOfRemaining): (JSC::FreeList::offsetOfOriginalSize): (JSC::FreeList::FreeList): Deleted. (JSC::FreeList::list): Deleted. (JSC::FreeList::bump): Deleted. (JSC::FreeList::operator==): Deleted. (JSC::FreeList::operator!=): Deleted. (JSC::FreeList::operator bool): Deleted. * heap/FreeListInlines.h: Added. (JSC::FreeList::addFreeCell): (JSC::FreeList::allocate): (JSC::FreeList::forEach): (JSC::FreeList::toOffset): (JSC::FreeList::fromOffset): * heap/IncrementalSweeper.cpp: (JSC::IncrementalSweeper::sweepNextBlock): * heap/MarkedAllocator.cpp: (JSC::MarkedAllocator::MarkedAllocator): (JSC::MarkedAllocator::didConsumeFreeList): (JSC::MarkedAllocator::tryAllocateWithoutCollecting): (JSC::MarkedAllocator::tryAllocateIn): (JSC::MarkedAllocator::allocateSlowCaseImpl): (JSC::MarkedAllocator::stopAllocating): (JSC::MarkedAllocator::prepareForAllocation): (JSC::MarkedAllocator::resumeAllocating): (JSC::MarkedAllocator::sweep): (JSC::MarkedAllocator::setFreeList): Deleted. * heap/MarkedAllocator.h: (JSC::MarkedAllocator::freeList): (JSC::MarkedAllocator::isFreeListedCell): Deleted. * heap/MarkedAllocatorInlines.h: (JSC::MarkedAllocator::isFreeListedCell): (JSC::MarkedAllocator::tryAllocate): (JSC::MarkedAllocator::allocate): * heap/MarkedBlock.cpp: (JSC::MarkedBlock::Handle::stopAllocating): (JSC::MarkedBlock::Handle::lastChanceToFinalize): (JSC::MarkedBlock::Handle::resumeAllocating): (JSC::MarkedBlock::Handle::zap): (JSC::MarkedBlock::Handle::sweep): (JSC::MarkedBlock::Handle::isFreeListedCell): (JSC::MarkedBlock::Handle::forEachFreeCell): Deleted. * heap/MarkedBlock.h: * heap/MarkedBlockInlines.h: (JSC::MarkedBlock::Handle::specializedSweep): (JSC::MarkedBlock::Handle::finishSweepKnowingSubspace): (JSC::MarkedBlock::Handle::isFreeListedCell): Deleted. * heap/Subspace.cpp: (JSC::Subspace::finishSweep): * heap/Subspace.h: * jit/AssemblyHelpers.h: (JSC::AssemblyHelpers::emitAllocateWithNonNullAllocator): * runtime/JSDestructibleObjectSubspace.cpp: (JSC::JSDestructibleObjectSubspace::finishSweep): * runtime/JSDestructibleObjectSubspace.h: * runtime/JSSegmentedVariableObjectSubspace.cpp: (JSC::JSSegmentedVariableObjectSubspace::finishSweep): * runtime/JSSegmentedVariableObjectSubspace.h: * runtime/JSStringSubspace.cpp: (JSC::JSStringSubspace::finishSweep): * runtime/JSStringSubspace.h: * wasm/js/JSWebAssemblyCodeBlockSubspace.cpp: (JSC::JSWebAssemblyCodeBlockSubspace::finishSweep): * wasm/js/JSWebAssemblyCodeBlockSubspace.h: 2017-06-02 Yusuke Suzuki [JSC] Use @globalPrivate for concatSlowPath https://bugs.webkit.org/show_bug.cgi?id=172802 Reviewed by Darin Adler. Use @globalPrivate instead of manually putting it to JSGlobalObject. * builtins/ArrayPrototype.js: (concatSlowPath): Deleted. * runtime/JSGlobalObject.cpp: (JSC::JSGlobalObject::init): 2017-06-01 Andy Estes REGRESSION (r217626): ENABLE_APPLE_PAY_SESSION_V3 was disabled by mistake https://bugs.webkit.org/show_bug.cgi?id=172828 Reviewed by Beth Dakin. * Configurations/FeatureDefines.xcconfig: 2017-06-01 Keith Miller Undo rollout in r217638 with bug fix https://bugs.webkit.org/show_bug.cgi?id=172824 Unreviewed, reland patch with unused set_state code removed. * API/tests/ExecutionTimeLimitTest.cpp: (dispatchTermitateCallback): (testExecutionTimeLimit): * runtime/JSLock.cpp: (JSC::JSLock::didAcquireLock): * runtime/Options.cpp: (JSC::overrideDefaults): (JSC::Options::initialize): * runtime/Options.h: * runtime/VMTraps.cpp: (JSC::SignalContext::SignalContext): (JSC::SignalContext::adjustPCToPointToTrappingInstruction): (JSC::installSignalHandler): (JSC::VMTraps::SignalSender::send): * tools/SigillCrashAnalyzer.cpp: (JSC::SignalContext::SignalContext): (JSC::SignalContext::dump): (JSC::installCrashHandler): * wasm/WasmBBQPlan.cpp: (JSC::Wasm::BBQPlan::compileFunctions): * wasm/WasmFaultSignalHandler.cpp: (JSC::Wasm::trapHandler): (JSC::Wasm::enableFastMemory): * wasm/WasmMachineThreads.cpp: (JSC::Wasm::resetInstructionCacheOnAllThreads): 2017-06-01 Guillaume Emont [JSC][MIPS] SamplingProfiler::timerLoop() sleeps for 4000+ seconds https://bugs.webkit.org/show_bug.cgi?id=172800 Reviewed by Saam Barati. This fixes a static_cast by making it a cast to int64_t instead, which looks like the original intent. This fixes the sampling-profiler tests in JSTests/stress. * runtime/SamplingProfiler.cpp: (JSC::SamplingProfiler::timerLoop): 2017-06-01 Tomas Popela , Mark Lam RELEASE_ASSERT_NOT_REACHED() in InferredType::kindForFlags() on Big-Endians https://bugs.webkit.org/show_bug.cgi?id=170945 Reviewed by Mark Lam. Re-define PutByIdFlags as a int32_t enum explicitly because it is stored as an int32_t value in UnlinkedInstruction. This prevents a bug on 64-bit big endian architectures where the word order is inverted (when we convert the UnlinkedInstruction into a CodeBlock Instruction), resulting in the PutByIdFlags value not being stored in the 32-bit word that the rest of the code expects it to be in. * bytecode/PutByIdFlags.h: 2017-05-31 Yusuke Suzuki [JSC] Implement String.prototype.concat in JS builtins https://bugs.webkit.org/show_bug.cgi?id=172798 Reviewed by Sam Weinig. Since we have highly effective + operation for strings, implementing String.prototype.concat in JS simplifies the implementation and improves performance by using speculated types. Added microbenchmarks show performance improvement. string-concat-long-convert 1063.2787+-12.9101 ^ 109.0855+-2.8083 ^ definitely 9.7472x faster string-concat-convert 1111.1366+-12.2363 ^ 99.3402+-1.9874 ^ definitely 11.1852x faster string-concat 131.7377+-3.8359 ^ 54.3949+-0.9580 ^ definitely 2.4219x faster string-concat-long 79.4726+-1.9644 ^ 64.6301+-1.4941 ^ definitely 1.2297x faster * builtins/StringPrototype.js: (globalPrivate.stringConcatSlowPath): (concat): * runtime/StringPrototype.cpp: (JSC::StringPrototype::finishCreation): (JSC::stringProtoFuncConcat): Deleted. 2017-05-31 Mark Lam Remove overrides of visitChildren() that do not add any functionality. https://bugs.webkit.org/show_bug.cgi?id=172789 Reviewed by Andreas Kling. * bytecode/UnlinkedModuleProgramCodeBlock.cpp: (JSC::UnlinkedModuleProgramCodeBlock::visitChildren): Deleted. * bytecode/UnlinkedModuleProgramCodeBlock.h: * bytecode/UnlinkedProgramCodeBlock.cpp: (JSC::UnlinkedProgramCodeBlock::visitChildren): Deleted. * bytecode/UnlinkedProgramCodeBlock.h: * wasm/js/WebAssemblyFunction.cpp: (JSC::WebAssemblyFunction::visitChildren): Deleted. * wasm/js/WebAssemblyFunction.h: * wasm/js/WebAssemblyInstanceConstructor.cpp: (JSC::WebAssemblyInstanceConstructor::visitChildren): Deleted. * wasm/js/WebAssemblyInstanceConstructor.h: * wasm/js/WebAssemblyMemoryConstructor.cpp: (JSC::WebAssemblyMemoryConstructor::visitChildren): Deleted. * wasm/js/WebAssemblyMemoryConstructor.h: * wasm/js/WebAssemblyModuleConstructor.cpp: (JSC::WebAssemblyModuleConstructor::visitChildren): Deleted. * wasm/js/WebAssemblyModuleConstructor.h: * wasm/js/WebAssemblyTableConstructor.cpp: (JSC::WebAssemblyTableConstructor::visitChildren): Deleted. * wasm/js/WebAssemblyTableConstructor.h: 2017-05-31 Commit Queue Unreviewed, rolling out r217611 and r217631. https://bugs.webkit.org/show_bug.cgi?id=172785 "caused wasm-hashset-many.html to become flaky." (Requested by keith_miller on #webkit). Reverted changesets: "Reland r216808, underlying lldb bug has been fixed." https://bugs.webkit.org/show_bug.cgi?id=172759 http://trac.webkit.org/changeset/217611 "Use dispatch queues for mach exceptions" https://bugs.webkit.org/show_bug.cgi?id=172775 http://trac.webkit.org/changeset/217631 2017-05-31 Oleksandr Skachkov Rolling out: Prevent async methods named 'function' https://bugs.webkit.org/show_bug.cgi?id=172776 Reviewed by Mark Lam. Rolling out https://bugs.webkit.org/show_bug.cgi?id=172660 r217578, https://bugs.webkit.org/show_bug.cgi?id=172598 r217478 PR to spec was closed, so changes need to roll out. See https://github.com/tc39/ecma262/pull/884#issuecomment-305212494 * parser/Parser.cpp: (JSC::Parser::parseClass): (JSC::Parser::parsePropertyMethod): 2017-05-31 Andy Estes Rename ENABLE_APPLE_PAY_DELEGATE to ENABLE_APPLE_PAY_SESSION_V3 and bump the supported version number https://bugs.webkit.org/show_bug.cgi?id=172366 Reviewed by Daniel Bates. * Configurations/FeatureDefines.xcconfig: 2017-05-31 Keith Miller Reland r216808, underlying lldb bug has been fixed. https://bugs.webkit.org/show_bug.cgi?id=172759 Unreviewed, relanding old patch. See: rdar://problem/31183352 * API/tests/ExecutionTimeLimitTest.cpp: (dispatchTermitateCallback): (testExecutionTimeLimit): * runtime/JSLock.cpp: (JSC::JSLock::didAcquireLock): * runtime/Options.cpp: (JSC::overrideDefaults): (JSC::Options::initialize): * runtime/Options.h: * runtime/VMTraps.cpp: (JSC::SignalContext::SignalContext): (JSC::SignalContext::adjustPCToPointToTrappingInstruction): (JSC::installSignalHandler): (JSC::VMTraps::SignalSender::send): * tools/SigillCrashAnalyzer.cpp: (JSC::SignalContext::SignalContext): (JSC::SignalContext::dump): (JSC::installCrashHandler): * wasm/WasmBBQPlan.cpp: (JSC::Wasm::BBQPlan::compileFunctions): * wasm/WasmFaultSignalHandler.cpp: (JSC::Wasm::trapHandler): (JSC::Wasm::enableFastMemory): * wasm/WasmMachineThreads.cpp: (JSC::Wasm::resetInstructionCacheOnAllThreads): 2017-05-31 Keith Miller Fix leak in PromiseDeferredTimer https://bugs.webkit.org/show_bug.cgi?id=172755 Reviewed by JF Bastien. We were not properly freeing the list of dependencies if we were already tracking the promise before. This is because addPendingPromise takes the list of dependencies as an rvalue-reference. In the case where we were already tracking the promise we append the provided dependency list to the existing list. Since we never bound or rvalue-ref to a non-temporary value we never destructed the Vector, leaking its contents. * runtime/PromiseDeferredTimer.cpp: (JSC::PromiseDeferredTimer::addPendingPromise): 2017-05-30 Oleksandr Skachkov Prevent async methods named 'function' in Object literal https://bugs.webkit.org/show_bug.cgi?id=172660 Reviewed by Saam Barati. Prevent async method named 'function' in object. https://github.com/tc39/ecma262/pull/884 * parser/Parser.cpp: (JSC::Parser::parsePropertyMethod): 2017-05-30 Oleksandr Skachkov ASSERTION FAILED: generator.isConstructor() || generator.derivedContextType() == DerivedContextType::DerivedConstructorContext https://bugs.webkit.org/show_bug.cgi?id=171274 Reviewed by Saam Barati. Current patch allow to use async arrow function within constructor, and allow to access to `this`. Current patch force load 'this' from virtual scope each time as we access to `this` in async arrow function within constructor it is neccessary because async function can be suspended and `superCall` can be called and async function resumed. * bytecompiler/BytecodeGenerator.cpp: (JSC::BytecodeGenerator::emitPutGeneratorFields): (JSC::BytecodeGenerator::ensureThis): * bytecompiler/BytecodeGenerator.h: (JSC::BytecodeGenerator::makeFunction): 2017-05-30 Ali Juma [CredentialManagement] Incorporate IDL updates from latest spec https://bugs.webkit.org/show_bug.cgi?id=172011 Reviewed by Daniel Bates. * runtime/CommonIdentifiers.h: 2017-05-30 Alex Christensen Update libwebrtc configuration https://bugs.webkit.org/show_bug.cgi?id=172727 Reviewed by Geoffrey Garen. * Configurations/FeatureDefines.xcconfig: 2017-05-28 Dan Bernstein [Xcode] ALWAYS_SEARCH_USER_PATHS is set to YES https://bugs.webkit.org/show_bug.cgi?id=172691 Reviewed by Tim Horton. * Configurations/Base.xcconfig: Set ALWAYS_SEARCH_USER_PATHS to NO. * JavaScriptCore.xcodeproj/project.pbxproj: Added ParseInt.h to the JavaScriptCore target. 2017-05-28 Yusuke Suzuki [JSC] Provide better type information of toLength and tighten bytecode https://bugs.webkit.org/show_bug.cgi?id=172690 Reviewed by Sam Weinig. In this patch, we carefully leverage operator + in order to 1. tighten bytecode operator+ emits to_number bytecode. What this bytecode does is the same to @Number() call. It is more efficient, and it is smaller bytecode than @Number() call (load global variable @Number, set up arguments, and call it). 2. offer better type prediction data Now, we have code like length > 0 ? (length < @MAX_SAFE_INTEGER ? length : @MAX_SAFE_INTEGER) : 0 This is not good because DFG prediction propagation phase predicts as Double since @MAX_SAFE_INTEGER is double. But actually it rarely becomes Double. Usually, the result becomes Int32. This patch leverages to_number in a bit interesting way: to_number has value profiling to offer better type prediction. This value profiling can offer a chance to change the prediction to Int32 efficiently. It is a bit tricky. But it is worth doing to speed up our builtin functions, which should leverage all the JSC's tricky things to be optimized. Related microbenchmarks show performance improvement. baseline patched array-prototype-forEach 50.2348+-2.2331 49.7568+-2.3507 array-prototype-map 51.0574+-1.8166 47.9531+-2.1653 might be 1.0647x faster array-prototype-some 52.3926+-1.8882 ^ 48.3632+-2.0852 ^ definitely 1.0833x faster array-prototype-every 52.7394+-2.0712 50.2896+-2.1480 might be 1.0487x faster array-prototype-reduce 54.9994+-2.3638 51.8716+-2.6253 might be 1.0603x faster array-prototype-reduceRight 209.7594+-9.2594 ^ 51.5867+-2.5745 ^ definitely 4.0662x faster * builtins/GlobalOperations.js: (globalPrivate.toInteger): (globalPrivate.toLength): 2017-05-28 Sam Weinig [WebIDL] @@iterator should only be accessed once when disambiguating a union type https://bugs.webkit.org/show_bug.cgi?id=172684 Reviewed by Yusuke Suzuki. * runtime/IteratorOperations.cpp: (JSC::iteratorMethod): (JSC::iteratorForIterable): * runtime/IteratorOperations.h: (JSC::forEachInIterable): Add additional iterator helpers to allow union + sequence conversion code to check for iterability by getting the iterator method, and iterate using that method later on. 2017-05-28 Yusuke Suzuki Unreviewed, build fix for Windows https://bugs.webkit.org/show_bug.cgi?id=172413 Optimized jsDynamicCast for JSMap and JSSet will be handled in [1]. [1]: https://bugs.webkit.org/show_bug.cgi?id=172685 * runtime/JSMap.h: (JSC::isJSMap): (JSC::jsDynamicCast): Deleted. (JSC::>): Deleted. * runtime/JSSet.h: (JSC::isJSSet): (JSC::jsDynamicCast): Deleted. (JSC::>): Deleted. * runtime/MapConstructor.cpp: (JSC::constructMap): * runtime/SetConstructor.cpp: (JSC::constructSet): 2017-05-28 Mark Lam Implement a faster Interpreter::getOpcodeID(). https://bugs.webkit.org/show_bug.cgi?id=172669 Reviewed by Saam Barati. We can implement Interpreter::getOpcodeID() without a hash table lookup by always embedding the OpcodeID in the 32-bit word just before the start of the LLInt handler code that executes each opcode. getOpcodeID() can therefore just read the 32-bits before the opcode address to get its OpcodeID. This is currently only enabled for CPU(X86), CPU(X86_64), CPU(ARM64), CPU(ARM_THUMB2), and only for OS(DARWIN). It'll probably just work for linux as well, but I'll let the Linux folks turn that on after they have verified that it works on linux too. I'll also take this opportunity to clean up how we initialize the opcodeIDTable: 1. we only need to initialize it once per process, not once per VM / interpreter instance. 2. we can initialize it in the Interpreter constructor instead of requiring a separate call to an initialize() function. On debug builds, the Interpreter constructor will also verify that getOpcodeID() is working correctly for each opcode when USE(LLINT_EMBEDDED_OPCODE_ID). * bytecode/BytecodeList.json: * generate-bytecode-files: * interpreter/Interpreter.cpp: (JSC::Interpreter::Interpreter): (JSC::Interpreter::opcodeIDTable): (JSC::Interpreter::initialize): Deleted. * interpreter/Interpreter.h: (JSC::Interpreter::getOpcode): (JSC::Interpreter::getOpcodeID): * llint/LowLevelInterpreter.cpp: * runtime/VM.cpp: (JSC::VM::VM): 2017-05-27 Yusuke Suzuki [JSC] Map and Set constructors should have fast path for cloning https://bugs.webkit.org/show_bug.cgi?id=172413 Reviewed by Saam Barati. In this patch, we add a fast path for cloning in Set and Map constructors. In ARES-6 Air, we have code like `new Set(set)` to clone the given set. At that time, our generic path just iterates the given set object and add it to the newly created one. It is quite slow because we need to follow the iterator protocol inside C++ and we need to call set.add() repeatedly while the given set guarantees the elements are unique. This patch implements clone() function to JSMap and JSSet. Cloning JSMap and JSSet are done really fast without invoking any observable JS functions. To check whether we can use this clone() function in Set and Map constructors, we set several watchpoints. In the case of Set, 1. Set.prototype[Symbol.iterator] is not changed. 2. SetIterator.prototype.next is not changed. 3. Set.prototype.add is not changed. 4. The given Set does not have [Symbol.iterator] function in its instance. 5. The given Set's [[Prototype]] is Set.prototype. 6. Newly created set's [[Prototype]] is Set.prototype. If the above requirements are met, cloning the given Set is not observable to users. Thus we can take a fast path. Currently, we do not integrate this optimization into DFG and FTL. And we do not optimize other iterables. For example, we can optimize Set constructor taking Int32 Array. And we should optimize generic iterator cases too. They are planned as part of a separate bug[1]. This change improves ARES-6 Air by 5.3% in steady state. Baseline: Running... Air ( 1 to go) firstIteration: 76.41 +- 15.60 ms averageWorstCase: 40.63 +- 7.54 ms steadyState: 9.13 +- 0.51 ms Patched: Running... Air ( 1 to go) firstIteration: 75.00 +- 22.54 ms averageWorstCase: 39.18 +- 8.45 ms steadyState: 8.67 +- 0.28 ms [1]: https://bugs.webkit.org/show_bug.cgi?id=172419 * CMakeLists.txt: * JavaScriptCore.xcodeproj/project.pbxproj: * runtime/ArrayIteratorAdaptiveWatchpoint.cpp: Removed. * runtime/HashMapImpl.h: (JSC::HashMapBucket::extractValue): (JSC::HashMapImpl::finishCreation): (JSC::HashMapImpl::add): (JSC::HashMapImpl::setUpHeadAndTail): (JSC::HashMapImpl::addNormalizedNonExistingForCloning): (JSC::HashMapImpl::addNormalizedInternal): * runtime/InternalFunction.cpp: (JSC::InternalFunction::createSubclassStructureSlow): (JSC::InternalFunction::createSubclassStructure): Deleted. * runtime/InternalFunction.h: (JSC::InternalFunction::createSubclassStructure): * runtime/JSGlobalObject.cpp: (JSC::JSGlobalObject::JSGlobalObject): (JSC::JSGlobalObject::init): (JSC::JSGlobalObject::visitChildren): * runtime/JSGlobalObject.h: (JSC::JSGlobalObject::mapIteratorProtocolWatchpoint): (JSC::JSGlobalObject::setIteratorProtocolWatchpoint): (JSC::JSGlobalObject::mapSetWatchpoint): (JSC::JSGlobalObject::setAddWatchpoint): (JSC::JSGlobalObject::mapPrototype): (JSC::JSGlobalObject::jsSetPrototype): (JSC::JSGlobalObject::setStructure): * runtime/JSGlobalObjectInlines.h: (JSC::JSGlobalObject::isMapPrototypeIteratorProtocolFastAndNonObservable): (JSC::JSGlobalObject::isSetPrototypeIteratorProtocolFastAndNonObservable): (JSC::JSGlobalObject::isMapPrototypeSetFastAndNonObservable): (JSC::JSGlobalObject::isSetPrototypeAddFastAndNonObservable): * runtime/JSMap.cpp: (JSC::JSMap::clone): (JSC::JSMap::canCloneFastAndNonObservable): * runtime/JSMap.h: (JSC::jsDynamicCast): (JSC::>): (JSC::JSMap::createStructure): Deleted. (JSC::JSMap::create): Deleted. (JSC::JSMap::set): Deleted. (JSC::JSMap::JSMap): Deleted. * runtime/JSSet.cpp: (JSC::JSSet::clone): (JSC::JSSet::canCloneFastAndNonObservable): * runtime/JSSet.h: (JSC::jsDynamicCast): (JSC::>): (JSC::JSSet::createStructure): Deleted. (JSC::JSSet::create): Deleted. (JSC::JSSet::JSSet): Deleted. * runtime/MapConstructor.cpp: (JSC::constructMap): * runtime/ObjectPropertyChangeAdaptiveWatchpoint.h: Renamed from Source/JavaScriptCore/runtime/ArrayIteratorAdaptiveWatchpoint.h. (JSC::ObjectPropertyChangeAdaptiveWatchpoint::ObjectPropertyChangeAdaptiveWatchpoint): * runtime/SetConstructor.cpp: (JSC::constructSet): 2017-05-27 Yusuke Suzuki [DOMJIT] Move DOMJIT patchpoint infrastructure out of domjit https://bugs.webkit.org/show_bug.cgi?id=172260 Reviewed by Filip Pizlo. DOMJIT::Patchpoint is now used for generalized CheckSubClass. And it becomes mature enough to be used as a general-purpose injectable compiler over all the JIT tiers. We extract DOMJIT::Patchpoint to jit/ and rename it JSC::Snippet. * CMakeLists.txt: * JavaScriptCore.xcodeproj/project.pbxproj: * bytecode/AccessCaseSnippetParams.cpp: Renamed from Source/JavaScriptCore/bytecode/DOMJITAccessCasePatchpointParams.cpp. (JSC::SlowPathCallGeneratorWithArguments::generateImpl): (JSC::AccessCaseSnippetParams::emitSlowPathCalls): * bytecode/AccessCaseSnippetParams.h: Renamed from Source/JavaScriptCore/bytecode/DOMJITAccessCasePatchpointParams.h. (JSC::AccessCaseSnippetParams::AccessCaseSnippetParams): * bytecode/GetterSetterAccessCase.cpp: (JSC::GetterSetterAccessCase::emitDOMJITGetter): * dfg/DFGAbstractInterpreterInlines.h: (JSC::DFG::AbstractInterpreter::executeEffects): * dfg/DFGByteCodeParser.cpp: (JSC::DFG::blessCallDOMGetter): (JSC::DFG::ByteCodeParser::handleDOMJITGetter): * dfg/DFGClobberize.h: (JSC::DFG::clobberize): * dfg/DFGFixupPhase.cpp: (JSC::DFG::FixupPhase::fixupNode): * dfg/DFGGraph.h: * dfg/DFGNode.h: * dfg/DFGSnippetParams.cpp: Renamed from Source/JavaScriptCore/dfg/DFGDOMJITPatchpointParams.cpp. * dfg/DFGSnippetParams.h: Renamed from Source/JavaScriptCore/dfg/DFGDOMJITPatchpointParams.h. (JSC::DFG::SnippetParams::SnippetParams): * dfg/DFGSpeculativeJIT.cpp: (JSC::DFG::allocateTemporaryRegistersForSnippet): (JSC::DFG::SpeculativeJIT::compileCallDOMGetter): (JSC::DFG::SpeculativeJIT::compileCheckSubClass): (JSC::DFG::allocateTemporaryRegistersForPatchpoint): Deleted. * domjit/DOMJITCallDOMGetterSnippet.h: Renamed from Source/JavaScriptCore/domjit/DOMJITCallDOMGetterPatchpoint.h. (JSC::DOMJIT::CallDOMGetterSnippet::create): * domjit/DOMJITGetterSetter.h: * domjit/DOMJITSignature.h: * domjit/DOMJITValue.h: Removed. * ftl/FTLLowerDFGToB3.cpp: (JSC::FTL::DFG::LowerDFGToB3::compileCheckSubClass): (JSC::FTL::DFG::LowerDFGToB3::compileCallDOMGetter): * ftl/FTLSnippetParams.cpp: Renamed from Source/JavaScriptCore/ftl/FTLDOMJITPatchpointParams.cpp. * ftl/FTLSnippetParams.h: Renamed from Source/JavaScriptCore/ftl/FTLDOMJITPatchpointParams.h. (JSC::FTL::SnippetParams::SnippetParams): * jit/Snippet.h: Renamed from Source/JavaScriptCore/domjit/DOMJITPatchpoint.h. (JSC::Snippet::create): (JSC::Snippet::setGenerator): (JSC::Snippet::generator): * jit/SnippetParams.h: Renamed from Source/JavaScriptCore/domjit/DOMJITPatchpointParams.h. (JSC::SnippetParams::~SnippetParams): (JSC::SnippetParams::Value::Value): (JSC::SnippetParams::Value::isGPR): (JSC::SnippetParams::Value::isFPR): (JSC::SnippetParams::Value::isJSValueRegs): (JSC::SnippetParams::Value::gpr): (JSC::SnippetParams::Value::fpr): (JSC::SnippetParams::Value::jsValueRegs): (JSC::SnippetParams::Value::reg): (JSC::SnippetParams::Value::value): (JSC::SnippetParams::SnippetParams): * jit/SnippetReg.h: Renamed from Source/JavaScriptCore/domjit/DOMJITReg.h. (JSC::SnippetReg::SnippetReg): * jit/SnippetSlowPathCalls.h: Renamed from Source/JavaScriptCore/domjit/DOMJITSlowPathCalls.h. * jsc.cpp: (WTF::DOMJITNode::checkSubClassSnippet): (WTF::DOMJITFunctionObject::checkSubClassSnippet): (WTF::DOMJITNode::checkSubClassPatchpoint): Deleted. (WTF::DOMJITFunctionObject::checkSubClassPatchpoint): Deleted. * runtime/ClassInfo.h: 2017-05-26 Keith Miller REEGRESSION(r217459): testapi fails in JSExportTest's wrapperForNSObjectisObject(). https://bugs.webkit.org/show_bug.cgi?id=172654 Reviewed by Mark Lam. The test's intent is to assert that an exception has not been thrown (as indicated by the message string), but the test was erroneously checking for ! the right condition. This is now fixed. * API/tests/JSExportTests.mm: (wrapperForNSObjectisObject): 2017-05-26 Joseph Pecoraro JSContext Inspector: Improve the reliability of automatically pausing in auto-attach https://bugs.webkit.org/show_bug.cgi?id=172664 Reviewed by Matt Baker. Automatically pause on connection was triggering a pause before the frontend may have initialized. Often during frontend initialization the frontend may perform an action that clears the pause state requested by the developer. This change defers the pause until after the frontend has initialized, right before returning to the application's code. * inspector/remote/RemoteControllableTarget.h: * inspector/remote/RemoteInspectionTarget.h: * inspector/remote/cocoa/RemoteConnectionToTargetCocoa.mm: (Inspector::RemoteConnectionToTarget::setup): * inspector/remote/glib/RemoteConnectionToTargetGlib.cpp: (Inspector::RemoteConnectionToTarget::setup): * runtime/JSGlobalObjectDebuggable.cpp: (JSC::JSGlobalObjectDebuggable::connect): (JSC::JSGlobalObjectDebuggable::pause): Deleted. * runtime/JSGlobalObjectDebuggable.h: Pass an immediatelyPause boolean on to the controller. Remove the current path that invokes a pause before initialization. * inspector/JSGlobalObjectInspectorController.h: * inspector/JSGlobalObjectInspectorController.cpp: (Inspector::JSGlobalObjectInspectorController::connectFrontend): (Inspector::JSGlobalObjectInspectorController::disconnectFrontend): Manage should immediately pause state. (Inspector::JSGlobalObjectInspectorController::frontendInitialized): (Inspector::JSGlobalObjectInspectorController::pause): Deleted. When initialized, trigger a pause if requested. 2017-05-26 Mark Lam Temporarily commenting out a JSExportTest test until webkit.org/b/172654 is fixed. https://bugs.webkit.org/show_bug.cgi?id=172655 Reviewed by Saam Barati. * API/tests/JSExportTests.mm: (wrapperForNSObjectisObject): 2017-05-26 Mark Lam REGRESSION(216914): testCFStrings encounters an invalid ExecState callee pointer. https://bugs.webkit.org/show_bug.cgi?id=172651 Reviewed by Saam Barati. This is because the assertion utility functions used in testCFStrings() expects to get the JSGlobalContextRef from the global context variable. However, testCFStrings() creates its own JSGlobalContextRef but does not set the global context variable to it. The fix is to make testCFStrings() initialize the global context variable properly. * API/tests/testapi.c: (testCFStrings): 2017-05-26 Yusuke Suzuki Give ModuleProgram the same treatment that we did for ProgramCode in bug#167725 https://bugs.webkit.org/show_bug.cgi?id=167805 Reviewed by Saam Barati. Since ModuleProgramExecutable is executed only once, we can skip compiling code unreachable from the current program count. This can skip massive initialization code. We already do this for global code in bug#167725. This patch extends it to module code. * interpreter/Interpreter.cpp: (JSC::Interpreter::executeModuleProgram): * interpreter/Interpreter.h: * jit/JIT.cpp: (JSC::JIT::privateCompileMainPass): * runtime/JSModuleRecord.cpp: (JSC::JSModuleRecord::evaluate): * runtime/JSModuleRecord.h: (JSC::JSModuleRecord::moduleProgramExecutable): Deleted. 2017-05-26 Oleksandr Skachkov Prevent async methods named 'function' https://bugs.webkit.org/show_bug.cgi?id=172598 Reviewed by Mark Lam. Prevent async method named 'function' in class. Link to change in ecma262 specification https://github.com/tc39/ecma262/pull/884 * parser/Parser.cpp: (JSC::Parser::parseClass): 2017-05-25 Yusuke Suzuki Unreviewed, build fix for GCC std::tuple does not have implicit constructor. Thus, we cannot use implicit construction with initializer brace. We should specify the name like `GetInst { }`. * bytecompiler/BytecodeGenerator.h: (JSC::StructureForInContext::addGetInst): 2017-05-25 Keith Miller Cleanup tests after r217240 https://bugs.webkit.org/show_bug.cgi?id=172466 Reviewed by Mark Lam. I forgot to make my test an actual test. Also, remove second call runJSExportTests() * API/tests/JSExportTests.mm: (wrapperForNSObjectisObject): * API/tests/testapi.mm: (testObjectiveCAPIMain): 2017-05-25 Michael Saboff The default setting of Option::criticalGCMemoryThreshold is too high for iOS https://bugs.webkit.org/show_bug.cgi?id=172617 Reviewed by Mark Lam. Reducing criticalGCMemoryThreshold to 0.80 eliminated jetsam on iOS devices when tested running JetStream. * runtime/Options.h: 2017-05-25 Saam Barati Our for-in optimization in the bytecode generator does its static analysis incorrectly https://bugs.webkit.org/show_bug.cgi?id=172532 Reviewed by Mark Lam. Our static analysis for when a for-in induction variable is written to tried to its analysis as we generate bytecode. This has issues, since it does not account for the dynamic execution path of the program. Let's consider a program where our old analysis worked: ``` for (let p in o) { o[p]; // We can transform this into a fast get_direct_pname p = 20; o[p]; // We cannot transform this since p has been changed. } ``` However, our static analysis did not account for loops, which exist in JavaScript. e.g, it would incorrectly compile this program as: ``` for (let p in o) { for (let i = 0; i < 20; ++i) { o[p]; // It transforms this to use get_direct_pname even though p will be over-written if we get here from the inner loop back edge! p = 20; o[p]; // We correctly do not transform this. } } ``` Because of this flaw, I've made the optimization more conservative. We now optimistically emit code for the optimized access. However, if a for-in context is *ever* invalidated, before we pop it off the stack, we rewrite the program's optimized accesses to no longer be optimized. To do this, each context keeps track of its optimized accesses. This patch also adds a new bytecode, op_nop, which is just a no-op. It was helpful to add this because reverting get_direct_pname to get_by_val will leave us with an extra instruction word because get_direct_pname is has a length of 7 where get_by_val has a length of 6. This leaves us with an extra slot that we fill with an op_nop. * bytecode/BytecodeDumper.cpp: (JSC::BytecodeDumper::dumpBytecode): * bytecode/BytecodeList.json: * bytecode/BytecodeUseDef.h: (JSC::computeUsesForBytecodeOffset): (JSC::computeDefsForBytecodeOffset): * bytecompiler/BytecodeGenerator.cpp: (JSC::BytecodeGenerator::emitGetByVal): (JSC::BytecodeGenerator::popIndexedForInScope): (JSC::BytecodeGenerator::popStructureForInScope): (JSC::BytecodeGenerator::invalidateForInContextForLocal): (JSC::StructureForInContext::pop): (JSC::IndexedForInContext::pop): * bytecompiler/BytecodeGenerator.h: (JSC::StructureForInContext::addGetInst): (JSC::IndexedForInContext::addGetInst): * dfg/DFGByteCodeParser.cpp: (JSC::DFG::ByteCodeParser::parseBlock): * dfg/DFGCapabilities.cpp: (JSC::DFG::capabilityLevel): * jit/JIT.cpp: (JSC::JIT::privateCompileMainPass): * jit/JIT.h: * jit/JITOpcodes.cpp: (JSC::JIT::emit_op_nop): * llint/LowLevelInterpreter.asm: 2017-05-25 Mark Lam ObjectToStringAdaptiveInferredPropertyValueWatchpoint should not reinstall itself nor handleFire if it's dying shortly. https://bugs.webkit.org/show_bug.cgi?id=172548 Reviewed by Filip Pizlo. Consider the following scenario: 1. A ObjectToStringAdaptiveInferredPropertyValueWatchpoint O1, watches for structure transitions, e.g. structure S2 transitioning to structure S3. In this case, O1 would be installed in S2's watchpoint set. 2. When the structure transition happens, structure S2 will fire watchpoint O1. 3. O1's handler will normally re-install itself in the watchpoint set of the new "transitioned to" structure S3. 4. "Installation" here requires writing into the StructureRareData SD3 of the new structure S3. If SD3 does not exist yet, the installation process will trigger the allocation of StructureRareData SD3. 5. It is possible that the Structure S1, and StructureRareData SD1 that owns the ObjectToStringAdaptiveInferredPropertyValueWatchpoint O1 is no longer reachable by the GC, and therefore will be collected soon. 6. The allocation of SD3 in (4) may trigger the sweeping of the StructureRareData SD1. This, in turn, triggers the deletion of the ObjectToStringAdaptiveInferredPropertyValueWatchpoint O1. After O1 is deleted in (6) and SD3 is allocated in (4), execution continues in AdaptiveInferredPropertyValueWatchpointBase::fire() where O1 gets installed in structure S3's watchpoint set. This is obviously incorrect because O1 is already deleted. The result is that badness happens later when S3's watchpoint set fires its watchpoints and accesses the deleted O1. The fix is to enhance AdaptiveInferredPropertyValueWatchpointBase::fire() to check if "this" is still valid before proceeding to re-install itself or to invoke its handleFire() method. ObjectToStringAdaptiveInferredPropertyValueWatchpoint (which extends AdaptiveInferredPropertyValueWatchpointBase) will override its isValid() method, and return false its owner StructureRareData is no longer reachable by the GC. This ensures that it won't be deleted while it's installed to any watchpoint set. Additional considerations and notes: 1. In the above, I talked about the ObjectToStringAdaptiveInferredPropertyValueWatchpoint being installed in watchpoint sets. What actually happens is that ObjectToStringAdaptiveInferredPropertyValueWatchpoint has 2 members (m_structureWatchpoint and m_propertyWatchpoint) which may be installed in watchpoint sets. The ObjectToStringAdaptiveInferredPropertyValueWatchpoint is not itself a Watchpoint object. But for brevity, in the above, I refer to the ObjectToStringAdaptiveInferredPropertyValueWatchpoint instead of its Watchpoint members. The description of the issue is still accurate given the life-cycle of the Watchpoint members are embedded in the enclosing ObjectToStringAdaptiveInferredPropertyValueWatchpoint object, and hence, they share the same life-cycle. 2. The top of AdaptiveInferredPropertyValueWatchpointBase::fire() removes its m_structureWatchpoint and m_propertyWatchpoint if they have been added to any watchpoint sets. This is safe to do even if the owner StructureRareData is no longer reachable by the GC. This is because the only way we can get to AdaptiveInferredPropertyValueWatchpointBase::fire() is if its Watchpoint members are still installed in some watchpoint set that fired. This means that the AdaptiveInferredPropertyValueWatchpointBase instance has not been deleted yet, because its destructor will automatically remove the Watchpoint members from any watchpoint sets. * bytecode/AdaptiveInferredPropertyValueWatchpointBase.cpp: (JSC::AdaptiveInferredPropertyValueWatchpointBase::fire): (JSC::AdaptiveInferredPropertyValueWatchpointBase::isValid): * bytecode/AdaptiveInferredPropertyValueWatchpointBase.h: * heap/FreeList.cpp: (JSC::FreeList::contains): * heap/FreeList.h: * heap/HeapCell.h: * heap/HeapCellInlines.h: (JSC::HeapCell::isLive): * heap/MarkedAllocator.h: (JSC::MarkedAllocator::isFreeListedCell): * heap/MarkedBlock.h: * heap/MarkedBlockInlines.h: (JSC::MarkedBlock::Handle::isFreeListedCell): * runtime/StructureRareData.cpp: (JSC::ObjectToStringAdaptiveInferredPropertyValueWatchpoint::isValid): 2017-05-23 Saam Barati We should not mmap zero bytes for a memory in Wasm https://bugs.webkit.org/show_bug.cgi?id=172528 Reviewed by Mark Lam. This patch fixes a bug where we would call into mmap with zero bytes when creating a slow WasmMemory with zero initial page size. This fix is simple: if we don't have any initial bytes, we just call the constructor in WasmMemory that's meant to handle this case. * wasm/WasmMemory.cpp: (JSC::Wasm::Memory::create): 2017-05-23 Brian Burg REGRESSION(r217051): Automation sessions fail to complete bootstrap https://bugs.webkit.org/show_bug.cgi?id=172513 Reviewed by Joseph Pecoraro. The changes to be more strict about typechecking messages were too strict. * inspector/remote/cocoa/RemoteInspectorCocoa.mm: (Inspector::RemoteInspector::receivedSetupMessage): WIRAutomatically is an optional key in the setup message. In the relay, this key gets copied into an NSDictionary as NSNull if the key isn't present in a forwarded command. We need to revert NSNull values to nil, since it's valid to call [nil boolValue] but not [[NSNull null] boolValue]. We also need to allow for nil in the typecheck for this key. 2017-05-23 Myles C. Maxfield Remove dead ENABLE(FONT_LOAD_EVENTS) code https://bugs.webkit.org/show_bug.cgi?id=172517 Rubber-stamped by Simon Fraser. * Configurations/FeatureDefines.xcconfig: 2017-05-23 Saam Barati CFGSimplificationPhase should not merge a block with itself https://bugs.webkit.org/show_bug.cgi?id=172508 Reviewed by Keith Miller. CFGSimplificationPhase can run into or create IR that ends up with a block that has a Jump to itself, and no other predecessors. It should gracefully handle such IR. Before this patch, it would not. The only criteria for merging 'block' with 'targetBlock' used to be that 'targetBlock.predecessors.size() == 1'. The code is written in such a way that if we merge a block with itself, we will infinite loop until we run out of memory. Merging a block with itself does not make sense for a few reasons. First, we're joining the contents of two blocks. What is the definition of joining a block with itself? I suppose we could simply unroll this self loop one level, but that would not be wise because this self loop is by definition unreachable unless it's the root block in the graph (which I think is invalid IR since we'd never generate bytecode that would do this). This patch employs an easy fix: we can't merge a block with itself. * dfg/DFGCFGSimplificationPhase.cpp: (JSC::DFG::CFGSimplificationPhase::canMergeBlocks): (JSC::DFG::CFGSimplificationPhase::run): (JSC::DFG::CFGSimplificationPhase::convertToJump): (JSC::DFG::CFGSimplificationPhase::mergeBlocks): 2017-05-22 Brian Burg Web Inspector: webkit reload policy should match default behavior https://bugs.webkit.org/show_bug.cgi?id=171385 Reviewed by Joseph Pecoraro. Add a new option to Page.reload that allows the test harness to reload its test page using the old reload behavior. The new behavior of revalidating expired cached subresources only is the current default, since only the test harness needs the old behavior. * inspector/protocol/Page.json: 2017-05-22 Keith Miller [Cocoa] An exported Objective C class’s prototype and constructor don't persist across JSContext deallocation https://bugs.webkit.org/show_bug.cgi?id=167708 Reviewed by Geoffrey Garen. This patch moves the Objective C wrapper map to the global object. In order to make this work the JSWrapperMap class no longer holds a reference to the JSContext. Instead, the context must be provided when getting a wrapper. Also, this patch fixes a "bug" where we would observe changes to the Object property on the global object when creating a wrapper for NSObject. * API/APICast.h: (toJSGlobalObject): * API/JSContext.mm: (-[JSContext ensureWrapperMap]): (-[JSContext initWithVirtualMachine:]): (-[JSContext dealloc]): (-[JSContext wrapperMap]): (-[JSContext initWithGlobalContextRef:]): (-[JSContext wrapperForObjCObject:]): (-[JSContext wrapperForJSObject:]): * API/JSWrapperMap.h: * API/JSWrapperMap.mm: (-[JSObjCClassInfo initForClass:]): (-[JSObjCClassInfo allocateConstructorAndPrototypeInContext:]): (-[JSObjCClassInfo wrapperForObject:inContext:]): (-[JSObjCClassInfo constructorInContext:]): (-[JSObjCClassInfo prototypeInContext:]): (-[JSWrapperMap initWithGlobalContextRef:]): (-[JSWrapperMap classInfoForClass:]): (-[JSWrapperMap jsWrapperForObject:inContext:]): (-[JSWrapperMap objcWrapperForJSValueRef:inContext:]): (-[JSObjCClassInfo initWithContext:forClass:]): Deleted. (-[JSObjCClassInfo allocateConstructorAndPrototype]): Deleted. (-[JSObjCClassInfo wrapperForObject:]): Deleted. (-[JSObjCClassInfo constructor]): Deleted. (-[JSObjCClassInfo prototype]): Deleted. (-[JSWrapperMap initWithContext:]): Deleted. (-[JSWrapperMap jsWrapperForObject:]): Deleted. (-[JSWrapperMap objcWrapperForJSValueRef:]): Deleted. * API/tests/JSExportTests.mm: (wrapperLifetimeIsTiedToGlobalObject): (runJSExportTests): * API/tests/testapi.mm: * runtime/JSGlobalObject.h: (JSC::JSGlobalObject::wrapperMap): (JSC::JSGlobalObject::setWrapperMap): 2017-05-22 Filip Pizlo FTL stack overflow handling should not assume that B3 never selects callee-saves in the prologue https://bugs.webkit.org/show_bug.cgi?id=172455 Reviewed by Mark Lam. The FTL needs to run B3's callee-save register restoration before it runs the exception handler's callee-save register restoration. This exposes B3's callee-save register algorithm in AssemblyHelpers so that the FTL can call it. * b3/air/AirGenerate.cpp: (JSC::B3::Air::generate): * ftl/FTLLowerDFGToB3.cpp: (JSC::FTL::DFG::LowerDFGToB3::lower): Fix the bug. * heap/Subspace.cpp: Added some debugging support. (JSC::Subspace::allocate): (JSC::Subspace::tryAllocate): (JSC::Subspace::didAllocate): * heap/Subspace.h: * jit/AssemblyHelpers.h: (JSC::AssemblyHelpers::addressFor): (JSC::AssemblyHelpers::emitSave): (JSC::AssemblyHelpers::emitRestore): 2017-05-20 Yusuke Suzuki [FTL] Support GetByVal with ArrayStorage and SlowPutArrayStorage https://bugs.webkit.org/show_bug.cgi?id=172216 Reviewed by Saam Barati. This patch adds GetByVal support for ArrayStorage and SlowPutArrayStorage. To lower CheckInBounds in FTL, we add a new GetVectorLength op. It only accepts ArrayStorage and SlowPutArrayStorage, then it produces vector length. CheckInBounds uses this vector length to perform bound checking for ArrayStorage and SlowPutArrayStorage. * dfg/DFGAbstractInterpreterInlines.h: (JSC::DFG::AbstractInterpreter::executeEffects): * dfg/DFGArrayMode.cpp: (JSC::DFG::permitsBoundsCheckLowering): * dfg/DFGClobberize.h: (JSC::DFG::clobberize): * dfg/DFGDoesGC.cpp: (JSC::DFG::doesGC): * dfg/DFGFixupPhase.cpp: (JSC::DFG::FixupPhase::fixupNode): * dfg/DFGHeapLocation.cpp: (WTF::printInternal): * dfg/DFGHeapLocation.h: * dfg/DFGIntegerRangeOptimizationPhase.cpp: * dfg/DFGNode.h: (JSC::DFG::Node::hasArrayMode): * dfg/DFGNodeType.h: * dfg/DFGPredictionPropagationPhase.cpp: * dfg/DFGSSALoweringPhase.cpp: (JSC::DFG::SSALoweringPhase::lowerBoundsCheck): * dfg/DFGSafeToExecute.h: (JSC::DFG::safeToExecute): * dfg/DFGSpeculativeJIT32_64.cpp: (JSC::DFG::SpeculativeJIT::compile): * dfg/DFGSpeculativeJIT64.cpp: (JSC::DFG::SpeculativeJIT::compile): * ftl/FTLAbstractHeapRepository.h: (JSC::FTL::AbstractHeapRepository::forIndexingType): (JSC::FTL::AbstractHeapRepository::forArrayType): * ftl/FTLCapabilities.cpp: (JSC::FTL::canCompile): * ftl/FTLLowerDFGToB3.cpp: (JSC::FTL::DFG::LowerDFGToB3::compileNode): (JSC::FTL::DFG::LowerDFGToB3::compileGetVectorLength): (JSC::FTL::DFG::LowerDFGToB3::compileGetByVal): * jit/JITPropertyAccess.cpp: (JSC::JIT::emitArrayStoragePutByVal): * jit/JITPropertyAccess32_64.cpp: (JSC::JIT::emitArrayStorageLoad): (JSC::JIT::emitArrayStoragePutByVal): 2017-05-21 Saam Barati We incorrectly throw a syntax error when declaring a top level for-loop iteration variable the same as a parameter https://bugs.webkit.org/show_bug.cgi?id=171041 Reviewed by Yusuke Suzuki. We were treating a for-loop variable declaration potentially as a top level statement, e.g, in a program like this: ``` function foo() { for (let variable of expr) { } } ``` But we should not be. This had the consequence of making this type of program throw a syntax error: ``` function foo(arg) { for (let arg of expr) { } } ``` even though it should not. The fix is simple, we just need to increment the statement depth before parsing anything inside the for loop. * parser/Parser.cpp: (JSC::Parser::parseForStatement): 2017-05-19 Yusuke Suzuki [JSC] Make get_by_val & string "499" to number 499 https://bugs.webkit.org/show_bug.cgi?id=172225 Reviewed by Saam Barati. Property subscript will be converted by ToString. So JS code is not aware of the original type of the subscript value. But our get_by_val can leverage information if the given subscript is number. Thus, passing number instead of string can improve the performance of get_by_val in all the tiers. In this patch, we add BytecodeGenerator::emitNodeForProperty. It attempts to convert the given value to Int32 index constant if the given value is a string that can be converted to Int32. This patch improves SixSpeed map-string.es5 by 9.8x. This accessing form can appear in some code like accessing the result of JSON. map-string.es5 1640.6738+-110.9182 ^ 167.4121+-23.8328 ^ definitely 9.8002x faster * bytecompiler/BytecodeGenerator.h: (JSC::BytecodeGenerator::emitNodeForProperty): (JSC::BytecodeGenerator::emitNodeForLeftHandSideForProperty): * bytecompiler/NodesCodegen.cpp: (JSC::TaggedTemplateNode::emitBytecode): (JSC::BracketAccessorNode::emitBytecode): (JSC::BytecodeIntrinsicNode::emit_intrinsic_putByValDirect): (JSC::FunctionCallBracketNode::emitBytecode): (JSC::PostfixNode::emitBracket): (JSC::PrefixNode::emitBracket): (JSC::AssignBracketNode::emitBytecode): (JSC::ReadModifyBracketNode::emitBytecode): (JSC::ForInNode::emitLoopHeader): (JSC::ForOfNode::emitBytecode): (JSC::ObjectPatternNode::bindValue): (JSC::AssignmentElementNode::bindValue): 2017-05-21 Saam Barati We overwrite the callee save space on the stack when throwing stack overflow from wasm https://bugs.webkit.org/show_bug.cgi?id=172316 Reviewed by Mark Lam. When throwing a stack overflow exception, the overflow thunk would do the following: move fp, sp populate argument registers call C code However, the C function is allowed to clobber our spilled callee saves that live below fp. The reason I did this move is that when we jump to this code, we've proven that sp is out of bounds on the stack. So we're not allowed to just use its value or keep growing the stack from that point. However, this patch revises this approach to be the same in spirit, but actually correct. We conservatively assume the B3 function we're coming from could have saved all callee saves. So we emit code like this now: add -maxNumCalleeSaveSpace, fp, sp populate argument registers call C code This ensures our callee saves will not be overwritten. Note that fp is still in a valid stack range here, since the thing calling the wasm code did a stack check. Also note that maxNumCalleeSaveSpace is less than our redzone size, so it's safe to decrement sp by this amount. The previously added wasm stack overflow test is an instance crash without this change on arm64. It also appears that this test crashed on some other x86 devices. * wasm/WasmThunks.cpp: (JSC::Wasm::throwStackOverflowFromWasmThunkGenerator): 2017-05-20 Chris Dumez Drop [NoInterfaceObject] from RTCDTMFSender and RTCStatsReport https://bugs.webkit.org/show_bug.cgi?id=172418 Reviewed by Youenn Fablet. Add CommonIdentifiers that are now needed. * runtime/CommonIdentifiers.h: 2017-05-20 Yusuke Suzuki Unreviewed, add scope.release() to propertyIsEnumerable functions. https://bugs.webkit.org/show_bug.cgi?id=172411 * runtime/JSGlobalObjectFunctions.cpp: (JSC::globalFuncPropertyIsEnumerable): * runtime/ObjectPrototype.cpp: (JSC::objectProtoFuncPropertyIsEnumerable): 2017-05-20 Yusuke Suzuki [JSC] Drop MapBase https://bugs.webkit.org/show_bug.cgi?id=172417 Reviewed by Sam Weinig. MapBase is a purely additional indirection. JSMap and JSSet can directly inherit HashMapImpl. Thus MapBase is unnecessary. This patch drops it. It is good because we can eliminate one indirection when accessing to map implementation. Moreover, we can drop one unnecessary allocation per Map and Set. * CMakeLists.txt: * JavaScriptCore.xcodeproj/project.pbxproj: * dfg/DFGSpeculativeJIT64.cpp: (JSC::DFG::SpeculativeJIT::compile): * ftl/FTLAbstractHeapRepository.h: * ftl/FTLLowerDFGToB3.cpp: (JSC::FTL::DFG::LowerDFGToB3::compileGetMapBucket): * runtime/HashMapImpl.cpp: (JSC::HashMapImpl::estimatedSize): (JSC::getHashMapImplKeyClassInfo): Deleted. (JSC::getHashMapImplKeyValueClassInfo): Deleted. * runtime/HashMapImpl.h: (JSC::HashMapImpl::finishCreation): (JSC::HashMapImpl::get): (JSC::HashMapImpl::info): Deleted. (JSC::HashMapImpl::createStructure): Deleted. (JSC::HashMapImpl::create): Deleted. * runtime/JSMap.h: (JSC::JSMap::set): (JSC::JSMap::get): Deleted. * runtime/JSMapIterator.cpp: (JSC::JSMapIterator::finishCreation): * runtime/JSSet.h: (JSC::JSSet::add): Deleted. * runtime/JSSetIterator.cpp: (JSC::JSSetIterator::finishCreation): * runtime/MapBase.cpp: Removed. * runtime/MapBase.h: Removed. * runtime/MapPrototype.cpp: (JSC::mapProtoFuncSize): * runtime/SetConstructor.cpp: (JSC::constructSet): * runtime/SetPrototype.cpp: (JSC::setProtoFuncSize): * runtime/VM.cpp: (JSC::VM::VM): 2017-05-20 Yusuke Suzuki [JSC] Speedup Object.assign for slow case by using propertyIsEnumerable https://bugs.webkit.org/show_bug.cgi?id=172411 Reviewed by Sam Weinig. We use @Reflect.@getOwnPropertyDescriptor() to check 1. the descriptor exists, 2. and the descriptor.enumrable is true But Object::propertyIsEnumerable does the completely same thing without allocating a new object for property descriptor. In this patch, we add a new private function @propertyIsEnumerable, and use it in Object.assign implementation. It does not allocate unnecessary objects. It is good for GC-pressure and performance. This patch improves SixSpeed object-assign.es6 by 1.7x. While this patch does not introduce a fast path for objects that do not have accessors, and it could speed up things further, this patch can speed up the common slow path cases that is the current implementation of Object.assign. object-assign.es6 1103.2487+-21.5602 ^ 621.8478+-34.9875 ^ definitely 1.7741x faster * builtins/BuiltinNames.h: * builtins/ObjectConstructor.js: (globalPrivate.enumerableOwnProperties): (assign): * runtime/JSGlobalObject.cpp: (JSC::JSGlobalObject::init): * runtime/JSGlobalObjectFunctions.cpp: (JSC::globalFuncPropertyIsEnumerable): * runtime/JSGlobalObjectFunctions.h: 2017-05-19 Yusuke Suzuki [JSC] Enable testapi on Mac CMake build https://bugs.webkit.org/show_bug.cgi?id=172354 Reviewed by Alex Christensen. This patch makes testapi buildable and runnable for Mac CMake port. * API/tests/DateTests.mm: (+[DateTests JSDateToNSDateTest]): (+[DateTests roundTripThroughJSDateTest]): This test only works with the en_US locale. * shell/CMakeLists.txt: * shell/PlatformMac.cmake: Some of tests rely on ARC. We enable ARC for those files. * shell/PlatformWin.cmake: Clean up. 2017-05-19 Mark Lam [Re-landing] DFG::SpeculativeJIT::pickCanTrample() is wrongly ignoring result registers. https://bugs.webkit.org/show_bug.cgi?id=172383 Reviewed by Filip Pizlo. pickCanTrample() is wrongly assuming that one of regT0 and regT1 is always available as a scratch register. This assumption is wrong if this canTrample register is used for a silentFill() after an operation that returns a result in regT0 or regT1. Turns out the only reason we need the canTrample register is for SetDoubleConstant. We can remove the need for this canTrample register by introducing a moveDouble() pseudo instruction in the MacroAssembler to do the job using the scratchRegister() on X86_64 or the dataMemoryTempRegister() on ARM64. In so doing, we can simplify the silentFill() code and eliminate the bug. Update for re-landing: Changed ARM64 to use scratchRegister() as well. scratchRegister() is the proper way to get the underlying dataMemoryTempRegister() as a scratch register. * assembler/MacroAssembler.h: (JSC::MacroAssembler::moveDouble): * dfg/DFGArrayifySlowPathGenerator.h: * dfg/DFGCallArrayAllocatorSlowPathGenerator.h: (JSC::DFG::CallArrayAllocatorWithVariableStructureVariableSizeSlowPathGenerator::CallArrayAllocatorWithVariableStructureVariableSizeSlowPathGenerator): * dfg/DFGCallCreateDirectArgumentsSlowPathGenerator.h: * dfg/DFGSaneStringGetByValSlowPathGenerator.h: * dfg/DFGSlowPathGenerator.h: (JSC::DFG::CallSlowPathGenerator::tearDown): * dfg/DFGSpeculativeJIT.cpp: (JSC::DFG::SpeculativeJIT::silentFill): (JSC::DFG::SpeculativeJIT::compileToLowerCase): (JSC::DFG::SpeculativeJIT::compileValueToInt32): (JSC::DFG::SpeculativeJIT::compileInstanceOfForObject): (JSC::DFG::SpeculativeJIT::emitUntypedBitOp): (JSC::DFG::SpeculativeJIT::emitUntypedRightShiftBitOp): (JSC::DFG::SpeculativeJIT::compileArithDiv): (JSC::DFG::SpeculativeJIT::compileArraySlice): (JSC::DFG::SpeculativeJIT::emitSwitchImm): (JSC::DFG::SpeculativeJIT::emitSwitchStringOnString): (JSC::DFG::SpeculativeJIT::compileStoreBarrier): * dfg/DFGSpeculativeJIT.h: (JSC::DFG::SpeculativeJIT::silentFill): (JSC::DFG::SpeculativeJIT::silentSpillAllRegisters): (JSC::DFG::SpeculativeJIT::silentFillAllRegisters): (JSC::DFG::SpeculativeJIT::pickCanTrample): Deleted. * dfg/DFGSpeculativeJIT32_64.cpp: (JSC::DFG::SpeculativeJIT::nonSpeculativePeepholeBranch): (JSC::DFG::SpeculativeJIT::nonSpeculativePeepholeStrictEq): (JSC::DFG::SpeculativeJIT::nonSpeculativeNonPeepholeStrictEq): (JSC::DFG::SpeculativeJIT::emitCall): (JSC::DFG::SpeculativeJIT::compile): * dfg/DFGSpeculativeJIT64.cpp: (JSC::DFG::SpeculativeJIT::nonSpeculativePeepholeBranch): (JSC::DFG::SpeculativeJIT::nonSpeculativePeepholeStrictEq): (JSC::DFG::SpeculativeJIT::nonSpeculativeNonPeepholeStrictEq): (JSC::DFG::SpeculativeJIT::emitCall): (JSC::DFG::SpeculativeJIT::compile): (JSC::DFG::SpeculativeJIT::convertAnyInt): 2017-05-19 Ryan Haddad Unreviewed, rolling out r217156. This change broke the iOS build. Reverted changeset: "DFG::SpeculativeJIT::pickCanTrample() is wrongly ignoring result registers." https://bugs.webkit.org/show_bug.cgi?id=172383 http://trac.webkit.org/changeset/217156 2017-05-19 Mark Lam Add missing exception check. https://bugs.webkit.org/show_bug.cgi?id=172346 Reviewed by Geoffrey Garen. * runtime/JSObject.cpp: (JSC::JSObject::hasInstance): 2017-05-19 Mark Lam DFG::SpeculativeJIT::pickCanTrample() is wrongly ignoring result registers. https://bugs.webkit.org/show_bug.cgi?id=172383 Reviewed by Filip Pizlo. pickCanTrample() is wrongly assuming that one of regT0 and regT1 is always available as a scratch register. This assumption is wrong if this canTrample register is used for a silentFill() after an operation that returns a result in regT0 or regT1. Turns out the only reason we need the canTrample register is for SetDoubleConstant. We can remove the need for this canTrample register by introducing a moveDouble() pseudo instruction in the MacroAssembler to do the job using the scratchRegister() on X86_64 or the dataMemoryTempRegister() on ARM64. In so doing, we can simplify the silentFill() code and eliminate the bug. * assembler/MacroAssembler.h: (JSC::MacroAssembler::moveDouble): * dfg/DFGArrayifySlowPathGenerator.h: * dfg/DFGCallArrayAllocatorSlowPathGenerator.h: (JSC::DFG::CallArrayAllocatorWithVariableStructureVariableSizeSlowPathGenerator::CallArrayAllocatorWithVariableStructureVariableSizeSlowPathGenerator): * dfg/DFGCallCreateDirectArgumentsSlowPathGenerator.h: * dfg/DFGSaneStringGetByValSlowPathGenerator.h: * dfg/DFGSlowPathGenerator.h: (JSC::DFG::CallSlowPathGenerator::tearDown): * dfg/DFGSpeculativeJIT.cpp: (JSC::DFG::SpeculativeJIT::silentFill): (JSC::DFG::SpeculativeJIT::compileToLowerCase): (JSC::DFG::SpeculativeJIT::compileValueToInt32): (JSC::DFG::SpeculativeJIT::compileInstanceOfForObject): (JSC::DFG::SpeculativeJIT::emitUntypedBitOp): (JSC::DFG::SpeculativeJIT::emitUntypedRightShiftBitOp): (JSC::DFG::SpeculativeJIT::compileArithDiv): (JSC::DFG::SpeculativeJIT::compileArraySlice): (JSC::DFG::SpeculativeJIT::emitSwitchImm): (JSC::DFG::SpeculativeJIT::emitSwitchStringOnString): (JSC::DFG::SpeculativeJIT::compileStoreBarrier): * dfg/DFGSpeculativeJIT.h: (JSC::DFG::SpeculativeJIT::silentFill): (JSC::DFG::SpeculativeJIT::silentSpillAllRegisters): (JSC::DFG::SpeculativeJIT::silentFillAllRegisters): (JSC::DFG::SpeculativeJIT::pickCanTrample): Deleted. * dfg/DFGSpeculativeJIT32_64.cpp: (JSC::DFG::SpeculativeJIT::nonSpeculativePeepholeBranch): (JSC::DFG::SpeculativeJIT::nonSpeculativePeepholeStrictEq): (JSC::DFG::SpeculativeJIT::nonSpeculativeNonPeepholeStrictEq): (JSC::DFG::SpeculativeJIT::emitCall): (JSC::DFG::SpeculativeJIT::compile): * dfg/DFGSpeculativeJIT64.cpp: (JSC::DFG::SpeculativeJIT::nonSpeculativePeepholeBranch): (JSC::DFG::SpeculativeJIT::nonSpeculativePeepholeStrictEq): (JSC::DFG::SpeculativeJIT::nonSpeculativeNonPeepholeStrictEq): (JSC::DFG::SpeculativeJIT::emitCall): (JSC::DFG::SpeculativeJIT::compile): (JSC::DFG::SpeculativeJIT::convertAnyInt): 2017-05-19 Filip Pizlo Deduplicate some code in arrayProtoPrivateFuncConcatMemcpy https://bugs.webkit.org/show_bug.cgi?id=172382 Reviewed by Saam Barati. This is just a small clean-up - my last patch here created some unnecessary code duplication. * runtime/ArrayPrototype.cpp: (JSC::arrayProtoPrivateFuncConcatMemcpy): 2017-05-19 Filip Pizlo arrayProtoPrivateFuncConcatMemcpy needs to be down with firstArray being undecided https://bugs.webkit.org/show_bug.cgi?id=172369 Reviewed by Mark Lam. * heap/Subspace.cpp: Reshaped the code a bit to aid debugging. (JSC::Subspace::allocate): (JSC::Subspace::tryAllocate): * runtime/ArrayPrototype.cpp: (JSC::arrayProtoPrivateFuncConcatMemcpy): Fix the bug! * runtime/ObjectInitializationScope.cpp: Provide even better feedback. (JSC::ObjectInitializationScope::verifyPropertiesAreInitialized): 2017-05-18 Filip Pizlo B3::Value::effects() says that having a fence range implies the fence bit, but on x86_64 we lower loadAcq/storeRel to load/store so the store-before-load fence bit orderings won't be honored https://bugs.webkit.org/show_bug.cgi?id=172306 Reviewed by Michael Saboff. This changes B3 to emit xchg and its variants for fenced stores on x86. This ensures that fenced stores cannot be reordered around other fenced instructions. Previously, B3 emitted normal store instructions for fenced stores. That's wrong because then you get reorderings that are possible in TSO but impossible in SC. Fenced instructions are supposed to be SC with respect for each other. This is imprecise. If you really just wanted a store-release, then every X86 store does this. But, in B3, fenced stores are ARM-style store-release, meaning that they are fenced with respect to all other fences. If we ever did want to say that something is a store release in the traditional sense, then we'd want MemoryValue to have a fence flag. Then, having a fence range without the fence flag would mean the traditional store-release, which lowers to a normal store on x86. But to my knowledge, that traditional store-release is only useful for unlocking spinlocks. We don't use spinlocks in JSC. Adaptive locks require CAS for unlock, and B3 CAS is plenty fast. I think it's OK to have this small imprecision of giving clients an ARM-style store-release on x86 using xchg. The implication of this change is that the FTL no longer violates the SAB memory model. * assembler/MacroAssemblerX86Common.h: (JSC::MacroAssemblerX86Common::xchg8): (JSC::MacroAssemblerX86Common::xchg16): (JSC::MacroAssemblerX86Common::xchg32): (JSC::MacroAssemblerX86Common::loadAcq8): Deleted. (JSC::MacroAssemblerX86Common::loadAcq8SignedExtendTo32): Deleted. (JSC::MacroAssemblerX86Common::loadAcq16): Deleted. (JSC::MacroAssemblerX86Common::loadAcq16SignedExtendTo32): Deleted. (JSC::MacroAssemblerX86Common::loadAcq32): Deleted. (JSC::MacroAssemblerX86Common::storeRel8): Deleted. (JSC::MacroAssemblerX86Common::storeRel16): Deleted. (JSC::MacroAssemblerX86Common::storeRel32): Deleted. * assembler/MacroAssemblerX86_64.h: (JSC::MacroAssemblerX86_64::xchg64): (JSC::MacroAssemblerX86_64::loadAcq64): Deleted. (JSC::MacroAssemblerX86_64::storeRel64): Deleted. * b3/B3LowerToAir.cpp: (JSC::B3::Air::LowerToAir::ArgPromise::inst): (JSC::B3::Air::LowerToAir::trappingInst): (JSC::B3::Air::LowerToAir::tryAppendStoreBinOp): (JSC::B3::Air::LowerToAir::createStore): (JSC::B3::Air::LowerToAir::storeOpcode): (JSC::B3::Air::LowerToAir::appendStore): (JSC::B3::Air::LowerToAir::append): (JSC::B3::Air::LowerToAir::appendTrapping): (JSC::B3::Air::LowerToAir::fillStackmap): (JSC::B3::Air::LowerToAir::lower): * b3/air/AirKind.cpp: (JSC::B3::Air::Kind::dump): * b3/air/AirKind.h: (JSC::B3::Air::Kind::Kind): (JSC::B3::Air::Kind::operator==): (JSC::B3::Air::Kind::hash): * b3/air/AirLowerAfterRegAlloc.cpp: (JSC::B3::Air::lowerAfterRegAlloc): * b3/air/AirLowerMacros.cpp: (JSC::B3::Air::lowerMacros): * b3/air/AirOpcode.opcodes: * b3/air/AirValidate.cpp: * b3/air/opcode_generator.rb: * b3/testb3.cpp: (JSC::B3::correctSqrt): (JSC::B3::testSqrtArg): (JSC::B3::testSqrtImm): (JSC::B3::testSqrtMem): (JSC::B3::testSqrtArgWithUselessDoubleConversion): (JSC::B3::testSqrtArgWithEffectfulDoubleConversion): (JSC::B3::testStoreRelAddLoadAcq32): (JSC::B3::testTrappingLoad): (JSC::B3::testTrappingStore): (JSC::B3::testTrappingLoadAddStore): (JSC::B3::testTrappingLoadDCE): 2017-05-19 Don Olmstead [JSC] Remove PLATFORM(WIN) references https://bugs.webkit.org/show_bug.cgi?id=172294 Reviewed by Yusuke Suzuki. * heap/MachineStackMarker.cpp: (JSC::MachineThreads::removeThread): * llint/LLIntOfflineAsmConfig.h: * runtime/ConfigFile.h: * runtime/VM.cpp: (JSC::VM::updateStackLimits): 2017-05-19 Yusuke Suzuki [JSC][DFG][DOMJIT] Extend CheckDOM to CheckSubClass https://bugs.webkit.org/show_bug.cgi?id=172098 Reviewed by Saam Barati. In this patch, we generalize CheckDOM to CheckSubClass. It can accept any ClassInfo and perform ClassInfo check in DFG / FTL. Now, we add a new function pointer to ClassInfo, checkSubClassPatchpoint. It can create DOMJIT patchpoint for that ClassInfo. It it natural that ClassInfo holds the way to emit DOMJIT::Patchpoint to perform CheckSubClass rather than having it in each DOMJIT getter / function signature annotation. One problem is that it enlarges the size of ClassInfo. But this is the best place to put this function pointer. By doing so, we can add a patchpoint for CheckSubClass in an non-intrusive manner: WebCore can inject patchpoints without interactive JSC. We still have a way to reduce the size of ClassInfo if we move ArrayBuffer related methods out to the other places. This patch touches many files because we add a new function pointer to ClassInfo. But they are basically mechanical change. * API/JSAPIWrapperObject.mm: * API/JSCallbackConstructor.cpp: * API/JSCallbackFunction.cpp: * API/JSCallbackObject.cpp: * API/ObjCCallbackFunction.mm: * CMakeLists.txt: * JavaScriptCore.xcodeproj/project.pbxproj: * bytecode/CodeBlock.cpp: * bytecode/DOMJITAccessCasePatchpointParams.h: (JSC::DOMJITAccessCasePatchpointParams::DOMJITAccessCasePatchpointParams): * bytecode/EvalCodeBlock.cpp: * bytecode/FunctionCodeBlock.cpp: * bytecode/GetterSetterAccessCase.cpp: (JSC::GetterSetterAccessCase::emitDOMJITGetter): * bytecode/ModuleProgramCodeBlock.cpp: * bytecode/ProgramCodeBlock.cpp: * bytecode/UnlinkedCodeBlock.cpp: * bytecode/UnlinkedEvalCodeBlock.cpp: * bytecode/UnlinkedFunctionCodeBlock.cpp: * bytecode/UnlinkedFunctionExecutable.cpp: * bytecode/UnlinkedModuleProgramCodeBlock.cpp: * bytecode/UnlinkedProgramCodeBlock.cpp: * debugger/DebuggerScope.cpp: * dfg/DFGAbstractInterpreterInlines.h: (JSC::DFG::AbstractInterpreter::executeEffects): * dfg/DFGByteCodeParser.cpp: (JSC::DFG::ByteCodeParser::handleDOMJITGetter): * dfg/DFGClobberize.h: (JSC::DFG::clobberize): * dfg/DFGConstantFoldingPhase.cpp: (JSC::DFG::ConstantFoldingPhase::foldConstants): * dfg/DFGDOMJITPatchpointParams.h: (JSC::DFG::DOMJITPatchpointParams::DOMJITPatchpointParams): * dfg/DFGDoesGC.cpp: (JSC::DFG::doesGC): * dfg/DFGFixupPhase.cpp: (JSC::DFG::FixupPhase::fixupNode): (JSC::DFG::FixupPhase::attemptToMakeCallDOM): (JSC::DFG::FixupPhase::fixupCheckSubClass): (JSC::DFG::FixupPhase::fixupCheckDOM): Deleted. * dfg/DFGGraph.cpp: (JSC::DFG::Graph::dump): * dfg/DFGNode.h: (JSC::DFG::Node::hasClassInfo): (JSC::DFG::Node::classInfo): (JSC::DFG::Node::hasCheckDOMPatchpoint): Deleted. (JSC::DFG::Node::checkDOMPatchpoint): Deleted. * dfg/DFGNodeType.h: * dfg/DFGPredictionPropagationPhase.cpp: * dfg/DFGSafeToExecute.h: (JSC::DFG::safeToExecute): * dfg/DFGSpeculativeJIT.cpp: (JSC::DFG::SpeculativeJIT::compileCheckSubClass): (JSC::DFG::SpeculativeJIT::compileCheckDOM): Deleted. * dfg/DFGSpeculativeJIT.h: (JSC::DFG::SpeculativeJIT::vm): * dfg/DFGSpeculativeJIT32_64.cpp: (JSC::DFG::SpeculativeJIT::compile): * dfg/DFGSpeculativeJIT64.cpp: (JSC::DFG::SpeculativeJIT::compile): * domjit/DOMJITGetterSetter.h: * domjit/DOMJITPatchpointParams.h: (JSC::DOMJIT::PatchpointParams::PatchpointParams): (JSC::DOMJIT::PatchpointParams::vm): * domjit/DOMJITSignature.h: (JSC::DOMJIT::Signature::Signature): (JSC::DOMJIT::Signature::checkDOM): Deleted. * ftl/FTLAbstractHeapRepository.h: * ftl/FTLCapabilities.cpp: (JSC::FTL::canCompile): * ftl/FTLDOMJITPatchpointParams.h: (JSC::FTL::DOMJITPatchpointParams::DOMJITPatchpointParams): * ftl/FTLLowerDFGToB3.cpp: (JSC::FTL::DFG::LowerDFGToB3::compileNode): (JSC::FTL::DFG::LowerDFGToB3::compileCheckSubClass): (JSC::FTL::DFG::LowerDFGToB3::compileCheckDOM): Deleted. * inspector/JSInjectedScriptHost.cpp: * inspector/JSInjectedScriptHostPrototype.cpp: * inspector/JSJavaScriptCallFrame.cpp: * inspector/JSJavaScriptCallFramePrototype.cpp: * jsc.cpp: (WTF::DOMJITNode::checkSubClassPatchpoint): (WTF::DOMJITFunctionObject::checkSubClassPatchpoint): (WTF::DOMJITFunctionObject::finishCreation): (WTF::DOMJITCheckSubClassObject::DOMJITCheckSubClassObject): (WTF::DOMJITCheckSubClassObject::createStructure): (WTF::DOMJITCheckSubClassObject::create): (WTF::DOMJITCheckSubClassObject::safeFunction): (WTF::DOMJITCheckSubClassObject::unsafeFunction): (WTF::DOMJITCheckSubClassObject::finishCreation): (GlobalObject::finishCreation): (functionCreateDOMJITCheckSubClassObject): (WTF::DOMJITNode::checkDOMJITNode): Deleted. (WTF::DOMJITFunctionObject::checkDOMJITNode): Deleted. * runtime/AbstractModuleRecord.cpp: * runtime/ArrayBufferNeuteringWatchpoint.cpp: * runtime/ArrayConstructor.cpp: * runtime/ArrayIteratorPrototype.cpp: * runtime/ArrayPrototype.cpp: * runtime/AsyncFunctionConstructor.cpp: * runtime/AsyncFunctionPrototype.cpp: * runtime/AtomicsObject.cpp: * runtime/BooleanConstructor.cpp: * runtime/BooleanObject.cpp: * runtime/BooleanPrototype.cpp: * runtime/ClassInfo.cpp: Copied from Source/JavaScriptCore/tools/JSDollarVM.cpp. (JSC::ClassInfo::dump): * runtime/ClassInfo.h: (JSC::ClassInfo::offsetOfParentClass): * runtime/ClonedArguments.cpp: * runtime/ConsoleObject.cpp: * runtime/CustomGetterSetter.cpp: * runtime/DateConstructor.cpp: * runtime/DateInstance.cpp: * runtime/DatePrototype.cpp: * runtime/DirectArguments.cpp: * runtime/Error.cpp: * runtime/ErrorConstructor.cpp: * runtime/ErrorInstance.cpp: * runtime/ErrorPrototype.cpp: * runtime/EvalExecutable.cpp: * runtime/Exception.cpp: * runtime/ExceptionHelpers.cpp: * runtime/ExecutableBase.cpp: * runtime/FunctionConstructor.cpp: * runtime/FunctionExecutable.cpp: * runtime/FunctionPrototype.cpp: * runtime/FunctionRareData.cpp: * runtime/GeneratorFunctionConstructor.cpp: * runtime/GeneratorFunctionPrototype.cpp: * runtime/GeneratorPrototype.cpp: * runtime/GetterSetter.cpp: * runtime/HashMapImpl.cpp: * runtime/HashMapImpl.h: * runtime/InferredType.cpp: (JSC::InferredType::create): * runtime/InferredTypeTable.cpp: * runtime/InferredValue.cpp: * runtime/InspectorInstrumentationObject.cpp: * runtime/InternalFunction.cpp: * runtime/IntlCollator.cpp: * runtime/IntlCollatorConstructor.cpp: * runtime/IntlCollatorPrototype.cpp: * runtime/IntlDateTimeFormat.cpp: * runtime/IntlDateTimeFormatConstructor.cpp: * runtime/IntlDateTimeFormatPrototype.cpp: * runtime/IntlNumberFormat.cpp: * runtime/IntlNumberFormatConstructor.cpp: * runtime/IntlNumberFormatPrototype.cpp: * runtime/IntlObject.cpp: * runtime/IteratorPrototype.cpp: * runtime/JSAPIValueWrapper.cpp: * runtime/JSArray.cpp: * runtime/JSArrayBuffer.cpp: * runtime/JSArrayBufferConstructor.cpp: * runtime/JSArrayBufferPrototype.cpp: * runtime/JSArrayBufferView.cpp: * runtime/JSAsyncFunction.cpp: * runtime/JSBoundFunction.cpp: * runtime/JSCallee.cpp: * runtime/JSCustomGetterSetterFunction.cpp: * runtime/JSDataView.cpp: * runtime/JSDataViewPrototype.cpp: * runtime/JSEnvironmentRecord.cpp: * runtime/JSFixedArray.cpp: * runtime/JSFunction.cpp: * runtime/JSGeneratorFunction.cpp: * runtime/JSGlobalLexicalEnvironment.cpp: * runtime/JSGlobalObject.cpp: * runtime/JSInternalPromise.cpp: * runtime/JSInternalPromiseConstructor.cpp: * runtime/JSInternalPromiseDeferred.cpp: * runtime/JSInternalPromisePrototype.cpp: * runtime/JSLexicalEnvironment.cpp: * runtime/JSMap.cpp: * runtime/JSMapIterator.cpp: * runtime/JSModuleEnvironment.cpp: * runtime/JSModuleLoader.cpp: * runtime/JSModuleNamespaceObject.cpp: * runtime/JSModuleRecord.cpp: * runtime/JSNativeStdFunction.cpp: * runtime/JSONObject.cpp: * runtime/JSObject.cpp: * runtime/JSPromise.cpp: * runtime/JSPromiseConstructor.cpp: * runtime/JSPromiseDeferred.cpp: * runtime/JSPromisePrototype.cpp: * runtime/JSPropertyNameEnumerator.cpp: * runtime/JSPropertyNameIterator.cpp: * runtime/JSProxy.cpp: * runtime/JSScriptFetcher.cpp: * runtime/JSSet.cpp: * runtime/JSSetIterator.cpp: * runtime/JSSourceCode.cpp: * runtime/JSString.cpp: * runtime/JSStringIterator.cpp: * runtime/JSSymbolTableObject.cpp: * runtime/JSTemplateRegistryKey.cpp: * runtime/JSTypedArrayConstructors.cpp: * runtime/JSTypedArrayPrototypes.cpp: * runtime/JSTypedArrayViewConstructor.cpp: * runtime/JSTypedArrays.cpp: * runtime/JSWeakMap.cpp: * runtime/JSWeakSet.cpp: * runtime/JSWithScope.cpp: * runtime/MapConstructor.cpp: * runtime/MapIteratorPrototype.cpp: * runtime/MapPrototype.cpp: * runtime/MathObject.cpp: * runtime/ModuleLoaderPrototype.cpp: * runtime/ModuleProgramExecutable.cpp: * runtime/NativeErrorConstructor.cpp: * runtime/NativeExecutable.cpp: * runtime/NativeStdFunctionCell.cpp: * runtime/NullGetterFunction.cpp: * runtime/NullSetterFunction.cpp: * runtime/NumberConstructor.cpp: * runtime/NumberObject.cpp: * runtime/NumberPrototype.cpp: * runtime/ObjectConstructor.cpp: * runtime/ObjectPrototype.cpp: * runtime/ProgramExecutable.cpp: * runtime/PropertyTable.cpp: * runtime/ProxyConstructor.cpp: * runtime/ProxyObject.cpp: * runtime/ProxyRevoke.cpp: * runtime/ReflectObject.cpp: * runtime/RegExp.cpp: * runtime/RegExpConstructor.cpp: * runtime/RegExpObject.cpp: * runtime/RegExpPrototype.cpp: * runtime/ScopedArguments.cpp: * runtime/ScopedArgumentsTable.cpp: * runtime/ScriptExecutable.cpp: * runtime/SetConstructor.cpp: * runtime/SetIteratorPrototype.cpp: * runtime/SetPrototype.cpp: * runtime/SparseArrayValueMap.cpp: * runtime/StrictEvalActivation.cpp: * runtime/StringConstructor.cpp: * runtime/StringIteratorPrototype.cpp: * runtime/StringObject.cpp: * runtime/StringPrototype.cpp: * runtime/Structure.cpp: * runtime/StructureChain.cpp: * runtime/StructureRareData.cpp: * runtime/Symbol.cpp: * runtime/SymbolConstructor.cpp: * runtime/SymbolObject.cpp: * runtime/SymbolPrototype.cpp: * runtime/SymbolTable.cpp: * runtime/WeakMapConstructor.cpp: * runtime/WeakMapData.cpp: * runtime/WeakMapPrototype.cpp: * runtime/WeakSetConstructor.cpp: * runtime/WeakSetPrototype.cpp: * testRegExp.cpp: * tools/JSDollarVM.cpp: * tools/JSDollarVMPrototype.cpp: * wasm/JSWebAssembly.cpp: * wasm/js/JSWebAssemblyCodeBlock.cpp: * wasm/js/JSWebAssemblyCompileError.cpp: * wasm/js/JSWebAssemblyInstance.cpp: * wasm/js/JSWebAssemblyLinkError.cpp: * wasm/js/JSWebAssemblyMemory.cpp: * wasm/js/JSWebAssemblyModule.cpp: * wasm/js/JSWebAssemblyRuntimeError.cpp: * wasm/js/JSWebAssemblyTable.cpp: * wasm/js/WebAssemblyCompileErrorConstructor.cpp: * wasm/js/WebAssemblyCompileErrorPrototype.cpp: * wasm/js/WebAssemblyFunction.cpp: * wasm/js/WebAssemblyFunctionBase.cpp: * wasm/js/WebAssemblyInstanceConstructor.cpp: * wasm/js/WebAssemblyInstancePrototype.cpp: * wasm/js/WebAssemblyLinkErrorConstructor.cpp: * wasm/js/WebAssemblyLinkErrorPrototype.cpp: * wasm/js/WebAssemblyMemoryConstructor.cpp: * wasm/js/WebAssemblyMemoryPrototype.cpp: * wasm/js/WebAssemblyModuleConstructor.cpp: * wasm/js/WebAssemblyModulePrototype.cpp: * wasm/js/WebAssemblyModuleRecord.cpp: * wasm/js/WebAssemblyPrototype.cpp: * wasm/js/WebAssemblyRuntimeErrorConstructor.cpp: * wasm/js/WebAssemblyRuntimeErrorPrototype.cpp: * wasm/js/WebAssemblyTableConstructor.cpp: * wasm/js/WebAssemblyTablePrototype.cpp: * wasm/js/WebAssemblyToJSCallee.cpp: * wasm/js/WebAssemblyWrapperFunction.cpp: 2017-05-18 JF Bastien WebAssembly: exports is a getter https://bugs.webkit.org/show_bug.cgi?id=172129 Reviewed by Saam Barati. As updated here: https://github.com/WebAssembly/design/pull/1062 * wasm/js/JSWebAssemblyInstance.cpp: (JSC::JSWebAssemblyInstance::finishCreation): don't putDirect here anymore * wasm/js/JSWebAssemblyInstance.h: (JSC::JSWebAssemblyInstance::moduleNamespaceObject): add accessor * wasm/js/WebAssemblyFunctionBase.cpp: squelch causing a warning * wasm/js/WebAssemblyInstancePrototype.cpp: use LUT (JSC::getInstance): helper, as in surrounding files (JSC::webAssemblyInstanceProtoFuncExports): instead of putDirect * wasm/js/WebAssemblyMemoryPrototype.cpp: pass VM around as for Table (JSC::getMemory): (JSC::webAssemblyMemoryProtoFuncGrow): (JSC::webAssemblyMemoryProtoFuncBuffer): * wasm/js/WebAssemblyTablePrototype.cpp: static everywhere as with other code (JSC::webAssemblyTableProtoFuncLength): (JSC::webAssemblyTableProtoFuncGrow): (JSC::webAssemblyTableProtoFuncGet): (JSC::webAssemblyTableProtoFuncSet): 2017-05-18 Saam Barati Proxy's [[Get]] passes incorrect receiver https://bugs.webkit.org/show_bug.cgi?id=164849 Reviewed by Yusuke Suzuki. * runtime/ProxyObject.cpp: (JSC::performProxyGet): 2017-05-18 Andy Estes ENABLE(APPLE_PAY_DELEGATE) should be NO on macOS Sierra and earlier https://bugs.webkit.org/show_bug.cgi?id=172305 Reviewed by Anders Carlsson. * Configurations/FeatureDefines.xcconfig: 2017-05-18 Saam Barati We need to destroy worker threads in jsc.cpp https://bugs.webkit.org/show_bug.cgi?id=170751 Reviewed by Filip Pizlo. This patch fixes a bug where a $ agent worker would still have compilation threads running after the thread the worker was created on dies. This manifested itself inside DFG AI where we would notice a string constant is atomic, then the worker thread would die, destroying its atomic string table, then we'd notice the same string is no longer atomic, and we'd crash because we'd fail to see the same speculated type for the same JSValue. This patch makes it so that $ agent workers destroy their VM when they're done executing. Before a VM gets destroyed, it ensures that all its compilation threads finish. * jsc.cpp: (functionDollarAgentStart): (runJSC): (jscmain): 2017-05-18 Michael Saboff Add FTL whitelist debugging option https://bugs.webkit.org/show_bug.cgi?id=172321 Reviewed by Saam Barati. * dfg/DFGTierUpCheckInjectionPhase.cpp: (JSC::DFG::ensureGlobalFTLWhitelist): (JSC::DFG::TierUpCheckInjectionPhase::run): * runtime/Options.h: * tools/FunctionWhitelist.cpp: (JSC::FunctionWhitelist::contains): 2017-05-18 Filip Pizlo Constructor calls set this too early https://bugs.webkit.org/show_bug.cgi?id=172302 Reviewed by Saam Barati. We were setting this before evaluating the arguments, so this code: var x = 42; new x(x = function() { }); Would crash because we would pass 42 as this, and create_this would treat it as a cell. Dereferencing a non-cell is guaranteed to crash. * bytecompiler/BytecodeGenerator.cpp: (JSC::BytecodeGenerator::emitConstruct): * bytecompiler/BytecodeGenerator.h: * bytecompiler/NodesCodegen.cpp: (JSC::NewExprNode::emitBytecode): (JSC::FunctionCallValueNode::emitBytecode): 2017-05-18 Saam Barati WebAssembly: perform stack checks https://bugs.webkit.org/show_bug.cgi?id=165546 Reviewed by Filip Pizlo. This patch adds stack checks to wasm. It implements it by storing the stack bounds on the Context. Stack checking works as normal, except we do a small optimization for terminal nodes in the call tree (nodes that don't make any calls). These nodes will only do a stack check if their frame size is beyond 1024 bytes. Otherwise, it's assumed the parent that called them did their stack check for them. This is because all things that make calls make sure to do an extra 1024 bytes whenever doing a stack check. We also take into account stack size for potential JS calls when doing stack checks since our JS stubs don't do this on their own. Each frame will ensure it does a stack check large enough for any potential JS call stubs it'll execute. Surprisingly, this patch is neutral on WasmBench and TitzerBench. * llint/LLIntData.cpp: (JSC::LLInt::Data::performAssertions): * llint/LowLevelInterpreter.asm: * runtime/Error.cpp: (JSC::createRangeError): (JSC::addErrorInfoAndGetBytecodeOffset): I fixed a bug here where we assumed that the first frame that has line and column info would be in our stack trace. This is not correct since we limit our stack trace size. If everything in our limited size stack trace is Wasm, then we won't have any frames with line and column info. * runtime/Error.h: * runtime/ExceptionHelpers.cpp: (JSC::createStackOverflowError): * runtime/ExceptionHelpers.h: * runtime/JSGlobalObject.cpp: (JSC::JSGlobalObject::init): (JSC::JSGlobalObject::visitChildren): * runtime/JSGlobalObject.h: (JSC::JSGlobalObject::webAssemblyToJSCalleeStructure): * runtime/JSType.h: * runtime/Options.h: I've added a new option that controls whether or not we use fast TLS for the wasm context. * runtime/VM.cpp: (JSC::VM::VM): * runtime/VM.h: * wasm/WasmB3IRGenerator.cpp: (JSC::Wasm::B3IRGenerator::B3IRGenerator): * wasm/WasmBinding.cpp: (JSC::Wasm::wasmToWasm): * wasm/WasmContext.cpp: (JSC::Wasm::loadContext): (JSC::Wasm::storeContext): * wasm/WasmContext.h: (JSC::Wasm::useFastTLSForContext): * wasm/WasmExceptionType.h: * wasm/WasmMemoryInformation.h: (JSC::Wasm::PinnedRegisterInfo::toSave): * wasm/WasmThunks.cpp: (JSC::Wasm::throwExceptionFromWasmThunkGenerator): (JSC::Wasm::throwStackOverflowFromWasmThunkGenerator): (JSC::Wasm::Thunks::stub): * wasm/WasmThunks.h: * wasm/js/JSWebAssemblyInstance.h: (JSC::JSWebAssemblyInstance::offsetOfCachedStackLimit): (JSC::JSWebAssemblyInstance::cachedStackLimit): (JSC::JSWebAssemblyInstance::setCachedStackLimit): * wasm/js/JSWebAssemblyModule.cpp: (JSC::JSWebAssemblyModule::finishCreation): * wasm/js/WebAssemblyFunction.cpp: (JSC::callWebAssemblyFunction): * wasm/js/WebAssemblyToJSCallee.cpp: Make this a descendent of object. This is needed for correctness because we may call into JS, and then the first JS frame could stack overflow. When it stack overflows, it rolls back one frame to the wasm->js call stub with the wasm->js callee. It gets the lexical global object from this frame, meaning it gets the global object from the callee. Therefore, we must make it an object since all objects have global objects. (JSC::WebAssemblyToJSCallee::create): * wasm/js/WebAssemblyToJSCallee.h: 2017-05-18 Keith Miller WebAssembly API: test with neutered inputs https://bugs.webkit.org/show_bug.cgi?id=163899 Reviewed by JF Bastien. Add tests to check that we properly throw a type error when we get a transferred ArrayBuffer. Also, we should make sure we cannot post message a wasm memory's ArrayBuffer. * API/JSTypedArray.cpp: (JSObjectGetArrayBufferBytesPtr): * runtime/ArrayBuffer.cpp: (JSC::ArrayBuffer::makeShared): (JSC::ArrayBuffer::makeWasmMemory): (JSC::ArrayBuffer::transferTo): (JSC::ArrayBuffer::neuter): (JSC::ArrayBuffer::notifyIncommingReferencesOfTransfer): (JSC::errorMesasgeForTransfer): * runtime/ArrayBuffer.h: (JSC::ArrayBuffer::isLocked): (JSC::ArrayBuffer::isWasmMemory): * wasm/js/JSWebAssemblyMemory.cpp: (JSC::JSWebAssemblyMemory::buffer): (JSC::JSWebAssemblyMemory::grow): 2017-05-18 Joseph Pecoraro Remote Inspector: Be stricter about checking message types https://bugs.webkit.org/show_bug.cgi?id=172259 Reviewed by Brian Burg. * inspector/remote/cocoa/RemoteInspectorCocoa.mm: (Inspector::RemoteInspector::receivedSetupMessage): (Inspector::RemoteInspector::receivedDataMessage): (Inspector::RemoteInspector::receivedDidCloseMessage): (Inspector::RemoteInspector::receivedIndicateMessage): (Inspector::RemoteInspector::receivedConnectionDiedMessage): (Inspector::RemoteInspector::receivedAutomaticInspectionConfigurationMessage): (Inspector::RemoteInspector::receivedAutomaticInspectionRejectMessage): (Inspector::RemoteInspector::receivedAutomationSessionRequestMessage): * inspector/remote/cocoa/RemoteInspectorXPCConnection.mm: (Inspector::RemoteInspectorXPCConnection::deserializeMessage): (Inspector::RemoteInspectorXPCConnection::handleEvent): (Inspector::RemoteInspectorXPCConnection::sendMessage): Bail if we don't receive the expected types for message data. 2017-05-18 Filip Pizlo DFG inlining should be hardened for the no-result case https://bugs.webkit.org/show_bug.cgi?id=172290 Reviewed by Saam Barati. Previously, if we were inlining a setter call, we might have a bad time because the setter's result register is the invalid VirtualRegister(), and much of the intrinsic handling code assumes that the result register is valid. This doesn't usually cause problems because people don't usually point a setter at something that we recognize as an intrinsic. * CMakeLists.txt: * JavaScriptCore.xcodeproj/project.pbxproj: * b3/air/AirAllocateRegistersAndStackByLinearScan.cpp: Fix a comment. * dfg/DFGByteCodeParser.cpp: Make RELEASE_ASSERT give accurate stacks. I was getting an absurd stack from the assert I added in DelayedSetLocal. (JSC::DFG::ByteCodeParser::DelayedSetLocal::DelayedSetLocal): Assert so we catch the problem sooner. (JSC::DFG::ByteCodeParser::handleIntrinsicCall): Fix the bug. (JSC::DFG::ByteCodeParser::handleConstantInternalFunction): Fix the bug if constant internal functions were setter-inlineable (they ain't, because the bytecode parser doesn't fold GetSetter). * runtime/Intrinsic.cpp: Added. I needed this to debug. (JSC::intrinsicName): (WTF::printInternal): * runtime/Intrinsic.h: 2017-05-18 Commit Queue Unreviewed, rolling out r217031, r217032, and r217037. https://bugs.webkit.org/show_bug.cgi?id=172293 cause linking errors in Windows (Requested by yusukesuzuki on #webkit). Reverted changesets: "[JSC][DFG][DOMJIT] Extend CheckDOM to CheckSubClass" https://bugs.webkit.org/show_bug.cgi?id=172098 http://trac.webkit.org/changeset/217031 "Unreviewed, rebaseline for newly added ClassInfo" https://bugs.webkit.org/show_bug.cgi?id=172098 http://trac.webkit.org/changeset/217032 "Unreviewed, fix debug and non-JIT build" https://bugs.webkit.org/show_bug.cgi?id=172098 http://trac.webkit.org/changeset/217037 2017-05-17 Yusuke Suzuki Unreviewed, fix debug and non-JIT build https://bugs.webkit.org/show_bug.cgi?id=172098 * jsc.cpp: (WTF::DOMJITFunctionObject::checkSubClassPatchpoint): 2017-05-17 Yusuke Suzuki Unreviewed, rebaseline for newly added ClassInfo https://bugs.webkit.org/show_bug.cgi?id=172098 * wasm/js/WebAssemblyFunctionBase.cpp: 2017-05-16 Yusuke Suzuki [JSC][DFG][DOMJIT] Extend CheckDOM to CheckSubClass https://bugs.webkit.org/show_bug.cgi?id=172098 Reviewed by Saam Barati. In this patch, we generalize CheckDOM to CheckSubClass. It can accept any ClassInfo and perform ClassInfo check in DFG / FTL. Now, we add a new function pointer to ClassInfo, checkSubClassPatchpoint. It can create DOMJIT patchpoint for that ClassInfo. It it natural that ClassInfo holds the way to emit DOMJIT::Patchpoint to perform CheckSubClass rather than having it in each DOMJIT getter / function signature annotation. One problem is that it enlarges the size of ClassInfo. But this is the best place to put this function pointer. By doing so, we can add a patchpoint for CheckSubClass in an non-intrusive manner: WebCore can inject patchpoints without interactive JSC. We still have a way to reduce the size of ClassInfo if we move ArrayBuffer related methods out to the other places. This patch touches many files because we add a new function pointer to ClassInfo. But they are basically mechanical change. * API/JSAPIWrapperObject.mm: * API/JSCallbackConstructor.cpp: * API/JSCallbackFunction.cpp: * API/JSCallbackObject.cpp: * API/ObjCCallbackFunction.mm: * CMakeLists.txt: * JavaScriptCore.xcodeproj/project.pbxproj: * bytecode/CodeBlock.cpp: * bytecode/DOMJITAccessCasePatchpointParams.h: (JSC::DOMJITAccessCasePatchpointParams::DOMJITAccessCasePatchpointParams): * bytecode/EvalCodeBlock.cpp: * bytecode/FunctionCodeBlock.cpp: * bytecode/GetterSetterAccessCase.cpp: (JSC::GetterSetterAccessCase::emitDOMJITGetter): * bytecode/ModuleProgramCodeBlock.cpp: * bytecode/ProgramCodeBlock.cpp: * bytecode/UnlinkedCodeBlock.cpp: * bytecode/UnlinkedEvalCodeBlock.cpp: * bytecode/UnlinkedFunctionCodeBlock.cpp: * bytecode/UnlinkedFunctionExecutable.cpp: * bytecode/UnlinkedModuleProgramCodeBlock.cpp: * bytecode/UnlinkedProgramCodeBlock.cpp: * debugger/DebuggerScope.cpp: * dfg/DFGAbstractInterpreterInlines.h: (JSC::DFG::AbstractInterpreter::executeEffects): * dfg/DFGByteCodeParser.cpp: (JSC::DFG::ByteCodeParser::handleDOMJITGetter): * dfg/DFGClobberize.h: (JSC::DFG::clobberize): * dfg/DFGConstantFoldingPhase.cpp: (JSC::DFG::ConstantFoldingPhase::foldConstants): * dfg/DFGDOMJITPatchpointParams.h: (JSC::DFG::DOMJITPatchpointParams::DOMJITPatchpointParams): * dfg/DFGDoesGC.cpp: (JSC::DFG::doesGC): * dfg/DFGFixupPhase.cpp: (JSC::DFG::FixupPhase::fixupNode): (JSC::DFG::FixupPhase::attemptToMakeCallDOM): (JSC::DFG::FixupPhase::fixupCheckSubClass): (JSC::DFG::FixupPhase::fixupCheckDOM): Deleted. * dfg/DFGGraph.cpp: (JSC::DFG::Graph::dump): * dfg/DFGNode.h: (JSC::DFG::Node::hasClassInfo): (JSC::DFG::Node::classInfo): (JSC::DFG::Node::hasCheckDOMPatchpoint): Deleted. (JSC::DFG::Node::checkDOMPatchpoint): Deleted. * dfg/DFGNodeType.h: * dfg/DFGPredictionPropagationPhase.cpp: * dfg/DFGSafeToExecute.h: (JSC::DFG::safeToExecute): * dfg/DFGSpeculativeJIT.cpp: (JSC::DFG::SpeculativeJIT::compileCheckSubClass): (JSC::DFG::SpeculativeJIT::compileCheckDOM): Deleted. * dfg/DFGSpeculativeJIT.h: (JSC::DFG::SpeculativeJIT::vm): * dfg/DFGSpeculativeJIT32_64.cpp: (JSC::DFG::SpeculativeJIT::compile): In DFG, we rename CheckDOM to CheckSubClass. It just holds ClassInfo. And ClassInfo knows how to perform CheckSubClass efficiently. If ClassInfo does not have a way to perform CheckSubClass efficiently, we just perform jsDynamicCast thing in ASM. * dfg/DFGSpeculativeJIT64.cpp: (JSC::DFG::SpeculativeJIT::compile): * domjit/DOMJITGetterSetter.h: * domjit/DOMJITPatchpointParams.h: (JSC::DOMJIT::PatchpointParams::PatchpointParams): (JSC::DOMJIT::PatchpointParams::vm): * domjit/DOMJITSignature.h: (JSC::DOMJIT::Signature::Signature): (JSC::DOMJIT::Signature::checkDOM): Deleted. * ftl/FTLAbstractHeapRepository.h: * ftl/FTLCapabilities.cpp: (JSC::FTL::canCompile): * ftl/FTLDOMJITPatchpointParams.h: (JSC::FTL::DOMJITPatchpointParams::DOMJITPatchpointParams): * ftl/FTLLowerDFGToB3.cpp: (JSC::FTL::DFG::LowerDFGToB3::compileNode): (JSC::FTL::DFG::LowerDFGToB3::compileCheckSubClass): (JSC::FTL::DFG::LowerDFGToB3::compileCheckDOM): Deleted. * inspector/JSInjectedScriptHost.cpp: * inspector/JSInjectedScriptHostPrototype.cpp: * inspector/JSJavaScriptCallFrame.cpp: * inspector/JSJavaScriptCallFramePrototype.cpp: * jsc.cpp: (WTF::DOMJITNode::checkSubClassPatchpoint): (WTF::DOMJITFunctionObject::checkSubClassPatchpoint): (WTF::DOMJITFunctionObject::finishCreation): (WTF::DOMJITCheckSubClassObject::DOMJITCheckSubClassObject): (WTF::DOMJITCheckSubClassObject::createStructure): (WTF::DOMJITCheckSubClassObject::create): (WTF::DOMJITCheckSubClassObject::safeFunction): (WTF::DOMJITCheckSubClassObject::unsafeFunction): (WTF::DOMJITCheckSubClassObject::finishCreation): (GlobalObject::finishCreation): (functionCreateDOMJITCheckSubClassObject): (WTF::DOMJITNode::checkDOMJITNode): Deleted. (WTF::DOMJITFunctionObject::checkDOMJITNode): Deleted. * runtime/AbstractModuleRecord.cpp: * runtime/ArrayBufferNeuteringWatchpoint.cpp: * runtime/ArrayConstructor.cpp: * runtime/ArrayIteratorPrototype.cpp: * runtime/ArrayPrototype.cpp: * runtime/AsyncFunctionConstructor.cpp: * runtime/AsyncFunctionPrototype.cpp: * runtime/AtomicsObject.cpp: * runtime/BooleanConstructor.cpp: * runtime/BooleanObject.cpp: * runtime/BooleanPrototype.cpp: * runtime/ClassInfo.cpp: Copied from Source/JavaScriptCore/tools/JSDollarVM.cpp. (JSC::ClassInfo::dump): * runtime/ClassInfo.h: (JSC::ClassInfo::offsetOfParentClass): * runtime/ClonedArguments.cpp: * runtime/ConsoleObject.cpp: * runtime/CustomGetterSetter.cpp: * runtime/DateConstructor.cpp: * runtime/DateInstance.cpp: * runtime/DatePrototype.cpp: * runtime/DirectArguments.cpp: * runtime/Error.cpp: * runtime/ErrorConstructor.cpp: * runtime/ErrorInstance.cpp: * runtime/ErrorPrototype.cpp: * runtime/EvalExecutable.cpp: * runtime/Exception.cpp: * runtime/ExceptionHelpers.cpp: * runtime/ExecutableBase.cpp: * runtime/FunctionConstructor.cpp: * runtime/FunctionExecutable.cpp: * runtime/FunctionPrototype.cpp: * runtime/FunctionRareData.cpp: * runtime/GeneratorFunctionConstructor.cpp: * runtime/GeneratorFunctionPrototype.cpp: * runtime/GeneratorPrototype.cpp: * runtime/GetterSetter.cpp: * runtime/HashMapImpl.cpp: * runtime/HashMapImpl.h: * runtime/InferredType.cpp: (JSC::InferredType::create): * runtime/InferredTypeTable.cpp: * runtime/InferredValue.cpp: * runtime/InspectorInstrumentationObject.cpp: * runtime/InternalFunction.cpp: * runtime/IntlCollator.cpp: * runtime/IntlCollatorConstructor.cpp: * runtime/IntlCollatorPrototype.cpp: * runtime/IntlDateTimeFormat.cpp: * runtime/IntlDateTimeFormatConstructor.cpp: * runtime/IntlDateTimeFormatPrototype.cpp: * runtime/IntlNumberFormat.cpp: * runtime/IntlNumberFormatConstructor.cpp: * runtime/IntlNumberFormatPrototype.cpp: * runtime/IntlObject.cpp: * runtime/IteratorPrototype.cpp: * runtime/JSAPIValueWrapper.cpp: * runtime/JSArray.cpp: * runtime/JSArrayBuffer.cpp: * runtime/JSArrayBufferConstructor.cpp: * runtime/JSArrayBufferPrototype.cpp: * runtime/JSArrayBufferView.cpp: * runtime/JSAsyncFunction.cpp: * runtime/JSBoundFunction.cpp: * runtime/JSCallee.cpp: * runtime/JSCustomGetterSetterFunction.cpp: * runtime/JSDataView.cpp: * runtime/JSDataViewPrototype.cpp: * runtime/JSEnvironmentRecord.cpp: * runtime/JSFixedArray.cpp: * runtime/JSFunction.cpp: * runtime/JSGeneratorFunction.cpp: * runtime/JSGlobalLexicalEnvironment.cpp: * runtime/JSGlobalObject.cpp: * runtime/JSInternalPromise.cpp: * runtime/JSInternalPromiseConstructor.cpp: * runtime/JSInternalPromiseDeferred.cpp: * runtime/JSInternalPromisePrototype.cpp: * runtime/JSLexicalEnvironment.cpp: * runtime/JSMap.cpp: * runtime/JSMapIterator.cpp: * runtime/JSModuleEnvironment.cpp: * runtime/JSModuleLoader.cpp: * runtime/JSModuleNamespaceObject.cpp: * runtime/JSModuleRecord.cpp: * runtime/JSNativeStdFunction.cpp: * runtime/JSONObject.cpp: * runtime/JSObject.cpp: * runtime/JSPromise.cpp: * runtime/JSPromiseConstructor.cpp: * runtime/JSPromiseDeferred.cpp: * runtime/JSPromisePrototype.cpp: * runtime/JSPropertyNameEnumerator.cpp: * runtime/JSPropertyNameIterator.cpp: * runtime/JSProxy.cpp: * runtime/JSScriptFetcher.cpp: * runtime/JSSet.cpp: * runtime/JSSetIterator.cpp: * runtime/JSSourceCode.cpp: * runtime/JSString.cpp: * runtime/JSStringIterator.cpp: * runtime/JSSymbolTableObject.cpp: * runtime/JSTemplateRegistryKey.cpp: * runtime/JSTypedArrayConstructors.cpp: * runtime/JSTypedArrayPrototypes.cpp: * runtime/JSTypedArrayViewConstructor.cpp: * runtime/JSTypedArrays.cpp: * runtime/JSWeakMap.cpp: * runtime/JSWeakSet.cpp: * runtime/JSWithScope.cpp: * runtime/MapConstructor.cpp: * runtime/MapIteratorPrototype.cpp: * runtime/MapPrototype.cpp: * runtime/MathObject.cpp: * runtime/ModuleLoaderPrototype.cpp: * runtime/ModuleProgramExecutable.cpp: * runtime/NativeErrorConstructor.cpp: * runtime/NativeExecutable.cpp: * runtime/NativeStdFunctionCell.cpp: * runtime/NullGetterFunction.cpp: * runtime/NullSetterFunction.cpp: * runtime/NumberConstructor.cpp: * runtime/NumberObject.cpp: * runtime/NumberPrototype.cpp: * runtime/ObjectConstructor.cpp: * runtime/ObjectPrototype.cpp: * runtime/ProgramExecutable.cpp: * runtime/PropertyTable.cpp: * runtime/ProxyConstructor.cpp: * runtime/ProxyObject.cpp: * runtime/ProxyRevoke.cpp: * runtime/ReflectObject.cpp: * runtime/RegExp.cpp: * runtime/RegExpConstructor.cpp: * runtime/RegExpObject.cpp: * runtime/RegExpPrototype.cpp: * runtime/ScopedArguments.cpp: * runtime/ScopedArgumentsTable.cpp: * runtime/ScriptExecutable.cpp: * runtime/SetConstructor.cpp: * runtime/SetIteratorPrototype.cpp: * runtime/SetPrototype.cpp: * runtime/SparseArrayValueMap.cpp: * runtime/StrictEvalActivation.cpp: * runtime/StringConstructor.cpp: * runtime/StringIteratorPrototype.cpp: * runtime/StringObject.cpp: * runtime/StringPrototype.cpp: * runtime/Structure.cpp: * runtime/StructureChain.cpp: * runtime/StructureRareData.cpp: * runtime/Symbol.cpp: * runtime/SymbolConstructor.cpp: * runtime/SymbolObject.cpp: * runtime/SymbolPrototype.cpp: * runtime/SymbolTable.cpp: * runtime/WeakMapConstructor.cpp: * runtime/WeakMapData.cpp: * runtime/WeakMapPrototype.cpp: * runtime/WeakSetConstructor.cpp: * runtime/WeakSetPrototype.cpp: * testRegExp.cpp: * tools/JSDollarVM.cpp: * tools/JSDollarVMPrototype.cpp: * wasm/JSWebAssembly.cpp: * wasm/js/JSWebAssemblyCodeBlock.cpp: * wasm/js/JSWebAssemblyCompileError.cpp: * wasm/js/JSWebAssemblyInstance.cpp: * wasm/js/JSWebAssemblyLinkError.cpp: * wasm/js/JSWebAssemblyMemory.cpp: * wasm/js/JSWebAssemblyModule.cpp: * wasm/js/JSWebAssemblyRuntimeError.cpp: * wasm/js/JSWebAssemblyTable.cpp: * wasm/js/WebAssemblyCompileErrorConstructor.cpp: * wasm/js/WebAssemblyCompileErrorPrototype.cpp: * wasm/js/WebAssemblyFunction.cpp: * wasm/js/WebAssemblyInstanceConstructor.cpp: * wasm/js/WebAssemblyInstancePrototype.cpp: * wasm/js/WebAssemblyLinkErrorConstructor.cpp: * wasm/js/WebAssemblyLinkErrorPrototype.cpp: * wasm/js/WebAssemblyMemoryConstructor.cpp: * wasm/js/WebAssemblyMemoryPrototype.cpp: * wasm/js/WebAssemblyModuleConstructor.cpp: * wasm/js/WebAssemblyModulePrototype.cpp: * wasm/js/WebAssemblyModuleRecord.cpp: * wasm/js/WebAssemblyPrototype.cpp: * wasm/js/WebAssemblyRuntimeErrorConstructor.cpp: * wasm/js/WebAssemblyRuntimeErrorPrototype.cpp: * wasm/js/WebAssemblyTableConstructor.cpp: * wasm/js/WebAssemblyTablePrototype.cpp: * wasm/js/WebAssemblyToJSCallee.cpp: * wasm/js/WebAssemblyWrapperFunction.cpp: 2017-05-17 Saam Barati We don't do context switches for Wasm->Wasm call indirect https://bugs.webkit.org/show_bug.cgi?id=172188 Reviewed by Keith Miller. We did not do a context switch when doing an indirect call. This is clearly wrong, since the thing we're making an indirect call to could be from another instance. This patch fixes this oversight by doing a very simple context switch. I've also opened a bug to make indirect calls fast: https://bugs.webkit.org/show_bug.cgi?id=172197 since this patch adds yet another branch to the indirect call path. I've also added tests that either throw or crash before this change. * CMakeLists.txt: * JavaScriptCore.xcodeproj/project.pbxproj: * wasm/WasmB3IRGenerator.cpp: * wasm/js/JSWebAssemblyTable.h: (JSC::JSWebAssemblyTable::offsetOfJSFunctions): * wasm/js/WebAssemblyFunction.cpp: (JSC::WebAssemblyFunction::visitChildren): (JSC::WebAssemblyFunction::finishCreation): Deleted. * wasm/js/WebAssemblyFunction.h: (JSC::WebAssemblyFunction::instance): Deleted. (JSC::WebAssemblyFunction::offsetOfInstance): Deleted. * wasm/js/WebAssemblyFunctionBase.cpp: Added. (JSC::WebAssemblyFunctionBase::WebAssemblyFunctionBase): (JSC::WebAssemblyFunctionBase::visitChildren): (JSC::WebAssemblyFunctionBase::finishCreation): * wasm/js/WebAssemblyFunctionBase.h: Added. (JSC::WebAssemblyFunctionBase::instance): (JSC::WebAssemblyFunctionBase::offsetOfInstance): * wasm/js/WebAssemblyModuleRecord.cpp: (JSC::WebAssemblyModuleRecord::link): (JSC::WebAssemblyModuleRecord::evaluate): * wasm/js/WebAssemblyWrapperFunction.cpp: (JSC::WebAssemblyWrapperFunction::create): (JSC::WebAssemblyWrapperFunction::finishCreation): (JSC::WebAssemblyWrapperFunction::visitChildren): * wasm/js/WebAssemblyWrapperFunction.h: 2017-05-17 Filip Pizlo JSC: Incorrect LoadVarargs handling in ArgumentsEliminationPhase::transform https://bugs.webkit.org/show_bug.cgi?id=172208 Reviewed by Saam Barati. * dfg/DFGArgumentsEliminationPhase.cpp: 2017-05-17 Don Olmstead [Win] Support $vm.getpid() https://bugs.webkit.org/show_bug.cgi?id=172248 Reviewed by Mark Lam. * tools/JSDollarVMPrototype.cpp: (JSC::functionGetPID): (JSC::JSDollarVMPrototype::finishCreation): 2017-05-17 Michael Saboff [iOS] The Garbage Collector shouldn't rely on the bmalloc scavenger for up to date memory footprint info https://bugs.webkit.org/show_bug.cgi?id=172186 Reviewed by Geoffrey Garen. The calls to bmalloc::api::memoryFootprint() and ::percentAvailableMemoryInUse() now call the OS to get up to date values. In overCriticalMemoryThreshold(), we get the current value every 100th call and use a cached value the rest of the time. When colleciton is done, we start with a new overCriticalMemoryThreshold value for the next cycle. The choice of 1 out of 100 calls was validated by using JetStream and verifying that it didn't impact performance and still provides timely memory footprint data. With additional debug logging, I determined that we call overCriticalMemoryThreshold() over 20,000 times/second running JetStream. Other logging showed that there were over 1700 calls to overCriticalMemoryThreshold() on average per GC cycle. Dividing both of these numbers by 100 seems reasonable. * heap/Heap.cpp: (JSC::Heap::overCriticalMemoryThreshold): (JSC::Heap::updateAllocationLimits): (JSC::Heap::shouldDoFullCollection): * heap/Heap.h: 2017-05-17 Saam Barati PinnedRegisters should be better modeled in IRC/Briggs https://bugs.webkit.org/show_bug.cgi?id=171955 Reviewed by Filip Pizlo. This patch fixes a bug in Briggs/IRC with respect to pinned registers. Pinned registers were not part of the assignable register file in IRC/Briggs, and this would lead to an asymmetry because they were modeled in the interference graph. The bug is that we use registerCount() to move various Tmps between various lists in the different allocators, and if a Tmp interfered with a pinned register (usually via a Patchpoint's clobbered set), we'd have an interference edge modeled in the degree for that Tmp, but the registerCount() would make us think that this particular Tmp is not assignable. This would lead us to fail to color a colorable graph. Specifically, this happened in our various patchpoint tests that stress the register allocator by forcing the entire register file into arguments for the patchpoint and then doing interesting things with the result, arguments, etc. This patch fixes the bug by coming up with an more natural way to model pinned registers. Pinned registers are now part of the register file. However, pinned registers are live at every point in the program (this is a defining property of a pinned register). In practice, this means that the only Tmps that can be assigned to pinned registers are ones that are coalescing candidates. This means the program has some number of defs for a Tmp T like: MoveType pinnedReg, T Note, if any other defs for T happen, like: Add32, t1, t2, T T will have an interference edge with pinnedReg, since pinnedReg is live at every point in the program. Modeling pinned registers this way allows IRC/Briggs to have no special casing for them. It treats it like any other precolored Tmp. This allows us to do coalescing, biased coloring, etc, which could all lead to a Tmp being assigned to a pinned register. Interestingly, we used to have special handling for the frame pointer register, which in many ways, acts like a pinned register, since FP is always live, and we wanted it to take place in coalescing. The allocator had a side-table interference graph with FP. Interestingly, we didn't even handle this properly everywhere since we could rely on a patchpoint never claiming to clobber FP (this would be illegal). So the code only handled the pseudo-pinned register properties of FP in various places. This patch drops this special casing and pins FP since all pinned registers can take part in coalescing. * b3/B3PatchpointSpecial.h: * b3/B3Procedure.cpp: (JSC::B3::Procedure::mutableGPRs): (JSC::B3::Procedure::mutableFPRs): * b3/B3Procedure.h: * b3/air/AirAllocateRegistersByGraphColoring.cpp: * b3/air/AirCode.cpp: (JSC::B3::Air::Code::Code): (JSC::B3::Air::Code::pinRegister): (JSC::B3::Air::Code::mutableGPRs): (JSC::B3::Air::Code::mutableFPRs): * b3/air/AirCode.h: (JSC::B3::Air::Code::pinnedRegisters): * b3/air/AirSpecial.h: * b3/air/testair.cpp: * b3/testb3.cpp: (JSC::B3::testSimplePatchpointWithOuputClobbersGPArgs): (JSC::B3::testSpillDefSmallerThanUse): (JSC::B3::testLateRegister): (JSC::B3::testTerminalPatchpointThatNeedsToBeSpilled): (JSC::B3::testTerminalPatchpointThatNeedsToBeSpilled2): (JSC::B3::testMoveConstants): 2017-05-16 Yusuke Suzuki [DFG] Constant Folding Phase should convert MakeRope("", String) => Identity(String) https://bugs.webkit.org/show_bug.cgi?id=172115 Reviewed by Saam Barati. In Fixup phase, we attempt to fold MakeRope to Identity (or reduce arguments) by dropping empty strings. However, when we are in Fixup phase, we do not have much information about constant values. In ARES-6 Babylon, we find that we can constant-fold MakeRope by using constants figured out by CFA. Without it, Babylon repeatedly produces rope strings. To fix this, we introduce MakeRope handling in constant folding phase. It shows 7.5% performance improvement in ARES-6 Babylon steadyState. Before: firstIteration: 50.02 +- 14.56 ms averageWorstCase: 26.52 +- 4.52 ms steadyState: 8.15 +- 0.23 ms After: firstIteration: 49.08 +- 12.90 ms averageWorstCase: 25.16 +- 3.82 ms steadyState: 7.58 +- 0.21 ms * dfg/DFGAbstractInterpreterInlines.h: (JSC::DFG::AbstractInterpreter::executeEffects): * dfg/DFGConstantFoldingPhase.cpp: (JSC::DFG::ConstantFoldingPhase::foldConstants): 2017-05-16 Yusuke Suzuki Unreviewed, add Objective C files to CMake Mac port https://bugs.webkit.org/show_bug.cgi?id=172103 * shell/PlatformMac.cmake: Added. 2017-05-16 JF Bastien WebAssembly: enforce size limits https://bugs.webkit.org/show_bug.cgi?id=165833 Reviewed by Keith Miller. Use the same limits as V8. * JavaScriptCore.xcodeproj/project.pbxproj: * wasm/WasmLimits.h: Added. * wasm/WasmModuleParser.cpp: * wasm/WasmParser.h: (JSC::Wasm::Parser::consumeUTF8String): 2017-05-15 Yusuke Suzuki [JSC] Build testapi in non Apple ports https://bugs.webkit.org/show_bug.cgi?id=172103 Reviewed by Filip Pizlo. This patch makes JSC testapi buildable in non-Apple ports. We isolate CF related tests in testapi.c. If we do not use CF, we include JavaScript.h instead of JavaScriptCore.h. By running the testapi in Linux, we found that contraints test have a bug: If constraint marker runs after WeakRefs are destroyed, it accesses destroyed WeakRef. This patch also fixes it. * API/tests/CurrentThisInsideBlockGetterTest.h: * API/tests/CustomGlobalObjectClassTest.c: * API/tests/ExecutionTimeLimitTest.cpp: * API/tests/FunctionOverridesTest.cpp: * API/tests/GlobalContextWithFinalizerTest.cpp: * API/tests/JSObjectGetProxyTargetTest.cpp: * API/tests/MultithreadedMultiVMExecutionTest.cpp: * API/tests/PingPongStackOverflowTest.cpp: * API/tests/TypedArrayCTest.cpp: * API/tests/testapi.c: (assertEqualsAsCharactersPtr): (markingConstraint): (testMarkingConstraintsAndHeapFinalizers): (testCFStrings): (main): * shell/CMakeLists.txt: 2017-05-16 JF Bastien WebAssembly: report Memory usage to GC https://bugs.webkit.org/show_bug.cgi?id=170690 Reviewed by Keith Miller. * wasm/js/JSWebAssemblyMemory.cpp: (JSC::JSWebAssemblyMemory::grow): (JSC::JSWebAssemblyMemory::finishCreation): (JSC::JSWebAssemblyMemory::visitChildren): 2017-05-16 JF Bastien WebAssembly: validate load / store alignment https://bugs.webkit.org/show_bug.cgi?id=168836 Reviewed by Keith Miller. * wasm/WasmFunctionParser.h: check the alignment * wasm/generateWasm.py: generate the log2 alignment helper (Wasm): (isSimple): (memoryLog2Alignment): * wasm/generateWasmOpsHeader.py: (memoryLog2AlignmentGenerator): * wasm/wasm.json: fix formatting 2017-05-15 Mark Lam Rolling out r214038 and r213697: Crashes when using computed properties with rest destructuring and object spread. https://bugs.webkit.org/show_bug.cgi?id=172147 Rubber-stamped by Saam Barati. I rolled out every thing in those 2 patches except for the change to make CodeBlock::finishCreation() return a bool plus its clients that depend on this. I made this exception because r214931 relies on this change, and this part of the change looks correct. * builtins/BuiltinNames.h: * builtins/GlobalOperations.js: (globalPrivate.speciesConstructor): (globalPrivate.copyDataProperties): Deleted. * bytecode/CodeBlock.cpp: (JSC::CodeBlock::finishCreation): (JSC::CodeBlock::setConstantIdentifierSetRegisters): Deleted. * bytecode/CodeBlock.h: * bytecode/UnlinkedCodeBlock.h: (JSC::UnlinkedCodeBlock::addBitVector): (JSC::UnlinkedCodeBlock::constantRegisters): (JSC::UnlinkedCodeBlock::addSetConstant): Deleted. (JSC::UnlinkedCodeBlock::constantIdentifierSets): Deleted. * bytecompiler/BytecodeGenerator.cpp: * bytecompiler/BytecodeGenerator.h: * bytecompiler/NodesCodegen.cpp: (JSC::PropertyListNode::emitBytecode): (JSC::ObjectPatternNode::bindValue): (JSC::ObjectSpreadExpressionNode::emitBytecode): Deleted. * parser/ASTBuilder.h: (JSC::ASTBuilder::createProperty): (JSC::ASTBuilder::appendObjectPatternEntry): (JSC::ASTBuilder::createObjectSpreadExpression): Deleted. (JSC::ASTBuilder::appendObjectPatternRestEntry): Deleted. (JSC::ASTBuilder::setContainsObjectRestElement): Deleted. * parser/NodeConstructors.h: (JSC::PropertyNode::PropertyNode): (JSC::SpreadExpressionNode::SpreadExpressionNode): (JSC::ObjectSpreadExpressionNode::ObjectSpreadExpressionNode): Deleted. * parser/Nodes.h: (JSC::ObjectPatternNode::appendEntry): (JSC::ObjectSpreadExpressionNode::expression): Deleted. (JSC::ObjectPatternNode::setContainsRestElement): Deleted. * parser/Parser.cpp: (JSC::Parser::parseDestructuringPattern): (JSC::Parser::parseProperty): * parser/SyntaxChecker.h: (JSC::SyntaxChecker::createSpreadExpression): (JSC::SyntaxChecker::createProperty): (JSC::SyntaxChecker::operatorStackPop): (JSC::SyntaxChecker::createObjectSpreadExpression): Deleted. * runtime/ObjectConstructor.cpp: (JSC::ObjectConstructor::finishCreation): * runtime/SetPrototype.cpp: (JSC::SetPrototype::finishCreation): 2017-05-15 David Kilzer JSEnvironmentRecord::allocationSizeForScopeSize() and offsetOfVariable(ScopeOffset) should used checked arithmetic Reviewed by Saam Barati. * runtime/JSEnvironmentRecord.h: (JSC::JSEnvironmentRecord::offsetOfVariable): Change to return size_t and use checked arithmetic. (JSC::JSEnvironmentRecord::allocationSizeForScopeSize): Change to use checked arithmetic. 2017-05-15 Mark Lam WorkerRunLoop::Task::performTask() should check !scriptController->isTerminatingExecution(). https://bugs.webkit.org/show_bug.cgi?id=171775 Reviewed by Filip Pizlo. Increased the number of frames captured in VM::nativeStackTraceOfLastThrow() from 25 to 100. From experience, I found that 25 is sometimes not sufficient for our debugging needs. Also added VM::throwingThread() to track which thread an exception was thrown in. This may be useful if the client is entering the VM from different threads. * runtime/ExceptionScope.cpp: (JSC::ExceptionScope::unexpectedExceptionMessage): * runtime/ExceptionScope.h: (JSC::ExceptionScope::exception): (JSC::ExceptionScope::unexpectedExceptionMessage): * runtime/Options.h: - Added the unexpectedExceptionStackTraceLimit option. * runtime/VM.cpp: (JSC::VM::throwException): * runtime/VM.h: (JSC::VM::throwingThread): (JSC::VM::clearException): 2017-05-13 David Kilzer Unused lambda capture in JSContextGroupAddMarkingConstraint() Reviewed by Saam Barati. Fixes the following warning with newer clang: Source/JavaScriptCore/API/JSMarkingConstraintPrivate.cpp:78:11: error: lambda capture 'vm' is not used [-Werror,-Wunused-lambda-capture] [&vm, constraintCallback, userData] ^ * API/JSMarkingConstraintPrivate.cpp: (JSContextGroupAddMarkingConstraint): Remove unused lambda capture for '&vm'. 2017-05-13 David Kilzer [JSC] config.rb fails when checking some clang versions Reviewed by Mark Lam. * offlineasm/config.rb: - Add support for quad-dotted version of Apple clang (800.0.12.1). - Add support for checking open source clang version (5.0.0). 2017-05-13 Commit Queue Unreviewed, rolling out r216808. https://bugs.webkit.org/show_bug.cgi?id=172075 caused lldb to hang when debugging (Requested by smfr on #webkit). Reverted changeset: "Use Mach exceptions instead of signals where possible" https://bugs.webkit.org/show_bug.cgi?id=171865 http://trac.webkit.org/changeset/216808 2017-05-13 Commit Queue Unreviewed, rolling out r216801. https://bugs.webkit.org/show_bug.cgi?id=172072 Many memory corruption crashes on worker threads (Requested by ap on #webkit). Reverted changeset: "WorkerRunLoop::Task::performTask() should check !scriptController->isTerminatingExecution()." https://bugs.webkit.org/show_bug.cgi?id=171775 http://trac.webkit.org/changeset/216801 2017-05-12 Geoffrey Garen [JSC] DFG::Node should not have its own allocator https://bugs.webkit.org/show_bug.cgi?id=160098 Reviewed by Saam Barati. I just rebased the patch from . I ran Octane and JetStream locally on a MacBook Air and I wasn't able to reproduce a regression. Let's land this again and see what the bots say. * JavaScriptCore.xcodeproj/project.pbxproj: * b3/B3SparseCollection.h: (JSC::B3::SparseCollection::packIndices): * dfg/DFGAllocator.h: Removed. * dfg/DFGDriver.cpp: (JSC::DFG::compileImpl): * dfg/DFGGraph.cpp: (JSC::DFG::Graph::Graph): (JSC::DFG::Graph::~Graph): (JSC::DFG::Graph::deleteNode): (JSC::DFG::Graph::packNodeIndices): (JSC::DFG::Graph::addNodeToMapByIndex): Deleted. * dfg/DFGGraph.h: (JSC::DFG::Graph::addNode): (JSC::DFG::Graph::maxNodeCount): (JSC::DFG::Graph::nodeAt): * dfg/DFGLongLivedState.cpp: Removed. * dfg/DFGLongLivedState.h: Removed. * dfg/DFGNode.h: * dfg/DFGNodeAllocator.h: * dfg/DFGPlan.cpp: (JSC::DFG::Plan::compileInThread): (JSC::DFG::Plan::compileInThreadImpl): * dfg/DFGPlan.h: * dfg/DFGWorklist.cpp: * runtime/VM.cpp: (JSC::VM::VM): * runtime/VM.h: 2017-05-12 Keith Miller Use Mach exceptions instead of signals where possible https://bugs.webkit.org/show_bug.cgi?id=171865 Reviewed by Mark Lam. This patch adds some new JSC options. The first is an option that enables or disables web assembly tier up. The second controls whether or not we use mach exceptions (where available). * API/tests/ExecutionTimeLimitTest.cpp: (dispatchTermitateCallback): (testExecutionTimeLimit): * runtime/JSLock.cpp: (JSC::JSLock::didAcquireLock): * runtime/Options.cpp: (JSC::overrideDefaults): (JSC::Options::initialize): * runtime/Options.h: * runtime/VMTraps.cpp: (JSC::SignalContext::SignalContext): (JSC::SignalContext::adjustPCToPointToTrappingInstruction): (JSC::installSignalHandler): (JSC::VMTraps::SignalSender::send): * tools/SigillCrashAnalyzer.cpp: (JSC::SignalContext::SignalContext): (JSC::SignalContext::dump): (JSC::installCrashHandler): * wasm/WasmBBQPlan.cpp: (JSC::Wasm::BBQPlan::compileFunctions): * wasm/WasmFaultSignalHandler.cpp: (JSC::Wasm::trapHandler): (JSC::Wasm::enableFastMemory): * wasm/WasmMachineThreads.cpp: (JSC::Wasm::resetInstructionCacheOnAllThreads): 2017-05-12 Mark Lam WorkerRunLoop::Task::performTask() should check !scriptController->isTerminatingExecution(). https://bugs.webkit.org/show_bug.cgi?id=171775 Reviewed by Saam Barati. Increased the number of frames captured in VM::nativeStackTraceOfLastThrow() from 25 to 100. From experience, I found that 25 is sometimes not sufficient for our debugging needs. Also added VM::throwingThread() to track which thread an exception was thrown in. This may be useful if the client is entering the VM from different threads. * runtime/ExceptionScope.cpp: (JSC::ExceptionScope::unexpectedExceptionMessage): * runtime/ExceptionScope.h: (JSC::ExceptionScope::exception): (JSC::ExceptionScope::unexpectedExceptionMessage): * runtime/Options.h: - Added the unexpectedExceptionStackTraceLimit option. * runtime/VM.cpp: (JSC::VM::throwException): * runtime/VM.h: (JSC::VM::throwingThread): (JSC::VM::clearException): 2017-05-12 Daniel Bates Cleanup: Make QueueTaskToEventLoopFunctionPtr take JSGlobalObject& https://bugs.webkit.org/show_bug.cgi?id=172021 Reviewed by Mark Lam. Change the function alias for QueueTaskToEventLoopFunctionPtr to take JSGlobalObject& instead of a const JSGlobalObject* as all implementations expect to be passed a non- const, non-null JSGlobalObject object. * runtime/JSGlobalObject.cpp: (JSC::JSGlobalObject::queueMicrotask): * runtime/JSGlobalObject.h: * runtime/VM.cpp: (JSC::VM::queueMicrotask): * runtime/VM.h: Remove JS_EXPORT_PRIVATE annotation from queueMicrotask() as it is only called from JavaScriptCore code. 2017-05-12 Michael Saboff [iOS] Use memory footprint to dynamically adjust behavior of allocators https://bugs.webkit.org/show_bug.cgi?id=171944 Reviewed by Filip Pizlo. This change is iOS only. Added the ability to react to when memory usage is critical. This is defined as memory usage being above the newly added option criticalGCMemoryThreshold. When we are in this critical state, all collections are Full and we limit the amount of memory we allocate between collections to 1/4th the memory above the critical threshold. Changed the calculation of proportionalHeapSize to be based on process memory footprint and not how big the heap is. Also, the values of Options::smallHeapRAMFraction and Options::mediumHeapRAMFraction are overriden so that most of the heap growth is happens using the more agressive Options::smallHeapGrowthFactor. * heap/Heap.cpp: (JSC::Heap::Heap): (JSC::Heap::overCriticalMemoryThreshold): (JSC::Heap::shouldDoFullCollection): (JSC::Heap::collectIfNecessaryOrDefer): * heap/Heap.h: * runtime/Options.cpp: (JSC::overrideDefaults): (JSC::Options::initialize): * runtime/Options.h: 2017-05-11 Saam Barati Computing optionalDefArgWidth in CheckSpecial should not consider Scratch roles https://bugs.webkit.org/show_bug.cgi?id=171962 Reviewed by Filip Pizlo. The purpose of getting the result width is to get the width of the result of the arithmetic. It does not care about that the Check happens to define scratches. * b3/B3CheckSpecial.cpp: (JSC::B3::CheckSpecial::forEachArg): * b3/testb3.cpp: (JSC::B3::testCheckMul): (JSC::B3::testCheckMulMemory): (JSC::B3::testCheckMul64): (JSC::B3::testCheckMulFold): (JSC::B3::testCheckMulFoldFail): (JSC::B3::testCheckMulArgumentAliasing64): (JSC::B3::testCheckMulArgumentAliasing32): (JSC::B3::testCheckMul64SShr): 2017-05-11 Saam Barati isValidForm for SimpleAddr should use ptr() instead of tmp() https://bugs.webkit.org/show_bug.cgi?id=171992 Reviewed by Filip Pizlo. Arg::tmp() asserts that its kind is Tmp. Inst::isValidForm for SimpleAddr was using Arg::tmp() instead of ptr() to check if the address Tmp isGP(). It should be using Arg::ptr() instead of Arg::tmp() since Arg::ptr() is designed for SimpleAddr. This patch also fixes an incorrect assertion in the ARM64 macro assembler. We were asserting various atomic ops were only over 32/64 bit operations. However, the code was properly handling 8/16/32/64 bit ops. I changed the assertion to reflect what is actually going on. * assembler/ARM64Assembler.h: (JSC::ARM64Assembler::ldar): (JSC::ARM64Assembler::ldxr): (JSC::ARM64Assembler::ldaxr): (JSC::ARM64Assembler::stxr): (JSC::ARM64Assembler::stlr): (JSC::ARM64Assembler::stlxr): * b3/air/opcode_generator.rb: * b3/testb3.cpp: (JSC::B3::testLoadAcq42): (JSC::B3::testStoreRelAddLoadAcq32): (JSC::B3::testStoreRelAddLoadAcq8): (JSC::B3::testStoreRelAddFenceLoadAcq8): (JSC::B3::testStoreRelAddLoadAcq16): (JSC::B3::testStoreRelAddLoadAcq64): (JSC::B3::testAtomicWeakCAS): (JSC::B3::testAtomicStrongCAS): (JSC::B3::testAtomicXchg): 2017-05-11 Matt Lewis Unreviewed, rolling out r216677. Patch caused layout test crashes. Reverted changeset: "WorkerThread::stop() should call scheduleExecutionTermination() last." https://bugs.webkit.org/show_bug.cgi?id=171775 http://trac.webkit.org/changeset/216677 2017-05-11 Don Olmstead [CMake] Add HAVE check for regex.h https://bugs.webkit.org/show_bug.cgi?id=171950 Reviewed by Michael Catanzaro. * runtime/ConfigFile.cpp: (JSC::ConfigFile::parse): 2017-05-11 Filip Pizlo Callers of JSString::unsafeView() should check exceptions https://bugs.webkit.org/show_bug.cgi?id=171995 Reviewed by Mark Lam. unsafeView() can throw OOME. So, callers of unsafeView() should check for exceptions before trying to access the view. Also, I made the functions surrounding unsafeView() take ExecState* not ExecState&, to comply with the rest of JSC. * dfg/DFGOperations.cpp: * jsc.cpp: (printInternal): (functionDebug): * runtime/ArrayPrototype.cpp: (JSC::arrayProtoFuncJoin): * runtime/FunctionConstructor.cpp: (JSC::constructFunctionSkippingEvalEnabledCheck): * runtime/IntlCollatorPrototype.cpp: (JSC::IntlCollatorFuncCompare): * runtime/JSGenericTypedArrayViewPrototypeFunctions.h: (JSC::genericTypedArrayViewProtoFuncJoin): * runtime/JSGlobalObjectFunctions.cpp: (JSC::globalFuncParseFloat): * runtime/JSONObject.cpp: (JSC::JSONProtoFuncParse): * runtime/JSString.cpp: (JSC::JSString::getPrimitiveNumber): (JSC::JSString::toNumber): * runtime/JSString.h: (JSC::JSString::getIndex): (JSC::JSRopeString::unsafeView): (JSC::JSRopeString::viewWithUnderlyingString): (JSC::JSString::unsafeView): (JSC::JSString::viewWithUnderlyingString): * runtime/JSStringJoiner.h: (JSC::JSStringJoiner::appendWithoutSideEffects): (JSC::JSStringJoiner::append): * runtime/ParseInt.h: (JSC::toStringView): * runtime/StringPrototype.cpp: (JSC::stringProtoFuncRepeatCharacter): (JSC::stringProtoFuncCharAt): (JSC::stringProtoFuncCharCodeAt): (JSC::stringProtoFuncIndexOf): (JSC::stringProtoFuncNormalize): 2017-05-11 Filip Pizlo Offer SPI to notify clients that GC has happened https://bugs.webkit.org/show_bug.cgi?id=171980 Reviewed by Geoffrey Garen. Sometimes when you're programming with weak references, it's most convenient if the GC tells you when it finishes. This adds exactly such an API. This API is called at the *flip*: the moment when the GC knows for sure which objects are dead and has definitely not allocated any new objects or executed any JS code. The finalization part of the flip, which is where this callback gets called, runs on the "main" thread - i.e. some thread that is attempting to execute JS code and holds the JS lock. This will usually run as a side-effect of some allocation or from the runloop. This means, for example, that if you implemented a vector of weak references and registered a callback to prune the vector of null weak references, then aside from the callback, nobody would ever see a null weak reference in the vector. * API/JSHeapFinalizerPrivate.cpp: Added. (JSContextGroupAddHeapFinalizer): (JSContextGroupRemoveHeapFinalizer): * API/JSHeapFinalizerPrivate.h: Added. * API/tests/testapi.c: (heapFinalizer): (testMarkingConstraintsAndHeapFinalizers): (main): (testMarkingConstraints): Deleted. * CMakeLists.txt: * JavaScriptCore.xcodeproj/project.pbxproj: * heap/Heap.cpp: (JSC::Heap::finalize): (JSC::Heap::addHeapFinalizerCallback): (JSC::Heap::removeHeapFinalizerCallback): * heap/Heap.h: * heap/HeapFinalizerCallback.cpp: Added. (JSC::HeapFinalizerCallback::dump): * heap/HeapFinalizerCallback.h: Added. (JSC::HeapFinalizerCallback::HeapFinalizerCallback): (JSC::HeapFinalizerCallback::operator==): (JSC::HeapFinalizerCallback::operator!=): (JSC::HeapFinalizerCallback::operator bool): (JSC::HeapFinalizerCallback::run): 2017-05-11 Filip Pizlo JSWeakCreate/Retain/Release should take a JSContextGroupRef and not a JSContextRef https://bugs.webkit.org/show_bug.cgi?id=171979 Reviewed by Mark Lam. Functions that don't execute arbitrary JS but just need access to the VM should take a JSContextGroupRef, not a JSContextRef. * API/JSWeakPrivate.cpp: (JSWeakCreate): (JSWeakRetain): (JSWeakRelease): * API/JSWeakPrivate.h: * API/tests/testapi.c: (testMarkingConstraints): 2017-05-11 Mark Lam WorkerThread::stop() should call scheduleExecutionTermination() last. https://bugs.webkit.org/show_bug.cgi?id=171775 Reviewed by Geoffrey Garen. Increased the number of frames captured in VM::nativeStackTraceOfLastThrow() from 25 to 100. From experience, I found that 25 is sometimes not sufficient for our debugging needs. Also added VM::throwingThread() to track which thread an exception was thrown in. This may be useful if the client is entering the VM from different threads. * runtime/ExceptionScope.cpp: (JSC::ExceptionScope::unexpectedExceptionMessage): (JSC::ExceptionScope::releaseAssertIsTerminatedExecutionException): * runtime/ExceptionScope.h: (JSC::ExceptionScope::exception): (JSC::ExceptionScope::unexpectedExceptionMessage): * runtime/VM.cpp: (JSC::VM::throwException): * runtime/VM.h: (JSC::VM::throwingThread): (JSC::VM::clearException): 2017-05-11 JF Bastien WebAssembly: stop supporting 0xD https://bugs.webkit.org/show_bug.cgi?id=168788 Reviewed by Saam Barati. Only version 1 is supported by other browsers, and there shouldn't be any 0xD binaries in the wild anymore. * wasm/WasmModuleParser.cpp: 2017-05-09 Sam Weinig Remove support for legacy Notifications https://bugs.webkit.org/show_bug.cgi?id=171487 Reviewed by Jon Lee. * Configurations/FeatureDefines.xcconfig: Remove definition of ENABLE_LEGACY_NOTIFICATIONS. 2017-05-10 Commit Queue Unreviewed, rolling out r216635. https://bugs.webkit.org/show_bug.cgi?id=171953 "Some worker tests are failing". (Requested by mlam on #webkit). Reverted changeset: "WorkerThread::stop() should call scheduleExecutionTermination() last." https://bugs.webkit.org/show_bug.cgi?id=171775 http://trac.webkit.org/changeset/216635 2017-05-10 Mark Lam Crash in JavaScriptCore GC when using JSC on dispatch queues (thread_get_state returns NULL stack pointer). https://bugs.webkit.org/show_bug.cgi?id=160337 Not reviewed. Updated a comment per Geoff's suggestion. * heap/MachineStackMarker.cpp: (JSC::MachineThreads::tryCopyOtherThreadStack): 2017-05-10 Mark Lam WorkerThread::stop() should call scheduleExecutionTermination() last. https://bugs.webkit.org/show_bug.cgi?id=171775 Reviewed by Geoffrey Garen. Increased the number of frames captured in VM::nativeStackTraceOfLastThrow() from 25 to 100. From experience, I found that 25 is sometimes not sufficient for our debugging needs. Also added VM::throwingThread() to track which thread an exception was thrown in. This may be useful if the client is entering the VM from different threads. * runtime/ExceptionScope.cpp: (JSC::ExceptionScope::unexpectedExceptionMessage): (JSC::ExceptionScope::releaseAssertIsTerminatedExecutionException): * runtime/ExceptionScope.h: (JSC::ExceptionScope::exception): (JSC::ExceptionScope::unexpectedExceptionMessage): * runtime/VM.cpp: (JSC::VM::throwException): * runtime/VM.h: (JSC::VM::throwingThread): (JSC::VM::clearException): 2017-05-10 Mark Lam Crash in JavaScriptCore GC when using JSC on dispatch queues (thread_get_state returns NULL stack pointer). https://bugs.webkit.org/show_bug.cgi?id=160337 Reviewed by Filip Pizlo and Geoffrey Garen. This is a workaround for . During thread initialization, for some target platforms, thread state is momentarily set to 0 before being filled in with the target thread's real register values. As a result, there's a race condition that may result in us getting a null stackPointer during a GC scan. This issue may manifest with workqueue threads where the OS may choose to recycle a thread for an expired task. The workaround is simply to indicate that there's nothing to copy and return. This is correct because we will only ever observe a null pointer during thread initialization. Hence, by definition, there's nothing there that we need to scan yet, and therefore, nothing that needs to be copied. * heap/MachineStackMarker.cpp: (JSC::MachineThreads::tryCopyOtherThreadStack): 2017-05-10 JF Bastien WebAssembly: support name section https://bugs.webkit.org/show_bug.cgi?id=171263 Reviewed by Keith Miller. The name section is an optional custom section in the WebAssembly spec. At least when debugging, developers expect to be able to use this section to obtain intelligible stack traces, otherwise we just number the wasm functions which is somewhat painful. This patch parses this section, dropping its content eagerly on error, and if there is a name section then backtraces use their value instead of numbers. Otherwise we stick to numbers as before. Note that the format of name sections changed in mid-February: https://github.com/WebAssembly/design/pull/984 And binaryen was only updated in early March: https://github.com/WebAssembly/binaryen/pull/933 * CMakeLists.txt: * JavaScriptCore.xcodeproj/project.pbxproj: * interpreter/Interpreter.cpp: (JSC::GetStackTraceFunctor::operator()): * interpreter/StackVisitor.cpp: (JSC::StackVisitor::readNonInlinedFrame): (JSC::StackVisitor::Frame::functionName): * interpreter/StackVisitor.h: (JSC::StackVisitor::Frame::wasmFunctionIndexOrName): * runtime/StackFrame.cpp: (JSC::StackFrame::functionName): * runtime/StackFrame.h: (JSC::StackFrame::StackFrame): (JSC::StackFrame::wasm): * wasm/WasmBBQPlanInlines.h: (JSC::Wasm::BBQPlan::initializeCallees): * wasm/WasmCallee.cpp: (JSC::Wasm::Callee::Callee): * wasm/WasmCallee.h: (JSC::Wasm::Callee::create): (JSC::Wasm::Callee::indexOrName): * wasm/WasmFormat.cpp: (JSC::Wasm::makeString): * wasm/WasmFormat.h: (JSC::Wasm::isValidExternalKind): (JSC::Wasm::isValidNameType): (JSC::Wasm::NameSection::get): * wasm/WasmIndexOrName.cpp: Copied from Source/JavaScriptCore/wasm/WasmCallee.cpp. (JSC::Wasm::IndexOrName::IndexOrName): (JSC::Wasm::makeString): * wasm/WasmIndexOrName.h: Copied from Source/JavaScriptCore/wasm/WasmFormat.cpp. * wasm/WasmModuleInformation.h: * wasm/WasmModuleParser.cpp: * wasm/WasmName.h: Copied from Source/JavaScriptCore/wasm/WasmCallee.cpp. * wasm/WasmNameSectionParser.cpp: Added. * wasm/WasmNameSectionParser.h: Copied from Source/JavaScriptCore/wasm/WasmCallee.cpp. (JSC::Wasm::NameSectionParser::NameSectionParser): * wasm/WasmOMGPlan.cpp: (JSC::Wasm::OMGPlan::work): * wasm/WasmParser.h: (JSC::Wasm::Parser::consumeUTF8String): 2017-05-10 Filip Pizlo Null pointer dereference in WTF::RefPtr::operator!() under slow_path_get_direct_pname https://bugs.webkit.org/show_bug.cgi?id=171801 Reviewed by Michael Saboff. This was a goofy oversight. The for-in optimization relies on the bytecode generator to detect when the loop's index variable gets mutated. We forgot to have the hooks for detecting this in prefix and postfix operations (++i and i++). * bytecompiler/NodesCodegen.cpp: (JSC::PostfixNode::emitResolve): (JSC::PrefixNode::emitResolve): 2017-05-10 Michael Catanzaro [GTK] -Wmissing-field-initializers triggered by RemoteInspectorServer.cpp:128 https://bugs.webkit.org/show_bug.cgi?id=171273 Reviewed by Carlos Garcia Campos. * inspector/remote/glib/RemoteInspectorGlib.cpp: * inspector/remote/glib/RemoteInspectorServer.cpp: 2017-05-10 Adrian Perez de Castro Remove some last remnants of the EFL port https://bugs.webkit.org/show_bug.cgi?id=171922 Reviewed by Antonio Gomes. The EFL port is no more. * PlatformEfl.cmake: Removed. * shell/PlatformEfl.cmake: Removed. 2017-05-09 Filip Pizlo JSInjectedScriptHost should get a copy of the boundArgs https://bugs.webkit.org/show_bug.cgi?id=171897 Reviewed by Joseph Pecoraro. The boundArgs array is very special - it cannot be mutated in any way. So, it makes sense for the inspector to get a copy of it. * inspector/JSInjectedScriptHost.cpp: (Inspector::JSInjectedScriptHost::getInternalProperties): * runtime/JSBoundFunction.cpp: (JSC::JSBoundFunction::boundArgsCopy): * runtime/JSBoundFunction.h: (JSC::JSBoundFunction::boundArgs): 2017-05-09 Mark Lam Unindent some code in Watchdog::shouldTerminate(). https://bugs.webkit.org/show_bug.cgi?id=171896 Rubber stamped by Keith Miller. I should have done this before I landed r213107, but I forgot. Unindenting it now. * runtime/Watchdog.cpp: (JSC::Watchdog::shouldTerminate): 2017-05-09 Michael Saboff Cap the number of FTL compilation threads on iOS to 2 https://bugs.webkit.org/show_bug.cgi?id=171887 Reviewed by Filip Pizlo. Set an iOS specific max of 2 threads. * runtime/Options.h: 2017-05-09 Filip Pizlo Heap::heap() should behave gracefully for null pointers https://bugs.webkit.org/show_bug.cgi?id=171888 Reviewed by Mark Lam. Some callers of Heap::heap() can pass a null cell and they will behave gracefully if we return a null Heap. So, let's do that. This fixes a crash and it does not hurt performance. I'm seeing a possible 0.5% regression with 74% probability. That's a neutral result by our usual 95% standard. * heap/HeapInlines.h: (JSC::Heap::heap): 2017-05-09 Yusuke Suzuki Handle IDLPromise<> properly https://bugs.webkit.org/show_bug.cgi?id=166752 Reviewed by Youenn Fablet. Add JSPromise::resolve static function. This applies `Promise.resolve()` conversion to a given value. * runtime/JSGlobalObject.cpp: (JSC::JSGlobalObject::init): (JSC::JSGlobalObject::visitChildren): * runtime/JSGlobalObject.h: (JSC::JSGlobalObject::promiseResolveFunction): * runtime/JSPromise.cpp: (JSC::JSPromise::resolve): * runtime/JSPromise.h: 2017-05-09 Zan Dobersek Upstream the WPE port https://bugs.webkit.org/show_bug.cgi?id=171110 Reviewed by Alex Christensen. * PlatformWPE.cmake: Added. * shell/PlatformWPE.cmake: Added. 2017-05-09 Saam Barati CallLinkInfos belonging to Wasm->JS stubs need to be informed when we clearCode() from all Executables https://bugs.webkit.org/show_bug.cgi?id=171707 Reviewed by Filip Pizlo. This patch fixes a bug where a Wasm->JS IC call stub would go stale and point into a CodeBlock no longer owned by any executable. The problematic scenario is this: 1. We generate the call IC which has a branch on a callee check. This callee owns the Executable in question. If the branch succeeds, it will call code belonging to a particular CodeBlock associated with that Executable. 2. Heap::deleteAllCodeBlocks is called. This leads the Executable to clear its various CodeBlock references. 3. Wasm has no idea this happened, so now it has stale ICs that point into code from a CodeBlock no longer belonging to an Executable. This patch fixes the bug by informing all JSWebAssemblyCodeBlocks to unlink their CallLinkInfo when Heap::deleteAllCodeBlocks is called. We track all JSWebAssemblyCodeBlocks by creating a new subspace for them. This allows us to quickly iterate over the live JSWebAssemblyCodeBlocks in the heap. * CMakeLists.txt: * JavaScriptCore.xcodeproj/project.pbxproj: * heap/Heap.cpp: (JSC::Heap::deleteAllCodeBlocks): * heap/Subspace.h: * heap/SubspaceInlines.h: (JSC::Subspace::forEachLiveCell): * runtime/VM.cpp: (JSC::VM::VM): * runtime/VM.h: * wasm/js/JSWebAssemblyCodeBlock.cpp: (JSC::JSWebAssemblyCodeBlock::clearJSCallICs): * wasm/js/JSWebAssemblyCodeBlock.h: (JSC::JSWebAssemblyCodeBlock::createStructure): Deleted. (JSC::JSWebAssemblyCodeBlock::functionImportCount): Deleted. (JSC::JSWebAssemblyCodeBlock::module): Deleted. (JSC::JSWebAssemblyCodeBlock::jsEntrypointCalleeFromFunctionIndexSpace): Deleted. (JSC::JSWebAssemblyCodeBlock::wasmEntrypointLoadLocationFromFunctionIndexSpace): Deleted. (JSC::JSWebAssemblyCodeBlock::wasmToJsCallStubForImport): Deleted. (JSC::JSWebAssemblyCodeBlock::offsetOfImportWasmToJSStub): Deleted. (JSC::JSWebAssemblyCodeBlock::codeBlock): Deleted. (JSC::JSWebAssemblyCodeBlock::offsetOfImportStubs): Deleted. (JSC::JSWebAssemblyCodeBlock::allocationSize): Deleted. (JSC::JSWebAssemblyCodeBlock::importWasmToJSStub): Deleted. * wasm/js/JSWebAssemblyCodeBlockSubspace.cpp: Added. (JSC::JSWebAssemblyCodeBlockSubspace::JSWebAssemblyCodeBlockSubspace): (JSC::JSWebAssemblyCodeBlockSubspace::~JSWebAssemblyCodeBlockSubspace): (JSC::JSWebAssemblyCodeBlockSubspace::finishSweep): (JSC::JSWebAssemblyCodeBlockSubspace::destroy): * wasm/js/JSWebAssemblyCodeBlockSubspace.h: Added. 2017-05-08 Saam Barati testWasmBoundsCheck and testCallFunctionWithHellaArguments is broken in testb3 https://bugs.webkit.org/show_bug.cgi?id=171392 Reviewed by Keith Miller. This patch fixes two bugs. The first one is: Inside testb3, we were using the wrong WasmBoundsCheckValue constructor. Everything compiled OK because of implicit casting in C. I've changed one of the constructors to take arguments in a different order so we don't run into this problem again. The second bug was that Air::ShufflePair::inst was assuming that a move from BigImm to its destination is always valid. This is not the case. For example, the store, `Move BigImm, Addr` is not allowed. I refactored the code to be correct by emitting more than one instruction when needeed. When testing my changes, I ran ARM64 testb3 both in debug and release. I ran into many pre-existing failures. I've opened a new bug to fix those here: https://bugs.webkit.org/show_bug.cgi?id=171826 * b3/B3WasmBoundsCheckValue.cpp: (JSC::B3::WasmBoundsCheckValue::WasmBoundsCheckValue): * b3/B3WasmBoundsCheckValue.h: * b3/air/AirEmitShuffle.cpp: (JSC::B3::Air::ShufflePair::insts): (JSC::B3::Air::ShufflePair::inst): Deleted. * b3/air/AirEmitShuffle.h: * b3/air/AirLowerMacros.cpp: (JSC::B3::Air::lowerMacros): * b3/testb3.cpp: (JSC::B3::testLoadAcq42): (JSC::B3::testStoreRelAddLoadAcq32): (JSC::B3::testStoreRelAddLoadAcq8): (JSC::B3::testStoreRelAddFenceLoadAcq8): (JSC::B3::testStoreRelAddLoadAcq16): (JSC::B3::testStoreRelAddLoadAcq64): (JSC::B3::testSimplePatchpointWithOuputClobbersGPArgs): (JSC::B3::testCheckMul): (JSC::B3::testCheckMulMemory): (JSC::B3::testCheckMul64): (JSC::B3::testCheckMulFold): (JSC::B3::testCheckMulFoldFail): (JSC::B3::testCheckMulArgumentAliasing64): (JSC::B3::testCheckMulArgumentAliasing32): (JSC::B3::testCheckMul64SShr): (JSC::B3::testCallFunctionWithHellaArguments): (JSC::B3::functionWithHellaArguments2): (JSC::B3::testCallFunctionWithHellaArguments2): (JSC::B3::functionWithHellaArguments3): (JSC::B3::testCallFunctionWithHellaArguments3): (JSC::B3::testSpillDefSmallerThanUse): (JSC::B3::testLateRegister): (JSC::B3::testTerminalPatchpointThatNeedsToBeSpilled): (JSC::B3::testTerminalPatchpointThatNeedsToBeSpilled2): (JSC::B3::testMoveConstants): (JSC::B3::testAtomicWeakCAS): (JSC::B3::testAtomicStrongCAS): (JSC::B3::testAtomicXchg): (JSC::B3::testWasmBoundsCheck): (JSC::B3::run): * wasm/WasmB3IRGenerator.cpp: (JSC::Wasm::B3IRGenerator::emitCheckAndPreparePointer): 2017-05-08 Filip Pizlo Expose a function to get proxy targets https://bugs.webkit.org/show_bug.cgi?id=171797 Reviewed by Mark Lam. This exposes a new private API function, JSObjectGetProxyTarget(), that gets the target of a proxy. It works with both ProxyObject and JSProxy, but it's primarily intended for use with JSProxy. * API/JSObjectRef.cpp: (JSObjectGetProxyTarget): * API/JSObjectRefPrivate.h: * API/tests/JSObjectGetProxyTargetTest.cpp: Added. (testJSObjectGetProxyTarget): * API/tests/JSObjectGetProxyTargetTest.h: Added. * API/tests/testapi.c: (main): * JavaScriptCore.xcodeproj/project.pbxproj: * runtime/ProxyObject.h: * shell/PlatformWin.cmake: 2017-05-08 Mark Lam op_throw_static_error's use of its first operand should be reflected in DFG BytecodeUseDef as well. https://bugs.webkit.org/show_bug.cgi?id=171786 Reviewed by Saam Barati. * bytecode/BytecodeDumper.cpp: (JSC::BytecodeDumper::dumpBytecode): - Fix BytecodeDumper to dump op_throw_static_error correctly. Previously, it was expecting op1 to always be a constant. r206870 changed it to take a variable string as well. * bytecode/BytecodeUseDef.h: (JSC::computeUsesForBytecodeOffset): - Fix the bug. * dfg/DFGByteCodeParser.cpp: (JSC::DFG::ByteCodeParser::parseBlock): - Move the Phantom of op1 after the ThrowStaticError node, because technically, the ThrowStaticError represents op_throw_static_error, and op_throw_static_error uses op1. In practice, this probably doesn't matter, but let's have the code accurately communicate the behavior we're expecting. 2017-05-08 JF Bastien WebAssembly: don't just emit extended offset adds for patch https://bugs.webkit.org/show_bug.cgi?id=171799 Reviewed by Mark Lam. It isn't necessary to restrict. * b3/air/AirLowerStackArgs.cpp: (JSC::B3::Air::lowerStackArgs): 2017-05-08 Mark Lam Introduce ExceptionScope::assertNoException() and releaseAssertNoException(). https://bugs.webkit.org/show_bug.cgi?id=171776 Reviewed by Keith Miller. Instead of ASSERT(!scope.exception()), we can now do scope.assertNoException(). Ditto for RELEASE_ASSERT and scope.releaseAssertNoException(). The advantage of using ExceptionScope::assertNoException() and releaseAssertNoException() is that if the assertion fails, these utility functions will print the stack trace for where the unexpected exception is detected as well as where the unexpected exception was thrown from. This makes it much easier to debug the source of unhandled exceptions. * debugger/Debugger.cpp: (JSC::Debugger::pauseIfNeeded): * dfg/DFGOperations.cpp: * interpreter/Interpreter.cpp: (JSC::eval): (JSC::notifyDebuggerOfUnwinding): (JSC::Interpreter::executeProgram): (JSC::Interpreter::executeCall): (JSC::Interpreter::executeConstruct): (JSC::Interpreter::prepareForRepeatCall): (JSC::Interpreter::execute): (JSC::Interpreter::debug): * interpreter/ShadowChicken.cpp: (JSC::ShadowChicken::functionsOnStack): * jsc.cpp: (GlobalObject::moduleLoaderResolve): (GlobalObject::moduleLoaderFetch): (functionGenerateHeapSnapshot): (functionSamplingProfilerStackTraces): (box): (runWithScripts): * runtime/AbstractModuleRecord.cpp: (JSC::AbstractModuleRecord::finishCreation): * runtime/ArrayPrototype.cpp: (JSC::ArrayPrototype::tryInitializeSpeciesWatchpoint): * runtime/Completion.cpp: (JSC::rejectPromise): * runtime/ErrorInstance.cpp: (JSC::ErrorInstance::sanitizedToString): * runtime/ExceptionHelpers.cpp: (JSC::createError): * runtime/ExceptionScope.cpp: (JSC::ExceptionScope::unexpectedExceptionMessage): * runtime/ExceptionScope.h: (JSC::ExceptionScope::assertNoException): (JSC::ExceptionScope::releaseAssertNoException): (JSC::ExceptionScope::unexpectedExceptionMessage): * runtime/GenericArgumentsInlines.h: (JSC::GenericArguments::defineOwnProperty): * runtime/IntlCollator.cpp: (JSC::IntlCollator::createCollator): (JSC::IntlCollator::resolvedOptions): * runtime/IntlDateTimeFormat.cpp: (JSC::IntlDateTimeFormat::resolvedOptions): (JSC::IntlDateTimeFormat::format): * runtime/IntlNumberFormat.cpp: (JSC::IntlNumberFormat::createNumberFormat): (JSC::IntlNumberFormat::resolvedOptions): * runtime/JSCJSValue.cpp: (JSC::JSValue::putToPrimitiveByIndex): * runtime/JSGenericTypedArrayViewPrototypeFunctions.h: (JSC::genericTypedArrayViewProtoFuncIncludes): (JSC::genericTypedArrayViewProtoFuncIndexOf): (JSC::genericTypedArrayViewProtoFuncLastIndexOf): (JSC::genericTypedArrayViewPrivateFuncSubarrayCreate): * runtime/JSGlobalObject.cpp: (JSC::JSGlobalObject::init): * runtime/JSGlobalObjectFunctions.cpp: (JSC::globalFuncHostPromiseRejectionTracker): * runtime/JSModuleEnvironment.cpp: (JSC::JSModuleEnvironment::getOwnPropertySlot): * runtime/JSModuleLoader.cpp: (JSC::JSModuleLoader::finishCreation): * runtime/JSModuleNamespaceObject.cpp: (JSC::JSModuleNamespaceObject::finishCreation): * runtime/JSONObject.cpp: (JSC::Stringifier::toJSON): * runtime/JSObject.cpp: (JSC::JSObject::ordinaryToPrimitive): * runtime/JSPropertyNameEnumerator.h: (JSC::propertyNameEnumerator): * runtime/ObjectConstructor.cpp: (JSC::objectConstructorGetOwnPropertyDescriptors): (JSC::objectConstructorDefineProperty): * runtime/ObjectPrototype.cpp: (JSC::objectProtoFuncHasOwnProperty): * runtime/ProgramExecutable.cpp: (JSC::ProgramExecutable::initializeGlobalProperties): * runtime/ReflectObject.cpp: (JSC::reflectObjectDefineProperty): * runtime/SamplingProfiler.cpp: (JSC::SamplingProfiler::StackFrame::nameFromCallee): * runtime/StringPrototype.cpp: (JSC::stringProtoFuncRepeatCharacter): * runtime/TemplateRegistry.cpp: (JSC::TemplateRegistry::getTemplateObject): * runtime/VM.cpp: (JSC::VM::throwException): * runtime/VM.h: (JSC::VM::nativeStackTraceOfLastThrow): (JSC::VM::clearException): * wasm/WasmB3IRGenerator.cpp: * wasm/js/JSWebAssemblyInstance.cpp: (JSC::JSWebAssemblyInstance::create): 2017-05-06 Bill Ming Fix 32bit Windows build by giving correct parameters to MASM https://bugs.webkit.org/show_bug.cgi?id=170833 Reviewed by Alex Christensen. * CMakeLists.txt: 2017-05-06 Oleksandr Skachkov [ES6] Arrow function. Issue in access to this after eval('super()') within constructor https://bugs.webkit.org/show_bug.cgi?id=171543 Reviewed by Saam Barati. Current patch force to use 'this' within arrow function or eval from virtual scope each time, instead of using thisRegister. * bytecompiler/BytecodeGenerator.cpp: (JSC::BytecodeGenerator::ensureThis): 2017-05-05 Keith Miller Put does not properly consult the prototype chain https://bugs.webkit.org/show_bug.cgi?id=171754 Reviewed by Saam Barati. We should do a follow up that cleans up the rest of put. See: https://bugs.webkit.org/show_bug.cgi?id=171759 * runtime/JSCJSValue.cpp: (JSC::JSValue::putToPrimitive): * runtime/JSObject.cpp: (JSC::JSObject::putInlineSlow): * runtime/JSObjectInlines.h: (JSC::JSObject::canPerformFastPutInline): 2017-05-05 JF Bastien WebAssembly: Air::Inst::generate crashes on large binary on A64 https://bugs.webkit.org/show_bug.cgi?id=170215 Reviewed by Filip Pizlo. ARM can't encode all offsets in a single instruction. We usualy handle this type of detail early, or the macro assembler uses a scratch register to take care of the large immediate. After register allocation we assumed that we would never get large offsets, and asserted this was the case. That was a fine assumption with JavaScript, but WebAssembly ends up generating stack frames which are too big to encode. There are two places that needed to be fixed: 1. AirGenerate 2. AirLowerStackArgs We now unconditionally pin the dataTempRegister on ARM64, and use it when immediates don't fit. Number 1. is easy: we're just incrementing SP, make sure we can use a scratch register when that happens. Number 2. is more complex: not all Inst can receive a stack argument whose base register isn't SP or FP. Specifically, Patchpoints and Stackmaps get very sad because they just want to know the offset value, but when we materialize the offset as follows: Move (spill337), (spill201), %r0, @8735 Becomes (where %r16 is dataTempRegister): Move $1404, %r16, @8736 Add64 %sp, %r16, @8736 Move (%r16), 2032(%sp), %r0, @8736 The code currently doesn't see through our little dance. To work around this issue we introduce a new Air Arg kind: ExtendedOffsetAddr. This is the same as a regular Addr, but with an offset which may be too big to encode. Opcodes then declare whether their arguments can handle such inputs, and if so we generate them, otherwise we generate Addr as shown above. None of this affects x86 because it can always encode large immediates. This patch also drive-by converts some uses of `override` to `final`. It makes the code easier to grok, and maybe helps the optimizer sometimes but really that doens't matter. * assembler/MacroAssembler.h: * assembler/MacroAssemblerARM64.h: * b3/B3CheckSpecial.cpp: (JSC::B3::CheckSpecial::admitsExtendedOffsetAddr): * b3/B3CheckSpecial.h: * b3/B3Common.cpp: (JSC::B3::pinnedExtendedOffsetAddrRegister): keep the CPU-specific pinning information in a cpp file * b3/B3Common.h: * b3/B3PatchpointSpecial.cpp: (JSC::B3::PatchpointSpecial::admitsExtendedOffsetAddr): * b3/B3PatchpointSpecial.h: * b3/B3StackmapSpecial.cpp: (JSC::B3::StackmapSpecial::isArgValidForRep): (JSC::B3::StackmapSpecial::repForArg): * b3/B3StackmapSpecial.h: * b3/air/AirArg.cpp: (JSC::B3::Air::Arg::isStackMemory): (JSC::B3::Air::Arg::jsHash): (JSC::B3::Air::Arg::dump): (WTF::printInternal): (JSC::B3::Air::Arg::stackAddrImpl): Deleted. There was only one use of this (in AirLowerStackArgs) and it was now confusing to split the logic up between these two. Inline the code that used to be here into its one usepoint instead. * b3/air/AirArg.h: (JSC::B3::Air::Arg::extendedOffsetAddr): (JSC::B3::Air::Arg::isExtendedOffsetAddr): (JSC::B3::Air::Arg::isMemory): (JSC::B3::Air::Arg::base): (JSC::B3::Air::Arg::offset): (JSC::B3::Air::Arg::isGP): (JSC::B3::Air::Arg::isFP): (JSC::B3::Air::Arg::isValidForm): (JSC::B3::Air::Arg::forEachTmpFast): (JSC::B3::Air::Arg::forEachTmp): (JSC::B3::Air::Arg::asAddress): (JSC::B3::Air::Arg::stackAddr): Deleted. * b3/air/AirCCallSpecial.cpp: (JSC::B3::Air::CCallSpecial::isValid): (JSC::B3::Air::CCallSpecial::admitsExtendedOffsetAddr): (JSC::B3::Air::CCallSpecial::generate): * b3/air/AirCCallSpecial.h: * b3/air/AirCode.cpp: (JSC::B3::Air::Code::Code): (JSC::B3::Air::Code::pinRegister): Check that the register wasn't pinned before pinning it. It's likely a bug to pin the same register twice. * b3/air/AirCustom.h: (JSC::B3::Air::PatchCustom::admitsExtendedOffsetAddr): (JSC::B3::Air::CCallCustom::admitsExtendedOffsetAddr): (JSC::B3::Air::ShuffleCustom::admitsExtendedOffsetAddr): (JSC::B3::Air::EntrySwitchCustom::admitsExtendedOffsetAddr): (JSC::B3::Air::WasmBoundsCheckCustom::admitsExtendedOffsetAddr): * b3/air/AirGenerate.cpp: (JSC::B3::Air::generate): * b3/air/AirInst.h: * b3/air/AirInstInlines.h: (JSC::B3::Air::Inst::admitsExtendedOffsetAddr): * b3/air/AirLowerStackArgs.cpp: (JSC::B3::Air::lowerStackArgs): * b3/air/AirPrintSpecial.cpp: (JSC::B3::Air::PrintSpecial::admitsExtendedOffsetAddr): (JSC::B3::Air::PrintSpecial::generate): * b3/air/AirPrintSpecial.h: * b3/air/AirSpecial.h: * b3/air/opcode_generator.rb: 2017-05-05 Oliver Hunt Move trivial String prototype functions to JS builtins https://bugs.webkit.org/show_bug.cgi?id=171737 Reviewed by Saam Barati. Super simple change to migrate all of the old school html-ifying string operations to builtin JS. Core implementation is basically a 1-for-1 match to the spec. * builtins/StringPrototype.js: (globalPrivate.createHTML): (anchor): (big): (blink): (bold): (fixed): (fontcolor): (fontsize): (italics): (link): (small): (strike): (sub): (sup): * runtime/StringPrototype.cpp: (JSC::StringPrototype::finishCreation): (JSC::stringProtoFuncBig): Deleted. (JSC::stringProtoFuncSmall): Deleted. (JSC::stringProtoFuncBlink): Deleted. (JSC::stringProtoFuncBold): Deleted. (JSC::stringProtoFuncFixed): Deleted. (JSC::stringProtoFuncItalics): Deleted. (JSC::stringProtoFuncStrike): Deleted. (JSC::stringProtoFuncSub): Deleted. (JSC::stringProtoFuncSup): Deleted. (JSC::stringProtoFuncFontcolor): Deleted. (JSC::stringProtoFuncFontsize): Deleted. (JSC::stringProtoFuncAnchor): Deleted. (JSC::stringProtoFuncLink): Deleted. 2017-05-05 Don Olmstead [JSC] Remove export from Intrinsic https://bugs.webkit.org/show_bug.cgi?id=171752 Reviewed by Alexey Proskuryakov. * runtime/Intrinsic.h: 2017-05-05 Saam Barati putDirectIndex does not properly do defineOwnProperty https://bugs.webkit.org/show_bug.cgi?id=171591 Reviewed by Geoffrey Garen. This patch fixes putDirectIndex and its JIT implementations to be compatible with the ES6 spec. I think our code became out of date when we implemented ArraySpeciesCreate since ArraySpeciesCreate may return arbitrary objects. We perform putDirectIndex on that arbitrary object. The behavior we want is as if we performed defineProperty({configurable:true, enumerable:true, writable:true}). However, we weren't doing this. putDirectIndex assumed it could just splat data into any descendent of JSObject's butterfly. For example, this means we'd just splat into the butterfly of a typed array, even though a typed array doesn't use its butterfly to store its indexed properties in the usual way. Also, typed array properties are non-configurable, so this operation should throw. This also means if we saw a ProxyObject, we'd just splat into its butterfly, but this is obviously wrong because ProxyObject should intercept the defineProperty operation. This patch fixes this issue by adding a whitelist of cell types that can go down putDirectIndex's fast path. Anything not in that whitelist will simply call into defineOwnProperty. * bytecode/ByValInfo.h: (JSC::jitArrayModePermitsPutDirect): * dfg/DFGArrayMode.cpp: (JSC::DFG::ArrayMode::refine): * jit/JITOperations.cpp: * runtime/ArrayPrototype.cpp: (JSC::arrayProtoFuncSplice): * runtime/ClonedArguments.cpp: (JSC::ClonedArguments::createStructure): * runtime/JSGenericTypedArrayViewInlines.h: (JSC::JSGenericTypedArrayView::defineOwnProperty): * runtime/JSObject.cpp: (JSC::canDoFastPutDirectIndex): (JSC::JSObject::defineOwnIndexedProperty): (JSC::JSObject::putDirectIndexSlowOrBeyondVectorLength): (JSC::JSObject::putDirectIndexBeyondVectorLength): Deleted. * runtime/JSObject.h: (JSC::JSObject::putDirectIndex): (JSC::JSObject::canSetIndexQuicklyForPutDirect): Deleted. * runtime/JSType.h: 2017-05-05 Guillaume Emont [JSC] include JSCInlines.h in ObjectInitializationScope.cpp https://bugs.webkit.org/show_bug.cgi?id=171744 Reviewed by Mark Lam. * runtime/ObjectInitializationScope.cpp: 2017-05-05 Carlos Garcia Campos [GTK] Assertion failure in Inspector::RemoteInspector::setRemoteInspectorClient when disposing WebKitWebContext https://bugs.webkit.org/show_bug.cgi?id=171644 Reviewed by Michael Catanzaro. Fix ASSERT that requires given client to be a valid pointer, since it's valid to pass nullptr to unset the client. The ASSERT now ensures that client is set or unset. I also renamed the function to setClient because setRemoteInspectorClient is redundant for a class named RemoteInspector. And added a getter too, to check if the remote inspector has a client. * inspector/remote/RemoteInspector.cpp: (Inspector::RemoteInspector::setClient): * inspector/remote/RemoteInspector.h: 2017-05-04 Commit Queue Unreviewed, rolling out r216206. https://bugs.webkit.org/show_bug.cgi?id=171714 Multiple LayoutTests crashing in Document::page() (Requested by ap on #webkit). Reverted changeset: "Remove support for legacy Notifications" https://bugs.webkit.org/show_bug.cgi?id=171487 http://trac.webkit.org/changeset/216206 2017-05-04 Don Olmstead [Win] Remove redundant macros that are set in the CMake config https://bugs.webkit.org/show_bug.cgi?id=171571 Reviewed by Brent Fulgham. * config.h: 2017-05-04 Mark Lam Gardening: Build fix for Windows after r216217. https://bugs.webkit.org/show_bug.cgi?id=171586 Not reviewed. * shell/PlatformWin.cmake: 2017-05-04 Filip Pizlo JSC::Heap should expose a richer API for requesting GCs https://bugs.webkit.org/show_bug.cgi?id=171690 Reviewed by Geoffrey Garen. I want to stop WebCore from requesting synchronous GCs. But various parts of that work may cause regressions, so I'd like to land it separately from the functionality that is needed on the JSC side. This change is mostly a JSC-side refactoring that does not change behavior. In the future I'll land the behavior changes (i.e. not requesting sync GCs). This change allows you to enumerate over synchronousness, so that we can make all APIs take synchronousness as an argument. It replaces the collectAllGarbage API with a collectNow(Synchronousness, GCRequest) API. GCRequest is a new concept, which subsumes std::optional and gives us the ability to register callbacks along with a GC. So, you can ask for an async GC and get a callback when it's done. Also adds ability to request that fastMalloc memory be released after the incremental sweeper finishes. * API/JSBase.cpp: (JSSynchronousGarbageCollectForDebugging): * CMakeLists.txt: * JavaScriptCore.xcodeproj/project.pbxproj: * heap/FullGCActivityCallback.cpp: (JSC::FullGCActivityCallback::doCollection): * heap/FullGCActivityCallback.h: * heap/GCRequest.cpp: Added. (JSC::GCRequest::subsumedBy): (JSC::GCRequest::dump): * heap/GCRequest.h: Added. (JSC::GCRequest::GCRequest): * heap/Heap.cpp: (JSC::Heap::collect): (JSC::Heap::collectNow): (JSC::Heap::collectAsync): (JSC::Heap::collectSync): (JSC::Heap::runBeginPhase): (JSC::Heap::runEndPhase): (JSC::Heap::requestCollection): (JSC::Heap::willStartCollection): (JSC::Heap::sweeper): (JSC::Heap::collectNowFullIfNotDoneRecently): (JSC::Heap::shouldDoFullCollection): (JSC::Heap::collectAllGarbage): Deleted. (JSC::Heap::collectAllGarbageIfNotDoneRecently): Deleted. * heap/Heap.h: * heap/HeapSnapshotBuilder.cpp: (JSC::HeapSnapshotBuilder::buildSnapshot): * heap/IncrementalSweeper.cpp: (JSC::IncrementalSweeper::doSweep): * heap/IncrementalSweeper.h: (JSC::IncrementalSweeper::freeFastMallocMemoryAfterSweeping): * heap/MarkedAllocator.cpp: (JSC::MarkedAllocator::doTestCollectionsIfNeeded): * heap/MarkedSpace.cpp: (JSC::MarkedSpace::sweep): * heap/Synchronousness.cpp: Added. (WTF::printInternal): * heap/Synchronousness.h: Added. * inspector/agents/InspectorHeapAgent.cpp: (Inspector::InspectorHeapAgent::gc): * jsc.cpp: (functionGCAndSweep): (runJSC): * tools/JSDollarVMPrototype.cpp: (JSC::JSDollarVMPrototype::gc): * wasm/WasmMemory.cpp: 2017-05-04 Mark Lam NeverDestroyed(ASCIILiteral(...)) is not thread safe. https://bugs.webkit.org/show_bug.cgi?id=171586 Reviewed by Yusuke Suzuki. JavaScriptCore allows multiple VMs to be instantiated, and each of these should be able to run concurrently on different threads. There is code in the VM that allocates NeverDestroyed(ASCIILiteral(...)) to defined immortal strings meant to be shared by all VMs. However, NeverDestroyed(ASCIILiteral(...)) is not thread-safe because each thread will ref and deref the underlying StringImpl. Since this ref and deref is not done in a thread-safe way, the NeverDestroyed may get destroyed due to the ref/deref races. Additionally, each thread may modify the StringImpl by setting its hash and also twiddling its flags. The fix is to use the StaticStringImpl class which is safe for ref/derefing concurrently from different threads. StaticStringImpl is also pre-set with a hash on construction, and its flags are set in such a way as to prevent twiddling at runtime. Hence, we will be able to share a NeverDestroyed between VMs, as long as it is backed by a StaticStringImpl. An alternative solution would be to change all the uses of NeverDestroyed to use per-VM strings. However, this solution is cumbersome, and makes it harder to allocate the intended shared string. It also uses more memory and takes more CPU time because it requires allocating the same string for each VM instance. The StaticStringImpl solution wins out because it is more efficient and is easier to use. The StaticStringImpl solution also can be used in WTF without a layer violation. See Source/WTF/wtf/text/icu/TextBreakIteratorICU.h for an example. Also added the MultithreadedMultiVMExecutionTest which runs multiple VMs in multiple threads, all banging on the BuiltinExecutable's baseConstructorCode NeverDestroyed. The test will manifest the issue reliably (before this fix) if run on an ASAN build. * API/tests/MultithreadedMultiVMExecutionTest.cpp: Added. (threadsList): (startMultithreadedMultiVMExecutionTest): (finalizeMultithreadedMultiVMExecutionTest): * API/tests/MultithreadedMultiVMExecutionTest.h: Added. * API/tests/testapi.c: (main): * JavaScriptCore.xcodeproj/project.pbxproj: * builtins/BuiltinExecutables.cpp: (JSC::BuiltinExecutables::createDefaultConstructor): * inspector/agents/InspectorDebuggerAgent.cpp: (Inspector::objectGroupForBreakpointAction): * replay/scripts/CodeGeneratorReplayInputsTemplates.py: * replay/scripts/tests/expected/generate-enum-encoding-helpers-with-guarded-values.json-TestReplayInputs.cpp: (JSC::InputTraits::type): * replay/scripts/tests/expected/generate-enum-encoding-helpers.json-TestReplayInputs.cpp: (JSC::InputTraits::type): * replay/scripts/tests/expected/generate-enum-with-guard.json-TestReplayInputs.cpp: (JSC::InputTraits::type): * replay/scripts/tests/expected/generate-enums-with-same-base-name.json-TestReplayInputs.cpp: (JSC::InputTraits::type): * replay/scripts/tests/expected/generate-input-with-guard.json-TestReplayInputs.cpp: (JSC::InputTraits::type): (JSC::InputTraits::type): * replay/scripts/tests/expected/generate-input-with-vector-members.json-TestReplayInputs.cpp: (JSC::InputTraits::type): (JSC::InputTraits::type): * replay/scripts/tests/expected/generate-inputs-with-flags.json-TestReplayInputs.cpp: (JSC::InputTraits::type): (JSC::InputTraits::type): * replay/scripts/tests/expected/generate-memoized-type-modes.json-TestReplayInputs.cpp: (JSC::InputTraits::type): (JSC::InputTraits::type): * runtime/IntlObject.cpp: (JSC::numberingSystemsForLocale): 2017-05-04 Sam Weinig Remove support for legacy Notifications https://bugs.webkit.org/show_bug.cgi?id=171487 Reviewed by Jon Lee. * Configurations/FeatureDefines.xcconfig: Remove definition of ENABLE_LEGACY_NOTIFICATIONS. 2017-05-04 Konstantin Tokarev Fix compilation with ICU 59.1 https://bugs.webkit.org/show_bug.cgi?id=171612 Reviewed by Mark Lam. ICU 59.1 has broken source compatibility. Now it defines UChar as char16_t, which does not allow automatic type conversion from unsigned short in C++ code. * API/JSStringRef.cpp: (JSStringCreateWithCharacters): (JSStringCreateWithCharactersNoCopy): (JSStringGetCharactersPtr): * runtime/DateConversion.cpp: (JSC::formatDateTime): 2017-05-04 Saam Barati stress/call-apply-exponential-bytecode-size.js.no-llint failing on 32-bit debug for OOM on executable memory https://bugs.webkit.org/show_bug.cgi?id=171008 Reviewed by Yusuke Suzuki. This patch lowers the threshold for .call/.apply recursion in an attempt to emit less code and not impact perf. We're currently failing tests on x86-32 by running out of executable memory. If perf gets impacted because of this, then I'll apply a stricter change just to 32-bit platforms. However, if this doesn't negatively impact perf, it's all around better than all platforms emit less bytecode. * bytecompiler/NodesCodegen.cpp: 2017-05-04 Yusuke Suzuki [JSC] Math unary functions should be handled by DFG https://bugs.webkit.org/show_bug.cgi?id=171269 Reviewed by Saam Barati. ArithSin, ArithCos, and ArithLog are just calling a C runtime function. While handling them in DFG is not very effective for performance, they can drop some type checks & value conversions and mark them as pure operations. It is effective if they are involved in some complex optimization phase. Actually, ArithLog is effective in kraken. While a few of Math functions have DFG nodes, basically math functions are pure. And large part of these functions are just calling a C runtime function. This patch generalizes these nodes in DFG as ArithUnary. And we annotate many unary math functions with Intrinsics and convert them to ArithUnary in DFG. It also cleans up duplicate code in ArithSin, ArithCos, and ArithLog. If your math function has some good DFG / FTL optimization rather than calling a C runtime function, you should add a specialized DFG node, like ArithSqrt. We also create a new namespace JSC::Math. Inside it, we collect math functions. * dfg/DFGAbstractInterpreterInlines.h: (JSC::DFG::AbstractInterpreter::executeEffects): * dfg/DFGArithMode.cpp: (JSC::DFG::arithUnaryFunction): (JSC::DFG::arithUnaryOperation): (WTF::printInternal): * dfg/DFGArithMode.h: * dfg/DFGBackwardsPropagationPhase.cpp: (JSC::DFG::BackwardsPropagationPhase::propagate): * dfg/DFGByteCodeParser.cpp: (JSC::DFG::ByteCodeParser::handleIntrinsicCall): * dfg/DFGClobberize.h: (JSC::DFG::clobberize): * dfg/DFGDoesGC.cpp: (JSC::DFG::doesGC): * dfg/DFGFixupPhase.cpp: (JSC::DFG::FixupPhase::fixupNode): * dfg/DFGGraph.cpp: (JSC::DFG::Graph::dump): * dfg/DFGNode.h: (JSC::DFG::Node::hasArithUnaryType): (JSC::DFG::Node::arithUnaryType): * dfg/DFGNodeType.h: * dfg/DFGOperations.cpp: * dfg/DFGOperations.h: * dfg/DFGPredictionPropagationPhase.cpp: * dfg/DFGSafeToExecute.h: (JSC::DFG::safeToExecute): * dfg/DFGSpeculativeJIT.cpp: (JSC::DFG::SpeculativeJIT::compileArithUnary): (JSC::DFG::SpeculativeJIT::compileArithCos): Deleted. (JSC::DFG::SpeculativeJIT::compileArithTan): Deleted. (JSC::DFG::SpeculativeJIT::compileArithSin): Deleted. (JSC::DFG::SpeculativeJIT::compileArithLog): Deleted. * dfg/DFGSpeculativeJIT.h: * dfg/DFGSpeculativeJIT32_64.cpp: (JSC::DFG::SpeculativeJIT::compile): * dfg/DFGSpeculativeJIT64.cpp: (JSC::DFG::SpeculativeJIT::compile): * ftl/FTLCapabilities.cpp: (JSC::FTL::canCompile): * ftl/FTLLowerDFGToB3.cpp: (JSC::FTL::DFG::LowerDFGToB3::compileNode): (JSC::FTL::DFG::LowerDFGToB3::compileArithUnary): (JSC::FTL::DFG::LowerDFGToB3::compileArithSin): Deleted. (JSC::FTL::DFG::LowerDFGToB3::compileArithCos): Deleted. (JSC::FTL::DFG::LowerDFGToB3::compileArithTan): Deleted. (JSC::FTL::DFG::LowerDFGToB3::compileArithLog): Deleted. * ftl/FTLOutput.cpp: (JSC::FTL::Output::doubleUnary): (JSC::FTL::Output::doubleSin): Deleted. (JSC::FTL::Output::doubleCos): Deleted. (JSC::FTL::Output::doubleTan): Deleted. (JSC::FTL::Output::doubleLog): Deleted. * ftl/FTLOutput.h: * runtime/Intrinsic.h: * runtime/MathCommon.cpp: (JSC::Math::log1p): * runtime/MathCommon.h: * runtime/MathObject.cpp: (JSC::MathObject::finishCreation): (JSC::mathProtoFuncACos): (JSC::mathProtoFuncASin): (JSC::mathProtoFuncATan): (JSC::mathProtoFuncCos): (JSC::mathProtoFuncExp): (JSC::mathProtoFuncLog): (JSC::mathProtoFuncSin): (JSC::mathProtoFuncTan): (JSC::mathProtoFuncACosh): (JSC::mathProtoFuncASinh): (JSC::mathProtoFuncATanh): (JSC::mathProtoFuncCbrt): (JSC::mathProtoFuncCosh): (JSC::mathProtoFuncExpm1): (JSC::mathProtoFuncLog1p): (JSC::mathProtoFuncLog10): (JSC::mathProtoFuncLog2): (JSC::mathProtoFuncSinh): (JSC::mathProtoFuncTanh): 2017-05-03 Saam Barati How we build polymorphic cases is wrong when making a call from Wasm https://bugs.webkit.org/show_bug.cgi?id=171527 Reviewed by JF Bastien. This patches fixes a bug when we emit a polymorphic call IC from Wasm. We were incorrectly assuming that if we made a call *from wasm*, then the thing we are *calling to* does not have a CodeBlock. This is obviously wrong. This patch fixes the incorrect assumption. This patch also does two more things: 1. Add a new option that makes us make calls to JS using a slow path instead of using a call IC. 2. Fixes a potential GC bug where we didn't populate JSWebAssemblyCodeBlock's JSWebAssemblyModule pointer. * jit/Repatch.cpp: (JSC::linkPolymorphicCall): * runtime/Options.h: * wasm/WasmBinding.cpp: (JSC::Wasm::wasmToJs): * wasm/js/JSWebAssemblyCodeBlock.cpp: (JSC::JSWebAssemblyCodeBlock::create): (JSC::JSWebAssemblyCodeBlock::finishCreation): * wasm/js/JSWebAssemblyCodeBlock.h: * wasm/js/JSWebAssemblyInstance.cpp: (JSC::JSWebAssemblyInstance::finalizeCreation): 2017-05-03 Keith Miller Array.prototype.sort should also allow a null comparator https://bugs.webkit.org/show_bug.cgi?id=171621 Reviewed by Michael Saboff. It looks like sort not accepting a null comparator causes some pages to stop working. Those pages work in Chrome/Firefox so we should try to match them. * builtins/ArrayPrototype.js: (sort): 2017-05-03 Mark Lam Use the CLoop for CPU(ARM64E). https://bugs.webkit.org/show_bug.cgi?id=171620 Reviewed by Geoffrey Garen. * llint/LLIntOfflineAsmConfig.h: * tools/SigillCrashAnalyzer.cpp: (JSC::SigillCrashAnalyzer::dumpCodeBlock): 2017-05-03 Keith Miller Different behaviour with the .sort(callback) method (unlike Firefox & Chrome) https://bugs.webkit.org/show_bug.cgi?id=47825 Reviewed by Saam Barati. This patch makes our sort function match the behavior of Firefox and Chrome when the result of the comparison function is a boolean. When we first switched to using merge sort, it regressed JQuery sorting of DOM nodes by 30%. The regression was do to the fact that JQuery was using compareDocumentPosition to compare the locations of objects. Since one of the benchmarks would pass a reverse sorted list to the sort function we would end up walking the entire DOM to do comparisons. The solution to this was to merge based on comparison(right, left) rather than comparison(left, right). Although, in practice this does nothing since sort could just as easily receive an already sorted list and we're back in the same spot. The downside of sorting with comparison(right, left) is that to maintain stability when sorting, you only want to merge from right when the comparison function returns a negative value. This is where the problem with booleans comes in. Since booleans toNumber false to 0 and true to 1 both values are "equal". This patch fixes this by special casing boolean return values. * builtins/ArrayPrototype.js: (sort.merge): 2017-05-03 Andy VanWagoner [INTL] Support dashed values in unicode locale extensions https://bugs.webkit.org/show_bug.cgi?id=171480 Reviewed by JF Bastien. Implements the UnicodeExtensionSubtags operation and updates the ResolveLocale operation to use it. This fixes locale extensions with values that include '-'. The following calendars work now: ethiopic-amete-alem islamic-umalqura islamic-tbla islamic-civil islamic-rgsa While updating IntlObject, the comments containing spec text were replaced with a single url at the top of each function pointing to the relevant part of ECMA-402. * runtime/IntlObject.cpp: (JSC::unicodeExtensionSubTags): Added. (JSC::resolveLocale): Updated to latest standard. 2017-05-02 Don Olmstead Build fix after r216078 https://bugs.webkit.org/show_bug.cgi?id=171554 Reviewed by Saam Barati. * API/tests/testapi.c: 2017-05-02 Filip Pizlo Unreviewed, fix pedantic C compilers. * API/tests/testapi.c: (markingConstraint): (testMarkingConstraints): 2017-05-02 Filip Pizlo Unreviewed, fix cmake build. * CMakeLists.txt: 2017-05-02 Filip Pizlo JSC C API should expose GC marking constraints and weak references https://bugs.webkit.org/show_bug.cgi?id=171554 Reviewed by Geoffrey Garen. This exposes an API that lets you participate in the GC's fixpoint. You can ask the GC what is marked and you can tell the GC to mark things. The constraint callback cannot do a whole lot, but it can query marking state and it can dereference weak references. Additionally, this exposes a very simple weak reference API in C. * API/JSMarkingConstraintPrivate.cpp: Added. (JSC::isMarked): (JSC::mark): (JSContextGroupRegisterMarkingConstraint): * API/JSMarkingConstraintPrivate.h: Added. * API/JSWeakPrivate.cpp: Added. (OpaqueJSWeak::OpaqueJSWeak): (JSWeakCreate): (JSWeakRetain): (JSWeakRelease): (JSWeakGetObject): * API/JSWeakPrivate.h: Added. * API/tests/testapi.c: (markingConstraint): (testMarkingConstraints): (main): * JavaScriptCore.xcodeproj/project.pbxproj: * heap/SlotVisitor.h: * heap/SlotVisitorInlines.h: (JSC::SlotVisitor::appendHiddenUnbarriered): (JSC::SlotVisitor::appendHidden): 2017-05-02 Mark Lam JSFixedArray::allocationSize() should not allow for allocation failure. https://bugs.webkit.org/show_bug.cgi?id=171516 Reviewed by Geoffrey Garen. Since JSFixedArray::createFromArray() now handles allocation failures by throwing OutOfMemoryErrors, its helper function allocationSize() (which computes the buffer size to allocate) should also allow for allocation failure on overflow. This issue is covered by the stress/js-fixed-array-out-of-memory.js test when run on 32-bit builds. * runtime/JSFixedArray.h: (JSC::JSFixedArray::tryCreate): (JSC::JSFixedArray::allocationSize): 2017-05-01 Zan Dobersek [aarch64][Linux] m_allowScratchRegister assert hit in MacroAssemblerARM64 under B3::Air::CCallSpecial::generate() https://bugs.webkit.org/show_bug.cgi?id=170672 Reviewed by Filip Pizlo. In Air::CCallSpecial::admitsStack() we reject admitting the callee argument on the stack for ARM64 because that can lead to disallowed usage of the scratch register in MacroAssemblerARM64 when generating a call with an address Arg in Air::CCallSpecial::generate(). The testLinearScanWithCalleeOnStack test is added to testb3. It reproduces the original issue by force-spilling everything on the stack and enforcing the use of the linear scan register allocation by using an optimization level of 1. * b3/air/AirCCallSpecial.cpp: (JSC::B3::Air::CCallSpecial::admitsStack): * b3/testb3.cpp: (JSC::B3::testLinearScanWithCalleeOnStack): (JSC::B3::run): 2017-05-01 David Kilzer Stop using sprintf() in JavaScriptCore debugger Reviewed by Keith Miller. * disassembler/udis86/udis86.c: (ud_insn_hex): Switch from sprintf() to snprintf(). 2017-04-21 Filip Pizlo Air::fixObviousSpills should remove totally redundant instructions https://bugs.webkit.org/show_bug.cgi?id=171131 Reviewed by Saam Barati. This is a modest compile-time-neutral improvement to fixObviousSpills. That phase builds up a classic alias analysis data structure over spills and registers and then uses it to remove the most common spill pathologies we encounter. For example, if you use a spill but the spill is aliased to a register or constant, then we can replace the use of the spill with a use of the register or constant. But that phase was missing perhaps one of the most obvious fixups that its analysis allows us to do: if any instruction creates an alias we already know about, then the instruction is redundant. This turned out to be super important for https://bugs.webkit.org/show_bug.cgi?id=171075. That patch didn't work out, but this kind of optimization might be a good clean-up for many other kinds of optimizations. * b3/air/AirFixObviousSpills.cpp: 2017-04-30 Oleksandr Skachkov We initialize functions too early in an eval https://bugs.webkit.org/show_bug.cgi?id=161099 Reviewed by Saam Barati. Current patch allow to fix problem with scope in function that is declared within eval. Before scope was set inside Interpretator.cpp and it was scope where eval is executed, but in this case function would not see let/const variables and classes declated in eval. This patch devide declaration and binding in two operation, first just declare variable with function name, and second bind variable to function with correct scope * bytecompiler/BytecodeGenerator.cpp: (JSC::BytecodeGenerator::generate): (JSC::BytecodeGenerator::BytecodeGenerator): * bytecompiler/BytecodeGenerator.h: * interpreter/Interpreter.cpp: (JSC::Interpreter::execute): 2017-04-30 Oleksandr Skachkov [ES6]. Implement Annex B.3.3 function hoisting rules for eval https://bugs.webkit.org/show_bug.cgi?id=163208 Reviewed by Saam Barati. Current patch implements Annex B.3.3 that is related to hoisting of function declaration in eval. https://tc39.github.io/ecma262/#sec-web-compat-evaldeclarationinstantiation Function declaration in eval should create variable with function name in function scope where eval is invoked or bind to variable if it declared outside of the eval. If variable is created it can be removed by 'delete a;' command. If eval is invoke in block scope that contains let/const variable with the same name as function declaration we do not bind. This patch leads to the following behavior: ''' function foo() { { print(boo); // undefined eval('{ function boo() {}}'); print(boo); // function boo() {} } print(boo); // function boo() {} } function foobar() { { let boo = 10; print(boo); // 10; eval('{ function boo() {}}'); print(boo); // 10; } print(boo) // 10 } function bar() { { var boo = 10; print(boo); // 10 eval('{ function boo() {} }'); print(boo); // function boo() {} } print(boo); // function boo() {} } function bas() { { let boo = 10; eval(' { function boo() {} } '); print(boo); // 10 } print(boo); //Reference Error } ''' Current implementation relies on already implemented 'hoist function in sloppy mode' feature, with small changes. In short it works in following way: during hoisting of function with name S in eval, we are looking for first scope that contains space for variable with name S and if this scope has var type we bind function there To implement this feature was added bytecode ops: op_resolve_scope_for_hoisting_func_decl_in_eval - get variable scope or return undefined if variable can't be binded there. There is a corner case, hoist function in eval within catch block, that is not covered by this patch, and will be fixed in https://bugs.webkit.org/show_bug.cgi?id=168184 * bytecode/BytecodeDumper.cpp: (JSC::BytecodeDumper::dumpBytecode): * bytecode/BytecodeList.json: * bytecode/BytecodeUseDef.h: (JSC::computeUsesForBytecodeOffset): (JSC::computeDefsForBytecodeOffset): * bytecode/CodeBlock.cpp: (JSC::CodeBlock::finalizeLLIntInlineCaches): * bytecode/EvalCodeBlock.h: (JSC::EvalCodeBlock::functionHoistingCandidate): (JSC::EvalCodeBlock::numFunctionHoistingCandidates): * bytecode/UnlinkedEvalCodeBlock.h: * bytecompiler/BytecodeGenerator.cpp: (JSC::BytecodeGenerator::BytecodeGenerator): (JSC::BytecodeGenerator::hoistSloppyModeFunctionIfNecessary): (JSC::BytecodeGenerator::emitResolveScopeForHoistingFuncDeclInEval): * bytecompiler/BytecodeGenerator.h: * dfg/DFGAbstractInterpreterInlines.h: (JSC::DFG::AbstractInterpreter::executeEffects): * dfg/DFGByteCodeParser.cpp: (JSC::DFG::ByteCodeParser::parseBlock): * dfg/DFGCapabilities.cpp: (JSC::DFG::capabilityLevel): * dfg/DFGClobberize.h: (JSC::DFG::clobberize): * dfg/DFGDoesGC.cpp: (JSC::DFG::doesGC): * dfg/DFGFixupPhase.cpp: (JSC::DFG::FixupPhase::fixupNode): * dfg/DFGNode.h: (JSC::DFG::Node::hasIdentifier): * dfg/DFGNodeType.h: * dfg/DFGOperations.cpp: * dfg/DFGOperations.h: * dfg/DFGPredictionPropagationPhase.cpp: * dfg/DFGSafeToExecute.h: (JSC::DFG::safeToExecute): * dfg/DFGSpeculativeJIT.cpp: (JSC::DFG::SpeculativeJIT::compileResolveScopeForHoistingFuncDeclInEval): * dfg/DFGSpeculativeJIT.h: (JSC::DFG::SpeculativeJIT::callOperation): * dfg/DFGSpeculativeJIT32_64.cpp: (JSC::DFG::SpeculativeJIT::compile): * dfg/DFGSpeculativeJIT64.cpp: (JSC::DFG::SpeculativeJIT::compile): * ftl/FTLCapabilities.cpp: (JSC::FTL::canCompile): * ftl/FTLLowerDFGToB3.cpp: (JSC::FTL::DFG::LowerDFGToB3::compileNode): (JSC::FTL::DFG::LowerDFGToB3::compileResolveScopeForHoistingFuncDeclInEval): * interpreter/Interpreter.cpp: (JSC::Interpreter::execute): * jit/JIT.cpp: (JSC::JIT::privateCompileMainPass): * jit/JIT.h: * jit/JITOperations.h: * jit/JITPropertyAccess.cpp: (JSC::JIT::emit_op_resolve_scope_for_hoisting_func_decl_in_eval): * jit/JITPropertyAccess32_64.cpp: (JSC::JIT::emit_op_resolve_scope_for_hoisting_func_decl_in_eval): * llint/LowLevelInterpreter.asm: * parser/Parser.cpp: (JSC::Parser::parseFunctionDeclarationStatement): * parser/Parser.h: (JSC::Scope::getSloppyModeHoistedFunctions): (JSC::Parser::declareFunction): * runtime/CommonSlowPaths.cpp: (JSC::SLOW_PATH_DECL): * runtime/CommonSlowPaths.h: * runtime/EvalExecutable.h: (JSC::EvalExecutable::numFunctionHoistingCandidates): (JSC::EvalExecutable::numTopLevelFunctionDecls): (JSC::EvalExecutable::numberOfFunctionDecls): Deleted. * runtime/JSScope.cpp: (JSC::JSScope::resolve): (JSC::JSScope::resolveScopeForHoistingFuncDeclInEval): * runtime/JSScope.h: 2017-04-29 Oleksandr Skachkov Deep nesting is leading to ReferenceError for hoisted function https://bugs.webkit.org/show_bug.cgi?id=171456 Reviewed by Yusuke Suzuki. Current patch fix error that appears during hoisting of the function in block scope. Error happens only when exist some deep scope that lead to increase scope stack, after which list of the hosted candidates do not copied to updated scope stack. * parser/Parser.h: (JSC::Scope::Scope): 2017-04-29 Yusuke Suzuki [JSC] LabelScopePtr is not necessary https://bugs.webkit.org/show_bug.cgi?id=171474 Reviewed by Geoffrey Garen. Originally, LabelScopePtr is introduced because LabelScopes uses Vector<> instead of SegmentedVector<>. LabelScopePtr holds the pointer to the vector owner and index instead of the pointer to LabelScope directly since Vector<> can relocate LocalScopes inside it. The reason why LabelScopes use Vector instead is that there is code copying this vector. SegmentedVector<> prohibits copying since it is so costly. So, we used Vector<> here instead of SegmentedVector<>. But the latest code does not have copying code for LabelScopes. Thus, we can take the same design to Label and RegisterID. Just use SegmentedVector<> and Ref<>/RefPtr<>. This patch removes LabelScopePtr since it is no longer necessary. And use SegmentedVector for LabelScopes. * bytecompiler/BytecodeGenerator.cpp: (JSC::reclaim): (JSC::BytecodeGenerator::reclaimFreeRegisters): (JSC::BytecodeGenerator::newLabelScope): (JSC::BytecodeGenerator::newLabel): (JSC::BytecodeGenerator::pushFinallyControlFlowScope): (JSC::BytecodeGenerator::breakTarget): (JSC::BytecodeGenerator::continueTarget): (JSC::BytecodeGenerator::emitEnumeration): * bytecompiler/BytecodeGenerator.h: * bytecompiler/LabelScope.h: (JSC::LabelScope::LabelScope): (JSC::LabelScope::breakTarget): (JSC::LabelScope::continueTarget): (JSC::LabelScope::type): (JSC::LabelScope::name): (JSC::LabelScope::scopeDepth): (JSC::LabelScope::ref): (JSC::LabelScope::deref): (JSC::LabelScope::refCount): (JSC::LabelScopePtr::LabelScopePtr): Deleted. (JSC::LabelScopePtr::operator=): Deleted. (JSC::LabelScopePtr::~LabelScopePtr): Deleted. (JSC::LabelScopePtr::operator!): Deleted. (JSC::LabelScopePtr::operator*): Deleted. (JSC::LabelScopePtr::operator->): Deleted. (JSC::LabelScopePtr::null): Deleted. * bytecompiler/NodesCodegen.cpp: (JSC::DoWhileNode::emitBytecode): (JSC::WhileNode::emitBytecode): (JSC::ForNode::emitBytecode): (JSC::ForInNode::emitBytecode): (JSC::ContinueNode::trivialTarget): (JSC::ContinueNode::emitBytecode): (JSC::BreakNode::trivialTarget): (JSC::BreakNode::emitBytecode): (JSC::SwitchNode::emitBytecode): (JSC::LabelNode::emitBytecode): 2017-04-28 Mark Lam Revert instrumentation from https://bugs.webkit.org/show_bug.cgi?id=170086 that is no longer needed. https://bugs.webkit.org/show_bug.cgi?id=170094 Reviewed by JF Bastien and Keith Miller. * heap/Heap.cpp: (JSC::Heap::resumeThePeriphery): 2017-04-27 Andy VanWagoner [INTL] Implement the caseFirst option for Intl.Collator https://bugs.webkit.org/show_bug.cgi?id=158188 Reviewed by Geoffrey Garen. Implements the caseFirst option and unicode locale extension. The caseFirst option explicitly determines whether upper or lower case comes first. * runtime/IntlCollator.cpp: (JSC::sortLocaleData): Added kf data. (JSC::searchLocaleData): Added kf data. (JSC::IntlCollator::initializeCollator): Set caseFirst option. (JSC::IntlCollator::createCollator): Set new attributes on ICU collator. (JSC::IntlCollator::caseFirstString): Added. (JSC::IntlCollator::resolvedOptions): Added caseFirst property. * runtime/IntlCollator.h: 2017-04-27 Mark Lam Fix some RELEASE_ASSERT failures caused by OutOfMemoryErrors. https://bugs.webkit.org/show_bug.cgi?id=171404 Reviewed by Saam Barati. 1. Added some tryAllocate() functions in JSCellInlines.h. 2. Consolidated the implementations of allocateCell() template functions into a single tryAllocateCellHelper() to reduce redundancy and eliminate needing to copy-paste for variations of allocateCell and tryAllocateCell. 3. Changed JSFixedArray::createFromArray() and constructEmptyArray() to check for allocation failure and throw an OutOfMemoryError. It was already possible to throw errors from these functions for other reasons. So, their clients are already ready to handle OOMEs. * ftl/FTLOperations.cpp: (JSC::FTL::operationMaterializeObjectInOSR): * runtime/JSCInlines.h: * runtime/JSCell.h: * runtime/JSCellInlines.h: (JSC::tryAllocateCellHelper): (JSC::allocateCell): (JSC::tryAllocateCell): * runtime/JSFixedArray.h: (JSC::JSFixedArray::createFromArray): (JSC::JSFixedArray::tryCreate): (JSC::JSFixedArray::create): Deleted. * runtime/JSGlobalObject.h: (JSC::constructEmptyArray): 2017-04-27 Joseph Pecoraro Support for promise rejection events (unhandledrejection) https://bugs.webkit.org/show_bug.cgi?id=150358 Reviewed by Saam Barati. Patch by Joseph Pecoraro and Yusuke Suzuki. Implement support for promise.[[PromiseIsHandled]] and the HostPromiseRejectionTracker hook for HTML to track promise rejections: https://tc39.github.io/ecma262/#sec-host-promise-rejection-tracker https://html.spec.whatwg.org/multipage/webappapis.html#unhandled-promise-rejections * builtins/BuiltinNames.h: New private symbols. * builtins/PromiseOperations.js: (globalPrivate.newHandledRejectedPromise): Utility to create a rejected promise with [[PromiseIsHandled]] to true. (globalPrivate.rejectPromise): (globalPrivate.initializePromise): * builtins/PromisePrototype.js: (then): Implement standard behavior of [[PromiseIsHandled]] and the host hook. * runtime/JSPromise.cpp: (JSC::JSPromise::isHandled): * runtime/JSPromise.h: C++ accessors for the [[PromiseIsHandled]] state. * bytecode/BytecodeIntrinsicRegistry.cpp: (JSC::BytecodeIntrinsicRegistry::BytecodeIntrinsicRegistry): * bytecode/BytecodeIntrinsicRegistry.h: Expose private values for the Reject / Handle enum values in built-ins. * jsc.cpp: * runtime/JSGlobalObject.h: (JSC::JSGlobalObject::promiseResolveFunction): Add a new GlobalObjectMethodTable hook matching the promise rejection hook. * runtime/JSGlobalObject.cpp: (JSC::JSGlobalObject::init): (JSC::JSGlobalObject::visitChildren): * runtime/JSGlobalObjectFunctions.cpp: (JSC::globalFuncHostPromiseRejectionTracker): * runtime/JSGlobalObjectFunctions.h: Plumb the builtin hook through to the optional GlobalObjectMethodTable hook. * inspector/InjectedScriptSource.js: (InjectedScript.prototype.createFakeValueDescriptor): Silence possible rejected promises created internally via Web Inspector. 2017-04-27 Saam Barati B3::FoldPathConstants does not consider the fall through case for Switch https://bugs.webkit.org/show_bug.cgi?id=171390 Reviewed by Filip Pizlo. foldPathConstants was not taking into account a Switch's default case when it tried to constant propagate the switch's operand value. e.g, we incorrectly transformed this code: ``` x = argumentGPR0; switch (x) { case 10: return 20; case 0: default: return x == 0; } ``` into: ``` x = argumentGPR0; switch (x) { case 10: return 20; case 0: default: return 1; } ``` Because we didn't take into account the default case, we incorrectly optimized the code as if case 0's block was only reachable if x is equal to zero. This is obviously not true, since it's the same block as the default case. This fix ensures that we can run the WebAssembly Tanks demo even when we set webAssemblyBBQOptimizationLevel=2. * b3/B3FoldPathConstants.cpp: * b3/B3SwitchValue.cpp: (JSC::B3::SwitchValue::fallThrough): (JSC::B3::SwitchValue::removeCase): Deleted. * b3/B3SwitchValue.h: * b3/testb3.cpp: (JSC::B3::testCallFunctionWithHellaArguments): (JSC::B3::testSwitchSameCaseAsDefault): (JSC::B3::testWasmBoundsCheck): (JSC::B3::run): 2017-04-27 Keith Miller WebAssembly: Don't tier up the same function twice https://bugs.webkit.org/show_bug.cgi?id=171397 Reviewed by Filip Pizlo. Because we don't CAS the tier up count on function entry/loop backedge and we use the least significant to indicate whether or not tier up has already started we could see the following: Threads A and B are running count in memory is (0): A: load tier up count (0) B: load tier up count (0) A: decrement count to -2 and see we need to check for tier up (0) A: store -2 to count (-2) A: exchangeOr(1) to tier up count (-1) B: decrement count to -2 and see we need to check for tier up (-1) B: store -2 to count (-2) B: exchangeOr(1) to tier up count (-1) This would cause us to tier up the same function twice, which we would rather avoid. * wasm/WasmB3IRGenerator.cpp: (JSC::Wasm::B3IRGenerator::emitTierUpCheck): * wasm/WasmTierUpCount.h: (JSC::Wasm::TierUpCount::TierUpCount): (JSC::Wasm::TierUpCount::loopDecrement): (JSC::Wasm::TierUpCount::functionEntryDecrement): (JSC::Wasm::TierUpCount::shouldStartTierUp): 2017-04-27 Keith Miller REGRESSION (r215843): ASSERTION FAILED: !m_completionTasks[0].first in JSC::Wasm::Plan::tryRemoveVMAndCancelIfLast(JSC::VM &) https://bugs.webkit.org/show_bug.cgi?id=171380 Reviewed by JF Bastien. This patch fixes the association of VMs to Wasm::Plans. For validation we want all the completion tasks to be associate with a VM. For BBQ, we want the main task to not be associated with any VM. * jsc.cpp: (functionTestWasmModuleFunctions): * wasm/WasmBBQPlan.cpp: (JSC::Wasm::BBQPlan::BBQPlan): * wasm/WasmBBQPlan.h: * wasm/WasmCodeBlock.cpp: (JSC::Wasm::CodeBlock::CodeBlock): (JSC::Wasm::CodeBlock::compileAsync): * wasm/WasmCodeBlock.h: (JSC::Wasm::CodeBlock::create): * wasm/WasmModule.cpp: (JSC::Wasm::makeValidationCallback): (JSC::Wasm::Module::validateSync): (JSC::Wasm::Module::validateAsync): (JSC::Wasm::Module::getOrCreateCodeBlock): (JSC::Wasm::Module::compileSync): (JSC::Wasm::Module::compileAsync): * wasm/WasmModule.h: * wasm/WasmOMGPlan.cpp: (JSC::Wasm::OMGPlan::OMGPlan): (JSC::Wasm::runOMGPlanForIndex): * wasm/WasmOMGPlan.h: * wasm/WasmPlan.cpp: (JSC::Wasm::Plan::Plan): (JSC::Wasm::Plan::runCompletionTasks): (JSC::Wasm::Plan::addCompletionTask): (JSC::Wasm::Plan::tryRemoveVMAndCancelIfLast): * wasm/WasmPlan.h: (JSC::Wasm::Plan::dontFinalize): * wasm/js/WebAssemblyInstanceConstructor.cpp: (JSC::constructJSWebAssemblyInstance): * wasm/js/WebAssemblyPrototype.cpp: (JSC::webAssemblyValidateFunc): 2017-04-27 Saam Barati Restore some caching functionality that got accidentally removed when doing Wasm PIC patches https://bugs.webkit.org/show_bug.cgi?id=171382 Reviewed by Keith Miller. When I created Wasm::CodeBlock, I accidentally removed caching the creation of JSWebAssemblyCodeBlocks. This patch restores it. It's worth keeping JSWebAssemblyModule's JSWebAssemblyCodeBlock cache because creating a JSWebAssemblyCodeBlock does non trivial work by creating the various IC call stubs. * wasm/js/JSWebAssemblyCodeBlock.h: (JSC::JSWebAssemblyCodeBlock::codeBlock): * wasm/js/JSWebAssemblyInstance.cpp: (JSC::JSWebAssemblyInstance::finalizeCreation): (JSC::JSWebAssemblyInstance::create): * wasm/js/JSWebAssemblyModule.h: 2017-04-27 Mark Lam Audit and fix incorrect uses of JSArray::tryCreateForInitializationPrivate(). https://bugs.webkit.org/show_bug.cgi?id=171344 Reviewed by Filip Pizlo. JSArray::tryCreateForInitializationPrivate() should only be used in performance critical paths, and should always be used with care because it creates an uninitialized object that needs to be initialized by its client before the object can be released into the system. Before the object is fully initialized: a. the client should not re-enter the VM to execute JS code, and b. GC should not run. This is because until the object is fully initialized, it is an inconsistent state that the GC and JS code will not be happy about. In this patch, we do the following: 1. Renamed JSArray::tryCreateForInitializationPrivate() to JSArray::tryCreateUninitializedRestricted() because "private" is a bit ambiguous and can be confused with APIs that are called freely within WebKit but are not meant for clients of WebKit. In this case, we intend for use of this API to be restricted to only a few carefully considered and crafted cases. 2. Introduce the ObjectInitializationScope RAII object which covers the period when the uninitialized object is created and gets initialized. ObjectInitializationScope will asserts that either the object is created fully initialized (in the case where the object structure is not an "original" structure) or if created uninitialized, is fully initialized at the end of the scope. If the object is created uninitialized, the ObjectInitializationScope also ensures that we do not GC nor re-enter the VM to execute JS code. This is achieved by enabling DisallowGC and DisallowVMReentry scopes. tryCreateUninitializedRestricted() and initializeIndex() now requires an ObjectInitializationScope instance. The ObjectInitializationScope replaces the VM& argument because it can be used to pass the VM& itself. This is a small optimization that makes passing the ObjectInitializationScope free even on release builds. 3. Factored a DisallowScope out of DisallowGC, and make DisallowGC extend it. Introduce a DisallowVMReentry class that extends DisallowScope. 4. Fixed a bug found by the ObjectInitializationScope. The bug is that there are scenarios where the structure passed to tryCreateUninitializedRestricted() that may not be an "original" structure. As a result, initializeIndex() would end up allocating new structures, and therefore trigger a GC. The fix is to detect that the structure passed to tryCreateUninitializedRestricted() is not an "original" one, and pre-initialize the array with 0s. This bug was detected by existing tests. Hence, no new test needed. 5. Replaced all inappropriate uses of tryCreateUninitializedRestricted() with tryCreate(). Inappropriate uses here means code that is not in performance critical paths. Similarly, replaced accompanying uses of initializeIndex() with putDirectIndex(). This patch is performance neutral (according to the JSC command line benchmarks). * CMakeLists.txt: * JavaScriptCore.xcodeproj/project.pbxproj: * dfg/DFGOperations.cpp: * ftl/FTLOperations.cpp: (JSC::FTL::operationMaterializeObjectInOSR): * heap/DeferGC.cpp: * heap/DeferGC.h: (JSC::DisallowGC::DisallowGC): (JSC::DisallowGC::initialize): (JSC::DisallowGC::scopeReentryCount): (JSC::DisallowGC::setScopeReentryCount): (JSC::DisallowGC::~DisallowGC): Deleted. (JSC::DisallowGC::isGCDisallowedOnCurrentThread): Deleted. * heap/GCDeferralContextInlines.h: (JSC::GCDeferralContext::~GCDeferralContext): * heap/Heap.cpp: (JSC::Heap::collectIfNecessaryOrDefer): * runtime/ArrayPrototype.cpp: (JSC::arrayProtoPrivateFuncConcatMemcpy): * runtime/ClonedArguments.cpp: (JSC::ClonedArguments::createWithInlineFrame): (JSC::ClonedArguments::createByCopyingFrom): * runtime/CommonSlowPaths.cpp: (JSC::SLOW_PATH_DECL): * runtime/DisallowScope.h: Added. (JSC::DisallowScope::DisallowScope): (JSC::DisallowScope::~DisallowScope): (JSC::DisallowScope::isInEffectOnCurrentThread): (JSC::DisallowScope::enable): (JSC::DisallowScope::enterScope): (JSC::DisallowScope::exitScope): * runtime/DisallowVMReentry.cpp: Added. * runtime/DisallowVMReentry.h: Added. (JSC::DisallowVMReentry::DisallowVMReentry): (JSC::DisallowVMReentry::initialize): (JSC::DisallowVMReentry::scopeReentryCount): (JSC::DisallowVMReentry::setScopeReentryCount): * runtime/InitializeThreading.cpp: (JSC::initializeThreading): * runtime/JSArray.cpp: (JSC::JSArray::tryCreateUninitializedRestricted): (JSC::JSArray::fastSlice): (JSC::JSArray::tryCreateForInitializationPrivate): Deleted. * runtime/JSArray.h: (JSC::JSArray::tryCreateUninitializedRestricted): (JSC::JSArray::tryCreate): (JSC::constructArray): (JSC::constructArrayNegativeIndexed): (JSC::JSArray::tryCreateForInitializationPrivate): Deleted. (JSC::createArrayButterfly): Deleted. * runtime/JSCellInlines.h: (JSC::allocateCell): * runtime/JSObject.h: (JSC::JSObject::initializeIndex): (JSC::JSObject::initializeIndexWithoutBarrier): * runtime/ObjectInitializationScope.cpp: Added. (JSC::ObjectInitializationScope::ObjectInitializationScope): (JSC::ObjectInitializationScope::~ObjectInitializationScope): (JSC::ObjectInitializationScope::notifyAllocated): (JSC::ObjectInitializationScope::verifyPropertiesAreInitialized): * runtime/ObjectInitializationScope.h: Added. (JSC::ObjectInitializationScope::ObjectInitializationScope): (JSC::ObjectInitializationScope::vm): (JSC::ObjectInitializationScope::notifyAllocated): * runtime/Operations.h: (JSC::isScribbledValue): (JSC::scribble): * runtime/RegExpMatchesArray.cpp: (JSC::createEmptyRegExpMatchesArray): * runtime/RegExpMatchesArray.h: (JSC::tryCreateUninitializedRegExpMatchesArray): (JSC::createRegExpMatchesArray): * runtime/VMEntryScope.cpp: (JSC::VMEntryScope::VMEntryScope): 2017-04-27 Carlos Garcia Campos [GTK] Remote inspector should support inspecting targets with previous version of backend commands https://bugs.webkit.org/show_bug.cgi?id=171267 Reviewed by Michael Catanzaro. Rename GetTargetList DBus method as SetupInspectorClient since this method is actually called only once by client right after connecting to the server. The method now receives the client backend commands hash as argument and returns the contents of the backend commands file in case the hash doesn't match with the local version. * PlatformGTK.cmake: Add RemoteInspectorUtils to compilation. * inspector/remote/glib/RemoteInspectorServer.cpp: (Inspector::RemoteInspectorServer::setupInspectorClient): * inspector/remote/glib/RemoteInspectorServer.h: * inspector/remote/glib/RemoteInspectorUtils.cpp: Added. (Inspector::backendCommands): (Inspector::backendCommandsHash): * inspector/remote/glib/RemoteInspectorUtils.h: Added. 2017-04-27 Yusuke Suzuki [JSC] Handle PhantomSpread in LoadVarargs as the same to the others https://bugs.webkit.org/show_bug.cgi?id=171262 Reviewed by Saam Barati. This is follow-up patch after r215720. In that patch, accidentally we did not apply the same change to LoadVarargs in argument elimination phase. This patch just does the same rewriting to handle PhantomSpread correctly. * dfg/DFGArgumentsEliminationPhase.cpp: 2017-04-26 Joseph Pecoraro Web Inspector: Uint8ClampedArray should be treated like an array, not an object https://bugs.webkit.org/show_bug.cgi?id=171364 Reviewed by Sam Weinig. * inspector/JSInjectedScriptHost.cpp: (Inspector::JSInjectedScriptHost::subtype): Treat Uint8ClampedArray (like other Typed Arrays) as an array. 2017-04-26 Saam Barati Print Wasm function index in stack trace https://bugs.webkit.org/show_bug.cgi?id=171349 Reviewed by JF Bastien. This patch prints a Callee's index in the function index space in Error.stack. This will lead to stack traces that have lines of text like: wasm function index: 4@[wasm code] We don't ascribe indices to everything in wasm. Specifically, the Wasm->JS call stub callee does not get a name, and neither does the JS -> Wasm entrypoint. * interpreter/Interpreter.cpp: (JSC::GetStackTraceFunctor::operator()): * interpreter/StackVisitor.cpp: (JSC::StackVisitor::readNonInlinedFrame): (JSC::StackVisitor::Frame::functionName): * interpreter/StackVisitor.h: (JSC::StackVisitor::Frame::wasmFunctionIndex): * runtime/StackFrame.cpp: (JSC::StackFrame::functionName): * runtime/StackFrame.h: (JSC::StackFrame::StackFrame): (JSC::StackFrame::wasm): (JSC::StackFrame::hasBytecodeOffset): (JSC::StackFrame::bytecodeOffset): * wasm/WasmBBQPlanInlines.h: (JSC::Wasm::BBQPlan::initializeCallees): * wasm/WasmCallee.cpp: (JSC::Wasm::Callee::Callee): * wasm/WasmCallee.h: (JSC::Wasm::Callee::create): (JSC::Wasm::Callee::index): * wasm/WasmOMGPlan.cpp: (JSC::Wasm::OMGPlan::work): 2017-04-26 Keith Miller Follow up to r215843 https://bugs.webkit.org/show_bug.cgi?id=171361 Reviewed by Saam Barati. This patch fixes some style comments Saam didn't get a chance to request before I landed: https://bugs.webkit.org/show_bug.cgi?id=170134. It renames Wasm::CodeBlock::m_wasmEntrypoints to m_wasmIndirectCallEntrypoints, as well as fixes some copyrights and indentation. * wasm/WasmBBQPlan.cpp: * wasm/WasmCodeBlock.cpp: (JSC::Wasm::CodeBlock::CodeBlock): * wasm/WasmCodeBlock.h: (JSC::Wasm::CodeBlock::wasmEntrypointLoadLocationFromFunctionIndexSpace): * wasm/WasmOMGPlan.cpp: (JSC::Wasm::OMGPlan::work): * wasm/WasmTierUpCount.h: (JSC::Wasm::TierUpCount::TierUpCount): (JSC::Wasm::TierUpCount::loopDecrement): (JSC::Wasm::TierUpCount::functionEntryDecrement): (JSC::Wasm::TierUpCount::shouldStartTierUp): (JSC::Wasm::TierUpCount::count): 2017-04-26 Saam Barati ASSERTION FAILED: inIndex != notFound in JSC::invalidParameterInSourceAppender() https://bugs.webkit.org/show_bug.cgi?id=170924 Reviewed by Mark Lam. The error message handler for "in" was searching for the literal string "in". However, our parser incorrectly allows escaped characters to be part of keywords. So this is parsed as "in" in JSC: "i\u006E". It should not be parsed that way. I opened https://bugs.webkit.org/show_bug.cgi?id=171310 to address this issue. Regardless, the error message handlers should handle unexpected text gracefully. All functions that try to augment error messages with the goal of providing a more textual context for the error message should use the original error message instead of crashing when they detect unexpected text. This patch also changes the already buggy code that tries to find the base of a function call. That could would fail for code like this: "zoo.bar("/abc\)*/");". See https://bugs.webkit.org/show_bug.cgi?id=146304 It would think that the base is "z". However, the algorithm that tries to find the base can often tell when it fails, and when it does, it should happily return the approximate text error message instead of thinking that the base is "z". * runtime/ExceptionHelpers.cpp: (JSC::functionCallBase): (JSC::notAFunctionSourceAppender): (JSC::invalidParameterInSourceAppender): 2017-04-26 Keith Miller WebAssembly: Implement tier up https://bugs.webkit.org/show_bug.cgi?id=170134 Reviewed by Filip Pizlo. This patch implements tier up for wasm functions. Unlike with JS code, wasm code needs to be able to tier up concurrently with the running code. Since JS code is synchronous we can always link on the running thread, wasm, however, can run the same code on more than one thread. In order to make patching work correctly, we need to ensure that all patches of callsites are aligned. On ARM we get this for free since every call is a near call. On X86 we ensure that the 32-bit relative offset is 32-bit aligned. This patch also modifies how Wasm::Plan works. Now Plan is a abstract super class and there are two subclasses, which correspond to the different tiers of our wasm engine. The first, Build Bytecode Quickly (BBQ) tier, roughly does what the old plan code did before. The new tier, Optimized Machine code Generation (OMG), can be called at any point by BBQ code and compiles exactly one function. Once an OMGPlan finishes it will link it's code internally then reset the instruction cache of all running wasm threads, via, a ThreadMessage. Once the instruction caches have been reset all the other functions will be patched to call the new code. * JavaScriptCore.xcodeproj/project.pbxproj: * assembler/AbstractMacroAssembler.h: (JSC::AbstractMacroAssembler::ensureCacheLineSpace): * assembler/CodeLocation.h: (JSC::CodeLocationThreadSafeNearCall::CodeLocationThreadSafeNearCall): * assembler/MacroAssemblerARM64.h: (JSC::MacroAssemblerARM64::threadSafePatchableNearCall): * assembler/MacroAssemblerX86Common.h: (JSC::MacroAssemblerX86Common::threadSafeNearCall): * assembler/MacroAssemblerX86_64.h: (JSC::MacroAssemblerX86_64::threadSafePatchableNearCall): * b3/air/AirEmitShuffle.cpp: (JSC::B3::Air::ShufflePair::inst): (JSC::B3::Air::ShufflePair::opcode): Deleted. * b3/air/AirEmitShuffle.h: * jsc.cpp: (functionTestWasmModuleFunctions): * runtime/JSLock.cpp: (JSC::JSLock::didAcquireLock): * runtime/Options.h: * wasm/WasmB3IRGenerator.cpp: (JSC::Wasm::B3IRGenerator::materializeWasmContext): (JSC::Wasm::B3IRGenerator::B3IRGenerator): (JSC::Wasm::B3IRGenerator::constant): (JSC::Wasm::B3IRGenerator::emitTierUpCheck): (JSC::Wasm::B3IRGenerator::addLoop): (JSC::Wasm::B3IRGenerator::addTopLevel): (JSC::Wasm::B3IRGenerator::addBlock): (JSC::Wasm::createJSToWasmWrapper): (JSC::Wasm::parseAndCompile): * wasm/WasmB3IRGenerator.h: * wasm/WasmBBQPlan.cpp: Copied from Source/JavaScriptCore/wasm/WasmPlan.cpp. (JSC::Wasm::BBQPlan::BBQPlan): (JSC::Wasm::BBQPlan::stateString): (JSC::Wasm::BBQPlan::moveToState): (JSC::Wasm::BBQPlan::parseAndValidateModule): (JSC::Wasm::BBQPlan::prepare): (JSC::Wasm::BBQPlan::ThreadCountHolder::ThreadCountHolder): (JSC::Wasm::BBQPlan::ThreadCountHolder::~ThreadCountHolder): (JSC::Wasm::BBQPlan::compileFunctions): (JSC::Wasm::BBQPlan::complete): (JSC::Wasm::BBQPlan::work): * wasm/WasmBBQPlan.h: Copied from Source/JavaScriptCore/wasm/WasmPlan.h. * wasm/WasmBBQPlanInlines.h: Copied from Source/JavaScriptCore/wasm/WasmPlanInlines.h. (JSC::Wasm::BBQPlan::initializeCallees): * wasm/WasmBinding.cpp: (JSC::Wasm::wasmToWasm): * wasm/WasmCallee.h: (JSC::Wasm::Callee::entrypoint): * wasm/WasmCodeBlock.cpp: (JSC::Wasm::CodeBlock::CodeBlock): * wasm/WasmCodeBlock.h: (JSC::Wasm::CodeBlock::jsEntrypointCalleeFromFunctionIndexSpace): (JSC::Wasm::CodeBlock::wasmEntrypointCalleeFromFunctionIndexSpace): (JSC::Wasm::CodeBlock::wasmEntrypointLoadLocationFromFunctionIndexSpace): (JSC::Wasm::CodeBlock::tierUpCount): (JSC::Wasm::CodeBlock::mode): * wasm/WasmFormat.h: (JSC::Wasm::CallableFunction::CallableFunction): (JSC::Wasm::CallableFunction::offsetOfWasmEntrypointLoadLocation): * wasm/WasmMachineThreads.cpp: Copied from Source/JavaScriptCore/wasm/WasmPlanInlines.h. (JSC::Wasm::wasmThreads): (JSC::Wasm::startTrackingCurrentThread): (JSC::Wasm::resetInstructionCacheOnAllThreads): * wasm/WasmMachineThreads.h: Copied from Source/JavaScriptCore/wasm/WasmCallee.h. * wasm/WasmModule.cpp: (JSC::Wasm::makeValidationResult): (JSC::Wasm::makeValidationCallback): (JSC::Wasm::Module::validateSync): (JSC::Wasm::Module::validateAsync): * wasm/WasmModule.h: (JSC::Wasm::Module::codeBlockFor): * wasm/WasmOMGPlan.cpp: Added. (JSC::Wasm::OMGPlan::OMGPlan): (JSC::Wasm::OMGPlan::work): (JSC::Wasm::runOMGPlanForIndex): * wasm/WasmOMGPlan.h: Copied from Source/JavaScriptCore/wasm/WasmPlanInlines.h. * wasm/WasmPlan.cpp: (JSC::Wasm::Plan::Plan): (JSC::Wasm::Plan::runCompletionTasks): (JSC::Wasm::Plan::addCompletionTask): (JSC::Wasm::Plan::waitForCompletion): (JSC::Wasm::Plan::tryRemoveVMAndCancelIfLast): (JSC::Wasm::Plan::fail): (JSC::Wasm::Plan::stateString): Deleted. (JSC::Wasm::Plan::moveToState): Deleted. (JSC::Wasm::Plan::parseAndValidateModule): Deleted. (JSC::Wasm::Plan::prepare): Deleted. (JSC::Wasm::Plan::ThreadCountHolder::ThreadCountHolder): Deleted. (JSC::Wasm::Plan::ThreadCountHolder::~ThreadCountHolder): Deleted. (JSC::Wasm::Plan::compileFunctions): Deleted. (JSC::Wasm::Plan::complete): Deleted. * wasm/WasmPlan.h: (JSC::Wasm::Plan::exports): Deleted. (JSC::Wasm::Plan::internalFunctionCount): Deleted. (JSC::Wasm::Plan::takeModuleInformation): Deleted. (JSC::Wasm::Plan::takeCallLinkInfos): Deleted. (JSC::Wasm::Plan::takeWasmToWasmExitStubs): Deleted. (JSC::Wasm::Plan::hasWork): Deleted. (JSC::Wasm::Plan::hasBeenPrepared): Deleted. * wasm/WasmTierUpCount.h: Renamed from Source/JavaScriptCore/wasm/WasmPlanInlines.h. (JSC::Wasm::TierUpCount::TierUpCount): (JSC::Wasm::TierUpCount::loopDecrement): (JSC::Wasm::TierUpCount::functionEntryDecrement): (JSC::Wasm::TierUpCount::shouldStartTierUp): (JSC::Wasm::TierUpCount::count): * wasm/WasmWorklist.cpp: * wasm/WasmWorklist.h: (JSC::Wasm::Worklist::nextTicket): * wasm/js/JSWebAssemblyCodeBlock.cpp: * wasm/js/JSWebAssemblyCodeBlock.h: (JSC::JSWebAssemblyCodeBlock::wasmEntrypointLoadLocationFromFunctionIndexSpace): (JSC::JSWebAssemblyCodeBlock::wasmToJsCallStubForImport): (JSC::JSWebAssemblyCodeBlock::wasmEntrypointCalleeFromFunctionIndexSpace): Deleted. * wasm/js/JSWebAssemblyTable.cpp: (JSC::JSWebAssemblyTable::setFunction): * wasm/js/WebAssemblyFunction.cpp: (JSC::WebAssemblyFunction::create): (JSC::WebAssemblyFunction::WebAssemblyFunction): * wasm/js/WebAssemblyFunction.h: (JSC::WebAssemblyFunction::signatureIndex): (JSC::WebAssemblyFunction::wasmEntrypointLoadLocation): (JSC::WebAssemblyFunction::callableFunction): (JSC::WebAssemblyFunction::offsetOfWasmEntrypointLoadLocation): (JSC::WebAssemblyFunction::wasmEntrypoint): Deleted. (JSC::WebAssemblyFunction::offsetOfWasmEntrypoint): Deleted. * wasm/js/WebAssemblyModuleRecord.cpp: (JSC::WebAssemblyModuleRecord::link): (JSC::WebAssemblyModuleRecord::evaluate): * wasm/js/WebAssemblyPrototype.cpp: (JSC::webAssemblyValidateFunc): * wasm/js/WebAssemblyWrapperFunction.cpp: (JSC::WebAssemblyWrapperFunction::WebAssemblyWrapperFunction): (JSC::WebAssemblyWrapperFunction::create): * wasm/js/WebAssemblyWrapperFunction.h: (JSC::WebAssemblyWrapperFunction::signatureIndex): (JSC::WebAssemblyWrapperFunction::wasmEntrypointLoadLocation): (JSC::WebAssemblyWrapperFunction::callableFunction): (JSC::WebAssemblyWrapperFunction::wasmEntrypoint): Deleted. 2017-04-26 Caitlin Potter [JSC] fix RETURN_IF_EXCEPTION() placement in ownPropertyKeys() https://bugs.webkit.org/show_bug.cgi?id=171330 Reviewed by Mark Lam. Ensure RETURN_IF_EXCEPTION() following invokation of the filterPropertyIfNeeded() lambda. * runtime/ObjectConstructor.cpp: (JSC::ownPropertyKeys): 2017-04-26 Caitlin Potter [JSC] Object.keys() must discard property names with no PropertyDescriptor https://bugs.webkit.org/show_bug.cgi?id=171291 Reviewed by Yusuke Suzuki. Proxy objects can produce an arbitrary list of property names from the "ownKeys" trap, however the Object.keys() algorithm is required to discard names which do not have a PropertyDescriptor. This also applies to other uses of the EnumerableOwnProperties() algorithm (https://tc39.github.io/ecma262/#sec-enumerableownproperties) Related to https://bugs.chromium.org/p/v8/issues/detail?id=6290 * runtime/ObjectConstructor.cpp: (JSC::ownPropertyKeys): 2017-04-25 Andy VanWagoner Unhandled enumeration values in IntlDateTimeFormat.cpp https://bugs.webkit.org/show_bug.cgi?id=171241 Reviewed by JF Bastien. Added some missing cases of the UDateFormatField to partTypeString, and made them conditional to the ICU version that added them. This should remove the warnings that appear on platform builds using the newer system ICU headers. * runtime/IntlDateTimeFormat.cpp: (JSC::IntlDateTimeFormat::partTypeString): 2017-04-25 Commit Queue Unreviewed, rolling out r215476. https://bugs.webkit.org/show_bug.cgi?id=171304 "It broke JSBench" (Requested by saamyjoon on #webkit). Reverted changeset: "[ES6]. Implement Annex B.3.3 function hoisting rules for eval" https://bugs.webkit.org/show_bug.cgi?id=163208 http://trac.webkit.org/changeset/215476 2017-04-25 Saam Barati JSArray::isArrayPrototypeIteratorProtocolFastAndNonObservable is wrong because it does not do the necessary checks on the base object https://bugs.webkit.org/show_bug.cgi?id=171150 Reviewed by Sam Weinig. This patch fixes a huge oversight from the patch that introduced op_spread/Spread. The original patch did not account for the base object having Symbol.iterator or getters that could change the iterator protocol. This patch fixes the oversight both in the C code, as well as the DFG/FTL backends. We only perform the memcpy version of spread if we've proven that it's guaranteed to be side-effect free (no indexed getters), and if the iterator protocol is guaranteed to be the original protocol. To do this, we must prove that: 1. The protocol on Array.prototype hasn't changed (this is the same as the introductory patch for op_spread). 2. The base object's __proto__ is Array.prototype 3. The base object does not have indexed getters 4. The base object does not have Symbol.iterator property. * dfg/DFGGraph.cpp: (JSC::DFG::Graph::canDoFastSpread): * dfg/DFGGraph.h: * dfg/DFGSpeculativeJIT.cpp: (JSC::DFG::SpeculativeJIT::compileSpread): * ftl/FTLLowerDFGToB3.cpp: (JSC::FTL::DFG::LowerDFGToB3::compileSpread): * runtime/JSArray.cpp: (JSC::JSArray::isIteratorProtocolFastAndNonObservable): * runtime/JSArray.h: * runtime/JSArrayInlines.h: (JSC::JSArray::isIteratorProtocolFastAndNonObservable): Deleted. * runtime/JSGlobalObject.h: * runtime/JSGlobalObjectInlines.h: (JSC::JSGlobalObject::isArrayPrototypeIteratorProtocolFastAndNonObservable): (JSC::JSGlobalObject::isArrayIteratorProtocolFastAndNonObservable): Deleted. 2017-04-25 Mark Lam Array.prototype.slice() should ensure that end >= begin. https://bugs.webkit.org/show_bug.cgi?id=170989 Reviewed by Saam Barati. * runtime/ArrayPrototype.cpp: (JSC::arrayProtoFuncSlice): 2017-04-25 Don Olmstead [Win] Use Clang's __has_declspec_attribute for export macros https://bugs.webkit.org/show_bug.cgi?id=171240 Reviewed by Alex Christensen. * runtime/JSExportMacros.h: 2017-04-25 Saam Barati Unreviewed. Attempt armv7k build fix after r215720 I think we're just missing an include for the definition of ExecState::r(). * runtime/JSFixedArray.cpp: 2017-04-25 Daniel Bates [Cocoa][Win] Enable of X-Content-Type-Options: nosniff header https://bugs.webkit.org/show_bug.cgi?id=136452 Reviewed by Brent Fulgham. Enable X-Content-Type-Options: nosniff on Mac, iOS and Windows platforms. * Configurations/FeatureDefines.xcconfig: 2017-04-25 Mark Lam Local CSE wrongly CSEs array accesses with different result types. https://bugs.webkit.org/show_bug.cgi?id=170990 Reviewed by Saam Barati. The fix is to use different LocationKind enums for the different type of array result types. This makes the HeapLocation values different based on the result types, and allows CSE to discern between them. * dfg/DFGCSEPhase.cpp: * dfg/DFGClobberize.h: (JSC::DFG::clobberize): * dfg/DFGHeapLocation.cpp: (WTF::printInternal): * dfg/DFGHeapLocation.h: (JSC::DFG::indexedPropertyLocForResultType): 2017-04-25 Mark Lam Make DFG SpeculatedType dumps easier to read. https://bugs.webkit.org/show_bug.cgi?id=171280 Reviewed by Saam Barati. Adding a pretty printer to insert |s between each type string and changing the dumped strings to match the SpeculatedType names case-wise. * bytecode/SpeculatedType.cpp: (JSC::PrettyPrinter::PrettyPrinter): (JSC::PrettyPrinter::print): (JSC::dumpSpeculation): * bytecode/SpeculatedType.h: 2017-04-25 JF Bastien lowerStackArgs: check Arg::addr.isValidForm when falling back to SP offsets https://bugs.webkit.org/show_bug.cgi?id=171278 Reviewed by Filip Pizlo. lowerStackArgs checked that the FP offsets it tries to generate are valid form, but didn't check that the fallback was valid form. This lead to stackAddr's assertion being dead, and the MaroAssembler asserting way later on move / add when handed a huge immediate. * b3/air/AirArg.cpp: (JSC::B3::Air::Arg::stackAddrImpl): 2017-04-25 Zan Dobersek [aarch64] moveConditionally32(), moveConditionallyTest32() should move from/to 64-bit registers https://bugs.webkit.org/show_bug.cgi?id=170891 Reviewed by Saam Barati. moveConditionally32() and moveConditionallyTest32() operations in MacroAssemblerARM64 properly perform comparisons and tests on 32-bit values, but end up performing the moves from and to 32-bit registers. Move operations should instead be done on 64-bit registers, just like on the X86_64 platform. This is achieved by specifying 64 as the data size for the csel instructions. * assembler/MacroAssemblerARM64.h: (JSC::MacroAssemblerARM64::moveConditionally32): (JSC::MacroAssemblerARM64::moveConditionallyTest32): 2017-04-24 Joseph Pecoraro test262: test262/test/language/expressions/object/method-definition/early-errors-object-method-duplicate-parameters.js https://bugs.webkit.org/show_bug.cgi?id=171190 Reviewed by Saam Barati. * bytecompiler/BytecodeGenerator.cpp: (JSC::BytecodeGenerator::BytecodeGenerator): (JSC::BytecodeGenerator::emitNewFunctionExpressionCommon): (JSC::BytecodeGenerator::emitNewFunction): * bytecompiler/NodesCodegen.cpp: (JSC::FunctionNode::emitBytecode): (JSC::Scope::setSourceParseMode): * parser/ParserModes.h: (JSC::isFunctionParseMode): (JSC::isMethodParseMode): (JSC::isGeneratorOrAsyncFunctionWrapperParseMode): (JSC::isGeneratorParseMode): (JSC::isGeneratorWrapperParseMode): * runtime/FunctionExecutable.h: * runtime/JSFunction.cpp: (JSC::JSFunction::getOwnPropertySlot): Add a new GeneratorWrapperMethodMode parse mode. The other function types (async, arrow) already have a FunctionMode and a MethodMode. Give generators one as well. This lets isMethodParseMode actually be accurate. * parser/Parser.cpp: (JSC::Parser::parseInner): (JSC::Parser::isArrowFunctionParameters): (JSC::Parser::parseFormalParameters): (JSC::stringForFunctionMode): (JSC::Parser::parseFunctionParameters): (JSC::Parser::parseFunctionInfo): (JSC::Parser::parseClass): (JSC::Parser::parsePropertyMethod): * parser/Parser.h: Add a duplicate parameter failure if there are duplicate parameters in method syntax. 2017-04-24 Andy VanWagoner Clean up ICU headers https://bugs.webkit.org/show_bug.cgi?id=170997 Reviewed by JF Bastien. Update all icu headers to 55.1 * icu/LICENSE: Update copyright * icu/README: Explain ICU headers for OS X better * icu/unicode/localpointer.h: (LocalPointer::LocalPointer): (LocalPointer::adoptInsteadAndCheckErrorCode): * icu/unicode/platform.h: * icu/unicode/putil.h: * icu/unicode/ucal.h: * icu/unicode/uchar.h: * icu/unicode/ucnv.h: * icu/unicode/ucol.h: * icu/unicode/uconfig.h: * icu/unicode/ucurr.h: * icu/unicode/udatpg.h: * icu/unicode/udisplaycontext.h: * icu/unicode/uformattable.h: * icu/unicode/uloc.h: * icu/unicode/umachine.h: * icu/unicode/unum.h: * icu/unicode/unumsys.h: * icu/unicode/urename.h: * icu/unicode/uscript.h: * icu/unicode/uset.h: * icu/unicode/ustring.h: * icu/unicode/utf8.h: * icu/unicode/utypes.h: 2017-04-24 Yusuke Suzuki [JSC] Use JSFixedArray directly when using call_varargs https://bugs.webkit.org/show_bug.cgi?id=171057 Reviewed by Saam Barati. Previously we always emit new_array_with_spread when calling call(...args). But this array is unnecessary if varargs operation can handle Spread directly. This patch implements a peep-hole optimization in the bytecode compiler layer to omit new_array_with_spread. This is very simple and effective because this peep-hole optimization is quite common when using (...args) style calls and this optimization works all the tiers. While we can implement the phase to omit this NewArrayWithSpread in argument elimination phase, it only works for FTL. While such an optimization can work with complex data flow, this peep-hole optimization can optimize a common case easily. For now, Spread and PhantomSpread can be directly drained by CallVarargs and LoadVarargs related operations. We modify DFG and FTL to handle this correctly. This shows six-speed improvement. spread.es6 89.4300+-2.0236 ^ 69.6015+-1.7278 ^ definitely 1.2849x faster spread-generator.es6 344.7879+-5.9147 ^ 331.2712+-6.8610 ^ definitely 1.0408x faster * bytecompiler/BytecodeGenerator.cpp: (JSC::BytecodeGenerator::emitCall): (JSC::BytecodeGenerator::emitConstruct): * dfg/DFGArgumentsEliminationPhase.cpp: * dfg/DFGPreciseLocalClobberize.h: (JSC::DFG::PreciseLocalClobberizeAdaptor::readTop): * ftl/FTLLowerDFGToB3.cpp: (JSC::FTL::DFG::LowerDFGToB3::compileSpread): (JSC::FTL::DFG::LowerDFGToB3::compileCallOrConstructVarargsSpread): (JSC::FTL::DFG::LowerDFGToB3::compileCallOrConstructVarargs): (JSC::FTL::DFG::LowerDFGToB3::compileForwardVarargs): (JSC::FTL::DFG::LowerDFGToB3::compileForwardVarargsWithSpread): * interpreter/Interpreter.cpp: (JSC::sizeOfVarargs): (JSC::loadVarargs): * parser/Nodes.h: (JSC::ArrayNode::elements): * runtime/JSFixedArray.cpp: (JSC::JSFixedArray::copyToArguments): * runtime/JSFixedArray.h: 2017-04-24 Yusuke Suzuki [WTF] Move JSC tools/StackTrace to WTF and unify stack trace dump code https://bugs.webkit.org/show_bug.cgi?id=171199 Reviewed by Mark Lam. This patch adds a utility method to produce demangled names with dladdr. It fixes several memory leaks because the result of abi::__cxa_demangle() needs to be `free`-ed. * CMakeLists.txt: * JavaScriptCore.xcodeproj/project.pbxproj: * inspector/JSGlobalObjectInspectorController.cpp: (Inspector::JSGlobalObjectInspectorController::appendAPIBacktrace): * runtime/SamplingProfiler.cpp: (JSC::SamplingProfiler::StackFrame::displayName): * tools/CellProfile.h: * tools/CodeProfile.cpp: (JSC::CodeProfile::report): (JSC::symbolName): Deleted. 2017-04-24 Joseph Pecoraro Web Inspector: ObjC RWIProtocol codegen should better handle optional members https://bugs.webkit.org/show_bug.cgi?id=171251 Reviewed by Brian Burg. * inspector/scripts/codegen/generate_objc_protocol_types_implementation.py: (ObjCProtocolTypesImplementationGenerator._generate_getter_for_member): * inspector/scripts/codegen/objc_generator.py: (ObjCGenerator.protocol_to_objc_expression_for_member): (ObjCGenerator.protocol_to_objc_code_block_for_object_member): Always be safe and nil check object property accesses, optional or not. * inspector/scripts/tests/generic/expected/type-declaration-object-type.json-result: * inspector/scripts/tests/generic/expected/type-requiring-runtime-casts.json-result: Rebaselined inspector generator tests. 2017-04-24 Saam Barati ASSERTION FAILED: m_table seen with workers/wasm-hashset LayoutTests https://bugs.webkit.org/show_bug.cgi?id=171119 Reviewed by Keith Miller. The HashSet of timer set notification callbacks can be accessed and augmented simultaneously from different threads. e.g, the worker thread can augment it while the wasm compilation thread will access it. Therefore, accesses must be guarded by a lock. * runtime/JSRunLoopTimer.cpp: (JSC::JSRunLoopTimer::scheduleTimer): (JSC::JSRunLoopTimer::addTimerSetNotification): (JSC::JSRunLoopTimer::removeTimerSetNotification): * runtime/JSRunLoopTimer.h: 2017-04-24 Joseph Pecoraro test262: test262/test/language/computed-property-names/class/static/getter-prototype.js https://bugs.webkit.org/show_bug.cgi?id=170897 Reviewed by Saam Barati. * parser/ASTBuilder.h: (JSC::ASTBuilder::createArguments): (JSC::ASTBuilder::createArgumentsList): Reorder so all the createProperty methods are grouped together. * parser/Parser.h: * parser/Parser.cpp: (JSC::Parser::parseClass): (JSC::Parser::parseProperty): (JSC::Parser::parseGetterSetter): Refine the conditions for syntax errors for getter/setter properties names. "prototype" is not allowed as a static and "constructor" is not all when non-static. * runtime/JSObject.cpp: (JSC::JSObject::putGetter): (JSC::JSObject::putSetter): Throw exceptions. These methods are only used by this path via op_put_getter_by_val / op_put_setter_by_val. 2017-04-24 Joseph Pecoraro test262: test262/test/language/statements/for-of/dstr-array-elem-init-fn-name-arrow.js https://bugs.webkit.org/show_bug.cgi?id=171160 Reviewed by JF Bastien. * parser/ASTBuilder.h: (JSC::ASTBuilder::tryInferNameInPattern): (JSC::ASTBuilder::tryInferNameInPatternWithIdentifier): We supported getting the name from a BindingNode. We extend this to support getting the name from a ResolveNode inside of an AssignmentElementNode. * parser/Nodes.h: (JSC::DestructuringPatternNode::isAssignmentElementNode): (JSC::AssignmentElementNode::isAssignmentElementNode): Make it possible to identify an assignment element node. 2017-04-24 Alex Christensen Reduce copies and allocations in SharedBuffer::append https://bugs.webkit.org/show_bug.cgi?id=170956 Reviewed by Andreas Kling. * runtime/ArrayBuffer.h: 2017-04-24 Carlos Garcia Campos [GTK] Switch to use ENABLE_REMOTE_INSPECTOR instead of ENABLE_INSPECTOR_SERVER for the remote inspector https://bugs.webkit.org/show_bug.cgi?id=166680 Reviewed by Michael Catanzaro. Add GTK+ port implementation of RemoteInspector. * PlatformGTK.cmake: * inspector/remote/RemoteConnectionToTarget.h: * inspector/remote/RemoteInspector.h: * inspector/remote/glib/RemoteConnectionToTargetGlib.cpp: Added. (Inspector::RemoteConnectionToTarget::RemoteConnectionToTarget): (Inspector::RemoteConnectionToTarget::~RemoteConnectionToTarget): (Inspector::RemoteConnectionToTarget::setup): (Inspector::RemoteConnectionToTarget::sendMessageToTarget): (Inspector::RemoteConnectionToTarget::close): (Inspector::RemoteConnectionToTarget::targetClosed): (Inspector::RemoteConnectionToTarget::targetIdentifier): (Inspector::RemoteConnectionToTarget::sendMessageToFrontend): * inspector/remote/glib/RemoteInspectorGlib.cpp: Added. (Inspector::RemoteInspector::singleton): (Inspector::RemoteInspector::RemoteInspector): (Inspector::RemoteInspector::start): (Inspector::RemoteInspector::stopInternal): (Inspector::RemoteInspector::setupConnection): (Inspector::dbusConnectionCallAsyncReadyCallback): (Inspector::RemoteInspector::listingForInspectionTarget): (Inspector::RemoteInspector::listingForAutomationTarget): (Inspector::RemoteInspector::pushListingsNow): (Inspector::RemoteInspector::pushListingsSoon): (Inspector::RemoteInspector::updateAutomaticInspectionCandidate): (Inspector::RemoteInspector::sendAutomaticInspectionCandidateMessage): (Inspector::RemoteInspector::sendMessageToRemote): (Inspector::RemoteInspector::receivedGetTargetListMessage): (Inspector::RemoteInspector::receivedSetupMessage): (Inspector::RemoteInspector::receivedDataMessage): (Inspector::RemoteInspector::receivedCloseMessage): (Inspector::RemoteInspector::setup): (Inspector::RemoteInspector::sendMessageToTarget): (Inspector::RemoteInspector::requestAutomationSession): * inspector/remote/glib/RemoteInspectorServer.cpp: Added. (Inspector::generateConnectionID): (Inspector::RemoteInspectorServer::singleton): (Inspector::RemoteInspectorServer::~RemoteInspectorServer): (Inspector::RemoteInspectorServer::interfaceInfo): (Inspector::RemoteInspectorServer::start): (Inspector::RemoteInspectorServer::newConnectionCallback): (Inspector::RemoteInspectorServer::connectionClosedCallback): (Inspector::RemoteInspectorServer::newConnection): (Inspector::dbusConnectionCallAsyncReadyCallback): (Inspector::RemoteInspectorServer::setTargetList): (Inspector::RemoteInspectorServer::clientConnectionClosedCallback): (Inspector::RemoteInspectorServer::getTargetList): (Inspector::RemoteInspectorServer::setup): (Inspector::RemoteInspectorServer::close): (Inspector::RemoteInspectorServer::clientConnectionClosed): (Inspector::RemoteInspectorServer::connectionClosed): (Inspector::RemoteInspectorServer::sendMessageToBackend): (Inspector::RemoteInspectorServer::sendMessageToFrontend): (Inspector::RemoteInspectorServer::startAutomationSession): * inspector/remote/glib/RemoteInspectorServer.h: Added. (Inspector::RemoteInspectorServer::isRunning): 2017-04-24 Joseph Pecoraro test262: test262/test/language/expressions/generators/yield-as-label.js https://bugs.webkit.org/show_bug.cgi?id=170979 Reviewed by Saam Barati. * parser/Parser.cpp: (JSC::Parser::parseVariableDeclarationList): (JSC::Parser::parseDestructuringPattern): (JSC::Parser::parseFormalParameters): Converge on "Cannot" instead of "Can't" in error messages. (JSC::Parser::parseFunctionInfo): Disallow "yield" as the generator function name in function expressions. This refers to the difference between Declaration and Expression, where only GeneratorExpression explicitly has [+Yield] disallowing yield for the generator name: GeneratorDeclaration[Yield, Await, Default]: function * BindingIdentifier[?Yield, ?Await] ... GeneratorExpression: function * BindingIdentifier[+Yield, ~Await]opt ... (JSC::Parser::parseExpressionOrLabelStatement): Disallow "yield" as a label name in strict mode or inside a generator. (JSC::Parser::parseProperty): Disallow "yield" or any keyword in object literal shorthands. * parser/Parser.h: (JSC::Parser::getToken): (JSC::Parser::isDisallowedIdentifierLet): (JSC::Parser::isDisallowedIdentifierYield): (JSC::Parser::disallowedIdentifierLetReason): (JSC::Parser::disallowedIdentifierYieldReason): Follow pattern for improved error messages based on context. 2017-04-23 Commit Queue Unreviewed, rolling out r215674. https://bugs.webkit.org/show_bug.cgi?id=171212 Possible unintended commit. This patch was on the wrong bug. (Requested by JoePeck on #webkit). Reverted changeset: "test262: test262/test/language/expressions/generators/yield- as-label.js" https://bugs.webkit.org/show_bug.cgi?id=170979 http://trac.webkit.org/changeset/215674 2017-04-23 Joseph Pecoraro test262: test262/test/built-ins/Number/prototype/toPrecision/nan.js https://bugs.webkit.org/show_bug.cgi?id=171197 Reviewed by Saam Barati. * runtime/NumberPrototype.cpp: (JSC::numberProtoFuncToExponential): (JSC::numberProtoFuncToFixed): (JSC::numberProtoFuncToPrecision): Refine the order of operations to match the spec. 2017-04-23 Joseph Pecoraro test262: test262/test/language/expressions/generators/yield-as-label.js https://bugs.webkit.org/show_bug.cgi?id=170979 Reviewed by Saam Barati. * parser/Parser.cpp: (JSC::Parser::parseVariableDeclarationList): (JSC::Parser::parseDestructuringPattern): (JSC::Parser::parseFormalParameters): Converge on "Cannot" instead of "Can't" in error messages. (JSC::Parser::parseFunctionInfo): Disallow "yield" as the generator function name in function expressions. This refers to the difference between Declaration and Expression, where only GeneratorExpression explicitly has [+Yield] disallowing yield for the generator name: GeneratorDeclaration[Yield, Await, Default]: function * BindingIdentifier[?Yield, ?Await] ... GeneratorExpression: function * BindingIdentifier[+Yield, ~Await]opt ... (JSC::Parser::parseExpressionOrLabelStatement): Disallow "yield" as a label name in strict mode or inside a generator. (JSC::Parser::parseProperty): Disallow "yield" or any keyword in object literal shorthands. * parser/Parser.h: (JSC::Parser::getToken): (JSC::Parser::isDisallowedIdentifierLet): (JSC::Parser::isDisallowedIdentifierYield): (JSC::Parser::disallowedIdentifierLetReason): (JSC::Parser::disallowedIdentifierYieldReason): Follow pattern for improved error messages based on context. 2017-04-23 Joseph Pecoraro test262: test262/test/built-ins/Number/parseFloat.js https://bugs.webkit.org/show_bug.cgi?id=171193 Reviewed by Yusuke Suzuki. * runtime/CommonIdentifiers.h: * runtime/JSGlobalObject.cpp: (JSC::JSGlobalObject::init): (JSC::JSGlobalObject::visitChildren): * runtime/JSGlobalObject.h: (JSC::JSGlobalObject::parseFloatFunction): Expose parseFloat on the global object to be shared with Number constructor. * runtime/NumberConstructor.cpp: (JSC::NumberConstructor::finishCreation): parseFloat uses the same value as the global parseFloat. 2017-04-22 Yusuke Suzuki [JSC] Use DoublyLinkedList for MachineThread https://bugs.webkit.org/show_bug.cgi?id=171171 Reviewed by Mark Lam. MachineThread can use WTF::DoublyLinkedList to simplify its implementation. We should not use Vector<> etc. since we do not want to call allocations during suspending and resuming threads. * heap/MachineStackMarker.cpp: (JSC::MachineThreads::MachineThreads): (JSC::MachineThreads::~MachineThreads): (JSC::MachineThreads::addCurrentThread): (JSC::MachineThreads::removeThreadIfFound): (JSC::MachineThreads::MachineThread::MachineThread): (JSC::MachineThreads::tryCopyOtherThreadStacks): * heap/MachineStackMarker.h: (JSC::MachineThreads::threadsListHead): * runtime/SamplingProfiler.cpp: (JSC::FrameWalker::isValidFramePointer): * runtime/VMTraps.cpp: (JSC::findActiveVMAndStackBounds): 2017-04-22 JF Bastien WebAssembly: Module.exports, Module.imports, Module.customSections are wrong https://bugs.webkit.org/show_bug.cgi?id=171078 Reviewed by Saam Barati. They're static properties of Module, not instance properties of a module. https://github.com/WebAssembly/design/blob/master/JS.md#webassemblymoduleexports * wasm/js/WebAssemblyModuleConstructor.cpp: (JSC::webAssemblyModuleCustomSections): (JSC::webAssemblyModuleImports): (JSC::webAssemblyModuleExports): * wasm/js/WebAssemblyModulePrototype.cpp: (JSC::webAssemblyModuleProtoCustomSections): Deleted. (JSC::webAssemblyModuleProtoImports): Deleted. (JSC::webAssemblyModuleProtoExports): Deleted. 2017-04-21 Saam Barati SharedArrayBuffer-opt.js fails with Briggs https://bugs.webkit.org/show_bug.cgi?id=170948 Reviewed by Michael Saboff. The bug was not actually with Briggs, but instead was with our X86-64 MacroAssembler. Michael fixed the bug here: https://trac.webkit.org/changeset/215618/webkit The issue was we weren't adding the REX byte for AtomicXchg8, leading to the incorrect encoding for the result register depending on which register it was. If you look at this code, you'll see the issue: Int32 @38 = AtomicXchg(@59, @64, width = 8, range = 0, fenceRange = 0, ControlDependent|Fence|Writes:0|Reads:0, DFG:@49) AtomicXchg8 %rsi, (%rax,%rdx), @38 0x2dcb5bc0015e: lock xchg %dh, (%rax,%rdx) Int32 @66 = Const32(255, DFG:@49) Int32 @67 = BitAnd(@38, $255(@66), DFG:@49) ZeroExtend8To32 %rsi, %rax, @67 0x2dcb5bc00162: movzx %sil, %eax Air thought the result was in the lower 8 bits of %rsi, however, the code we emitted stored it in the [8-15] bits of %rdx. Since this issue is fixed, I'm turning Briggs back on. * b3/air/AirAllocateRegistersByGraphColoring.h: (JSC::B3::Air::useIRC): 2017-04-20 Mark Lam Refactor MASM probe to allow printing of custom types. https://bugs.webkit.org/show_bug.cgi?id=171101 Reviewed by JF Bastien. For example, this allows us to add MASM printing of CodeBlock* and Air::Args. In general, MASM print can be used like dataLog, except that it generates JITted code for doing the dataLogging later when the JITted code runs. MASM print can print any value type that a specialized Printer template or a setPrinter() function implemented for that type. * CMakeLists.txt: * JavaScriptCore.xcodeproj/project.pbxproj: * assembler/MacroAssembler.h: * assembler/MacroAssemblerPrinter.cpp: (JSC::Printer::printAllRegisters): (JSC::Printer::printPCRegister): (JSC::Printer::printRegisterID): (JSC::Printer::printFPRegisterID): (JSC::Printer::printAddress): (JSC::Printer::printMemory): (JSC::Printer::printCallback): (JSC::printIndent): Deleted. (JSC::printCPU): Deleted. (JSC::printCPURegisters): Deleted. (JSC::printPC): Deleted. (JSC::printRegister): Deleted. (JSC::printMemory): Deleted. (JSC::MacroAssemblerPrinter::printCallback): Deleted. * assembler/MacroAssemblerPrinter.h: (JSC::AllRegisters::AllRegisters): (JSC::Printer::Printer::Printer): (JSC::Printer::Printer::Printer): (JSC::Printer::Printer::Printer): (JSC::Printer::Printer::Printer): (JSC::Printer::Printer::Printer): (JSC::Printer::Printer::Printer): (JSC::Printer::Printer>::Printer): (JSC::MacroAssembler::print): (JSC::MacroAssemblerPrinter::print): Deleted. (JSC::MacroAssemblerPrinter::PrintArg::PrintArg): Deleted. (JSC::MacroAssemblerPrinter::appendPrintArg): Deleted. - Refactored to move the underlying PrintRecord (and associated data structures) out to Printer.cpp/h. - MacroAssemblerPrinter.cpp/h now only add custom Printers for MASM types like RegisterID and Memory. It also defines the implementation of MacroAssembler::print(). As before, JIT code that wishes to use MacroAssembler::print() needs to #include "MacroAssemblerPrinter.h". - Also added the ability to specify an optional indentation (in number of chars) when MASM printing AllRegisters. This is useful because AllRegisters prints a block of data unlike other printers which print inline. * assembler/Printer.cpp: Added. (JSC::Printer::printConstCharString): (JSC::Printer::printIntptr): (JSC::Printer::printUintptr): (JSC::Printer::printPointer): (JSC::Printer::setPrinter): * assembler/Printer.h: Added. (JSC::Printer::Context::Context): (JSC::Printer::PrintRecord::PrintRecord): (JSC::Printer::appendPrinter): (JSC::Printer::makePrintRecordList): (JSC::Printer::Printer::Printer): (JSC::Printer::setPrinter): (JSC::Printer::Printer::Printer): - Data structures for creating a list of PrintRecords. Classes which wish to add custom support for MASM printing can #include "Printer.h" and implement either: 1. a specialized Printer template, or 2. a setPrinter() function. See Printer and Printer in AirPrintSpecial.h for examples of (1). See CodeBlock's setPrinter() for an example of (2). * b3/B3LowerToAir.cpp: (JSC::B3::Air::LowerToAir::print): * b3/air/AirPrintSpecial.cpp: Added. (JSC::B3::Air::PrintSpecial::PrintSpecial): (JSC::B3::Air::PrintSpecial::~PrintSpecial): (JSC::B3::Air::PrintSpecial::forEachArg): (JSC::B3::Air::PrintSpecial::isValid): (JSC::B3::Air::PrintSpecial::admitsStack): (JSC::B3::Air::PrintSpecial::reportUsedRegisters): (JSC::B3::Air::PrintSpecial::generate): (JSC::B3::Air::PrintSpecial::extraEarlyClobberedRegs): (JSC::B3::Air::PrintSpecial::extraClobberedRegs): (JSC::B3::Air::PrintSpecial::dumpImpl): (JSC::B3::Air::PrintSpecial::deepDumpImpl): (JSC::Printer::printAirArg): * b3/air/AirPrintSpecial.h: Added. (JSC::Printer::appendAirArg): (JSC::Printer::appendAirArgs): (JSC::Printer::Printer::Printer): (JSC::Printer::Printer::Printer): - Add the print() operation for use in LowerToAir. print() will emit a PrintSpecial that will ultimately emit a MASM print to print what we want. - LowerToAir's print() adds the ability to print Air::Args. - Unlike in the baseline JIT and the DFG, LowerToAir's print() can perturb the usage of registers. This is because PrintSpecial is a patch point, and it prevents certain optimizations. If not used carefully, an attempt to print() an Arg by taking a Tmp, can force the B3 Value into a Tmp earlier than it would otherwise do so. So, use LowerToAir's print() with care. * bytecode/CodeBlock.cpp: (JSC::setPrinter): - Now we can MASM print CodeBlock*. (WTF::printInternal): - Now we can dataLog CodeBlock* (including null CodeBlock pointers). * bytecode/CodeBlock.h: * runtime/VM.cpp: (JSC::VM::throwException): - Use the new ability to dataLog CodeBlock*. No need to do an explicit null check before printing anymore. 2017-04-21 Keith Miller Unreviewed, rolling out r215634. underlying build issues should have been fixed Reverted changeset: "Unreviewed, rolling out r215620 and r215623." https://bugs.webkit.org/show_bug.cgi?id=171139 http://trac.webkit.org/changeset/215634 2017-04-21 Commit Queue Unreviewed, rolling out r215620 and r215623. https://bugs.webkit.org/show_bug.cgi?id=171139 broke arm64 build (Requested by keith_miller on #webkit). Reverted changesets: "Add signaling API" https://bugs.webkit.org/show_bug.cgi?id=170976 http://trac.webkit.org/changeset/215620 "Unreviewed, fix Cloop build." http://trac.webkit.org/changeset/215623 2017-04-21 Keith Miller Remove LL/SC from Atomics https://bugs.webkit.org/show_bug.cgi?id=171141 Reviewed by Saam Barati. Adding load link and store conditionally was not an actual progression and the existing code is causing problems for users of Atomics. So let's get rid of it. * heap/LargeAllocation.h: (JSC::LargeAllocation::testAndSetMarked): * heap/MarkedBlock.h: (JSC::MarkedBlock::testAndSetMarked): * heap/SlotVisitor.cpp: (JSC::SlotVisitor::setMarkedAndAppendToMarkStack): 2017-04-21 Keith Miller Unreviewed, fix Cloop build. * jit/ExecutableAllocator.h: (JSC::isJITPC): 2017-04-20 Keith Miller Add signaling API https://bugs.webkit.org/show_bug.cgi?id=170976 Reviewed by Filip Pizlo. Update various uses of sigaction to use the new signaling API. Also switch VMTraps to use the thread message system instead of rolling it's own. * jit/ExecutableAllocator.h: (JSC::isJITPC): * runtime/VMTraps.cpp: (JSC::installSignalHandler): (JSC::VMTraps::VMTraps): (JSC::VMTraps::SignalSender::send): (JSC::handleSigusr1): Deleted. (JSC::handleSigtrap): Deleted. (JSC::installSignalHandlers): Deleted. * runtime/VMTraps.h: * tools/SigillCrashAnalyzer.cpp: (JSC::installCrashHandler): (JSC::handleCrash): Deleted. * wasm/WasmFaultSignalHandler.cpp: (JSC::Wasm::trapHandler): (JSC::Wasm::enableFastMemory): 2017-04-21 Michael Saboff X86-64 Assembler doesn't handle xchg with byte register src https://bugs.webkit.org/show_bug.cgi?id=171118 Reviewed by Saam Barati. * assembler/X86Assembler.h: (JSC::X86Assembler::xchgb_rm): Use oneByteOp8() since these are 8 bit opcodes. 2017-04-21 Andy VanWagoner [INTL] Implement Intl.DateTimeFormat.prototype.formatToParts https://bugs.webkit.org/show_bug.cgi?id=169458 Reviewed by JF Bastien. Use udat_formatForFields to iterate through the parts of a formatted date string. Make formatToParts and related functions dependent on ICU version >= 55. * icu/unicode/udat.h: Update to 55.1. * icu/unicode/ufieldpositer.h: Added from 55.1. * icu/unicode/uvernum.h: Update to 55.1 * runtime/IntlDateTimeFormat.cpp: (JSC::IntlDateTimeFormat::partTypeString): Convert UDateFormatField to string. (JSC::IntlDateTimeFormat::formatToParts): Return parts of formatted date string. * runtime/IntlDateTimeFormat.h: * runtime/IntlDateTimeFormatPrototype.cpp: (JSC::IntlDateTimeFormatPrototypeFuncFormatToParts): Add prototype function formatToParts. 2017-04-20 Konstantin Tokarev [cmake] Define FORWARDING_HEADERS_DIR in WebKitFS and use it everywhere https://bugs.webkit.org/show_bug.cgi?id=171071 Reviewed by Michael Catanzaro. "${DERIVED_SOURCES_DIR}/ForwardingHeaders" path occurs very often in the build system files. GTK-specifc FORWARDING_HEADERS_DIR variable should be available for all ports. * CMakeLists.txt: * PlatformWin.cmake: 2017-04-20 Konstantin Tokarev Remove unused lamda captures https://bugs.webkit.org/show_bug.cgi?id=171098 Reviewed by Yusuke Suzuki. * bytecompiler/NodesCodegen.cpp: (JSC::ArrayNode::emitBytecode): * ftl/FTLState.cpp: (JSC::FTL::State::State): * wasm/WasmB3IRGenerator.cpp: 2017-04-20 Yusuke Suzuki [JSC][FTL] FTL should support Arrayify https://bugs.webkit.org/show_bug.cgi?id=169596 Reviewed by Saam Barati. This patch simply expands the coverage of FTL by supporting Arrayify. While ArrayifyToStructure is already supported, Arrayify is not supported in FTL. While supporting Arrayify in FTL itself does not offer so much performance difference from DFG's one, no FTL support for Arrayify prevents us applying FTL to the code including Arrayify. * dfg/DFGArrayMode.cpp: (JSC::DFG::toIndexingShape): * dfg/DFGSpeculativeJIT.cpp: (JSC::DFG::SpeculativeJIT::jumpSlowForUnwantedArrayMode): * ftl/FTLCapabilities.cpp: (JSC::FTL::canCompile): * ftl/FTLLowerDFGToB3.cpp: (JSC::FTL::DFG::LowerDFGToB3::compileNode): (JSC::FTL::DFG::LowerDFGToB3::compileArrayify): (JSC::FTL::DFG::LowerDFGToB3::compileCheckArray): (JSC::FTL::DFG::LowerDFGToB3::isArrayTypeForArrayify): (JSC::FTL::DFG::LowerDFGToB3::isArrayTypeForCheckArray): (JSC::FTL::DFG::LowerDFGToB3::compileArrayifyToStructure): Deleted. (JSC::FTL::DFG::LowerDFGToB3::isArrayType): Deleted. 2017-04-20 Mark Lam virtualThunkFor() needs to materialize its of tagMaskRegister for tail calls. https://bugs.webkit.org/show_bug.cgi?id=171079 Reviewed by Saam Barati. This is needed because tail calls would restore callee saved registers (and therefore, potentially clobber the tag registers) before jumping to the thunk. * jit/ThunkGenerators.cpp: (JSC::virtualThunkFor): 2017-04-20 Mark Lam Build fix after r215592. https://bugs.webkit.org/show_bug.cgi?id=171088 Not reviewed. * assembler/MacroAssemblerPrinter.h: 2017-04-20 Mark Lam Update the MASM probe to only take 1 arg instead of 2 (in addition to the callback function). https://bugs.webkit.org/show_bug.cgi?id=171088 Reviewed by Michael Saboff and Saam Barati. Experience shows that we never use the 2nd arg. So, let's remove it to reduce the footprint at each probe site. Also fix the MacroAssembler::print() function so that it is a no-op when !ENABLE(MASM_PROBE). This will allow us to have print() statements in JIT code without a lot of #if ENABLE(MASM_PROBE)s later. * assembler/AbstractMacroAssembler.h: * assembler/MacroAssembler.cpp: (JSC::stdFunctionCallback): (JSC::MacroAssembler::probe): * assembler/MacroAssembler.h: * assembler/MacroAssemblerARM.cpp: (JSC::MacroAssemblerARM::probe): * assembler/MacroAssemblerARM.h: * assembler/MacroAssemblerARM64.cpp: (JSC::MacroAssemblerARM64::probe): * assembler/MacroAssemblerARM64.h: * assembler/MacroAssemblerARMv7.cpp: (JSC::MacroAssemblerARMv7::probe): * assembler/MacroAssemblerARMv7.h: * assembler/MacroAssemblerPrinter.cpp: (JSC::MacroAssemblerPrinter::printCallback): * assembler/MacroAssemblerPrinter.h: (JSC::MacroAssemblerPrinter::print): (JSC::MacroAssembler::print): * assembler/MacroAssemblerX86Common.cpp: (JSC::MacroAssemblerX86Common::probe): * assembler/MacroAssemblerX86Common.h: 2017-04-20 Matt Baker Web Inspector: Add regular expression support to XHR breakpoints https://bugs.webkit.org/show_bug.cgi?id=170099 Reviewed by Joseph Pecoraro. * inspector/protocol/DOMDebugger.json: New optional `isRegex` parameter denotes whether `url` contains a regular expression. 2017-04-15 Filip Pizlo Optimize SharedArrayBuffer in the DFG+FTL https://bugs.webkit.org/show_bug.cgi?id=164108 Reviewed by Saam Barati. This adds atomics intrinsics to the DFG and wires them through to the DFG and FTL backends. This was super easy in the FTL since B3 already has comprehensive atomic intrinsics, which are more powerful than what we need right now. In the DFG backend, I went with an easy-to-write implementation that just reduces everything to a weak CAS loop. It's very inefficient with registers (it needs ~8) but it's the DFG backend, so it's not obvious how much we care. To make the rare cases easy to handle, I refactored AtomicsObject.cpp so that the operations for the slow paths can share code with the native functions. This also fixes register handling in the X86 implementations of CAS, in the case that expectedAndResult is not %rax. This also fixes the ARM64 implementation of branchWeakCAS. I adapted the CascadeLock from WTF/benchmarks/ToyLocks.h as a microbenchmark of lock performance. This benchmark performs 2.5x faster, in both the contended and uncontended case, thanks to this change. It's still about 3x slower than native. I investigated this only a bit. I suspect that the story will be different in asm.js code, which will get constant-folding of the typed array backing store by virtue of how it uses lexically scoped variables as pointers to the heap arrays. It's worth noting that the native lock I was comparing against, the very nicely-tuned CascadeLock, is at the very high end of lock throughput under virtually all conditions (uncontended, microcontended, held for a long time). I also compared to WTF::Lock and others, and the only ones that performed better in this microbenchmark were spinlocks. I don't recommend using those. So, when I say this is 3x slower than native, I really mean that it's 3x slower than the fastest native lock that I have in my arsenal. Also worth noting is that I experimented with exposing Atomics.yield(), which uses sched_yield, as a way of testing if adding a yield loop to the JS cascadeLock would help. It does not help. I did not investigate why. * assembler/AbstractMacroAssembler.h: (JSC::AbstractMacroAssembler::JumpList::append): * assembler/CPU.h: (JSC::is64Bit): (JSC::is32Bit): * b3/B3Common.h: (JSC::B3::is64Bit): Deleted. (JSC::B3::is32Bit): Deleted. * b3/B3LowerToAir.cpp: (JSC::B3::Air::LowerToAir::appendTrapping): (JSC::B3::Air::LowerToAir::appendCAS): (JSC::B3::Air::LowerToAir::appendGeneralAtomic): * dfg/DFGAbstractInterpreterInlines.h: (JSC::DFG::AbstractInterpreter::executeEffects): * dfg/DFGByteCodeParser.cpp: (JSC::DFG::ByteCodeParser::handleIntrinsicCall): * dfg/DFGClobberize.h: (JSC::DFG::clobberize): * dfg/DFGDoesGC.cpp: (JSC::DFG::doesGC): * dfg/DFGFixupPhase.cpp: (JSC::DFG::FixupPhase::fixupNode): * dfg/DFGNode.h: (JSC::DFG::Node::hasHeapPrediction): (JSC::DFG::Node::hasArrayMode): * dfg/DFGNodeType.h: (JSC::DFG::isAtomicsIntrinsic): (JSC::DFG::numExtraAtomicsArgs): * dfg/DFGPredictionPropagationPhase.cpp: * dfg/DFGSSALoweringPhase.cpp: (JSC::DFG::SSALoweringPhase::handleNode): * dfg/DFGSafeToExecute.h: (JSC::DFG::safeToExecute): * dfg/DFGSpeculativeJIT.cpp: (JSC::DFG::SpeculativeJIT::loadFromIntTypedArray): (JSC::DFG::SpeculativeJIT::setIntTypedArrayLoadResult): (JSC::DFG::SpeculativeJIT::compileGetByValOnIntTypedArray): (JSC::DFG::SpeculativeJIT::getIntTypedArrayStoreOperand): (JSC::DFG::SpeculativeJIT::compilePutByValForIntTypedArray): * dfg/DFGSpeculativeJIT.h: (JSC::DFG::SpeculativeJIT::callOperation): * dfg/DFGSpeculativeJIT32_64.cpp: (JSC::DFG::SpeculativeJIT::compile): * dfg/DFGSpeculativeJIT64.cpp: (JSC::DFG::SpeculativeJIT::compile): * ftl/FTLAbstractHeapRepository.cpp: (JSC::FTL::AbstractHeapRepository::decorateFencedAccess): (JSC::FTL::AbstractHeapRepository::computeRangesAndDecorateInstructions): * ftl/FTLAbstractHeapRepository.h: * ftl/FTLCapabilities.cpp: (JSC::FTL::canCompile): * ftl/FTLLowerDFGToB3.cpp: (JSC::FTL::DFG::LowerDFGToB3::compileNode): (JSC::FTL::DFG::LowerDFGToB3::compileAtomicsReadModifyWrite): (JSC::FTL::DFG::LowerDFGToB3::compileAtomicsIsLockFree): (JSC::FTL::DFG::LowerDFGToB3::compileGetByVal): (JSC::FTL::DFG::LowerDFGToB3::compilePutByVal): (JSC::FTL::DFG::LowerDFGToB3::pointerIntoTypedArray): (JSC::FTL::DFG::LowerDFGToB3::loadFromIntTypedArray): (JSC::FTL::DFG::LowerDFGToB3::storeType): (JSC::FTL::DFG::LowerDFGToB3::setIntTypedArrayLoadResult): (JSC::FTL::DFG::LowerDFGToB3::getIntTypedArrayStoreOperand): (JSC::FTL::DFG::LowerDFGToB3::vmCall): * ftl/FTLOutput.cpp: (JSC::FTL::Output::store): (JSC::FTL::Output::store32As8): (JSC::FTL::Output::store32As16): (JSC::FTL::Output::atomicXchgAdd): (JSC::FTL::Output::atomicXchgAnd): (JSC::FTL::Output::atomicXchgOr): (JSC::FTL::Output::atomicXchgSub): (JSC::FTL::Output::atomicXchgXor): (JSC::FTL::Output::atomicXchg): (JSC::FTL::Output::atomicStrongCAS): * ftl/FTLOutput.h: (JSC::FTL::Output::store32): (JSC::FTL::Output::store64): (JSC::FTL::Output::storePtr): (JSC::FTL::Output::storeFloat): (JSC::FTL::Output::storeDouble): * jit/JITOperations.h: * runtime/AtomicsObject.cpp: (JSC::atomicsFuncAdd): (JSC::atomicsFuncAnd): (JSC::atomicsFuncCompareExchange): (JSC::atomicsFuncExchange): (JSC::atomicsFuncIsLockFree): (JSC::atomicsFuncLoad): (JSC::atomicsFuncOr): (JSC::atomicsFuncStore): (JSC::atomicsFuncSub): (JSC::atomicsFuncWait): (JSC::atomicsFuncWake): (JSC::atomicsFuncXor): (JSC::operationAtomicsAdd): (JSC::operationAtomicsAnd): (JSC::operationAtomicsCompareExchange): (JSC::operationAtomicsExchange): (JSC::operationAtomicsIsLockFree): (JSC::operationAtomicsLoad): (JSC::operationAtomicsOr): (JSC::operationAtomicsStore): (JSC::operationAtomicsSub): (JSC::operationAtomicsXor): * runtime/AtomicsObject.h: 2017-04-19 Youenn Fablet [Mac] Allow customizing H264 encoder https://bugs.webkit.org/show_bug.cgi?id=170829 Reviewed by Alex Christensen. * Configurations/FeatureDefines.xcconfig: 2017-04-19 Michael Saboff Tune GC related JSC options for iOS https://bugs.webkit.org/show_bug.cgi?id=171019 Reviewed by Mark Lam. Always set these GC options on iOS. * runtime/Options.cpp: (JSC::overrideDefaults): 2017-04-19 JF Bastien WebAssembly: fast memory cleanups https://bugs.webkit.org/show_bug.cgi?id=170909 Reviewed by Saam Barati. * b3/B3LowerToAir.cpp: correct comment, and make wasm-independent (JSC::B3::Air::LowerToAir::lower): * b3/B3Procedure.h: * b3/B3Validate.cpp: * b3/B3Value.cpp: (JSC::B3::Value::effects): * b3/B3WasmBoundsCheckValue.cpp: have the creator pass in a maximum, so we don't have to know so much about wasm here (JSC::B3::WasmBoundsCheckValue::WasmBoundsCheckValue): (JSC::B3::WasmBoundsCheckValue::cloneImpl): (JSC::B3::WasmBoundsCheckValue::dumpMeta): * b3/B3WasmBoundsCheckValue.h: (JSC::B3::WasmBoundsCheckValue::boundsType): (JSC::B3::WasmBoundsCheckValue::bounds): * b3/air/AirCode.h: * b3/air/AirCustom.h: (JSC::B3::Air::WasmBoundsCheckCustom::generate): * b3/testb3.cpp: (JSC::B3::testWasmBoundsCheck): * wasm/WasmB3IRGenerator.cpp: (JSC::Wasm::B3IRGenerator::B3IRGenerator): (JSC::Wasm::B3IRGenerator::emitCheckAndPreparePointer): (JSC::Wasm::createJSToWasmWrapper): remove dead code * wasm/WasmMemory.cpp: don't GC if no memory could possibly be free'd (JSC::Wasm::Memory::initializePreallocations): verbose-only code, and copy-pasta bug 2017-04-19 Mark Lam B3StackmapSpecial should handle when stackmap values are not recoverable from a Def'ed arg. https://bugs.webkit.org/show_bug.cgi?id=170973 Reviewed by Filip Pizlo. In the event of an arithmetic overflow on a binary sub instruction (where the result register is same as one of the operand registers), the CheckSub FTL operation will try to recover the original value in the clobbered result register. This recover is done by adding the other operand value to the result register. However, this recovery method only works if the width of the original value in the result register is less or equal to the width of the expected result. If the width of the original operand value (e.g. a JSInt32) is wider than the result (e.g. a machine Int32), then the sub operation would have zero extended the result and cleared the upper 32-bits of the result register. Recovery by adding back the other operand will not restore the JSValue tag in the upper word. This poses a problem if the stackmap value for the operand relies on that same clobbered register. The fix is to detect this potential scenario (i.e. width of the Def's arg < width of a stackmap value). If this condition is detected, we'll declare the stackmap value to be LateColdUse to ensure that the register allocator gives it a different register if needed so that it's not dependent on the clobbered register. * b3/B3CheckSpecial.cpp: (JSC::B3::CheckSpecial::forEachArg): * b3/B3PatchpointSpecial.cpp: (JSC::B3::PatchpointSpecial::forEachArg): * b3/B3StackmapSpecial.cpp: (JSC::B3::StackmapSpecial::forEachArgImpl): * b3/B3StackmapSpecial.h: 2017-04-19 JF Bastien Unreviewed, rolling out r215520. Broke Debian 8 Reverted changeset: "[INTL] Implement Intl.DateTimeFormat.prototype.formatToParts" https://bugs.webkit.org/show_bug.cgi?id=169458 http://trac.webkit.org/changeset/215520 2017-04-19 JF Bastien WebAssembly: limit slow memories https://bugs.webkit.org/show_bug.cgi?id=170825 Reviewed by Saam Barati. We limits the number of fast memories, partly because ASLR. The code then falls back to slow memories. It first tries to virtually allocated any declared maximum (and in there, physically the initial), and if that fails it tries to physically allocate the initial without any extra. This can still be used to cause a bunch of virtual allocation. This patch imposes soft limit on slow memories as well. The total virtual maximum for slow memories is set at the same (theoretical) value as that for fast memories. Anything exceeding that limit causes allocation/grow to fail. * wasm/WasmMemory.cpp: 2017-04-19 JF Bastien Cannot compile JavaScriptCore/runtime/VMTraps.cpp on FreeBSD because std::pair has a non-trivial copy constructor https://bugs.webkit.org/show_bug.cgi?id=170875 Reviewed by Mark Lam. WTF::ExpectedDetail::ConstexprBase doesn't have a user-defined copy constructor, and its implicitly-defined copy constructor is deleted because the default std::pair implementation on FreeBSD has a non-trivial copy constructor. /usr/include/c++/v1/__config says _LIBCPP_TRIVIAL_PAIR_COPY_CTOR is disabled in order to keep ABI compatibility: https://svnweb.freebsd.org/changeset/base/261801. That's a huge bummer, and I'm not a fan of broken stdlibs, but in this case it's pretty nice to have a custom named type anyways and costs nothing. * runtime/VMTraps.cpp: (JSC::findActiveVMAndStackBounds): (JSC::handleSigusr1): (JSC::handleSigtrap): 2017-04-19 Andy VanWagoner [INTL] Implement Intl.DateTimeFormat.prototype.formatToParts https://bugs.webkit.org/show_bug.cgi?id=169458 Reviewed by JF Bastien. Use udat_formatForFields to iterate through the parts of a formatted date string. * icu/unicode/udat.h: Update to 55.1. * icu/unicode/ufieldpositer.h: Added from 55.1. * runtime/IntlDateTimeFormat.cpp: (JSC::IntlDateTimeFormat::partTypeString): Convert UDateFormatField to string. (JSC::IntlDateTimeFormat::formatToParts): Return parts of formatted date string. * runtime/IntlDateTimeFormat.h: * runtime/IntlDateTimeFormatPrototype.cpp: (JSC::IntlDateTimeFormatPrototypeFuncFormatToParts): Add prototype function formatToParts. 2017-04-19 JF Bastien WebAssembly: don't expose any WebAssembly JS object if JIT is off https://bugs.webkit.org/show_bug.cgi?id=170782 Reviewed by Saam Barati. It's unexpected that we expose the global WebAssembly object if no JIT is present because it can't be used to compile or instantiate. Other APIs such as Memory should also be Inaccessible in those circumstances. Also ensure that we don't pre-allocate fast memories if WebAssembly won't be used, and don't mark our intention to use a fast TLS slot for WebAssembly. * runtime/Options.cpp: (JSC::recomputeDependentOptions): 2017-04-19 Yusuke Suzuki r211670 broke double to int conversion. https://bugs.webkit.org/show_bug.cgi?id=170961 Reviewed by Mark Lam. In this patch, we take a template parameter way. While it reduces duplicate code, it effectively produces optimized code for operationToInt32SensibleSlow, and fixes kraken pbkdf2 regression on Linux. And this patch also fixes undefined behavior by changing int32_t to uint32_t. If exp is 31, missingOne is 1 << 31, INT32_MIN. Thus missingOne - 1 will cause int32_t overflow, and it is an undefined behavior. * runtime/MathCommon.cpp: (JSC::operationToInt32SensibleSlow): * runtime/MathCommon.h: (JSC::toInt32Internal): (JSC::toInt32): 2017-04-18 Mark Lam r211670 broke double to int conversion. https://bugs.webkit.org/show_bug.cgi?id=170961 Reviewed by Yusuke Suzuki. This is because operationToInt32SensibleSlow() assumes that left shifts of greater than 31 bits on an 31-bit value will produce a 0. However, the spec says that "if the value of the right operand is negative or is greater or equal to the number of bits in the promoted left operand, the behavior is undefined." See http://en.cppreference.com/w/cpp/language/operator_arithmetic#Bitwise_shift_operators. This patch fixes this by restoring the check to prevent a shift of greater than 31 bits. It also consolidates the optimization in operationToInt32SensibleSlow() back into toInt32() so that we don't have 2 copies of the same code with only a slight variation. JSC benchmarks shows that performance is neutral with this patch. * dfg/DFGSpeculativeJIT.cpp: (JSC::DFG::SpeculativeJIT::compileValueToInt32): * ftl/FTLLowerDFGToB3.cpp: (JSC::FTL::DFG::LowerDFGToB3::sensibleDoubleToInt32): * runtime/MathCommon.cpp: (JSC::operationToInt32SensibleSlow): Deleted. * runtime/MathCommon.h: (JSC::toInt32): 2017-04-18 Oleksandr Skachkov [ES6]. Implement Annex B.3.3 function hoisting rules for eval https://bugs.webkit.org/show_bug.cgi?id=163208 Reviewed by Saam Barati. Current patch implements Annex B.3.3 that is related to hoisting of function declaration in eval. https://tc39.github.io/ecma262/#sec-web-compat-evaldeclarationinstantiation Function declaration in eval should create variable with function name in function scope where eval is invoked or bind to variable if it declared outside of the eval. If variable is created it can be removed by 'delete a;' command. If eval is invoke in block scope that contains let/const variable with the same name as function declaration we do not bind. This patch leads to the following behavior: ''' function foo() { { print(boo); // undefined eval('{ function boo() {}}'); print(boo); // function boo() {} } print(boo); // function boo() {} } function foobar() { { let boo = 10; print(boo); // 10; eval('{ function boo() {}}'); print(boo); // 10; } print(boo) // 10 } function bar() { { var boo = 10; print(boo); // 10 eval('{ function boo() {} }'); print(boo); // function boo() {} } print(boo); // function boo() {} } function bas() { { let boo = 10; eval(' { function boo() {} } '); print(boo); // 10 } print(boo); //Reference Error } ''' Current implementation relies on already implemented 'hoist function in sloppy mode' feature, with small changes. In short it works in following way: during hoisting of function with name S in eval, we are looking for first scope that contains space for variable with name S and if this scope has var type we bind function there To implement this feature was added bytecode ops: op_resolve_scope_for_hoisting_func_decl_in_eval - get variable scope or return undefined if variable can't be binded there. There is a corner case, hoist function in eval within catch block, that is not covered by this patch, and will be fixed in https://bugs.webkit.org/show_bug.cgi?id=168184 * bytecode/BytecodeDumper.cpp: (JSC::BytecodeDumper::dumpBytecode): * bytecode/BytecodeList.json: * bytecode/BytecodeUseDef.h: (JSC::computeUsesForBytecodeOffset): (JSC::computeDefsForBytecodeOffset): * bytecode/CodeBlock.cpp: (JSC::CodeBlock::finalizeLLIntInlineCaches): * bytecode/EvalCodeBlock.h: (JSC::EvalCodeBlock::functionHoistingCandidate): (JSC::EvalCodeBlock::numFunctionHoistingCandidates): * bytecode/UnlinkedEvalCodeBlock.h: * bytecompiler/BytecodeGenerator.cpp: (JSC::BytecodeGenerator::BytecodeGenerator): (JSC::BytecodeGenerator::hoistSloppyModeFunctionIfNecessary): (JSC::BytecodeGenerator::emitResolveScopeForHoistingFuncDeclInEval): * bytecompiler/BytecodeGenerator.h: * dfg/DFGAbstractInterpreterInlines.h: (JSC::DFG::AbstractInterpreter::executeEffects): * dfg/DFGByteCodeParser.cpp: (JSC::DFG::ByteCodeParser::parseBlock): * dfg/DFGCapabilities.cpp: (JSC::DFG::capabilityLevel): * dfg/DFGClobberize.h: (JSC::DFG::clobberize): * dfg/DFGDoesGC.cpp: (JSC::DFG::doesGC): * dfg/DFGFixupPhase.cpp: (JSC::DFG::FixupPhase::fixupNode): * dfg/DFGNode.h: (JSC::DFG::Node::hasIdentifier): * dfg/DFGNodeType.h: * dfg/DFGOperations.cpp: * dfg/DFGOperations.h: * dfg/DFGPredictionPropagationPhase.cpp: * dfg/DFGSafeToExecute.h: (JSC::DFG::safeToExecute): * dfg/DFGSpeculativeJIT.cpp: (JSC::DFG::SpeculativeJIT::compileResolveScopeForHoistingFuncDeclInEval): * dfg/DFGSpeculativeJIT.h: (JSC::DFG::SpeculativeJIT::callOperation): * dfg/DFGSpeculativeJIT32_64.cpp: (JSC::DFG::SpeculativeJIT::compile): * dfg/DFGSpeculativeJIT64.cpp: (JSC::DFG::SpeculativeJIT::compile): * ftl/FTLCapabilities.cpp: (JSC::FTL::canCompile): * ftl/FTLLowerDFGToB3.cpp: (JSC::FTL::DFG::LowerDFGToB3::compileNode): (JSC::FTL::DFG::LowerDFGToB3::compileResolveScopeForHoistingFuncDeclInEval): * interpreter/Interpreter.cpp: (JSC::Interpreter::execute): * jit/JIT.cpp: (JSC::JIT::privateCompileMainPass): * jit/JIT.h: * jit/JITOperations.h: * jit/JITPropertyAccess.cpp: (JSC::JIT::emit_op_resolve_scope_for_hoisting_func_decl_in_eval): * jit/JITPropertyAccess32_64.cpp: (JSC::JIT::emit_op_resolve_scope_for_hoisting_func_decl_in_eval): * llint/LowLevelInterpreter.asm: * parser/Parser.cpp: (JSC::Parser::parseFunctionDeclarationStatement): * parser/Parser.h: (JSC::Scope::getSloppyModeHoistedFunctions): (JSC::Parser::declareFunction): * runtime/CommonSlowPaths.cpp: (JSC::SLOW_PATH_DECL): * runtime/CommonSlowPaths.h: * runtime/EvalExecutable.h: (JSC::EvalExecutable::numFunctionHoistingCandidates): (JSC::EvalExecutable::numTopLevelFunctionDecls): (JSC::EvalExecutable::numberOfFunctionDecls): Deleted. * runtime/JSScope.cpp: (JSC::JSScope::resolve): (JSC::JSScope::resolveScopeForHoistingFuncDeclInEval): * runtime/JSScope.h: 2017-04-18 Saam Barati Follow up to address Mark's comments after r215453 Rubber stamped by Mark Lam. This patch chooses better names for things, adhering to Mark's suggestions in https://bugs.webkit.org/show_bug.cgi?id=139847 * bytecompiler/NodesCodegen.cpp: (JSC::CallFunctionCallDotNode::emitBytecode): (JSC::ApplyFunctionCallDotNode::emitBytecode): * parser/NodeConstructors.h: (JSC::CallFunctionCallDotNode::CallFunctionCallDotNode): (JSC::ApplyFunctionCallDotNode::ApplyFunctionCallDotNode): * parser/Nodes.h: * parser/Parser.cpp: (JSC::recordCallOrApplyDepth): (JSC::Parser::parseMemberExpression): * parser/Parser.h: (JSC::Parser::CallOrApplyDepthScope::CallOrApplyDepthScope): (JSC::Parser::CallOrApplyDepthScope::distanceToInnermostChild): (JSC::Parser::CallOrApplyDepthScope::~CallOrApplyDepthScope): (JSC::Parser::CallOrApplyDepth::CallOrApplyDepth): Deleted. (JSC::Parser::CallOrApplyDepth::maxChildDepth): Deleted. (JSC::Parser::CallOrApplyDepth::~CallOrApplyDepth): Deleted. 2017-04-18 Yusuke Suzuki [DFG] Convert ValueAdd(Int32, String) => MakeRope(ToString(Int32), String) https://bugs.webkit.org/show_bug.cgi?id=170943 Reviewed by Geoffrey Garen. This patch converts ValueAdd(Int32, String) to MakeRope(ToString(Int32), String). This has 2 great features. 1. MakeRope(ToString(Int32), String) is less clobbering. While ValueAdd ends up calling functions, VM knows much about MakeRope(ToString(Int32), String) and VM knows it is less clobbering. It encourages LICM and other operations that is conservatively executed because of ValueAdd's clobbering. 2. Simply, MakeRope(ToString(Int32), String) is faster than ValueAdd. While ValueAdd ends up calling a generic function, our ToString(Int32) calls well-optimized toString operation. And later, MakeRope can fall into the fast path that just takes a string from a free list. It is simply faster than ValueAdd. We ensure that this patch shows performance improvement in attached benchmarks. baseline patched number-to-string-with-add-empty 16.2763+-3.3930 ^ 10.3142+-1.0967 ^ definitely 1.5780x faster number-to-string-with-add-in-loop 168.7621+-10.9738 ^ 15.5307+-3.3179 ^ definitely 10.8664x faster number-to-string-with-add 18.8557+-4.8292 11.6901+-2.5650 might be 1.6130x faster In SixSpeed, baseline patched template_string_tag.es5 200.1027+-20.6871 ^ 25.7925+-11.4052 ^ definitely 7.7582x faster template_string_tag.es6 331.3913+-12.1750 ^ 286.6958+-26.0441 ^ definitely 1.1559x faster for-of-array.es5 412.4344+-23.2517 ^ 272.8707+-47.2118 ^ definitely 1.5115x faster for-of-array.es6 504.0082+-65.5045 ^ 300.3277+-12.8193 ^ definitely 1.6782x faster * dfg/DFGFixupPhase.cpp: (JSC::DFG::FixupPhase::fixupNode): (JSC::DFG::FixupPhase::createToString): * dfg/DFGPredictionPropagationPhase.cpp: 2017-04-18 Michael Saboff REGRESSION(215272): microbenchmark/seal-and-do-work and microbenchmark/freeze-and-do-work are 27x slower https://bugs.webkit.org/show_bug.cgi?id=170881 Reviewed by Saam Barati. * runtime/ObjectConstructor.cpp: (JSC::objectConstructorSeal): (JSC::objectConstructorFreeze): Restored fast paths for final objects that don't have indexed properties. 2017-04-18 Yusuke Suzuki [DFG] Use Phantom for base instead of getter when inlining intrinsic getter https://bugs.webkit.org/show_bug.cgi?id=170947 Reviewed by Saam Barati. getter does not need to be live after OSR Exit. * dfg/DFGByteCodeParser.cpp: (JSC::DFG::ByteCodeParser::handleGetById): 2017-04-18 Yusuke Suzuki Unreviewed, follow-up patch after r215459 https://bugs.webkit.org/show_bug.cgi?id=170940 Reviewed by Filip Pizlo. CheckCell can cause OSRExit. Thus Phantom should be placed after CheckCell. * dfg/DFGByteCodeParser.cpp: (JSC::DFG::ByteCodeParser::emitFunctionChecks): (JSC::DFG::ByteCodeParser::handleGetById): 2017-04-18 Yusuke Suzuki [DFG] Drop unknown use of CheckCell's child2 to work ObjectAllocationSinking for Array iterator object https://bugs.webkit.org/show_bug.cgi?id=170940 Reviewed by Filip Pizlo. The second argument of CheckCell is not used in meaningful way. It is just *use* the node. The problem is that it effectively *use* the child2 in ObjectAllocationSinking phase, and prevent us from eliminating object allocations. Actually, it materializes Array iterator when inlining `next()`. Instead, we should use Phantom in such a case. It improves destructuring.es6 in SixSpeed 2.5x. destructuring.es6 308.5184+-25.3490 ^ 119.5680+-15.0520 ^ definitely 2.5803x faster Note that SixSpeed tested in arewefastyet executes all the tests in one process while our SixSpeed tests each one in isolated way. * dfg/DFGByteCodeParser.cpp: (JSC::DFG::ByteCodeParser::emitFunctionChecks): (JSC::DFG::ByteCodeParser::handleGetById): 2017-04-18 Yusuke Suzuki [JSC][GTK] glib RunLoop does not accept negative start interval https://bugs.webkit.org/show_bug.cgi?id=170775 Reviewed by Saam Barati. * heap/GCActivityCallback.cpp: (JSC::GCActivityCallback::scheduleTimer): 2017-04-17 Saam Barati BytecodeGenerator ".call" and ".apply" is exponential in nesting depth https://bugs.webkit.org/show_bug.cgi?id=139847 Reviewed by Oliver Hunt. The BytecodeGenerator's .apply(...) and .call(...) code would emit bytecode for the evaluation of its arguments twice. This is exponential, specifically, 2^n, where n is the nesting depth of .call(...) or .apply(...) inside other .call(...) or .apply(...). The reason we emit code for the arguments twice is that we try to emit efficient code for when .call or .apply is Function.prototype.call or Function.prototype.apply. Because of this, we compare .call/.apply to Function.prototype.call/.apply, and if they're the same, we emit a specialized function call in bytecode. Otherwise, we emit the generalized version. This patch makes it so that each .call(...) and .apply(...) records its max inner nesting depth. Then, we only perform the optimization for the bottom k (where k = 6) layers of the nesting tree. The reason we apply the optimization to the bottom k layers instead of top k layers is that we'll produce less code this way. * bytecompiler/NodesCodegen.cpp: (JSC::CallFunctionCallDotNode::emitBytecode): (JSC::ApplyFunctionCallDotNode::emitBytecode): * parser/ASTBuilder.h: (JSC::ASTBuilder::makeFunctionCallNode): * parser/NodeConstructors.h: (JSC::CallFunctionCallDotNode::CallFunctionCallDotNode): (JSC::ApplyFunctionCallDotNode::ApplyFunctionCallDotNode): * parser/Nodes.h: * parser/Parser.cpp: (JSC::recordCallOrApplyDepth): (JSC::Parser::parseMemberExpression): * parser/Parser.h: (JSC::Parser::CallOrApplyDepth::CallOrApplyDepth): (JSC::Parser::CallOrApplyDepth::maxChildDepth): (JSC::Parser::CallOrApplyDepth::~CallOrApplyDepth): * parser/SyntaxChecker.h: (JSC::SyntaxChecker::makeFunctionCallNode): 2017-04-17 Mark Lam JSArray::appendMemcpy() needs to handle copying from Undecided indexing type too. https://bugs.webkit.org/show_bug.cgi?id=170896 Reviewed by JF Bastien and Keith Miller. * runtime/JSArray.cpp: (JSC::JSArray::appendMemcpy): 2017-04-17 Joseph Pecoraro Web Inspector: Doesn't show size of compressed content correctly https://bugs.webkit.org/show_bug.cgi?id=155112 Reviewed by Alex Christensen and Timothy Hatcher. * inspector/protocol/Network.json: New, exact size metrics, available after the load completes. 2017-04-17 Youenn Fablet Disable outdated WritableStream API https://bugs.webkit.org/show_bug.cgi?id=170749 Reviewed by Alex Christensen. * Configurations/FeatureDefines.xcconfig: 2017-04-17 Yusuke Suzuki [JSCOnly] Fix build failures in macOS https://bugs.webkit.org/show_bug.cgi?id=170887 Reviewed by Alex Christensen. Align ICU header configuration to MacCMake port. * PlatformJSCOnly.cmake: 2017-04-17 JF Bastien B3: don't allow unsigned offsets in Value https://bugs.webkit.org/show_bug.cgi?id=170692 Reviewed by Filip Pizlo. MemoryValue and similar B3 opcode classes always expects a signed offset. Giving it an out-of-bounds unsigned offset causes implementation-defined behavior, which can cause badness as I just fixed in WebAssembly. This patch makes it impossible to create a Value opcodes with an unsigned value, or with an overly-large value. * b3/B3AtomicValue.cpp: (JSC::B3::AtomicValue::AtomicValue): * b3/B3AtomicValue.h: * b3/B3Common.h: (JSC::B3::isRepresentableAs): * b3/B3EliminateCommonSubexpressions.cpp: * b3/B3LowerToAir.cpp: (JSC::B3::Air::LowerToAir::scaleForShl): (JSC::B3::Air::LowerToAir::effectiveAddr): (JSC::B3::Air::LowerToAir::addr): (JSC::B3::Air::LowerToAir::tryAppendLea): * b3/B3MemoryValue.cpp: (JSC::B3::MemoryValue::isLegalOffsetImpl): (JSC::B3::MemoryValue::MemoryValue): * b3/B3MemoryValue.h: * b3/B3MemoryValueInlines.h: (JSC::B3::MemoryValue::isLegalOffsetImpl): * b3/B3MoveConstants.cpp: * b3/B3ReduceStrength.cpp: * b3/B3StackmapSpecial.cpp: (JSC::B3::StackmapSpecial::repForArg): * b3/B3Value.h: * b3/air/AirArg.cpp: (JSC::B3::Air::Arg::stackAddrImpl): * b3/air/AirArg.h: (JSC::B3::Air::Arg::addr): (JSC::B3::Air::Arg::stack): (JSC::B3::Air::Arg::callArg): (JSC::B3::Air::Arg::stackAddr): (JSC::B3::Air::Arg::index): (JSC::B3::Air::Arg::offset): (JSC::B3::Air::Arg::isValidAddrForm): (JSC::B3::Air::Arg::isValidIndexForm): (JSC::B3::Air::Arg::asTrustedImm32): (JSC::B3::Air::Arg::asAddress): (JSC::B3::Air::Arg::asBaseIndex): * b3/air/AirLowerStackArgs.cpp: (JSC::B3::Air::lowerStackArgs): * b3/testb3.cpp: (JSC::B3::testMulArgStore): (JSC::B3::testStore32): (JSC::B3::testStoreConstant): (JSC::B3::testStoreConstantPtr): (JSC::B3::testStoreAddLoad32): (JSC::B3::testStoreAddLoadImm32): (JSC::B3::testStoreAddLoad8): (JSC::B3::testStoreAddLoadImm8): (JSC::B3::testStoreAddLoad16): (JSC::B3::testStoreAddLoadImm16): (JSC::B3::testStoreAddLoad64): (JSC::B3::testStoreAddLoadImm64): (JSC::B3::testStoreAddLoad32Index): (JSC::B3::testStoreAddLoadImm32Index): (JSC::B3::testStoreAddLoad64Index): (JSC::B3::testStoreAddLoadImm64Index): (JSC::B3::testStoreSubLoad): (JSC::B3::testStoreAddLoadInterference): (JSC::B3::testStoreAddAndLoad): (JSC::B3::testStoreNegLoad32): (JSC::B3::testStoreNegLoadPtr): (JSC::B3::testLoadOffset): (JSC::B3::testLoadOffsetNotConstant): (JSC::B3::testLoadOffsetUsingAdd): (JSC::B3::testLoadOffsetUsingAddInterference): (JSC::B3::testLoadOffsetUsingAddNotConstant): (JSC::B3::testStoreLoadStackSlot): (JSC::B3::testLoad): (JSC::B3::testInterpreter): (JSC::B3::testTrappingStore): (JSC::B3::testTrappingLoadAddStore): (JSC::B3::testWasmAddress): * wasm/WasmB3IRGenerator.cpp: (JSC::Wasm::B3IRGenerator::fixupPointerPlusOffset): (JSC::Wasm::B3IRGenerator::emitCheckAndPreparePointer): (JSC::Wasm::B3IRGenerator::emitLoadOp): (JSC::Wasm::B3IRGenerator::emitStoreOp): 2017-04-16 Joseph Pecoraro test262: test262/test/built-ins/Object/prototype/toLocaleString/primitive_this_value.js https://bugs.webkit.org/show_bug.cgi?id=170882 Reviewed by Saam Barati. * runtime/ObjectPrototype.cpp: (JSC::objectProtoFuncToLocaleString): We should be using the this value without ToObject conversion both when getting the potential accessor and calling it. In strict mode, the this value will remain its simple value, in non-strict it is still converted. 2017-04-16 Joseph Pecoraro test262: test262/test/built-ins/isNaN/toprimitive-not-callable-throws.js https://bugs.webkit.org/show_bug.cgi?id=170888 Reviewed by Saam Barati. * runtime/ExceptionHelpers.h: * runtime/ExceptionHelpers.cpp: (JSC::createInvalidInstanceofParameterErrorHasInstanceValueNotFunction): Fix up this function name. * runtime/JSObject.cpp: (JSC::callToPrimitiveFunction): When called with @@isPrimitive, bail on undefined or null and throw a type error if the value is not callable. (JSC::JSObject::toPrimitive): Use throw scope to check for exception. 2017-04-16 Joseph Pecoraro test262: test262/test/language/expressions/tagged-template/template-object.js https://bugs.webkit.org/show_bug.cgi?id=170878 Reviewed by Saam Barati. * runtime/JSArray.cpp: (JSC::JSArray::put): The fast path for setting an Array's length should check if length is writable before checking for and possibly throwing a RangeError. 2017-04-16 Joseph Pecoraro test262: test262/test/built-ins/Object/getOwnPropertyNames/15.2.3.4-4-44.js https://bugs.webkit.org/show_bug.cgi?id=170879 Reviewed by Saam Barati. * runtime/StringObject.h: * runtime/StringObject.cpp: (JSC::StringObject::getOwnPropertyNames): (JSC::StringObject::getOwnNonIndexPropertyNames): Ensure 'length' comes after all indexed properties by moving it out to the getOwnNonIndexPropertyNames method which is called inside of getOwnPropertyNames after JSObject handles indices. 2017-04-16 Joseph Pecoraro test262: test262/test/built-ins/Date/prototype/Symbol.toPrimitive/name.js https://bugs.webkit.org/show_bug.cgi?id=170884 Reviewed by Yusuke Suzuki. * runtime/DatePrototype.cpp: (JSC::DatePrototype::finishCreation): * runtime/FunctionPrototype.cpp: (JSC::FunctionPrototype::addFunctionProperties): * runtime/RegExpPrototype.cpp: (JSC::RegExpPrototype::finishCreation): * runtime/SymbolPrototype.cpp: (JSC::SymbolPrototype::finishCreation): Give symbol property functions proper function names. This addresses function.name but not function.toString(). 2017-04-15 Joseph Pecoraro test262: test262/test/language/global-code/new.target-arrow.js https://bugs.webkit.org/show_bug.cgi?id=170872 Reviewed by Saam Barati. * parser/Parser.cpp: (JSC::Parser::Parser): Mark the global code scope. (JSC::Parser::parseMemberExpression): If new.target is detected in an arrow function defined in global scope throw a SyntaxError. * parser/Parser.h: (JSC::Scope::Scope): (JSC::Scope::setIsGlobalCodeScope): (JSC::Scope::isGlobalCodeScope): Marker for a global code scope. * parser/ParserModes.h: (JSC::isModuleParseMode): (JSC::isProgramParseMode): (JSC::isProgramOrModuleParseMode): Helper for detecting global code based on parse mode. 2017-04-14 Nikita Vasilyev Web Inspector: WebSockets: messages with non-latin letters are displayed incorrectly https://bugs.webkit.org/show_bug.cgi?id=170760 Reviewed by Joseph Pecoraro. Add payloadLength property, which is used to display size. When payloadLength is unavailable, it is calculated from payloadData by Web Inspector frontend. This fixes Web Inspector: WebSockets: Transferred size is incorrect. * inspector/protocol/Network.json: 2017-04-14 Saam Barati ParseInt intrinsic in DFG backend doesn't properly flush its operands https://bugs.webkit.org/show_bug.cgi?id=170865 Reviewed by Mark Lam and Geoffrey Garen. The DFG backend code needed to first call .gpr()/.jsValueRegs() before calling flushRegisters(), or the input JSValueOperand would not be flushed. * dfg/DFGSpeculativeJIT.cpp: (JSC::DFG::SpeculativeJIT::compileParseInt): 2017-04-14 Mark Lam Update architectures in xcconfig files. https://bugs.webkit.org/show_bug.cgi?id=170867 Reviewed by Joseph Pecoraro. * Configurations/Base.xcconfig: * Configurations/FeatureDefines.xcconfig: * Configurations/JavaScriptCore.xcconfig: * Configurations/ToolExecutable.xcconfig: 2017-04-14 Keith Miller WebAssembly: B3IRGenerator should use phis for result types https://bugs.webkit.org/show_bug.cgi?id=170863 Reviewed by Filip Pizlo. Currently, we use variables for the result types of control flow in Wasm. We did this originally since we weren't sure that the phis we generated would be optimal. Since then, we have verified that the edges in wasm control flow ensure that each upsilon will dominate its phi so we don't need to use variables. * wasm/WasmB3IRGenerator.cpp: (JSC::Wasm::B3IRGenerator::ControlData::ControlData): (JSC::Wasm::B3IRGenerator::addTopLevel): (JSC::Wasm::B3IRGenerator::addBlock): (JSC::Wasm::B3IRGenerator::addLoop): (JSC::Wasm::B3IRGenerator::unify): 2017-04-14 Alex Christensen Fix Windows build after r215368. https://bugs.webkit.org/show_bug.cgi?id=170641 * CMakeLists.txt: Add new directory containing files needed in WebCore. 2017-04-14 Caitlin Potter [JSC] use ExpressionErrorClassifier for AwaitExpression operand https://bugs.webkit.org/show_bug.cgi?id=170844 Reviewed by Saam Barati. In parseAssignmentExpression(), several cover grammars are handled, and use ExpressionErrorClassifier to record hints about which grammars to try. In parseAwaitExpression(), the hints recorded during parsing of the operand need to be discarded, because if they propagate to the outer parseAssignmentExpression(), the hints will lead the parser down invalid branches that should be skipped. This change adds an additional ExpressionErrorClassifier to parseAwaitExpression(), in order to discard hints recorded trying to parse the operand. * parser/Parser.cpp: (JSC::Parser::parseAwaitExpression): 2017-04-14 Saam Barati WebAssembly: There is a short window of time where a CodeBlock could be destroyed before all of its async compilation callbacks are called https://bugs.webkit.org/show_bug.cgi?id=170641 Reviewed by Keith Miller. There is an unlikely race when a CodeBlock compilation fails, the module compiles a new CodeBlock for that memory mode, all while the CodeBlock is notifying its callbacks that it has finished. There is a chance that the Module could deref its failed CodeBlock at that point, destroying it, before the callbacks were able to grab a Ref to the CodeBlock. This patch fixes the race by having the callbacks ref the CodeBlock. This patch also has the Plan clear out all of its callbacks once it gets completed. This adds an extra defense to anybody that grabs refs to the Plan in the callback. * wasm/WasmCodeBlock.cpp: (JSC::Wasm::CodeBlock::CodeBlock): (JSC::Wasm::CodeBlock::compileAsync): * wasm/WasmPlan.cpp: (JSC::Wasm::Plan::complete): 2017-04-13 Filip Pizlo Air::RegLiveness should be constraint-based https://bugs.webkit.org/show_bug.cgi?id=170817 Reviewed by Saam Barati. Previously, I changed the Air liveness analyses based on Air::Liveness<> to be constraint-based and this was a significant speed-up. Now I'm adding the same functionality to RegLiveness. This is a 1% speed-up on wasm B3 -O1 compile times. * b3/air/AirAllocateRegistersAndStackByLinearScan.cpp: * b3/air/AirLivenessAdapter.h: (JSC::B3::Air::LivenessAdapter::LivenessAdapter): (JSC::B3::Air::LivenessAdapter::prepareToCompute): (JSC::B3::Air::LivenessAdapter::actionsAt): * b3/air/AirRegLiveness.cpp: (JSC::B3::Air::RegLiveness::RegLiveness): (JSC::B3::Air::RegLiveness::LocalCalcForUnifiedTmpLiveness::LocalCalcForUnifiedTmpLiveness): (JSC::B3::Air::RegLiveness::LocalCalcForUnifiedTmpLiveness::execute): (JSC::B3::Air::RegLiveness::LocalCalc::execute): Deleted. * b3/air/AirRegLiveness.h: (JSC::B3::Air::RegLiveness::Actions::Actions): (JSC::B3::Air::RegLiveness::LocalCalcBase::LocalCalcBase): (JSC::B3::Air::RegLiveness::LocalCalcBase::live): (JSC::B3::Air::RegLiveness::LocalCalcBase::isLive): (JSC::B3::Air::RegLiveness::LocalCalc::LocalCalc): (JSC::B3::Air::RegLiveness::LocalCalc::execute): (JSC::B3::Air::RegLiveness::LocalCalc::live): Deleted. (JSC::B3::Air::RegLiveness::LocalCalc::isLive): Deleted. 2017-04-13 JF Bastien WebAssembly: fix windows build https://bugs.webkit.org/show_bug.cgi?id=170832 Reviewed by Mark Lam. My previous patch re-declared isIOS which AssemblerCommon.h already provided, and which was already included by Options.cpp. * runtime/Options.cpp: 2017-04-13 Saam Barati WebAssembly: We should be able to postMessage a JSWebAssemblyModule https://bugs.webkit.org/show_bug.cgi?id=170573 Reviewed by Filip Pizlo. This patch adds a callback to JSRunLoopTimer to notify clients that a timer has been set. This is used inside WorkerRunLoop in WebCore so that its RunLoop can perform an iteration when it sees that a timer got set. * JavaScriptCore.xcodeproj/project.pbxproj: * runtime/JSRunLoopTimer.cpp: (JSC::JSRunLoopTimer::scheduleTimer): (JSC::JSRunLoopTimer::addTimerSetNotification): (JSC::JSRunLoopTimer::removeTimerSetNotification): * runtime/JSRunLoopTimer.h: * wasm/WasmCodeBlock.cpp: (JSC::Wasm::CodeBlock::~CodeBlock): * wasm/WasmCodeBlock.h: * wasm/WasmModule.cpp: (JSC::Wasm::Module::~Module): (JSC::Wasm::Module::signatureIndexFromFunctionIndexSpace): (JSC::Wasm::makeValidationCallback): (JSC::Wasm::Module::validateSync): (JSC::Wasm::Module::validateAsync): (JSC::Wasm::Module::validateSyncImpl): Deleted. (JSC::Wasm::Module::makeValidationCallback): Deleted. * wasm/WasmModule.h: (JSC::Wasm::Module::validateSync): Deleted. (JSC::Wasm::Module::validateAsync): Deleted. (JSC::Wasm::Module::signatureIndexFromFunctionIndexSpace): Deleted. (JSC::Wasm::Module::nonNullCodeBlock): Deleted. * wasm/js/JSWebAssemblyCodeBlock.cpp: (JSC::JSWebAssemblyCodeBlock::create): * wasm/js/JSWebAssemblyCodeBlock.h: (JSC::JSWebAssemblyCodeBlock::create): Deleted. * wasm/js/JSWebAssemblyModule.cpp: (JSC::JSWebAssemblyModule::source): * wasm/js/JSWebAssemblyModule.h: (JSC::JSWebAssemblyModule::source): Deleted. * wasm/js/WebAssemblyFunction.cpp: (JSC::callWebAssemblyFunction): * wasm/js/WebAssemblyModulePrototype.cpp: 2017-04-13 Mark Lam Should use flushDirect() when flushing the scopeRegister due to needsScopeRegister(). https://bugs.webkit.org/show_bug.cgi?id=170661 Reviewed by Filip Pizlo. Previously, we were using flush() to flush the outermost frame's scopeRegister. This is incorrect because flush() expects the VirtualRegister value passed to it to be that of the top most inlined frame. In the event that we reach a terminal condition while inside an inlined frame, flush() will end up flushing the wrong register. The fix is simply to use flushDirect() instead. * dfg/DFGByteCodeParser.cpp: (JSC::DFG::ByteCodeParser::flush): 2017-04-13 Andy VanWagoner Change Intl prototypes to plain objects https://bugs.webkit.org/show_bug.cgi?id=168178 Reviewed by JF Bastien. * builtins/StringPrototype.js: (localeCompare): Create default Collator once instead of using prototype. * runtime/IntlCollatorPrototype.cpp: (JSC::IntlCollatorPrototype::IntlCollatorPrototype): * runtime/IntlCollatorPrototype.h: * runtime/IntlDateTimeFormatPrototype.cpp: (JSC::IntlDateTimeFormatPrototype::IntlDateTimeFormatPrototype): * runtime/IntlDateTimeFormatPrototype.h: * runtime/IntlNumberFormatPrototype.cpp: (JSC::IntlNumberFormatPrototype::IntlNumberFormatPrototype): * runtime/IntlNumberFormatPrototype.h: * runtime/IntlObject.cpp: (JSC::IntlObject::finishCreation): Don't set constructor on each prototype. 2017-04-13 Oliver Hunt allocationSize should use safe arithmetic by default https://bugs.webkit.org/show_bug.cgi?id=170804 Reviewed by JF Bastien. Make all allocationSize() functions work in terms of Checked * runtime/DirectArguments.h: (JSC::DirectArguments::offsetOfSlot): (JSC::DirectArguments::allocationSize): * runtime/HashMapImpl.h: (JSC::HashMapBuffer::allocationSize): * runtime/JSArray.h: (JSC::JSArray::allocationSize): * runtime/JSArrayBufferView.h: (JSC::JSArrayBufferView::allocationSize): * runtime/JSAsyncFunction.h: (JSC::JSAsyncFunction::allocationSize): * runtime/JSFixedArray.h: (JSC::JSFixedArray::allocationSize): * runtime/JSFunction.h: (JSC::JSFunction::allocationSize): * runtime/JSGeneratorFunction.h: (JSC::JSGeneratorFunction::allocationSize): * runtime/JSModuleNamespaceObject.h: * runtime/JSObject.h: (JSC::JSFinalObject::allocationSize): * runtime/JSWrapperObject.h: (JSC::JSWrapperObject::allocationSize): * runtime/ScopedArguments.h: (JSC::ScopedArguments::allocationSize): * runtime/VM.h: (JSC::ScratchBuffer::allocationSize): * wasm/js/JSWebAssemblyCodeBlock.h: (JSC::JSWebAssemblyCodeBlock::offsetOfImportStubs): (JSC::JSWebAssemblyCodeBlock::allocationSize): * wasm/js/JSWebAssemblyInstance.h: (JSC::JSWebAssemblyInstance::allocationSize): 2017-04-13 JF Bastien WebAssembly: manage memory better https://bugs.webkit.org/show_bug.cgi?id=170628 Reviewed by Keith Miller, Michael Saboff. WebAssembly fast memories weren't managed very well. This patch refactors it and puts us in a good position to further improve our fast memory handling in the future. We now cache fast memories at a process granularity, but make sure that they don't consume dirty pages. We add a cap to the total number of allocated fast memories to avoid ASLR degradation. We teach the GC about memories as a kind of resource it should care about because it didn't have visibility into the amount of memory each represented. This allows benchmarks which allocate memories back-to-back to reliably get fast memories 100% of the time, even on a system under load, which wasn't the case before. This reliability yields roughly 8% perf bump on x86-64 WasmBench. The GC heuristic is as follows: each time we allocate a fast memory we notify the GC, which then keeps track of the total number of fast memories allocated since it last GC'd. We separately keep track of the total number of fast memories which have ever existed at any point in time (cached + allocated). This is a monotonically-increasing high watermark. The GC will force a full collection if, since it last ran, half or more of the high watermark of fast memories was allocated. At the same time, if we fail obtaining a fast memory from the cache we do a GC to try to find one. If that fails we'll allocate a new one (this can also fail, then we go to slow memory). This can also be improved, but it's a good start. This currently disables fast memories on iOS because getting fast memories isn't a guaranteed thing. Rather, we get quite a few of them and achieve significant speedups, but benchmarks which allocate memories back-to-back end up falling behind because the GC can conservatively hold onto memories, which then yields a perf cliff. That cliff isn't reliable, WasmBench gets roughly 10 of 18 fast memories when in theory it should get all of them fast (as MacOS does). The patch significantly improves the state of iOS though, and in a follow-up we could re-enable fast memories. Part of this good positioning is a facility to pre-allocate fast memories very early at startup, before any fragmentation occurs. This is currently disabled but worked extremely reliably on iOS. Once we fix the above issues we'll want to re-visit and turn on pre-allocation. We also avoid locking for fast memory identification when performing signal handling. I'm very nervous about acquiring locks in a signal handler because in general signals can happen when we've messed up. This isn't the case with fast memories: we're raising a signal on purpose and handling it. However this doesn't mean we won't mess up elsewhere! This will get more complicated once we add support for multiple threads sharing memories and being able to grow their memories. One example: the code calls CRASH(), which executes the following code in release: *(int *)(uintptr_t)0xbbadbeef = 0; This is a segfault, which our fast memory signal handler tries to handle. It does so by first figuring out whether 0xbbadbeef is in a fast memory region, reqiring a lock. If we CRASH() while holding the lock then our thread self-deadlocks, giving us no crash report and a bad user experience. Avoiding a lock therefore it's not about speed or reduced contention. In fact, I'd use something else than a FIFO if these were a concern. We're also doing syscalls, which dwarf any locking cost. We now only allocate 4GiB + redzone of 64k * 128 for fast memories instead of 8GiB. This patch reuses the logic from B3::WasmBoundsCheck to perform bounds checks when accesses could exceed the redzone. We'll therefore benefit from CSE goodness when it reaches WasmBoundsCheck. See bug #163469. * b3/B3LowerToAir.cpp: fix a baaaaddd bug where unsigned->signed conversion allowed out-of-bounds reads by -2GiB. I'll follow-up in bug #170692 to prevent this type of bug once and for all. (JSC::B3::Air::LowerToAir::lower): * b3/B3Validate.cpp: update WasmBoundsCheck validation. * b3/B3Value.cpp: (JSC::B3::Value::effects): update WasmBoundsCheck effects. * b3/B3WasmBoundsCheckValue.cpp: (JSC::B3::WasmBoundsCheckValue::WasmBoundsCheckValue): (JSC::B3::WasmBoundsCheckValue::redzoneLimit): (JSC::B3::WasmBoundsCheckValue::dumpMeta): * b3/B3WasmBoundsCheckValue.h: (JSC::B3::WasmBoundsCheckValue::maximum): * b3/air/AirCustom.cpp: (JSC::B3::Air::WasmBoundsCheckCustom::isValidForm): * b3/testb3.cpp: (JSC::B3::testWasmBoundsCheck): * heap/Heap.cpp: (JSC::Heap::Heap): (JSC::Heap::reportWebAssemblyFastMemoriesAllocated): (JSC::Heap::webAssemblyFastMemoriesThisCycleAtThreshold): (JSC::Heap::updateAllocationLimits): (JSC::Heap::didAllocateWebAssemblyFastMemories): (JSC::Heap::shouldDoFullCollection): (JSC::Heap::collectIfNecessaryOrDefer): * heap/Heap.h: * runtime/InitializeThreading.cpp: (JSC::initializeThreading): * runtime/Options.cpp: * runtime/Options.h: * wasm/WasmB3IRGenerator.cpp: (JSC::Wasm::B3IRGenerator::fixupPointerPlusOffset): (JSC::Wasm::B3IRGenerator::B3IRGenerator): (JSC::Wasm::B3IRGenerator::emitCheckAndPreparePointer): (JSC::Wasm::B3IRGenerator::emitLoadOp): (JSC::Wasm::B3IRGenerator::emitStoreOp): (JSC::Wasm::createJSToWasmWrapper): * wasm/WasmFaultSignalHandler.cpp: (JSC::Wasm::trapHandler): * wasm/WasmMemory.cpp: Rewrite. (JSC::Wasm::makeString): (JSC::Wasm::Memory::initializePreallocations): (JSC::Wasm::Memory::createImpl): (JSC::Wasm::Memory::create): (JSC::Wasm::Memory::~Memory): (JSC::Wasm::Memory::fastMappedRedzoneBytes): (JSC::Wasm::Memory::fastMappedBytes): (JSC::Wasm::Memory::maxFastMemoryCount): (JSC::Wasm::Memory::addressIsInActiveFastMemory): (JSC::Wasm::Memory::grow): * wasm/WasmMemory.h: (Memory::maxFastMemoryCount): (Memory::addressIsInActiveFastMemory): * wasm/js/JSWebAssemblyInstance.cpp: (JSC::JSWebAssemblyInstance::finishCreation): (JSC::JSWebAssemblyInstance::visitChildren): (JSC::JSWebAssemblyInstance::globalMemoryByteSize): * wasm/js/JSWebAssemblyInstance.h: * wasm/js/JSWebAssemblyMemory.cpp: (JSC::JSWebAssemblyMemory::grow): (JSC::JSWebAssemblyMemory::finishCreation): (JSC::JSWebAssemblyMemory::visitChildren): 2017-04-13 Yusuke Suzuki [JSC] Use proper ifdef guard for code using MachineContext https://bugs.webkit.org/show_bug.cgi?id=170800 Reviewed by Carlos Alberto Lopez Perez. This patch drops MachineContext use if it is not available. This situation can be considered like, building WebKit with musl. In that case, we simply disable features that rely on MachineContext. Examples are wasm fast memory, sampling profiler, and code profiling. * runtime/Options.cpp: (JSC::overrideDefaults): * tools/CodeProfiling.cpp: (JSC::CodeProfiling::begin): (JSC::CodeProfiling::end): Previously, PLATFORM(GTK) is excluded. But it is not obvious why it is excluded. This patch just includes such platforms. * wasm/WasmFaultSignalHandler.cpp: (JSC::Wasm::enableFastMemory): 2017-04-12 Dan Bernstein [Mac] Future-proof .xcconfig files https://bugs.webkit.org/show_bug.cgi?id=170802 Reviewed by Tim Horton. * Configurations/Base.xcconfig: * Configurations/DebugRelease.xcconfig: * Configurations/FeatureDefines.xcconfig: * Configurations/Version.xcconfig: 2017-04-12 Joseph Pecoraro test262: test262/test/built-ins/NativeErrors/EvalError/proto.js https://bugs.webkit.org/show_bug.cgi?id=170668 Reviewed by Keith Miller. * runtime/JSGlobalObject.cpp: (JSC::JSGlobalObject::init): The [[Prototype]] of NativeError Constructor's should be the %Error%. https://tc39.github.io/ecma262/#sec-properties-of-the-nativeerror-constructors 2017-04-12 Joseph Pecoraro test262: test262/test/language/literals/regexp/u-dec-esc.js https://bugs.webkit.org/show_bug.cgi?id=170687 Reviewed by Michael Saboff. * yarr/YarrParser.h: (JSC::Yarr::Parser::parseEscape): * yarr/YarrPattern.cpp: (JSC::Yarr::YarrPattern::errorMessage): (JSC::Yarr::YarrPattern::compile): * yarr/YarrPattern.h: In unicoe patterns, invalid backreferences are an error. 2017-04-12 Filip Pizlo Move common stack allocation utilities out of AirAllocateStackByGraphColoring.cpp https://bugs.webkit.org/show_bug.cgi?id=170799 Reviewed by Michael Saboff and Keith Miller. When I added stack allocation to allocateRegistersByLinearScan, I reused a handful of utility functions from AirAllocateStackByGraphColoring.cpp. I accomplished this by putting their declarations in AirAllocateStackByGraphColoring.h. That was pretty weird. This patch moves a family of stack allocation helper functions out of AirAllocateStackByGraphColoring.cpp and into the new AirStackAllocation.h|cpp. The linear scan stack allocator no longer has to include the other stack allocator's header, which addresses my OCD. I moved the functions transitively reachable from the two functions that the linear scan allocator needed. This forced me to give them better names (i.e. no "fooBarImpl") and short descriptive comments. I think that such comments are useful in code that is doing a convoluted version of some theoretical concept. No behavior change. * CMakeLists.txt: * JavaScriptCore.xcodeproj/project.pbxproj: * b3/air/AirAllocateRegistersAndStackByLinearScan.cpp: * b3/air/AirAllocateStackByGraphColoring.cpp: (JSC::B3::Air::allocateStackByGraphColoring): (JSC::B3::Air::allocateEscapedStackSlots): Deleted. (JSC::B3::Air::updateFrameSizeBasedOnStackSlots): Deleted. * b3/air/AirAllocateStackByGraphColoring.h: * b3/air/AirStackAllocation.cpp: Added. (JSC::B3::Air::attemptAssignment): (JSC::B3::Air::assign): (JSC::B3::Air::allocateAndGetEscapedStackSlotsWithoutChangingFrameSize): (JSC::B3::Air::allocateEscapedStackSlots): (JSC::B3::Air::updateFrameSizeBasedOnStackSlots): * b3/air/AirStackAllocation.h: Added. 2017-04-12 Filip Pizlo B3 -O1 should not allocateStackByGraphColoring https://bugs.webkit.org/show_bug.cgi?id=170742 Reviewed by Keith Miller. One of B3 -O1's longest running phases is allocateStackByGraphColoring. One approach to this would be to make that phase cheaper. But it's weird that this phase reruns liveness after register allocation already ran liveness. If only it could reuse the liveness computed by register allocation then it would run a lot faster. At -O2, we do not want this, since we run phases between register allocation and stack allocation, and those phases are free to change the liveness of spill slots (in fact, fixObviousSpills will both shorten and lengthen live ranges because of load and store elimination, respectively). But at -O1, we don't really need to run any phases between register and stack allocation. This changes Air's backend in the following ways: - Linear scan does stack allocation. This means that we don't need to run allocateStackByGraphColoring at all. In reality, we reuse some of its innards, but we don't run the expensive part of it (liveness->interference->coalescing->coloring). This is a speed-up because we only run liveness once and reuse it for both register and stack allocation. - Phases that previously ran between register and stack allocation are taken care of, each in its own special way: -> handleCalleSaves: this is now a utility function called by both allocateStackByGraphColoring and allocateRegistersAndStackByLinearScan. -> fixObviousSpills: we didn't run this at -O1, so nothing needs to be done. -> lowerAfterRegAlloc: this needed to be able to run before stack allocation because it could change register usage (vis a vis callee saves) and it could introduce spill slots. I changed this phase to have a secondary mode for when it runs after stack allocation. - The part of allocateStackByGraphColoring that lowered stack addresses and took care of the call arg area is now a separate phase called lowerStackArgs. We run this phase regardless of optimization level. It's a cheap and general lowering. This also removes spillEverything, because we never use that phase, we never test it, and it got in the way in this refactoring. This is a 21% speed-up on wasm -O1 compile times. This does not significantly change -O1 throughput. We had already disabled allocateStack's most important optimization (spill coalescing). This probably regresses average stack frame size, but I didn't measure by how much. Stack frame size is really not that important. The algorithm in allocateStackByGraphColoring is about much more than optimal frame size; it also tries to avoid having to zero-extend 32-bit spills, it kills dead code, and of course it coalesces. * CMakeLists.txt: * JavaScriptCore.xcodeproj/project.pbxproj: * b3/B3Procedure.cpp: (JSC::B3::Procedure::calleeSaveRegisterAtOffsetList): (JSC::B3::Procedure::calleeSaveRegisters): Deleted. * b3/B3Procedure.h: * b3/B3StackmapGenerationParams.cpp: (JSC::B3::StackmapGenerationParams::unavailableRegisters): * b3/air/AirAllocateRegistersAndStackByLinearScan.cpp: Copied from Source/JavaScriptCore/b3/air/AirAllocateRegistersByLinearScan.cpp. (JSC::B3::Air::allocateRegistersAndStackByLinearScan): (JSC::B3::Air::allocateRegistersByLinearScan): Deleted. * b3/air/AirAllocateRegistersAndStackByLinearScan.h: Copied from Source/JavaScriptCore/b3/air/AirAllocateRegistersByLinearScan.h. * b3/air/AirAllocateRegistersByLinearScan.cpp: Removed. * b3/air/AirAllocateRegistersByLinearScan.h: Removed. * b3/air/AirAllocateStackByGraphColoring.cpp: (JSC::B3::Air::allocateEscapedStackSlots): (JSC::B3::Air::updateFrameSizeBasedOnStackSlots): (JSC::B3::Air::allocateStackByGraphColoring): * b3/air/AirAllocateStackByGraphColoring.h: * b3/air/AirArg.cpp: (JSC::B3::Air::Arg::stackAddr): * b3/air/AirArg.h: (JSC::B3::Air::Arg::stackAddr): Deleted. * b3/air/AirCode.cpp: (JSC::B3::Air::Code::addStackSlot): (JSC::B3::Air::Code::setCalleeSaveRegisterAtOffsetList): (JSC::B3::Air::Code::calleeSaveRegisterAtOffsetList): (JSC::B3::Air::Code::dump): * b3/air/AirCode.h: (JSC::B3::Air::Code::setStackIsAllocated): (JSC::B3::Air::Code::stackIsAllocated): (JSC::B3::Air::Code::calleeSaveRegisters): * b3/air/AirGenerate.cpp: (JSC::B3::Air::prepareForGeneration): (JSC::B3::Air::generate): * b3/air/AirHandleCalleeSaves.cpp: (JSC::B3::Air::handleCalleeSaves): * b3/air/AirHandleCalleeSaves.h: * b3/air/AirLowerAfterRegAlloc.cpp: (JSC::B3::Air::lowerAfterRegAlloc): * b3/air/AirLowerStackArgs.cpp: Added. (JSC::B3::Air::lowerStackArgs): * b3/air/AirLowerStackArgs.h: Added. * b3/testb3.cpp: (JSC::B3::testPinRegisters): * ftl/FTLCompile.cpp: (JSC::FTL::compile): * jit/RegisterAtOffsetList.h: * wasm/WasmB3IRGenerator.cpp: (JSC::Wasm::parseAndCompile): 2017-04-12 Michael Saboff Implement Object.isFrozen() and Object.isSealed() per ECMA spec https://bugs.webkit.org/show_bug.cgi?id=170753 Reviewed by Mark Lam. * runtime/ObjectConstructor.cpp: (JSC::testIntegrityLevel): Added local helper as described in the ECMA standard. (JSC::objectConstructorSeal): (JSC::objectConstructorFreeze): Eliminated incomplete special handling of JSFinalObjects. (JSC::objectConstructorIsSealed): (JSC::objectConstructorIsFrozen): Refactored to use the new testIntegrityLevel() helper. 2017-04-12 Yusuke Suzuki Use HAVE(MACHINE_CONTEXT) instead of USE(MACHINE_CONTEXT) https://bugs.webkit.org/show_bug.cgi?id=170770 Rubber stamped by Mark Lam. * heap/MachineStackMarker.cpp: (JSC::MachineThreads::MachineThread::Registers::framePointer): (JSC::MachineThreads::MachineThread::Registers::instructionPointer): (JSC::MachineThreads::MachineThread::Registers::llintPC): * runtime/MachineContext.h: (JSC::MachineContext::stackPointer): (JSC::MachineContext::framePointer): (JSC::MachineContext::instructionPointer): (JSC::MachineContext::argumentPointer<1>): (JSC::MachineContext::llintInstructionPointer): 2017-04-12 Yusuke Suzuki [JSC] Clean up heap/MachineStackMarker by introducing USE(MACHINE_CONTEXT) https://bugs.webkit.org/show_bug.cgi?id=170770 Reviewed by Mark Lam. We use USE(MACHINE_CONTEXT) to clean up runtime/MachineContext.h. And we clean up heap/MachineStackMarker.cpp by using MachineContext functions. * heap/MachineStackMarker.cpp: (JSC::MachineThreads::MachineThread::Registers::stackPointer): (JSC::MachineThreads::MachineThread::Registers::framePointer): (JSC::MachineThreads::MachineThread::Registers::instructionPointer): (JSC::MachineThreads::MachineThread::Registers::llintPC): * heap/MachineStackMarker.h: * runtime/MachineContext.h: (JSC::MachineContext::stackPointer): (JSC::MachineContext::framePointer): (JSC::MachineContext::instructionPointer): (JSC::MachineContext::argumentPointer<1>): (JSC::MachineContext::llintInstructionPointer): 2017-04-12 Yusuke Suzuki [WTF] Introduce Thread class and use RefPtr and align Windows Threading implementation semantics to Pthread one https://bugs.webkit.org/show_bug.cgi?id=170502 Reviewed by Mark Lam. * API/tests/CompareAndSwapTest.cpp: (testCompareAndSwap): * JavaScriptCore.xcodeproj/project.pbxproj: * b3/air/testair.cpp: * b3/testb3.cpp: (JSC::B3::run): * bytecode/SuperSampler.cpp: (JSC::initializeSuperSampler): * dfg/DFGWorklist.cpp: * disassembler/Disassembler.cpp: * heap/Heap.cpp: (JSC::Heap::lastChanceToFinalize): (JSC::Heap::notifyIsSafeToCollect): * heap/Heap.h: * heap/MachineStackMarker.cpp: (JSC::MachineThreads::~MachineThreads): (JSC::MachineThreads::addCurrentThread): (JSC::MachineThreads::removeThread): (JSC::MachineThreads::removeThreadIfFound): (JSC::MachineThreads::MachineThread::MachineThread): (JSC::MachineThreads::MachineThread::getRegisters): (JSC::MachineThreads::MachineThread::Registers::stackPointer): (JSC::MachineThreads::MachineThread::Registers::framePointer): (JSC::MachineThreads::MachineThread::Registers::instructionPointer): (JSC::MachineThreads::MachineThread::Registers::llintPC): (JSC::MachineThreads::MachineThread::captureStack): (JSC::MachineThreads::tryCopyOtherThreadStack): (JSC::MachineThreads::tryCopyOtherThreadStacks): (pthreadSignalHandlerSuspendResume): Deleted. (JSC::threadData): Deleted. (JSC::MachineThreads::Thread::Thread): Deleted. (JSC::MachineThreads::Thread::createForCurrentThread): Deleted. (JSC::MachineThreads::Thread::operator==): Deleted. (JSC::MachineThreads::machineThreadForCurrentThread): Deleted. (JSC::MachineThreads::ThreadData::ThreadData): Deleted. (JSC::MachineThreads::ThreadData::~ThreadData): Deleted. (JSC::MachineThreads::ThreadData::suspend): Deleted. (JSC::MachineThreads::ThreadData::resume): Deleted. (JSC::MachineThreads::ThreadData::getRegisters): Deleted. (JSC::MachineThreads::ThreadData::Registers::stackPointer): Deleted. (JSC::MachineThreads::ThreadData::Registers::framePointer): Deleted. (JSC::MachineThreads::ThreadData::Registers::instructionPointer): Deleted. (JSC::MachineThreads::ThreadData::Registers::llintPC): Deleted. (JSC::MachineThreads::ThreadData::freeRegisters): Deleted. (JSC::MachineThreads::ThreadData::captureStack): Deleted. * heap/MachineStackMarker.h: (JSC::MachineThreads::MachineThread::suspend): (JSC::MachineThreads::MachineThread::resume): (JSC::MachineThreads::MachineThread::threadID): (JSC::MachineThreads::MachineThread::stackBase): (JSC::MachineThreads::MachineThread::stackEnd): (JSC::MachineThreads::threadsListHead): (JSC::MachineThreads::Thread::operator!=): Deleted. (JSC::MachineThreads::Thread::suspend): Deleted. (JSC::MachineThreads::Thread::resume): Deleted. (JSC::MachineThreads::Thread::getRegisters): Deleted. (JSC::MachineThreads::Thread::freeRegisters): Deleted. (JSC::MachineThreads::Thread::captureStack): Deleted. (JSC::MachineThreads::Thread::platformThread): Deleted. (JSC::MachineThreads::Thread::stackBase): Deleted. (JSC::MachineThreads::Thread::stackEnd): Deleted. * jit/ICStats.cpp: (JSC::ICStats::ICStats): (JSC::ICStats::~ICStats): * jit/ICStats.h: * jsc.cpp: (functionDollarAgentStart): (startTimeoutThreadIfNeeded): * runtime/JSLock.cpp: (JSC::JSLock::lock): * runtime/JSLock.h: (JSC::JSLock::ownerThread): (JSC::JSLock::currentThreadIsHoldingLock): * runtime/SamplingProfiler.cpp: (JSC::FrameWalker::isValidFramePointer): (JSC::SamplingProfiler::SamplingProfiler): (JSC::SamplingProfiler::createThreadIfNecessary): (JSC::SamplingProfiler::takeSample): * runtime/SamplingProfiler.h: * runtime/VM.h: (JSC::VM::ownerThread): * runtime/VMTraps.cpp: (JSC::findActiveVMAndStackBounds): (JSC::VMTraps::SignalSender::send): (JSC::VMTraps::fireTrap): 2017-04-11 Dean Jackson Disable outdated WritableStream API https://bugs.webkit.org/show_bug.cgi?id=170749 Reviewed by Tim Horton. The API we implement is no longer accurate. Disable it until we are compatible with the new specification * Configurations/FeatureDefines.xcconfig: 2017-04-11 Yusuke Suzuki Unreviewed, build fix for CF ports after r215241 https://bugs.webkit.org/show_bug.cgi?id=170725 * heap/GCActivityCallback.cpp: (JSC::GCActivityCallback::nextFireTime): 2017-04-11 Yusuke Suzuki [WebCore][JSC] ResourceUsageData.{timeOfNextEdenCollection,timeOfNextFullCollection} should be MonotonicTime https://bugs.webkit.org/show_bug.cgi?id=170725 Reviewed by Sam Weinig. This patch makes GCActivityCallback return MonotonicTime instead of raw double value. * heap/GCActivityCallback.cpp: (JSC::GCActivityCallback::nextFireTime): * heap/GCActivityCallback.h: 2017-04-11 Guillaume Emont [jsc] Add missing MacroAssemblerMIPS::or32() implementation https://bugs.webkit.org/show_bug.cgi?id=169714 Reviewed by Michael Catanzaro. * assembler/MacroAssemblerMIPS.h: (JSC::MacroAssemblerMIPS::or32): Added or32(TrustedImm32, Address). 2017-04-11 Joseph Pecoraro test262: test262/test/annexB/language/comments/multi-line-html-close.js https://bugs.webkit.org/show_bug.cgi?id=170648 Reviewed by Keith Miller. * parser/Lexer.cpp: (JSC::Lexer::lex): A multi-line comment that contains a line terminator is itself treated like a line terminator. An HTML Close Comment that comes after it can therefore treat it like it is at the start of a line, because it was immediately preceeded by the equivalent of a line terminator. 2017-04-11 Joseph Pecoraro test262: test262/test/built-ins/Array/S15.4.3_A2.2.js https://bugs.webkit.org/show_bug.cgi?id=170652 Reviewed by Michael Saboff. * runtime/ArrayConstructor.cpp: (JSC::ArrayConstructor::finishCreation): * runtime/BooleanConstructor.cpp: (JSC::BooleanConstructor::finishCreation): * runtime/DateConstructor.cpp: (JSC::DateConstructor::finishCreation): * runtime/FunctionConstructor.cpp: (JSC::FunctionConstructor::finishCreation): * runtime/JSArrayBufferConstructor.cpp: (JSC::JSArrayBufferConstructor::finishCreation): * runtime/NumberConstructor.cpp: (JSC::NumberConstructor::finishCreation): * runtime/ObjectConstructor.cpp: (JSC::ObjectConstructor::finishCreation): * runtime/RegExpConstructor.cpp: (JSC::RegExpConstructor::finishCreation): * runtime/StringConstructor.cpp: (JSC::StringConstructor::finishCreation): * runtime/SymbolConstructor.cpp: (JSC::SymbolConstructor::finishCreation): Ensure the "length" property on these native constructors is configurable (deletable). 2017-04-11 Yusuke Suzuki Unreviewed, build fix for Windows after r215228 part 2 https://bugs.webkit.org/show_bug.cgi?id=170723 Since GCActivityCallback class is annotated exported, we do not need to annotate each member. * heap/GCActivityCallback.h: 2017-04-11 Yusuke Suzuki [JSC][GTK] Use RunLoop::Timer in GTK port https://bugs.webkit.org/show_bug.cgi?id=170723 Reviewed by Carlos Garcia Campos. This patch makes GTK port use RunLoop::Timer for JSRunLoopTimer. Only Cocoa-based ports use platform-specific Timer because it has additional feature that changes RunLoop to the WebThread one. And we enable Heap timers in all the ports including JSCOnly port. * heap/EdenGCActivityCallback.cpp: (JSC::EdenGCActivityCallback::lastGCLength): * heap/EdenGCActivityCallback.h: * heap/FullGCActivityCallback.cpp: (JSC::FullGCActivityCallback::lastGCLength): * heap/FullGCActivityCallback.h: * heap/GCActivityCallback.cpp: (JSC::GCActivityCallback::GCActivityCallback): (JSC::GCActivityCallback::doWork): (JSC::GCActivityCallback::scheduleTimer): (JSC::GCActivityCallback::cancelTimer): (JSC::GCActivityCallback::nextFireTime): (JSC::GCActivityCallback::didAllocate): * heap/GCActivityCallback.h: * heap/IncrementalSweeper.cpp: (JSC::IncrementalSweeper::doWork): (JSC::IncrementalSweeper::doSweep): * heap/IncrementalSweeper.h: * heap/StopIfNecessaryTimer.cpp: (JSC::StopIfNecessaryTimer::scheduleSoon): * runtime/JSRunLoopTimer.cpp: (JSC::JSRunLoopTimer::setRunLoop): (JSC::JSRunLoopTimer::scheduleTimer): (JSC::JSRunLoopTimer::cancelTimer): (JSC::JSRunLoopTimer::JSRunLoopTimer): (JSC::JSRunLoopTimer::~JSRunLoopTimer): (JSC::JSRunLoopTimer::timerDidFireCallback): * runtime/JSRunLoopTimer.h: * runtime/PromiseDeferredTimer.cpp: (JSC::PromiseDeferredTimer::scheduleWorkSoon): 2017-04-11 Guillaume Emont [jsc][mips] Add missing MacroAssembler functions after r214187 https://bugs.webkit.org/show_bug.cgi?id=170089 Reviewed by Yusuke Suzuki. * assembler/MacroAssemblerMIPS.h: (JSC::MacroAssemblerMIPS::loadFloat): Added. (JSC::MacroAssemblerMIPS::storeFloat): Added. 2017-04-11 Yusuke Suzuki [JSC] Enable JSRunLoopTimer for JSCOnly and Windows https://bugs.webkit.org/show_bug.cgi?id=170655 Reviewed by Carlos Garcia Campos. * runtime/JSRunLoopTimer.cpp: (JSC::JSRunLoopTimer::JSRunLoopTimer): (JSC::JSRunLoopTimer::scheduleTimer): (JSC::JSRunLoopTimer::cancelTimer): * runtime/JSRunLoopTimer.h: 2017-04-10 Alex Christensen Revert r215217 https://bugs.webkit.org/show_bug.cgi?id=170703 * Configurations/FeatureDefines.xcconfig: 2017-04-10 Alex Christensen Continue enabling WebRTC https://bugs.webkit.org/show_bug.cgi?id=170703 Reviewed by Youenn Fablet. * Configurations/FeatureDefines.xcconfig: 2017-04-10 Mark Lam Move ProbeContext and ProbeFunction out of AbstractMacroAssembler. https://bugs.webkit.org/show_bug.cgi?id=170681 Reviewed by Michael Saboff. This is a refactoring step towards enabling custom probe printers the way printInternal() works for dataLog. * assembler/AbstractMacroAssembler.h: (JSC::AbstractMacroAssembler::ProbeContext::gpr): Deleted. (JSC::AbstractMacroAssembler::ProbeContext::fpr): Deleted. (JSC::AbstractMacroAssembler::ProbeContext::gprName): Deleted. (JSC::AbstractMacroAssembler::ProbeContext::fprName): Deleted. * assembler/MacroAssembler.cpp: (JSC::stdFunctionCallback): (JSC::MacroAssembler::probe): * assembler/MacroAssembler.h: (JSC::ProbeContext::gpr): (JSC::ProbeContext::fpr): (JSC::ProbeContext::gprName): (JSC::ProbeContext::fprName): * assembler/MacroAssemblerARM.cpp: (JSC::MacroAssemblerARM::probe): * assembler/MacroAssemblerARM64.cpp: (JSC::arm64ProbeTrampoline): (JSC::MacroAssemblerARM64::probe): * assembler/MacroAssemblerARMv7.cpp: (JSC::MacroAssemblerARMv7::probe): * assembler/MacroAssemblerPrinter.cpp: * assembler/MacroAssemblerPrinter.h: * assembler/MacroAssemblerX86Common.cpp: (JSC::MacroAssemblerX86Common::probe): * ftl/FTLLowerDFGToB3.cpp: (JSC::FTL::DFG::LowerDFGToB3::abstractStructure): (JSC::FTL::DFG::LowerDFGToB3::probe): Deleted. - Deleted because this became a useless place-holder after the transition to B3. 2017-04-10 Keith Miller WebAssembly: Fix B3IRGenerator for BrTable https://bugs.webkit.org/show_bug.cgi?id=170685 Reviewed by JF Bastien. For some reason this didn't get included in r215141. This fixes an issue with BrTable and loops where we would use the loop's return type as the branch target type. * wasm/WasmB3IRGenerator.cpp: (JSC::Wasm::B3IRGenerator::ControlData::resultForBranch): (JSC::Wasm::B3IRGenerator::unifyValuesWithBlock): 2017-04-08 Oliver Hunt Remove use of strcpy from JSC https://bugs.webkit.org/show_bug.cgi?id=170646 Reviewed by Mark Lam. Replace the use of strcpy with memcpy as strcpy keeps on tripping various analyser warnings even though its trivially safe in this case. Essentially code hygiene, no change in behaviour, no perf impact. * dfg/DFGDisassembler.cpp: (JSC::DFG::Disassembler::dumpDisassembly): 2017-04-09 Joseph Pecoraro test262: test262/test/annexB/language/expressions/object/__proto__-fn-name.js https://bugs.webkit.org/show_bug.cgi?id=170650 Reviewed by Saam Barati. * parser/Parser.cpp: (JSC::Parser::parseClass): (JSC::Parser::parseProperty): There needs to be special handling of: PropertyDefinition : PropertyName ':' AssignmentExpression When the property name is __proto__. In this case the SetFunctionName path does not happen, so the name "__proto__" is not inferred on any anonymous function. See: https://tc39.github.io/ecma262/#sec-__proto__-property-names-in-object-initializers * parser/Parser.h: * parser/SyntaxChecker.h: (JSC::SyntaxChecker::createProperty): * parser/ASTBuilder.h: (JSC::ASTBuilder::createProperty): Add an extra parameter to see if inferring / setting names are allowed. 2017-04-09 Joseph Pecoraro test262: test262/test/annexB/language/literals/regexp/identity-escape.js https://bugs.webkit.org/show_bug.cgi?id=170651 Reviewed by Saam Barati. * yarr/YarrParser.h: (JSC::Yarr::Parser::parseEscape): For \8 and \9 match just the number "8" or "9" instead of both "\\" and the number. See: https://tc39.github.io/ecma262/#sec-decimalescape 2017-04-08 Youenn Fablet WebRTC tests gardening https://bugs.webkit.org/show_bug.cgi?id=170508 Reviewed by Eric Carlson. * Configurations/FeatureDefines.xcconfig: 2017-04-07 Keith Miller WebAssembly: Fix issue with BrTable targeting a Loop https://bugs.webkit.org/show_bug.cgi?id=170638 Reviewed by Saam Barati. This fixes the same issue V8 had in: https://github.com/WebAssembly/spec/pull/456#event-1033547537 * wasm/WasmValidate.cpp: (JSC::Wasm::Validate::ControlData::branchTargetSignature): 2017-04-07 Keith Miller Add a PriorityQueue class https://bugs.webkit.org/show_bug.cgi?id=170579 Reviewed by Saam Barati. Update Wasm::Worklist to use WTF::PriorityQueue. * wasm/WasmWorklist.cpp: (JSC::Wasm::Worklist::enqueue): (JSC::Wasm::Worklist::completePlanSynchronously): (JSC::Wasm::Worklist::stopAllPlansForVM): (JSC::Wasm::Worklist::~Worklist): (JSC::Wasm::Worklist::iterate): Deleted. * wasm/WasmWorklist.h: (JSC::Wasm::Worklist::isHigherPriority): (JSC::Wasm::Worklist::Comparator::operator()): Deleted. 2017-04-07 Yuichiro Kikura WebGPU: implement ComputeCommandEncoder and related components https://bugs.webkit.org/show_bug.cgi?id=170444 Reviewed by Alex Christensen. I added some identifiers related with WebGPUComputeCommandEncoder based on the proposal. https://webkit.org/wp-content/uploads/webgpu-api-proposal.html * runtime/CommonIdentifiers.h: 2017-04-07 Saam Barati WebAssembly: Module::getOrCreateCodeBlock is wrong https://bugs.webkit.org/show_bug.cgi?id=170612 Reviewed by Keith Miller. When we were getting a module's CodeBlock, we were checking if !runnable(), and if !runnable(), we were re-creating the CodeBlock. This is wrong, since !runnable() is true while the CodeBlock is compiling. Instead, we should check if we've finished compiling, and if so, if that compilation failed. * wasm/WasmModule.cpp: (JSC::Wasm::Module::getOrCreateCodeBlock): 2017-04-07 Saam Barati WebAssembly: Make to a compilation API that allows for multi-VM concurrent compilations of Wasm Modules https://bugs.webkit.org/show_bug.cgi?id=170488 Reviewed by JF Bastien. This patch adds a class called Wasm::Module. It contains the bits from JSWebAssemblyModule that were not VM specific. JSWebAssemblyModule now has a Ref. Similarly, there is now a Wasm::CodeBlock, which owns the non-VM-specific bits that JSWebAssemblyCodeBlock used to own. This patch also simplifies how we verify and compile code. Wasm::Module now has an API for both sync/async validation and compilation. This API abstracts away how Wasm::Plan works. This is hopefully the last patch needed before we can implement window.postMessage for a JSWebAssemblyModule. I think all that's needed now to implement postMessage is simply creating a new JSWebAssemblyModule with the underlying Wasm::Module. This patch is neutral on WasmBench. Finally, this patch changes the promise deferred timer to allow for new tasks to be added while we're executing a task. Before, we'd deadlock if this happened. * CMakeLists.txt: * JavaScriptCore.xcodeproj/project.pbxproj: * jsc.cpp: (functionTestWasmModuleFunctions): * runtime/PromiseDeferredTimer.cpp: (JSC::PromiseDeferredTimer::doWork): (JSC::PromiseDeferredTimer::scheduleWorkSoon): * runtime/PromiseDeferredTimer.h: * wasm/WasmB3IRGenerator.cpp: * wasm/WasmBinding.cpp: (JSC::Wasm::wasmToJs): (JSC::Wasm::wasmToWasm): (JSC::Wasm::exitStubGenerator): Deleted. * wasm/WasmBinding.h: * wasm/WasmCodeBlock.cpp: Added. (JSC::Wasm::CodeBlock::CodeBlock): (JSC::Wasm::CodeBlock::waitUntilFinished): (JSC::Wasm::CodeBlock::compileAsync): (JSC::Wasm::CodeBlock::isSafeToRun): * wasm/WasmCodeBlock.h: Added. (JSC::Wasm::CodeBlock::create): (JSC::Wasm::CodeBlock::compilationFinished): (JSC::Wasm::CodeBlock::runnable): (JSC::Wasm::CodeBlock::errorMessage): (JSC::Wasm::CodeBlock::functionImportCount): (JSC::Wasm::CodeBlock::jsEntrypointCalleeFromFunctionIndexSpace): (JSC::Wasm::CodeBlock::wasmEntrypointCalleeFromFunctionIndexSpace): * wasm/WasmModule.cpp: Added. (JSC::Wasm::Module::Module): (JSC::Wasm::makeValidationResult): (JSC::Wasm::Module::validateSyncImpl): (JSC::Wasm::Module::getOrCreateCodeBlock): (JSC::Wasm::Module::compileSync): (JSC::Wasm::Module::makeValidationCallback): (JSC::Wasm::Module::compileAsync): * wasm/WasmModule.h: Added. (JSC::Wasm::Module::create): (JSC::Wasm::Module::validateSync): (JSC::Wasm::Module::validateAsync): (JSC::Wasm::Module::signatureIndexFromFunctionIndexSpace): (JSC::Wasm::Module::moduleInformation): (JSC::Wasm::Module::nonNullCodeBlock): * wasm/WasmPlan.cpp: (JSC::Wasm::Plan::Plan): (JSC::Wasm::Plan::addCompletionTask): (JSC::Wasm::Plan::prepare): (JSC::Wasm::Plan::compileFunctions): (JSC::Wasm::Plan::complete): (JSC::Wasm::Plan::tryRemoveVMAndCancelIfLast): (JSC::Wasm::Plan::cancel): Deleted. * wasm/WasmPlan.h: (JSC::Wasm::Plan::dontFinalize): (JSC::Wasm::Plan::takeWasmToWasmExitStubs): (JSC::Wasm::Plan::mode): (JSC::Wasm::Plan::takeWasmExitStubs): Deleted. (JSC::Wasm::Plan::vm): Deleted. * wasm/WasmWorklist.cpp: (JSC::Wasm::Worklist::stopAllPlansForVM): * wasm/js/JSWebAssemblyCodeBlock.cpp: (JSC::JSWebAssemblyCodeBlock::JSWebAssemblyCodeBlock): (JSC::JSWebAssemblyCodeBlock::isSafeToRun): (JSC::JSWebAssemblyCodeBlock::initialize): Deleted. * wasm/js/JSWebAssemblyCodeBlock.h: (JSC::JSWebAssemblyCodeBlock::create): (JSC::JSWebAssemblyCodeBlock::functionImportCount): (JSC::JSWebAssemblyCodeBlock::jsEntrypointCalleeFromFunctionIndexSpace): (JSC::JSWebAssemblyCodeBlock::wasmEntrypointCalleeFromFunctionIndexSpace): (JSC::JSWebAssemblyCodeBlock::wasmToJsCallStubForImport): (JSC::JSWebAssemblyCodeBlock::mode): Deleted. (JSC::JSWebAssemblyCodeBlock::initialized): Deleted. (JSC::JSWebAssemblyCodeBlock::plan): Deleted. (JSC::JSWebAssemblyCodeBlock::runnable): Deleted. (JSC::JSWebAssemblyCodeBlock::errorMessage): Deleted. (JSC::JSWebAssemblyCodeBlock::setJSEntrypointCallee): Deleted. (JSC::JSWebAssemblyCodeBlock::setWasmEntrypointCallee): Deleted. * wasm/js/JSWebAssemblyInstance.cpp: (JSC::JSWebAssemblyInstance::finalizeCreation): (JSC::JSWebAssemblyInstance::addUnitializedCodeBlock): Deleted. * wasm/js/JSWebAssemblyInstance.h: (JSC::JSWebAssemblyInstance::initialized): Deleted. * wasm/js/JSWebAssemblyModule.cpp: (JSC::JSWebAssemblyModule::createStub): (JSC::JSWebAssemblyModule::JSWebAssemblyModule): (JSC::JSWebAssemblyModule::finishCreation): * wasm/js/JSWebAssemblyModule.h: (JSC::JSWebAssemblyModule::moduleInformation): (JSC::JSWebAssemblyModule::signatureIndexFromFunctionIndexSpace): (JSC::JSWebAssemblyModule::module): * wasm/js/WebAssemblyFunction.cpp: (JSC::WebAssemblyFunction::create): * wasm/js/WebAssemblyInstanceConstructor.cpp: (JSC::constructJSWebAssemblyInstance): * wasm/js/WebAssemblyModuleConstructor.cpp: (JSC::WebAssemblyModuleConstructor::createModule): * wasm/js/WebAssemblyPrototype.cpp: (JSC::reject): (JSC::webAssemblyCompileFunc): (JSC::resolve): (JSC::instantiate): (JSC::compileAndInstantiate): (JSC::webAssemblyValidateFunc): 2017-04-07 Carlos Garcia Campos [GTK] Update the priorities used in glib main loop sources https://bugs.webkit.org/show_bug.cgi?id=170457 Reviewed by Žan Doberšek. * runtime/JSRunLoopTimer.cpp: (JSC::JSRunLoopTimer::JSRunLoopTimer): 2017-04-06 Filip Pizlo Rename allocateStack to allocateStackByGraphColoring. Rubber stamped by Saam Barati. * CMakeLists.txt: * JavaScriptCore.xcodeproj/project.pbxproj: * b3/air/AirAllocateStack.cpp: Removed. * b3/air/AirAllocateStack.h: Removed. * b3/air/AirAllocateStackByGraphColoring.cpp: Copied from Source/JavaScriptCore/b3/air/AirAllocateStack.cpp. (JSC::B3::Air::allocateStackByGraphColoring): (JSC::B3::Air::allocateStack): Deleted. * b3/air/AirAllocateStackByGraphColoring.h: Copied from Source/JavaScriptCore/b3/air/AirAllocateStack.h. * b3/air/AirGenerate.cpp: (JSC::B3::Air::prepareForGeneration): 2017-04-06 Michael Saboff Cannot Object.seal() or Object.freeze() global "this" https://bugs.webkit.org/show_bug.cgi?id=170549 Reviewed by Mark Lam. Needed to implement JSProxy::isExtensible() which returns the results of calling the same on wrapped object. Implemented step 11 of Runtime Semantics: EvalDeclarationInstantiation from the ECMAScript spec to properly return a TypeError object when attempting to add properties to a non-extensible global object. * interpreter/Interpreter.cpp: (JSC::Interpreter::execute): * runtime/JSProxy.cpp: (JSC::JSProxy::isExtensible): * runtime/JSProxy.h: 2017-04-06 Filip Pizlo Linear scan should run liveness only once https://bugs.webkit.org/show_bug.cgi?id=170569 Reviewed by Keith Miller. Air has a longstanding design bug that Tmps from different banks are indexed independently. This means that all of our analyses over Tmps do separate GP and FP passes. This does have some marginal benefits (the rest of the algorithm is specialized for Bank) but it's probably net bad. However, I don't want to think about solving that general problem. Instead, this just makes linear scan use a UnifiedTmpLiveness that uses a single "linear" indexing for GP and FP. This lets me avoid the much larger refactoring (which would involve substantial changes in graph coloring) while getting the bulk of the benefit (liveness runs once, instead of twice, for linear scan). This patch implements a lot of plumbing to make it possible for Liveness<> to view Tmps as having a unified indexing scheme. Tmp calls this LinearlyIndexed (to match the naming convention of AbsolutelyIndexed and Indexed), while AirLiveness calls this UnifiedTmpLiveness. With this change, -O1 never does any liveness analysis that uses separate GP and FP passes. I think this eliminates any urgency from the larger Tmp indexing bug. We can probably live with graph coloring doing separate passes. This is a ~6% speed-up for wasm -O1 compile times. I think this means that linear scan is no longer the longest pole in the tent. * JavaScriptCore.xcodeproj/project.pbxproj: * b3/B3VariableLiveness.h: (JSC::B3::VariableLivenessAdapter::prepareToCompute): * b3/air/AirAllocateRegistersByLinearScan.cpp: (JSC::B3::Air::allocateRegistersByLinearScan): * b3/air/AirCode.h: (JSC::B3::Air::Code::forEachTmp): * b3/air/AirLiveness.h: * b3/air/AirLivenessAdapter.h: (JSC::B3::Air::LivenessAdapter::Actions::Actions): (JSC::B3::Air::LivenessAdapter::LivenessAdapter): (JSC::B3::Air::LivenessAdapter::adapter): (JSC::B3::Air::LivenessAdapter::prepareToCompute): (JSC::B3::Air::LivenessAdapter::actionsAt): (JSC::B3::Air::LivenessAdapter::forEachUse): (JSC::B3::Air::LivenessAdapter::forEachDef): (JSC::B3::Air::TmpLivenessAdapter::numIndices): (JSC::B3::Air::UnifiedTmpLivenessAdapter::UnifiedTmpLivenessAdapter): (JSC::B3::Air::UnifiedTmpLivenessAdapter::numIndices): (JSC::B3::Air::UnifiedTmpLivenessAdapter::acceptsBank): (JSC::B3::Air::UnifiedTmpLivenessAdapter::acceptsRole): (JSC::B3::Air::UnifiedTmpLivenessAdapter::valueToIndex): (JSC::B3::Air::UnifiedTmpLivenessAdapter::indexToValue): * b3/air/AirLivenessConstraints.h: Removed. * b3/air/AirRegLiveness.h: (JSC::B3::Air::RegLiveness::LocalCalc::LocalCalc): * b3/air/AirTmp.cpp: * b3/air/AirTmp.h: * b3/air/AirTmpInlines.h: (JSC::B3::Air::Tmp::LinearlyIndexed::LinearlyIndexed): (JSC::B3::Air::Tmp::LinearlyIndexed::index): (JSC::B3::Air::Tmp::linearlyIndexed): (JSC::B3::Air::Tmp::indexEnd): (JSC::B3::Air::Tmp::absoluteIndexEnd): (JSC::B3::Air::Tmp::linearIndexEnd): (JSC::B3::Air::Tmp::tmpForAbsoluteIndex): (JSC::B3::Air::Tmp::tmpForLinearIndex): * b3/air/AirTmpMap.h: Added. (JSC::B3::Air::TmpMap::TmpMap): (JSC::B3::Air::TmpMap::resize): (JSC::B3::Air::TmpMap::clear): (JSC::B3::Air::TmpMap::operator[]): (JSC::B3::Air::TmpMap::append): 2017-04-06 Ryan Haddad Unreviewed, rolling out r215046. This change broke internal builds. Reverted changeset: "WebRTC tests gardening" https://bugs.webkit.org/show_bug.cgi?id=170508 http://trac.webkit.org/changeset/215046 2017-04-06 Joseph Pecoraro Web Inspector: Show all headers in the Request Headers section of the Resource details sidebar https://bugs.webkit.org/show_bug.cgi?id=16531 Reviewed by Timothy Hatcher. * inspector/protocol/Network.json: Optional refined list of request headers in Metrics. 2017-04-06 Filip Pizlo B3 -O1 should generate better code than -O0 https://bugs.webkit.org/show_bug.cgi?id=170563 Reviewed by Michael Saboff. Prior to this change, code generated by -O1 ran slower than code generated by -O0. This turned out to be because of reduceStrength optimizations that increase live ranges and create register pressure, which then creates problems for linear scan. It seemed obvious that canonicalizations that help isel, constant folding, and one-for-one strength reductions should stay. It also seemed obvious that SSA and CFG simplification are fast and harmless. So, I focused on removing: - CSE, which increases live ranges. This is a risky optimization when we know that we've chosen to use a bad register allocator. - Sophisticated strength reductions that create more code, like the insane division optimization. - Anything that inserts basic blocks. CSE appeared to be the cause of half of the throughput regression of -O1 but none of the compile time. This change also reduces the running time of reduceStrength by making it not a fixpoint at optLevel<2. This makes wasm -O1 compile 17% faster. This makes wasm -O1 run 19% faster. This makes -O1 code run 3% faster than -O0, and compile about 4% slower than -O0. We may yet end up choosing to use -O0, but at least now -O1 isn't totally useless. * b3/B3ReduceStrength.cpp: 2017-04-06 Jon Davis Updates feature status for recently shipped features https://bugs.webkit.org/show_bug.cgi?id=170359 Reviewed by Brian Burg. Changed "Done" status to "Supported". * features.json: 2017-04-06 Youenn Fablet WebRTC tests gardening https://bugs.webkit.org/show_bug.cgi?id=170508 Reviewed by Eric Carlson. * Configurations/FeatureDefines.xcconfig: 2017-04-06 Guillaume Emont [JSC][MIPS][DFG] Use x86 generic HasOwnProperty https://bugs.webkit.org/show_bug.cgi?id=170222 Reviewed by Yusuke Suzuki. * dfg/DFGFixupPhase.cpp: (JSC::DFG::FixupPhase::fixupNode): use the X86 special version for HasOwnProperty on MIPS too. * dfg/DFGSpeculativeJIT32_64.cpp: (JSC::DFG::SpeculativeJIT::compile): use the X86 special version for HasOwnProperty on MIPS too. 2017-04-05 Saam Barati REGRESSION fix bad isWasm() test by ensuring proper Wasm callee bit pattern https://bugs.webkit.org/show_bug.cgi?id=170494 Reviewed by Yusuke Suzuki and Mark Lam. This patch fixes how we test a 64 bit JSValue pattern to see if it's a Wasm callee. We now tag Wasm::Callee's with 0b011 in their lower 3 bits. The new test is for a Wasm Callee is as follows: isWasm(uint64_t x) { return x & 0xffff000000000007 == 3; } This test works because the lower 3 bits of the non-number immediate values are as follows: undefined: 0b010 null: 0b010 true: 0b111 false: 0b110 The test rejects all of these because none have just the value 3 in their lower 3 bits. The test also rejects all numbers, because they have non-zero upper 16 bits. The test also rejects normal cells because they won't have the number 3 as their lower 3 bits. Note, this bit pattern also allows the normal JSValue isCell(), etc, predicates to work on a Wasm::Callee because the various tests will fail if you bit casted a boxed Wasm::Callee* to a JSValue. isCell() would fail since it sees TagBitTypeOther. The other tests also trivially fail, since it won't be a number, and it won't be equal to null, undefined, true, or false. The isBoolean() predicate will fail because we won't have TagBitBool set. * interpreter/CallFrame.h: (JSC::ExecState::guaranteedJSValueCallee): (JSC::ExecState::calleeAsValue): Deleted. * interpreter/CalleeBits.h: (JSC::CalleeBits::boxWasm): (JSC::CalleeBits::isWasm): (JSC::CalleeBits::asWasmCallee): * jit/JITOperations.cpp: * runtime/JSCJSValue.h: 2017-04-05 Keith Miller WebAssembly: Plans should be able to have more than one completion task. https://bugs.webkit.org/show_bug.cgi?id=170516 Reviewed by Saam Barati. This patch also eliminates the need for blocked tasks on the PromiseDeferredTimer and pendingPromise on Wasm::Plan. * runtime/PromiseDeferredTimer.cpp: (JSC::PromiseDeferredTimer::doWork): (JSC::PromiseDeferredTimer::cancelPendingPromise): (JSC::PromiseDeferredTimer::scheduleBlockedTask): Deleted. * runtime/PromiseDeferredTimer.h: * wasm/WasmPlan.cpp: (JSC::Wasm::Plan::Plan): (JSC::Wasm::Plan::addCompletionTask): (JSC::Wasm::Plan::complete): * wasm/WasmPlan.h: (JSC::Wasm::Plan::setMode): (JSC::Wasm::Plan::mode): (JSC::Wasm::Plan::setModeAndPromise): Deleted. (JSC::Wasm::Plan::pendingPromise): Deleted. * wasm/WasmWorklist.cpp: (JSC::Wasm::Worklist::enqueue): * wasm/js/WebAssemblyInstanceConstructor.cpp: (JSC::constructJSWebAssemblyInstance): * wasm/js/WebAssemblyPrototype.cpp: (JSC::instantiate): 2017-04-05 Guilherme Iscaro Do not use BLX for immediates (ARM-32) https://bugs.webkit.org/show_bug.cgi?id=170351 Reviewed by Mark Lam. Currently the offline asm generator for 32-bit ARM code translates the 'call' meta-instruction (which may be found in LowLevelInterpreter.asm and friends) to the ARM's BLX instrunction. The BLX instruction may be used for labels (immediates) and registers and one side effect of BLX is that it may switch the processor's instruction set. A 'BLX register' instruction will change/remain the processor state to ARM if the register_bit[0] is set to 0 or change/remain to Thumb if register_bit[0] is set to 1. However, a 'BLX label' instruction will always switch the processor state. It switches ARM to thumb and vice-versa. This behaviour is unwanted, since the C++ code and the offlineasm generated code are both compiled using the same instruction set, thus a instruction set change will likely produce a crash. In order to fix the problem the BL instruction can be used for labels. It will branch just like BLX, but it won't change the instruction set. It's important to note that Darwin is not affected by this problem, thus to minimize the impact of this change the BL instruction will only be used on non-darwin targets. BLX reference: http://infocenter.arm.com/help/topic/com.arm.doc.dui0489i/CIHBJCDC.html?resultof=%22%62%6c%78%22%20 * offlineasm/arm.rb: 2017-04-05 Keith Miller WebAssembly: We shouldn't need to pin size registers if we have a fast memory. https://bugs.webkit.org/show_bug.cgi?id=170504 Reviewed by Mark Lam. * wasm/WasmB3IRGenerator.cpp: (JSC::Wasm::B3IRGenerator::B3IRGenerator): (JSC::Wasm::createJSToWasmWrapper): (JSC::Wasm::parseAndCompile): * wasm/WasmMemoryInformation.h: (JSC::Wasm::PinnedRegisterInfo::toSave): 2017-04-05 Yusuke Suzuki [JSC] Suppress warnings in GCC https://bugs.webkit.org/show_bug.cgi?id=170501 Reviewed by Keith Miller. Should use ASSERT_NOT_REACHED since return-type pragma is only enabled under ASSERT_DISABLED environment. We shoud use ASSERT_NOTREACHED to emit assertions in debug build. It effectively catches bugs while keeping performance in release build. * b3/B3Opcode.cpp: (JSC::B3::storeOpcode): * b3/B3Width.h: (JSC::B3::mask): * runtime/Options.cpp: (JSC::parse): * wasm/WasmSections.h: (JSC::Wasm::makeString): * wasm/WasmSignature.cpp: (JSC::Wasm::SignatureInformation::tryCleanup): * wasm/generateWasmValidateInlinesHeader.py: 2017-04-05 Carlos Garcia Campos Implement PromiseDeferredTimer for non CF based ports https://bugs.webkit.org/show_bug.cgi?id=170391 Reviewed by Yusuke Suzuki. RunLoop handling is only implemented for CF causing several wasm tests to fail for other ports. * jsc.cpp: (runJSC): Remove CF ifdefs. * runtime/PromiseDeferredTimer.cpp: (JSC::PromiseDeferredTimer::doWork): Add non CF implementation using WTF RunLoop. (JSC::PromiseDeferredTimer::runRunLoop): Ditto. * runtime/PromiseDeferredTimer.h: 2017-04-05 Carlos Garcia Campos WebAssembly: several tests added in r214504 crash when building with GCC https://bugs.webkit.org/show_bug.cgi?id=170390 Reviewed by Saam Barati. The pattern foo->bar([f = WTFMove(foo)]{}); crashes when building with GCC, I assume the move happens before the foo is used to invoke the function. * wasm/js/WebAssemblyPrototype.cpp: (JSC::webAssemblyCompileFunc): Use p.vm() instead of plan->vm(), because plan is moved by the lambda. (JSC::instantiate): Ditto. (JSC::compileAndInstantiate): Ditto. 2017-03-16 Yusuke Suzuki [JSC] Generate TemplateObjects at linking time https://bugs.webkit.org/show_bug.cgi?id=169743 Reviewed by Keith Miller. Currently, the code calls getTemplateObject to get appropriate template objects at runtime. But this template object is constant value and never changed. So instead of creating it at runtime, we should create it at linking time and store it in the constant registers. * builtins/BuiltinNames.h: * bytecode/CodeBlock.cpp: (JSC::CodeBlock::finishCreation): (JSC::CodeBlock::setConstantRegisters): * bytecode/CodeBlock.h: * bytecode/UnlinkedCodeBlock.cpp: (JSC::UnlinkedCodeBlock::shrinkToFit): * bytecode/UnlinkedCodeBlock.h: * bytecompiler/BytecodeGenerator.cpp: (JSC::BytecodeGenerator::addTemplateRegistryKeyConstant): (JSC::BytecodeGenerator::emitGetTemplateObject): * bytecompiler/BytecodeGenerator.h: * bytecompiler/NodesCodegen.cpp: (JSC::TaggedTemplateNode::emitBytecode): * runtime/JSGlobalObject.cpp: (JSC::JSGlobalObject::init): (JSC::getTemplateObject): Deleted. * runtime/JSTemplateRegistryKey.cpp: * runtime/JSTemplateRegistryKey.h: (JSC::isTemplateRegistryKey): 2017-04-04 Mark Lam On ARM64, DFG::SpeculativeJIT::compileArithMod() failed to ensure result is of DataFormatInt32. https://bugs.webkit.org/show_bug.cgi?id=170473 Reviewed by Saam Barati. In Unchecked mode, when DFG::SpeculativeJIT::compileArithMod() detects that the divisor is 0, we want it to return 0. The result is expected to be of DataFormatIn32. The ARM implementation just returns the value in the divisor register. However, the divisor in this case can be of DataFormatJSInt32. On ARM64, returning the divisor register yields the wrong result format because the same register also holds the upper 32-bit of the JSValue encoding. The fix is to return an immediate 0 instead. Also turned on the assertion in jitAssertIsInt32 for ARM64. This assertion being disabled may have contributed to this bug going unnoticed all this time. * dfg/DFGSpeculativeJIT.cpp: (JSC::DFG::SpeculativeJIT::compileArithMod): * jit/AssemblyHelpers.cpp: (JSC::AssemblyHelpers::jitAssertIsInt32): 2017-04-04 Filip Pizlo Air::eliminateDeadCode should not repeatedly process the same live instructions https://bugs.webkit.org/show_bug.cgi?id=170490 Reviewed by Keith Miller. This makes the eliminateDeadCode() fixpoint somewhat worklist-based: we track the set of Insts that might be dead. Every time we detect that one is live, we remove it from the set. This is a big (>2x) speed-up because lots of Insts are immediately found to be live. This is a ~1% wasm -O1 compile time progression. * b3/air/AirEliminateDeadCode.cpp: (JSC::B3::Air::eliminateDeadCode): 2017-04-04 Filip Pizlo Air::eliminateDeadCode() should not use a HashSet https://bugs.webkit.org/show_bug.cgi?id=170487 Reviewed by Saam Barati. Introduce TmpSet, which is like a HashSet. Use this to make eliminateDeadCode() about 50% faster, resulting in a 1% wasm -O1 compile time progression. * JavaScriptCore.xcodeproj/project.pbxproj: * b3/air/AirEliminateDeadCode.cpp: (JSC::B3::Air::eliminateDeadCode): * b3/air/AirTmpSet.h: Added. (JSC::B3::Air::TmpSet::TmpSet): (JSC::B3::Air::TmpSet::add): (JSC::B3::Air::TmpSet::remove): (JSC::B3::Air::TmpSet::contains): (JSC::B3::Air::TmpSet::size): (JSC::B3::Air::TmpSet::isEmpty): (JSC::B3::Air::TmpSet::iterator::iterator): (JSC::B3::Air::TmpSet::iterator::operator*): (JSC::B3::Air::TmpSet::iterator::operator++): (JSC::B3::Air::TmpSet::iterator::operator==): (JSC::B3::Air::TmpSet::iterator::operator!=): (JSC::B3::Air::TmpSet::begin): (JSC::B3::Air::TmpSet::end): 2017-04-04 Keith Miller WebAssembly: ModuleInformation should be a ref counted thing that can be shared across threads. https://bugs.webkit.org/show_bug.cgi?id=170478 Reviewed by Saam Barati. ModuleInformation has been moved to its own file and is now ThreadSafeRefCounted. All the Strings we used to keep in the ModuleInformation have been switched to Vector this has the advantage that it can be passed across threads. However, this does mean that we need to decode the utf8 strings in each thread. This is likely not a problem because: 1) most modules have few imports/exports/custom sections. 2) most of the time they are ascii so the conversion is cheap. 3) we only have to do it once per thread, and there shouldn't be too many. This patch also removes moduleSignatureIndicesToUniquedSignatureIndices since that information can already be recovered from the SignatureInformation. * JavaScriptCore.xcodeproj/project.pbxproj: * jsc.cpp: (functionTestWasmModuleFunctions): * runtime/Identifier.h: (JSC::Identifier::fromString): * wasm/WasmB3IRGenerator.cpp: (JSC::Wasm::parseAndCompile): * wasm/WasmB3IRGenerator.h: * wasm/WasmFormat.cpp: (JSC::Wasm::makeString): (JSC::Wasm::ModuleInformation::~ModuleInformation): Deleted. * wasm/WasmFormat.h: (JSC::Wasm::makeString): (JSC::Wasm::ModuleInformation::functionIndexSpaceSize): Deleted. (JSC::Wasm::ModuleInformation::isImportedFunctionFromFunctionIndexSpace): Deleted. (JSC::Wasm::ModuleInformation::signatureIndexFromFunctionIndexSpace): Deleted. (JSC::Wasm::ModuleInformation::importFunctionCount): Deleted. (JSC::Wasm::ModuleInformation::internalFunctionCount): Deleted. * wasm/WasmFunctionParser.h: (JSC::Wasm::FunctionParser::FunctionParser): * wasm/WasmModuleInformation.cpp: Copied from Source/JavaScriptCore/wasm/WasmValidate.h. (JSC::Wasm::ModuleInformation::~ModuleInformation): * wasm/WasmModuleInformation.h: Added. (JSC::Wasm::ModuleInformation::functionIndexSpaceSize): (JSC::Wasm::ModuleInformation::isImportedFunctionFromFunctionIndexSpace): (JSC::Wasm::ModuleInformation::signatureIndexFromFunctionIndexSpace): (JSC::Wasm::ModuleInformation::importFunctionCount): (JSC::Wasm::ModuleInformation::internalFunctionCount): (JSC::Wasm::ModuleInformation::ModuleInformation): * wasm/WasmModuleParser.cpp: * wasm/WasmModuleParser.h: (JSC::Wasm::ModuleParser::ModuleParser): * wasm/WasmParser.h: (JSC::Wasm::Parser::consumeUTF8String): * wasm/WasmPlan.cpp: (JSC::Wasm::Plan::Plan): (JSC::Wasm::Plan::parseAndValidateModule): (JSC::Wasm::Plan::prepare): (JSC::Wasm::Plan::compileFunctions): (JSC::Wasm::Plan::complete): (JSC::Wasm::Plan::cancel): * wasm/WasmPlan.h: (JSC::Wasm::Plan::internalFunctionCount): (JSC::Wasm::Plan::takeModuleInformation): * wasm/WasmSignature.cpp: (JSC::Wasm::SignatureInformation::get): * wasm/WasmSignature.h: * wasm/WasmValidate.cpp: (JSC::Wasm::validateFunction): * wasm/WasmValidate.h: * wasm/js/JSWebAssemblyHelpers.h: (JSC::createSourceBufferFromValue): * wasm/js/JSWebAssemblyModule.cpp: (JSC::JSWebAssemblyModule::createStub): (JSC::JSWebAssemblyModule::JSWebAssemblyModule): (JSC::JSWebAssemblyModule::finishCreation): * wasm/js/JSWebAssemblyModule.h: (JSC::JSWebAssemblyModule::moduleInformation): (JSC::JSWebAssemblyModule::source): * wasm/js/WebAssemblyInstanceConstructor.cpp: (JSC::constructJSWebAssemblyInstance): * wasm/js/WebAssemblyModuleConstructor.cpp: (JSC::WebAssemblyModuleConstructor::createModule): * wasm/js/WebAssemblyModulePrototype.cpp: (JSC::webAssemblyModuleProtoCustomSections): (JSC::webAssemblyModuleProtoImports): (JSC::webAssemblyModuleProtoExports): * wasm/js/WebAssemblyModuleRecord.cpp: (JSC::WebAssemblyModuleRecord::link): * wasm/js/WebAssemblyModuleRecord.h: * wasm/js/WebAssemblyPrototype.cpp: (JSC::webAssemblyCompileFunc): (JSC::instantiate): (JSC::compileAndInstantiate): 2017-04-04 Filip Pizlo B3::fixSSA() needs a tune-up https://bugs.webkit.org/show_bug.cgi?id=170485 Reviewed by Saam Barati. After the various optimizations to liveness, register allocation, and other phases, the fixSSA() phase now looks like one of the top offenders. This includes a bunch of changes to make this phase run faster. This is a ~7% wasm -O1 compile time progression. Here's what I did: - We now use IndexSparseSet instead of IndexMap for tracking variable values. This makes it cheaper to chew through small blocks while there is a non-trivial number of total variables. - We now do a "local SSA conversion" pass before anything else. This eliminates obvious Get's. If we were using temporary Variables, it would eliminate many of those. That's useful for when we use demoteValues() and duplciateTails(). For wasm -O1, we mainly care about the fact that it makes a bunch of Set's dead. - We now do a Set DCE pass after the local SSA but before SSA conversion. This ensures that any block-local live intervals of Variables disappear and don't need further consideration. - We now cache the reaching defs calculation. - We now perform the reaching defs calculation lazily. * b3/B3FixSSA.cpp: (JSC::B3::demoteValues): (JSC::B3::fixSSA): * b3/B3SSACalculator.cpp: (JSC::B3::SSACalculator::reachingDefAtTail): * b3/B3VariableLiveness.cpp: (JSC::B3::VariableLiveness::VariableLiveness): * b3/air/AirLiveness.h: (JSC::B3::Air::Liveness::Liveness): * dfg/DFGLivenessAnalysisPhase.cpp: (JSC::DFG::LivenessAnalysisPhase::LivenessAnalysisPhase): Deleted. (JSC::DFG::LivenessAnalysisPhase::run): Deleted. (JSC::DFG::LivenessAnalysisPhase::processBlock): Deleted. 2017-04-04 Joseph Pecoraro Remove stale LLVM Header Path includes from JavaScriptCore https://bugs.webkit.org/show_bug.cgi?id=170483 Reviewed by Mark Lam. * Configurations/Base.xcconfig: 2017-04-04 Filip Pizlo B3::LowerToAir incorrectly selects BitXor(AtomicStrongCAS(...), $1) https://bugs.webkit.org/show_bug.cgi?id=169867 Reviewed by Saam Barati. The BitXor(AtomicWeakCAS(...), $1) optimization makes a lot of sense because we an fold the BitXor into the CAS condition read-out. But there is no version of this that is profitable or correct for AtomicStrongCAS. The inversion case is handled by Equal(AtomicStrongCAS(...), ...) becoming NotEqual(AtomicStrongCAS(...), ...), and we alraedy handle that separately. So, the fix here is to make the BitXor CAS pattern only recognize AtomicWeakCAS. * b3/B3LowerToAir.cpp: (JSC::B3::Air::LowerToAir::lower): * b3/testb3.cpp: (JSC::B3::testAtomicStrongCAS): 2017-04-04 Saam Barati WebAssembly: JSWebAssemblyCallee should not be a JSCell https://bugs.webkit.org/show_bug.cgi?id=170135 Reviewed by Michael Saboff. This patch is perhaps the last big change to the design of fundamental Wasm API to allow for PIC. It changes JSWebAssemblyCallee into a thing called Wasm::Callee. It serves the same purpose as before, except Wasm::Callee is not a JSCell. I had to refactor the various parts of the runtime that will see CallFrame's with Wasm::Callee's in the callee slot. Thankfully, the parts of the runtime that Wasm touches are limited. The main refactoring is changing the exception handling code, such as taking a stack trace, to be friendly to seeing a non JSCell callee. The callee() function on ExecState now returns a class I added in this patch called CalleeBits. CalleeBits will tell you if the callee is a JSCell or a Wasm::Callee. We tag Wasm::Callee's with a 1 in their lower bit so we can easily tell what is and isn't a Wasm::Callee. The stub that calls out from Wasm to JS still puts a JSCell callee into the call frame, even though the callee logically represents a Wasm frame. The reason for this is that we use the call IC infrastructure to make a call out to JS code, and the code that writes the IC expects a JSCell as the callee. This is knowingly part of our design. When we do structured cloning of Wasm Modules, we'll need to regenerate these JS call stubs. * API/JSContextRef.cpp: (BacktraceFunctor::operator()): * CMakeLists.txt: * JavaScriptCore.xcodeproj/project.pbxproj: * debugger/Debugger.cpp: (JSC::Debugger::pauseIfNeeded): (JSC::Debugger::currentDebuggerCallFrame): * debugger/DebuggerCallFrame.cpp: (JSC::DebuggerCallFrame::create): (JSC::DebuggerCallFrame::DebuggerCallFrame): (JSC::DebuggerCallFrame::currentPosition): (JSC::DebuggerCallFrame::positionForCallFrame): * debugger/DebuggerCallFrame.h: * interpreter/CallFrame.cpp: (JSC::CallFrame::vmEntryGlobalObject): (JSC::CallFrame::wasmAwareLexicalGlobalObject): (JSC::CallFrame::isAnyWasmCallee): (JSC::CallFrame::callerSourceOrigin): * interpreter/CallFrame.h: (JSC::ExecState::calleeAsValue): (JSC::ExecState::jsCallee): (JSC::ExecState::callee): (JSC::ExecState::unsafeCallee): (JSC::ExecState::scope): (JSC::ExecState::iterate): * interpreter/CalleeBits.h: Added. (JSC::CalleeBits::CalleeBits): (JSC::CalleeBits::operator=): (JSC::CalleeBits::boxWasm): (JSC::CalleeBits::isWasm): (JSC::CalleeBits::isCell): (JSC::CalleeBits::asCell): (JSC::CalleeBits::asWasmCallee): (JSC::CalleeBits::rawPtr): * interpreter/Interpreter.cpp: (JSC::GetStackTraceFunctor::operator()): (JSC::Interpreter::getStackTrace): (JSC::notifyDebuggerOfUnwinding): (JSC::UnwindFunctor::UnwindFunctor): (JSC::UnwindFunctor::operator()): (JSC::UnwindFunctor::copyCalleeSavesToVMEntryFrameCalleeSavesBuffer): (JSC::Interpreter::unwind): (JSC::Interpreter::notifyDebuggerOfExceptionToBeThrown): * interpreter/Interpreter.h: * interpreter/Register.h: (JSC::Register::pointer): * interpreter/ShadowChicken.cpp: (JSC::ShadowChicken::update): * interpreter/ShadowChickenInlines.h: (JSC::ShadowChicken::iterate): * interpreter/StackVisitor.cpp: (JSC::StackVisitor::StackVisitor): (JSC::StackVisitor::readFrame): (JSC::StackVisitor::readNonInlinedFrame): (JSC::StackVisitor::readInlinedFrame): (JSC::StackVisitor::Frame::calleeSaveRegisters): (JSC::StackVisitor::Frame::functionName): (JSC::StackVisitor::Frame::dump): * interpreter/StackVisitor.h: (JSC::StackVisitor::Frame::callee): (JSC::StackVisitor::visit): * jit/Repatch.cpp: (JSC::linkFor): (JSC::linkPolymorphicCall): * jsc.cpp: (callWasmFunction): (functionTestWasmModuleFunctions): * runtime/ArrayPrototype.cpp: * runtime/Error.cpp: (JSC::addErrorInfoAndGetBytecodeOffset): * runtime/ErrorInstance.cpp: (JSC::ErrorInstance::finishCreation): * runtime/JSCell.cpp: (JSC::JSCell::isAnyWasmCallee): Deleted. * runtime/JSCell.h: * runtime/JSCellInlines.h: (JSC::ExecState::vm): * runtime/JSFunction.cpp: (JSC::RetrieveArgumentsFunctor::operator()): (JSC::RetrieveCallerFunctionFunctor::operator()): * runtime/JSGlobalObject.cpp: * runtime/SamplingProfiler.cpp: (JSC::FrameWalker::recordJSFrame): (JSC::SamplingProfiler::processUnverifiedStackTraces): * runtime/SamplingProfiler.h: (JSC::SamplingProfiler::UnprocessedStackFrame::UnprocessedStackFrame): * runtime/StackFrame.cpp: (JSC::StackFrame::sourceURL): (JSC::StackFrame::functionName): * runtime/StackFrame.h: (JSC::StackFrame::wasm): * runtime/VM.cpp: (JSC::VM::VM): (JSC::VM::throwException): * runtime/VM.h: * wasm/JSWebAssembly.h: * wasm/WasmB3IRGenerator.cpp: * wasm/WasmBinding.cpp: (JSC::Wasm::wasmToWasm): * wasm/WasmCallee.cpp: Copied from Source/JavaScriptCore/wasm/js/JSWebAssemblyCallee.cpp. (JSC::Wasm::Callee::Callee): (JSC::JSWebAssemblyCallee::JSWebAssemblyCallee): Deleted. (JSC::JSWebAssemblyCallee::finishCreation): Deleted. (JSC::JSWebAssemblyCallee::destroy): Deleted. * wasm/WasmCallee.h: Copied from Source/JavaScriptCore/wasm/js/JSWebAssemblyCallee.h. (JSC::Wasm::Callee::create): (JSC::JSWebAssemblyCallee::create): Deleted. (JSC::JSWebAssemblyCallee::createStructure): Deleted. (JSC::JSWebAssemblyCallee::entrypoint): Deleted. (JSC::JSWebAssemblyCallee::calleeSaveRegisters): Deleted. * wasm/WasmContext.h: * wasm/WasmPlan.cpp: * wasm/WasmPlan.h: * wasm/WasmPlanInlines.h: (JSC::Wasm::Plan::initializeCallees): * wasm/WasmThunks.cpp: (JSC::Wasm::throwExceptionFromWasmThunkGenerator): * wasm/js/JSWebAssemblyCallee.cpp: Removed. * wasm/js/JSWebAssemblyCallee.h: Removed. * wasm/js/JSWebAssemblyCodeBlock.cpp: (JSC::JSWebAssemblyCodeBlock::JSWebAssemblyCodeBlock): (JSC::JSWebAssemblyCodeBlock::initialize): (JSC::JSWebAssemblyCodeBlock::visitChildren): * wasm/js/JSWebAssemblyCodeBlock.h: (JSC::JSWebAssemblyCodeBlock::create): (JSC::JSWebAssemblyCodeBlock::jsEntrypointCalleeFromFunctionIndexSpace): (JSC::JSWebAssemblyCodeBlock::wasmEntrypointCalleeFromFunctionIndexSpace): (JSC::JSWebAssemblyCodeBlock::wasmToJsCallStubForImport): (JSC::JSWebAssemblyCodeBlock::offsetOfImportWasmToJSStub): (JSC::JSWebAssemblyCodeBlock::setJSEntrypointCallee): (JSC::JSWebAssemblyCodeBlock::setWasmEntrypointCallee): (JSC::JSWebAssemblyCodeBlock::offsetOfImportStubs): (JSC::JSWebAssemblyCodeBlock::allocationSize): (JSC::JSWebAssemblyCodeBlock::importWasmToJSStub): (JSC::JSWebAssemblyCodeBlock::callees): Deleted. (JSC::JSWebAssemblyCodeBlock::offsetOfCallees): Deleted. * wasm/js/JSWebAssemblyInstance.h: (JSC::JSWebAssemblyInstance::webAssemblyToJSCallee): * wasm/js/JSWebAssemblyModule.cpp: * wasm/js/WebAssemblyFunction.cpp: (JSC::callWebAssemblyFunction): (JSC::WebAssemblyFunction::create): (JSC::WebAssemblyFunction::WebAssemblyFunction): (JSC::WebAssemblyFunction::visitChildren): (JSC::WebAssemblyFunction::finishCreation): * wasm/js/WebAssemblyFunction.h: (JSC::WebAssemblyFunction::wasmEntrypoint): (JSC::WebAssemblyFunction::jsEntrypoint): (JSC::WebAssemblyFunction::offsetOfWasmEntrypoint): (JSC::WebAssemblyFunction::offsetOfWasmEntryPointCode): Deleted. * wasm/js/WebAssemblyModuleConstructor.cpp: * wasm/js/WebAssemblyModuleRecord.cpp: (JSC::WebAssemblyModuleRecord::link): (JSC::WebAssemblyModuleRecord::evaluate): 2017-04-04 Keith Miller WasmBench asserts in debug jsc https://bugs.webkit.org/show_bug.cgi?id=170462 Reviewed by Saam Barati. The assertion should have been an if. * wasm/WasmWorklist.cpp: 2017-04-04 Filip Pizlo Air::lowerAfterRegAlloc should bail early if it finds no Shuffles or ColdCCalls https://bugs.webkit.org/show_bug.cgi?id=170305 Reviewed by Saam Barati. This reduces and sometimes completely eliminates the need to run lowerAfterRegAlloc(). This lowers the Shuffle for the arguments of a CCall before register allocation unless the CCall arguments require a real shuffle (like if the CCall arguments were argument registers). This lowers a ColdCCall like a CCall for optLevel<2. Finally, lowerAfterRegAlloc() now checks if there are any Shuffles or CCalls before it does anything else. For wasm at -O1, this means that the phase doesn't run at all. This is a ~3% wasm -O1 compile time progression. To make this easy, I changed optLevel into a property of Procedure and Code rather than an argument we thread through everything. I like how Procedure and Code are dumping ground classes. This does not bother me. Note that I cloned optLevel into Procedure and Code so that it's cheap to query inside Air phases. * b3/B3Compile.cpp: (JSC::B3::compile): * b3/B3Compile.h: * b3/B3Generate.cpp: (JSC::B3::prepareForGeneration): (JSC::B3::generateToAir): * b3/B3Generate.h: * b3/B3Procedure.cpp: (JSC::B3::Procedure::setOptLevel): * b3/B3Procedure.h: (JSC::B3::Procedure::optLevel): * b3/air/AirCode.h: (JSC::B3::Air::Code::isPinned): (JSC::B3::Air::Code::setOptLevel): (JSC::B3::Air::Code::optLevel): * b3/air/AirEmitShuffle.cpp: (JSC::B3::Air::ShufflePair::bank): (JSC::B3::Air::ShufflePair::opcode): (JSC::B3::Air::ShufflePair::inst): (JSC::B3::Air::emitShuffle): * b3/air/AirEmitShuffle.h: (JSC::B3::Air::moveFor): * b3/air/AirGenerate.cpp: (JSC::B3::Air::prepareForGeneration): * b3/air/AirGenerate.h: * b3/air/AirLowerAfterRegAlloc.cpp: (JSC::B3::Air::lowerAfterRegAlloc): * b3/air/AirLowerMacros.cpp: (JSC::B3::Air::lowerMacros): * b3/testb3.cpp: (JSC::B3::compileProc): * wasm/WasmB3IRGenerator.cpp: (JSC::Wasm::parseAndCompile): 2017-04-04 Filip Pizlo Don't need to Air::reportUsedRegisters for wasm at -O1 https://bugs.webkit.org/show_bug.cgi?id=170459 Reviewed by Saam Barati. I did some refactorings to Liveness<> to try to understand its performance. Based on this I concluded that the bigger immediate issue is just removing unnecessary phases from -O1. This removes Air::reportUsedRegisters() from -O1 if the user has indicated that he is not interested in StackmapGenerationParams::usedRegisters(). The logic here is a bit weird because of how Air does spill code generation. The register allocator's spiller will emit spill code using identifiable spill slots, which allows subsequent phases to register-allocate the spill slots. We do this by a forward flow CSE phase called fixObviousSpills (which is a terrible name since there is no longer anything obvious about some of the spills that this phase can fix!). As is most natural for CSEs over 3AC, it rewires the uses of redundant computations rather than removing the redundant computations. This means that if a spill got "fixed", there may be either or both of the following: - Dead loads from the stack. - Dead stores to the stack. We know that a load from the stack is dead if the register is dead at the point of the load. We know that a store to the stack is dead if the spill slot is dead at the point of the store. Unfortunately, liveness analysis - over either registers or spill slots - is expensive. Fortunately, allocateStack() already does liveness analysis over spill slots. So, we baked elimination of stores to the stack into that phase. That aspect of clean-up after the spill CSE comes for free. Also fortunately for the FTL, we have to do reportUsedRegisters() anyway. This is a phase that enables StackmapGenerationParams::usedRegisters() to work, which then enables the FTL's patchpoints to do crazy slow-path live range splitting. So, Air's strategy for the load fix-up after spill CSE is to do it as part of reportUsedRegisters(). This patch introduces the Procedure::setNeedsUsedRegisters() API. But if you set needsUsedRegisters to false then we will still run reportUsedRegisters() at -O2 as an optimization - it removes dead loads from the stack that are left behind from fixObviousSpills(). This is a ~6% compile time progression at -O1. * b3/B3Procedure.h: (JSC::B3::Procedure::setNeedsUsedRegisters): (JSC::B3::Procedure::needsUsedRegisters): * b3/B3StackmapGenerationParams.h: * b3/B3VariableLiveness.cpp: (JSC::B3::VariableLiveness::VariableLiveness): * b3/air/AirCode.cpp: (JSC::B3::Air::Code::needsUsedRegisters): * b3/air/AirCode.h: * b3/air/AirGenerate.cpp: (JSC::B3::Air::prepareForGeneration): * b3/air/AirLiveness.h: (JSC::B3::Air::Liveness::Liveness): * wasm/WasmB3IRGenerator.cpp: (JSC::Wasm::parseAndCompile): 2017-04-03 Filip Pizlo Air liveness should build constraints and solve them rather than repeatedly parsing IR https://bugs.webkit.org/show_bug.cgi?id=170421 Reviewed by Saam Barati. Inst::forEach<> is expensive. The LivenessAdapter uses forEach with a particularly gnarly lambda that has many extra checks. Therefore, a lot of the time spent in liveness analysis is just recomputing forEach<> and that lambda to get uses and defs. This introduces LivenessConstraints<>, which is a liveness constraint system based on Adapter. It basically caches the results of doing forEach. It'll give you the uses and defs at each instruction boundary. This is a ~5% compile time progression at optLevel=1. It's also a ~3% compile time progression at optLevel=2. * JavaScriptCore.xcodeproj/project.pbxproj: * b3/air/AirLivenessAdapter.h: (JSC::B3::Air::LivenessAdapter::LivenessAdapter): (JSC::B3::Air::LivenessAdapter::forEachUse): (JSC::B3::Air::LivenessAdapter::forEachDef): * b3/air/AirLivenessConstraints.h: Added. (JSC::B3::Air::LivenessConstraints::Actions::Actions): (JSC::B3::Air::LivenessConstraints::LivenessConstraints): (JSC::B3::Air::LivenessConstraints::at): 2017-04-03 Mark Lam Fix incorrect capacity delta calculation reported in SparseArrayValueMap::add(). https://bugs.webkit.org/show_bug.cgi?id=170412 Reviewed by Filip Pizlo. Here's an example of code that will trigger underflow in the "deprecatedExtraMemory" reported by SparseArrayValueMap::add() that is added to Heap::m_deprecatedExtraMemorySize: arr = new Array; Object.defineProperty(arr, 18, ({writable: true, configurable: true})); for (var i = 0; i < 3; ++i) { Array.prototype.push.apply(arr, ["", () => {}, {}]); Array.prototype.sort.apply(arr, [() => {}, []]); } However, Heap::m_deprecatedExtraMemorySize is only 1 of 3 values that are added up to form the result of Heap::extraMemorySize(). Heap::m_extraMemorySize and Heap::m_arrayBuffers.size() are the other 2. While Heap::m_arrayBuffers.size() is bounded by actual allocated memory, both Heap::m_deprecatedExtraMemorySize and Heap::m_extraMemorySize are added to without any bounds checks, and they are only reset to 0 at the start of a full GC. As a result, if we have a long sequence of eden GCs with a lot of additions to Heap::m_extraMemorySize and/or Heap::m_deprecatedExtraMemorySize, then these values could theoretically overflow. Coupling this with the underflow from SparseArrayValueMap::add(), the result for Heap::extraMemorySize() can easily overflow. Note: Heap::extraMemorySize() is used to compute the value currentHeapSize. If multiple conditions line up just right, the above overflows can result in this debug assertion failure during an eden GC: ASSERT(currentHeapSize >= m_sizeAfterLastCollect); Otherwise, the effects of the overflows will only result in the computed currentHeapSize not being representative of actual memory usage, and therefore, a full GC may be triggered earlier or later than is ideal. This patch ensures that SparseArrayValueMap::add() cannot underflow Heap::m_deprecatedExtraMemorySize. It also adds overflows checks in the calculations of Heap::m_deprecatedExtraMemorySize, Heap::m_extraMemorySize, and Heap::extraMemorySize() so that their values are saturated appropriately to ensure that GC collections are triggered based on representative memory usage. * heap/Heap.cpp: (JSC::Heap::deprecatedReportExtraMemorySlowCase): (JSC::Heap::extraMemorySize): (JSC::Heap::updateAllocationLimits): (JSC::Heap::reportExtraMemoryVisited): * runtime/SparseArrayValueMap.cpp: (JSC::SparseArrayValueMap::add): 2017-04-03 Filip Pizlo Move the Liveness<> adapters from AirLiveness.h to AirLivenessAdapter.h. Rubber stamped by Keith Miller. This will make it easier to write other code that uses those adapters. * JavaScriptCore.xcodeproj/project.pbxproj: * b3/air/AirLiveness.h: (JSC::B3::Air::LivenessAdapter::LivenessAdapter): Deleted. (JSC::B3::Air::LivenessAdapter::blockSize): Deleted. (JSC::B3::Air::LivenessAdapter::forEachUse): Deleted. (JSC::B3::Air::LivenessAdapter::forEachDef): Deleted. (JSC::B3::Air::TmpLivenessAdapter::TmpLivenessAdapter): Deleted. (JSC::B3::Air::TmpLivenessAdapter::numIndices): Deleted. (JSC::B3::Air::TmpLivenessAdapter::acceptsBank): Deleted. (JSC::B3::Air::TmpLivenessAdapter::acceptsRole): Deleted. (JSC::B3::Air::TmpLivenessAdapter::valueToIndex): Deleted. (JSC::B3::Air::TmpLivenessAdapter::indexToValue): Deleted. (JSC::B3::Air::StackSlotLivenessAdapter::StackSlotLivenessAdapter): Deleted. (JSC::B3::Air::StackSlotLivenessAdapter::numIndices): Deleted. (JSC::B3::Air::StackSlotLivenessAdapter::acceptsBank): Deleted. (JSC::B3::Air::StackSlotLivenessAdapter::acceptsRole): Deleted. (JSC::B3::Air::StackSlotLivenessAdapter::valueToIndex): Deleted. (JSC::B3::Air::StackSlotLivenessAdapter::indexToValue): Deleted. * b3/air/AirLivenessAdapter.h: Added. (JSC::B3::Air::LivenessAdapter::LivenessAdapter): (JSC::B3::Air::LivenessAdapter::blockSize): (JSC::B3::Air::LivenessAdapter::forEachUse): (JSC::B3::Air::LivenessAdapter::forEachDef): (JSC::B3::Air::TmpLivenessAdapter::TmpLivenessAdapter): (JSC::B3::Air::TmpLivenessAdapter::numIndices): (JSC::B3::Air::TmpLivenessAdapter::acceptsBank): (JSC::B3::Air::TmpLivenessAdapter::acceptsRole): (JSC::B3::Air::TmpLivenessAdapter::valueToIndex): (JSC::B3::Air::TmpLivenessAdapter::indexToValue): (JSC::B3::Air::StackSlotLivenessAdapter::StackSlotLivenessAdapter): (JSC::B3::Air::StackSlotLivenessAdapter::numIndices): (JSC::B3::Air::StackSlotLivenessAdapter::acceptsBank): (JSC::B3::Air::StackSlotLivenessAdapter::acceptsRole): (JSC::B3::Air::StackSlotLivenessAdapter::valueToIndex): (JSC::B3::Air::StackSlotLivenessAdapter::indexToValue): 2017-04-03 Filip Pizlo WTF::Liveness should have an API that focuses on actions at instruction boundaries https://bugs.webkit.org/show_bug.cgi?id=170407 Reviewed by Keith Miller. Adopt changes to the WTF::Liveness<> API. Instead of having separate functions for the early/late versions of uses and defs, we now have just a use/def API. Those automatically take care of eary/late issues as needed. This reduces the API surface between WTF::Liveness<> and its clients, which makes it easier to implement some other optimizations I'm thinking about. * b3/B3VariableLiveness.h: (JSC::B3::VariableLivenessAdapter::forEachUse): (JSC::B3::VariableLivenessAdapter::forEachDef): (JSC::B3::VariableLivenessAdapter::forEachEarlyUse): Deleted. (JSC::B3::VariableLivenessAdapter::forEachLateUse): Deleted. (JSC::B3::VariableLivenessAdapter::forEachEarlyDef): Deleted. (JSC::B3::VariableLivenessAdapter::forEachLateDef): Deleted. * b3/air/AirLiveness.h: (JSC::B3::Air::LivenessAdapter::blockSize): (JSC::B3::Air::LivenessAdapter::forEachUse): (JSC::B3::Air::LivenessAdapter::forEachDef): (JSC::B3::Air::LivenessAdapter::forEachEarlyUse): Deleted. (JSC::B3::Air::LivenessAdapter::forEachLateUse): Deleted. (JSC::B3::Air::LivenessAdapter::forEachEarlyDef): Deleted. (JSC::B3::Air::LivenessAdapter::forEachLateDef): Deleted. 2017-04-03 Filip Pizlo Inst::forEachArg could compile to more compact code https://bugs.webkit.org/show_bug.cgi?id=170406 Reviewed by Sam Weinig. Prior to this change, Inst::forEachArg compiled to a ginormous ALWAYS_INLINE switch statement. It had one case for each opcode, and then each of those cases would have a switch statement over the number of operands. Then the cases of that switch statement would have a sequence of calls to the passed lambda. This meant that every user of forEachArg would generate an insane amount of code. It also meant that the inlining achieved nothing, since the lambda would surely then not be inlined - and if it was, then the icache pressure due to code bloat would surely negate any benefits. This replaces that code with a loop over a compact look-up table. We use the opcode and number of operands as keys into that look-up table. The table only takes about 20KB. It has one byte for each argument in each overload of each opcode. I can't measure any reproducible change in performance, but the JavaScriptCore framework binary shrinks by 2.7 MB. This is a 15% reduction in JavaScriptCore binary size. * JavaScriptCore.xcodeproj/project.pbxproj: * b3/B3Width.h: * b3/air/AirCustom.h: (JSC::B3::Air::PatchCustom::forEachArg): * b3/air/AirFormTable.h: Added. (JSC::B3::Air::decodeFormRole): (JSC::B3::Air::decodeFormBank): (JSC::B3::Air::decodeFormWidth): * b3/air/AirInst.h: * b3/air/opcode_generator.rb: 2017-04-03 Keith Miller WebAssembly: remove lastAllocatedMode from Memory https://bugs.webkit.org/show_bug.cgi?id=170405 Reviewed by Mark Lam. It's not used anymore so there isn't any point in keeping it around. * wasm/WasmMemory.cpp: (JSC::Wasm::Memory::createImpl): (JSC::Wasm::Memory::lastAllocatedMode): Deleted. * wasm/WasmMemory.h: 2017-04-03 Zan Dobersek [jsc] Add patchableJumpSize() for MIPS https://bugs.webkit.org/show_bug.cgi?id=169716 Reviewed by Yusuke Suzuki. * assembler/MIPSAssembler.h: (JSC::MIPSAssembler::patchableJumpSize): Added. * assembler/MacroAssemblerMIPS.h: (JSC::MacroAssemblerMIPS::patchableJumpSize): Added. 2017-04-03 Guillaume Emont [jsc] implement MIPSAssembler::relinkJumpToNop() https://bugs.webkit.org/show_bug.cgi?id=169720 Reviewed by Yusuke Suzuki. * assembler/MIPSAssembler.h: (JSC::MIPSAssembler::relinkJumpToNop): Added. 2017-04-02 Carlos Garcia Campos Share implementation of JSRunLoopTimer::timerDidFire https://bugs.webkit.org/show_bug.cgi?id=170392 Reviewed by Michael Catanzaro. The code is cross-platform but it's duplicated in CF and GLib implementations, it could be shared instead. * runtime/JSRunLoopTimer.cpp: (JSC::JSRunLoopTimer::timerDidFire): Move common implementation here. (JSC::JSRunLoopTimer::setRunLoop): Use timerDidFireCallback. (JSC::JSRunLoopTimer::timerDidFireCallback): Call JSRunLoopTimer::timerDidFire(). * runtime/JSRunLoopTimer.h: 2017-04-01 Oleksandr Skachkov Object with numerical keys with gaps gets filled by NaN values https://bugs.webkit.org/show_bug.cgi?id=164412 Reviewed by Mark Lam. This patch fixes issue when object have two properties with name as number. The issue appears when during invoking convertDoubleToArrayStorage, array is filled by pNaN and method converting it to real NaN. This happeneds because a pNaN in a Double array is a hole, and Double arrays cannot have NaN values. To fix issue we need to check value and clear it if it pNaN. * runtime/JSObject.cpp: (JSC::JSObject::convertDoubleToArrayStorage): 2017-03-31 Saam Barati WebAssembly: Make our calls out to JS PIC friendly https://bugs.webkit.org/show_bug.cgi?id=170261 Reviewed by Keith Miller. This patch removes a direct call from the module to the Wasm to JS stub. Instead, we do an indirect call to the stub by loading the stub's executable address off of the CodeBlock. This is to make the code we emit for comply with requirements needed for PIC. Adding this indirection is not ideal. Although this patch is neutral on WasmBench, we really want to get back to a world where we have an IC call infrastructure. This patch is obviously a regression on some types of programs. I've filed this bug to make sure we implement a PIC compliant Wasm to JS call IC: https://bugs.webkit.org/show_bug.cgi?id=170375 * wasm/WasmB3IRGenerator.cpp: * wasm/WasmFormat.h: * wasm/WasmPlan.cpp: (JSC::Wasm::Plan::complete): * wasm/js/JSWebAssemblyCodeBlock.cpp: (JSC::JSWebAssemblyCodeBlock::initialize): * wasm/js/JSWebAssemblyCodeBlock.h: (JSC::JSWebAssemblyCodeBlock::create): (JSC::JSWebAssemblyCodeBlock::offsetOfImportWasmToJSStub): (JSC::JSWebAssemblyCodeBlock::offsetOfCallees): (JSC::JSWebAssemblyCodeBlock::allocationSize): (JSC::JSWebAssemblyCodeBlock::importWasmToJSStub): * wasm/js/JSWebAssemblyInstance.cpp: (JSC::JSWebAssemblyInstance::addUnitializedCodeBlock): * wasm/js/JSWebAssemblyInstance.h: (JSC::JSWebAssemblyInstance::offsetOfCodeBlock): 2017-03-31 Keith Miller WebAssembly: webAssemblyB3OptimizationLevel should use defaultB3OptLevel by default https://bugs.webkit.org/show_bug.cgi?id=170378 Reviewed by Saam Barati. * runtime/Options.h: * wasm/WasmB3IRGenerator.h: 2017-03-31 Keith Miller WebAssembly: Add compilation level option https://bugs.webkit.org/show_bug.cgi?id=170374 Reviewed by Mark Lam. This patch adds an option, webAssemblyB3OptimizationLevel, which changes the optimization mode wasm passes to B3. * runtime/Options.h: * wasm/WasmPlan.cpp: (JSC::Wasm::Plan::compileFunctions): 2017-03-31 Saam Barati WebAssembly: Strip WasmParser and WasmFunctionParser from knowing about VM https://bugs.webkit.org/show_bug.cgi?id=170312 Reviewed by Mark Lam. This is another step towards PIC-ifying Wasm. This patch removes the VM field that is no longer used. * wasm/WasmB3IRGenerator.cpp: (JSC::Wasm::parseAndCompile): * wasm/WasmB3IRGenerator.h: * wasm/WasmFunctionParser.h: (JSC::Wasm::FunctionParser::FunctionParser): * wasm/WasmModuleParser.h: (JSC::Wasm::ModuleParser::ModuleParser): * wasm/WasmParser.h: (JSC::Wasm::Parser::Parser): * wasm/WasmPlan.cpp: (JSC::Wasm::Plan::parseAndValidateModule): (JSC::Wasm::Plan::compileFunctions): * wasm/WasmValidate.cpp: (JSC::Wasm::validateFunction): * wasm/WasmValidate.h: 2017-03-31 Saam Barati WebAssembly: Ref count Signature and SignatureInformation should not care about VM https://bugs.webkit.org/show_bug.cgi?id=170316 Reviewed by Keith Miller. This is yet again another step towards PIC-ifying Wasm. Signature should be ref counted so we can tell when no code is holding onto a Signature. This makes it easy to free unused Signatures. Also, this patch rids SignatureInfo of any VM knowledge. Now, there is just a single SignatureInfo that lives in a process. * runtime/VM.h: * wasm/WasmB3IRGenerator.cpp: (JSC::Wasm::createJSToWasmWrapper): (JSC::Wasm::parseAndCompile): * wasm/WasmB3IRGenerator.h: * wasm/WasmBinding.cpp: (JSC::Wasm::wasmToJs): * wasm/WasmCallingConvention.h: (JSC::Wasm::CallingConvention::loadArguments): * wasm/WasmFormat.h: * wasm/WasmFunctionParser.h: (JSC::Wasm::FunctionParser::FunctionParser): * wasm/WasmModuleParser.cpp: * wasm/WasmPlan.cpp: (JSC::Wasm::Plan::parseAndValidateModule): (JSC::Wasm::Plan::compileFunctions): (JSC::Wasm::Plan::complete): * wasm/WasmSignature.cpp: (JSC::Wasm::Signature::hash): (JSC::Wasm::Signature::tryCreate): (JSC::Wasm::SignatureInformation::SignatureInformation): (JSC::Wasm::SignatureInformation::singleton): (JSC::Wasm::SignatureInformation::adopt): (JSC::Wasm::SignatureInformation::get): (JSC::Wasm::SignatureInformation::tryCleanup): (JSC::Wasm::Signature::create): Deleted. (JSC::Wasm::Signature::createInvalid): Deleted. (JSC::Wasm::Signature::destroy): Deleted. (JSC::Wasm::SignatureInformation::~SignatureInformation): Deleted. * wasm/WasmSignature.h: (JSC::Wasm::Signature::allocatedSize): (JSC::Wasm::Signature::operator==): * wasm/WasmValidate.cpp: (JSC::Wasm::validateFunction): * wasm/WasmValidate.h: * wasm/js/JSWebAssemblyModule.cpp: (JSC::JSWebAssemblyModule::destroy): * wasm/js/WebAssemblyFunction.cpp: (JSC::callWebAssemblyFunction): * wasm/js/WebAssemblyFunction.h: * wasm/js/WebAssemblyModuleRecord.cpp: (JSC::WebAssemblyModuleRecord::link): (JSC::WebAssemblyModuleRecord::evaluate): * wasm/js/WebAssemblyWrapperFunction.cpp: (JSC::WebAssemblyWrapperFunction::create): * wasm/js/WebAssemblyWrapperFunction.h: 2017-03-31 Mark Lam Array.prototype.splice() should not be using JSArray::tryCreateForInitializationPrivate(). https://bugs.webkit.org/show_bug.cgi?id=170303 Reviewed by Filip Pizlo. This is because it needs to call getProperty() later to get the values for initializing the array. getProperty() can execute arbitrary code and potentially trigger the GC. This is not allowed for clients of JSArray::tryCreateForInitializationPrivate(). * runtime/ArrayPrototype.cpp: (JSC::arrayProtoFuncSplice): (JSC::copySplicedArrayElements): Deleted. 2017-03-31 Oleksandr Skachkov String.prototype.replace incorrectly applies "special replacement parameters" when passed a function https://bugs.webkit.org/show_bug.cgi?id=170151 Reviewed by Saam Barati. This patch fixes issue for String.prototype.replace when passed a function with special symbols "$$". It happeneds because substituteBackreferences applies unconditionally, but according to the spec it should be applied only for text 21.1.3.16.8 https://tc39.github.io/ecma262/#sec-string.prototype.replace * runtime/StringPrototype.cpp: (JSC::replaceUsingStringSearch): 2017-03-30 Saam Barati WebAssembly: When Wasm calls to C, it should use Wasm::Context* instead of ExecState* to get VM https://bugs.webkit.org/show_bug.cgi?id=170185 Reviewed by Michael Saboff. This is one more step in the direction of PIC-ified Wasm. When we lift WasmCallee above VM, we will no longer be able to get VM from ExecState*. This patch ensures that we don't do that from within the Wasm runtime. Instead, we use the Wasm::Context* to get the VM. This patch also adds a new class, Wasm::Thunks. There is a single Wasm::Thunks that lives in the process. It is responsible for generating a thunk that Wasm relies on. The only such thunk right now is the exception throwing thunk. This patch also rids WasmFaultSignalHandler from any knowledge of VM. Previously, it relied on VM to get the exception handling thunk. The only part of the Wasm runtime that will be allowed to get VM& from ExecState will be WasmBinding. In the future, we plan to keep the calls out to JS to keep a JSCell as the callee. * JavaScriptCore.xcodeproj/project.pbxproj: * dfg/DFGOSREntry.cpp: (JSC::DFG::prepareOSREntry): * ftl/FTLOSRExitCompiler.cpp: (JSC::FTL::compileStub): * interpreter/Interpreter.cpp: (JSC::UnwindFunctor::copyCalleeSavesToVMEntryFrameCalleeSavesBuffer): * jit/AssemblyHelpers.cpp: (JSC::AssemblyHelpers::restoreCalleeSavesFromVMEntryFrameCalleeSavesBuffer): (JSC::AssemblyHelpers::copyCalleeSavesToVMEntryFrameCalleeSavesBufferImpl): * jit/AssemblyHelpers.h: (JSC::AssemblyHelpers::copyCalleeSavesToVMEntryFrameCalleeSavesBuffer): * jit/ThunkGenerators.cpp: (JSC::throwExceptionFromWasmThunkGenerator): Deleted. * jit/ThunkGenerators.h: * runtime/InitializeThreading.cpp: (JSC::initializeThreading): * runtime/VM.cpp: (JSC::VM::VM): (JSC::VM::getAllCalleeSaveRegisterOffsets): * runtime/VM.h: (JSC::VM::topVMEntryFrameOffset): (JSC::VM::getAllCalleeSaveRegisterOffsets): Deleted. * wasm/WasmB3IRGenerator.cpp: (JSC::Wasm::B3IRGenerator::emitExceptionCheck): * wasm/WasmFaultSignalHandler.cpp: (JSC::Wasm::trapHandler): * wasm/WasmMemory.cpp: (JSC::Wasm::tryGetFastMemory): * wasm/WasmThunks.cpp: Added. (JSC::Wasm::throwExceptionFromWasmThunkGenerator): (JSC::Wasm::Thunks::initialize): (JSC::Wasm::Thunks::singleton): (JSC::Wasm::Thunks::stub): (JSC::Wasm::Thunks::existingStub): * wasm/WasmThunks.h: Added. * wasm/js/JSWebAssemblyInstance.cpp: (JSC::JSWebAssemblyInstance::JSWebAssemblyInstance): * wasm/js/JSWebAssemblyInstance.h: (JSC::JSWebAssemblyInstance::offsetOfVM): * wasm/js/JSWebAssemblyMemory.cpp: (JSC::JSWebAssemblyMemory::grow): * wasm/js/JSWebAssemblyMemory.h: * wasm/js/WebAssemblyMemoryPrototype.cpp: (JSC::webAssemblyMemoryProtoFuncGrow): 2017-03-30 Mark Lam IntlObject should not be using JSArray::initializeIndex(). https://bugs.webkit.org/show_bug.cgi?id=170302 Reviewed by Saam Barati. JSArray::initializeIndex() is only meant to be used with arrays created using JSArray::tryCreateForInitializationPrivate() under very constrained conditions. * runtime/IntlObject.cpp: (JSC::canonicalizeLocaleList): (JSC::intlObjectFuncGetCanonicalLocales): 2017-03-30 Filip Pizlo Air should support linear scan for optLevel<2 https://bugs.webkit.org/show_bug.cgi?id=170161 Reviewed by Saam Barati. This changes the default opt level of B3 to 2. It makes the other opt levels useful by adding a new register allocator. This new linear scan allocator will produce significantly worse code. But it will produce that code a lot faster than IRC or Briggs. The opt levels are: 0: no optimizations, linear scan 1: some optimizations, linear scan 2: full optimizations, graph coloring (IRC or Briggs based on CPU) What we used to call optLevel=1 is not called optLevel=2, or better yet, optLevel=B3::defaultOptLevel(). We no longer have anything like the old optLevel=0 (which did no optimizations but ran graph coloring). allocateRegistersByLinearScan() faithfully implements Massimiliano Poletto and Vivek Sarkar's famous algorithm. It uses the variant that handles clobbered registers by avoiding assigning ranges to those registers if the range overlaps a clobber. It's engineered to allocate registers very quickly and generate inefficient code without falling off a cliff. The new optLevel=1 speeds up B3 by a factor of 2, and results in a 80% throughput regression. Linear scan runs 4.7x faster than graph coloring on average. * CMakeLists.txt: * JavaScriptCore.xcodeproj/project.pbxproj: * b3/B3BasicBlockUtils.h: (JSC::B3::blocksInPreOrder): (JSC::B3::blocksInPostOrder): * b3/B3BlockWorklist.h: * b3/B3CFG.h: (JSC::B3::CFG::newMap): * b3/B3Common.h: (JSC::B3::defaultOptLevel): * b3/B3Compile.h: * b3/B3DuplicateTails.cpp: * b3/B3EliminateCommonSubexpressions.cpp: * b3/B3FixSSA.cpp: (JSC::B3::demoteValues): (JSC::B3::fixSSA): * b3/B3FixSSA.h: * b3/B3Generate.cpp: (JSC::B3::prepareForGeneration): (JSC::B3::generateToAir): * b3/B3Generate.h: * b3/B3HeapRange.cpp: Removed. * b3/B3HeapRange.h: (JSC::B3::HeapRange::HeapRange): Deleted. (JSC::B3::HeapRange::top): Deleted. (JSC::B3::HeapRange::operator==): Deleted. (JSC::B3::HeapRange::operator!=): Deleted. (JSC::B3::HeapRange::operator|): Deleted. (JSC::B3::HeapRange::operator bool): Deleted. (JSC::B3::HeapRange::begin): Deleted. (JSC::B3::HeapRange::end): Deleted. (JSC::B3::HeapRange::overlaps): Deleted. * b3/B3LowerToAir.cpp: * b3/B3MoveConstants.cpp: * b3/B3PhiChildren.h: * b3/B3Procedure.cpp: (JSC::B3::Procedure::dump): (JSC::B3::Procedure::deleteOrphans): (JSC::B3::Procedure::setBlockOrderImpl): * b3/B3ReduceDoubleToFloat.cpp: * b3/B3ReduceStrength.cpp: * b3/B3SSACalculator.h: * b3/B3UseCounts.h: * b3/air/AirAllocateRegistersByGraphColoring.cpp: * b3/air/AirAllocateRegistersByLinearScan.cpp: Added. (JSC::B3::Air::allocateRegistersByLinearScan): * b3/air/AirAllocateRegistersByLinearScan.h: Added. * b3/air/AirAllocateStack.cpp: (JSC::B3::Air::allocateStack): * b3/air/AirArg.cpp: (WTF::printInternal): * b3/air/AirArg.h: (JSC::B3::Air::Arg::activeAt): (JSC::B3::Air::Arg::timing): (JSC::B3::Air::Arg::forEachPhase): * b3/air/AirBasicBlock.h: * b3/air/AirBlockWorklist.h: * b3/air/AirCFG.h: (JSC::B3::Air::CFG::newMap): * b3/air/AirEliminateDeadCode.cpp: (JSC::B3::Air::eliminateDeadCode): * b3/air/AirFixObviousSpills.cpp: * b3/air/AirFixPartialRegisterStalls.cpp: (JSC::B3::Air::fixPartialRegisterStalls): * b3/air/AirFixSpillsAfterTerminals.cpp: Added. (JSC::B3::Air::fixSpillsAfterTerminals): * b3/air/AirFixSpillsAfterTerminals.h: Added. * b3/air/AirGenerate.cpp: (JSC::B3::Air::prepareForGeneration): (JSC::B3::Air::generate): * b3/air/AirGenerate.h: * b3/air/AirGenerationContext.h: * b3/air/AirInsertionSet.h: * b3/air/AirInst.cpp: (JSC::B3::Air::Inst::needsPadding): * b3/air/AirLowerAfterRegAlloc.cpp: (JSC::B3::Air::lowerAfterRegAlloc): * b3/air/AirLowerEntrySwitch.cpp: (JSC::B3::Air::lowerEntrySwitch): * b3/air/AirOpcode.opcodes: * b3/air/AirPhaseInsertionSet.cpp: Added. (JSC::B3::Air::PhaseInsertionSet::execute): * b3/air/AirPhaseInsertionSet.h: Added. (JSC::B3::Air::PhaseInsertion::PhaseInsertion): (JSC::B3::Air::PhaseInsertion::phase): (JSC::B3::Air::PhaseInsertion::operator<): (JSC::B3::Air::PhaseInsertionSet::PhaseInsertionSet): (JSC::B3::Air::PhaseInsertionSet::appendInsertion): (JSC::B3::Air::PhaseInsertionSet::insertInst): (JSC::B3::Air::PhaseInsertionSet::insert): * b3/air/AirRegLiveness.h: (JSC::B3::Air::RegLiveness::LocalCalc::LocalCalc): * b3/air/AirSpillEverything.cpp: (JSC::B3::Air::spillEverything): * b3/air/AirTmp.cpp: * b3/air/AirTmp.h: (JSC::B3::Air::Tmp::tmpForIndex): * b3/air/AirTmpInlines.h: (JSC::B3::Air::Tmp::Indexed::Indexed): (JSC::B3::Air::Tmp::Indexed::index): (JSC::B3::Air::Tmp::AbsolutelyIndexed::AbsolutelyIndexed): (JSC::B3::Air::Tmp::AbsolutelyIndexed::index): (JSC::B3::Air::Tmp::indexed): (JSC::B3::Air::Tmp::absolutelyIndexed): (JSC::B3::Air::Tmp::tmpForAbsoluteIndex): * b3/testb3.cpp: (JSC::B3::compile): (JSC::B3::testMulLoadTwice): * jit/RegisterSet.h: (JSC::RegisterSet::add): (JSC::RegisterSet::remove): * runtime/Options.h: * wasm/WasmB3IRGenerator.h: 2017-03-30 Youenn Fablet Clean up RTCDataChannel https://bugs.webkit.org/show_bug.cgi?id=169732 Reviewed by Chris Dumez. * runtime/CommonIdentifiers.h: Adding RTCDataChannelEvent. 2017-03-30 Saam Barati WebAssembly: pass Wasm::Context* to vmEntryToWasm when not using fast TLS https://bugs.webkit.org/show_bug.cgi?id=170182 Reviewed by Mark Lam. This is one more step in the direction of PIC-ified Wasm. I'm removing assumptions that a wasm callee is a cell. We used to use the callee to get the WasmContext off the callee's VM. Instead, this patch makes it so that we pass in the context as a parameter to the JS entrypoint. * heap/MarkedBlock.h: (JSC::MarkedBlock::offsetOfVM): Deleted. * jit/AssemblyHelpers.cpp: (JSC::AssemblyHelpers::loadWasmContext): (JSC::AssemblyHelpers::storeWasmContext): (JSC::AssemblyHelpers::loadWasmContextNeedsMacroScratchRegister): (JSC::AssemblyHelpers::storeWasmContextNeedsMacroScratchRegister): * jsc.cpp: (functionTestWasmModuleFunctions): * runtime/VM.h: (JSC::VM::wasmContextOffset): Deleted. * wasm/WasmB3IRGenerator.cpp: (JSC::Wasm::B3IRGenerator::materializeWasmContext): (JSC::Wasm::B3IRGenerator::restoreWasmContext): (JSC::Wasm::B3IRGenerator::B3IRGenerator): (JSC::Wasm::createJSToWasmWrapper): * wasm/WasmContext.cpp: (JSC::Wasm::loadContext): (JSC::Wasm::storeContext): (JSC::loadWasmContext): Deleted. (JSC::storeWasmContext): Deleted. * wasm/WasmContext.h: (JSC::Wasm::useFastTLS): (JSC::Wasm::useFastTLSForContext): * wasm/WasmMemoryInformation.cpp: (JSC::Wasm::PinnedRegisterInfo::get): * wasm/WasmMemoryInformation.h: (JSC::Wasm::useFastTLS): Deleted. (JSC::Wasm::useFastTLSForWasmContext): Deleted. * wasm/js/WebAssemblyFunction.cpp: (JSC::callWebAssemblyFunction): 2017-03-30 JF Bastien WebAssembly: fix misc JS API implementation inconsistencies https://bugs.webkit.org/show_bug.cgi?id=170187 Reviewed by Keith Miller. Auto-generate lookup tables. Methods should be on prototype. Exception returns should be idiomatic. * wasm/JSWebAssembly.cpp: validate / compile / instantiate should be on the prototype (JSC::JSWebAssembly::create): (JSC::JSWebAssembly::finishCreation): (JSC::reject): Deleted. (JSC::webAssemblyCompileFunc): Deleted. (JSC::resolve): Deleted. (JSC::instantiate): Deleted. (JSC::compileAndInstantiate): Deleted. (JSC::webAssemblyInstantiateFunc): Deleted. (JSC::webAssemblyValidateFunc): Deleted. * wasm/JSWebAssembly.h: * wasm/js/WebAssemblyMemoryPrototype.cpp: move from JSWebAssembly.cpp (JSC::webAssemblyMemoryProtoFuncBuffer): (JSC::WebAssemblyMemoryPrototype::create): (JSC::WebAssemblyMemoryPrototype::finishCreation): * wasm/js/WebAssemblyMemoryPrototype.h: * wasm/js/WebAssemblyPrototype.cpp: (JSC::reject): (JSC::webAssemblyCompileFunc): (JSC::resolve): (JSC::instantiate): (JSC::compileAndInstantiate): (JSC::webAssemblyInstantiateFunc): (JSC::webAssemblyValidateFunc): (JSC::webAssemblyFunctionValidate): Deleted. (JSC::webAssemblyFunctionCompile): Deleted. * wasm/js/WebAssemblyTablePrototype.cpp: (JSC::webAssemblyTableProtoFuncGrow): (JSC::webAssemblyTableProtoFuncGet): (JSC::webAssemblyTableProtoFuncSet): (JSC::WebAssemblyTablePrototype::create): (JSC::WebAssemblyTablePrototype::finishCreation): * wasm/js/WebAssemblyTablePrototype.h: 2017-03-29 Keith Miller Unreviewed, fix the build, again. Hopefully for the last time, again! * runtime/Options.cpp: 2017-03-29 Keith Miller Unreviewed, fix the build, again. Hopefully for the last time! * runtime/Options.cpp: (JSC::parse): 2017-03-29 Keith Miller Unreviewed, windows build fix. * runtime/Options.cpp: (JSC::parse): 2017-03-29 Keith Miller WebAssembly: B3IRGenerator should pool constants https://bugs.webkit.org/show_bug.cgi?id=170266 Reviewed by Filip Pizlo. This patch adds a HashMap to B3IRGenerator that contains all the constants used in a function. B3IRGenerator then uses an InsertionSet to add all those constants to the root BB. This doesn't appear to be a compile time improvement but it could be valuable in the future. * b3/B3Opcode.h: (JSC::B3::opcodeForConstant): * b3/B3Procedure.cpp: (JSC::B3::Procedure::addConstant): * b3/B3Procedure.h: * wasm/WasmB3IRGenerator.cpp: (JSC::Wasm::B3IRGenerator::B3IRGenerator): (JSC::Wasm::B3IRGenerator::constant): (JSC::Wasm::B3IRGenerator::insertConstants): (JSC::Wasm::B3IRGenerator::addConstant): (JSC::Wasm::B3IRGenerator::dump): (JSC::Wasm::parseAndCompile): (JSC::Wasm::B3IRGenerator::emitChecksForModOrDiv): (JSC::Wasm::B3IRGenerator::zeroForType): Deleted. * wasm/generateWasmB3IRGeneratorInlinesHeader.py: (generateConstCode): 2017-03-29 Saam Barati LinkBuffer and ExecutableAllocator shouldn't have anything to do with VM https://bugs.webkit.org/show_bug.cgi?id=170210 Reviewed by Mark Lam. This is one more step in the direction of PIC-ified Wasm. LinkBuffer and ExecutableAllocator have no business knowing about VM. * assembler/LinkBuffer.cpp: (JSC::LinkBuffer::allocate): * assembler/LinkBuffer.h: (JSC::LinkBuffer::LinkBuffer): (JSC::LinkBuffer::vm): Deleted. * b3/B3Compile.cpp: (JSC::B3::compile): * b3/B3Compile.h: * b3/air/testair.cpp: * b3/testb3.cpp: (JSC::B3::compileProc): (JSC::B3::compileAndRun): (JSC::B3::testLoadAcq42): (JSC::B3::testAddArgZeroImmZDef): (JSC::B3::testAddLoadTwice): (JSC::B3::testMulLoadTwice): (JSC::B3::testMulAddArgsLeft): (JSC::B3::testMulAddArgsRight): (JSC::B3::testMulAddArgsLeft32): (JSC::B3::testMulAddArgsRight32): (JSC::B3::testMulSubArgsLeft): (JSC::B3::testMulSubArgsRight): (JSC::B3::testMulSubArgsLeft32): (JSC::B3::testMulSubArgsRight32): (JSC::B3::testMulNegArgs): (JSC::B3::testMulNegArgs32): (JSC::B3::testCompareFloatToDoubleThroughPhi): (JSC::B3::testDoubleToFloatThroughPhi): (JSC::B3::testReduceFloatToDoubleValidates): (JSC::B3::testDoubleProducerPhiToFloatConversion): (JSC::B3::testDoubleProducerPhiToFloatConversionWithDoubleConsumer): (JSC::B3::testDoubleProducerPhiWithNonFloatConst): (JSC::B3::testIToD64Arg): (JSC::B3::testIToF64Arg): (JSC::B3::testIToD32Arg): (JSC::B3::testIToF32Arg): (JSC::B3::testIToD64Mem): (JSC::B3::testIToF64Mem): (JSC::B3::testIToD32Mem): (JSC::B3::testIToF32Mem): (JSC::B3::testIToDReducedToIToF64Arg): (JSC::B3::testIToDReducedToIToF32Arg): (JSC::B3::testStoreRelAddLoadAcq32): (JSC::B3::testStoreRelAddLoadAcq8): (JSC::B3::testStoreRelAddFenceLoadAcq8): (JSC::B3::testStoreRelAddLoadAcq16): (JSC::B3::testStoreRelAddLoadAcq64): (JSC::B3::testBranch): (JSC::B3::testBranchPtr): (JSC::B3::testDiamond): (JSC::B3::testBranchNotEqual): (JSC::B3::testBranchNotEqualCommute): (JSC::B3::testBranchNotEqualNotEqual): (JSC::B3::testBranchEqual): (JSC::B3::testBranchEqualEqual): (JSC::B3::testBranchEqualCommute): (JSC::B3::testBranchEqualEqual1): (JSC::B3::testBranchLoadPtr): (JSC::B3::testBranchLoad32): (JSC::B3::testBranchLoad8S): (JSC::B3::testBranchLoad8Z): (JSC::B3::testBranchLoad16S): (JSC::B3::testBranchLoad16Z): (JSC::B3::testBranch8WithLoad8ZIndex): (JSC::B3::testComplex): (JSC::B3::testSimpleCheck): (JSC::B3::testCheckFalse): (JSC::B3::testCheckTrue): (JSC::B3::testCheckLessThan): (JSC::B3::testCheckMegaCombo): (JSC::B3::testCheckTrickyMegaCombo): (JSC::B3::testCheckTwoMegaCombos): (JSC::B3::testCheckTwoNonRedundantMegaCombos): (JSC::B3::testCheckAddImm): (JSC::B3::testCheckAddImmCommute): (JSC::B3::testCheckAddImmSomeRegister): (JSC::B3::testCheckAdd): (JSC::B3::testCheckAdd64): (JSC::B3::testCheckAddFold): (JSC::B3::testCheckAddFoldFail): (JSC::B3::testCheckAddSelfOverflow64): (JSC::B3::testCheckAddSelfOverflow32): (JSC::B3::testCheckSubImm): (JSC::B3::testCheckSubBadImm): (JSC::B3::testCheckSub): (JSC::B3::testCheckSub64): (JSC::B3::testCheckSubFold): (JSC::B3::testCheckSubFoldFail): (JSC::B3::testCheckNeg): (JSC::B3::testCheckNeg64): (JSC::B3::testCheckMul): (JSC::B3::testCheckMulMemory): (JSC::B3::testCheckMul2): (JSC::B3::testCheckMul64): (JSC::B3::testCheckMulFold): (JSC::B3::testCheckMulFoldFail): (JSC::B3::testCheckMul64SShr): (JSC::B3::testSwitch): (JSC::B3::testSwitchChillDiv): (JSC::B3::testSwitchTargettingSameBlock): (JSC::B3::testSwitchTargettingSameBlockFoldPathConstant): (JSC::B3::testBasicSelect): (JSC::B3::testSelectTest): (JSC::B3::testSelectCompareDouble): (JSC::B3::testSelectDouble): (JSC::B3::testSelectDoubleTest): (JSC::B3::testSelectDoubleCompareDouble): (JSC::B3::testSelectFloatCompareFloat): (JSC::B3::testSelectFold): (JSC::B3::testSelectInvert): (JSC::B3::testCheckSelect): (JSC::B3::testCheckSelectCheckSelect): (JSC::B3::testCheckSelectAndCSE): (JSC::B3::testTrivialInfiniteLoop): (JSC::B3::testFoldPathEqual): (JSC::B3::testLShiftSelf32): (JSC::B3::testRShiftSelf32): (JSC::B3::testURShiftSelf32): (JSC::B3::testLShiftSelf64): (JSC::B3::testRShiftSelf64): (JSC::B3::testURShiftSelf64): (JSC::B3::testPatchpointDoubleRegs): (JSC::B3::testSpillDefSmallerThanUse): (JSC::B3::testSpillUseLargerThanDef): (JSC::B3::testLateRegister): (JSC::B3::testInterpreter): (JSC::B3::testEntrySwitchSimple): (JSC::B3::testEntrySwitchNoEntrySwitch): (JSC::B3::testEntrySwitchWithCommonPaths): (JSC::B3::testEntrySwitchWithCommonPathsAndNonTrivialEntrypoint): (JSC::B3::testEntrySwitchLoop): (JSC::B3::testSomeEarlyRegister): (JSC::B3::testTerminalPatchpointThatNeedsToBeSpilled): (JSC::B3::testTerminalPatchpointThatNeedsToBeSpilled2): (JSC::B3::testPatchpointTerminalReturnValue): (JSC::B3::testMemoryFence): (JSC::B3::testStoreFence): (JSC::B3::testLoadFence): (JSC::B3::testPCOriginMapDoesntInsertNops): (JSC::B3::testPinRegisters): (JSC::B3::testX86LeaAddAddShlLeft): (JSC::B3::testX86LeaAddAddShlRight): (JSC::B3::testX86LeaAddAdd): (JSC::B3::testX86LeaAddShlRight): (JSC::B3::testX86LeaAddShlLeftScale1): (JSC::B3::testX86LeaAddShlLeftScale2): (JSC::B3::testX86LeaAddShlLeftScale4): (JSC::B3::testX86LeaAddShlLeftScale8): (JSC::B3::testAddShl32): (JSC::B3::testAddShl64): (JSC::B3::testAddShl65): (JSC::B3::testLoadBaseIndexShift2): (JSC::B3::testLoadBaseIndexShift32): (JSC::B3::testOptimizeMaterialization): (JSC::B3::testAtomicWeakCAS): (JSC::B3::testAtomicStrongCAS): (JSC::B3::testAtomicXchg): (JSC::B3::testDepend32): (JSC::B3::testDepend64): (JSC::B3::testWasmBoundsCheck): (JSC::B3::testWasmAddress): (JSC::B3::run): (JSC::B3::compile): Deleted. * bytecode/PolymorphicAccess.cpp: (JSC::PolymorphicAccess::regenerate): * dfg/DFGJITCompiler.cpp: (JSC::DFG::JITCompiler::compile): (JSC::DFG::JITCompiler::compileFunction): * dfg/DFGLazyJSValue.cpp: (JSC::DFG::LazyJSValue::emit): * dfg/DFGOSRExitCompiler.cpp: * dfg/DFGSpeculativeJIT32_64.cpp: (JSC::DFG::SpeculativeJIT::emitCall): * dfg/DFGSpeculativeJIT64.cpp: (JSC::DFG::SpeculativeJIT::emitCall): * dfg/DFGThunks.cpp: (JSC::DFG::osrExitGenerationThunkGenerator): (JSC::DFG::osrEntryThunkGenerator): * ftl/FTLCompile.cpp: (JSC::FTL::compile): * ftl/FTLLazySlowPath.cpp: (JSC::FTL::LazySlowPath::generate): * ftl/FTLLink.cpp: (JSC::FTL::link): * ftl/FTLLowerDFGToB3.cpp: (JSC::FTL::DFG::LowerDFGToB3::compileCallOrConstruct): (JSC::FTL::DFG::LowerDFGToB3::compileTailCall): (JSC::FTL::DFG::LowerDFGToB3::compileCallOrConstructVarargsSpread): (JSC::FTL::DFG::LowerDFGToB3::compileCallOrConstructVarargs): (JSC::FTL::DFG::LowerDFGToB3::compileCallEval): * ftl/FTLOSRExitCompiler.cpp: (JSC::FTL::compileStub): * ftl/FTLOSRExitHandle.cpp: (JSC::FTL::OSRExitHandle::emitExitThunk): * ftl/FTLSlowPathCall.cpp: (JSC::FTL::SlowPathCallContext::makeCall): * ftl/FTLSlowPathCall.h: (JSC::FTL::callOperation): * ftl/FTLState.h: * ftl/FTLThunks.cpp: (JSC::FTL::genericGenerationThunkGenerator): (JSC::FTL::slowPathCallThunkGenerator): * ftl/FTLThunks.h: (JSC::FTL::generateIfNecessary): (JSC::FTL::Thunks::getSlowPathCallThunk): * jit/AssemblyHelpers.cpp: (JSC::AssemblyHelpers::emitDumbVirtualCall): * jit/AssemblyHelpers.h: * jit/ExecutableAllocator.cpp: (JSC::ExecutableAllocator::initializeAllocator): (JSC::ExecutableAllocator::singleton): (JSC::ExecutableAllocator::ExecutableAllocator): (JSC::ExecutableAllocator::allocate): * jit/ExecutableAllocator.h: * jit/JIT.cpp: (JSC::JIT::compileWithoutLinking): * jit/JITCall.cpp: (JSC::JIT::compileCallEvalSlowCase): * jit/JITMathIC.h: (JSC::JITMathIC::generateOutOfLine): * jit/JITOpcodes.cpp: (JSC::JIT::privateCompileHasIndexedProperty): * jit/JITOpcodes32_64.cpp: (JSC::JIT::privateCompileHasIndexedProperty): * jit/JITOperations.cpp: * jit/JITOperations.h: * jit/JITPropertyAccess.cpp: (JSC::JIT::stringGetByValStubGenerator): (JSC::JIT::privateCompileGetByVal): (JSC::JIT::privateCompileGetByValWithCachedId): (JSC::JIT::privateCompilePutByVal): (JSC::JIT::privateCompilePutByValWithCachedId): * jit/JITPropertyAccess32_64.cpp: (JSC::JIT::stringGetByValStubGenerator): * jit/JITStubRoutine.h: * jit/Repatch.cpp: (JSC::ftlThunkAwareRepatchCall): (JSC::linkPolymorphicCall): * jit/SpecializedThunkJIT.h: (JSC::SpecializedThunkJIT::finalize): * jit/ThunkGenerators.cpp: (JSC::throwExceptionFromCallSlowPathGenerator): (JSC::linkCallThunkGenerator): (JSC::linkPolymorphicCallThunkGenerator): (JSC::virtualThunkFor): (JSC::nativeForGenerator): (JSC::arityFixupGenerator): (JSC::unreachableGenerator): (JSC::boundThisNoArgsFunctionCallGenerator): (JSC::throwExceptionFromWasmThunkGenerator): * llint/LLIntThunks.cpp: (JSC::LLInt::generateThunkWithJumpTo): * runtime/SamplingProfiler.cpp: (JSC::SamplingProfiler::takeSample): * runtime/VM.cpp: (JSC::VM::VM): * runtime/VM.h: * runtime/VMTraps.cpp: (JSC::VMTraps::tryInstallTrapBreakpoints): * tools/VMInspector.cpp: * wasm/WasmBinding.cpp: (JSC::Wasm::wasmToJs): (JSC::Wasm::wasmToWasm): (JSC::Wasm::exitStubGenerator): * wasm/WasmPlan.cpp: (JSC::Wasm::Plan::complete): * yarr/YarrJIT.cpp: (JSC::Yarr::YarrGenerator::compile): (JSC::Yarr::jitCompile): 2017-03-29 Keith Miller WebAssembly: Worklist should periodically check in to see if there are higher priority jobs to do. https://bugs.webkit.org/show_bug.cgi?id=170204 Reviewed by Saam Barati. This patch makes it so that Wasm::Plan's compileFunctions method can return periodically to its caller. The main use for this is if a user asynchronously compiles a wasm module then later synchronously compiles another module. In this case we want to be able to pause compilation of other worklists. This patch also adds support for size_t Options. * runtime/Options.cpp: (JSC::parse): (JSC::Option::dump): (JSC::Option::operator==): * runtime/Options.h: * wasm/WasmPlan.cpp: (JSC::Wasm::Plan::moveToState): (JSC::Wasm::Plan::ThreadCountHolder::~ThreadCountHolder): (JSC::Wasm::Plan::compileFunctions): * wasm/WasmPlan.h: * wasm/WasmWorklist.cpp: 2017-03-29 Mark Lam Remove obsolete references to HeapTimer in JavaScriptCore.order. https://bugs.webkit.org/show_bug.cgi?id=170252 Reviewed by Saam Barati. The HeapTimer was renamed to JSRunLoopTimer back in r214504. These HeapTimer entries are now no longer meaningful. * JavaScriptCore.order: 2017-03-29 JF Bastien WebAssembly: add shell-only Memory mode helper https://bugs.webkit.org/show_bug.cgi?id=170227 Reviewed by Mark Lam. * jsc.cpp: (GlobalObject::finishCreation): (functionWebAssemblyMemoryMode): * wasm/WasmMemory.h: * wasm/js/JSWebAssemblyInstance.h: * wasm/js/JSWebAssemblyMemory.h: 2017-03-29 Keith Miller WebAssembly: pack OpcodeOrigin to fit in a pointer https://bugs.webkit.org/show_bug.cgi?id=170244 Reviewed by Michael Saboff. This patch makes it so we don't have to have allocate the OpcodeOrigin and can just pack all the data into the pointer B3::Origin already has. * wasm/WasmB3IRGenerator.cpp: (JSC::Wasm::parseAndCompile): * wasm/WasmOpcodeOrigin.cpp: (JSC::Wasm::OpcodeOrigin::dump): * wasm/WasmOpcodeOrigin.h: (JSC::Wasm::OpcodeOrigin::OpcodeOrigin): (JSC::Wasm::OpcodeOrigin::opcode): (JSC::Wasm::OpcodeOrigin::location): 2017-03-29 JF Bastien WebAssembly: NFC s/goto/lambda/g https://bugs.webkit.org/show_bug.cgi?id=170242 Reviewed by Mark Lam. Lambdas are more in-style than the goto I just used. * wasm/WasmMemory.cpp: (JSC::Wasm::tryGetFastMemory): 2017-03-28 Saam Barati AssemblyHelpers should not have a VM field https://bugs.webkit.org/show_bug.cgi?id=170207 Reviewed by Yusuke Suzuki. APIs that need VM should take one as a parameter. When doing position independent code for Wasm, we can't tie code generation to a VM. * b3/B3Compile.cpp: (JSC::B3::compile): * b3/air/testair.cpp: * b3/testb3.cpp: (JSC::B3::testEntrySwitchSimple): (JSC::B3::testEntrySwitchNoEntrySwitch): (JSC::B3::testEntrySwitchWithCommonPaths): (JSC::B3::testEntrySwitchWithCommonPathsAndNonTrivialEntrypoint): (JSC::B3::testEntrySwitchLoop): * bytecode/AccessCase.cpp: (JSC::AccessCase::generateWithGuard): (JSC::AccessCase::generateImpl): * bytecode/DOMJITAccessCasePatchpointParams.cpp: (JSC::SlowPathCallGeneratorWithArguments::generateImpl): * bytecode/InlineAccess.cpp: (JSC::InlineAccess::dumpCacheSizesAndCrash): (JSC::InlineAccess::generateSelfPropertyAccess): (JSC::InlineAccess::generateSelfPropertyReplace): (JSC::InlineAccess::generateArrayLength): (JSC::InlineAccess::rewireStubAsJump): * bytecode/InlineAccess.h: * bytecode/PolymorphicAccess.cpp: (JSC::AccessGenerationState::emitExplicitExceptionHandler): (JSC::PolymorphicAccess::regenerate): * bytecode/PolymorphicAccess.h: (JSC::AccessGenerationState::AccessGenerationState): * dfg/DFGJITCompiler.cpp: (JSC::DFG::JITCompiler::JITCompiler): (JSC::DFG::JITCompiler::compileExceptionHandlers): (JSC::DFG::JITCompiler::link): (JSC::DFG::JITCompiler::compile): (JSC::DFG::JITCompiler::compileFunction): (JSC::DFG::JITCompiler::exceptionCheck): * dfg/DFGJITCompiler.h: (JSC::DFG::JITCompiler::exceptionCheckWithCallFrameRollback): (JSC::DFG::JITCompiler::fastExceptionCheck): (JSC::DFG::JITCompiler::vm): * dfg/DFGOSRExitCompiler.cpp: * dfg/DFGOSRExitCompiler.h: * dfg/DFGOSRExitCompiler32_64.cpp: (JSC::DFG::OSRExitCompiler::compileExit): * dfg/DFGOSRExitCompiler64.cpp: (JSC::DFG::OSRExitCompiler::compileExit): * dfg/DFGOSRExitCompilerCommon.cpp: (JSC::DFG::adjustAndJumpToTarget): * dfg/DFGOSRExitCompilerCommon.h: * dfg/DFGSpeculativeJIT.cpp: (JSC::DFG::SpeculativeJIT::emitAllocateRawObject): (JSC::DFG::SpeculativeJIT::checkArray): (JSC::DFG::SpeculativeJIT::compileCurrentBlock): (JSC::DFG::SpeculativeJIT::compileInstanceOfForObject): (JSC::DFG::SpeculativeJIT::compileMakeRope): (JSC::DFG::SpeculativeJIT::compileGetGlobalObject): (JSC::DFG::SpeculativeJIT::compileNewFunctionCommon): (JSC::DFG::SpeculativeJIT::compileCreateActivation): (JSC::DFG::SpeculativeJIT::compileCreateDirectArguments): (JSC::DFG::SpeculativeJIT::compileSpread): (JSC::DFG::SpeculativeJIT::compileArraySlice): (JSC::DFG::SpeculativeJIT::compileNukeStructureAndSetButterfly): (JSC::DFG::SpeculativeJIT::compileNewStringObject): (JSC::DFG::SpeculativeJIT::compileNewTypedArray): (JSC::DFG::SpeculativeJIT::compileStoreBarrier): * dfg/DFGSpeculativeJIT.h: (JSC::DFG::SpeculativeJIT::emitAllocateJSObjectWithKnownSize): (JSC::DFG::SpeculativeJIT::emitAllocateJSObject): (JSC::DFG::SpeculativeJIT::emitAllocateVariableSizedJSObject): (JSC::DFG::SpeculativeJIT::emitAllocateDestructibleObject): * dfg/DFGSpeculativeJIT32_64.cpp: (JSC::DFG::SpeculativeJIT::emitCall): (JSC::DFG::SpeculativeJIT::compileLogicalNot): (JSC::DFG::SpeculativeJIT::emitBranch): (JSC::DFG::SpeculativeJIT::compile): * dfg/DFGSpeculativeJIT64.cpp: (JSC::DFG::SpeculativeJIT::nonSpeculativeNonPeepholeCompareNullOrUndefined): (JSC::DFG::SpeculativeJIT::nonSpeculativePeepholeBranchNullOrUndefined): (JSC::DFG::SpeculativeJIT::emitCall): (JSC::DFG::SpeculativeJIT::compileObjectOrOtherLogicalNot): (JSC::DFG::SpeculativeJIT::compileLogicalNot): (JSC::DFG::SpeculativeJIT::emitObjectOrOtherBranch): (JSC::DFG::SpeculativeJIT::emitBranch): (JSC::DFG::SpeculativeJIT::compile): (JSC::DFG::SpeculativeJIT::compileAllocateNewArrayWithSize): * dfg/DFGThunks.cpp: (JSC::DFG::osrEntryThunkGenerator): * ftl/FTLCompile.cpp: (JSC::FTL::compile): * ftl/FTLJITFinalizer.h: * ftl/FTLLazySlowPath.cpp: (JSC::FTL::LazySlowPath::generate): * ftl/FTLLazySlowPathCall.h: (JSC::FTL::createLazyCallGenerator): * ftl/FTLLink.cpp: (JSC::FTL::link): * ftl/FTLLowerDFGToB3.cpp: (JSC::FTL::DFG::LowerDFGToB3::lower): (JSC::FTL::DFG::LowerDFGToB3::compileCreateActivation): (JSC::FTL::DFG::LowerDFGToB3::compileNewFunction): (JSC::FTL::DFG::LowerDFGToB3::compileCreateDirectArguments): (JSC::FTL::DFG::LowerDFGToB3::compileNewTypedArray): (JSC::FTL::DFG::LowerDFGToB3::compileMakeRope): (JSC::FTL::DFG::LowerDFGToB3::compileNotifyWrite): (JSC::FTL::DFG::LowerDFGToB3::compileCallOrConstructVarargsSpread): (JSC::FTL::DFG::LowerDFGToB3::compileCallOrConstructVarargs): (JSC::FTL::DFG::LowerDFGToB3::compileCallEval): (JSC::FTL::DFG::LowerDFGToB3::compileIsObjectOrNull): (JSC::FTL::DFG::LowerDFGToB3::compileIsFunction): (JSC::FTL::DFG::LowerDFGToB3::compileMaterializeNewObject): (JSC::FTL::DFG::LowerDFGToB3::compileMaterializeCreateActivation): (JSC::FTL::DFG::LowerDFGToB3::compileCheckTraps): (JSC::FTL::DFG::LowerDFGToB3::allocatePropertyStorageWithSizeImpl): (JSC::FTL::DFG::LowerDFGToB3::allocateObject): (JSC::FTL::DFG::LowerDFGToB3::allocateJSArray): (JSC::FTL::DFG::LowerDFGToB3::buildTypeOf): * ftl/FTLOSRExitCompiler.cpp: (JSC::FTL::compileStub): * ftl/FTLSlowPathCall.h: (JSC::FTL::callOperation): * ftl/FTLState.h: (JSC::FTL::State::vm): * ftl/FTLThunks.cpp: (JSC::FTL::genericGenerationThunkGenerator): (JSC::FTL::slowPathCallThunkGenerator): * jit/AssemblyHelpers.cpp: (JSC::AssemblyHelpers::jitReleaseAssertNoException): (JSC::AssemblyHelpers::callExceptionFuzz): (JSC::AssemblyHelpers::emitJumpIfException): (JSC::AssemblyHelpers::emitExceptionCheck): (JSC::AssemblyHelpers::emitNonPatchableExceptionCheck): (JSC::AssemblyHelpers::emitLoadStructure): (JSC::AssemblyHelpers::emitRandomThunk): (JSC::AssemblyHelpers::restoreCalleeSavesFromVMEntryFrameCalleeSavesBuffer): (JSC::AssemblyHelpers::emitConvertValueToBoolean): (JSC::AssemblyHelpers::debugCall): * jit/AssemblyHelpers.h: (JSC::AssemblyHelpers::AssemblyHelpers): (JSC::AssemblyHelpers::codeBlock): (JSC::AssemblyHelpers::copyCalleeSavesToVMEntryFrameCalleeSavesBuffer): (JSC::AssemblyHelpers::copyCalleeSavesFromFrameOrRegisterToVMEntryFrameCalleeSavesBuffer): (JSC::AssemblyHelpers::barrierBranch): (JSC::AssemblyHelpers::barrierStoreLoadFence): (JSC::AssemblyHelpers::mutatorFence): (JSC::AssemblyHelpers::storeButterfly): (JSC::AssemblyHelpers::nukeStructureAndStoreButterfly): (JSC::AssemblyHelpers::jumpIfMutatorFenceNotNeeded): (JSC::AssemblyHelpers::emitAllocateJSObjectWithKnownSize): (JSC::AssemblyHelpers::emitAllocateJSObject): (JSC::AssemblyHelpers::emitAllocateVariableSizedCell): (JSC::AssemblyHelpers::emitAllocateVariableSizedJSObject): (JSC::AssemblyHelpers::emitAllocateDestructibleObject): (JSC::AssemblyHelpers::vm): Deleted. (JSC::AssemblyHelpers::debugCall): Deleted. * jit/CCallHelpers.cpp: (JSC::CCallHelpers::ensureShadowChickenPacket): * jit/CCallHelpers.h: (JSC::CCallHelpers::CCallHelpers): (JSC::CCallHelpers::jumpToExceptionHandler): * jit/JIT.cpp: (JSC::JIT::emitEnterOptimizationCheck): (JSC::JIT::privateCompileExceptionHandlers): * jit/JIT.h: (JSC::JIT::exceptionCheck): (JSC::JIT::exceptionCheckWithCallFrameRollback): * jit/JITMathIC.h: (JSC::JITMathIC::generateOutOfLine): * jit/JITOpcodes.cpp: (JSC::JIT::emit_op_instanceof): (JSC::JIT::emit_op_is_undefined): (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_throw): (JSC::JIT::emit_op_catch): (JSC::JIT::emit_op_eq_null): (JSC::JIT::emit_op_neq_null): (JSC::JIT::emitSlow_op_loop_hint): (JSC::JIT::emit_op_log_shadow_chicken_prologue): (JSC::JIT::emit_op_log_shadow_chicken_tail): * jit/JITOpcodes32_64.cpp: (JSC::JIT::privateCompileCTINativeCall): (JSC::JIT::emit_op_new_object): (JSC::JIT::emit_op_jfalse): (JSC::JIT::emit_op_jtrue): (JSC::JIT::emit_op_throw): (JSC::JIT::emit_op_catch): (JSC::JIT::emit_op_create_this): (JSC::JIT::emit_op_log_shadow_chicken_prologue): (JSC::JIT::emit_op_log_shadow_chicken_tail): * jit/JITPropertyAccess.cpp: (JSC::JIT::emitWriteBarrier): * jit/JSInterfaceJIT.h: (JSC::JSInterfaceJIT::JSInterfaceJIT): (JSC::JSInterfaceJIT::vm): * jit/Repatch.cpp: (JSC::tryCacheGetByID): (JSC::tryCachePutByID): (JSC::linkPolymorphicCall): (JSC::resetGetByID): (JSC::resetPutByID): * jit/SetupVarargsFrame.cpp: (JSC::emitSetupVarargsFrameFastCase): * jit/SetupVarargsFrame.h: * jit/SpecializedThunkJIT.h: (JSC::SpecializedThunkJIT::loadArgumentWithSpecificClass): * jit/ThunkGenerators.cpp: (JSC::throwExceptionFromCallSlowPathGenerator): (JSC::linkCallThunkGenerator): (JSC::linkPolymorphicCallThunkGenerator): (JSC::virtualThunkFor): (JSC::nativeForGenerator): (JSC::randomThunkGenerator): (JSC::boundThisNoArgsFunctionCallGenerator): (JSC::throwExceptionFromWasmThunkGenerator): * wasm/WasmB3IRGenerator.cpp: (JSC::Wasm::parseAndCompile): * wasm/WasmBinding.cpp: (JSC::Wasm::wasmToJs): (JSC::Wasm::wasmToWasm): 2017-03-28 Keith Miller WebAssembly: We should have Origins https://bugs.webkit.org/show_bug.cgi?id=170217 Reviewed by Mark Lam. This patch adds wasm origins for B3::Values, called OpcodeOrigin. Currently, OpcodeOrigin just tracks the original opcode and the location of that opcode. Here's a sample: BB#0: ; frequency = 1.000000 Int64 @4 = Patchpoint(generator = 0x10f487fa8, earlyClobbered = [], lateClobbered = [], usedRegisters = [], resultConstraint = SomeRegister) Int64 @5 = FramePointer() Void @8 = Store(@4, @5, offset = 24, ControlDependent|Writes:Top) Int64 @10 = Const64(0) Void @12 = Store($0(@10), @5, offset = 16, ControlDependent|Writes:Top) Int64 @13 = Patchpoint(generator = 0x10f4be7f0, earlyClobbered = [], lateClobbered = [], usedRegisters = [], resultConstraint = SomeRegister, ExitsSideways|ControlDependent|WritesPinned|ReadsPinned|Fence|Writes:Top|Reads:Top) Int64 @16 = ArgumentReg(%rdi) Int64 @18 = ArgumentReg(%rsi) Int32 @22 = Trunc(@18, Wasm: {opcode: I64Rotl, location: 5}) Int64 @23 = RotL(@16, @22, Wasm: {opcode: I64Rotl, location: 5}) Void @27 = Return(@23, Terminal, Wasm: {opcode: End, location: 6}) * JavaScriptCore.xcodeproj/project.pbxproj: * b3/B3Value.cpp: (JSC::B3::Value::deepDump): * wasm/WasmB3IRGenerator.cpp: (JSC::Wasm::B3IRGenerator::setParser): (JSC::Wasm::B3IRGenerator::restoreWebAssemblyGlobalState): (JSC::Wasm::B3IRGenerator::emitCheckAndPreparePointer): (JSC::Wasm::B3IRGenerator::emitLoadOp): (JSC::Wasm::B3IRGenerator::emitStoreOp): (JSC::Wasm::B3IRGenerator::addConstant): (JSC::Wasm::B3IRGenerator::addLoop): (JSC::Wasm::B3IRGenerator::unify): (JSC::Wasm::parseAndCompile): (JSC::Wasm::B3IRGenerator::emitChecksForModOrDiv): (JSC::Wasm::getMemoryBaseAndSize): Deleted. * wasm/WasmFunctionParser.h: (JSC::Wasm::FunctionParser::currentOpcode): (JSC::Wasm::FunctionParser::currentOpcodeStartingOffset): (JSC::Wasm::FunctionParser::FunctionParser): * wasm/WasmOpcodeOrigin.cpp: Added. (JSC::Wasm::OpcodeOrigin::dump): * wasm/WasmOpcodeOrigin.h: Added. (JSC::Wasm::OpcodeOrigin::OpcodeOrigin): * wasm/WasmValidate.cpp: (JSC::Wasm::Validate::setParser): * wasm/generateWasmB3IRGeneratorInlinesHeader.py: (CodeGenerator.generate): (generateB3OpCode): (generateConstCode): 2017-03-28 JF Bastien WebAssembly: option to crash if no fast memory is available https://bugs.webkit.org/show_bug.cgi?id=170219 Reviewed by Mark Lam. * runtime/Options.h: * wasm/WasmMemory.cpp: (JSC::Wasm::webAssemblyCouldntGetFastMemory): (JSC::Wasm::tryGetFastMemory): 2017-03-28 Mark Lam The Mutator should not be able to steal the conn if the Collector hasn't reached the NotRunning phase yet. https://bugs.webkit.org/show_bug.cgi?id=170213 Reviewed by Filip Pizlo. The current condition for stealing the conn isn't tight enough. Restricting the stealing to when m_currentPhase == NotRunning ensures that the Collector is really done running. No test because this issue only manifests with a race condition that is difficult to reproduce on demand. * heap/Heap.cpp: (JSC::Heap::requestCollection): 2017-03-28 Keith Miller WebAssembly: Make WebAssembly.instantiate/compile truly asynchronous https://bugs.webkit.org/show_bug.cgi?id=169187 Reviewed by Saam Barati. This patch allows WebAssembly compilations to happen asynchronously. To do so, it refactors how much of the compilation happens and adds new infrastructure for async promises. First, there is a new class, PromiseDeferredTimer that lives on the VM. PromiseDeferredTimer will manage the life-cycle of async pending promises and any dependencies that promise needs. PromiseDeferredTimer automagically releases the pending promise and dependencies once the JSPromiseDeferred is resolved or rejected. Additionally, PromiseDeferredTimer provides a mechanism to poll the run-loop whenever the async task needs to synchronize with the JS thread. Normally, that will be whenever the async task finishes. In the case of Web Assembly we also use this feature for the compile + instantiate case, where we might have more work after the first async task completes (more on that later). The next class is Wasm::Worklist, which is used to manage Wasm compilation tasks. The worklist class works similarly to the DFG/FTL Worklists. It has a pool of threads that it manages. One interesting aspect of Wasm Worklist is that it can synchronously compile a plan that is already potentially running asynchronously. This can occur if a user calls WebAssembly.instantiate() then new WebAssembly.instantiate() on the same module. In that case the Wasm Worklist will bump the priority of the running pending Plan and block the JS thread. This patch also makes some of the Wasm Plan code cleaner. Since we now defer all compilation to instantiation time, we no longer need to guess at which memory we are going to get. Also, Wasm Plans now track the work they have done with a state enum. Finally, this patch makes renamed HeapTimer to JSRunLoopTimer. It also adds changes test262AsyncTest to a more generic testing infrastructure. Now, in addition to the old functionality, you can call asyncTest() with the number of tests you expect. When the jsc CLI exits, it will guarantee that asyncTestPassed() is called that many times. * CMakeLists.txt: * JavaScriptCore.xcodeproj/project.pbxproj: * heap/GCActivityCallback.h: * heap/IncrementalSweeper.cpp: (JSC::IncrementalSweeper::scheduleTimer): (JSC::IncrementalSweeper::IncrementalSweeper): * heap/IncrementalSweeper.h: * heap/StopIfNecessaryTimer.cpp: (JSC::StopIfNecessaryTimer::StopIfNecessaryTimer): * heap/StopIfNecessaryTimer.h: * heap/StrongInlines.h: * jsc.cpp: (GlobalObject::finishCreation): (printInternal): (functionAsyncTestStart): (functionAsyncTestPassed): (functionTestWasmModuleFunctions): (CommandLine::parseArguments): (runJSC): * runtime/JSPromiseDeferred.cpp: (JSC::JSPromiseDeferred::resolve): (JSC::JSPromiseDeferred::reject): * runtime/JSPromiseDeferred.h: (JSC::JSPromiseDeferred::promiseAsyncPending): * runtime/JSRunLoopTimer.cpp: Renamed from Source/JavaScriptCore/heap/HeapTimer.cpp. (JSC::JSRunLoopTimer::JSRunLoopTimer): (JSC::JSRunLoopTimer::setRunLoop): (JSC::JSRunLoopTimer::~JSRunLoopTimer): (JSC::JSRunLoopTimer::timerDidFire): (JSC::JSRunLoopTimer::scheduleTimer): (JSC::JSRunLoopTimer::cancelTimer): (JSC::JSRunLoopTimer::invalidate): * runtime/JSRunLoopTimer.h: Copied from Source/JavaScriptCore/heap/HeapTimer.h. * runtime/Options.h: * runtime/PromiseDeferredTimer.cpp: Added. (JSC::PromiseDeferredTimer::PromiseDeferredTimer): (JSC::PromiseDeferredTimer::doWork): (JSC::PromiseDeferredTimer::runRunLoop): (JSC::PromiseDeferredTimer::addPendingPromise): (JSC::PromiseDeferredTimer::cancelPendingPromise): (JSC::PromiseDeferredTimer::scheduleWorkSoon): (JSC::PromiseDeferredTimer::scheduleBlockedTask): * runtime/PromiseDeferredTimer.h: Renamed from Source/JavaScriptCore/heap/HeapTimer.h. (JSC::PromiseDeferredTimer::stopRunningTasks): * runtime/VM.cpp: (JSC::VM::VM): (JSC::VM::~VM): * runtime/VM.h: * wasm/JSWebAssembly.cpp: (JSC::reject): (JSC::webAssemblyCompileFunc): (JSC::resolve): (JSC::instantiate): (JSC::compileAndInstantiate): (JSC::webAssemblyInstantiateFunc): (JSC::webAssemblyValidateFunc): * wasm/WasmB3IRGenerator.cpp: (JSC::Wasm::B3IRGenerator::B3IRGenerator): (JSC::Wasm::B3IRGenerator::emitCheckAndPreparePointer): (JSC::Wasm::B3IRGenerator::memoryKind): (JSC::Wasm::parseAndCompile): * wasm/WasmB3IRGenerator.h: * wasm/WasmFormat.h: (JSC::Wasm::ModuleInformation::internalFunctionCount): * wasm/WasmFunctionParser.h: * wasm/WasmMemory.h: * wasm/WasmMemoryInformation.cpp: (JSC::Wasm::MemoryInformation::MemoryInformation): * wasm/WasmMemoryInformation.h: (JSC::Wasm::MemoryInformation::maximum): (JSC::Wasm::MemoryInformation::hasReservedMemory): Deleted. (JSC::Wasm::MemoryInformation::takeReservedMemory): Deleted. (JSC::Wasm::MemoryInformation::mode): Deleted. * wasm/WasmModuleParser.cpp: * wasm/WasmModuleParser.h: (JSC::Wasm::ModuleParser::ModuleParser): * wasm/WasmPlan.cpp: (JSC::Wasm::Plan::Plan): (JSC::Wasm::Plan::stateString): (JSC::Wasm::Plan::moveToState): (JSC::Wasm::Plan::fail): (JSC::Wasm::Plan::parseAndValidateModule): (JSC::Wasm::Plan::prepare): (JSC::Wasm::Plan::ThreadCountHolder::ThreadCountHolder): (JSC::Wasm::Plan::ThreadCountHolder::~ThreadCountHolder): (JSC::Wasm::Plan::compileFunctions): (JSC::Wasm::Plan::complete): (JSC::Wasm::Plan::waitForCompletion): (JSC::Wasm::Plan::cancel): (JSC::Wasm::Plan::run): Deleted. (JSC::Wasm::Plan::initializeCallees): Deleted. * wasm/WasmPlan.h: (JSC::Wasm::Plan::dontFinalize): (JSC::Wasm::Plan::exports): (JSC::Wasm::Plan::internalFunctionCount): (JSC::Wasm::Plan::takeModuleInformation): (JSC::Wasm::Plan::takeCallLinkInfos): (JSC::Wasm::Plan::takeWasmExitStubs): (JSC::Wasm::Plan::setModeAndPromise): (JSC::Wasm::Plan::mode): (JSC::Wasm::Plan::pendingPromise): (JSC::Wasm::Plan::vm): (JSC::Wasm::Plan::errorMessage): (JSC::Wasm::Plan::failed): (JSC::Wasm::Plan::hasWork): (JSC::Wasm::Plan::hasBeenPrepared): * wasm/WasmPlanInlines.h: Copied from Source/JavaScriptCore/wasm/WasmB3IRGenerator.h. (JSC::Wasm::Plan::initializeCallees): * wasm/WasmValidate.cpp: * wasm/WasmWorklist.cpp: Added. (JSC::Wasm::Worklist::priorityString): (JSC::Wasm::Worklist::QueueElement::setToNextPriority): (JSC::Wasm::Worklist::iterate): (JSC::Wasm::Worklist::enqueue): (JSC::Wasm::Worklist::completePlanSynchronously): (JSC::Wasm::Worklist::stopAllPlansForVM): (JSC::Wasm::Worklist::Worklist): (JSC::Wasm::Worklist::~Worklist): (JSC::Wasm::existingWorklistOrNull): (JSC::Wasm::ensureWorklist): * wasm/WasmWorklist.h: Added. (JSC::Wasm::Worklist::nextTicket): (JSC::Wasm::Worklist::Comparator::operator()): * wasm/js/JSWebAssemblyCallee.h: * wasm/js/JSWebAssemblyCodeBlock.cpp: (JSC::JSWebAssemblyCodeBlock::JSWebAssemblyCodeBlock): (JSC::JSWebAssemblyCodeBlock::initialize): (JSC::JSWebAssemblyCodeBlock::isSafeToRun): * wasm/js/JSWebAssemblyCodeBlock.h: (JSC::JSWebAssemblyCodeBlock::create): (JSC::JSWebAssemblyCodeBlock::initialized): (JSC::JSWebAssemblyCodeBlock::plan): (JSC::JSWebAssemblyCodeBlock::runnable): (JSC::JSWebAssemblyCodeBlock::errorMessage): (JSC::JSWebAssemblyCodeBlock::callees): * wasm/js/JSWebAssemblyHelpers.h: (JSC::createSourceBufferFromValue): * wasm/js/JSWebAssemblyInstance.cpp: (JSC::JSWebAssemblyInstance::finishCreation): (JSC::JSWebAssemblyInstance::visitChildren): (JSC::JSWebAssemblyInstance::addUnitializedCodeBlock): (JSC::JSWebAssemblyInstance::finalizeCreation): (JSC::JSWebAssemblyInstance::create): (JSC::JSWebAssemblyInstance::setMemory): Deleted. * wasm/js/JSWebAssemblyInstance.h: (JSC::JSWebAssemblyInstance::codeBlock): (JSC::JSWebAssemblyInstance::initialized): (JSC::JSWebAssemblyInstance::module): (JSC::JSWebAssemblyInstance::importFunction): (JSC::JSWebAssemblyInstance::setMemory): (JSC::JSWebAssemblyInstance::table): (JSC::JSWebAssemblyInstance::importFunctions): (JSC::JSWebAssemblyInstance::setImportFunction): Deleted. (JSC::JSWebAssemblyInstance::setTable): Deleted. * wasm/js/JSWebAssemblyModule.cpp: (JSC::JSWebAssemblyModule::createStub): (JSC::JSWebAssemblyModule::JSWebAssemblyModule): (JSC::JSWebAssemblyModule::finishCreation): (JSC::JSWebAssemblyModule::setCodeBlock): (JSC::JSWebAssemblyModule::buildCodeBlock): Deleted. (JSC::JSWebAssemblyModule::create): Deleted. (JSC::JSWebAssemblyModule::codeBlock): Deleted. * wasm/js/JSWebAssemblyModule.h: (JSC::JSWebAssemblyModule::moduleInformation): (JSC::JSWebAssemblyModule::codeBlock): (JSC::JSWebAssemblyModule::source): (JSC::JSWebAssemblyModule::takeReservedMemory): Deleted. (JSC::JSWebAssemblyModule::codeBlockFor): Deleted. * wasm/js/WebAssemblyInstanceConstructor.cpp: (JSC::constructJSWebAssemblyInstance): (JSC::WebAssemblyInstanceConstructor::createInstance): Deleted. * wasm/js/WebAssemblyModuleConstructor.cpp: (JSC::WebAssemblyModuleConstructor::createModule): * wasm/js/WebAssemblyModulePrototype.cpp: (JSC::webAssemblyModuleProtoImports): (JSC::webAssemblyModuleProtoExports): * wasm/js/WebAssemblyModuleRecord.cpp: (JSC::WebAssemblyModuleRecord::finishCreation): (JSC::WebAssemblyModuleRecord::link): (JSC::WebAssemblyModuleRecord::evaluate): * wasm/js/WebAssemblyModuleRecord.h: 2017-03-28 Yusuke Suzuki WebAssembly: add fallback to use pinned register to load/store state https://bugs.webkit.org/show_bug.cgi?id=169773 Reviewed by Saam Barati. This patch adds a new pinned register to hold JSWebAssemblyInstance, which is used to represent the context of running Wasm code. While we use fast TLS to hold the context in macOS, we do not have any system reserved fast TLS slot in the other systems. This pinned register approach is used in these systems. These changes decouple VM from Wasm module to make Wasm module position independent code. While using fast TLS could be beneficial in x64 systems which number of registers is relatively small, pinned register approach could be beneficial in ARM64 which has plenty of registers. In macOS, we can switch the implementation with the runtime flag. Thus macOS port can compare the performance and decide which implementation is used after landing this patch. * heap/MarkedBlock.h: (JSC::MarkedBlock::offsetOfVM): * jit/AssemblyHelpers.cpp: (JSC::AssemblyHelpers::loadWasmContext): (JSC::AssemblyHelpers::storeWasmContext): (JSC::AssemblyHelpers::loadWasmContextNeedsMacroScratchRegister): (JSC::AssemblyHelpers::storeWasmContextNeedsMacroScratchRegister): * jit/AssemblyHelpers.h: (JSC::AssemblyHelpers::loadWasmContext): Deleted. (JSC::AssemblyHelpers::storeWasmContext): Deleted. (JSC::AssemblyHelpers::loadWasmContextNeedsMacroScratchRegister): Deleted. (JSC::AssemblyHelpers::storeWasmContextNeedsMacroScratchRegister): Deleted. * jit/Repatch.cpp: (JSC::webAssemblyOwner): (JSC::linkFor): (JSC::linkPolymorphicCall): (JSC::isWebAssemblyToJSCallee): Deleted. * jit/ThunkGenerators.cpp: (JSC::throwExceptionFromWasmThunkGenerator): * llint/LLIntData.cpp: (JSC::LLInt::Data::performAssertions): * llint/LowLevelInterpreter.asm: * runtime/JSCell.cpp: (JSC::JSCell::isAnyWasmCallee): * runtime/JSCellInlines.h: (JSC::isWebAssemblyToJSCallee): * runtime/JSType.h: * runtime/StackFrame.cpp: (JSC::StackFrame::functionName): * runtime/VM.cpp: (JSC::VM::VM): * runtime/VM.h: (JSC::VM::wasmContextOffset): * wasm/WasmB3IRGenerator.cpp: (JSC::Wasm::B3IRGenerator::materializeWasmContext): (JSC::Wasm::B3IRGenerator::restoreWasmContext): (JSC::Wasm::B3IRGenerator::B3IRGenerator): (JSC::Wasm::getMemoryBaseAndSize): (JSC::Wasm::B3IRGenerator::restoreWebAssemblyGlobalState): (JSC::Wasm::createJSToWasmWrapper): (JSC::Wasm::loadWasmContext): Deleted. (JSC::Wasm::storeWasmContext): Deleted. (JSC::Wasm::restoreWebAssemblyGlobalState): Deleted. * wasm/WasmBinding.cpp: (JSC::Wasm::wasmToJs): * wasm/WasmContext.cpp: (JSC::loadWasmContext): (JSC::storeWasmContext): * wasm/WasmContext.h: * wasm/WasmMemoryInformation.cpp: (JSC::Wasm::getPinnedRegisters): (JSC::Wasm::PinnedRegisterInfo::get): (JSC::Wasm::PinnedRegisterInfo::PinnedRegisterInfo): * wasm/WasmMemoryInformation.h: (JSC::Wasm::PinnedRegisterInfo::toSave): (JSC::Wasm::useFastTLS): (JSC::Wasm::useFastTLSForWasmContext): * wasm/js/JSWebAssemblyInstance.cpp: (JSC::JSWebAssemblyInstance::finishCreation): (JSC::JSWebAssemblyInstance::visitChildren): * wasm/js/JSWebAssemblyInstance.h: (JSC::JSWebAssemblyInstance::offsetOfCallee): * wasm/js/JSWebAssemblyModule.cpp: (JSC::JSWebAssemblyModule::finishCreation): (JSC::JSWebAssemblyModule::visitChildren): * wasm/js/JSWebAssemblyModule.h: (JSC::JSWebAssemblyModule::callee): * wasm/js/WebAssemblyFunction.cpp: (JSC::callWebAssemblyFunction): (JSC::WebAssemblyFunction::create): * wasm/js/WebAssemblyToJSCallee.cpp: (JSC::WebAssemblyToJSCallee::create): (JSC::WebAssemblyToJSCallee::createStructure): (JSC::WebAssemblyToJSCallee::finishCreation): (JSC::WebAssemblyToJSCallee::visitChildren): (JSC::WebAssemblyToJSCallee::destroy): Deleted. * wasm/js/WebAssemblyToJSCallee.h: 2017-03-28 Brian Burg Web Inspector: Add "Disable Caches" option that only applies to the inspected page while Web Inspector is open https://bugs.webkit.org/show_bug.cgi?id=169865 Reviewed by Joseph Pecoraro. * inspector/protocol/Network.json: Rename the command for disabling resource caching to match the WebCore::Page flag. This also removes the possibility that this could be confused for the old, buggy command that this patch rips out. 2017-03-25 Yusuke Suzuki [JSC] Move platformThreadSignal to WTF https://bugs.webkit.org/show_bug.cgi?id=170097 Reviewed by Mark Lam. It is a small clean up towards https://bugs.webkit.org/show_bug.cgi?id=170027. platformThreadSignal uses PlatformThread in JSC, but it can be implemented in WTF ThreadIdentifier. * runtime/JSLock.cpp: (JSC::JSLock::lock): * runtime/JSLock.h: (JSC::JSLock::ownerThread): (JSC::JSLock::currentThreadIsHoldingLock): * runtime/PlatformThread.h: (JSC::platformThreadSignal): Deleted. * runtime/VM.h: (JSC::VM::ownerThread): * runtime/VMTraps.cpp: (JSC::VMTraps::SignalSender::send): 2017-03-28 JF Bastien WebAssembly: implement Module imports/exports https://bugs.webkit.org/show_bug.cgi?id=166982 Reviewed by Saam Barati. As defined in: https://github.com/WebAssembly/design/commit/18cbacb90cd3584dd5c9aa3d392e4e55f66af6ab * wasm/WasmFormat.h: (JSC::Wasm::makeString): use uppercase instead, it was only used for diagnostic but is now used for the expected JS property's capitalization * wasm/js/WebAssemblyModulePrototype.cpp: (JSC::webAssemblyModuleProtoImports): (JSC::webAssemblyModuleProtoExports): 2017-03-27 JF Bastien WebAssembly: JSWebAssemblyCodeBlock.h belongs in JavaScriptCore/wasm/js not JavaScriptCore/wasm https://bugs.webkit.org/show_bug.cgi?id=170160 Reviewed by Mark Lam. * JavaScriptCore.xcodeproj/project.pbxproj: * wasm/js/JSWebAssemblyCodeBlock.h: Renamed from Source/JavaScriptCore/wasm/JSWebAssemblyCodeBlock.h. 2017-03-27 JF Bastien WebAssembly: misc memory testing https://bugs.webkit.org/show_bug.cgi?id=170137 Reviewed by Keith Miller. * wasm/js/WebAssemblyInstanceConstructor.cpp: (JSC::WebAssemblyInstanceConstructor::createInstance): improve error messages 2017-03-27 Michael Saboff Add ARM64 system instructions to disassembler https://bugs.webkit.org/show_bug.cgi?id=170084 Reviewed by Saam Barati. This changes adds support for MRS and MSR instructions, and refactors the DMB disassembly to handle all of the barrier instructions. * disassembler/ARM64/A64DOpcode.cpp: (JSC::ARM64Disassembler::A64DOpcodeMSRImmediate::format): (JSC::ARM64Disassembler::A64DOpcodeMSROrMRSRegister::format): (JSC::ARM64Disassembler::A64DOpcodeSystemSync::format): (JSC::ARM64Disassembler::A64DOpcodeDmb::format): Deleted. * disassembler/ARM64/A64DOpcode.h: (JSC::ARM64Disassembler::A64DOpcodeSystem::lBit): (JSC::ARM64Disassembler::A64DOpcodeSystem::op0): (JSC::ARM64Disassembler::A64DOpcodeSystem::op1): (JSC::ARM64Disassembler::A64DOpcodeSystem::crN): (JSC::ARM64Disassembler::A64DOpcodeSystem::crM): (JSC::ARM64Disassembler::A64DOpcodeSystem::op2): (JSC::ARM64Disassembler::A64DOpcodeMSROrMRSRegister::opName): (JSC::ARM64Disassembler::A64DOpcodeMSROrMRSRegister::systemRegister): (JSC::ARM64Disassembler::A64DOpcodeSystemSync::opName): (JSC::ARM64Disassembler::A64DOpcodeSystemSync::option): (JSC::ARM64Disassembler::A64DOpcodeDmb::opName): Deleted. (JSC::ARM64Disassembler::A64DOpcodeDmb::option): Deleted. (JSC::ARM64Disassembler::A64DOpcodeDmb::crM): Deleted. 2017-03-26 Filip Pizlo B3::fixSSA should do liveness pruning https://bugs.webkit.org/show_bug.cgi?id=170111 Reviewed by Saam Barati. This moves all of the logic of Air::Liveness<> to WTF::Liveness<> and then uses that to create B3::VariableLiveness. Then this uses VariableLiveness::LiveAtHead to prune Phi construction. This makes B3::fixSSA run twice as fast. This is a 13% progression on WasmBench compile times. * CMakeLists.txt: * JavaScriptCore.xcodeproj/project.pbxproj: * b3/B3BasicBlock.h: (JSC::B3::BasicBlock::get): * b3/B3FixSSA.cpp: (JSC::B3::fixSSA): * b3/B3VariableLiveness.cpp: Added. (JSC::B3::VariableLiveness::VariableLiveness): (JSC::B3::VariableLiveness::~VariableLiveness): * b3/B3VariableLiveness.h: Added. (JSC::B3::VariableLivenessAdapter::VariableLivenessAdapter): (JSC::B3::VariableLivenessAdapter::numIndices): (JSC::B3::VariableLivenessAdapter::valueToIndex): (JSC::B3::VariableLivenessAdapter::indexToValue): (JSC::B3::VariableLivenessAdapter::blockSize): (JSC::B3::VariableLivenessAdapter::forEachEarlyUse): (JSC::B3::VariableLivenessAdapter::forEachLateUse): (JSC::B3::VariableLivenessAdapter::forEachEarlyDef): (JSC::B3::VariableLivenessAdapter::forEachLateDef): * b3/air/AirCFG.h: Added. (JSC::B3::Air::CFG::CFG): (JSC::B3::Air::CFG::root): (JSC::B3::Air::CFG::newMap): (JSC::B3::Air::CFG::successors): (JSC::B3::Air::CFG::predecessors): (JSC::B3::Air::CFG::index): (JSC::B3::Air::CFG::node): (JSC::B3::Air::CFG::numNodes): (JSC::B3::Air::CFG::dump): * b3/air/AirCode.cpp: (JSC::B3::Air::Code::Code): * b3/air/AirCode.h: (JSC::B3::Air::Code::cfg): * b3/air/AirLiveness.h: (JSC::B3::Air::LivenessAdapter::LivenessAdapter): (JSC::B3::Air::LivenessAdapter::blockSize): (JSC::B3::Air::LivenessAdapter::forEachEarlyUse): (JSC::B3::Air::LivenessAdapter::forEachLateUse): (JSC::B3::Air::LivenessAdapter::forEachEarlyDef): (JSC::B3::Air::LivenessAdapter::forEachLateDef): (JSC::B3::Air::TmpLivenessAdapter::TmpLivenessAdapter): (JSC::B3::Air::TmpLivenessAdapter::numIndices): (JSC::B3::Air::StackSlotLivenessAdapter::StackSlotLivenessAdapter): (JSC::B3::Air::StackSlotLivenessAdapter::numIndices): (JSC::B3::Air::StackSlotLivenessAdapter::indexToValue): (JSC::B3::Air::Liveness::Liveness): (JSC::B3::Air::Liveness::LocalCalc::LocalCalc): Deleted. (JSC::B3::Air::Liveness::LocalCalc::Iterable::Iterable): Deleted. (JSC::B3::Air::Liveness::LocalCalc::Iterable::iterator::iterator): Deleted. (JSC::B3::Air::Liveness::LocalCalc::Iterable::iterator::operator++): Deleted. (JSC::B3::Air::Liveness::LocalCalc::Iterable::iterator::operator*): Deleted. (JSC::B3::Air::Liveness::LocalCalc::Iterable::iterator::operator==): Deleted. (JSC::B3::Air::Liveness::LocalCalc::Iterable::iterator::operator!=): Deleted. (JSC::B3::Air::Liveness::LocalCalc::Iterable::begin): Deleted. (JSC::B3::Air::Liveness::LocalCalc::Iterable::end): Deleted. (JSC::B3::Air::Liveness::LocalCalc::Iterable::contains): Deleted. (JSC::B3::Air::Liveness::LocalCalc::live): Deleted. (JSC::B3::Air::Liveness::LocalCalc::isLive): Deleted. (JSC::B3::Air::Liveness::LocalCalc::execute): Deleted. (JSC::B3::Air::Liveness::rawLiveAtHead): Deleted. (JSC::B3::Air::Liveness::Iterable::Iterable): Deleted. (JSC::B3::Air::Liveness::Iterable::iterator::iterator): Deleted. (JSC::B3::Air::Liveness::Iterable::iterator::operator*): Deleted. (JSC::B3::Air::Liveness::Iterable::iterator::operator++): Deleted. (JSC::B3::Air::Liveness::Iterable::iterator::operator==): Deleted. (JSC::B3::Air::Liveness::Iterable::iterator::operator!=): Deleted. (JSC::B3::Air::Liveness::Iterable::begin): Deleted. (JSC::B3::Air::Liveness::Iterable::end): Deleted. (JSC::B3::Air::Liveness::Iterable::contains): Deleted. (JSC::B3::Air::Liveness::liveAtHead): Deleted. (JSC::B3::Air::Liveness::liveAtTail): Deleted. (JSC::B3::Air::Liveness::workset): Deleted. 2017-03-25 Filip Pizlo Air::Liveness shouldn't need HashSets https://bugs.webkit.org/show_bug.cgi?id=170102 Reviewed by Yusuke Suzuki. This converts Air::Liveness<> to no longer use HashSets or BitVectors. This turns out to be easy because it's cheap enough to do a sorted merge of the things being added to liveAtHead and the things in the predecessors' liveAtTail. This turns out to be faster - it's a 2% overall compile time progression on WasmBench. * b3/B3LowerToAir.cpp: (JSC::B3::Air::LowerToAir::lower): Add a FIXME unrelated to this patch. * b3/air/AirLiveness.h: (JSC::B3::Air::AbstractLiveness::AbstractLiveness): (JSC::B3::Air::AbstractLiveness::LocalCalc::LocalCalc): (JSC::B3::Air::AbstractLiveness::rawLiveAtHead): (JSC::B3::Air::AbstractLiveness::liveAtHead): (JSC::B3::Air::AbstractLiveness::liveAtTail): * b3/air/AirTmp.h: (JSC::B3::Air::Tmp::bank): (JSC::B3::Air::Tmp::tmpIndex): * dfg/DFGStoreBarrierClusteringPhase.cpp: 2017-03-26 Filip Pizlo Air should use RegisterSet for RegLiveness https://bugs.webkit.org/show_bug.cgi?id=170108 Reviewed by Yusuke Suzuki. The biggest change here is the introduction of the new RegLiveness class. This is a drop-in replacement for the old RegLiveness, which was a specialization of AbstractLiveness<>, but it's about 30% faster. It gets its speed boost from just using sets everywhere, which is efficient for registers since RegisterSet is just two (on x86-64) or three 32-bit (on ARM64) statically allocated words. This looks like a 1% compile time progression on WasmBench. * CMakeLists.txt: * JavaScriptCore.xcodeproj/project.pbxproj: * b3/B3TimingScope.cpp: Records phase timing totals. (JSC::B3::TimingScope::TimingScope): (JSC::B3::TimingScope::~TimingScope): * b3/B3TimingScope.h: * b3/air/AirAllocateRegistersByGraphColoring.cpp: (JSC::B3::Air::allocateRegistersByGraphColoring): * b3/air/AirLiveness.h: Move code around and rename a bit to make it more like RegLiveness; in particular we want the `iterator` to be called `iterator` not `Iterator`, and we want it to be internal to its iterable. Also rename this template to Liveness, to match the header filename. (JSC::B3::Air::Liveness::Liveness): (JSC::B3::Air::Liveness::LocalCalc::LocalCalc): (JSC::B3::Air::Liveness::LocalCalc::Iterable::Iterable): (JSC::B3::Air::Liveness::LocalCalc::Iterable::iterator::iterator): (JSC::B3::Air::Liveness::LocalCalc::Iterable::iterator::operator++): (JSC::B3::Air::Liveness::LocalCalc::Iterable::iterator::operator*): (JSC::B3::Air::Liveness::LocalCalc::Iterable::iterator::operator==): (JSC::B3::Air::Liveness::LocalCalc::Iterable::iterator::operator!=): (JSC::B3::Air::Liveness::LocalCalc::Iterable::begin): (JSC::B3::Air::Liveness::LocalCalc::Iterable::end): (JSC::B3::Air::Liveness::Iterable::Iterable): (JSC::B3::Air::Liveness::Iterable::iterator::iterator): (JSC::B3::Air::RegLivenessAdapter::RegLivenessAdapter): Deleted. (JSC::B3::Air::RegLivenessAdapter::numIndices): Deleted. (JSC::B3::Air::RegLivenessAdapter::acceptsBank): Deleted. (JSC::B3::Air::RegLivenessAdapter::acceptsRole): Deleted. (JSC::B3::Air::RegLivenessAdapter::valueToIndex): Deleted. (JSC::B3::Air::RegLivenessAdapter::indexToValue): Deleted. (JSC::B3::Air::AbstractLiveness::AbstractLiveness): Deleted. (JSC::B3::Air::AbstractLiveness::LocalCalc::LocalCalc): Deleted. (JSC::B3::Air::AbstractLiveness::LocalCalc::Iterator::Iterator): Deleted. (JSC::B3::Air::AbstractLiveness::LocalCalc::Iterator::operator++): Deleted. (JSC::B3::Air::AbstractLiveness::LocalCalc::Iterator::operator*): Deleted. (JSC::B3::Air::AbstractLiveness::LocalCalc::Iterator::operator==): Deleted. (JSC::B3::Air::AbstractLiveness::LocalCalc::Iterator::operator!=): Deleted. (JSC::B3::Air::AbstractLiveness::LocalCalc::Iterable::Iterable): Deleted. (JSC::B3::Air::AbstractLiveness::LocalCalc::Iterable::begin): Deleted. (JSC::B3::Air::AbstractLiveness::LocalCalc::Iterable::end): Deleted. (JSC::B3::Air::AbstractLiveness::LocalCalc::Iterable::contains): Deleted. (JSC::B3::Air::AbstractLiveness::LocalCalc::live): Deleted. (JSC::B3::Air::AbstractLiveness::LocalCalc::isLive): Deleted. (JSC::B3::Air::AbstractLiveness::LocalCalc::execute): Deleted. (JSC::B3::Air::AbstractLiveness::rawLiveAtHead): Deleted. (JSC::B3::Air::AbstractLiveness::Iterable::Iterable): Deleted. (JSC::B3::Air::AbstractLiveness::Iterable::iterator::iterator): Deleted. (JSC::B3::Air::AbstractLiveness::Iterable::iterator::operator*): Deleted. (JSC::B3::Air::AbstractLiveness::Iterable::iterator::operator++): Deleted. (JSC::B3::Air::AbstractLiveness::Iterable::iterator::operator==): Deleted. (JSC::B3::Air::AbstractLiveness::Iterable::iterator::operator!=): Deleted. (JSC::B3::Air::AbstractLiveness::Iterable::begin): Deleted. (JSC::B3::Air::AbstractLiveness::Iterable::end): Deleted. (JSC::B3::Air::AbstractLiveness::Iterable::contains): Deleted. (JSC::B3::Air::AbstractLiveness::liveAtHead): Deleted. (JSC::B3::Air::AbstractLiveness::liveAtTail): Deleted. (JSC::B3::Air::AbstractLiveness::workset): Deleted. * b3/air/AirLogRegisterPressure.cpp: * b3/air/AirLowerAfterRegAlloc.cpp: * b3/air/AirRegLiveness.cpp: Added. (JSC::B3::Air::RegLiveness::RegLiveness): (JSC::B3::Air::RegLiveness::~RegLiveness): (JSC::B3::Air::RegLiveness::LocalCalc::execute): * b3/air/AirRegLiveness.h: Added. (JSC::B3::Air::RegLiveness::LocalCalc::LocalCalc): (JSC::B3::Air::RegLiveness::LocalCalc::live): (JSC::B3::Air::RegLiveness::LocalCalc::isLive): (JSC::B3::Air::RegLiveness::liveAtHead): (JSC::B3::Air::RegLiveness::liveAtTail): * b3/air/AirReportUsedRegisters.cpp: * jit/RegisterSet.h: (JSC::RegisterSet::add): (JSC::RegisterSet::remove): (JSC::RegisterSet::contains): (JSC::RegisterSet::subsumes): (JSC::RegisterSet::iterator::iterator): (JSC::RegisterSet::iterator::operator*): (JSC::RegisterSet::iterator::operator++): (JSC::RegisterSet::iterator::operator==): (JSC::RegisterSet::iterator::operator!=): (JSC::RegisterSet::begin): (JSC::RegisterSet::end): 2017-03-25 Filip Pizlo Fix wasm by returning after we do TLS. Rubber stamped by Keith Miller. * jit/AssemblyHelpers.h: (JSC::AssemblyHelpers::storeWasmContext): 2017-03-24 Mark Lam Add some instrumentation in Heap::resumeThePeriphery() to help debug an issue. https://bugs.webkit.org/show_bug.cgi?id=170086 Reviewed by Saam Barati. Adding some instrumentation in Heap::resumeThePeriphery() to dump some Heap state just before we RELEASE_ASSERT_NOT_REACHED. * heap/Heap.cpp: (JSC::Heap::resumeThePeriphery): 2017-03-24 JF Bastien WebAssembly: store state in TLS instead of on VM https://bugs.webkit.org/show_bug.cgi?id=169611 Reviewed by Filip Pizlo. Using thread-local storage instead of VM makes code more position independent. We used to store the WebAssembly top Instance (the latest one in the call stack) on VM, now we instead store it in TLS. This top Instance is used to access a bunch of state such as Memory location, size, table (for call_indirect), etc. Instead of calling it "top", which is confusing, we now just call it WasmContext. Making the code PIC means future patches will be able to postMessage and structured clone into IDB without having to recompile the code. This wasn't possible before because we hard-coded the address of VM at compilation time. That doesn't work between workers, and doesn't work across reloads (which IDB is intended to do). It'll also potentially make code faster once we start tuning what's in TLS, what's in which of the 4 free slots, and what's in pinned registers. I'm leaving this tuning for later because there's lower lying fruit for us to pick. * CMakeLists.txt: * JavaScriptCore.xcodeproj/project.pbxproj: * assembler/AbstractMacroAssembler.h: * assembler/AllowMacroScratchRegisterUsageIf.h: Copied from assembler/AllowMacroScratchRegisterUsage.h. (JSC::AllowMacroScratchRegisterUsageIf::AllowMacroScratchRegisterUsageIf): (JSC::AllowMacroScratchRegisterUsageIf::~AllowMacroScratchRegisterUsageIf): * assembler/MacroAssembler.h: (JSC::MacroAssembler::storeToTLSPtr): we previously didn't have the code required to store to TLS, only to load * assembler/MacroAssemblerARM64.h: (JSC::MacroAssemblerARM64::loadFromTLSPtrNeedsMacroScratchRegister): (JSC::MacroAssemblerARM64::storeToTLS32): (JSC::MacroAssemblerARM64::storeToTLS64): (JSC::MacroAssemblerARM64::storeToTLSPtrNeedsMacroScratchRegister): * assembler/MacroAssemblerX86Common.h: (JSC::MacroAssemblerX86Common::loadFromTLSPtrNeedsMacroScratchRegister): (JSC::MacroAssemblerX86Common::storeToTLS32): (JSC::MacroAssemblerX86Common::storeToTLSPtrNeedsMacroScratchRegister): * assembler/MacroAssemblerX86_64.h: (JSC::MacroAssemblerX86_64::loadFromTLS64): was loading 32-bit instead of 64-bit (JSC::MacroAssemblerX86_64::storeToTLS64): * assembler/X86Assembler.h: (JSC::X86Assembler::movl_rm): (JSC::X86Assembler::movq_rm): * b3/testb3.cpp: (JSC::B3::testFastTLSLoad): (JSC::B3::testFastTLSStore): (JSC::B3::run): * jit/AssemblyHelpers.h: (JSC::AssemblyHelpers::loadWasmContext): (JSC::AssemblyHelpers::storeWasmContext): (JSC::AssemblyHelpers::loadWasmContextNeedsMacroScratchRegister): (JSC::AssemblyHelpers::storeWasmContextNeedsMacroScratchRegister): * jit/Repatch.cpp: (JSC::webAssemblyOwner): * jit/ThunkGenerators.cpp: (JSC::throwExceptionFromWasmThunkGenerator): * runtime/Options.h: * runtime/VM.cpp: (JSC::VM::VM): * runtime/VM.h: * wasm/WasmB3IRGenerator.cpp: (JSC::Wasm::loadWasmContext): (JSC::Wasm::storeWasmContext): (JSC::Wasm::B3IRGenerator::B3IRGenerator): (JSC::Wasm::getMemoryBaseAndSize): (JSC::Wasm::restoreWebAssemblyGlobalState): (JSC::Wasm::createJSToWasmWrapper): (JSC::Wasm::parseAndCompile): * wasm/WasmBinding.cpp: (JSC::Wasm::materializeImportJSCell): (JSC::Wasm::wasmToJs): (JSC::Wasm::wasmToWasm): * wasm/WasmContext.cpp: Added. (JSC::loadWasmContext): (JSC::storeWasmContext): * wasm/WasmContext.h: Added. Replaces "top" JSWebAssemblyInstance. * wasm/js/WebAssemblyFunction.cpp: (JSC::callWebAssemblyFunction): * wasm/js/WebAssemblyInstanceConstructor.h: 2017-03-24 JF Bastien WebAssembly: spec-tests/memory.wast.js fails in debug https://bugs.webkit.org/show_bug.cgi?id=169794 Reviewed by Keith Miller. The failure was due to empty memories (with maximum size 0). Those only occur in tests and in code that's trying to trip us. This patch adds memory mode "none" which represents no memory. It can work with either bounds checked or signaling code because it never contains loads and stores. The spec tests which were failing did the following: > (module (memory (data)) (func (export "memsize") (result i32) (current_memory))) > (assert_return (invoke "memsize") (i32.const 0)) > (module (memory (data "")) (func (export "memsize") (result i32) (current_memory))) > (assert_return (invoke "memsize") (i32.const 0)) > (module (memory (data "x")) (func (export "memsize") (result i32) (current_memory))) > (assert_return (invoke "memsize") (i32.const 1)) * wasm/WasmB3IRGenerator.cpp: (JSC::Wasm::B3IRGenerator::memoryKind): * wasm/WasmMemory.cpp: (JSC::Wasm::tryGetFastMemory): (JSC::Wasm::releaseFastMemory): (JSC::Wasm::Memory::Memory): (JSC::Wasm::Memory::createImpl): (JSC::Wasm::Memory::create): (JSC::Wasm::Memory::grow): (JSC::Wasm::Memory::makeString): * wasm/WasmMemory.h: * wasm/WasmMemoryInformation.cpp: (JSC::Wasm::MemoryInformation::MemoryInformation): * wasm/js/JSWebAssemblyCodeBlock.cpp: (JSC::JSWebAssemblyCodeBlock::isSafeToRun): * wasm/js/JSWebAssemblyModule.cpp: (JSC::JSWebAssemblyModule::codeBlock): (JSC::JSWebAssemblyModule::finishCreation): * wasm/js/JSWebAssemblyModule.h: (JSC::JSWebAssemblyModule::codeBlock): (JSC::JSWebAssemblyModule::codeBlockFor): 2017-03-24 Mark Lam Array memcpy'ing fast paths should check if we're having a bad time if they cannot handle it. https://bugs.webkit.org/show_bug.cgi?id=170064 Reviewed by Geoffrey Garen. * runtime/ArrayPrototype.cpp: (JSC::arrayProtoPrivateFuncConcatMemcpy): * runtime/JSArray.cpp: (JSC::JSArray::fastSlice): 2017-03-23 Yusuke Suzuki [JSC] Use jsNontrivialString agressively for ToString(Int52) https://bugs.webkit.org/show_bug.cgi?id=170002 Reviewed by Sam Weinig. We use the same logic used for Int32 to use jsNontvirialString. After single character check, produced string is always longer than 1. Thus, we can use jsNontrivialString. * runtime/NumberPrototype.cpp: (JSC::int52ToString): 2017-03-23 Yusuke Suzuki [JSC] Use WeakRandom for SamplingProfiler interval fluctuation https://bugs.webkit.org/show_bug.cgi?id=170045 Reviewed by Mark Lam. It is unnecessary to use cryptographicallyRandomNumber for SamplingProfiler interval fluctuation. Use WeakRandom instead. * runtime/SamplingProfiler.cpp: (JSC::SamplingProfiler::SamplingProfiler): (JSC::SamplingProfiler::timerLoop): * runtime/SamplingProfiler.h: 2017-03-23 Mark Lam Array.prototype.splice behaves incorrectly when the VM is "having a bad time". https://bugs.webkit.org/show_bug.cgi?id=170025 Reviewed by Saam Barati. * runtime/ArrayPrototype.cpp: (JSC::copySplicedArrayElements): (JSC::arrayProtoFuncSplice): 2017-03-23 Yusuke Suzuki [JSC][DFG] Make addShouldSpeculateAnyInt more conservative to avoid regression caused by Double <-> Int52 conversions https://bugs.webkit.org/show_bug.cgi?id=169998 Reviewed by Saam Barati. Double <-> Int52 and JSValue <-> Int52 conversions are not so cheap. Thus, Int52Rep is super carefully emitted. We make addShouldSpeculateAnyInt more conservative to avoid regressions caused by the above conversions. We select ArithAdd(Int52, Int52) only when this calculation is beneficial compared to added Int52Rep conversions. This patch tighten the conditions of addShouldSpeculateAnyInt. 1. Honor DoubleConstant. When executing imaging-darkroom, we have a thing like that, 132:< 2:loc36> DoubleConstant(Double|UseAsOther, AnyIntAsDouble, Double: 4607182418800017408, 1.000000, bc#114) 1320:< 1:loc38> Int52Rep(Check:Int32:@82, Int52|PureInt, Int32, Exits, bc#114) 1321:< 1:loc39> Int52Constant(Int52|PureInt, Boolint32Nonboolint32Int52, Double: 4607182418800017408, 1.000000, bc#114) 133: ArithSub(Int52Rep:@1320, Int52Rep:@1321, Int52|MustGen, Int52, CheckOverflow, Exits, bc#114) The LHS of ArithSub says predicting Boolint32, and the rhs says AnyIntAsDouble. Thus we select ArithSub(Int52, Int52) instead of ArithSub(Double, Double). However, it soon causes OSR exits. In imaging-darkroom, LHS's Int32 prediction will be broken. While speculating Int32 in the above situation is reasonable approach since the given LHS says predicting Int32, this causes severe performance regression. Previously, we always select ArithSub(Double, Double). So accidentally, we do not encounter this misprediction issue. One thing can be found that we have DoubleConstant in the RHS. It means that we have `1.0` instead of `1` in the code. We can see the code like `lhs - 1.0` instead of `lhs - 1` in imaging-darkroom. It offers good information that lhs and the resulting value would be double. Handling the above ArithSub in double seems more appropriate rather than handling it in Int52. So, in this patch, we honor DoubleConstant. If we find DoubleConstant on one operand, we give up selecting Arith[Sub,Add](Int52, Int52). This change removes OSR exits occurr in imaging-darkroom right now. 2. Two Int52Rep(Double) conversions are not desirable. We allow AnyInt ArithAdd only when the one operand of the binary operation should be speculated AnyInt. It is a bit conservative decision. This is because Double to Int52 conversion is not so cheap. Frequent back-and-forth conversions between Double and Int52 rather hurt the performance. If the one operand of the operation is already Int52, the cost for constructing ArithAdd becomes cheap since only one Double to Int52 conversion could be required. This recovers some regression in assorted tests while keeping kraken crypto improvements. 3. Avoid frequent Int52 to JSValue conversions. Int52 to JSValue conversion is not so cheap. Thus, we would like to avoid such situations. So, in this patch, we allow Arith(Int52, Int52) with AnyIntAsDouble operand only when the node is used as number. By doing so, we avoid the case like, converting Int52, performing ArithAdd, and soon converting back to JSValue. The above 3 changes recover the regression measured in microbenchmarks/int52-back-and-forth.js and assorted benchmarks. And still it keeps kraken crypto improvements. baseline patched imaging-darkroom 201.112+-3.192 ^ 189.532+-2.883 ^ definitely 1.0611x faster stanford-crypto-pbkdf2 103.953+-2.325 100.926+-2.396 might be 1.0300x faster stanford-crypto-sha256-iterative 35.103+-1.071 ? 36.049+-1.143 ? might be 1.0270x slower * dfg/DFGGraph.h: (JSC::DFG::Graph::addShouldSpeculateAnyInt): == Rolled over to ChangeLog-2017-03-23 ==