2017-08-09 Jason Marcell Cherry-pick r220346. rdar://problem/33805219 2017-08-07 Commit Queue Unreviewed, rolling out r220144. https://bugs.webkit.org/show_bug.cgi?id=175276 "It did not actually speed things up in the way I expected" (Requested by saamyjoon on #webkit). Reverted changeset: "On memory-constrained iOS devices, reduce the rate at which the JS heap grows before a GC to try to keep more memory available for the system" https://bugs.webkit.org/show_bug.cgi?id=175041 http://trac.webkit.org/changeset/220144 2017-08-02 Jason Marcell Cherry-pick r220144. rdar://problem/33687404 2017-08-02 Saam Barati On memory-constrained iOS devices, reduce the rate at which the JS heap grows before a GC to try to keep more memory available for the system https://bugs.webkit.org/show_bug.cgi?id=175041 Reviewed by Filip Pizlo. The testing I have done shows that this new function is a ~10% progression running JetStream on 1GB iOS devices. I've also tried this on a few > 1GB iOS devices, and the testing shows this is either neutral or a regression. Right now, we'll just enable this for <= 1GB devices since it's a win. In the future, we might want to either look into tweaking these parameters or coming up with a new function for > 1GB devices. * heap/Heap.cpp: * runtime/Options.h: 2017-07-31 Jason Marcell Cherry-pick r220012. rdar://problem/33619526 2017-07-28 Mark Lam ObjectToStringAdaptiveStructureWatchpoint should not fire if it's dying imminently. https://bugs.webkit.org/show_bug.cgi?id=174948 Reviewed by Filip Pizlo. ObjectToStringAdaptiveStructureWatchpoint is owned by StructureRareData. If its owner StructureRareData is already known to be dead (in terms of GC liveness) but hasn't been destructed yet (i.e. not swept by the GC yet), we should ignore all requests to fire this watchpoint. If the GC had the chance to sweep the StructureRareData, thereby destructing the ObjectToStringAdaptiveStructureWatchpoint, it (the watchpoint) would have removed itself from the WatchpointSet it was on. Hence, it would not have been fired. But since the watchpoint hasn't been destructed yet, it still remains on the WatchpointSet and needs to guard against being fired in this state. The fix is to simply return early if its owner StructureRareData is not live. This has the effect of the watchpoint fire being a no-op, which is equivalent to the watchpoint not firing as we would expect. This patch also removes some cargo cult copying of watchpoint code which instantiates a StringFireDetail. In a few cases, that StringFireDetail is never used. This patch removes these unnecessary instantiations. * bytecode/LLIntPrototypeLoadAdaptiveStructureWatchpoint.cpp: (JSC::LLIntPrototypeLoadAdaptiveStructureWatchpoint::fireInternal): * runtime/StructureRareData.cpp: (JSC::ObjectToStringAdaptiveStructureWatchpoint::fireInternal): (JSC::ObjectToStringAdaptiveInferredPropertyValueWatchpoint::handleFire): 2017-07-28 Jason Marcell Cherry-pick r219895. rdar://problem/33595450 2017-07-25 Keith Miller Remove Broken CompareEq constant folding phase. https://bugs.webkit.org/show_bug.cgi?id=174846 Reviewed by Saam Barati. This bug happened when we would get code like the following: a: JSConst(Undefined) b: GetLocal(SomeObjectOrUndefined) ... c: CompareEq(Check:ObjectOrOther:b, Check:ObjectOrOther:a) constant folding will turn this into: a: JSConst(Undefined) b: GetLocal(SomeObjectOrUndefined) ... c: CompareEq(Check:ObjectOrOther:b, Other:a) But the SpeculativeJIT/FTL lowering will fail to check b properly which leads to an assertion failure in the AI. I'll follow up with a more robust fix later. For now, I'll remove the case that generates the code. Removing the code appears to be perf neutral. * dfg/DFGConstantFoldingPhase.cpp: (JSC::DFG::ConstantFoldingPhase::foldConstants): 2017-07-22 Jason Marcell Cherry-pick r219633. rdar://problem/33465535 2017-07-18 Saam Barati AirLowerAfterRegAlloc may incorrectly use a callee save that's live as a scratch register https://bugs.webkit.org/show_bug.cgi?id=174515 Reviewed by Filip Pizlo. AirLowerAfterRegAlloc was computing the set of available scratch registers incorrectly. It was always excluding callee save registers from the set of live registers. It did not guarantee that live callee save registers were not in the set of scratch registers that could get clobbered. That's incorrect as the shuffling code is free to overwrite whatever is in the scratch register it gets passed. * b3/air/AirLowerAfterRegAlloc.cpp: (JSC::B3::Air::lowerAfterRegAlloc): * b3/testb3.cpp: (JSC::B3::functionNineArgs): (JSC::B3::testShuffleDoesntTrashCalleeSaves): (JSC::B3::run): * jit/RegisterSet.h: 2017-07-17 Jason Marcell Cherry-pick r219413. rdar://problem/33337335 2017-06-29 Dean Jackson Disable some features on this release branch. * Configurations/FeatureDefines.xcconfig: * runtime/Options.h: 2017-07-17 Saam Barati Remove custom defined RELEASE_ASSERT in DFGObjectAllocationSinkingPhase https://bugs.webkit.org/show_bug.cgi?id=174584 Rubber stamped by Keith Miller. I used it to diagnose a bug. The bug is now fixed. This custom RELEASE_ASSERT is no longer needed. * dfg/DFGObjectAllocationSinkingPhase.cpp: 2017-07-17 Michael Catanzaro -Wformat-truncation warning in ConfigFile.cpp https://bugs.webkit.org/show_bug.cgi?id=174506 Reviewed by Darin Adler. Check if the JSC config filename would be truncated due to exceeding max path length. If so, return ParseError. * runtime/ConfigFile.cpp: (JSC::ConfigFile::parse): 2017-07-17 Konstantin Tokarev [CMake] Create targets before WEBKIT_INCLUDE_CONFIG_FILES_IF_EXISTS is called https://bugs.webkit.org/show_bug.cgi?id=174557 Reviewed by Michael Catanzaro. * CMakeLists.txt: 2017-07-14 Yusuke Suzuki [WTF] Use std::unique_ptr for StackTrace https://bugs.webkit.org/show_bug.cgi?id=174495 Reviewed by Alex Christensen. * runtime/ExceptionScope.cpp: (JSC::ExceptionScope::unexpectedExceptionMessage): * runtime/VM.cpp: (JSC::VM::throwException): 2017-07-14 Yusuke Suzuki [JSC] Use WTFMove to prune liveness in DFGAvailabilityMap https://bugs.webkit.org/show_bug.cgi?id=174423 Reviewed by Saam Barati. * dfg/DFGAvailabilityMap.cpp: (JSC::DFG::AvailabilityMap::pruneHeap): (JSC::DFG::AvailabilityMap::pruneByLiveness): 2017-07-13 Michael Catanzaro Fix compiler warnings when building with GCC 7 https://bugs.webkit.org/show_bug.cgi?id=174463 Reviewed by Darin Adler. * disassembler/udis86/udis86_decode.c: (decode_operand): 2017-07-13 Michael Catanzaro Incorrect assertion in JSC::CallLinkInfo::callTypeFor https://bugs.webkit.org/show_bug.cgi?id=174467 Reviewed by Saam Barati. * bytecode/CallLinkInfo.cpp: (JSC::CallLinkInfo::callTypeFor): 2017-07-13 Joseph Pecoraro Web Inspector: Remove unused and untested Page domain commands https://bugs.webkit.org/show_bug.cgi?id=174429 Reviewed by Timothy Hatcher. * inspector/protocol/Page.json: 2017-07-13 Saam Barati Missing exception check in JSObject::hasInstance https://bugs.webkit.org/show_bug.cgi?id=174455 Reviewed by Mark Lam. * runtime/JSObject.cpp: (JSC::JSObject::hasInstance): 2017-07-13 Caio Lima [ESnext] Implement Object Spread https://bugs.webkit.org/show_bug.cgi?id=167963 Reviewed by Saam Barati. This patch implements ECMA262 stage 3 Object Spread proposal [1]. It's implemented using CopyDataPropertiesNoExclusions to copy all enumerable keys from object being spreaded. The implementation of CopyDataPropertiesNoExclusions follows the CopyDataProperties implementation, however we don't receive excludedNames as parameter. [1] - https://github.com/tc39/proposal-object-rest-spread * builtins/GlobalOperations.js: (globalPrivate.copyDataPropertiesNoExclusions): * bytecompiler/BytecodeGenerator.cpp: (JSC::BytecodeGenerator::emitLoad): * bytecompiler/NodesCodegen.cpp: (JSC::PropertyListNode::emitBytecode): (JSC::ObjectSpreadExpressionNode::emitBytecode): * parser/ASTBuilder.h: (JSC::ASTBuilder::createObjectSpreadExpression): (JSC::ASTBuilder::createProperty): * parser/NodeConstructors.h: (JSC::PropertyNode::PropertyNode): (JSC::ObjectSpreadExpressionNode::ObjectSpreadExpressionNode): * parser/Nodes.h: (JSC::ObjectSpreadExpressionNode::expression): * parser/Parser.cpp: (JSC::Parser::parseProperty): * parser/SyntaxChecker.h: (JSC::SyntaxChecker::createObjectSpreadExpression): (JSC::SyntaxChecker::createProperty): 2017-07-12 Mark Lam Gardening: build fix after r219434. https://bugs.webkit.org/show_bug.cgi?id=174441 Not reviewed. Make public some MacroAssembler functions that are needed by the probe implementationq. * assembler/MacroAssemblerARM.h: (JSC::MacroAssemblerARM::trustedImm32FromPtr): * assembler/MacroAssemblerARMv7.h: (JSC::MacroAssemblerARMv7::linkCall): 2017-07-12 Mark Lam Move Probe code from AbstractMacroAssembler to MacroAssembler. https://bugs.webkit.org/show_bug.cgi?id=174441 Reviewed by Saam Barati. This is a pure refactoring patch for moving probe code from the AbstractMacroAssembler to MacroAssembler. There is no code behavior change. * assembler/AbstractMacroAssembler.h: (JSC::AbstractMacroAssembler::Address::indexedBy): (JSC::AbstractMacroAssembler::CPUState::gprName): Deleted. (JSC::AbstractMacroAssembler::CPUState::fprName): Deleted. (JSC::AbstractMacroAssembler::CPUState::gpr): Deleted. (JSC::AbstractMacroAssembler::CPUState::fpr): Deleted. (JSC::MacroAssemblerType>::Address::indexedBy): Deleted. * assembler/MacroAssembler.h: (JSC::MacroAssembler::CPUState::gprName): (JSC::MacroAssembler::CPUState::fprName): (JSC::MacroAssembler::CPUState::gpr): (JSC::MacroAssembler::CPUState::fpr): * assembler/MacroAssemblerARM.cpp: (JSC::MacroAssembler::probe): (JSC::MacroAssemblerARM::probe): Deleted. * assembler/MacroAssemblerARM.h: * assembler/MacroAssemblerARM64.cpp: (JSC::MacroAssembler::probe): (JSC::MacroAssemblerARM64::probe): Deleted. * assembler/MacroAssemblerARM64.h: * assembler/MacroAssemblerARMv7.cpp: (JSC::MacroAssembler::probe): (JSC::MacroAssemblerARMv7::probe): Deleted. * assembler/MacroAssemblerARMv7.h: * assembler/MacroAssemblerMIPS.h: * assembler/MacroAssemblerX86Common.cpp: (JSC::MacroAssembler::probe): (JSC::MacroAssemblerX86Common::probe): Deleted. * assembler/MacroAssemblerX86Common.h: 2017-07-12 Saam Barati GenericArguments consults the wrong state when tracking modified argument descriptors and mapped arguments https://bugs.webkit.org/show_bug.cgi?id=174411 Reviewed by Mark Lam. The code for deleting an argument was incorrectly referencing state when it decided if it should unmap or mark a property as having its descriptor modified. This patch fixes the bug where if we delete a property, we would sometimes not unmap an argument when deleting it. * runtime/GenericArgumentsInlines.h: (JSC::GenericArguments::getOwnPropertySlot): (JSC::GenericArguments::getOwnPropertySlotByIndex): (JSC::GenericArguments::deleteProperty): (JSC::GenericArguments::deletePropertyByIndex): 2017-07-12 Commit Queue Unreviewed, rolling out r219176. https://bugs.webkit.org/show_bug.cgi?id=174436 "Can cause infinite recursion on iOS" (Requested by mlam on #webkit). Reverted changeset: "WTF::Thread should have the threads stack bounds." https://bugs.webkit.org/show_bug.cgi?id=173975 http://trac.webkit.org/changeset/219176 2017-07-12 Matt Lewis Unreviewed, rolling out r219401. This revision rolled out the previous patch, but after talking with reviewer, a rebaseline is what was needed.Rolling back in before rebaseline. Reverted changeset: "Unreviewed, rolling out r219379." https://bugs.webkit.org/show_bug.cgi?id=174400 http://trac.webkit.org/changeset/219401 2017-07-12 Matt Lewis Unreviewed, rolling out r219379. This revision caused a consistent failure in the test fast/dom/Window/property-access-on-cached-window-after-frame- removed.html. Reverted changeset: "Remove NAVIGATOR_HWCONCURRENCY" https://bugs.webkit.org/show_bug.cgi?id=174400 http://trac.webkit.org/changeset/219379 2017-07-12 Tooru Fujisawa [:arai] Wrong radix used in Unicode Escape in invalid character error message https://bugs.webkit.org/show_bug.cgi?id=174419 Reviewed by Alex Christensen. * parser/Lexer.cpp: (JSC::Lexer::invalidCharacterMessage): 2017-07-11 Dean Jackson Remove NAVIGATOR_HWCONCURRENCY https://bugs.webkit.org/show_bug.cgi?id=174400 Reviewed by Sam Weinig. * Configurations/FeatureDefines.xcconfig: 2017-07-11 Dean Jackson Rolling out r219372. * Configurations/FeatureDefines.xcconfig: 2017-07-11 Dean Jackson Remove NAVIGATOR_HWCONCURRENCY https://bugs.webkit.org/show_bug.cgi?id=174400 Reviewed by Sam Weinig. * Configurations/FeatureDefines.xcconfig: 2017-07-11 Saam Barati remove the empty JavaScriptCore/wasm/js/WebAssemblyFunctionCell.* files https://bugs.webkit.org/show_bug.cgi?id=174397 Rubber stamped by David Kilzer. * wasm/js/WebAssemblyFunctionCell.cpp: Removed. * wasm/js/WebAssemblyFunctionCell.h: Removed. 2017-07-10 Saam Barati Allocation sinking phase should consider a CheckStructure that would fail as an escape https://bugs.webkit.org/show_bug.cgi?id=174321 Reviewed by Filip Pizlo. When the allocation sinking phase was generating stores to materialize objects in a cycle with each other, it would assume that each materialized object had a valid, non empty, set of structures. This is an OK assumption for the phase to make because how do you materialize an object with no structure? The abstract interpretation part of the phase will model what's in the heap. However, it would sometimes model that a CheckStructure would fail. The phase did nothing special for this; it just stored the empty set of structures for its representation of a particular allocation. However, what the phase proved in such a scenario is that, had the CheckStructure executed, it would have exited. This patch treats such CheckStructures and MultiGetByOffsets as escape points. This will cause the allocation in question to be materialized just before the CheckStructure, and then at execution time, the CheckStructure will exit. I wasn't able to write a test case for this. However, I was able to reproduce this crash by manually editing the IR. I've opened a separate bug to help us create a testing framework for writing tests for hard to reproduce bugs like this: https://bugs.webkit.org/show_bug.cgi?id=174322 * dfg/DFGObjectAllocationSinkingPhase.cpp: 2017-07-10 Devin Rousso Web Inspector: Highlight matching CSS canvas clients when hovering contexts in the Resources tab https://bugs.webkit.org/show_bug.cgi?id=174279 Reviewed by Matt Baker. * inspector/protocol/DOM.json: Add `highlightNodeList` command that will highlight each node in the given list. 2017-07-03 Brian Burg Web Replay: remove some unused code https://bugs.webkit.org/show_bug.cgi?id=173903 Rubber-stamped by Joseph Pecoraro. * CMakeLists.txt: * Configurations/FeatureDefines.xcconfig: * DerivedSources.make: * JavaScriptCore.xcodeproj/project.pbxproj: * inspector/protocol/Replay.json: Removed. * replay/EmptyInputCursor.h: Removed. * replay/EncodedValue.cpp: Removed. * replay/EncodedValue.h: Removed. * replay/InputCursor.h: Removed. * replay/JSInputs.json: Removed. * replay/NondeterministicInput.h: Removed. * replay/scripts/CodeGeneratorReplayInputs.py: Removed. * replay/scripts/CodeGeneratorReplayInputsTemplates.py: Removed. * replay/scripts/tests/expected/fail-on-c-style-enum-no-storage.json-error: Removed. * replay/scripts/tests/expected/fail-on-duplicate-enum-type.json-error: Removed. * replay/scripts/tests/expected/fail-on-duplicate-input-names.json-error: Removed. * replay/scripts/tests/expected/fail-on-duplicate-type-names.json-error: Removed. * replay/scripts/tests/expected/fail-on-enum-type-missing-values.json-error: Removed. * replay/scripts/tests/expected/fail-on-missing-input-member-name.json-error: Removed. * replay/scripts/tests/expected/fail-on-missing-input-name.json-error: Removed. * replay/scripts/tests/expected/fail-on-missing-input-queue.json-error: Removed. * replay/scripts/tests/expected/fail-on-missing-type-mode.json-error: Removed. * replay/scripts/tests/expected/fail-on-missing-type-name.json-error: Removed. * replay/scripts/tests/expected/fail-on-unknown-input-queue.json-error: Removed. * replay/scripts/tests/expected/fail-on-unknown-member-type.json-error: Removed. * replay/scripts/tests/expected/fail-on-unknown-type-mode.json-error: Removed. * replay/scripts/tests/expected/generate-enum-encoding-helpers-with-guarded-values.json-TestReplayInputs.cpp: Removed. * replay/scripts/tests/expected/generate-enum-encoding-helpers-with-guarded-values.json-TestReplayInputs.h: Removed. * replay/scripts/tests/expected/generate-enum-encoding-helpers.json-TestReplayInputs.cpp: Removed. * replay/scripts/tests/expected/generate-enum-encoding-helpers.json-TestReplayInputs.h: Removed. * replay/scripts/tests/expected/generate-enum-with-guard.json-TestReplayInputs.cpp: Removed. * replay/scripts/tests/expected/generate-enum-with-guard.json-TestReplayInputs.h: Removed. * replay/scripts/tests/expected/generate-enums-with-same-base-name.json-TestReplayInputs.cpp: Removed. * replay/scripts/tests/expected/generate-enums-with-same-base-name.json-TestReplayInputs.h: Removed. * replay/scripts/tests/expected/generate-event-loop-shape-types.json-error: Removed. * replay/scripts/tests/expected/generate-input-with-guard.json-TestReplayInputs.cpp: Removed. * replay/scripts/tests/expected/generate-input-with-guard.json-TestReplayInputs.h: Removed. * replay/scripts/tests/expected/generate-input-with-vector-members.json-TestReplayInputs.cpp: Removed. * replay/scripts/tests/expected/generate-input-with-vector-members.json-TestReplayInputs.h: Removed. * replay/scripts/tests/expected/generate-inputs-with-flags.json-TestReplayInputs.cpp: Removed. * replay/scripts/tests/expected/generate-inputs-with-flags.json-TestReplayInputs.h: Removed. * replay/scripts/tests/expected/generate-memoized-type-modes.json-TestReplayInputs.cpp: Removed. * replay/scripts/tests/expected/generate-memoized-type-modes.json-TestReplayInputs.h: Removed. * replay/scripts/tests/fail-on-c-style-enum-no-storage.json: Removed. * replay/scripts/tests/fail-on-duplicate-enum-type.json: Removed. * replay/scripts/tests/fail-on-duplicate-input-names.json: Removed. * replay/scripts/tests/fail-on-duplicate-type-names.json: Removed. * replay/scripts/tests/fail-on-enum-type-missing-values.json: Removed. * replay/scripts/tests/fail-on-missing-input-member-name.json: Removed. * replay/scripts/tests/fail-on-missing-input-name.json: Removed. * replay/scripts/tests/fail-on-missing-input-queue.json: Removed. * replay/scripts/tests/fail-on-missing-type-mode.json: Removed. * replay/scripts/tests/fail-on-missing-type-name.json: Removed. * replay/scripts/tests/fail-on-unknown-input-queue.json: Removed. * replay/scripts/tests/fail-on-unknown-member-type.json: Removed. * replay/scripts/tests/fail-on-unknown-type-mode.json: Removed. * replay/scripts/tests/generate-enum-encoding-helpers-with-guarded-values.json: Removed. * replay/scripts/tests/generate-enum-encoding-helpers.json: Removed. * replay/scripts/tests/generate-enum-with-guard.json: Removed. * replay/scripts/tests/generate-enums-with-same-base-name.json: Removed. * replay/scripts/tests/generate-event-loop-shape-types.json: Removed. * replay/scripts/tests/generate-input-with-guard.json: Removed. * replay/scripts/tests/generate-input-with-vector-members.json: Removed. * replay/scripts/tests/generate-inputs-with-flags.json: Removed. * replay/scripts/tests/generate-memoized-type-modes.json: Removed. * runtime/DateConstructor.cpp: (JSC::constructDate): (JSC::dateNow): (JSC::deterministicCurrentTime): Deleted. * runtime/JSGlobalObject.cpp: (JSC::JSGlobalObject::JSGlobalObject): (JSC::JSGlobalObject::setInputCursor): Deleted. * runtime/JSGlobalObject.h: (JSC::JSGlobalObject::inputCursor): Deleted. 2017-07-10 Carlos Garcia Campos Move make-js-file-arrays.py from WebCore to JavaScriptCore https://bugs.webkit.org/show_bug.cgi?id=174024 Reviewed by Michael Catanzaro. It's currently used only by WebCore, but it depends on other JavaScriptCore scripts and it's not WebCore specific at all. I plan to use it to compile the JavaScript atoms used by the WebDriver implementation. Added command line option to pass the namespace to use instead of using WebCore. * JavaScriptCore.xcodeproj/project.pbxproj: * Scripts/make-js-file-arrays.py: Renamed from Source/WebCore/Scripts/make-js-file-arrays.py. (main): 2017-07-09 Yusuke Suzuki [JSC] Drop LineNumberAdder since we no longer treat (not ) as one line terminator https://bugs.webkit.org/show_bug.cgi?id=174296 Reviewed by Mark Lam. Previously, we treat as one line terminator. So we increase line number by one. It caused a problem in scanning template literals. While template literals normalize to , we still needed to increase line number by only one. To handle it correctly, LineNumberAdder is introduced. As of r219263, is counted as two line terminators. So we do not need to have LineNumberAdder. Let's just use shiftLineTerminator() instead. * parser/Lexer.cpp: (JSC::Lexer::parseTemplateLiteral): (JSC::LineNumberAdder::LineNumberAdder): Deleted. (JSC::LineNumberAdder::clear): Deleted. (JSC::LineNumberAdder::add): Deleted. 2017-07-09 Dan Bernstein [Xcode] ICU headers aren’t treated as system headers after r219155 https://bugs.webkit.org/show_bug.cgi?id=174299 Reviewed by Sam Weinig. * Configurations/JavaScriptCore.xcconfig: Pass --system-header-prefix=unicode/ to the C and C++ compilers. * runtime/IntlCollator.cpp: Removed documentation warning suppression. * runtime/IntlDateTimeFormat.cpp: Ditto. * runtime/JSGlobalObject.cpp: Ditto. * runtime/StringPrototype.cpp: Ditto. 2017-07-09 Yusuke Suzuki [JSC] Use fastMalloc / fastFree for STL containers https://bugs.webkit.org/show_bug.cgi?id=174297 Reviewed by Sam Weinig. In some places, we intentionally use STL containers over WTF containers. For example, we sometimes use std::unordered_{set,map} instead of WTF::Hash{Set,Map} because we do not have effective empty / deleted representations in the space of key's value. But just using STL container means using libc's malloc instead of our fast malloc (bmalloc if it is enabled). We introduce WTF::FastAllocator. This is C++ allocator implementation using fastMalloc and fastFree. We specify this allocator to STL containers' template parameter to allocate memory from fastMalloc. This WTF::FastAllocator gives us a chance to use STL containers if it is necessary without compromising memory allocation throughput. * dfg/DFGGraph.h: * dfg/DFGIntegerCheckCombiningPhase.cpp: * ftl/FTLLowerDFGToB3.cpp: (JSC::FTL::DFG::LowerDFGToB3::switchStringSlow): * runtime/FunctionHasExecutedCache.h: * runtime/TypeLocationCache.h: 2017-07-08 Yusuke Suzuki Drop NOSNIFF compile flag https://bugs.webkit.org/show_bug.cgi?id=174289 Reviewed by Michael Catanzaro. * Configurations/FeatureDefines.xcconfig: 2017-07-07 AJ Ringer Lower the max_protection for the separated heap https://bugs.webkit.org/show_bug.cgi?id=174281 Reviewed by Oliver Hunt. Switch to vm_protect so we can set maximum page protection. * jit/ExecutableAllocator.cpp: (JSC::FixedVMPoolExecutableAllocator::initializeSeparatedWXHeaps): (JSC::ExecutableAllocator::allocate): 2017-07-07 Devin Rousso Web Inspector: Show all elements currently using a given CSS Canvas https://bugs.webkit.org/show_bug.cgi?id=173965 Reviewed by Joseph Pecoraro. * inspector/protocol/Canvas.json: - Add `requestCSSCanvasClientNodes` command for getting the node IDs all nodes using this canvas via -webkit-canvas. - Add `cssCanvasClientNodesChanged` event that is dispatched whenever a node is added/removed from the list of -webkit-canvas clients. 2017-07-07 Mark Lam \n\r is not the same as \r\n. https://bugs.webkit.org/show_bug.cgi?id=173053 Reviewed by Keith Miller. * parser/Lexer.cpp: (JSC::Lexer::shiftLineTerminator): (JSC::LineNumberAdder::add): 2017-07-07 Commit Queue Unreviewed, rolling out r219238, r219239, and r219241. https://bugs.webkit.org/show_bug.cgi?id=174265 "fast/workers/dedicated-worker-lifecycle.html is flaky" (Requested by yusukesuzuki on #webkit). Reverted changesets: "[WTF] Implement WTF::ThreadGroup" https://bugs.webkit.org/show_bug.cgi?id=174081 http://trac.webkit.org/changeset/219238 "Unreviewed, build fix after r219238" https://bugs.webkit.org/show_bug.cgi?id=174081 http://trac.webkit.org/changeset/219239 "Unreviewed, CLoop build fix after r219238" https://bugs.webkit.org/show_bug.cgi?id=174081 http://trac.webkit.org/changeset/219241 2017-07-06 Yusuke Suzuki Unreviewed, CLoop build fix after r219238 https://bugs.webkit.org/show_bug.cgi?id=174081 * heap/MachineStackMarker.cpp: 2017-07-05 Yusuke Suzuki [WTF] Implement WTF::ThreadGroup https://bugs.webkit.org/show_bug.cgi?id=174081 Reviewed by Mark Lam. Large part of MachineThreads are now removed and replaced with WTF::ThreadGroup. And SamplingProfiler and others interact with WTF::Thread directly. * API/tests/ExecutionTimeLimitTest.cpp: * heap/MachineStackMarker.cpp: (JSC::MachineThreads::MachineThreads): (JSC::captureStack): (JSC::MachineThreads::tryCopyOtherThreadStack): (JSC::MachineThreads::tryCopyOtherThreadStacks): (JSC::MachineThreads::gatherConservativeRoots): (JSC::ActiveMachineThreadsManager::Locker::Locker): Deleted. (JSC::ActiveMachineThreadsManager::add): Deleted. (JSC::ActiveMachineThreadsManager::remove): Deleted. (JSC::ActiveMachineThreadsManager::contains): Deleted. (JSC::ActiveMachineThreadsManager::ActiveMachineThreadsManager): Deleted. (JSC::activeMachineThreadsManager): Deleted. (JSC::MachineThreads::~MachineThreads): Deleted. (JSC::MachineThreads::addCurrentThread): Deleted. (): Deleted. (JSC::MachineThreads::removeThread): Deleted. (JSC::MachineThreads::removeThreadIfFound): Deleted. (JSC::MachineThreads::MachineThread::MachineThread): Deleted. (JSC::MachineThreads::MachineThread::getRegisters): Deleted. (JSC::MachineThreads::MachineThread::Registers::stackPointer): Deleted. (JSC::MachineThreads::MachineThread::Registers::framePointer): Deleted. (JSC::MachineThreads::MachineThread::Registers::instructionPointer): Deleted. (JSC::MachineThreads::MachineThread::Registers::llintPC): Deleted. (JSC::MachineThreads::MachineThread::captureStack): Deleted. * heap/MachineStackMarker.h: (JSC::MachineThreads::addCurrentThread): (JSC::MachineThreads::getLock): (JSC::MachineThreads::threads): (JSC::MachineThreads::MachineThread::suspend): Deleted. (JSC::MachineThreads::MachineThread::resume): Deleted. (JSC::MachineThreads::MachineThread::threadID): Deleted. (JSC::MachineThreads::MachineThread::stackBase): Deleted. (JSC::MachineThreads::MachineThread::stackEnd): Deleted. (JSC::MachineThreads::threadsListHead): Deleted. * runtime/SamplingProfiler.cpp: (JSC::FrameWalker::isValidFramePointer): (JSC::SamplingProfiler::SamplingProfiler): (JSC::SamplingProfiler::takeSample): (JSC::SamplingProfiler::noticeCurrentThreadAsJSCExecutionThread): * runtime/SamplingProfiler.h: * wasm/WasmMachineThreads.cpp: (JSC::Wasm::resetInstructionCacheOnAllThreads): 2017-07-06 Saam Barati We are missing places where we invalidate the for-in context https://bugs.webkit.org/show_bug.cgi?id=174184 Reviewed by Geoffrey Garen. * bytecompiler/BytecodeGenerator.cpp: (JSC::BytecodeGenerator::invalidateForInContextForLocal): * bytecompiler/NodesCodegen.cpp: (JSC::EmptyLetExpression::emitBytecode): (JSC::ForInNode::emitLoopHeader): (JSC::ForOfNode::emitBytecode): (JSC::BindingNode::bindValue): 2017-07-06 Yusuke Suzuki Unreviewed, suppress warnings in GCC environment * dfg/DFGObjectAllocationSinkingPhase.cpp: * runtime/IntlCollator.cpp: * runtime/IntlDateTimeFormat.cpp: * runtime/JSGlobalObject.cpp: * runtime/StringPrototype.cpp: 2017-07-05 Saam Barati NewArray in FTLLowerDFGToB3 does not handle speculating on doubles when having a bad time https://bugs.webkit.org/show_bug.cgi?id=174188 Reviewed by Mark Lam. We were calling lowJSValue(edge) when we were speculating the edge as double. This isn't allowed. We should have been using lowDouble. This patch also adds a new option, called useArrayAllocationProfiling, which defaults to true. When false, it will make the array allocation profile not actually sample seen arrays. It'll force the allocation profile's predicted indexing type to be ArrayWithUndecided. Adding this option made it trivial to write a test for this bug. * bytecode/ArrayAllocationProfile.cpp: (JSC::ArrayAllocationProfile::updateIndexingType): * ftl/FTLLowerDFGToB3.cpp: (JSC::FTL::DFG::LowerDFGToB3::compileNewArray): * runtime/Options.h: 2017-07-05 Yusuke Suzuki WTF::Thread should have the threads stack bounds. https://bugs.webkit.org/show_bug.cgi?id=173975 Reviewed by Keith Miller. There is a site in JSC that try to walk another thread's stack. Currently, stack bounds are stored in WTFThreadData which is located in TLS. Thus, only the thread itself can access its own WTFThreadData. We workaround this situation by holding StackBounds in MachineThread in JSC, but StackBounds should be put in WTF::Thread instead. This patch moves StackBounds from WTFThreadData to WTF::Thread. StackBounds information is tightly coupled with Thread. Thus putting it in WTF::Thread is natural choice. * heap/MachineStackMarker.cpp: (JSC::MachineThreads::MachineThread::MachineThread): (JSC::MachineThreads::MachineThread::captureStack): * heap/MachineStackMarker.h: (JSC::MachineThreads::MachineThread::stackBase): (JSC::MachineThreads::MachineThread::stackEnd): * runtime/InitializeThreading.cpp: (JSC::initializeThreading): * runtime/VM.cpp: (JSC::VM::VM): (JSC::VM::updateStackLimits): (JSC::VM::committedStackByteCount): * runtime/VM.h: (JSC::VM::isSafeToRecurse): * runtime/VMEntryScope.cpp: (JSC::VMEntryScope::VMEntryScope): * runtime/VMInlines.h: (JSC::VM::ensureStackCapacityFor): * runtime/VMTraps.cpp: * yarr/YarrPattern.cpp: (JSC::Yarr::YarrPatternConstructor::isSafeToRecurse): 2017-07-05 Keith Miller Crashing with information should have an abort reason https://bugs.webkit.org/show_bug.cgi?id=174185 Reviewed by Saam Barati. Add crash information for the abstract interpreter and add an enum value for object allocation sinking. * assembler/AbortReason.h: * dfg/DFGAbstractInterpreterInlines.h: (JSC::DFG::AbstractInterpreter::verifyEdge): * dfg/DFGGraph.cpp: (JSC::DFG::logDFGAssertionFailure): * dfg/DFGObjectAllocationSinkingPhase.cpp: 2017-07-03 Myles C. Maxfield Remove copy of ICU headers from WebKit https://bugs.webkit.org/show_bug.cgi?id=116407 Reviewed by Alex Christensen. Use WTF's copy of ICU headers. * Configurations/Base.xcconfig: * icu/unicode/localpointer.h: Removed. * icu/unicode/parseerr.h: Removed. * icu/unicode/platform.h: Removed. * icu/unicode/ptypes.h: Removed. * icu/unicode/putil.h: Removed. * icu/unicode/uchar.h: Removed. * icu/unicode/ucnv.h: Removed. * icu/unicode/ucnv_err.h: Removed. * icu/unicode/ucol.h: Removed. * icu/unicode/uconfig.h: Removed. * icu/unicode/ucurr.h: Removed. * icu/unicode/uenum.h: Removed. * icu/unicode/uiter.h: Removed. * icu/unicode/uloc.h: Removed. * icu/unicode/umachine.h: Removed. * icu/unicode/unorm.h: Removed. * icu/unicode/unorm2.h: Removed. * icu/unicode/urename.h: Removed. * icu/unicode/uscript.h: Removed. * icu/unicode/uset.h: Removed. * icu/unicode/ustring.h: Removed. * icu/unicode/utf.h: Removed. * icu/unicode/utf16.h: Removed. * icu/unicode/utf8.h: Removed. * icu/unicode/utf_old.h: Removed. * icu/unicode/utypes.h: Removed. * icu/unicode/uvernum.h: Removed. * icu/unicode/uversion.h: Removed. * runtime/IntlCollator.cpp: * runtime/IntlDateTimeFormat.cpp: (JSC::IntlDateTimeFormat::partTypeString): * runtime/JSGlobalObject.cpp: * runtime/StringPrototype.cpp: (JSC::normalize): (JSC::stringProtoFuncNormalize): 2017-07-05 Devin Rousso Web Inspector: Allow users to log any tracked canvas context https://bugs.webkit.org/show_bug.cgi?id=173397 Reviewed by Joseph Pecoraro. * inspector/protocol/Canvas.json: Add `resolveCanvasContext` command that returns a RemoteObject for the given canvas context. 2017-07-05 Jonathan Bedard Add WebKitPrivateFrameworkStubs for iOS 11 https://bugs.webkit.org/show_bug.cgi?id=173988 Reviewed by David Kilzer. * Configurations/Base.xcconfig: iphoneos and iphonesimulator should use the same directory for private framework stubs. 2017-07-05 JF Bastien WebAssembly: implement name section's module name, skip unknown sections https://bugs.webkit.org/show_bug.cgi?id=172008 Reviewed by Keith Miller. Parse the WebAssembly module name properly, and skip unknown sections. This is useful because as toolchains support new types of names we want to keep displaying the information we know about and simply ignore new information. That capability was designed into WebAssembly's name section. Failure to commit this patch would mean that WebKit won't display stack trace information, which would make developers sad. Module names were added here: https://github.com/WebAssembly/design/pull/1055 Note that this patch doesn't do anything with the parsed name! Two reasons for this: module names aren't supported in binaryen yet, so I can't write a simple binary test; and using the name is a slightly riskier change because it requires changing StackVisitor + StackFrame (where they print "[wasm code]") which requires figuring out the frame's Module. The latter bit isn't trivial because we only know wasm frames from their tag bits, and CodeBlocks are always nullptr. Binaryen bug: https://github.com/WebAssembly/binaryen/issues/1010 I filed #174098 to use the module name. * wasm/WasmFormat.h: (JSC::Wasm::isValidNameType): * wasm/WasmNameSectionParser.cpp: 2017-07-04 Joseph Pecoraro Cleanup some StringBuilder use https://bugs.webkit.org/show_bug.cgi?id=174118 Reviewed by Andreas Kling. * runtime/FunctionConstructor.cpp: (JSC::constructFunctionSkippingEvalEnabledCheck): * tools/FunctionOverrides.cpp: (JSC::parseClause): * wasm/WasmOMGPlan.cpp: * wasm/WasmPlan.cpp: * wasm/WasmValidate.cpp: 2017-07-03 Saam Barati LayoutTest workers/bomb.html is a Crash https://bugs.webkit.org/show_bug.cgi?id=167757 Reviewed by Keith Miller. VMTraps::SignalSender was accessing VM fields even after the VM was destroyed. This happened when the SignalSender thread was in the middle of its work() function while VMTraps was notified that the VM was shutting down. The VM would proceed to run its destructor even after the SignalSender thread finished doing its work. This means that the SignalSender thread was accessing VM field eve after VM was destructed (including itself, since it is transitively owned by the VM). The VM must wait for the SignalSender thread to shutdown before it can continue to destruct itself. * runtime/VMTraps.cpp: (JSC::VMTraps::willDestroyVM): 2017-07-03 Saam Barati DFGBytecodeParser op_to_this does not access the correct instruction offset for to this status https://bugs.webkit.org/show_bug.cgi?id=174110 Reviewed by Michael Saboff. * dfg/DFGByteCodeParser.cpp: (JSC::DFG::ByteCodeParser::parseBlock): 2017-07-03 Saam Barati Add a new assertion to object allocation sinking phase https://bugs.webkit.org/show_bug.cgi?id=174107 Rubber stamped by Filip Pizlo. * dfg/DFGObjectAllocationSinkingPhase.cpp: 2017-07-03 Commit Queue Unreviewed, rolling out r219060. https://bugs.webkit.org/show_bug.cgi?id=174108 crashing constantly when initializing UIWebView (Requested by thorton on #webkit). Reverted changeset: "WTF::Thread should have the threads stack bounds." https://bugs.webkit.org/show_bug.cgi?id=173975 http://trac.webkit.org/changeset/219060 2017-07-03 Matt Lewis Unreviewed, rolling out r219103. Caused multiple build failures. Reverted changeset: "Remove copy of ICU headers from WebKit" https://bugs.webkit.org/show_bug.cgi?id=116407 http://trac.webkit.org/changeset/219103 2017-07-03 Myles C. Maxfield Remove copy of ICU headers from WebKit https://bugs.webkit.org/show_bug.cgi?id=116407 Reviewed by Alex Christensen. Use WTF's copy of ICU headers. * Configurations/Base.xcconfig: * icu/unicode/localpointer.h: Removed. * icu/unicode/parseerr.h: Removed. * icu/unicode/platform.h: Removed. * icu/unicode/ptypes.h: Removed. * icu/unicode/putil.h: Removed. * icu/unicode/uchar.h: Removed. * icu/unicode/ucnv.h: Removed. * icu/unicode/ucnv_err.h: Removed. * icu/unicode/ucol.h: Removed. * icu/unicode/uconfig.h: Removed. * icu/unicode/ucurr.h: Removed. * icu/unicode/uenum.h: Removed. * icu/unicode/uiter.h: Removed. * icu/unicode/uloc.h: Removed. * icu/unicode/umachine.h: Removed. * icu/unicode/unorm.h: Removed. * icu/unicode/unorm2.h: Removed. * icu/unicode/urename.h: Removed. * icu/unicode/uscript.h: Removed. * icu/unicode/uset.h: Removed. * icu/unicode/ustring.h: Removed. * icu/unicode/utf.h: Removed. * icu/unicode/utf16.h: Removed. * icu/unicode/utf8.h: Removed. * icu/unicode/utf_old.h: Removed. * icu/unicode/utypes.h: Removed. * icu/unicode/uvernum.h: Removed. * icu/unicode/uversion.h: Removed. * runtime/IntlCollator.cpp: * runtime/IntlDateTimeFormat.cpp: * runtime/JSGlobalObject.cpp: * runtime/StringPrototype.cpp: 2017-07-03 Saam Barati Add better crash logging for allocation sinking phase https://bugs.webkit.org/show_bug.cgi?id=174102 Rubber stamped by Filip Pizlo. I'm trying to gather better information from crashlogs about why we're crashing in the allocation sinking phase. I'm adding a allocation sinking specific RELEASE_ASSERT as well as marking a few functions as NEVER_INLINE to have the stack traces in the crash trace contain more actionable information. * dfg/DFGObjectAllocationSinkingPhase.cpp: 2017-07-03 Sam Weinig [WebIDL] Remove more unnecessary uses of the preprocessor in idl files https://bugs.webkit.org/show_bug.cgi?id=174083 Reviewed by Alex Christensen. * Configurations/FeatureDefines.xcconfig: Add ENABLE_NAVIGATOR_STANDALONE. 2017-07-03 Andy Estes [Xcode] Add an experimental setting to build with ccache https://bugs.webkit.org/show_bug.cgi?id=173875 Reviewed by Tim Horton. * Configurations/DebugRelease.xcconfig: Included ccache.xcconfig. 2017-07-03 Devin Rousso Web Inspector: Support listing WebGL2 and WebGPU contexts https://bugs.webkit.org/show_bug.cgi?id=173396 Reviewed by Joseph Pecoraro. * inspector/protocol/Canvas.json: * inspector/scripts/codegen/generator.py: (Generator.stylized_name_for_enum_value): Add cases for handling new Canvas.ContextType protocol enumerations: - "webgl2" maps to `WebGL2` - "webgpu" maps to `WebGPU` 2017-07-02 Yusuke Suzuki WTF::Thread should have the threads stack bounds. https://bugs.webkit.org/show_bug.cgi?id=173975 Reviewed by Mark Lam. There is a site in JSC that try to walk another thread's stack. Currently, stack bounds are stored in WTFThreadData which is located in TLS. Thus, only the thread itself can access its own WTFThreadData. We workaround this situation by holding StackBounds in MachineThread in JSC, but StackBounds should be put in WTF::Thread instead. This patch moves StackBounds from WTFThreadData to WTF::Thread. StackBounds information is tightly coupled with Thread. Thus putting it in WTF::Thread is natural choice. * heap/MachineStackMarker.cpp: (JSC::MachineThreads::MachineThread::MachineThread): (JSC::MachineThreads::MachineThread::captureStack): * heap/MachineStackMarker.h: (JSC::MachineThreads::MachineThread::stackBase): (JSC::MachineThreads::MachineThread::stackEnd): * runtime/InitializeThreading.cpp: (JSC::initializeThreading): * runtime/VM.cpp: (JSC::VM::VM): (JSC::VM::updateStackLimits): (JSC::VM::committedStackByteCount): * runtime/VM.h: (JSC::VM::isSafeToRecurse): * runtime/VMEntryScope.cpp: (JSC::VMEntryScope::VMEntryScope): * runtime/VMInlines.h: (JSC::VM::ensureStackCapacityFor): * runtime/VMTraps.cpp: * yarr/YarrPattern.cpp: (JSC::Yarr::YarrPatternConstructor::isSafeToRecurse): 2017-07-01 Dan Bernstein [iOS] Remove code only needed when building for iOS 9.x https://bugs.webkit.org/show_bug.cgi?id=174068 Reviewed by Tim Horton. * Configurations/FeatureDefines.xcconfig: * jit/ExecutableAllocator.cpp: * runtime/Options.cpp: (JSC::recomputeDependentOptions): 2017-07-01 Dan Bernstein [macOS] Remove code only needed when building for OS X Yosemite https://bugs.webkit.org/show_bug.cgi?id=174067 Reviewed by Tim Horton. * API/WebKitAvailability.h: * Configurations/Base.xcconfig: * Configurations/DebugRelease.xcconfig: * Configurations/FeatureDefines.xcconfig: * Configurations/Version.xcconfig: 2017-07-01 Yusuke Suzuki Unreviewed, build fix for GCC https://bugs.webkit.org/show_bug.cgi?id=174034 * b3/testb3.cpp: (JSC::B3::testDoubleLiteralComparison): 2017-06-30 Keith Miller Force crashWithInfo to be out of line. https://bugs.webkit.org/show_bug.cgi?id=174028 Reviewed by Filip Pizlo. Update DFG_ASSERT macro to call CRASH_WITH_SECURITY_IMPLICATION_AND_INFO. * dfg/DFGGraph.cpp: (JSC::DFG::logDFGAssertionFailure): (JSC::DFG::Graph::logAssertionFailure): (JSC::DFG::crash): Deleted. (JSC::DFG::Graph::handleAssertionFailure): Deleted. * dfg/DFGGraph.h: 2017-06-30 Yusuke Suzuki [JSC] Use AbstractMacroAssembler::random instead of holding WeakRandom in JIT https://bugs.webkit.org/show_bug.cgi?id=174053 Reviewed by Geoffrey Garen. We already have AbstractMacroAssembler::random() function. Use it instead. * jit/JIT.cpp: (JSC::JIT::JIT): (JSC::JIT::compileWithoutLinking): * jit/JIT.h: 2017-06-30 Yusuke Suzuki [WTF] Drop SymbolRegistry::keyForSymbol https://bugs.webkit.org/show_bug.cgi?id=174052 Reviewed by Sam Weinig. * runtime/SymbolConstructor.cpp: (JSC::symbolConstructorKeyFor): 2017-06-30 Saam Barati B3ReduceStrength should reduce EqualOrUnordered over const float input https://bugs.webkit.org/show_bug.cgi?id=174039 Reviewed by Michael Saboff. We perform this folding for ConstDoubleValue. It is simply an oversight that we didn't do it for ConstFloatValue. * b3/B3ConstFloatValue.cpp: (JSC::B3::ConstFloatValue::equalOrUnorderedConstant): * b3/B3ConstFloatValue.h: * b3/testb3.cpp: (JSC::B3::testFloatEqualOrUnorderedFolding): (JSC::B3::testFloatEqualOrUnorderedFoldingNaN): (JSC::B3::testFloatEqualOrUnorderedDontFold): (JSC::B3::run): 2017-06-30 Matt Baker Web Inspector: AsyncStackTrace nodes can be corrupted when truncating https://bugs.webkit.org/show_bug.cgi?id=173840 Reviewed by Joseph Pecoraro. When truncating an asynchronous stack trace, the parent chain is traversed until a locked node is found. The path from this node to the root is shared by more than one stack trace, and cannot be safely modified. Starting at the first locked node, the path is cloned and becomes a new stack trace tree. However, the clone operation initialized each new AsyncStackTrace node with the original node's parent. This would increment the child count of the original node. When cloning nodes, new nodes should not have their parent set until the next node up the parent chain is cloned. * inspector/AsyncStackTrace.cpp: (Inspector::AsyncStackTrace::truncate): 2017-06-30 Michael Saboff RegExp's anchored with .* with \g flag can return wrong match start for strings with multiple matches https://bugs.webkit.org/show_bug.cgi?id=174044 Reviewed by Oliver Hunt. The .* enclosure optimization didn't respect that we can start matching from a non-zero index. This optimization treats /.*.*/ by first matching the and then finding the extent of the match by going back to the beginning of the line and going forward to the end of the line. The code that went back to the beginning of the line checked for an index of 0 instead of comparing the index to the start position. This start position is passed as the initial index. Added another temporary register to the YARR JIT to contain the start position for platforms that have spare registers. * yarr/Yarr.h: * yarr/YarrInterpreter.cpp: (JSC::Yarr::Interpreter::matchDotStarEnclosure): (JSC::Yarr::Interpreter::Interpreter): * yarr/YarrJIT.cpp: (JSC::Yarr::YarrGenerator::generateDotStarEnclosure): (JSC::Yarr::YarrGenerator::compile): * yarr/YarrPattern.cpp: (JSC::Yarr::YarrPattern::YarrPattern): * yarr/YarrPattern.h: (JSC::Yarr::YarrPattern::reset): 2017-06-30 Saam Barati B3MoveConstants floatZero() returns the wrong ValueKey https://bugs.webkit.org/show_bug.cgi?id=174040 Reviewed by Filip Pizlo. It had a typo where the ValueKey for floatZero() produces a Double instead of a Float. * b3/B3MoveConstants.cpp: 2017-06-30 Saam Barati B3ReduceDoubleToFloat incorrectly reduces operations over two double constants https://bugs.webkit.org/show_bug.cgi?id=174034 Reviewed by Filip Pizlo. B3ReduceDoubleToFloat had a bug in it where it would incorrectly reduce binary operations over double constants into the same binary operation over the double constants casted to floats. This is clearly incorrect as these two things will produce different values. For example: a = DoubleConst(bitwise_cast(0x8000000000000001ull)) b = DoubleConst(bitwise_cast(0x0000000000000000ull)) c = EqualOrUnordered(@a, @b) // produces 0 into: a = FloatConst(static_cast(bitwise_cast(0x8000000000000001ull))) b = FloatConst(static_cast(bitwise_cast(0x0000000000000000ull))) c = EqualOrUnordered(@a, @b) // produces 1 Which produces a different value for @c. * b3/B3ReduceDoubleToFloat.cpp: * b3/testb3.cpp: (JSC::B3::doubleEq): (JSC::B3::doubleNeq): (JSC::B3::doubleGt): (JSC::B3::doubleGte): (JSC::B3::doubleLt): (JSC::B3::doubleLte): (JSC::B3::testDoubleLiteralComparison): (JSC::B3::run): 2017-06-29 Jer Noble Make Legacy EME API controlled by RuntimeEnabled setting. https://bugs.webkit.org/show_bug.cgi?id=173994 Reviewed by Sam Weinig. * Configurations/FeatureDefines.xcconfig: * runtime/CommonIdentifiers.h: 2017-06-30 Ryosuke Niwa Ran sort-Xcode-project-file. * JavaScriptCore.xcodeproj/project.pbxproj: 2017-06-30 Matt Lewis Unreviewed, rolling out r218992. The patch broke the iOS device builds. Reverted changeset: "DFG_ASSERT should allow stuffing registers before trapping." https://bugs.webkit.org/show_bug.cgi?id=174005 http://trac.webkit.org/changeset/218992 2017-06-30 Filip Pizlo RegExpCachedResult::setInput should reify left and right contexts https://bugs.webkit.org/show_bug.cgi?id=173818 Reviewed by Keith Miller. If you don't reify them in setInput, then when you later try to reify them, you'll end up using indices into an old input string to create a substring of a new input string. That never goes well. * runtime/RegExpCachedResult.cpp: (JSC::RegExpCachedResult::setInput): 2017-06-30 Keith Miller DFG_ASSERT should allow stuffing registers before trapping. https://bugs.webkit.org/show_bug.cgi?id=174005 Reviewed by Mark Lam. DFG_ASSERT currently prints error data to stderr before crashing, which is nice for local development. In the wild, however, we can't see this information in crash logs. This patch enables stuffing some of the most useful information from DFG_ASSERTS into up to five registers right before crashing. The values stuffed should not impact any logging during local development. * assembler/AbortReason.h: * dfg/DFGAbstractInterpreterInlines.h: (JSC::DFG::AbstractInterpreter::verifyEdge): * dfg/DFGGraph.cpp: (JSC::DFG::logForCrash): (JSC::DFG::Graph::logAssertionFailure): (JSC::DFG::crash): Deleted. (JSC::DFG::Graph::handleAssertionFailure): Deleted. * dfg/DFGGraph.h: 2017-06-29 Saam Barati Calculating postCapacity in unshiftCountSlowCase is wrong https://bugs.webkit.org/show_bug.cgi?id=173992 Reviewed by Keith Miller. This patch fixes a bug inside unshiftCountSlowCase where we would use more memory than we allocated. The bug was when deciding how much extra space we have after the vector we've allocated. This area is called the postCapacity. The largest legal postCapacity value we could use is the space we allocated minus the space we need: largestPossiblePostCapacity = newStorageCapacity - requiredVectorLength; However, the code was calculating the postCapacity as: postCapacity = max(newStorageCapacity - requiredVectorLength, count); where count is how many elements we're appending. Depending on the inputs, count could be larger than (newStorageCapacity - requiredVectorLength). This would cause us to use more memory than we actually allocated. * runtime/JSArray.cpp: (JSC::JSArray::unshiftCountSlowCase): 2017-06-29 Commit Queue Unreviewed, rolling out r218512. https://bugs.webkit.org/show_bug.cgi?id=173981 "It changes the behavior of the JS API's JSEvaluateScript which breaks TurboTax" (Requested by saamyjoon on #webkit). Reverted changeset: "test262: Completion values for control flow do not match the spec" https://bugs.webkit.org/show_bug.cgi?id=171265 http://trac.webkit.org/changeset/218512 2017-06-29 JF Bastien WebAssembly: disable some APIs under CSP https://bugs.webkit.org/show_bug.cgi?id=173892 Reviewed by Daniel Bates. We should disable parts of WebAssembly under Content Security Policy as discussed here: https://github.com/WebAssembly/design/issues/1092 Exactly what should be disabled isn't super clear, so we may as well be conservative and disable many things if developers already opted into CSP. It's easy to loosen what we disable later. This patch disables: - WebAssembly.Instance - WebAssembly.instantiate - WebAssembly.Memory - WebAssembly.Table And leaves: - WebAssembly on the global object - WebAssembly.Module - WebAssembly.compile - WebAssembly.CompileError - WebAssembly.LinkError Nothing because currently unimplmented: - WebAssembly.compileStreaming - WebAssembly.instantiateStreaming That way it won't be possible to call WebAssembly-compiled code, or create memories (which use fancy 4GiB allocations sometimes). Table isn't really useful on its own, and eventually we may make them shareable so without more details it seems benign to disable them (and useless if we don't). I haven't done anything with postMessage, so you can still postMessage a WebAssembly.Module cross-CSP, but you can't instantiate it so it's useless. Because of this I elected to leave WebAssembly.Module and friends available. I haven't added any new directives. It's still unsafe-eval. We can add something else later, but it seems odd to add a WebAssembly as a new capability and tell developers "you should have been using this directive which we just implemented if you wanted to disable WebAssembly which didn't exist when you adopted CSP". So IMO we should keep unsafe-eval as it currently is, add WebAssembly to what it disables, and later consider having two new directives which do each individually or something. In all cases I throw an EvalError *before* other WebAssembly errors would be produced. Note that, as for eval, reporting doesn't work and is tracked by https://webkit.org/b/111869 * runtime/JSGlobalObject.cpp: (JSC::JSGlobalObject::JSGlobalObject): * runtime/JSGlobalObject.h: (JSC::JSGlobalObject::webAssemblyEnabled): (JSC::JSGlobalObject::webAssemblyDisabledErrorMessage): (JSC::JSGlobalObject::setWebAssemblyEnabled): * wasm/js/JSWebAssemblyInstance.cpp: (JSC::JSWebAssemblyInstance::create): * wasm/js/JSWebAssemblyMemory.cpp: (JSC::JSWebAssemblyMemory::create): * wasm/js/JSWebAssemblyMemory.h: * wasm/js/JSWebAssemblyTable.cpp: (JSC::JSWebAssemblyTable::create): * wasm/js/WebAssemblyMemoryConstructor.cpp: (JSC::constructJSWebAssemblyMemory): 2017-06-28 Keith Miller VMTraps has some races https://bugs.webkit.org/show_bug.cgi?id=173941 Reviewed by Michael Saboff. This patch refactors much of the VMTraps API. On the message sending side: 1) No longer uses the Yarr JIT check to determine if we are in RegExp code. That was unsound because RegExp JIT code can be run on compilation threads. Instead it looks at the current frame's code block slot and checks if it is valid, which is the same as what it did for JIT code previously. 2) Only have one signal sender thread, previously, there could be many at once, which caused some data races. Additionally, the signal sender thread is an automatic thread so it will deallocate itself when not in use. On the VMTraps breakpoint side: 1) We now have a true mapping of if we hit a breakpoint instead of a JIT assertion. So the exception handler won't eat JIT assertions anymore. 2) It jettisons all CodeBlocks that have VMTraps breakpoints on them instead of every CodeBlock on the stack. This both prevents us from hitting stale VMTraps breakpoints and also doesn't OSR codeblocks that otherwise don't need to be jettisoned. 3) The old exception handler could theoretically fail for a couple of reasons then resume execution with a clobbered instruction set. This patch will kill the program if the exception handler would fail. This patch also refactors some of the jsc.cpp functions to take the CommandLine options object instead of individual options. Also, there is a new command line option that makes exceptions due to watchdog timeouts an acceptable result. * API/tests/testapi.c: (main): * bytecode/CodeBlock.cpp: (JSC::CodeBlock::installVMTrapBreakpoints): * dfg/DFGCommonData.cpp: (JSC::DFG::pcCodeBlockMap): (JSC::DFG::CommonData::invalidate): (JSC::DFG::CommonData::~CommonData): (JSC::DFG::CommonData::installVMTrapBreakpoints): (JSC::DFG::codeBlockForVMTrapPC): * dfg/DFGCommonData.h: * jsc.cpp: (functionDollarAgentStart): (checkUncaughtException): (checkException): (runWithOptions): (printUsageStatement): (CommandLine::parseArguments): (jscmain): (runWithScripts): Deleted. * runtime/JSLock.cpp: (JSC::JSLock::didAcquireLock): * runtime/VMTraps.cpp: (JSC::sanitizedTopCallFrame): (JSC::VMTraps::tryInstallTrapBreakpoints): (JSC::VMTraps::willDestroyVM): (JSC::VMTraps::fireTrap): (JSC::VMTraps::handleTraps): (JSC::VMTraps::VMTraps): (JSC::VMTraps::~VMTraps): (JSC::findActiveVMAndStackBounds): Deleted. (JSC::installSignalHandler): Deleted. (JSC::VMTraps::addSignalSender): Deleted. (JSC::VMTraps::removeSignalSender): Deleted. (JSC::VMTraps::SignalSender::willDestroyVM): Deleted. (JSC::VMTraps::SignalSender::send): Deleted. * runtime/VMTraps.h: (JSC::VMTraps::~VMTraps): Deleted. (JSC::VMTraps::SignalSender::SignalSender): Deleted. 2017-06-28 Devin Rousso Web Inspector: Instrument active pixel memory used by canvases https://bugs.webkit.org/show_bug.cgi?id=173087 Reviewed by Joseph Pecoraro. * inspector/protocol/Canvas.json: - Add optional `memoryCost` attribute to the `Canvas` type. - Add `canvasMemoryChanged` event that is dispatched when the `memoryCost` of a canvas changes. 2017-06-28 Joseph Pecoraro Web Inspector: Cleanup Protocol JSON files https://bugs.webkit.org/show_bug.cgi?id=173934 Reviewed by Matt Baker. * inspector/protocol/ApplicationCache.json: * inspector/protocol/CSS.json: * inspector/protocol/Console.json: * inspector/protocol/DOM.json: * inspector/protocol/DOMDebugger.json: * inspector/protocol/Debugger.json: * inspector/protocol/LayerTree.json: * inspector/protocol/Network.json: * inspector/protocol/Page.json: * inspector/protocol/Runtime.json: Be more consistent about placement of `description` property. 2017-06-27 Joseph Pecoraro Web Inspector: Remove unused Inspector domain events https://bugs.webkit.org/show_bug.cgi?id=173905 Reviewed by Matt Baker. * inspector/protocol/Inspector.json: 2017-06-28 JF Bastien Ensure that computed new stack pointer values do not underflow. https://bugs.webkit.org/show_bug.cgi?id=173700 Reviewed by Filip Pizlo and Saam Barati, update reviewed by Mark Lam. Patch by Mark Lam, with the following fix: Re-apply this patch, it originally broke the ARM build because the llint code generated `subs xzr, x3, sp` which isn't valid ARM64: the third operand cannot be SP (that encoding would be ZR instead, subtracting zero). Flip the comparison and operands to emit valid code (because the second operand can be SP). 1. Added a RELEASE_ASSERT to BytecodeGenerator::generate() to ensure that m_numCalleeLocals is sane. 2. Added underflow checks in LLInt code and VarargsFrame code. 3. Introduce minimumReservedZoneSize, which is hardcoded to 16K. Ensure that Options::reservedZoneSize() is at least minimumReservedZoneSize. Ensure that Options::softReservedZoneSize() is at least greater than Options::reservedZoneSize() by minimumReservedZoneSize. 4. Ensure that stack checks emitted by JIT tiers include an underflow check if and only if the max size of the frame is greater than Options::reservedZoneSize(). By design, we are guaranteed to have at least Options::reservedZoneSize() bytes of memory at the bottom (end) of the stack. This means that, at any time, the frame pointer must be at least Options::reservedZoneSize() bytes away from the end of the stack. Hence, if the max frame size is less than Options::reservedZoneSize(), there's no way that frame pointer - max frame size can underflow, and we can elide the underflow check. Note that we use Options::reservedZoneSize() instead of Options::softReservedZoneSize() for determine if we need an underflow check. This is because the softStackLimit that is used for stack checks can be set based on Options::reservedZoneSize() during error handling (e.g. when creating strings for instantiating the Error object). Hence, the guaranteed minimum of distance between the frame pointer and the end of the stack is Options::reservedZoneSize() and nor Options::softReservedZoneSize(). Note also that we ensure that Options::reservedZoneSize() is at least minimumReservedZoneSize (i.e. 16K). In typical deployments, Options::reservedZoneSize() may be larger. Using Options::reservedZoneSize() instead of minimumReservedZoneSize gives us more chances to elide underflow checks. * JavaScriptCore.xcodeproj/project.pbxproj: * bytecompiler/BytecodeGenerator.cpp: (JSC::BytecodeGenerator::generate): * dfg/DFGGraph.cpp: (JSC::DFG::Graph::requiredRegisterCountForExecutionAndExit): * dfg/DFGJITCompiler.cpp: (JSC::DFG::emitStackOverflowCheck): (JSC::DFG::JITCompiler::compile): (JSC::DFG::JITCompiler::compileFunction): * ftl/FTLLowerDFGToB3.cpp: (JSC::FTL::DFG::LowerDFGToB3::lower): * jit/JIT.cpp: (JSC::JIT::compileWithoutLinking): * jit/SetupVarargsFrame.cpp: (JSC::emitSetupVarargsFrameFastCase): * llint/LLIntSlowPaths.cpp: (JSC::LLInt::LLINT_SLOW_PATH_DECL): * llint/LowLevelInterpreter.asm: * llint/LowLevelInterpreter32_64.asm: * llint/LowLevelInterpreter64.asm: * runtime/MinimumReservedZoneSize.h: Added. * runtime/Options.cpp: (JSC::recomputeDependentOptions): * runtime/VM.cpp: (JSC::VM::updateStackLimits): * wasm/WasmB3IRGenerator.cpp: (JSC::Wasm::B3IRGenerator::B3IRGenerator): * wasm/js/WebAssemblyFunction.cpp: (JSC::callWebAssemblyFunction): 2017-06-28 Chris Dumez Unreviewed, rolling out r218869. Broke the iOS build Reverted changeset: "Ensure that computed new stack pointer values do not underflow." https://bugs.webkit.org/show_bug.cgi?id=173700 http://trac.webkit.org/changeset/218869 2017-06-28 Chris Dumez Unreviewed, rolling out r218873. Broke the iOS build Reverted changeset: "Gardening: CLoop build fix." https://bugs.webkit.org/show_bug.cgi?id=173700 http://trac.webkit.org/changeset/218873 2017-06-28 Mark Lam Gardening: CLoop build fix. https://bugs.webkit.org/show_bug.cgi?id=173700 Not reviewed. * llint/LLIntSlowPaths.cpp: (JSC::LLInt::LLINT_SLOW_PATH_DECL): 2017-06-28 Mark Lam Ensure that computed new stack pointer values do not underflow. https://bugs.webkit.org/show_bug.cgi?id=173700 Reviewed by Filip Pizlo and Saam Barati. 1. Added a RELEASE_ASSERT to BytecodeGenerator::generate() to ensure that m_numCalleeLocals is sane. 2. Added underflow checks in LLInt code and VarargsFrame code. 3. Introduce minimumReservedZoneSize, which is hardcoded to 16K. Ensure that Options::reservedZoneSize() is at least minimumReservedZoneSize. Ensure that Options::softReservedZoneSize() is at least greater than Options::reservedZoneSize() by minimumReservedZoneSize. 4. Ensure that stack checks emitted by JIT tiers include an underflow check if and only if the max size of the frame is greater than Options::reservedZoneSize(). By design, we are guaranteed to have at least Options::reservedZoneSize() bytes of memory at the bottom (end) of the stack. This means that, at any time, the frame pointer must be at least Options::reservedZoneSize() bytes away from the end of the stack. Hence, if the max frame size is less than Options::reservedZoneSize(), there's no way that frame pointer - max frame size can underflow, and we can elide the underflow check. Note that we use Options::reservedZoneSize() instead of Options::softReservedZoneSize() for determine if we need an underflow check. This is because the softStackLimit that is used for stack checks can be set based on Options::reservedZoneSize() during error handling (e.g. when creating strings for instantiating the Error object). Hence, the guaranteed minimum of distance between the frame pointer and the end of the stack is Options::reservedZoneSize() and nor Options::softReservedZoneSize(). Note also that we ensure that Options::reservedZoneSize() is at least minimumReservedZoneSize (i.e. 16K). In typical deployments, Options::reservedZoneSize() may be larger. Using Options::reservedZoneSize() instead of minimumReservedZoneSize gives us more chances to elide underflow checks. * JavaScriptCore.xcodeproj/project.pbxproj: * bytecompiler/BytecodeGenerator.cpp: (JSC::BytecodeGenerator::generate): * dfg/DFGGraph.cpp: (JSC::DFG::Graph::requiredRegisterCountForExecutionAndExit): * dfg/DFGJITCompiler.cpp: (JSC::DFG::JITCompiler::compile): (JSC::DFG::JITCompiler::compileFunction): * ftl/FTLLowerDFGToB3.cpp: (JSC::FTL::DFG::LowerDFGToB3::lower): * jit/JIT.cpp: (JSC::JIT::compileWithoutLinking): * jit/SetupVarargsFrame.cpp: (JSC::emitSetupVarargsFrameFastCase): * llint/LLIntSlowPaths.cpp: (JSC::LLInt::LLINT_SLOW_PATH_DECL): * llint/LowLevelInterpreter.asm: * llint/LowLevelInterpreter32_64.asm: * llint/LowLevelInterpreter64.asm: * runtime/MinimumReservedZoneSize.h: Added. * runtime/Options.cpp: (JSC::recomputeDependentOptions): * runtime/VM.cpp: (JSC::VM::updateStackLimits): * wasm/WasmB3IRGenerator.cpp: (JSC::Wasm::B3IRGenerator::B3IRGenerator): * wasm/js/WebAssemblyFunction.cpp: (JSC::callWebAssemblyFunction): 2017-06-27 JF Bastien WebAssembly: running out of executable memory should throw OoM https://bugs.webkit.org/show_bug.cgi?id=171537 Reviewed by Saam Barati. Both on first compile with BBQ as well as on tier-up with OMG, running out of X memory shouldn't cause the entire program to terminate. An exception will do when compiling initial code (since we don't have any other fallback at the moment), and refusal to tier up will do as well (it'll just be slower). This is useful because programs which generate huge amounts of code simply look like crashes, which developers report to us. Getting a JavaScript exception instead is much clearer. * jit/ExecutableAllocator.cpp: (JSC::ExecutableAllocator::allocate): * llint/LLIntSlowPaths.cpp: (JSC::LLInt::shouldJIT): * runtime/Options.h: * wasm/WasmBBQPlan.cpp: (JSC::Wasm::BBQPlan::prepare): (JSC::Wasm::BBQPlan::complete): * wasm/WasmBinding.cpp: (JSC::Wasm::wasmToJs): (JSC::Wasm::wasmToWasm): * wasm/WasmBinding.h: * wasm/WasmOMGPlan.cpp: (JSC::Wasm::OMGPlan::work): * wasm/js/JSWebAssemblyCodeBlock.cpp: (JSC::JSWebAssemblyCodeBlock::JSWebAssemblyCodeBlock): * wasm/js/JSWebAssemblyCodeBlock.h: * wasm/js/JSWebAssemblyInstance.cpp: (JSC::JSWebAssemblyInstance::finalizeCreation): 2017-06-27 Saam Barati JITStubRoutine::passesFilter should use isJITPC https://bugs.webkit.org/show_bug.cgi?id=173906 Reviewed by JF Bastien. This patch makes JITStubRoutine use the isJITPC abstraction defined inside ExecutableAllocator.h. Before, JITStubRoutine was using a hardcoded platform size constant. This means it'd do the wrong thing if Options::jitMemoryReservationSize() was larger than the defined constant for that platform. This patch also removes a bunch of dead code in that file. * jit/ExecutableAllocator.cpp: * jit/ExecutableAllocator.h: * jit/JITStubRoutine.h: (JSC::JITStubRoutine::passesFilter): (JSC::JITStubRoutine::canPerformRangeFilter): Deleted. (JSC::JITStubRoutine::filteringStartAddress): Deleted. (JSC::JITStubRoutine::filteringExtentSize): Deleted. 2017-06-27 Saam Barati Fix some stale comments in Wasm code base https://bugs.webkit.org/show_bug.cgi?id=173814 Reviewed by Mark Lam. * wasm/WasmBinding.cpp: (JSC::Wasm::wasmToJs): * wasm/WasmOMGPlan.cpp: (JSC::Wasm::runOMGPlanForIndex): 2017-06-27 Caio Lima [ESnext] Implement Object Rest - Implementing Object Rest Destructuring https://bugs.webkit.org/show_bug.cgi?id=167962 Reviewed by Saam Barati. Object Rest/Spread Destructing proposal is in stage 3[1] and this Patch is a prototype implementation of it. A simple change over the parser was necessary to support the new '...' token on Object Pattern destruction rule. In the bytecode generator side, We changed the bytecode generated on ObjectPatternNode::bindValue to store in an set the identifiers of already destructured properties, following spec draft section[2], and then pass it as excludedNames to CopyDataProperties. The rest destructuring calls copyDataProperties to perform the copy of rest properties in rhs. We also implemented CopyDataProperties as private JS global operation on builtins/GlobalOperations.js following it's specification on [3]. It is implemented using Set object to verify if a property is on excludedNames to keep this algorithm with O(n + m) complexity, where n = number of source's own properties and m = excludedNames.length. In this implementation we aren't using excludeList as constant if destructuring pattern contains computed property, i.e. we can just determine the key to be excluded at runtime. If we can define all identifiers in the pattern in compile time, we then create a constant JSSet. This approach gives a good performance improvement, since we allocate the excludeSet just once, reducing GC pressure. [1] - https://github.com/tc39/proposal-object-rest-spread [2] - https://tc39.github.io/proposal-object-rest-spread/#Rest-RuntimeSemantics-PropertyDestructuringAssignmentEvaluation [3] - https://tc39.github.io/proposal-object-rest-spread/#AbstractOperations-CopyDataProperties * builtins/BuiltinNames.h: * builtins/GlobalOperations.js: (globalPrivate.copyDataProperties): * bytecode/CodeBlock.cpp: (JSC::CodeBlock::finishCreation): * bytecompiler/NodesCodegen.cpp: (JSC::ObjectPatternNode::bindValue): * parser/ASTBuilder.h: (JSC::ASTBuilder::appendObjectPatternEntry): (JSC::ASTBuilder::appendObjectPatternRestEntry): (JSC::ASTBuilder::setContainsObjectRestElement): * parser/Nodes.h: (JSC::ObjectPatternNode::appendEntry): (JSC::ObjectPatternNode::setContainsRestElement): * parser/Parser.cpp: (JSC::Parser::parseDestructuringPattern): (JSC::Parser::parseProperty): * parser/SyntaxChecker.h: (JSC::SyntaxChecker::operatorStackPop): * runtime/JSGlobalObject.cpp: (JSC::JSGlobalObject::init): * runtime/JSGlobalObject.h: (JSC::JSGlobalObject::asyncFunctionStructure): (JSC::JSGlobalObject::setStructure): Deleted. * runtime/JSGlobalObjectFunctions.cpp: (JSC::privateToObject): * runtime/JSGlobalObjectFunctions.h: * runtime/ObjectConstructor.cpp: (JSC::ObjectConstructor::finishCreation): * runtime/SetPrototype.cpp: (JSC::SetPrototype::finishCreation): 2017-06-27 Yusuke Suzuki [JSC] Do not touch VM after notifying Ready in DFG::Worklist https://bugs.webkit.org/show_bug.cgi?id=173888 Reviewed by Saam Barati. After notifying Plan::Ready and releasing Worklist lock, VM can be destroyed. Thus, Plan::vm() can return a destroyed VM. Do not touch it. This causes occasional SEGV / assertion failures in workers/bomb test. * dfg/DFGWorklist.cpp: 2017-06-27 Saam Barati Remove an inaccurate comment inside DFGClobberize.h https://bugs.webkit.org/show_bug.cgi?id=163874 Reviewed by Filip Pizlo. The comment said that Clobberize may or may not be sound if run prior to doing type inference. This is not correct, though. Clobberize *must* be sound prior do doing type inference since we use it inside the BytecodeParser, which is the very first thing the DFG does. * dfg/DFGClobberize.h: (JSC::DFG::clobberize): 2017-06-27 Saam Barati Function constructor needs to follow the spec and validate parameters and body independently https://bugs.webkit.org/show_bug.cgi?id=173303 Reviewed by Keith Miller. The Function constructor must check the arguments and body strings independently for syntax errors. People rely on this specified behavior to verify that a particular string is a valid function body. We used to check these things strings concatenated together, instead of independently. For example, this used to be valid: `Function("/*", "*/){")`. However, we should throw a syntax error here since "(/*)" is not a valid parameter list, and "*/){" is not a valid body. To implement the specified behavior, we check the syntax independently of both the body and the parameter list. To check that the parameter list has valid syntax, we check that it is valid if in a function with an empty body. To check that the body has valid syntax, we check it is valid in a function with an empty parameter list. * runtime/FunctionConstructor.cpp: (JSC::constructFunctionSkippingEvalEnabledCheck): 2017-06-27 Ting-Wei Lan Add missing includes to fix compilation error on FreeBSD https://bugs.webkit.org/show_bug.cgi?id=172919 Reviewed by Mark Lam. * API/JSRemoteInspector.h: * API/tests/GlobalContextWithFinalizerTest.cpp: * API/tests/TypedArrayCTest.cpp: 2017-06-27 Joseph Pecoraro Web Inspector: Crash generating object preview for ArrayIterator https://bugs.webkit.org/show_bug.cgi?id=173754 Reviewed by Saam Barati. When Inspector generates an object preview for an ArrayIterator instance it made a "clone" of the original ArrayIterator instance by constructing a new object with the instance's structure. However, user code could have modified that instance's structure, such as adding / removing properties. The `return` property had special meaning, and our clone did not fill that slot. This approach is brittle in that we weren't satisfying the expectations of an object with a particular Structure, and the original goal of having Web Inspector peek values of built-in Iterators was to avoid observable behavior. This tightens Web Inspector's Iterator preview to only peek values if the Iterators would actually be non-observable. It also builds an ArrayIterator clone like a regular object construction. * inspector/JSInjectedScriptHost.cpp: (Inspector::cloneArrayIteratorObject): Build up the Object from scratch with a new ArrayIterator prototype. (Inspector::JSInjectedScriptHost::iteratorEntries): Only clone and peek iterators if it would not be observable. Also update iteration to be more in line with IterationOperations, such as when we call iteratorClose. * runtime/JSGlobalObject.cpp: (JSC::JSGlobalObject::JSGlobalObject): (JSC::JSGlobalObject::init): * runtime/JSGlobalObject.h: (JSC::JSGlobalObject::stringIteratorProtocolWatchpoint): * runtime/JSGlobalObjectInlines.h: (JSC::JSGlobalObject::isStringPrototypeIteratorProtocolFastAndNonObservable): Add a StringIterator WatchPoint in line with the Array/Map/Set iterator watchpoints. * runtime/JSMap.cpp: (JSC::JSMap::isIteratorProtocolFastAndNonObservable): (JSC::JSMap::canCloneFastAndNonObservable): * runtime/JSMap.h: * runtime/JSSet.cpp: (JSC::JSSet::isIteratorProtocolFastAndNonObservable): (JSC::JSSet::canCloneFastAndNonObservable): * runtime/JSSet.h: Promote isIteratorProtocolFastAndNonObservable to a method. * runtime/JSObject.cpp: (JSC::canDoFastPutDirectIndex): * runtime/JSTypeInfo.h: (JSC::TypeInfo::isArgumentsType): Helper to detect if an Object is an Arguments type. 2017-06-26 Saam Barati RegExpPrototype.js builtin uses for-of iteration which is almost certainly incorrect https://bugs.webkit.org/show_bug.cgi?id=173740 Reviewed by Mark Lam. The builtin was using for-of iteration to iterate over an internal list in its algorithm. For-of iteration is observable via user code in the global object, so this approach was wrong as it would break if a user changed the Array iteration protocol in some way. * builtins/RegExpPrototype.js: (replace): 2017-06-26 Mark Lam Renamed DumpRegisterFunctor to DumpReturnVirtualPCFunctor. https://bugs.webkit.org/show_bug.cgi?id=173848 Reviewed by JF Bastien. This functor only dumps the return VirtualPC. * interpreter/Interpreter.cpp: (JSC::DumpReturnVirtualPCFunctor::DumpReturnVirtualPCFunctor): (JSC::Interpreter::dumpRegisters): (JSC::DumpRegisterFunctor::DumpRegisterFunctor): Deleted. (JSC::DumpRegisterFunctor::operator()): Deleted. 2017-06-26 Saam Barati Crash in JSC::Lexer::setCode https://bugs.webkit.org/show_bug.cgi?id=172754 Reviewed by Mark Lam. The lexer was asking one of its buffers to reserve initial space that was O(text size in bytes). For large sources, this would end up causing the vector to overflow and crash. This patch changes this code be like the Lexer's other buffers and to only reserve a small starting buffer. * parser/Lexer.cpp: (JSC::Lexer::setCode): 2017-06-26 Yusuke Suzuki [WTF] Drop Thread::create(obsolete things) API since we can use lambda https://bugs.webkit.org/show_bug.cgi?id=173825 Reviewed by Saam Barati. * jsc.cpp: (startTimeoutThreadIfNeeded): (timeoutThreadMain): Deleted. 2017-06-26 Konstantin Tokarev Unreviewed, add missing header for CLoop * runtime/SymbolTable.cpp: 2017-06-26 Konstantin Tokarev Unreviewed, add missing header icncludes * parser/Lexer.h: 2017-06-25 Konstantin Tokarev Remove excessive headers from JavaScriptCore https://bugs.webkit.org/show_bug.cgi?id=173812 Reviewed by Darin Adler. * API/APIUtils.h: * assembler/LinkBuffer.cpp: * assembler/MacroAssemblerCodeRef.cpp: * b3/air/AirLiveness.h: * b3/air/AirLowerAfterRegAlloc.cpp: * bindings/ScriptValue.cpp: * bindings/ScriptValue.h: * bytecode/AccessCase.cpp: * bytecode/AccessCase.h: * bytecode/ArrayProfile.h: * bytecode/BytecodeDumper.h: * bytecode/BytecodeIntrinsicRegistry.cpp: * bytecode/BytecodeKills.h: * bytecode/BytecodeLivenessAnalysis.h: * bytecode/BytecodeUseDef.h: * bytecode/CallLinkStatus.h: * bytecode/CodeBlock.h: * bytecode/CodeOrigin.h: * bytecode/ComplexGetStatus.h: * bytecode/GetByIdStatus.h: * bytecode/GetByIdVariant.h: * bytecode/InlineCallFrame.h: * bytecode/InlineCallFrameSet.h: * bytecode/Instruction.h: * bytecode/InternalFunctionAllocationProfile.h: * bytecode/JumpTable.h: * bytecode/MethodOfGettingAValueProfile.h: * bytecode/ObjectPropertyConditionSet.h: * bytecode/Operands.h: * bytecode/PolymorphicAccess.h: * bytecode/PutByIdStatus.h: * bytecode/SpeculatedType.cpp: * bytecode/StructureSet.h: * bytecode/StructureStubInfo.h: * bytecode/UnlinkedCodeBlock.h: * bytecode/UnlinkedFunctionExecutable.h: * bytecode/ValueProfile.h: * bytecompiler/BytecodeGenerator.cpp: * bytecompiler/BytecodeGenerator.h: * bytecompiler/Label.h: * bytecompiler/StaticPropertyAnalysis.h: * debugger/DebuggerCallFrame.cpp: * dfg/DFGAbstractInterpreter.h: * dfg/DFGAdjacencyList.h: * dfg/DFGArgumentsUtilities.h: * dfg/DFGArrayMode.h: * dfg/DFGArrayifySlowPathGenerator.h: * dfg/DFGBackwardsPropagationPhase.h: * dfg/DFGBasicBlock.h: * dfg/DFGCallArrayAllocatorSlowPathGenerator.h: * dfg/DFGCallCreateDirectArgumentsSlowPathGenerator.h: * dfg/DFGCapabilities.h: * dfg/DFGCommon.h: * dfg/DFGCommonData.h: * dfg/DFGDesiredIdentifiers.h: * dfg/DFGDesiredWatchpoints.h: * dfg/DFGDisassembler.cpp: * dfg/DFGDominators.h: * dfg/DFGDriver.cpp: * dfg/DFGDriver.h: * dfg/DFGEdgeDominates.h: * dfg/DFGFinalizer.h: * dfg/DFGGenerationInfo.h: * dfg/DFGJITCompiler.cpp: * dfg/DFGJITCompiler.h: * dfg/DFGJITFinalizer.h: * dfg/DFGLivenessAnalysisPhase.h: * dfg/DFGMinifiedNode.h: * dfg/DFGMultiGetByOffsetData.h: * dfg/DFGNaturalLoops.cpp: * dfg/DFGNaturalLoops.h: * dfg/DFGNode.h: * dfg/DFGOSRAvailabilityAnalysisPhase.h: * dfg/DFGOSRExit.h: * dfg/DFGOSRExitCompilationInfo.h: * dfg/DFGOSRExitCompiler.cpp: * dfg/DFGOSRExitCompiler.h: * dfg/DFGOSRExitJumpPlaceholder.h: * dfg/DFGOperations.cpp: * dfg/DFGOperations.h: * dfg/DFGPlan.h: * dfg/DFGPreciseLocalClobberize.h: * dfg/DFGPromotedHeapLocation.h: * dfg/DFGRegisteredStructure.h: * dfg/DFGRegisteredStructureSet.h: * dfg/DFGSaneStringGetByValSlowPathGenerator.h: * dfg/DFGSlowPathGenerator.h: * dfg/DFGSnippetParams.h: * dfg/DFGSpeculativeJIT.h: * dfg/DFGToFTLDeferredCompilationCallback.h: * dfg/DFGToFTLForOSREntryDeferredCompilationCallback.h: * dfg/DFGValidate.h: * dfg/DFGValueSource.h: * dfg/DFGVariableEvent.h: * dfg/DFGVariableEventStream.h: * dfg/DFGWorklist.h: * domjit/DOMJITCallDOMGetterSnippet.h: * domjit/DOMJITEffect.h: * ftl/FTLLink.cpp: * ftl/FTLLowerDFGToB3.cpp: * ftl/FTLPatchpointExceptionHandle.h: * heap/AllocatorAttributes.h: * heap/CodeBlockSet.h: * heap/DeferGC.h: * heap/GCSegmentedArray.h: * heap/Heap.cpp: * heap/Heap.h: * heap/IncrementalSweeper.h: * heap/ListableHandler.h: * heap/MachineStackMarker.h: * heap/MarkedAllocator.h: * heap/MarkedBlock.cpp: * heap/MarkedBlock.h: * heap/MarkingConstraint.h: * heap/SlotVisitor.cpp: * heap/SlotVisitor.h: * inspector/ConsoleMessage.cpp: * inspector/ConsoleMessage.h: * inspector/InjectedScript.h: * inspector/InjectedScriptHost.h: * inspector/InjectedScriptManager.cpp: * inspector/JSGlobalObjectInspectorController.cpp: * inspector/JavaScriptCallFrame.h: * inspector/ScriptCallStack.h: * inspector/ScriptCallStackFactory.cpp: * inspector/ScriptDebugServer.h: * inspector/agents/InspectorConsoleAgent.h: * inspector/agents/InspectorDebuggerAgent.cpp: * inspector/agents/InspectorDebuggerAgent.h: * inspector/agents/InspectorHeapAgent.cpp: * inspector/agents/InspectorHeapAgent.h: * inspector/agents/InspectorRuntimeAgent.h: * inspector/agents/InspectorScriptProfilerAgent.cpp: * inspector/agents/InspectorScriptProfilerAgent.h: * inspector/agents/JSGlobalObjectConsoleAgent.h: * inspector/agents/JSGlobalObjectDebuggerAgent.cpp: * inspector/agents/JSGlobalObjectDebuggerAgent.h: * inspector/agents/JSGlobalObjectRuntimeAgent.h: * inspector/augmentable/AlternateDispatchableAgent.h: * interpreter/CLoopStack.h: * interpreter/CachedCall.h: * interpreter/CallFrame.h: * interpreter/Interpreter.cpp: * interpreter/Interpreter.h: * jit/AssemblyHelpers.cpp: * jit/AssemblyHelpers.h: * jit/CCallHelpers.h: * jit/CallFrameShuffler.h: * jit/ExecutableAllocator.h: * jit/GCAwareJITStubRoutine.h: * jit/HostCallReturnValue.h: * jit/ICStats.h: * jit/JIT.cpp: * jit/JIT.h: * jit/JITAddGenerator.h: * jit/JITCall32_64.cpp: * jit/JITCode.h: * jit/JITDisassembler.cpp: * jit/JITExceptions.cpp: * jit/JITMathIC.h: * jit/JITOpcodes.cpp: * jit/JITOperations.cpp: * jit/JITOperations.h: * jit/JITThunks.cpp: * jit/JITThunks.h: * jit/JSInterfaceJIT.h: * jit/PCToCodeOriginMap.h: * jit/PolymorphicCallStubRoutine.h: * jit/RegisterSet.h: * jit/Repatch.h: * jit/SetupVarargsFrame.h: * jit/Snippet.h: * jit/SnippetParams.h: * jit/ThunkGenerators.h: * jsc.cpp: * llint/LLIntCLoop.h: * llint/LLIntEntrypoint.h: * llint/LLIntExceptions.h: * llint/LLIntOfflineAsmConfig.h: * llint/LLIntSlowPaths.cpp: * parser/NodeConstructors.h: * parser/Nodes.cpp: * parser/Nodes.h: * parser/Parser.cpp: * parser/Parser.h: * parser/ParserTokens.h: * parser/SourceProviderCacheItem.h: * profiler/ProfilerBytecodeSequence.h: * profiler/ProfilerDatabase.cpp: * profiler/ProfilerDatabase.h: * profiler/ProfilerOrigin.h: * profiler/ProfilerOriginStack.h: * profiler/ProfilerProfiledBytecodes.h: * profiler/ProfilerUID.h: * runtime/AbstractModuleRecord.h: * runtime/ArrayConstructor.h: * runtime/ArrayConventions.h: * runtime/ArrayIteratorPrototype.h: * runtime/ArrayPrototype.h: * runtime/BasicBlockLocation.h: * runtime/Butterfly.h: * runtime/CallData.cpp: * runtime/CodeCache.h: * runtime/CommonSlowPaths.cpp: * runtime/CommonSlowPaths.h: * runtime/CommonSlowPathsExceptions.cpp: * runtime/Completion.cpp: * runtime/ControlFlowProfiler.h: * runtime/DateInstanceCache.h: * runtime/ErrorConstructor.h: * runtime/ErrorInstance.h: * runtime/ExceptionHelpers.cpp: * runtime/ExceptionHelpers.h: * runtime/ExecutableBase.h: * runtime/FunctionExecutable.h: * runtime/HasOwnPropertyCache.h: * runtime/Identifier.h: * runtime/InternalFunction.h: * runtime/IntlCollator.cpp: * runtime/IntlCollatorPrototype.h: * runtime/IntlDateTimeFormatPrototype.h: * runtime/IntlNumberFormat.cpp: * runtime/IntlNumberFormatPrototype.h: * runtime/IteratorOperations.cpp: * runtime/JSArray.h: * runtime/JSArrayBufferPrototype.h: * runtime/JSCJSValue.h: * runtime/JSCJSValueInlines.h: * runtime/JSCell.h: * runtime/JSFunction.cpp: * runtime/JSFunction.h: * runtime/JSGenericTypedArrayViewPrototypeFunctions.h: * runtime/JSGlobalObject.cpp: * runtime/JSGlobalObject.h: * runtime/JSGlobalObjectDebuggable.cpp: * runtime/JSGlobalObjectDebuggable.h: * runtime/JSGlobalObjectFunctions.cpp: * runtime/JSGlobalObjectFunctions.h: * runtime/JSJob.cpp: * runtime/JSLock.h: * runtime/JSModuleLoader.cpp: * runtime/JSModuleNamespaceObject.h: * runtime/JSModuleRecord.h: * runtime/JSObject.cpp: * runtime/JSObject.h: * runtime/JSRunLoopTimer.h: * runtime/JSTemplateRegistryKey.h: * runtime/JSTypedArrayPrototypes.cpp: * runtime/JSTypedArrayPrototypes.h: * runtime/JSTypedArrays.h: * runtime/LiteralParser.h: * runtime/MatchResult.h: * runtime/MemoryStatistics.h: * runtime/PrivateName.h: * runtime/PromiseDeferredTimer.h: * runtime/ProxyObject.h: * runtime/RegExp.h: * runtime/SamplingProfiler.cpp: * runtime/SmallStrings.h: * runtime/StringPrototype.cpp: * runtime/StringRecursionChecker.h: * runtime/Structure.h: * runtime/SymbolConstructor.h: * runtime/SymbolPrototype.cpp: * runtime/SymbolPrototype.h: * runtime/TypeProfiler.h: * runtime/TypeProfilerLog.h: * runtime/TypedArrayType.h: * runtime/VM.cpp: * runtime/VM.h: * runtime/VMEntryScope.h: * runtime/WeakMapData.h: * runtime/WriteBarrier.h: * tools/FunctionOverrides.cpp: * tools/FunctionOverrides.h: * wasm/WasmBinding.cpp: * wasm/js/JSWebAssemblyCodeBlock.h: * wasm/js/WebAssemblyPrototype.cpp: * yarr/Yarr.h: * yarr/YarrJIT.cpp: * yarr/YarrJIT.h: * yarr/YarrParser.h: 2017-06-24 Yusuke Suzuki [JSC] Clean up Object.entries implementation https://bugs.webkit.org/show_bug.cgi?id=173759 Reviewed by Sam Weinig. This patch cleans up Object.entries implementation. We drop unused private functions. And we merge the implementation into Object.entries. It slightly speeds up Object.entries speed. baseline patched object-entries 148.0101+-5.6627 142.1877+-4.8661 might be 1.0409x faster * builtins/BuiltinNames.h: * builtins/ObjectConstructor.js: (entries): (globalPrivate.enumerableOwnProperties): Deleted. * runtime/JSGlobalObject.cpp: (JSC::JSGlobalObject::init): * runtime/ObjectConstructor.cpp: (JSC::ownEnumerablePropertyKeys): Deleted. * runtime/ObjectConstructor.h: 2017-06-24 Joseph Pecoraro Remove Reflect.enumerate https://bugs.webkit.org/show_bug.cgi?id=173806 Reviewed by Yusuke Suzuki. * CMakeLists.txt: * JavaScriptCore.xcodeproj/project.pbxproj: * inspector/JSInjectedScriptHost.cpp: (Inspector::JSInjectedScriptHost::subtype): (Inspector::JSInjectedScriptHost::getInternalProperties): (Inspector::JSInjectedScriptHost::iteratorEntries): * runtime/JSGlobalObject.cpp: (JSC::JSGlobalObject::init): (JSC::JSGlobalObject::visitChildren): * runtime/JSPropertyNameIterator.cpp: Removed. * runtime/JSPropertyNameIterator.h: Removed. * runtime/ReflectObject.cpp: (JSC::reflectObjectEnumerate): Deleted. 2017-06-23 Keith Miller Switch VMTraps to use halt instructions rather than breakpoint instructions https://bugs.webkit.org/show_bug.cgi?id=173677 Reviewed by JF Bastien. Using the breakpoint instruction for VMTraps caused issues with lldb. Since we only need some way to stop execution we can, in theory, use any exceptioning instruction we want. I went with the halt instruction on X86 since that is the only one byte instruction that does not breakpoint (in my tests both 0xf1 and 0xd6 produced EXC_BREAKPOINT). On ARM we use the data cache clearing instruction with the zero register, which triggers a segmentation fault. Also, update the platform code to only use signaling VMTraps on where we have an appropriate instruction (x86 and ARM64). * API/tests/ExecutionTimeLimitTest.cpp: (testExecutionTimeLimit): * assembler/ARM64Assembler.h: (JSC::ARM64Assembler::replaceWithVMHalt): (JSC::ARM64Assembler::dataCacheZeroVirtualAddress): (JSC::ARM64Assembler::replaceWithBkpt): Deleted. * assembler/ARMAssembler.h: (JSC::ARMAssembler::replaceWithBkpt): Deleted. * assembler/ARMv7Assembler.h: (JSC::ARMv7Assembler::replaceWithBkpt): Deleted. * assembler/MIPSAssembler.h: (JSC::MIPSAssembler::replaceWithBkpt): Deleted. * assembler/MacroAssemblerARM.h: (JSC::MacroAssemblerARM::replaceWithBreakpoint): Deleted. * assembler/MacroAssemblerARM64.h: (JSC::MacroAssemblerARM64::replaceWithVMHalt): (JSC::MacroAssemblerARM64::replaceWithBreakpoint): Deleted. * assembler/MacroAssemblerARMv7.h: (JSC::MacroAssemblerARMv7::storeFence): (JSC::MacroAssemblerARMv7::replaceWithBreakpoint): Deleted. * assembler/MacroAssemblerMIPS.h: (JSC::MacroAssemblerMIPS::replaceWithBreakpoint): Deleted. * assembler/MacroAssemblerX86Common.h: (JSC::MacroAssemblerX86Common::replaceWithVMHalt): (JSC::MacroAssemblerX86Common::replaceWithBreakpoint): Deleted. * assembler/X86Assembler.h: (JSC::X86Assembler::replaceWithHlt): (JSC::X86Assembler::replaceWithInt3): Deleted. * dfg/DFGJumpReplacement.cpp: (JSC::DFG::JumpReplacement::installVMTrapBreakpoint): * runtime/VMTraps.cpp: (JSC::SignalContext::SignalContext): (JSC::installSignalHandler): (JSC::SignalContext::adjustPCToPointToTrappingInstruction): Deleted. * wasm/WasmFaultSignalHandler.cpp: (JSC::Wasm::enableFastMemory): 2017-06-22 Saam Barati The lowering of Identity in the DFG backend needs to use ManualOperandSpeculation https://bugs.webkit.org/show_bug.cgi?id=173743 Reviewed by Mark Lam. The code always manually speculates, however, we weren't specifying ManualOperandSpeculation when creating a JSValueOperand. This would fire an assertion in JSValueOperand construction for a node like: Identity(String:@otherNode) I spent about 45 minutes trying to craft a test and came up empty. However, this fixes a debug assertion on an internal Apple website. * dfg/DFGSpeculativeJIT32_64.cpp: (JSC::DFG::SpeculativeJIT::compile): * dfg/DFGSpeculativeJIT64.cpp: (JSC::DFG::SpeculativeJIT::compile): 2017-06-22 Saam Barati ValueRep(DoubleRep(@v)) can not simply convert to @v https://bugs.webkit.org/show_bug.cgi?id=173687 Reviewed by Mark Lam. Consider this IR: block#x p: Phi() // int32 and double flows into this phi from various control flow d: DoubleRep(@p) some uses of @d here v: ValueRep(DoubleRepUse:@d) a: NewArrayWithSize(Int32:@v) some more nodes here ... Because the flow of ValueRep(DoubleRep(@p)) will not produce an Int32, AI proves that the Int32 check will fail. Constant folding phase removes all nodes after @a and inserts an Unreachable after the NewArrayWithSize node. The IR then looks like this: block#x p: Phi() // int32 and double flows into this phi from various control flow d: DoubleRep(@p) some uses of @d here v: ValueRep(DoubleRepUse:@d) a: NewArrayWithSize(Int32:@v) Unreachable However, there was a strength reduction rule that tries eliminate redundant conversions. It used to convert the program to: block#x p: Phi() // int32 and double flows into this phi from various control flow d: DoubleRep(@p) some uses of @d here a: NewArrayWithSize(Int32:@p) Unreachable However, at runtime, @p will actually be an Int32, so @a will not OSR exit, and we'll crash. This patch removes this strength reduction rule since it does not maintain what would have happened if we executed the program before the rule. This rule is also wrong for other types of programs (I'm not sure we'd actually emit this code, but if such IR were generated, we would previously optimize it incorrectly): @a: Constant(JSTrue) @b: DoubleRep(@a) @c: ValueRep(@b) @d: use(@c) However, the strength reduction rule would've transformed this into: @a: Constant(JSTrue) @d: use(@a) And this would be wrong because node @c before the transformation would have produced the JSValue jsNumber(1.0). This patch was neutral in the benchmark run I did. * dfg/DFGStrengthReductionPhase.cpp: (JSC::DFG::StrengthReductionPhase::handleNode): 2017-06-22 JF Bastien ARM64: doubled executable memory limit from 32MiB to 64MiB https://bugs.webkit.org/show_bug.cgi?id=173734 Reviewed by Oliver Hunt. Some WebAssembly programs stress the amount of memory we have available, especially when we consider tiering (BBQ never dies, and is bigger that OMG). Tiering to OMG just piles on more memory, and we're also competing with JavaScript. * jit/ExecutableAllocator.h: 2017-06-22 Joseph Pecoraro Web Inspector: Pausing with a deep call stack can be very slow, avoid eagerly generating object previews https://bugs.webkit.org/show_bug.cgi?id=173698 Reviewed by Matt Baker. When pausing in a deep call stack the majority of the time spent in JavaScriptCore when preparing Inspector pause information is spent generating object previews for the `thisObject` of each of the call frames. In some cases, this could be more than 95% of the time generating pause information. In the common case, only one of these (the top frame) will ever be seen by users. This change avoids eagerly generating object previews up front and let the frontend request previews if they are needed. This introduces the `Runtime.getPreview` protocol command. This can be used to: - Get a preview for a RemoteObject that did not have a preview but could. - Update a preview for a RemoteObject that had a preview. This patch only uses it for the first case, but the second is valid and may be something we want to do in the future. * inspector/protocol/Runtime.json: A new command to get an up to date preview for an object. * inspector/InjectedScript.h: * inspector/InjectedScript.cpp: (Inspector::InjectedScript::getPreview): * inspector/agents/InspectorRuntimeAgent.cpp: (Inspector::InspectorRuntimeAgent::getPreview): * inspector/agents/InspectorRuntimeAgent.h: Plumbing for the new command. * inspector/InjectedScriptSource.js: (InjectedScript.prototype.getPreview): Implementation just uses the existing helper. (InjectedScript.CallFrameProxy): Do not generate a preview for the this object as it may not be shown. Let the frontend request a preview if it wants or needs one. 2017-06-22 Joseph Pecoraro Web Inspector: Remove stale "rawScopes" concept that was never available in JSC https://bugs.webkit.org/show_bug.cgi?id=173686 Reviewed by Mark Lam. * inspector/InjectedScript.cpp: (Inspector::InjectedScript::functionDetails): * inspector/InjectedScriptSource.js: (InjectedScript.prototype.functionDetails): * inspector/JSInjectedScriptHost.cpp: (Inspector::JSInjectedScriptHost::functionDetails): 2017-06-22 Yusuke Suzuki [JSC] Object.values should be implemented in C++ https://bugs.webkit.org/show_bug.cgi?id=173703 Reviewed by Sam Weinig. As the same to Object.assign, Object.values() is also inherently polymorphic. And allocating JSString / Symbol for Identifier and JSArray for Object.keys() result is costly. In this patch, we implement Object.values() in C++. It can avoid above allocations. Furthermore, by using `slot.isTaintedByOpaqueObject()` information, we can skip non-observable JSObject::get() calls. This improves performance by 2.49x. And also now Object.values() beats Object.keys(object).map(key => object[key]) implementation. baseline patched object-values 132.1551+-3.7209 ^ 53.1254+-1.6139 ^ definitely 2.4876x faster object-keys-map-values 78.2008+-2.1378 ? 78.9078+-2.2121 ? * builtins/ObjectConstructor.js: (values): Deleted. * runtime/ObjectConstructor.cpp: (JSC::objectConstructorValues): 2017-06-21 Saam Barati ArrayPrototype.map builtin declares a var it does not use https://bugs.webkit.org/show_bug.cgi?id=173685 Reviewed by Keith Miller. * builtins/ArrayPrototype.js: (map): 2017-06-21 Saam Barati eval virtual call is incorrect in the baseline JIT https://bugs.webkit.org/show_bug.cgi?id=173587 Reviewed by Michael Saboff. When making a virtual call for call_eval, e.g, when the thing we're calling isn't actually eval, we end up calling the caller instead of the callee. This is clearly wrong. The code ends up issuing a load for the Callee in the callers frame instead of the callee we're calling. The fix is simple, we just need to load the real callee. Only the 32-bit baseline JIT had this bug. * jit/JITCall32_64.cpp: (JSC::JIT::compileCallEvalSlowCase): 2017-06-21 Joseph Pecoraro Web Inspector: Using "break on all exceptions" when throwing stack overflow hangs inspector https://bugs.webkit.org/show_bug.cgi?id=172432 Reviewed by Saam Barati. Avoid pausing on StackOverflow and OutOfMemory errors to avoid a hang. We will proceed to improve debugging of these cases in the follow-up bugs. * debugger/Debugger.cpp: (JSC::Debugger::exception): Ignore pausing on these errors. * runtime/ErrorInstance.h: (JSC::ErrorInstance::setStackOverflowError): (JSC::ErrorInstance::isStackOverflowError): (JSC::ErrorInstance::setOutOfMemoryError): (JSC::ErrorInstance::isOutOfMemoryError): * runtime/ExceptionHelpers.cpp: (JSC::createStackOverflowError): * runtime/Error.cpp: (JSC::createOutOfMemoryError): Mark these kinds of errors. 2017-06-21 Saam Barati Make it clear that regenerating ICs are holding the CodeBlock's lock by passing the locker as a parameter https://bugs.webkit.org/show_bug.cgi?id=173609 Reviewed by Keith Miller. This patch makes many of the IC generating functions require a locker as a parameter. We do this in other places in JSC to indicate that a particular API is only valid while a particular lock is held. This is the case when generating ICs. This patch just makes it explicit in the IC generating interface. * bytecode/PolymorphicAccess.cpp: (JSC::PolymorphicAccess::addCases): (JSC::PolymorphicAccess::addCase): (JSC::PolymorphicAccess::commit): (JSC::PolymorphicAccess::regenerate): * bytecode/PolymorphicAccess.h: * bytecode/StructureStubInfo.cpp: (JSC::StructureStubInfo::addAccessCase): (JSC::StructureStubInfo::initStub): Deleted. * bytecode/StructureStubInfo.h: * jit/Repatch.cpp: (JSC::tryCacheGetByID): (JSC::repatchGetByID): (JSC::tryCachePutByID): (JSC::repatchPutByID): (JSC::tryRepatchIn): (JSC::repatchIn): 2017-06-20 Myles C. Maxfield Disable font variations on macOS Sierra and iOS 10 https://bugs.webkit.org/show_bug.cgi?id=173618 Reviewed by Jon Lee. * Configurations/FeatureDefines.xcconfig: 2017-06-20 Keith Miller Fix leak of ModuleInformations in BBQPlan constructors. https://bugs.webkit.org/show_bug.cgi?id=173577 Reviewed by Saam Barati. This patch fixes a leak in the BBQPlan constructiors. Previously, the plans were calling makeRef on the newly constructed objects. This patch fixes the issue and uses adoptRef instead. Additionally, an old, incorrect, attempt to fix the leak is removed. * inspector/remote/cocoa/RemoteInspectorXPCConnection.mm: (Inspector::RemoteInspectorXPCConnection::RemoteInspectorXPCConnection): * jit/JITWorklist.cpp: (JSC::JITWorklist::Thread::Thread): * runtime/PromiseDeferredTimer.cpp: (JSC::PromiseDeferredTimer::addPendingPromise): * runtime/VM.cpp: (JSC::VM::VM): * wasm/WasmBBQPlan.cpp: (JSC::Wasm::BBQPlan::BBQPlan): * wasm/WasmPlan.cpp: (JSC::Wasm::Plan::Plan): 2017-06-20 Devin Rousso Web Inspector: Send context attributes for tracked canvases https://bugs.webkit.org/show_bug.cgi?id=173327 Reviewed by Joseph Pecoraro. * inspector/protocol/Canvas.json: Add ContextAttributes object type that is optionally used for WebGL canvases. 2017-06-20 Konstantin Tokarev Remove excessive include directives from WTF https://bugs.webkit.org/show_bug.cgi?id=173553 Reviewed by Saam Barati. * profiler/ProfilerDatabase.cpp: Added missing include directive. * runtime/SamplingProfiler.cpp: Ditto. 2017-06-20 Oleksandr Skachkov Revert changes in bug#160417 about extending `null` not being a derived class https://bugs.webkit.org/show_bug.cgi?id=169293 Reviewed by Saam Barati. Reverted changes in bug#160417 about extending `null` not being a derived class according to changes in spec: https://github.com/tc39/ecma262/commit/c57ef95c45a371f9c9485bb1c3881dbdc04524a2 * builtins/BuiltinNames.h: * bytecompiler/BytecodeGenerator.cpp: (JSC::BytecodeGenerator::BytecodeGenerator): (JSC::BytecodeGenerator::emitReturn): * bytecompiler/NodesCodegen.cpp: (JSC::ClassExprNode::emitBytecode): 2017-06-20 Saam Barati repatchIn needs to lock the CodeBlock's lock https://bugs.webkit.org/show_bug.cgi?id=173573 Reviewed by Yusuke Suzuki. CodeBlock::propagateTransitions and CodeBlock::visitWeakly grab the CodeBlock's lock before modifying the StructureStubInfo/PolymorphicAccess. When regenerating an IC, we must hold the CodeBlock's to prevent the executing thread from racing with the marking thread. repatchIn was not grabbing the lock. I haven't been able to get it to crash, but this is needed for the same reasons that get and put IC regeneration grab the lock. * jit/Repatch.cpp: (JSC::repatchIn): 2017-06-19 Devin Rousso Web Inspector: create canvas content view and details sidebar panel https://bugs.webkit.org/show_bug.cgi?id=138941 Reviewed by Joseph Pecoraro. * inspector/protocol/Canvas.json: - Add an optional `nodeId` attribute to the `Canvas` type. - Add `requestNode` command for getting the node id of the backing canvas element. - Add `requestContent` command for getting the current image content of the canvas. 2017-06-19 Yusuke Suzuki Unreviewed, build fix for ARM * assembler/MacroAssemblerARM.h: (JSC::MacroAssemblerARM::internalCompare32): 2017-06-13 Yusuke Suzuki [DFG] More ArrayIndexOf fixups for various types https://bugs.webkit.org/show_bug.cgi?id=173176 Reviewed by Saam Barati. This patch further expands coverage of ArrayIndexOf optimization in DFG and FTL. 1. We attempt to fold ArrayIndexOf to constant (-1) if we know that its array never contains the given search value. 2. We support Symbol and Other specialization additionally. Especially, Other is useful because null/undefined can be used as a sentinel value. One interesting thing is that Array.prototype.indexOf does not consider holes as undefineds. Thus, var array = [,,,,,,,]; array.indexOf(undefined); // => -1 This can be trivially achieved in JSC because Empty and Undefined are different values. * dfg/DFGFixupPhase.cpp: (JSC::DFG::FixupPhase::fixupNode): (JSC::DFG::FixupPhase::fixupArrayIndexOf): * dfg/DFGSpeculativeJIT.cpp: (JSC::DFG::SpeculativeJIT::compileArrayIndexOf): (JSC::DFG::SpeculativeJIT::speculateOther): * dfg/DFGSpeculativeJIT.h: * ftl/FTLLowerDFGToB3.cpp: (JSC::FTL::DFG::LowerDFGToB3::compileArrayIndexOf): 2017-06-19 Caio Lima [ARMv6][DFG] ARM MacroAssembler is always emitting cmn when immediate is 0 https://bugs.webkit.org/show_bug.cgi?id=172972 Reviewed by Mark Lam. We are changing internalCompare32 implementation in ARM MacroAssembler to emit "cmp" when the "right.value" is 0. It is generating wrong comparison cases, since the semantics of cmn is opposite of cmp[1]. One case that it's breaking is "branch32(MacroAssembler::Above, gpr, TrustedImm32(0))", where ends resulting in following assembly code: ``` cmn $r0, #0 bhi
``` However, as cmn is similar to "adds", it will never take the branch when $r0 > 0. In that case, the correct opcode is "cmp". With this patch we will fix current broken tests that uses "branch32(MacroAssembler::Above, gpr, TrustedImm32(0))", such as ForwardVarargs, Spread and GetRestLength. [1] - http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0204j/Cihiddid.html * assembler/MacroAssemblerARM.h: (JSC::MacroAssemblerARM::internalCompare32): 2017-06-19 Joseph Pecoraro test262: Completion values for control flow do not match the spec https://bugs.webkit.org/show_bug.cgi?id=171265 Reviewed by Saam Barati. * bytecompiler/BytecodeGenerator.h: (JSC::BytecodeGenerator::shouldBeConcernedWithCompletionValue): When we care about having proper completion values (global code in programs, modules, and eval) insert undefined results for control flow statements. * bytecompiler/NodesCodegen.cpp: (JSC::SourceElements::emitBytecode): Reduce writing a default `undefined` value to the completion result to only once before the last statement we know will produce a value. (JSC::IfElseNode::emitBytecode): (JSC::WithNode::emitBytecode): (JSC::WhileNode::emitBytecode): (JSC::ForNode::emitBytecode): (JSC::ForInNode::emitBytecode): (JSC::ForOfNode::emitBytecode): (JSC::SwitchNode::emitBytecode): Insert an undefined to handle cases where code may break out of an if/else or with statement (break/continue). (JSC::TryNode::emitBytecode): Same handling for break cases. Also, finally block statement completion values are always ignored for the try statement result. (JSC::ClassDeclNode::emitBytecode): Class declarations, like function declarations, produce an empty result. * parser/Nodes.cpp: (JSC::SourceElements::lastStatement): (JSC::SourceElements::hasCompletionValue): (JSC::SourceElements::hasEarlyBreakOrContinue): (JSC::BlockNode::lastStatement): (JSC::BlockNode::singleStatement): (JSC::BlockNode::hasCompletionValue): (JSC::BlockNode::hasEarlyBreakOrContinue): (JSC::ScopeNode::singleStatement): (JSC::ScopeNode::hasCompletionValue): (JSC::ScopeNode::hasEarlyBreakOrContinue): The only non-trivial cases need to loop through their list of statements to determine if this has a completion value or not. Likewise for determining if there is an early break / continue, meaning a break or continue statement with no preceding statement that has a completion value. * parser/Nodes.h: (JSC::StatementNode::next): (JSC::StatementNode::hasCompletionValue): Helper to check if a statement nodes produces a completion value or not. 2017-06-19 Adrian Perez de Castro Missing includes make builds fail with GCC 7.x https://bugs.webkit.org/show_bug.cgi?id=173544 Unreviewed gardening. Fix compilation with GCC 7. * API/tests/CompareAndSwapTest.cpp: * runtime/VMEntryScope.h: 2017-06-17 Keith Miller ArrayBuffer constructor needs to create subclass structures before its buffer https://bugs.webkit.org/show_bug.cgi?id=173510 Reviewed by Yusuke Suzuki. * runtime/JSArrayBufferConstructor.cpp: (JSC::constructArrayBuffer): 2017-06-17 Keith Miller ArrayPrototype methods should use JSValue::toLength for non-Arrays. https://bugs.webkit.org/show_bug.cgi?id=173506 Reviewed by Ryosuke Niwa. This patch changes the result of unshift if old length + unshift.arguments.length > (2 ** 53) - 1 to be a type error. Also, the getLength function, which was always incorrect to use, has been removed. Additionally, some cases where we were using a constant for (2 ** 53) - 1 have been replaced with maxSafeInteger() * interpreter/Interpreter.cpp: (JSC::sizeOfVarargs): * runtime/ArrayPrototype.cpp: (JSC::arrayProtoFuncToLocaleString): (JSC::arrayProtoFuncPop): (JSC::arrayProtoFuncPush): (JSC::arrayProtoFuncReverse): (JSC::arrayProtoFuncShift): (JSC::arrayProtoFuncSlice): (JSC::arrayProtoFuncSplice): (JSC::arrayProtoFuncUnShift): (JSC::arrayProtoFuncIndexOf): (JSC::arrayProtoFuncLastIndexOf): * runtime/JSArrayInlines.h: (JSC::getLength): Deleted. * runtime/JSCJSValue.cpp: (JSC::JSValue::toLength): * runtime/NumberConstructor.cpp: (JSC::numberConstructorFuncIsSafeInteger): 2017-06-16 Matt Baker Web Inspector: Instrument 2D/WebGL canvas contexts in the backend https://bugs.webkit.org/show_bug.cgi?id=172623 Reviewed by Devin Rousso and Joseph Pecoraro. This patch adds a basic Canvas protocol. It includes Canvas and related types and events for monitoring the lifetime of canvases in the page. * CMakeLists.txt: * DerivedSources.make: * inspector/protocol/Canvas.json: Added. * inspector/scripts/codegen/generator.py: (Generator.stylized_name_for_enum_value): Add special handling for Canvas.ContextType protocol enumeration, so that "canvas-2d" and "webgl" map to `Canvas2D` and `WebGL`. 2017-06-16 Wenson Hsieh [iOS DnD] Upstream iOS drag and drop implementation into OpenSource WebKit https://bugs.webkit.org/show_bug.cgi?id=173366 Reviewed by Tim Horton. Introduce ENABLE_DATA_INTERACTION and ENABLE_DRAG_SUPPORT to FeatureDefines.xcconfig. * Configurations/FeatureDefines.xcconfig: 2017-06-16 Yusuke Suzuki [JSC] Add fast path for Object.assign https://bugs.webkit.org/show_bug.cgi?id=173416 Reviewed by Mark Lam. In Object.assign implementation, we need to ensure that given key is still enumerable own key. This seems duplicate look up. And we want to avoid this. However, we still need to perform this check in the face of Proxy. Proxy can observe that this check is done correctly. In almost all the cases, the above check is duplicate to the subsequent [[Get]] operation. In this patch, we perform this check. But at that time, we investigate `isTaintedByOpaqueObject()`. If it is false, we can say that getOwnPropertySlot is pure. In that case, we can just retrieve the value by calling `slot.getValue()`. This further improves performance of Object.assign. baseline patched object-assign.es6 363.6706+-6.4381 ^ 324.1769+-6.9624 ^ definitely 1.1218x faster * runtime/ObjectConstructor.cpp: (JSC::objectConstructorAssign): 2017-06-16 Michael Saboff Intermittent crash running Internal/Tests/InternalJSTests/Regress/radar-24300617.js https://bugs.webkit.org/show_bug.cgi?id=173488 Reviewed by Filip Pizlo. ClonedArguments lazily sets its callee and interator properties and it used its own inline code to initialize its butterfly. This means that these lazily set properties can have bogus values in those slots. Instead, let's use the standard BUtterfly:tryCreate() method to create the butterfly as it clears out of line properties. * runtime/ClonedArguments.cpp: (JSC::ClonedArguments::createEmpty): 2017-06-16 Mark Lam Interpreter methods for mapping between Opcode and OpcodeID need not be instance methods. https://bugs.webkit.org/show_bug.cgi?id=173491 Reviewed by Keith Miller. The implementation are based on static data. There's no need to get the interpreter instance. Hence, we can make these methods static and avoid doing unnecessary work to compute the interpreter this pointer. Also removed the unused isCallBytecode method. * bytecode/BytecodeBasicBlock.cpp: (JSC::BytecodeBasicBlock::computeImpl): * bytecode/BytecodeDumper.cpp: (JSC::BytecodeDumper::printGetByIdOp): (JSC::BytecodeDumper::printGetByIdCacheStatus): (JSC::BytecodeDumper::dumpBytecode): (JSC::BytecodeDumper::dumpBlock): * bytecode/BytecodeLivenessAnalysis.cpp: (JSC::BytecodeLivenessAnalysis::dumpResults): * bytecode/BytecodeLivenessAnalysisInlines.h: (JSC::BytecodeLivenessPropagation::stepOverInstruction): * bytecode/BytecodeRewriter.cpp: (JSC::BytecodeRewriter::adjustJumpTargetsInFragment): * bytecode/CallLinkStatus.cpp: (JSC::CallLinkStatus::computeFromLLInt): * bytecode/CodeBlock.cpp: (JSC::CodeBlock::finishCreation): (JSC::CodeBlock::propagateTransitions): (JSC::CodeBlock::finalizeLLIntInlineCaches): (JSC::CodeBlock::hasOpDebugForLineAndColumn): (JSC::CodeBlock::usesOpcode): (JSC::CodeBlock::valueProfileForBytecodeOffset): (JSC::CodeBlock::arithProfileForPC): (JSC::CodeBlock::insertBasicBlockBoundariesForControlFlowProfiler): * bytecode/PreciseJumpTargets.cpp: (JSC::getJumpTargetsForBytecodeOffset): (JSC::computePreciseJumpTargetsInternal): (JSC::findJumpTargetsForBytecodeOffset): * bytecode/PreciseJumpTargetsInlines.h: (JSC::extractStoredJumpTargetsForBytecodeOffset): * bytecode/UnlinkedCodeBlock.cpp: (JSC::UnlinkedCodeBlock::applyModification): * dfg/DFGByteCodeParser.cpp: (JSC::DFG::ByteCodeParser::getPredictionWithoutOSRExit): (JSC::DFG::ByteCodeParser::parseBlock): * dfg/DFGCapabilities.cpp: (JSC::DFG::capabilityLevel): * interpreter/Interpreter.cpp: (JSC::Interpreter::Interpreter): (JSC::Interpreter::isOpcode): (): Deleted. * interpreter/Interpreter.h: (JSC::Interpreter::getOpcode): Deleted. (JSC::Interpreter::getOpcodeID): Deleted. (JSC::Interpreter::isCallBytecode): Deleted. * interpreter/InterpreterInlines.h: (JSC::Interpreter::getOpcode): (JSC::Interpreter::getOpcodeID): * jit/JIT.cpp: (JSC::JIT::privateCompileMainPass): (JSC::JIT::privateCompileSlowCases): * jit/JITOpcodes.cpp: (JSC::JIT::emitNewFuncCommon): (JSC::JIT::emitNewFuncExprCommon): * jit/JITPropertyAccess.cpp: (JSC::JIT::emitSlow_op_put_by_val): (JSC::JIT::privateCompilePutByVal): * jit/JITPropertyAccess32_64.cpp: (JSC::JIT::emitSlow_op_put_by_val): * llint/LLIntSlowPaths.cpp: (JSC::LLInt::llint_trace_operand): (JSC::LLInt::llint_trace_value): (JSC::LLInt::LLINT_SLOW_PATH_DECL): * profiler/ProfilerBytecodeSequence.cpp: (JSC::Profiler::BytecodeSequence::BytecodeSequence): 2017-06-16 Matt Lewis Unreviewed, rolling out r218376. The patch cause multiple Layout Test Crashes. Reverted changeset: "Web Inspector: Instrument 2D/WebGL canvas contexts in the backend" https://bugs.webkit.org/show_bug.cgi?id=172623 http://trac.webkit.org/changeset/218376 2017-06-16 Konstantin Tokarev REGRESSION(r166799): LogsPageMessagesToSystemConsoleEnabled corrupts non-ASCII characters https://bugs.webkit.org/show_bug.cgi?id=173470 Reviewed by Joseph Pecoraro. ConsoleClient::printConsoleMessageWithArguments() incorrectly uses const char* overload of StringBuilder::append() that assummes Latin1 encoding, not UTF8. * runtime/ConsoleClient.cpp: (JSC::ConsoleClient::printConsoleMessageWithArguments): 2017-06-15 Mark Lam Add a JSRunLoopTimer registry in VM. https://bugs.webkit.org/show_bug.cgi?id=173429 Reviewed by Filip Pizlo. This way, we can be sure we've got every JSRunLoopTimer instance covered if we need to change their run loop (e.g. when setting to the WebThread's run loop). * heap/Heap.cpp: (JSC::Heap::Heap): (JSC::Heap::setRunLoop): Deleted. * heap/Heap.h: (JSC::Heap::runLoop): Deleted. * runtime/JSRunLoopTimer.cpp: (JSC::JSRunLoopTimer::JSRunLoopTimer): (JSC::JSRunLoopTimer::setRunLoop): (JSC::JSRunLoopTimer::~JSRunLoopTimer): * runtime/VM.cpp: (JSC::VM::VM): (JSC::VM::registerRunLoopTimer): (JSC::VM::unregisterRunLoopTimer): (JSC::VM::setRunLoop): * runtime/VM.h: (JSC::VM::runLoop): 2017-06-15 Joseph Pecoraro [Cocoa] Modernize some internal initializers to use instancetype instead of id https://bugs.webkit.org/show_bug.cgi?id=173112 Reviewed by Wenson Hsieh. * API/JSContextInternal.h: * API/JSWrapperMap.h: * API/JSWrapperMap.mm: (-[JSObjCClassInfo initForClass:]): (-[JSWrapperMap initWithGlobalContextRef:]): 2017-06-15 Matt Baker Web Inspector: Instrument 2D/WebGL canvas contexts in the backend https://bugs.webkit.org/show_bug.cgi?id=172623 Reviewed by Devin Rousso. This patch adds a basic Canvas protocol. It includes Canvas and related types and events for monitoring the lifetime of canvases in the page. * CMakeLists.txt: * DerivedSources.make: * inspector/protocol/Canvas.json: Added. * inspector/scripts/codegen/generator.py: (Generator.stylized_name_for_enum_value): Add special handling for Canvas.ContextType protocol enumeration, so that "canvas-2d" and "webgl" map to `Canvas2D` and `WebGL`. 2017-06-15 Keith Miller Add logging to MachineStackMarker to try to diagnose crashes in the wild https://bugs.webkit.org/show_bug.cgi?id=173427 Reviewed by Mark Lam. This patch adds some logging to the MachineStackMarker constructor to help figure out where we are seeing crashes. Since macOS does not support os_log_info my hope is that if we set all the callee save registers before making any calls in the C++ code we can figure out which calls is the source of the crash. We also, set all the caller save registers before returning in case some weirdness is happening in the Heap constructor. This logging should not matter from a performance perspective. We only create MachineStackMarkers when we are creating a new VM, which is already expensive. * heap/MachineStackMarker.cpp: (JSC::MachineThreads::MachineThreads): 2017-06-15 Yusuke Suzuki [JSC] Implement Object.assign in C++ https://bugs.webkit.org/show_bug.cgi?id=173414 Reviewed by Saam Barati. Implementing Object.assign in JS is not so good compared to C++ version because, 1. JS version allocates JS array for object own keys. And we allocate JSString / Symbol for each key. But basically, they can be handled as UniquedStringImpl in C++. Allocating these cells are wasteful. 2. While implementing builtins in JS offers some good type speculation chances, Object.assign is inherently super polymorphic. So JS's type profile doesn't help well. 3. We have a chance to introduce various fast path for Object.assign in C++. This patch moves implementation from JS to C++. It achieves the above (1) and (2). (3) is filed in [1]. We can see 1.65x improvement in SixSpeed object-assign.es6. baseline patched object-assign.es6 643.3253+-8.0521 ^ 389.1075+-8.8840 ^ definitely 1.6533x faster [1]: https://bugs.webkit.org/show_bug.cgi?id=173416 * builtins/ObjectConstructor.js: (entries): (assign): Deleted. * runtime/JSCJSValueInlines.h: (JSC::JSValue::putInline): * runtime/JSCell.h: * runtime/JSCellInlines.h: (JSC::JSCell::putInline): * runtime/JSObject.cpp: (JSC::JSObject::put): * runtime/JSObject.h: * runtime/JSObjectInlines.h: (JSC::JSObject::putInlineForJSObject): (JSC::JSObject::putInline): Deleted. * runtime/ObjectConstructor.cpp: (JSC::objectConstructorAssign): 2017-06-14 Dan Bernstein [Cocoa] Objective-C class whose name begins with an underscore can’t be exported to JavaScript https://bugs.webkit.org/show_bug.cgi?id=168578 Reviewed by Geoff Garen. * API/JSWrapperMap.mm: (allocateConstructorForCustomClass): Updated for change to forEachProtocolImplementingProtocol. (-[JSObjCClassInfo allocateConstructorAndPrototype]): Ditto. (-[JSWrapperMap classInfoForClass:]): If the class name begins with an underscore, check if it defines conformance to a JSExport-derived protocol and if so, avoid using the superclass as a substitute as we’d normally do. * API/ObjcRuntimeExtras.h: (forEachProtocolImplementingProtocol): Added a "stop" argument to the block to let callers bail out. * API/tests/JSExportTests.mm: (+[JSExportTests classNamePrefixedWithUnderscoreTest]): New test for this. (runJSExportTests): Run new test. 2017-06-14 Yusuke Suzuki Unreviewed, suppress invalid register alloation validation assertion in 32 bit part 2 https://bugs.webkit.org/show_bug.cgi?id=172421 * dfg/DFGSpeculativeJIT.cpp: (JSC::DFG::SpeculativeJIT::compileArrayIndexOf): 2017-06-14 Claudio Saavedra REGRESSION: 15 new jsc failures in WPE and GTK+ https://bugs.webkit.org/show_bug.cgi?id=173349 Reviewed by JF Bastien. Recent changes to generateWasm.py are not accounted for from CMake, which leads to WasmOps.h not being regenerated in partial builds. Make generateWasm.py an additional dependency. * CMakeLists.txt: 2017-06-13 Joseph Pecoraro Debugger has unexpected effect on program correctness https://bugs.webkit.org/show_bug.cgi?id=172683 Reviewed by Saam Barati. * inspector/InjectedScriptSource.js: (InjectedScript.RemoteObject.prototype._appendPropertyPreviews): (InjectedScript.RemoteObject.prototype._isPreviewableObjectInternal): (BasicCommandLineAPI): Eliminate for..of use with Arrays from InjectedScriptSource as it can be observable. We still use it for Set / Map iteration which we can eliminate when moving to builtins. 2017-06-13 JF Bastien WebAssembly: fix erroneous signature comment https://bugs.webkit.org/show_bug.cgi?id=173334 Reviewed by Keith Miller. * wasm/WasmSignature.h: 2017-06-13 Michael Saboff Refactor AbsenceOfSetter to AbsenceOfSetEffects https://bugs.webkit.org/show_bug.cgi?id=173322 Reviewed by Filip Pizlo. * bytecode/ObjectPropertyCondition.h: (JSC::ObjectPropertyCondition::absenceOfSetEffectWithoutBarrier): (JSC::ObjectPropertyCondition::absenceOfSetEffect): (JSC::ObjectPropertyCondition::absenceOfSetterWithoutBarrier): Deleted. (JSC::ObjectPropertyCondition::absenceOfSetter): Deleted. * bytecode/ObjectPropertyConditionSet.cpp: (JSC::generateConditionsForPropertySetterMiss): (JSC::generateConditionsForPropertySetterMissConcurrently): * bytecode/PropertyCondition.cpp: (JSC::PropertyCondition::dumpInContext): (JSC::PropertyCondition::isStillValidAssumingImpurePropertyWatchpoint): (JSC::PropertyCondition::isStillValid): (WTF::printInternal): * bytecode/PropertyCondition.h: (JSC::PropertyCondition::absenceOfSetEffectWithoutBarrier): (JSC::PropertyCondition::absenceOfSetEffect): (JSC::PropertyCondition::hasPrototype): (JSC::PropertyCondition::hash): (JSC::PropertyCondition::operator==): (JSC::PropertyCondition::absenceOfSetterWithoutBarrier): Deleted. (JSC::PropertyCondition::absenceOfSetter): Deleted. 2017-06-13 JF Bastien WebAssembly: import updated spec tests https://bugs.webkit.org/show_bug.cgi?id=173287 Reviewed by Saam Barati. Import spec tests as of 31c641cc15f2aedbec2fa45a5185f68416df578b, with a few modifications so things work. Fix a bunch of bugs found through this process, and punt a few tests (which I marked as blocked by this bug). Fixes: Fix load / store alignment: r216908 erroneously implemented it as bit alignment instead of byte alignment. It was also missing memory-alignment.js despite it being in the ChangeLog, so add it too. This allows spec-test/align.wast.js to pass. Tables can be imported or in a section. There can be only one, but sections can be empty. An Elements section can exist if there's no Table, as long as it is also empty. Memories can be imported or in a section. There can be only one, but sections can be empty. A Data section can exist if there's no Memory, as long as it is also empty. Prototypes: stringify without .prototype. in the string. WebAssembly.Table.prototype.grow was plain wrong: it takes a delta parameter, not a final size, and throws a RangeError on failure, not a TypeError. Fix compile / instantiate so the reject the promise if given an argument of the wrong type (instead of failing instantly). Fix async on neuter test. Element section shouldn't affect any Table if any of the elements are out of bounds. We need to process it in two passes. Segment section shouldn't affect any Data if any of the segments are out of bounds. We need to process it in two passes. Empty data segments are valid, but only when there is no memory. Their index still gets validated, and has to be zero. Punts: Error messages with context, the test seems overly restrictive but this is minor. compile/instantiate/validate property descriptors. UTF-8 bugs. Temporarily disable NaN tests. We need to go back and implement the following semantics: https://github.com/WebAssembly/spec/pull/414 This doesn't matter as much as getting all the other tests passing. Worth noting for NaNs: f64.no_fold_mul_one (also a NaN test) as well as no_fold_promote_demote (an interesting corner case which we get wrong). mul by one is (assert_return (invoke \"f64.no_fold_mul_one\" (i64.const 0x7ff4000000000000)) (i64.const 0x7ff8000000000000)) which means converting sNaN to qNaN, and promote/demote is (assert_return (invoke \"no_fold_promote_demote\" (i32.const 0x7fa00000)) (i32.const 0x7fc00000)) which is the same. I'm not sure why they're not allowed. * wasm/WasmB3IRGenerator.cpp: * wasm/WasmFunctionParser.h: * wasm/WasmModuleParser.cpp: * wasm/WasmModuleParser.h: * wasm/WasmParser.h: (JSC::Wasm::Parser::consumeUTF8String): * wasm/generateWasm.py: (memoryLog2Alignment): * wasm/js/JSWebAssemblyTable.cpp: (JSC::JSWebAssemblyTable::grow): * wasm/js/JSWebAssemblyTable.h: * wasm/js/WebAssemblyCompileErrorPrototype.cpp: * wasm/js/WebAssemblyInstancePrototype.cpp: * wasm/js/WebAssemblyLinkErrorPrototype.cpp: * wasm/js/WebAssemblyMemoryPrototype.cpp: * wasm/js/WebAssemblyModulePrototype.cpp: * wasm/js/WebAssemblyModuleRecord.cpp: (JSC::WebAssemblyModuleRecord::evaluate): * wasm/js/WebAssemblyPrototype.cpp: (JSC::webAssemblyCompileFunc): (JSC::resolve): (JSC::instantiate): (JSC::compileAndInstantiate): (JSC::webAssemblyInstantiateFunc): * wasm/js/WebAssemblyRuntimeErrorPrototype.cpp: * wasm/js/WebAssemblyTablePrototype.cpp: (JSC::webAssemblyTableProtoFuncGrow): 2017-06-13 Michael Saboff DFG doesn't properly handle a property that is change to read only in a prototype https://bugs.webkit.org/show_bug.cgi?id=173321 Reviewed by Filip Pizlo. We need to check for ReadOnly as well as a not being a Setter when checking an AbsenceOfSetter. * bytecode/PropertyCondition.cpp: (JSC::PropertyCondition::isStillValidAssumingImpurePropertyWatchpoint): 2017-06-13 Daniel Bates Implement W3C Secure Contexts Draft Specification https://bugs.webkit.org/show_bug.cgi?id=158121 Reviewed by Brent Fulgham. Part 4 Adds isSecureContext to the list of common identifiers as needed to support toggling its exposure from a runtime enabled feature flag. * runtime/CommonIdentifiers.h: 2017-06-13 Don Olmstead [JSC] Remove redundant includes in config.h https://bugs.webkit.org/show_bug.cgi?id=173294 Reviewed by Alex Christensen. * config.h: 2017-06-12 Saam Barati We should not claim that SpecEmpty is filtered out of cell checks on 64 bit platforms https://bugs.webkit.org/show_bug.cgi?id=172957 Reviewed by Filip Pizlo. Consider this program: ``` block#1: n: GetClosureVar(..., |this|) // this will load empty JSValue() SetLocal(Cell:@n, locFoo) // Cell check succeeds because JSValue() looks like a cell Branch(#2, #3) Block#3: x: GetLocal(locFoo) y: CheckNotEmpty(@x) ``` If we claim that a cell check filters out the empty value, we will incorrectly eliminate the CheckNotEmpty node @y. This patch fixes AI, FTLLowerDFGToB3, and DFGSpeculativeJIT to no longer make this claim. On 64 bit platforms: - Cell use kind *now allows* the empty value to pass through. - CellOrOther use kind *now allows* for the empty value to pass through - NotCell use kind *no longer allows* the empty value to pass through. * assembler/CPU.h: (JSC::isARMv7IDIVSupported): (JSC::isARM64): (JSC::isX86): (JSC::isX86_64): (JSC::is64Bit): (JSC::is32Bit): (JSC::isMIPS): Make these functions constexpr so we can use them in static variable assignment. * bytecode/SpeculatedType.h: * dfg/DFGSpeculativeJIT.cpp: (JSC::DFG::SpeculativeJIT::compileValueToInt32): (JSC::DFG::SpeculativeJIT::compileDoubleRep): (JSC::DFG::SpeculativeJIT::compileLogicalNotStringOrOther): (JSC::DFG::SpeculativeJIT::emitStringOrOtherBranch): (JSC::DFG::SpeculativeJIT::speculateCell): (JSC::DFG::SpeculativeJIT::speculateCellOrOther): (JSC::DFG::SpeculativeJIT::speculateObjectOrOther): (JSC::DFG::SpeculativeJIT::speculateString): (JSC::DFG::SpeculativeJIT::speculateStringOrOther): (JSC::DFG::SpeculativeJIT::speculateSymbol): (JSC::DFG::SpeculativeJIT::speculateNotCell): * dfg/DFGSpeculativeJIT32_64.cpp: * dfg/DFGSpeculativeJIT64.cpp: (JSC::DFG::SpeculativeJIT::fillSpeculateCell): (JSC::DFG::SpeculativeJIT::compileObjectToObjectOrOtherEquality): (JSC::DFG::SpeculativeJIT::compilePeepHoleObjectToObjectOrOtherEquality): (JSC::DFG::SpeculativeJIT::compileObjectOrOtherLogicalNot): (JSC::DFG::SpeculativeJIT::emitObjectOrOtherBranch): * dfg/DFGUseKind.h: (JSC::DFG::typeFilterFor): * ftl/FTLLowerDFGToB3.cpp: (JSC::FTL::DFG::LowerDFGToB3::compileDoubleRep): (JSC::FTL::DFG::LowerDFGToB3::numberOrNotCellToInt32): (JSC::FTL::DFG::LowerDFGToB3::compareEqObjectOrOtherToObject): (JSC::FTL::DFG::LowerDFGToB3::boolify): (JSC::FTL::DFG::LowerDFGToB3::equalNullOrUndefined): (JSC::FTL::DFG::LowerDFGToB3::lowCell): (JSC::FTL::DFG::LowerDFGToB3::lowNotCell): (JSC::FTL::DFG::LowerDFGToB3::isCellOrMisc): (JSC::FTL::DFG::LowerDFGToB3::isNotCellOrMisc): (JSC::FTL::DFG::LowerDFGToB3::isNotCell): (JSC::FTL::DFG::LowerDFGToB3::isCell): (JSC::FTL::DFG::LowerDFGToB3::speculateCellOrOther): (JSC::FTL::DFG::LowerDFGToB3::speculateObjectOrOther): (JSC::FTL::DFG::LowerDFGToB3::speculateString): (JSC::FTL::DFG::LowerDFGToB3::speculateStringOrOther): (JSC::FTL::DFG::LowerDFGToB3::speculateSymbol): 2017-06-12 Yusuke Suzuki Unreviewed, suppress invalid register alloation validation assertion in 32 bit https://bugs.webkit.org/show_bug.cgi?id=172421 * dfg/DFGSpeculativeJIT.cpp: (JSC::DFG::SpeculativeJIT::compileArrayIndexOf): 2017-06-12 Oleksandr Skachkov We incorrectly allow escaped characters in keyword tokens https://bugs.webkit.org/show_bug.cgi?id=171310 Reviewed by Yusuke Suzuki. According spec it is not allow to use escaped characters in keywords. https://tc39.github.io/ecma262/#sec-reserved-words Current patch implements this requirements. * parser/Lexer.cpp: (JSC::Lexer::parseIdentifierSlowCase): * parser/Parser.cpp: (JSC::Parser::printUnexpectedTokenText): * parser/ParserTokens.h: 2017-06-12 Yusuke Suzuki Unreviewed, add branch64(Cond, BaseIndex, RegisterID) for ARM64 https://bugs.webkit.org/show_bug.cgi?id=172421 * assembler/MacroAssemblerARM64.h: (JSC::MacroAssemblerARM64::branch64): (JSC::MacroAssemblerARM64::branchPtr): 2017-06-12 Commit Queue Unreviewed, rolling out r218093. https://bugs.webkit.org/show_bug.cgi?id=173259 Break builds (Requested by yusukesuzuki on #webkit). Reverted changeset: "Unreviewed, build fix for ARM64" https://bugs.webkit.org/show_bug.cgi?id=172421 http://trac.webkit.org/changeset/218093 2017-06-12 Yusuke Suzuki Unreviewed, build fix for ARM64 https://bugs.webkit.org/show_bug.cgi?id=172421 * dfg/DFGSpeculativeJIT.cpp: (JSC::DFG::SpeculativeJIT::compileArrayIndexOf): 2017-06-09 Yusuke Suzuki [DFG] Add ArrayIndexOf intrinsic https://bugs.webkit.org/show_bug.cgi?id=172421 Reviewed by Saam Barati. This patch introduces ArrayIndexOfInstrinsic for DFG and FTL optimizations. We emit array check and go fast path if the array is Array::Int32, Array::Double or Array::Continugous. In addition, for Array::Int32 and Array::Double case, we have inlined fast paths. With updated ARES-6 Babylon, Before firstIteration: 45.76 +- 3.87 ms averageWorstCase: 24.41 +- 2.17 ms steadyState: 8.01 +- 0.22 ms After firstIteration: 45.64 +- 4.23 ms averageWorstCase: 23.03 +- 3.34 ms steadyState: 7.33 +- 0.34 ms In SixSpeed. baseline patched map-set-lookup.es5 734.4701+-10.4383 ^ 102.0968+-2.6357 ^ definitely 7.1939x faster map-set.es5 41.1396+-1.0558 ^ 33.1916+-0.7986 ^ definitely 1.2395x faster map-set-object.es5 62.8317+-1.2518 ^ 45.6944+-0.8369 ^ definitely 1.3750x faster * 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::hasArrayMode): * dfg/DFGNodeType.h: * dfg/DFGOperations.cpp: * dfg/DFGOperations.h: * dfg/DFGPredictionPropagationPhase.cpp: * dfg/DFGSafeToExecute.h: (JSC::DFG::safeToExecute): * dfg/DFGSpeculativeJIT.cpp: (JSC::DFG::SpeculativeJIT::compileArrayIndexOf): (JSC::DFG::SpeculativeJIT::speculateObject): * dfg/DFGSpeculativeJIT.h: (JSC::DFG::SpeculativeJIT::callOperation): * dfg/DFGSpeculativeJIT32_64.cpp: (JSC::DFG::SpeculativeJIT::compile): * dfg/DFGSpeculativeJIT64.cpp: (JSC::DFG::SpeculativeJIT::compile): (JSC::DFG::SpeculativeJIT::speculateInt32): * ftl/FTLCapabilities.cpp: (JSC::FTL::canCompile): * ftl/FTLLowerDFGToB3.cpp: (JSC::FTL::DFG::LowerDFGToB3::compileNode): (JSC::FTL::DFG::LowerDFGToB3::compileArrayIndexOf): * jit/JITOperations.h: * runtime/ArrayPrototype.cpp: (JSC::ArrayPrototype::finishCreation): * runtime/Intrinsic.cpp: (JSC::intrinsicName): * runtime/Intrinsic.h: 2017-06-11 Keith Miller TypedArray constructor with string shouldn't throw https://bugs.webkit.org/show_bug.cgi?id=173181 Reviewed by JF Bastien. We should be coercing primitive arguments to numbers in the various TypedArray constructors. * runtime/JSGenericTypedArrayViewConstructorInlines.h: (JSC::constructGenericTypedArrayViewWithArguments): 2017-06-11 Yusuke Suzuki [WTF] Make ThreadMessage portable https://bugs.webkit.org/show_bug.cgi?id=172073 Reviewed by Keith Miller. * runtime/MachineContext.h: (JSC::MachineContext::stackPointer): * tools/CodeProfiling.cpp: (JSC::profilingTimer): 2017-06-11 Yusuke Suzuki [JSC] Shrink Structure size https://bugs.webkit.org/show_bug.cgi?id=173239 Reviewed by Mark Lam. We find that the size of our Structure is slightly enlarged due to paddings. By changing the order of members, we can reduce the size from 120 to 112. This is good because 120 and 112 are categorized into different size classes. For 120, we allocate 128 bytes. And for 112, we allocate 112 bytes. We now save 16 bytes per Structure for free. * runtime/ConcurrentJSLock.h: * runtime/Structure.cpp: (JSC::Structure::Structure): * runtime/Structure.h: 2017-06-11 Konstantin Tokarev Unreviewed, attempt to fix JSC tests on Win after r217771 * jsc.cpp: (currentWorkingDirectory): buffer is not NULL-terminated 2017-06-10 Yusuke Suzuki [WTF] Add RegisteredSymbolImpl https://bugs.webkit.org/show_bug.cgi?id=173230 Reviewed by Mark Lam. * runtime/SymbolConstructor.cpp: (JSC::symbolConstructorKeyFor): 2017-06-10 Dan Bernstein Reverted r218056 because it made the IDE reindex constantly. * Configurations/DebugRelease.xcconfig: 2017-06-10 Dan Bernstein [Xcode] With Xcode 9 developer beta, everything rebuilds when switching between command-line and IDE https://bugs.webkit.org/show_bug.cgi?id=173223 Reviewed by Sam Weinig. The rebuilds were happening due to a difference in the compiler options that the IDE and xcodebuild were specifying. Only the IDE was passing the -index-store-path option. To make xcodebuild pass that option, too, set CLANG_INDEX_STORE_ENABLE to YES if it is unset, and specify an appropriate path in CLANG_INDEX_STORE_PATH. * Configurations/DebugRelease.xcconfig: 2017-06-10 Yusuke Suzuki [JSC] Update RegExp.prototype.[@@search]] implementation according to the latest spec https://bugs.webkit.org/show_bug.cgi?id=173227 Reviewed by Mark Lam. The latest spec introduces slight change to RegExp.prototype.[@@search]. This patch applies this change. Basically, this change is done in the slow path of the RegExp.prototype[@@search]. https://tc39.github.io/ecma262/#sec-regexp.prototype-@@search * builtins/RegExpPrototype.js: (search): 2017-06-09 Chris Dumez Update Thread::create() to take in a WTF::Function instead of a std::function https://bugs.webkit.org/show_bug.cgi?id=173175 Reviewed by Mark Lam. * API/tests/CompareAndSwapTest.cpp: (testCompareAndSwap): 2017-06-09 Yusuke Suzuki [DFG] Add verboseDFGOSRExit https://bugs.webkit.org/show_bug.cgi?id=173156 Reviewed by Saam Barati. This patch adds verboseDFGOSRExit which is similar to verboseFTLOSRExit. * dfg/DFGOSRExitCompiler.cpp: * runtime/Options.h: 2017-06-09 Guillaume Emont [JSC][MIPS] Add MacroAssemblerMIPS::xor32(Address, RegisterID) implementation https://bugs.webkit.org/show_bug.cgi?id=173170 Reviewed by Yusuke Suzuki. MIPS does not build since r217711 because it is missing this implementation. This patch fixes the build. * assembler/MacroAssemblerMIPS.h: (JSC::MacroAssemblerMIPS::xor32): 2017-06-09 Yusuke Suzuki [JSC] FTL does not require dlfcn https://bugs.webkit.org/show_bug.cgi?id=173143 Reviewed by Darin Adler. We no longer use LLVM library. Thus, dlfcn.h is not necessary. Also, ProcessID is not used in FTLLowerDFGToB3.cpp. * ftl/FTLLowerDFGToB3.cpp: 2017-06-09 Yusuke Suzuki [DFG] Add --verboseDFGFailure https://bugs.webkit.org/show_bug.cgi?id=173155 Reviewed by Sam Weinig. Similar to verboseFTLFailure, JSC should have verboseDFGFailure flag to show DFG failures quickly. * dfg/DFGCapabilities.cpp: (JSC::DFG::verboseCapabilities): (JSC::DFG::debugFail): * runtime/Options.cpp: (JSC::recomputeDependentOptions): * runtime/Options.h: 2017-06-09 Yusuke Suzuki [JSC] Drop OS(DARWIN) for VM_TAG_FOR_WEBASSEMBLY_MEMORY https://bugs.webkit.org/show_bug.cgi?id=173147 Reviewed by JF Bastien. Because this value becomes -1 in non-Darwin environments. Thus, we do not need to use OS(DARWIN) here. * wasm/WasmMemory.cpp: 2017-06-09 Daewoong Jang Reduce compiler warnings https://bugs.webkit.org/show_bug.cgi?id=172078 Reviewed by Yusuke Suzuki. * runtime/IntlDateTimeFormat.h: 2017-06-08 Joseph Pecoraro [Cocoa] JSWrapperMap leaks for all JSContexts https://bugs.webkit.org/show_bug.cgi?id=173110 Reviewed by Geoffrey Garen. * API/JSContext.mm: (-[JSContext ensureWrapperMap]): Ensure this allocation gets released. 2017-06-08 Filip Pizlo REGRESSION: js/dom/prototype-chain-caching-with-impure-get-own-property-slot-traps-5.html has a flaky failure https://bugs.webkit.org/show_bug.cgi?id=161156 Reviewed by Saam Barati. Since LLInt does not register impure property watchpoints for self property accesses, it shouldn't try to cache accesses that require a watchpoint. This manifested as a flaky failure because the test would fire the watchpoint after we had usually already tiered up. Without concurrent JIT, we would have always tiered up before getting to the bad case. With concurrent JIT, we would sometimes not tier up by that time. This also adds a test that deterministically failed in LLInt without this change; it does so by just running a lot shorter. * llint/LLIntSlowPaths.cpp: (JSC::LLInt::LLINT_SLOW_PATH_DECL): 2017-06-08 Keith Miller WebAssembly: We should only create wrappers for functions that can be exported https://bugs.webkit.org/show_bug.cgi?id=173088 Reviewed by Saam Barati. This patch makes it so we only create wrappers for WebAssembly functions that can actually be exported. It appears to be a ~2.5% speedup on WasmBench compile times. This patch also removes most of the old testWasmModuleFunctions api from the jsc CLI. Most of the tests were duplicates of ones in the spec-tests directory. The others I have converted to use the normal API. * jsc.cpp: (GlobalObject::finishCreation): (valueWithTypeOfWasmValue): Deleted. (box): Deleted. (callWasmFunction): Deleted. (functionTestWasmModuleFunctions): Deleted. * wasm/WasmB3IRGenerator.cpp: (JSC::Wasm::B3IRGenerator::B3IRGenerator): (JSC::Wasm::createJSToWasmWrapper): (JSC::Wasm::parseAndCompile): * wasm/WasmB3IRGenerator.h: * wasm/WasmBBQPlan.cpp: (JSC::Wasm::BBQPlan::prepare): (JSC::Wasm::BBQPlan::compileFunctions): (JSC::Wasm::BBQPlan::complete): * wasm/WasmBBQPlan.h: * wasm/WasmBBQPlanInlines.h: (JSC::Wasm::BBQPlan::initializeCallees): * wasm/WasmCodeBlock.cpp: (JSC::Wasm::CodeBlock::CodeBlock): * wasm/WasmCodeBlock.h: (JSC::Wasm::CodeBlock::jsEntrypointCalleeFromFunctionIndexSpace): * wasm/WasmFormat.h: * wasm/WasmOMGPlan.cpp: (JSC::Wasm::OMGPlan::work): 2017-06-07 JF Bastien WebAssembly: test imports and exports with 16-bit characters https://bugs.webkit.org/show_bug.cgi?id=165977 Reviewed by Saam Barati. Add the missing UTF-8 conversions. Improve import failure error messages, otherwise it's hard to figure out which import is wrong. * wasm/js/JSWebAssemblyInstance.cpp: (JSC::JSWebAssemblyInstance::create): * wasm/js/WebAssemblyModuleRecord.cpp: (JSC::WebAssemblyModuleRecord::finishCreation): (JSC::WebAssemblyModuleRecord::link): 2017-06-07 Devin Rousso Web Inspector: Add ContextMenu item to log WebSocket object to console https://bugs.webkit.org/show_bug.cgi?id=172878 Reviewed by Joseph Pecoraro. * inspector/protocol/Network.json: Add resolveWebSocket command. 2017-06-07 Jon Davis Update feature status for features Supported In Preview https://bugs.webkit.org/show_bug.cgi?id=173071 Reviewed by Darin Adler. Updated Media Capture and Streams, Performance Observer, Resource Timing Level 2, User Timing Level 2, Web Cryptography API, WebGL 2, WebRTC. * features.json: 2017-06-07 Saam Barati Assertion failure in com.apple.WebKit.WebContent.Development in com.apple.JavaScriptCore: JSC::DFG::SpeculativeJIT::nonSpeculativePeepholeBranchNullOrUndefined + 141 https://bugs.webkit.org/show_bug.cgi?id=172673 Reviewed by Mark Lam. This patch simply removes this assertion. It's faulty because it races with the main thread when doing concurrent compilation. Consider a program with: - a FrozenValue over an object O and Structure S1. S1 starts off as dfgWatchable() being true. - Structure S2 The DFG IR is like so: a: JSConstant(O) // FrozenValue {O, S1} b: CheckStructure(@a, S2) c: ToThis(@a) d: CheckEq(@c, nullConstant) Branch(@d) The AbstractValue for @a will start off as having a finite structure because S1 is dfgWatchable(). When running AI, we'll notice that node @b will OSR exit, so nodes after @b are unreachable. Later in the compilation, S1 is no longer dfgWatchable(). Now, when running AI, @a will have Top for its structure set. No longer will we think @b exits. The DFG backend asserts that under such a situation, we should have simplified the CheckEq to false. However, this is a racy thing to assert, since the transition from dfgWatchable() to !dfgWatchable() can happen right before we enter the backend. Hence, this assertion is not valid. (Note, the generated code for the above program will never actually execute. Since we noticed S1 as dfgWatchable(), we make the compilation dependent on S1 not transitioning. S1 transitions, so we won't actually run the code that gets compiled.) * dfg/DFGSpeculativeJIT64.cpp: (JSC::DFG::SpeculativeJIT::nonSpeculativePeepholeBranchNullOrUndefined): 2017-06-07 Yusuke Suzuki [JSC] has_generic_property never accepts non-String https://bugs.webkit.org/show_bug.cgi?id=173057 Reviewed by Darin Adler. We never pass non-String value to has_generic_property bytecode. * runtime/CommonSlowPaths.cpp: (JSC::SLOW_PATH_DECL): 2017-06-06 Fujii Hironori [Win][x86-64] Some callee saved registers aren't preserved https://bugs.webkit.org/show_bug.cgi?id=171266 Reviewed by Saam Barati. * jit/RegisterSet.cpp: (JSC::RegisterSet::calleeSaveRegisters): Added edi and esi for X86_64 Windows. 2017-06-06 Mark Lam Contiguous storage butterfly length should not exceed MAX_STORAGE_VECTOR_LENGTH. https://bugs.webkit.org/show_bug.cgi?id=173035 Reviewed by Geoffrey Garen and Filip Pizlo. Also added and fixed up some assertions. * runtime/ArrayConventions.h: * runtime/JSArray.cpp: (JSC::JSArray::setLength): * runtime/JSObject.cpp: (JSC::JSObject::createInitialIndexedStorage): (JSC::JSObject::ensureLengthSlow): (JSC::JSObject::reallocateAndShrinkButterfly): * runtime/JSObject.h: (JSC::JSObject::ensureLength): * runtime/RegExpObject.cpp: (JSC::collectMatches): * runtime/RegExpPrototype.cpp: (JSC::regExpProtoFuncSplitFast): 2017-06-06 Saam Barati Make sure we restore SP when doing calls that could be to JS https://bugs.webkit.org/show_bug.cgi?id=172946 Reviewed by JF Bastien. I was worried that there was a bug where we'd call JS, JS would tail call, and we'd end up with a bogus SP. However, this bug does not exist since wasm always calls to JS through a stub, and the stub treats SP as a callee save. I wrote a test for this, and also made a note that this is the needed ABI. * wasm/WasmBinding.cpp: (JSC::Wasm::wasmToJs): 2017-06-06 Keith Miller OMG tier up checks should be a patchpoint https://bugs.webkit.org/show_bug.cgi?id=172944 Reviewed by Saam Barati. Tier up checks in BBQ should be done as a patchpoint rather than individual B3 opcodes. In order to reduce code generated out of line in each function. We generate a single stub that pushes all the callee-saves. This looks like a 5-10% compile time speedup. * wasm/WasmB3IRGenerator.cpp: (JSC::Wasm::B3IRGenerator::B3IRGenerator): (JSC::Wasm::B3IRGenerator::emitTierUpCheck): (JSC::Wasm::B3IRGenerator::addLoop): * wasm/WasmThunks.cpp: (JSC::Wasm::triggerOMGTierUpThunkGenerator): * wasm/WasmThunks.h: 2017-06-06 Darin Adler Cut down use of WTF_ARRAY_LENGTH https://bugs.webkit.org/show_bug.cgi?id=172997 Reviewed by Chris Dumez. * parser/Lexer.cpp: (JSC::singleEscape): Use WTF_ARRAY_LENGTH instead of ARRAY_SIZE. * runtime/NumberPrototype.cpp: (JSC::toStringWithRadix): Use std::end instead of WTF_ARRAY_LENGTH. 2017-06-06 Konstantin Tokarev Add missing includes https://bugs.webkit.org/show_bug.cgi?id=173017 Patch by Thiago Macieira Reviewed by Yusuke Suzuki. This patch fixes compilation with GCC 7. * inspector/InspectorBackendDispatcher.h: 2017-06-06 Filip Pizlo Unreviewed, fix 32-bit build. * jit/JITOpcodes.cpp: (JSC::JIT::emit_op_unreachable): 2017-06-06 Joseph Pecoraro Unreviewed rollout r217807. Caused a test to crash. * heap/HeapSnapshotBuilder.cpp: (JSC::HeapSnapshotBuilder::buildSnapshot): (JSC::HeapSnapshotBuilder::json): (): Deleted. * heap/HeapSnapshotBuilder.h: * runtime/JSObject.cpp: (JSC::JSObject::calculatedClassName): 2017-06-06 Filip Pizlo index out of bound in bytecodebasicblock https://bugs.webkit.org/show_bug.cgi?id=172963 Reviewed by Saam Barati and Mark Lam. We were leaving an unterminated basic block when generating CodeForCall for a class constructor. This was mostly benign since that unterminated block was not reachable, but it does cause an ASSERT. This fixes the issue by appending op_unreachable to that block. I added op_unreachable because this really is the cleanest and most idiomatic way to solve this problem, so even though it makes the change bigger it's probabably worth it. * bytecode/BytecodeDumper.cpp: (JSC::BytecodeDumper::dumpBytecode): * bytecode/BytecodeList.json: * bytecode/BytecodeUseDef.h: (JSC::computeUsesForBytecodeOffset): (JSC::computeDefsForBytecodeOffset): * bytecode/Opcode.h: (JSC::isTerminal): * bytecompiler/BytecodeGenerator.cpp: (JSC::BytecodeGenerator::generate): (JSC::BytecodeGenerator::emitUnreachable): * bytecompiler/BytecodeGenerator.h: * dfg/DFGByteCodeParser.cpp: (JSC::DFG::ByteCodeParser::parseBlock): * dfg/DFGCapabilities.cpp: (JSC::DFG::capabilityLevel): * ftl/FTLLowerDFGToB3.cpp: (JSC::FTL::DFG::LowerDFGToB3::compileUnreachable): * jit/JIT.cpp: (JSC::JIT::privateCompileMainPass): * jit/JIT.h: * jit/JITOpcodes.cpp: (JSC::JIT::emit_op_unreachable): * llint/LowLevelInterpreter.asm: * runtime/CommonSlowPaths.cpp: (JSC::SLOW_PATH_DECL): * runtime/CommonSlowPaths.h: 2017-06-06 Ryan Haddad Unreviewed, rolling out r217812. This change caused test failures on arm64. Reverted changeset: "OMG tier up checks should be a patchpoint" https://bugs.webkit.org/show_bug.cgi?id=172944 http://trac.webkit.org/changeset/217812 2017-06-06 Carlos Garcia Campos [WPE] Enable remote inspector https://bugs.webkit.org/show_bug.cgi?id=172971 Reviewed by Žan Doberšek. We can just build the current glib remote inspector, without adding a frontend implementation and using a WebKitGTK+ browser as frontend for now. * PlatformWPE.cmake: Add remote inspector files to compilation. * inspector/remote/glib/RemoteInspectorUtils.cpp: (Inspector::backendCommands): Load the inspector resources library. 2017-06-06 Carlos Garcia Campos [GLIB] Make remote inspector DBus protocol common to all glib based ports https://bugs.webkit.org/show_bug.cgi?id=172970 Reviewed by Žan Doberšek. We are currently using "webkitgtk" in the names of DBus interfaces and object paths inside an ifdef with the idea that other ports could use their own names. However, the protocol is the same, so we could use the same names and make all glib based ports compatible to each other. This way we could use the GTK+ MiniBrowser to debug WPE, without having to implement the frontend part in WPE yet. * inspector/remote/glib/RemoteInspectorGlib.cpp: Use webkit instead of webkitgtk and reomve platform idfeds. * inspector/remote/glib/RemoteInspectorServer.cpp: Ditto. 2017-06-06 Carlos Garcia Campos [GTK] Web Process deadlock when closing the remote inspector frontend https://bugs.webkit.org/show_bug.cgi?id=172973 Reviewed by Žan Doberšek. We are taking the remote inspector mutex twice. First close message is received, and receivedCloseMessage() takes the mutex. Then RemoteConnectionToTarget::close() is called that, when connected, calls PageDebuggable::disconnect() that ends up calling RemoteInspector::updateTarget() that also takes the remote inspector mutex. We should release the mutex before calling RemoteConnectionToTarget::close(). * inspector/remote/glib/RemoteInspectorGlib.cpp: (Inspector::RemoteInspector::receivedCloseMessage): 2017-06-05 Saam Barati Try to fix features.json by adding an ESNext section. Unreviewed. * features.json: 2017-06-05 David Kilzer Follow-up: Update JSC's features.json https://bugs.webkit.org/show_bug.cgi?id=172942 Rubber-stamped by Jon Davis. * features.json: Change "Supported in preview" to "Supported" to try to fix . 2017-06-05 Saam Barati We don't properly parse init_expr when the opcode is an unexpected opcode https://bugs.webkit.org/show_bug.cgi?id=172945 Reviewed by JF Bastien. The bug is a simple typo. It should use the constant `true` instead of `false` when invoking the WASM_PARSER_FAIL_IF macro. This failure is already caught by spec tests that fail on arm64 devices. * wasm/WasmModuleParser.cpp: 2017-06-05 Keith Miller OMG tier up checks should be a patchpoint https://bugs.webkit.org/show_bug.cgi?id=172944 Reviewed by Saam Barati. Tier up checks in BBQ should be done as a patchpoint rather than individual B3 opcodes. In order to reduce code generated out of line in each function. We generate a single stub that pushes all the callee-saves. This looks like a 5-10% compile time speedup. * wasm/WasmB3IRGenerator.cpp: (JSC::Wasm::B3IRGenerator::B3IRGenerator): (JSC::Wasm::B3IRGenerator::emitTierUpCheck): (JSC::Wasm::B3IRGenerator::addLoop): * wasm/WasmThunks.cpp: (JSC::Wasm::triggerOMGTierUpThunkGenerator): * wasm/WasmThunks.h: 2017-06-05 Joseph Pecoraro Remove unused VM members https://bugs.webkit.org/show_bug.cgi?id=172941 Reviewed by Mark Lam. * runtime/HashMapImpl.h: (JSC::HashMapImpl::selectStructure): Deleted. * runtime/VM.cpp: (JSC::VM::VM): * runtime/VM.h: 2017-06-05 Joseph Pecoraro Web Inspector: Improve ES6 Class instances in Heap Snapshot instances view https://bugs.webkit.org/show_bug.cgi?id=172848 Reviewed by Saam Barati. * heap/HeapSnapshotBuilder.h: * heap/HeapSnapshotBuilder.cpp: Update the snapshot version. Change the node's 0 | 1 internal value to be a 32bit bit flag. This is nice in that it is both compatible with the previous snapshot version and the same size. We can use more flags in the future. (JSC::HeapSnapshotBuilder::json): In cases where the classInfo gives us "Object" check for a better class name by checking (o).__proto__.constructor.name. We avoid this check in cases where (o).hasOwnProperty("constructor") which is the case for most Foo.prototype objects. Otherwise this would get the name of the Foo superclass for the Foo.prototype object. * runtime/JSObject.cpp: (JSC::JSObject::calculatedClassName): Handle some possible edge cases that were not handled before. Such as a JSObject without a GlobalObject, and an object which doesn't have a default getPrototype. Try to make the code a little clearer. 2017-06-05 Saam Barati Update JSC's features.json https://bugs.webkit.org/show_bug.cgi?id=172942 Rubber stamped by Mark Lam. * features.json: 2017-06-04 Konstantin Tokarev Fix build of Windows-specific code with ICU 59.1 https://bugs.webkit.org/show_bug.cgi?id=172729 Reviewed by Darin Adler. Fix conversions from WTF::String to wchar_t* and vice versa. * jsc.cpp: (currentWorkingDirectory): (fetchModuleFromLocalFileSystem): * runtime/DateConversion.cpp: (JSC::formatDateTime): 2017-06-04 Yusuke Suzuki [JSC] Drop unnecessary USE(CF) guard for getenv https://bugs.webkit.org/show_bug.cgi?id=172903 Reviewed by Sam Weinig. getenv is not related to USE(CF) and OS(UNIX). It seems that this ifdef only hits in WinCairo, but WinCairo can use getenv. Moreover, in VM::VM, we already use getenv without any ifdef guard. This patch just drops it. * runtime/VM.cpp: (JSC::enableAssembler): 2017-06-04 Yusuke Suzuki [JSC] Drop OS(DARWIN) for uintptr_t type conflict https://bugs.webkit.org/show_bug.cgi?id=172904 Reviewed by Sam Weinig. In non-Darwin environment, uintptr_t may have the same type to uint64_t. We avoided the compile error by using OS(DARWIN). But, since it depends on cstdint implementaion rather than OS, it is flaky. Instead, we just use template parameter IntegralType. And we describe the type constraint in a SFINAE manner. * dfg/DFGOpInfo.h: (JSC::DFG::OpInfo::OpInfo): 2017-06-03 Csaba Osztrogonác [ARM] Unreviewed buildfix after r217711. * assembler/MacroAssemblerARM.h: (JSC::MacroAssemblerARM::xor32): 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 ==