| 2018-09-10 Michael Saboff <msaboff@apple.com> |
| |
| Test262 failure with Named Capture Groups - using a reference before the group is defined |
| https://bugs.webkit.org/show_bug.cgi?id=189407 |
| |
| Reviewed by Alex Christensen. |
| |
| Added code to save the named forward references we see during parsing and validating that |
| they are all present when parsing the RegExp is complete. If there are unnamed references, |
| we reparse with some variation of behavior. Just like for numeric references, the |
| behavior is different depending on whether or not the unicode (u flag) is present. |
| For non-unicode patterns, we treat the \k<...> as a literal pattern. For a unicode |
| pattern we throw an exception. |
| |
| Did some refactoring, renaming YarrPattern::reset() and YarrPatternConstructor::reset() |
| resetForReparsing() as that is the only use for those methods. Also changed |
| all the delegate methods that take a String to take a const String& to eliminate |
| copy churn. |
| |
| * yarr/YarrParser.h: |
| (JSC::Yarr::Parser::CharacterClassParserDelegate::atomNamedBackReference): |
| (JSC::Yarr::Parser::CharacterClassParserDelegate::isValidNamedForwardReference): |
| (JSC::Yarr::Parser::CharacterClassParserDelegate::atomNamedForwardReference): |
| (JSC::Yarr::Parser::parseEscape): |
| * yarr/YarrPattern.cpp: |
| (JSC::Yarr::YarrPatternConstructor::resetForReparsing): |
| (JSC::Yarr::YarrPatternConstructor::saveUnmatchedNamedForwardReferences): |
| (JSC::Yarr::YarrPatternConstructor::atomNamedBackReference): |
| (JSC::Yarr::YarrPatternConstructor::isValidNamedForwardReference): |
| (JSC::Yarr::YarrPatternConstructor::atomNamedForwardReference): |
| (JSC::Yarr::YarrPattern::compile): |
| (JSC::Yarr::YarrPatternConstructor::reset): Deleted. |
| * yarr/YarrPattern.h: |
| (JSC::Yarr::YarrPattern::resetForReparsing): |
| (JSC::Yarr::YarrPattern::containsIllegalNamedForwardReferences): |
| (JSC::Yarr::YarrPattern::reset): Deleted. |
| * yarr/YarrSyntaxChecker.cpp: |
| (JSC::Yarr::SyntaxChecker::atomNamedBackReference): |
| (JSC::Yarr::SyntaxChecker::isValidNamedForwardReference): |
| (JSC::Yarr::SyntaxChecker::atomNamedForwardReference): |
| |
| 2018-09-08 Yusuke Suzuki <utatane.tea@gmail.com> |
| |
| [JSC] Remove loadModule function in jsc.cpp |
| https://bugs.webkit.org/show_bug.cgi?id=184808 |
| |
| Reviewed by Darin Adler. |
| |
| Since we have `import`, we do not need to have `loadModule` function for testing purpose. |
| |
| * jsc.cpp: |
| (GlobalObject::finishCreation): |
| (functionLoadModule): Deleted. |
| |
| 2018-09-07 Mark Lam <mark.lam@apple.com> |
| |
| Ensure that handleIntrinsicCall() is only applied on op_call shaped instructions. |
| https://bugs.webkit.org/show_bug.cgi?id=189317 |
| <rdar://problem/44152198> |
| |
| Reviewed by Filip Pizlo. |
| |
| handleIntrinsicCall() is normally used for checking if an op_call is a call to |
| an intrinsic function, and inlining it if it's a match. |
| |
| However, getter and setter functions also does calls, and uses handleCall() |
| to implement the call. handleCall() eventually calls handleIntrinsicCall() to |
| check for intrinsics. This results in a bug because handleIntrinsicCall() |
| sometimes relies on the ArrayProfile* of the instruction, and is always assuming |
| that the instruction is op_call shaped. This turns out to be not true: getters |
| and setters can get there with op_get_by_val and op_put_by_val instead. |
| |
| Since the intrinsic functions handled by handleIntrinsicCall() are never |
| intended to be used as getter / setter functions anyway, we can prevent this |
| whole class of bugs by having handleIntrinsicCall() fail early if the |
| instruction is not op_call shaped. |
| |
| To implement this fix, we did the following: |
| |
| 1. Introduced the OpcodeShape enum. |
| 2. Introduced isOpcodeShape<OpcodeShape>() for testing if a instruction of the |
| shape of the specified OpcodeShape. |
| 3. Introduced arrayProfileFor<OpcodeShape>() for fetching the ArrayProfile* from |
| the instruction given the OpcodeShape. |
| |
| Using this arrayProfileFor template has the following benefits: |
| 1. Centralizes the definition of which instructions has an ArrayProfile* operand. |
| 2. Centralizes the definition of which operand is the ArrayProfile*. |
| 3. Asserts that the instruction is of the expected shape when retrieving the |
| ArrayProfile*. |
| |
| 4. Added ArrayProfile::m_typeName and ArrayProfile::s_typeName which are used |
| in ArrayProfile::isValid() as a sanity check that a retrieved ArrayProfile* |
| indeed does point to an ArrayProfile. |
| |
| * JavaScriptCore.xcodeproj/project.pbxproj: |
| * bytecode/ArrayProfile.cpp: |
| * bytecode/ArrayProfile.h: |
| (JSC::ArrayProfile::isValid const): |
| * bytecode/OpcodeInlines.h: Added. |
| (JSC::isOpcodeShape): |
| (JSC::arrayProfileFor): |
| * dfg/DFGByteCodeParser.cpp: |
| (JSC::DFG::ByteCodeParser::handleIntrinsicCall): |
| (JSC::DFG::ByteCodeParser::parseBlock): |
| * jit/JITCall.cpp: |
| (JSC::JIT::compileOpCall): |
| * jit/JITCall32_64.cpp: |
| (JSC::JIT::compileOpCall): |
| * jit/JITOpcodes.cpp: |
| (JSC::JIT::emit_op_has_indexed_property): |
| * jit/JITOpcodes32_64.cpp: |
| (JSC::JIT::emit_op_has_indexed_property): |
| * jit/JITPropertyAccess.cpp: |
| (JSC::JIT::emit_op_get_by_val): |
| (JSC::JIT::emit_op_put_by_val): |
| (JSC::JIT::emitGenericContiguousPutByVal): |
| (JSC::JIT::emitArrayStoragePutByVal): |
| (JSC::JIT::emitIntTypedArrayPutByVal): |
| (JSC::JIT::emitFloatTypedArrayPutByVal): |
| * jit/JITPropertyAccess32_64.cpp: |
| (JSC::JIT::emit_op_get_by_val): |
| (JSC::JIT::emit_op_put_by_val): |
| (JSC::JIT::emitGenericContiguousPutByVal): |
| (JSC::JIT::emitArrayStoragePutByVal): |
| * llint/LLIntSlowPaths.cpp: |
| (JSC::LLInt::LLINT_SLOW_PATH_DECL): |
| (JSC::LLInt::getByVal): |
| * runtime/CommonSlowPaths.cpp: |
| (JSC::SLOW_PATH_DECL): |
| |
| 2018-09-06 Yusuke Suzuki <yusukesuzuki@slowstart.org> |
| |
| [DFG] DFG should handle String#toString |
| https://bugs.webkit.org/show_bug.cgi?id=189151 |
| |
| Reviewed by Saam Barati. |
| |
| We handle String#toString and String#valueOf in DFG by introducing StringValueOf node. |
| In the fixup phase, we attempt to lower StringValueOf to the existing ToString or Identity |
| nodes. If we fail to lower it, we have StringValueOf(UntypedUse), which may raise an error |
| if an argument is neither String nor StringObject. The error message in String#toString and |
| String#valueOf is poor, which will be handled in a separate bug[1]. |
| |
| It improves simple microbenchmarks by 53.4 - 67.6%. |
| |
| baseline patched |
| |
| string-object-to-string 21.7308+-3.3147 ^ 12.9655+-0.0527 ^ definitely 1.6760x faster |
| string-object-value-of 20.1122+-0.0691 ^ 13.1134+-0.2482 ^ definitely 1.5337x faster |
| |
| [1]: https://bugs.webkit.org/show_bug.cgi?id=189357 |
| |
| * dfg/DFGAbstractInterpreterInlines.h: |
| (JSC::DFG::AbstractInterpreter<AbstractStateType>::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): |
| (JSC::DFG::FixupPhase::fixupStringValueOf): |
| * dfg/DFGNode.h: |
| (JSC::DFG::Node::convertToToString): |
| * dfg/DFGNodeType.h: |
| * dfg/DFGOperations.cpp: |
| * dfg/DFGOperations.h: |
| * dfg/DFGPredictionPropagationPhase.cpp: |
| * dfg/DFGSafeToExecute.h: |
| (JSC::DFG::safeToExecute): |
| * dfg/DFGSpeculativeJIT.cpp: |
| (JSC::DFG::SpeculativeJIT::compileToStringOrCallStringConstructorOrStringValueOf): |
| (JSC::DFG::SpeculativeJIT::compileToStringOrCallStringConstructor): 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::compileToStringOrCallStringConstructorOrStringValueOf): |
| (JSC::FTL::DFG::LowerDFGToB3::compileToStringOrCallStringConstructor): Deleted. |
| |
| 2018-09-07 Yusuke Suzuki <yusukesuzuki@slowstart.org> |
| |
| [WebAssembly] Optimize JS to Wasm call by using pointer of Signature as SignatureIndex |
| https://bugs.webkit.org/show_bug.cgi?id=189401 |
| |
| Reviewed by Mark Lam. |
| |
| SignatureInformation is a global repository for Signature to make Signature atomic. |
| It takes Ref<Signature>&& and generates SignatureIndex. And we get const Signature& |
| by using this SignatureIndex. However, converting SignatureIndex to const Signature& |
| always looks up a hash table. This is costly since JS to Wasm calls always use |
| Signature& to check types of arguments. |
| |
| Instead of using this hash table, this patch uses a pointer of Signature as SignatureIndex. |
| This allows us to convert SignatureIndex to Signature by just casting it. |
| |
| We also optimize SignatureInformation::singleton by making an accessor function inlined. |
| And we move ProtoCallFrame::init to the header since it's just setting values. |
| |
| This change significantly optimizes JS to wasm calls (1e7 times) from 600ms to 320ms. |
| |
| In the future, we can remove SignatureIndex by directly handling Ref<Signature>: adding |
| deref() of Signature which unregisters itself from SignatureInformation carefully. Or we can |
| make SignatureIndex uint32_t by introducing a mechanism similar to StructureID. |
| |
| * JavaScriptCore.xcodeproj/project.pbxproj: |
| * Sources.txt: |
| * interpreter/ProtoCallFrame.h: |
| (JSC::ProtoCallFrame::init): |
| * wasm/WasmB3IRGenerator.cpp: |
| (JSC::Wasm::B3IRGenerator::addCallIndirect): |
| * wasm/WasmBBQPlan.cpp: |
| * wasm/WasmFormat.h: |
| (JSC::Wasm::WasmToWasmImportableFunction::offsetOfSignatureIndex): |
| * wasm/WasmFunctionParser.h: |
| * wasm/WasmModule.h: |
| * wasm/WasmOMGPlan.cpp: |
| * wasm/WasmSectionParser.cpp: |
| (JSC::Wasm::SectionParser::parseType): |
| * wasm/WasmSignature.cpp: |
| (JSC::Wasm::SignatureInformation::adopt): |
| (JSC::Wasm::SignatureInformation::tryCleanup): |
| (JSC::Wasm::SignatureInformation::singleton): Deleted. |
| (JSC::Wasm::SignatureInformation::get): Deleted. |
| * wasm/WasmSignature.h: |
| (JSC::Wasm::Signature::index const): |
| (JSC::Wasm::SignatureHash::SignatureHash): |
| (JSC::Wasm::SignatureHash::hash): |
| (JSC::Wasm::SignatureHash::isHashTableDeletedValue const): |
| (JSC::Wasm::SignatureHash::empty): Deleted. |
| (JSC::Wasm::SignatureHash::deleted): Deleted. |
| * wasm/WasmSignatureInlines.h: Renamed from Source/JavaScriptCore/interpreter/ProtoCallFrame.cpp. |
| (JSC::Wasm::SignatureInformation::singleton): |
| (JSC::Wasm::SignatureInformation::get): |
| * wasm/js/JSToWasm.cpp: |
| * wasm/js/JSWebAssemblyModule.h: |
| * wasm/js/WasmToJS.cpp: |
| (JSC::Wasm::wasmToJS): |
| * wasm/js/WebAssemblyFunction.cpp: |
| * wasm/js/WebAssemblyModuleRecord.cpp: |
| * wasm/js/WebAssemblyWrapperFunction.cpp: |
| |
| 2018-09-07 Yusuke Suzuki <yusukesuzuki@slowstart.org> |
| |
| [JSC] Put .throwStackOverflow code after the fast path in LLInt doVMEntry |
| https://bugs.webkit.org/show_bug.cgi?id=189410 |
| |
| Reviewed by Mark Lam. |
| |
| Put .throwStackOverflow code after the fast path in LLInt doVMEntry to |
| make doVMEntry code tight. |
| |
| * llint/LLIntThunks.cpp: |
| (JSC::vmEntryToWasm): Deleted. |
| * llint/LLIntThunks.h: |
| (JSC::vmEntryToWasm): |
| * llint/LowLevelInterpreter32_64.asm: |
| * llint/LowLevelInterpreter64.asm: |
| |
| 2018-09-06 Yusuke Suzuki <yusukesuzuki@slowstart.org> |
| |
| [WebAssembly] Optimize JS to Wasm call by removing Vector allocation |
| https://bugs.webkit.org/show_bug.cgi?id=189353 |
| |
| Reviewed by Mark Lam. |
| |
| JS to Wasm call always allocates Vector for the arguments. This is really costly if the wasm function is small. |
| This patch adds an initial size parameter to the Vector to avoid allocations for small sized arguments. |
| |
| * runtime/ArgList.h: |
| * wasm/js/WebAssemblyFunction.cpp: |
| (JSC::callWebAssemblyFunction): |
| |
| 2018-08-31 Yusuke Suzuki <yusukesuzuki@slowstart.org> |
| |
| [JSC] Clean up StructureStubClearingWatchpoint |
| https://bugs.webkit.org/show_bug.cgi?id=189156 |
| |
| Reviewed by Saam Barati. |
| |
| Cleaning up StructureStubClearingWatchpoint by holding StructureStubClearingWatchpoint in Bag |
| in WatchpointsOnStructureStubInfo. This removes hacky linked list code for StructureStubClearingWatchpoint. |
| |
| * bytecode/StructureStubClearingWatchpoint.cpp: |
| (JSC::WatchpointsOnStructureStubInfo::addWatchpoint): |
| (JSC::StructureStubClearingWatchpoint::~StructureStubClearingWatchpoint): Deleted. |
| (JSC::StructureStubClearingWatchpoint::push): Deleted. |
| (JSC::WatchpointsOnStructureStubInfo::~WatchpointsOnStructureStubInfo): Deleted. |
| * bytecode/StructureStubClearingWatchpoint.h: |
| (JSC::StructureStubClearingWatchpoint::StructureStubClearingWatchpoint): |
| |
| 2018-09-06 Michael Saboff <msaboff@apple.com> |
| |
| Improper speculation type for Math.pow(NaN, 0) in Abstract Interpreter |
| https://bugs.webkit.org/show_bug.cgi?id=189380 |
| |
| Reviewed by Saam Barati. |
| |
| Account for the case where in Math.pow(NaN, y) where y could be 0. |
| |
| * bytecode/SpeculatedType.cpp: |
| (JSC::typeOfDoublePow): |
| |
| 2018-09-06 Mark Lam <mark.lam@apple.com> |
| |
| Gardening: only visit m_cachedStructureID if it's not null. |
| https://bugs.webkit.org/show_bug.cgi?id=189124 |
| <rdar://problem/43863605> |
| |
| Not reviewed. |
| |
| * runtime/JSPropertyNameEnumerator.cpp: |
| (JSC::JSPropertyNameEnumerator::visitChildren): |
| |
| 2018-09-06 Tomas Popela <tpopela@redhat.com> |
| |
| [JSC] Build broken after r234975 on s390x, ppc64le, armv7hl |
| https://bugs.webkit.org/show_bug.cgi?id=189078 |
| |
| Reviewed by Mark Lam. |
| |
| Caused by the GCC bug - https://gcc.gnu.org/bugzilla/show_bug.cgi?id=70124. |
| Using the ternary operator instead of std::max() fixes it. |
| |
| * heap/RegisterState.h: |
| |
| 2018-09-05 Mark Lam <mark.lam@apple.com> |
| |
| JSPropertyNameEnumerator::visitChildren() needs to visit its m_cachedStructureID. |
| https://bugs.webkit.org/show_bug.cgi?id=189124 |
| <rdar://problem/43863605> |
| |
| Reviewed by Filip Pizlo. |
| |
| It is assumed that the Structure for the m_cachedStructureID will remain alive |
| while the m_cachedStructureID is in use. This prevents the structureID from being |
| re-used for a different Structure. |
| |
| * runtime/JSPropertyNameEnumerator.cpp: |
| (JSC::JSPropertyNameEnumerator::visitChildren): |
| |
| 2018-09-05 Ross Kirsling <ross.kirsling@sony.com> |
| |
| [ESNext] Symbol.prototype.description |
| https://bugs.webkit.org/show_bug.cgi?id=186686 |
| |
| Reviewed by Keith Miller. |
| |
| Symbol.prototype.description was implemented in r232404, but has one small bug: |
| It should return undefined for a null symbol. |
| |
| * runtime/Symbol.cpp: |
| (JSC::Symbol::description const): |
| * runtime/SymbolPrototype.cpp: |
| (JSC::symbolProtoGetterDescription): |
| Address the null symbol case. |
| |
| 2018-09-04 Keith Miller <keith_miller@apple.com> |
| |
| RELEASE_ASSERT at ../../Source/JavaScriptCore/heap/MarkedSpace.h:83 |
| https://bugs.webkit.org/show_bug.cgi?id=188917 |
| |
| Reviewed by Mark Lam. |
| |
| Our allocators should be able to handle allocating a zero-sized object. |
| Zero-sized objects will be allocated into the smallest size class. |
| |
| * dfg/DFGSpeculativeJIT.cpp: |
| (JSC::DFG::SpeculativeJIT::compileNewTypedArrayWithSize): |
| * ftl/FTLLowerDFGToB3.cpp: |
| (JSC::FTL::DFG::LowerDFGToB3::compileNewTypedArray): |
| (JSC::FTL::DFG::LowerDFGToB3::allocatorForSize): |
| * heap/MarkedSpace.h: |
| (JSC::MarkedSpace::sizeClassToIndex): |
| (JSC::MarkedSpace::indexToSizeClass): |
| * jit/AssemblyHelpers.cpp: |
| (JSC::AssemblyHelpers::emitAllocateVariableSized): |
| * runtime/JSArrayBufferView.cpp: |
| (JSC::JSArrayBufferView::ConstructionContext::ConstructionContext): |
| |
| 2018-09-05 Mark Lam <mark.lam@apple.com> |
| |
| Fix DeferredSourceDump to capture the caller bytecodeIndex instead of CodeOrigin. |
| https://bugs.webkit.org/show_bug.cgi?id=189300 |
| <rdar://problem/39681779> |
| |
| Reviewed by Saam Barati. |
| |
| At the time a DeferredSourceDump is instantiated, it captures a CodeOrigin value |
| which points to a InlineCallFrame in the DFG::Plan's m_inlineCallFrames set. The |
| DeferredSourceDump is later used to dump source even if the compilation fails. |
| This is intentional so that we can use this tool to see what source fails to |
| compile as well. |
| |
| The DFG::Plan may have been destructed by then, and since the compilation failed, |
| the InlineCallFrame is also destructed. This means DeferredSourceDump::dump() |
| may be end up accessing freed memory. |
| |
| DeferredSourceDump doesn't really need a CodeOrigin. All it wants is the caller |
| bytecodeIndex for the call to an inlined function. Hence, we can fix this issue |
| by changing DeferredSourceDump to capture the caller bytecodeIndex instead. |
| |
| In this patch, we also change DeferredSourceDump's m_codeBlock and m_rootCodeBlock |
| to be Strong references to ensure that the CodeBlocks are kept alive until they |
| can be dumped. |
| |
| * bytecode/DeferredCompilationCallback.cpp: |
| (JSC::DeferredCompilationCallback::dumpCompiledSourcesIfNeeded): |
| * bytecode/DeferredSourceDump.cpp: |
| (JSC::DeferredSourceDump::DeferredSourceDump): |
| (JSC::DeferredSourceDump::dump): |
| * bytecode/DeferredSourceDump.h: |
| * dfg/DFGByteCodeParser.cpp: |
| (JSC::DFG::ByteCodeParser::parseCodeBlock): |
| |
| 2018-09-05 David Kilzer <ddkilzer@apple.com> |
| |
| REGRESSION (r235419): DFGCFG.h is missing from JavaScriptCore Xcode project |
| |
| Found using `tidy-Xcode-project-file --missing` (see Bug |
| 188754). Fix was made manually. |
| |
| * JavaScriptCore.xcodeproj/project.pbxproj: |
| (dfg/DFGCFG.h): Revert accidental change in r235419 by restoring |
| `name` and `path` values to file reference. |
| |
| 2018-09-05 Mark Lam <mark.lam@apple.com> |
| |
| isAsyncGeneratorMethodParseMode() should check for SourceParseMode::AsyncGeneratorWrapperMethodMode. |
| https://bugs.webkit.org/show_bug.cgi?id=189292 |
| <rdar://problem/38907433> |
| |
| Reviewed by Saam Barati. |
| |
| Previously, isAsyncGeneratorMethodParseMode() was checking for AsyncGeneratorWrapperFunctionMode |
| instead of AsyncGeneratorWrapperMethodMode. This patch fixes it |
| to check for AsyncGeneratorWrapperMethodMode (to match what is expected as indicated |
| in the name isAsyncGeneratorMethodParseMode). |
| |
| * parser/ParserModes.h: |
| (JSC::isAsyncGeneratorMethodParseMode): |
| |
| 2018-09-04 Michael Saboff <msaboff@apple.com> |
| |
| Unreviewed indentations change. |
| |
| * yarr/YarrJIT.cpp: |
| (JSC::Yarr::YarrGenerator::matchBackreference): |
| |
| 2018-09-04 Michael Saboff <msaboff@apple.com> |
| |
| JSC Build error when changing CPU type: offlineasm: No magic values found. Skipping assembly file generation |
| https://bugs.webkit.org/show_bug.cgi?id=189274 |
| |
| Reviewed by Saam Barati. |
| |
| Put the derived file LLIntDesiredOffsets.h in an architecture specific subdirectory to make them unique. |
| |
| Some I got this change mixed up with the change for r235636. The changes to JavaScriptCore.xcodeproj/project.pbxproj |
| where landed there. |
| |
| * JavaScriptCore.xcodeproj/project.pbxproj: |
| |
| 2018-09-04 Michael Saboff <msaboff@apple.com> |
| |
| YARR: JIT RegExps with back references |
| https://bugs.webkit.org/show_bug.cgi?id=180874 |
| |
| Reviewed by Filip Pizlo. |
| |
| Implemented JIT'ed back references for all counted types. The only type of back references |
| not handled in the JIT are 16bit matches that ignore case. Such support would require the |
| canonicalization that is currently handled in the Yarr interpreter via a C funtion call. |
| The back reference processing for surrogate pairs is implemented by individually comparing |
| each surrogate ala memcmp. |
| |
| Added a generated canonicalization table for the LChar (8bit) domain to process case |
| ignored back references. |
| |
| Added macro assembler load16(ExtendedAddress) for indexed access to the canonicalization table. |
| |
| Added a new JIT failure reason for forward references as the check to JIT expressions with |
| forward references we're handled synonimously those containing back references. |
| |
| This change is only enabled for 64 bit platforms. |
| |
| * assembler/MacroAssemblerARM64.h: |
| (JSC::MacroAssemblerARM64::load16): |
| * assembler/MacroAssemblerX86_64.h: |
| (JSC::MacroAssemblerX86_64::load16): |
| * runtime/RegExp.cpp: |
| (JSC::RegExp::compile): |
| (JSC::RegExp::compileMatchOnly): |
| * yarr/YarrCanonicalize.h: |
| * yarr/YarrCanonicalizeUCS2.cpp: |
| * yarr/YarrCanonicalizeUCS2.js: |
| (set characters.hex.set string_appeared_here): |
| * yarr/YarrJIT.cpp: |
| (JSC::Yarr::YarrGenerator::checkNotEnoughInput): |
| (JSC::Yarr::YarrGenerator::readCharacterDontDecodeSurrogates): |
| (JSC::Yarr::YarrGenerator::matchBackreference): |
| (JSC::Yarr::YarrGenerator::generateBackReference): |
| (JSC::Yarr::YarrGenerator::backtrackBackReference): |
| (JSC::Yarr::YarrGenerator::generateTerm): |
| (JSC::Yarr::YarrGenerator::backtrackTerm): |
| (JSC::Yarr::YarrGenerator::compile): |
| (JSC::Yarr::dumpCompileFailure): |
| * yarr/YarrJIT.h: |
| * yarr/YarrPattern.h: |
| (JSC::Yarr::BackTrackInfoBackReference::beginIndex): |
| (JSC::Yarr::BackTrackInfoBackReference::matchAmountIndex): |
| |
| 2018-09-04 Mark Lam <mark.lam@apple.com> |
| |
| Make the jsc shell print, printErr, and debug functions more robust. |
| https://bugs.webkit.org/show_bug.cgi?id=189268 |
| <rdar://problem/41192690> |
| |
| Reviewed by Keith Miller. |
| |
| We'll now check for UTF8 conversion errors. |
| |
| * jsc.cpp: |
| (cStringFromViewWithString): |
| (printInternal): |
| (functionDebug): |
| |
| 2018-09-04 Michael Catanzaro <mcatanzaro@igalia.com> |
| |
| [WPE][GTK] Add more unused result warnings to JSC API |
| https://bugs.webkit.org/show_bug.cgi?id=189243 |
| |
| Reviewed by Carlos Garcia Campos. |
| |
| The jsc_context_evaluate() family of functions has a (transfer full) return value, but the |
| caller may be tempted to not inspect it if uninterested in the return value. This would be |
| an error, because it must be freed. |
| |
| * API/glib/JSCContext.h: |
| |
| 2018-09-03 Mark Lam <mark.lam@apple.com> |
| |
| The watchdog sometimes fails to terminate a script. |
| https://bugs.webkit.org/show_bug.cgi?id=189227 |
| <rdar://problem/39932857> |
| |
| Reviewed by Saam Barati. |
| |
| Consider the following scenario: |
| |
| 1. We have an infinite loop bytecode sequence as follows: |
| |
| [ 13] loop_hint |
| [ 14] check_traps |
| [ 15] jmp -2(->13) |
| |
| 2. The VM tiers up from LLInt -> BaselineJIT -> DFG -> FTL. |
| |
| Note that op_check_traps is represented as a CheckTraps node in the DFG and FTL. |
| When we're not using pollingTraps (JSC_usePollingTraps is false by default), |
| we emit no code for CheckTraps, but only record an InvalidationPoint there. |
| |
| 3. The watchdog fires, and invalidates all InvalidationPoints in the FTL CodeBlock. |
| |
| InvalidationPoints OSR exits to the next instruction by design. In this case, |
| that means the VM will resumes executing at the op_jmp, which jumps to the |
| op_loop_hint opcode. At the loop_hint, the VM discovers that the function is |
| already hot, and attempts to tier up. It immediately discovers that a replacement |
| CodeBlock is available because we still haven't jettisoned the DFG CodeBlock |
| nor the FTL CodeBlock that was previously compiled for this function. |
| |
| Note that jettisoning a CodeBlock necessarily means the VM will invalidate |
| its InvalidationPoints (if the CodeBlock is DFG/FTL). However, the reverse |
| is not true: merely invalidating the InvalidationPoints does not necessarily |
| mean that the CodeBlock is jettisoned. |
| |
| VMTraps::tryInstallTrapBreakpoints() runs from a separate thread. Hence, |
| it is only safe for it to invalidate a CodeBlock's InvalidationPoints. It |
| is not safe for the CodeBlock to be jettisoned from another thread. Instead, |
| the VMTraps mechanism relies on the script thread running to an op_check_traps |
| in the baseline JIT code where it will do the necessary jettisoning of optimized |
| CodeBlocks. |
| |
| Since the op_check_traps never get executed, the VM will perpetually tier up in |
| the op_loop_hint, OSR exit to the op_jmp, jump to the op_loop_hint, and repeat. |
| Consequently, the watchdog fails to terminate this script. |
| |
| In this patch, we fix this by making the DFG BytecodeParser emit an InvalidationPoint |
| node directly (when the VM is not configured to use polling traps). This ensures |
| that the check traps invalidation point will OSR exit to the op_check_traps opcode |
| in the baseline JIT. |
| |
| In this patch, we also change VMTraps::tryInstallTrapBreakpoints() to use |
| CallFrame::unsafeCodeBlock() instead of CallFrame::codeBlock(). This is because |
| we don't really know if the frame is properly set up. We're just conservatively |
| probing the stack. ASAN does not like this probing. Using unsafeCodeBlock() here |
| will suppress the false positive ASAN complaint. |
| |
| * dfg/DFGByteCodeParser.cpp: |
| (JSC::DFG::ByteCodeParser::parseBlock): |
| * dfg/DFGClobberize.h: |
| (JSC::DFG::clobberize): |
| * dfg/DFGFixupPhase.cpp: |
| (JSC::DFG::FixupPhase::fixupNode): |
| * dfg/DFGPredictionPropagationPhase.cpp: |
| * dfg/DFGSpeculativeJIT.cpp: |
| (JSC::DFG::SpeculativeJIT::compileCheckTraps): |
| * dfg/DFGSpeculativeJIT32_64.cpp: |
| (JSC::DFG::SpeculativeJIT::compile): |
| * dfg/DFGSpeculativeJIT64.cpp: |
| (JSC::DFG::SpeculativeJIT::compile): |
| * ftl/FTLLowerDFGToB3.cpp: |
| (JSC::FTL::DFG::LowerDFGToB3::compileNode): |
| * runtime/VMTraps.cpp: |
| (JSC::VMTraps::tryInstallTrapBreakpoints): |
| |
| 2018-09-03 Mark Lam <mark.lam@apple.com> |
| |
| CallFrame::unsafeCallee() should use an ASAN suppressed Register::asanUnsafePointer(). |
| https://bugs.webkit.org/show_bug.cgi?id=189247 |
| |
| Reviewed by Saam Barati. |
| |
| * interpreter/CallFrame.h: |
| (JSC::ExecState::unsafeCallee const): |
| * interpreter/Register.h: |
| (JSC::Register::asanUnsafePointer const): |
| (JSC::Register::unsafePayload const): |
| |
| 2018-09-02 Yusuke Suzuki <yusukesuzuki@slowstart.org> |
| |
| Implement Object.fromEntries |
| https://bugs.webkit.org/show_bug.cgi?id=188481 |
| |
| Reviewed by Darin Adler. |
| |
| Object.fromEntries becomes stage 3[1]. This patch implements it by using builtin JS. |
| |
| [1]: https://tc39.github.io/proposal-object-from-entries/ |
| |
| * builtins/ObjectConstructor.js: |
| (fromEntries): |
| * runtime/ObjectConstructor.cpp: |
| |
| 2018-08-24 Yusuke Suzuki <yusukesuzuki@slowstart.org> |
| |
| Function object should convert params to string before throw a parsing error |
| https://bugs.webkit.org/show_bug.cgi?id=188874 |
| |
| Reviewed by Darin Adler. |
| |
| ToString operation onto the `body` of the Function constructor should be performed |
| before checking syntax correctness of the parameters. |
| |
| * runtime/FunctionConstructor.cpp: |
| (JSC::constructFunctionSkippingEvalEnabledCheck): |
| |
| 2018-08-31 Mark Lam <mark.lam@apple.com> |
| |
| Fix exception check accounting in constructJSWebAssemblyCompileError(). |
| https://bugs.webkit.org/show_bug.cgi?id=189185 |
| <rdar://problem/39786007> |
| |
| Reviewed by Michael Saboff. |
| |
| Also add an exception check in JSWebAssemblyModule::createStub() so that we don't |
| inadvertently overwrite a pre-existing exception (if present). |
| |
| * wasm/js/JSWebAssemblyModule.cpp: |
| (JSC::JSWebAssemblyModule::createStub): |
| * wasm/js/WebAssemblyCompileErrorConstructor.cpp: |
| (JSC::constructJSWebAssemblyCompileError): |
| |
| 2018-08-31 Mark Lam <mark.lam@apple.com> |
| |
| Gardening: ARMv7 build fix. |
| https://bugs.webkit.org/show_bug.cgi?id=158911 |
| |
| Not reviewed. |
| |
| * assembler/MacroAssemblerARMv7.h: |
| (JSC::MacroAssemblerARMv7::patchableBranch8): |
| |
| 2018-08-31 Mark Lam <mark.lam@apple.com> |
| |
| Fix exception check accounting in JSDataView::defineOwnProperty(). |
| https://bugs.webkit.org/show_bug.cgi?id=189186 |
| <rdar://problem/39786049> |
| |
| Reviewed by Michael Saboff. |
| |
| * runtime/JSDataView.cpp: |
| (JSC::JSDataView::defineOwnProperty): |
| |
| 2018-08-31 Mark Lam <mark.lam@apple.com> |
| |
| Add missing exception check in arrayProtoFuncLastIndexOf(). |
| https://bugs.webkit.org/show_bug.cgi?id=189184 |
| <rdar://problem/39785959> |
| |
| Reviewed by Yusuke Suzuki. |
| |
| * runtime/ArrayPrototype.cpp: |
| (JSC::arrayProtoFuncLastIndexOf): |
| |
| 2018-08-31 Saam barati <sbarati@apple.com> |
| |
| convertToRegExpMatchFastGlobal must use KnownString as the child use kind |
| https://bugs.webkit.org/show_bug.cgi?id=189173 |
| <rdar://problem/43501645> |
| |
| Reviewed by Michael Saboff. |
| |
| We were crashing during validation because mayExit returned true |
| at a point in the program when we weren't allowed to exit. |
| |
| The issue was is in StrengthReduction: we end up emitting code that |
| had a StringUse on an edge after a node that did side effects and before |
| an ExitOK/bytecode number transition. However, StrenghReduction did the |
| right thing here and also emitted the type checks before the node with |
| side effects. It just did bad bookkeeping. The node we convert to needs |
| to use KnownStringUse instead of StringUse for the child edge. |
| |
| * dfg/DFGNode.cpp: |
| (JSC::DFG::Node::convertToRegExpExecNonGlobalOrStickyWithoutChecks): |
| (JSC::DFG::Node::convertToRegExpMatchFastGlobalWithoutChecks): |
| (JSC::DFG::Node::convertToRegExpExecNonGlobalOrSticky): Deleted. |
| (JSC::DFG::Node::convertToRegExpMatchFastGlobal): Deleted. |
| * dfg/DFGNode.h: |
| * dfg/DFGStrengthReductionPhase.cpp: |
| (JSC::DFG::StrengthReductionPhase::handleNode): |
| |
| 2018-08-30 Saam barati <sbarati@apple.com> |
| |
| Switch int8_t to GPRReg in StructureStubInfo because sizeof(GPRReg) == sizeof(int8_t) |
| https://bugs.webkit.org/show_bug.cgi?id=189166 |
| |
| Reviewed by Mark Lam. |
| |
| * bytecode/AccessCase.cpp: |
| (JSC::AccessCase::generateImpl): |
| * bytecode/GetterSetterAccessCase.cpp: |
| (JSC::GetterSetterAccessCase::emitDOMJITGetter): |
| * bytecode/InlineAccess.cpp: |
| (JSC::getScratchRegister): |
| * bytecode/PolymorphicAccess.cpp: |
| (JSC::PolymorphicAccess::regenerate): |
| * bytecode/StructureStubInfo.h: |
| (JSC::StructureStubInfo::valueRegs const): |
| * jit/JITInlineCacheGenerator.cpp: |
| (JSC::JITByIdGenerator::JITByIdGenerator): |
| (JSC::JITGetByIdWithThisGenerator::JITGetByIdWithThisGenerator): |
| (JSC::JITInstanceOfGenerator::JITInstanceOfGenerator): |
| |
| 2018-08-30 Saam barati <sbarati@apple.com> |
| |
| InlineAccess should do StringLength |
| https://bugs.webkit.org/show_bug.cgi?id=158911 |
| |
| Reviewed by Yusuke Suzuki. |
| |
| This patch extends InlineAccess to support StringLength. This patch also |
| fixes AccessCase::fromStructureStubInfo to support ArrayLength and StringLength. |
| I forgot to implement this for ArrayLength in the initial InlineAccess |
| implementation. Supporting StringLength is a natural extension of the |
| InlineAccess machinery. |
| |
| * assembler/MacroAssembler.h: |
| (JSC::MacroAssembler::patchableBranch8): |
| * assembler/MacroAssemblerARM64.h: |
| (JSC::MacroAssemblerARM64::patchableBranch8): |
| * bytecode/AccessCase.cpp: |
| (JSC::AccessCase::fromStructureStubInfo): |
| * bytecode/BytecodeDumper.cpp: |
| (JSC::BytecodeDumper<Block>::printGetByIdCacheStatus): |
| * bytecode/InlineAccess.cpp: |
| (JSC::InlineAccess::dumpCacheSizesAndCrash): |
| (JSC::InlineAccess::generateSelfPropertyAccess): |
| (JSC::getScratchRegister): |
| (JSC::InlineAccess::generateSelfPropertyReplace): |
| (JSC::InlineAccess::generateArrayLength): |
| (JSC::InlineAccess::generateSelfInAccess): |
| (JSC::InlineAccess::generateStringLength): |
| * bytecode/InlineAccess.h: |
| * bytecode/PolymorphicAccess.cpp: |
| (JSC::PolymorphicAccess::regenerate): |
| * bytecode/StructureStubInfo.cpp: |
| (JSC::StructureStubInfo::initStringLength): |
| (JSC::StructureStubInfo::deref): |
| (JSC::StructureStubInfo::aboutToDie): |
| (JSC::StructureStubInfo::propagateTransitions): |
| * bytecode/StructureStubInfo.h: |
| (JSC::StructureStubInfo::baseGPR const): |
| * jit/Repatch.cpp: |
| (JSC::tryCacheGetByID): |
| |
| 2018-08-30 Saam barati <sbarati@apple.com> |
| |
| CSE DataViewGet* DFG nodes |
| https://bugs.webkit.org/show_bug.cgi?id=188768 |
| |
| Reviewed by Yusuke Suzuki. |
| |
| This patch makes it so that we CSE DataViewGet* accesses. To do this, |
| I needed to add a third descriptor to HeapLocation to represent the |
| isLittleEndian child. This patch is neutral on compile time benchmarks, |
| and is a 50% speedup on a trivial CSE microbenchmark that I added. |
| |
| * dfg/DFGClobberize.h: |
| (JSC::DFG::clobberize): |
| * dfg/DFGFixupPhase.cpp: |
| (JSC::DFG::FixupPhase::fixupNode): |
| * dfg/DFGHeapLocation.cpp: |
| (WTF::printInternal): |
| * dfg/DFGHeapLocation.h: |
| (JSC::DFG::HeapLocation::HeapLocation): |
| (JSC::DFG::HeapLocation::hash const): |
| (JSC::DFG::HeapLocation::operator== const): |
| (JSC::DFG::indexedPropertyLocForResultType): |
| |
| 2018-08-30 Yusuke Suzuki <yusukesuzuki@slowstart.org> |
| |
| output of toString() of Generator is wrong |
| https://bugs.webkit.org/show_bug.cgi?id=188952 |
| |
| Reviewed by Saam Barati. |
| |
| Function#toString does not respect generator and async generator. |
| This patch fixes them and supports all the function types. |
| |
| * runtime/FunctionPrototype.cpp: |
| (JSC::functionProtoFuncToString): |
| |
| 2018-08-29 Mark Lam <mark.lam@apple.com> |
| |
| Add some missing exception checks in JSRopeString::resolveRopeToAtomicString(). |
| https://bugs.webkit.org/show_bug.cgi?id=189132 |
| <rdar://problem/42513068> |
| |
| Reviewed by Saam Barati. |
| |
| * runtime/JSCJSValueInlines.h: |
| (JSC::JSValue::toPropertyKey const): |
| * runtime/JSString.cpp: |
| (JSC::JSRopeString::resolveRopeToAtomicString const): |
| |
| 2018-08-29 Commit Queue <commit-queue@webkit.org> |
| |
| Unreviewed, rolling out r235432 and r235436. |
| https://bugs.webkit.org/show_bug.cgi?id=189086 |
| |
| Is a Swift source breaking change. (Requested by keith_miller |
| on #webkit). |
| |
| Reverted changesets: |
| |
| "Add nullablity attributes to JSValue" |
| https://bugs.webkit.org/show_bug.cgi?id=189047 |
| https://trac.webkit.org/changeset/235432 |
| |
| "Add nullablity attributes to JSValue" |
| https://bugs.webkit.org/show_bug.cgi?id=189047 |
| https://trac.webkit.org/changeset/235436 |
| |
| 2018-08-28 Mark Lam <mark.lam@apple.com> |
| |
| Fix bit-rotted Interpreter::dumpRegisters() and move it to the VMInspector. |
| https://bugs.webkit.org/show_bug.cgi?id=189059 |
| <rdar://problem/40335354> |
| |
| Reviewed by Saam Barati. |
| |
| 1. Moved Interpreter::dumpRegisters() to VMInspector::dumpRegisters(). |
| 2. Added $vm.dumpRegisters(). |
| |
| Usage: $vm.dumpRegisters(N) // dump the registers of the Nth CallFrame. |
| Usage: $vm.dumpRegisters() // dump the registers of the current CallFrame. |
| |
| Note: Currently, $vm.dumpRegisters() only dump registers in the physical frame. |
| It will treat inlined frames content as registers in the bounding physical frame. |
| |
| Here's an example of such a dump on a DFG frame: |
| |
| Register frame: |
| |
| ----------------------------------------------------------------------------- |
| use | address | value |
| ----------------------------------------------------------------------------- |
| [r 12 arguments[ 7]] | 0x7ffeefbfd330 | 0xa Undefined |
| [r 11 arguments[ 6]] | 0x7ffeefbfd328 | 0x10bbb3e80 Object: 0x10bbb3e80 with butterfly 0x0 (Structure 0x10bbf20d0:[Object, {}, NonArray, Proto:0x10bbb4000]), StructureID: 76 |
| [r 10 arguments[ 5]] | 0x7ffeefbfd320 | 0xa Undefined |
| [r 9 arguments[ 4]] | 0x7ffeefbfd318 | 0xa Undefined |
| [r 8 arguments[ 3]] | 0x7ffeefbfd310 | 0xa Undefined |
| [r 7 arguments[ 2]] | 0x7ffeefbfd308 | 0xffff0000000a5eaa Int32: 679594 |
| [r 6 arguments[ 1]] | 0x7ffeefbfd300 | 0x10bbd00f0 Object: 0x10bbd00f0 with butterfly 0x8000f8248 (Structure 0x10bba4700:[Function, {name:100, prototype:101, length:102, Symbol.species:103, isArray:104}, NonArray, Proto:0x10bbd0000, Leaf]), StructureID: 160 |
| [r 5 this] | 0x7ffeefbfd2f8 | 0x10bbe0000 Object: 0x10bbe0000 with butterfly 0x8000d8808 (Structure 0x10bb35340:[global, {parseInt:100, parseFloat:101, Object:102, Function:103, Array:104, RegExp:105, RangeError:106, TypeError:107, PrivateSymbol.Object:108, PrivateSymbol.Array:109, ArrayBuffer:110, String:111, Symbol:112, Number:113, Boolean:114, Error:115, Map:116, Set:117, Promise:118, eval:119, Reflect:121, $vm:122, WebAssembly:123, debug:124, describe:125, describeArray:126, print:127, printErr:128, quit:129, gc:130, fullGC:131, edenGC:132, forceGCSlowPaths:133, gcHeapSize:134, addressOf:135, version:136, run:137, runString:138, load:139, loadString:140, readFile:141, read:142, checkSyntax:143, sleepSeconds:144, jscStack:145, readline:146, preciseTime:147, neverInlineFunction:148, noInline:149, noDFG:150, noFTL:151, numberOfDFGCompiles:153, jscOptions:154, optimizeNextInvocation:155, reoptimizationRetryCount:156, transferArrayBuffer:157, failNextNewCodeBlock:158, OSRExit:159, isFinalTier:160, predictInt32:161, isInt32:162, isPureNaN:163, fiatInt52:164, effectful42:165, makeMasquerader:166, hasCustomProperties:167, createGlobalObject:168, dumpTypesForAllVariables:169, drainMicrotasks:170, getRandomSeed:171, setRandomSeed:172, isRope:173, callerSourceOrigin:174, is32BitPlatform:175, loadModule:176, checkModuleSyntax:177, platformSupportsSamplingProfiler:178, generateHeapSnapshot:179, resetSuperSamplerState:180, ensureArrayStorage:181, startSamplingProfiler:182, samplingProfilerStackTraces:183, maxArguments:184, asyncTestStart:185, asyncTestPassed:186, WebAssemblyMemoryMode:187, console:188, $:189, $262:190, waitForReport:191, heapCapacity:192, flashHeapAccess:193, disableRichSourceInfo:194, mallocInALoop:195, totalCompileTime:196, Proxy:197, uneval:198, WScript:199, failWithMessage:200, triggerAssertFalse:201, isNaN:202, isFinite:203, escape:204, unescape:205, decodeURI:206, decodeURIComponent:207, encodeURI:208, encodeURIComponent:209, EvalError:210, ReferenceError:211, SyntaxError:212, URIError:213, JSON:214, Math:215, Int8Array:216, PrivateSymbol.Int8Array:217, Int16Array:218, PrivateSymbol.Int16Array:219, Int32Array:220, PrivateSymbol.Int32Array:221, Uint8Array:222, PrivateSymbol.Uint8Array:223, Uint8ClampedArray:224, PrivateSymbol.Uint8ClampedArray:225, Uint16Array:226, PrivateSymbol.Uint16Array:227, Uint32Array:228, PrivateSymbol.Uint32Array:229, Float32Array:230, PrivateSymbol.Float32Array:231, Float64Array:232, PrivateSymbol.Float64Array:233, DataView:234, Date:235, WeakMap:236, WeakSet:237, Intl:120, desc:238}, NonArray, Proto:0x10bbb4000, UncacheableDictionary, Leaf]), StructureID: 474 |
| ----------------------------------------------------------------------------- |
| [ArgumentCount] | 0x7ffeefbfd2f0 | 7 |
| [ReturnVPC] | 0x7ffeefbfd2f0 | 164 (line 57) |
| [Callee] | 0x7ffeefbfd2e8 | 0x10bb68db0 Object: 0x10bb68db0 with butterfly 0x0 (Structure 0x10bbf1c00:[Function, {}, NonArray, Proto:0x10bbd0000, Shady leaf]), StructureID: 65 |
| [CodeBlock] | 0x7ffeefbfd2e0 | 0x10bb2f8e0 __callRandomFunction#DmVXnv:[0x10bb2f8e0->0x10bbfd1e0, LLIntFunctionCall, 253] |
| [ReturnPC] | 0x7ffeefbfd2d8 | 0x10064d14c |
| [CallerFrame] | 0x7ffeefbfd2d0 | 0x7ffeefbfd380 |
| ----------------------------------------------------------------------------- |
| [r -1 CalleeSaveReg] | 0x7ffeefbfd2c8 | 0xffff000000000002 Int32: 2 |
| [r -2 CalleeSaveReg] | 0x7ffeefbfd2c0 | 0xffff000000000000 Int32: 0 |
| [r -3 CalleeSaveReg] | 0x7ffeefbfd2b8 | 0x10baf1608 |
| [r -4 ] | 0x7ffeefbfd2b0 | 0x10bbcc000 Object: 0x10bbcc000 with butterfly 0x0 (Structure 0x10bbf1960:[JSGlobalLexicalEnvironment, {}, NonArray, Leaf]), StructureID: 59 |
| [r -5 ] | 0x7ffeefbfd2a8 | 0x10bbcc000 Object: 0x10bbcc000 with butterfly 0x0 (Structure 0x10bbf1960:[JSGlobalLexicalEnvironment, {}, NonArray, Leaf]), StructureID: 59 |
| [r -6 ] | 0x7ffeefbfd2a0 | 0xa Undefined |
| ----------------------------------------------------------------------------- |
| [r -7] | 0x7ffeefbfd298 | 0x10bb6fdc0 String (atomic) (identifier): length, StructureID: 4 |
| [r -8] | 0x7ffeefbfd290 | 0x10bbb7ec0 Object: 0x10bbb7ec0 with butterfly 0x8000e0008 (Structure 0x10bbf2ae0:[Array, {}, ArrayWithContiguous, Proto:0x10bbc8080]), StructureID: 99 |
| [r -9] | 0x7ffeefbfd288 | 0x10bbc33f0 Object: 0x10bbc33f0 with butterfly 0x8000fdda8 (Structure 0x10bbf1dc0:[Function, {name:100, length:101}, NonArray, Proto:0x10bbd0000, Leaf]), StructureID: 69 |
| [r-10] | 0x7ffeefbfd280 | 0xffff000000000004 Int32: 4 |
| [r-11] | 0x7ffeefbfd278 | 0x10bbb4290 Object: 0x10bbb4290 with butterfly 0x8000e8408 (Structure 0x10bb74850:[DollarVM, {abort:100, crash:101, breakpoint:102, dfgTrue:103, ftlTrue:104, cpuMfence:105, cpuRdtsc:106, cpuCpuid:107, cpuPause:108, cpuClflush:109, llintTrue:110, jitTrue:111, noInline:112, gc:113, edenGC:114, callFrame:115, codeBlockFor:116, codeBlockForFrame:117, dumpSourceFor:118, dumpBytecodeFor:119, dataLog:120, print:121, dumpCallFrame:122, dumpStack:123, dumpRegisters:124, dumpCell:125, indexingMode:126, inlineCapacity:127, value:128, getpid:129, createProxy:130, createRuntimeArray:131, createImpureGetter:132, createCustomGetterObject:133, createDOMJITNodeObject:134, createDOMJITGetterObject:135, createDOMJITGetterComplexObject:136, createDOMJITFunctionObject:137, createDOMJITCheckSubClassObject:138, createDOMJITGetterBaseJSObject:139, createBuiltin:140, getPrivateProperty:141, setImpureGetterDelegate:142, Root:143, Element:144, getElement:145, SimpleObject:146, getHiddenValue:147, setHiddenValue:148, shadowChickenFunctionsOnStack:149, setGlobalConstRedeclarationShouldNotThrow:150, findTypeForExpression:151, returnTypeFor:152, flattenDictionaryObject:153, dumpBasicBlockExecutionRanges:154, hasBasicBlockExecuted:155, basicBlockExecutionCount:156, enableDebuggerModeWhenIdle:158, disableDebuggerModeWhenIdle:159, globalObjectCount:160, globalObjectForObject:161, getGetterSetter:162, loadGetterFromGetterSetter:163, createCustomTestGetterSetter:164, deltaBetweenButterflies:165, totalGCTime:166}, NonArray, Proto:0x10bbb4000, Dictionary, Leaf]), StructureID: 306 |
| [r-12] | 0x7ffeefbfd270 | 0x100000001 |
| [r-13] | 0x7ffeefbfd268 | 0x10bbc33f0 Object: 0x10bbc33f0 with butterfly 0x8000fdda8 (Structure 0x10bbf1dc0:[Function, {name:100, length:101}, NonArray, Proto:0x10bbd0000, Leaf]), StructureID: 69 |
| [r-14] | 0x7ffeefbfd260 | 0x0 |
| [r-15] | 0x7ffeefbfd258 | 0x10064d14c |
| [r-16] | 0x7ffeefbfd250 | 0x7ffeefbfd2d0 |
| [r-17] | 0x7ffeefbfd248 | 0x67ec87ee177 INVALID |
| [r-18] | 0x7ffeefbfd240 | 0x7ffeefbfd250 |
| ----------------------------------------------------------------------------- |
| |
| 3. Removed dumpCallFrame() from the jsc shell. We have the following tools that |
| we can use in its place: |
| |
| $vm.dumpCallFrame() |
| $vm.dumpBytecodeFor() |
| $vm.dumpRegisters() // Just added in this patch. |
| |
| 4. Also fixed a bug in BytecodeDumper: it should only access |
| CallLinkInfo::haveLastSeenCallee() only if CallLinkInfo::isDirect() is false. |
| |
| * bytecode/BytecodeDumper.cpp: |
| (JSC::BytecodeDumper<Block>::printCallOp): |
| * interpreter/Interpreter.cpp: |
| (JSC::Interpreter::dumpCallFrame): Deleted. |
| (JSC::DumpReturnVirtualPCFunctor::DumpReturnVirtualPCFunctor): Deleted. |
| (JSC::DumpReturnVirtualPCFunctor::operator() const): Deleted. |
| (JSC::Interpreter::dumpRegisters): Deleted. |
| * interpreter/Interpreter.h: |
| * jsc.cpp: |
| (GlobalObject::finishCreation): |
| (functionDumpCallFrame): Deleted. |
| * tools/JSDollarVM.cpp: |
| (JSC::functionDumpRegisters): |
| (JSC::JSDollarVM::finishCreation): |
| * tools/VMInspector.cpp: |
| (JSC::VMInspector::dumpRegisters): |
| * tools/VMInspector.h: |
| |
| 2018-08-28 Keith Miller <keith_miller@apple.com> |
| |
| Add nullablity attributes to JSValue |
| https://bugs.webkit.org/show_bug.cgi?id=189047 |
| |
| Reviewed by Dan Bernstein. |
| |
| Switch to using NS_ASSUME_NONNULL_BEGIN/END. |
| |
| * API/JSValue.h: |
| |
| 2018-08-28 Keith Miller <keith_miller@apple.com> |
| |
| Add nullablity attributes to JSValue |
| https://bugs.webkit.org/show_bug.cgi?id=189047 |
| |
| Reviewed by Geoffrey Garen. |
| |
| * API/JSValue.h: |
| |
| 2018-08-27 Yusuke Suzuki <yusukesuzuki@slowstart.org> |
| |
| [WebAssembly] Parse wasm modules in a streaming fashion |
| https://bugs.webkit.org/show_bug.cgi?id=188943 |
| |
| Reviewed by Mark Lam. |
| |
| This patch adds Wasm::StreamingParser, which parses wasm binary in a streaming fashion. |
| Currently, this StreamingParser is not enabled and integrated. In subsequent patches, |
| we start integrating it into BBQPlan and dropping the old ModuleParser. |
| |
| * JavaScriptCore.xcodeproj/project.pbxproj: |
| * Sources.txt: |
| * tools/JSDollarVM.cpp: |
| (WTF::WasmStreamingParser::WasmStreamingParser): |
| (WTF::WasmStreamingParser::create): |
| (WTF::WasmStreamingParser::createStructure): |
| (WTF::WasmStreamingParser::streamingParser): |
| (WTF::WasmStreamingParser::finishCreation): |
| (WTF::functionWasmStreamingParserAddBytes): |
| (WTF::functionWasmStreamingParserFinalize): |
| (JSC::functionCreateWasmStreamingParser): |
| (JSC::JSDollarVM::finishCreation): |
| The $vm Wasm::StreamingParser object is introduced for testing purpose. Added new stress test uses |
| this interface to test streaming parser in the JSC shell. |
| |
| * wasm/WasmBBQPlan.cpp: |
| (JSC::Wasm::BBQPlan::BBQPlan): |
| (JSC::Wasm::BBQPlan::parseAndValidateModule): |
| (JSC::Wasm::BBQPlan::prepare): |
| (JSC::Wasm::BBQPlan::compileFunctions): |
| (JSC::Wasm::BBQPlan::complete): |
| (JSC::Wasm::BBQPlan::work): |
| * wasm/WasmBBQPlan.h: |
| BBQPlan has m_source, but once ModuleInformation is parsed, it is no longer necessary. |
| In subsequent patches, we will remove this, and stream the data into the BBQPlan. |
| |
| * wasm/WasmFormat.h: |
| * wasm/WasmModuleInformation.cpp: |
| (JSC::Wasm::ModuleInformation::ModuleInformation): |
| * wasm/WasmModuleInformation.h: |
| One of the largest change in this patch is that ModuleInformation no longer holds source bytes, |
| since source bytes can be added in a streaming fashion. Instead of holding all the source bytes |
| in ModuleInformation, each function (ModuleInformation::functions, FunctionData) should have |
| Vector<uint8_t> for its data. This data is eventually filled by StreamingParser, and compiling |
| a function with this data can be done concurrently with StreamingParser. |
| |
| (JSC::Wasm::ModuleInformation::create): |
| (JSC::Wasm::ModuleInformation::memoryCount const): |
| (JSC::Wasm::ModuleInformation::tableCount const): |
| memoryCount and tableCount should be recorded in ModuleInformation. |
| |
| * wasm/WasmModuleParser.cpp: |
| (JSC::Wasm::ModuleParser::parse): |
| (JSC::Wasm::makeI32InitExpr): Deleted. |
| (JSC::Wasm::ModuleParser::parseType): Deleted. |
| (JSC::Wasm::ModuleParser::parseImport): Deleted. |
| (JSC::Wasm::ModuleParser::parseFunction): Deleted. |
| (JSC::Wasm::ModuleParser::parseResizableLimits): Deleted. |
| (JSC::Wasm::ModuleParser::parseTableHelper): Deleted. |
| (JSC::Wasm::ModuleParser::parseTable): Deleted. |
| (JSC::Wasm::ModuleParser::parseMemoryHelper): Deleted. |
| (JSC::Wasm::ModuleParser::parseMemory): Deleted. |
| (JSC::Wasm::ModuleParser::parseGlobal): Deleted. |
| (JSC::Wasm::ModuleParser::parseExport): Deleted. |
| (JSC::Wasm::ModuleParser::parseStart): Deleted. |
| (JSC::Wasm::ModuleParser::parseElement): Deleted. |
| (JSC::Wasm::ModuleParser::parseCode): Deleted. |
| (JSC::Wasm::ModuleParser::parseInitExpr): Deleted. |
| (JSC::Wasm::ModuleParser::parseGlobalType): Deleted. |
| (JSC::Wasm::ModuleParser::parseData): Deleted. |
| (JSC::Wasm::ModuleParser::parseCustom): Deleted. |
| Extract section parsing code out from ModuleParser. We create SectionParser and ModuleParser uses it. |
| SectionParser is also used by StreamingParser. |
| |
| * wasm/WasmModuleParser.h: |
| (): Deleted. |
| * wasm/WasmNameSection.h: |
| (JSC::Wasm::NameSection::NameSection): |
| (JSC::Wasm::NameSection::create): |
| (JSC::Wasm::NameSection::setHash): |
| Hash calculation is deferred since all the source is not available in streaming parsing. |
| |
| * wasm/WasmNameSectionParser.cpp: |
| (JSC::Wasm::NameSectionParser::parse): |
| * wasm/WasmNameSectionParser.h: |
| Use Ref<NameSection>. |
| |
| * wasm/WasmOMGPlan.cpp: |
| (JSC::Wasm::OMGPlan::work): |
| Wasm::Plan no longer have m_source since data will be eventually filled in a streaming fashion. |
| OMGPlan can get data of the function by using ModuleInformation::functions. |
| |
| * wasm/WasmParser.h: |
| (JSC::Wasm::Parser::source const): |
| (JSC::Wasm::Parser::length const): |
| (JSC::Wasm::Parser::offset const): |
| (JSC::Wasm::Parser::fail const): |
| (JSC::Wasm::makeI32InitExpr): |
| * wasm/WasmPlan.cpp: |
| (JSC::Wasm::Plan::Plan): |
| Wasm::Plan should not have all the source apriori. Streamed data will be pumped from the provider. |
| |
| * wasm/WasmPlan.h: |
| * wasm/WasmSectionParser.cpp: Copied from Source/JavaScriptCore/wasm/WasmModuleParser.cpp. |
| SectionParser is extracted from ModuleParser. And it is used by both the old (currently working) |
| ModuleParser and the new StreamingParser. |
| |
| (JSC::Wasm::SectionParser::parseType): |
| (JSC::Wasm::SectionParser::parseImport): |
| (JSC::Wasm::SectionParser::parseFunction): |
| (JSC::Wasm::SectionParser::parseResizableLimits): |
| (JSC::Wasm::SectionParser::parseTableHelper): |
| (JSC::Wasm::SectionParser::parseTable): |
| (JSC::Wasm::SectionParser::parseMemoryHelper): |
| (JSC::Wasm::SectionParser::parseMemory): |
| (JSC::Wasm::SectionParser::parseGlobal): |
| (JSC::Wasm::SectionParser::parseExport): |
| (JSC::Wasm::SectionParser::parseStart): |
| (JSC::Wasm::SectionParser::parseElement): |
| (JSC::Wasm::SectionParser::parseCode): |
| (JSC::Wasm::SectionParser::parseInitExpr): |
| (JSC::Wasm::SectionParser::parseGlobalType): |
| (JSC::Wasm::SectionParser::parseData): |
| (JSC::Wasm::SectionParser::parseCustom): |
| * wasm/WasmSectionParser.h: Copied from Source/JavaScriptCore/wasm/WasmModuleParser.h. |
| * wasm/WasmStreamingParser.cpp: Added. |
| (JSC::Wasm::parseUInt7): |
| (JSC::Wasm::StreamingParser::fail): |
| (JSC::Wasm::StreamingParser::StreamingParser): |
| (JSC::Wasm::StreamingParser::parseModuleHeader): |
| (JSC::Wasm::StreamingParser::parseSectionID): |
| (JSC::Wasm::StreamingParser::parseSectionSize): |
| (JSC::Wasm::StreamingParser::parseCodeSectionSize): |
| Code section in Wasm binary is specially handled compared with the other sections since it includes |
| a bunch of functions. StreamingParser extracts each function in a streaming fashion and enable |
| streaming validation / compilation of Wasm functions. |
| |
| (JSC::Wasm::StreamingParser::parseFunctionSize): |
| (JSC::Wasm::StreamingParser::parseFunctionPayload): |
| (JSC::Wasm::StreamingParser::parseSectionPayload): |
| (JSC::Wasm::StreamingParser::consume): |
| (JSC::Wasm::StreamingParser::consumeVarUInt32): |
| (JSC::Wasm::StreamingParser::addBytes): |
| (JSC::Wasm::StreamingParser::failOnState): |
| (JSC::Wasm::StreamingParser::finalize): |
| * wasm/WasmStreamingParser.h: Added. |
| (JSC::Wasm::StreamingParser::addBytes): |
| (JSC::Wasm::StreamingParser::errorMessage const): |
| This is our new StreamingParser implementation. StreamingParser::consumeXXX functions get data, and |
| StreamingParser::parseXXX functions parse consumed data. The user of StreamingParser calls |
| StreamingParser::addBytes() to pump the bytes stream into the parser. And once all the data is pumped, |
| the user calls StreamingParser::finalize. StreamingParser is a state machine which feeds on the |
| incoming byte stream. |
| |
| * wasm/js/JSWebAssemblyModule.cpp: |
| (JSC::JSWebAssemblyModule::source const): Deleted. |
| All the source should not be held. |
| |
| * wasm/js/JSWebAssemblyModule.h: |
| * wasm/js/WebAssemblyPrototype.cpp: |
| (JSC::webAssemblyValidateFunc): |
| |
| 2018-08-27 Mark Lam <mark.lam@apple.com> |
| |
| Fix exception throwing code so that topCallFrame and topEntryFrame stay true to their names. |
| https://bugs.webkit.org/show_bug.cgi?id=188577 |
| <rdar://problem/42985684> |
| |
| Reviewed by Saam Barati. |
| |
| 1. Introduced CallFrame::convertToStackOverflowFrame() which converts the current |
| (top) CallFrame (which may not have a valid callee) into a StackOverflowFrame. |
| |
| The StackOverflowFrame is a sentinel frame that the low level code (exception |
| throwing code, stack visitor, and stack unwinding code) will know to skip |
| over. The StackOverflowFrame will also have a valid JSCallee so that client |
| code can compute the globalObject or VM from this frame. |
| |
| As a result, client code that throws StackOverflowErrors no longer need to |
| compute the caller frame to throw from: it just converts the top frame into |
| a StackOverflowFrame and everything should *Just Work*. |
| |
| 2. NativeCallFrameTracerWithRestore is now obsolete. |
| |
| Instead, client code should always call convertToStackOverflowFrame() on the |
| frame before instantiating a NativeCallFrameTracer with it. |
| |
| This means that topCallFrame will always point to the top CallFrame (which |
| may be a StackOverflowFrame), and topEntryFrame will always point to the top |
| EntryFrame. We'll never temporarily point them to the previous EntryFrame |
| (which we used to do with NativeCallFrameTracerWithRestore). |
| |
| 3. genericUnwind() and Interpreter::unwind() will now always unwind from the top |
| CallFrame, and will know how to handle a StackOverflowFrame if they see one. |
| |
| This obsoletes the UnwindStart flag. |
| |
| * CMakeLists.txt: |
| * JavaScriptCore.xcodeproj/project.pbxproj: |
| * Sources.txt: |
| * debugger/Debugger.cpp: |
| (JSC::Debugger::pauseIfNeeded): |
| * interpreter/CallFrame.cpp: |
| (JSC::CallFrame::callerFrame const): |
| (JSC::CallFrame::unsafeCallerFrame const): |
| (JSC::CallFrame::convertToStackOverflowFrame): |
| (JSC::CallFrame::callerFrame): Deleted. |
| (JSC::CallFrame::unsafeCallerFrame): Deleted. |
| * interpreter/CallFrame.h: |
| (JSC::ExecState::iterate): |
| * interpreter/CallFrameInlines.h: Added. |
| (JSC::CallFrame::isStackOverflowFrame const): |
| (JSC::CallFrame::isWasmFrame const): |
| * interpreter/EntryFrame.h: Added. |
| (JSC::EntryFrame::vmEntryRecordOffset): |
| (JSC::EntryFrame::calleeSaveRegistersBufferOffset): |
| * interpreter/FrameTracers.h: |
| (JSC::NativeCallFrameTracerWithRestore::NativeCallFrameTracerWithRestore): Deleted. |
| (JSC::NativeCallFrameTracerWithRestore::~NativeCallFrameTracerWithRestore): Deleted. |
| * interpreter/Interpreter.cpp: |
| (JSC::Interpreter::unwind): |
| * interpreter/Interpreter.h: |
| * interpreter/StackVisitor.cpp: |
| (JSC::StackVisitor::StackVisitor): |
| * interpreter/StackVisitor.h: |
| (JSC::StackVisitor::visit): |
| (JSC::StackVisitor::topEntryFrameIsEmpty const): |
| * interpreter/VMEntryRecord.h: |
| (JSC::VMEntryRecord::callee const): |
| (JSC::EntryFrame::vmEntryRecordOffset): Deleted. |
| (JSC::EntryFrame::calleeSaveRegistersBufferOffset): Deleted. |
| * jit/AssemblyHelpers.h: |
| * jit/JITExceptions.cpp: |
| (JSC::genericUnwind): |
| * jit/JITExceptions.h: |
| * jit/JITOperations.cpp: |
| * llint/LLIntOffsetsExtractor.cpp: |
| * llint/LLIntSlowPaths.cpp: |
| (JSC::LLInt::LLINT_SLOW_PATH_DECL): |
| * llint/LowLevelInterpreter.asm: |
| * llint/LowLevelInterpreter32_64.asm: |
| * llint/LowLevelInterpreter64.asm: |
| * runtime/CallData.cpp: |
| * runtime/CommonSlowPaths.cpp: |
| (JSC::throwArityCheckStackOverflowError): |
| (JSC::SLOW_PATH_DECL): |
| * runtime/CommonSlowPathsExceptions.cpp: Removed. |
| * runtime/CommonSlowPathsExceptions.h: Removed. |
| * runtime/Completion.cpp: |
| (JSC::evaluateWithScopeExtension): |
| * runtime/JSGeneratorFunction.h: |
| * runtime/JSGlobalObject.cpp: |
| (JSC::JSGlobalObject::init): |
| (JSC::JSGlobalObject::visitChildren): |
| * runtime/JSGlobalObject.h: |
| (JSC::JSGlobalObject::stackOverflowFrameCallee const): |
| * runtime/VM.cpp: |
| (JSC::VM::throwException): |
| * runtime/VM.h: |
| * runtime/VMInlines.h: |
| (JSC::VM::topJSCallFrame const): |
| |
| 2018-08-27 Keith Rollin <krollin@apple.com> |
| |
| Unreviewed build fix -- disable LTO for production builds |
| |
| * Configurations/Base.xcconfig: |
| |
| 2018-08-27 Aditya Keerthi <akeerthi@apple.com> |
| |
| Consolidate ENABLE_INPUT_TYPE_COLOR and ENABLE_INPUT_TYPE_COLOR_POPOVER |
| https://bugs.webkit.org/show_bug.cgi?id=188931 |
| |
| Reviewed by Wenson Hsieh. |
| |
| * Configurations/FeatureDefines.xcconfig: Removed ENABLE_INPUT_TYPE_COLOR_POPOVER. |
| |
| 2018-08-27 Devin Rousso <drousso@apple.com> |
| |
| Web Inspector: provide autocompletion for event breakpoints |
| https://bugs.webkit.org/show_bug.cgi?id=188717 |
| |
| Reviewed by Brian Burg. |
| |
| * inspector/protocol/DOM.json: |
| Add `getSupportedEventNames` command. |
| |
| 2018-08-27 Keith Rollin <krollin@apple.com> |
| |
| Build system support for LTO |
| https://bugs.webkit.org/show_bug.cgi?id=187785 |
| <rdar://problem/42353132> |
| |
| Reviewed by Dan Bernstein. |
| |
| Update Base.xcconfig and DebugRelease.xcconfig to optionally enable |
| LTO. |
| |
| * Configurations/Base.xcconfig: |
| * Configurations/DebugRelease.xcconfig: |
| |
| 2018-08-27 Patrick Griffis <pgriffis@igalia.com> |
| |
| [GTK][JSC] Add warn_unused_result attribute to some APIs |
| https://bugs.webkit.org/show_bug.cgi?id=188983 |
| |
| Reviewed by Michael Catanzaro. |
| |
| * API/glib/JSCValue.h: |
| |
| 2018-08-24 Yusuke Suzuki <yusukesuzuki@slowstart.org> |
| |
| [JSC] Array.prototype.reverse modifies JSImmutableButterfly |
| https://bugs.webkit.org/show_bug.cgi?id=188794 |
| |
| Reviewed by Saam Barati. |
| |
| While Array.prototype.reverse modifies the butterfly of the given Array, |
| it does not account JSImmutableButterfly case. So it accidentally modifies |
| the content of JSImmutableButterfly. |
| This patch converts CoW arrays to writable arrays before reversing. |
| |
| * runtime/ArrayPrototype.cpp: |
| (JSC::arrayProtoFuncReverse): |
| * runtime/JSObject.h: |
| (JSC::JSObject::ensureWritable): |
| |
| 2018-08-24 Michael Saboff <msaboff@apple.com> |
| |
| YARR: Update UCS canonicalization tables for Unicode 11 |
| https://bugs.webkit.org/show_bug.cgi?id=188928 |
| |
| Reviewed by Mark Lam. |
| |
| Generated YarrCanonicalizeUCS2.cpp from YarrCanonicalizeUCS2.js. |
| |
| This passes JavaScriptCore and test262 tests. |
| |
| * yarr/YarrCanonicalizeUCS2.cpp: |
| * yarr/YarrCanonicalizeUCS2.js: |
| (printHeader): |
| |
| 2018-08-24 Michael Saboff <msaboff@apple.com> |
| |
| YARR: JIT RegExps with non-greedy parenthesized sub patterns |
| https://bugs.webkit.org/show_bug.cgi?id=180876 |
| |
| Reviewed by Filip Pizlo. |
| |
| Implemented the non-greedy nested parenthesis based on the prior greedy nested parenthesis work. |
| For the matching code, the greedy path was correct except that we don't try matching for the |
| non-greedy case. Added a jump out to the term after the parenthesis and a label to perform the |
| first / next match when we backtrack. The backtracking code needs to check to see if we have |
| tried the first match or if we can do another match. |
| |
| Updated the disassembly annotations to include parenthesis capturing info, quantifier type and |
| count. Did other minor cleanup as well. |
| |
| Fixed function name typo, added missing 't' in "setUsesPaternContextBuffer()". |
| |
| Updated the text in some comments, both for this change as well as accuracy for existing code. |
| |
| * yarr/YarrJIT.cpp: |
| (JSC::Yarr::YarrGenerator::generate): |
| (JSC::Yarr::YarrGenerator::backtrack): |
| (JSC::Yarr::YarrGenerator::opCompileParenthesesSubpattern): |
| (JSC::Yarr::YarrGenerator::compile): |
| (JSC::Yarr::dumpCompileFailure): |
| (JSC::Yarr::jitCompile): |
| * yarr/YarrJIT.h: |
| (JSC::Yarr::YarrCodeBlock::setUsesPatternContextBuffer): |
| (JSC::Yarr::YarrCodeBlock::setUsesPaternContextBuffer): Deleted. |
| |
| 2018-08-23 Simon Fraser <simon.fraser@apple.com> |
| |
| Add support for dumping GC heap snapshots, and a viewer |
| https://bugs.webkit.org/show_bug.cgi?id=186416 |
| |
| Reviewed by Joseph Pecoraro. |
| |
| Make a way to dump information about the GC heap that is useful for looking for leaked |
| or abandoned objects. This dump is obtained (on Apple platforms) via: |
| notifyutil -p com.apple.WebKit.dumpGCHeap |
| which writes a JSON file to /tmp which can then be loaded into the viewer in Tools/GCHeapInspector. |
| |
| This leverages the heap snapshot used by Web Inspector, adding an alternate format for |
| the snapshot JSON that adds additional data about objects and why they are GC roots. |
| |
| SlotVisitor maintains a RootMarkReason (via SetRootMarkReasonScope) that allows |
| the HeapSnapshotBuilder to keep track of why a JSCell was treated as a GC root. For |
| objects visited via opaque roots, we record the reason why via a new out param to |
| isReachableFromOpaqueRoots(). |
| |
| HeapSnapshotBuilder is enhanced to produce GCDebuggingSnapshot JSON output. This contains |
| additional information including the address of the JSCell* and the wrapped object (for |
| JSDOMWrappers), the root reasons, and for some objects like JSDocument a label which can |
| be the document URL. |
| |
| GCDebuggingSnapshots are always full snapshots (previous snapshots are not kept around). |
| |
| * API/JSAPIWrapperObject.mm: |
| (JSAPIWrapperObjectHandleOwner::isReachableFromOpaqueRoots): |
| * API/JSManagedValue.mm: |
| (JSManagedValueHandleOwner::isReachableFromOpaqueRoots): |
| * API/glib/JSAPIWrapperObjectGLib.cpp: |
| (JSAPIWrapperObjectHandleOwner::isReachableFromOpaqueRoots): |
| * CMakeLists.txt: |
| * heap/ConservativeRoots.h: |
| (JSC::ConservativeRoots::size const): |
| (JSC::ConservativeRoots::size): Deleted. |
| * heap/Heap.cpp: |
| (JSC::Heap::addCoreConstraints): |
| * heap/HeapSnapshotBuilder.cpp: |
| (JSC::HeapSnapshotBuilder::getNextObjectIdentifier): |
| (JSC::HeapSnapshotBuilder::HeapSnapshotBuilder): |
| (JSC::HeapSnapshotBuilder::~HeapSnapshotBuilder): |
| (JSC::HeapSnapshotBuilder::buildSnapshot): |
| (JSC::HeapSnapshotBuilder::appendNode): |
| (JSC::HeapSnapshotBuilder::appendEdge): |
| (JSC::HeapSnapshotBuilder::setOpaqueRootReachabilityReasonForCell): |
| (JSC::HeapSnapshotBuilder::setWrappedObjectForCell): |
| (JSC::HeapSnapshotBuilder::previousSnapshotHasNodeForCell): |
| (JSC::snapshotTypeToString): |
| (JSC::rootTypeToString): |
| (JSC::HeapSnapshotBuilder::setLabelForCell): |
| (JSC::HeapSnapshotBuilder::descriptionForCell const): |
| (JSC::HeapSnapshotBuilder::json): |
| (JSC::HeapSnapshotBuilder::hasExistingNodeForCell): Deleted. |
| * heap/HeapSnapshotBuilder.h: |
| * heap/SlotVisitor.cpp: |
| (JSC::SlotVisitor::appendSlow): |
| * heap/SlotVisitor.h: |
| (JSC::SlotVisitor::heapSnapshotBuilder const): |
| (JSC::SlotVisitor::rootMarkReason const): |
| (JSC::SlotVisitor::setRootMarkReason): |
| (JSC::SetRootMarkReasonScope::SetRootMarkReasonScope): |
| (JSC::SetRootMarkReasonScope::~SetRootMarkReasonScope): |
| * heap/WeakBlock.cpp: |
| (JSC::WeakBlock::specializedVisit): |
| * heap/WeakHandleOwner.cpp: |
| (JSC::WeakHandleOwner::isReachableFromOpaqueRoots): |
| * heap/WeakHandleOwner.h: |
| * runtime/SimpleTypedArrayController.cpp: |
| (JSC::SimpleTypedArrayController::JSArrayBufferOwner::isReachableFromOpaqueRoots): |
| * runtime/SimpleTypedArrayController.h: |
| * tools/JSDollarVM.cpp: |
| |
| 2018-08-23 Saam barati <sbarati@apple.com> |
| |
| JSRunLoopTimer may run part of a member function after it's destroyed |
| https://bugs.webkit.org/show_bug.cgi?id=188426 |
| |
| Reviewed by Mark Lam. |
| |
| When I was reading the JSRunLoopTimer code, I noticed that it is possible |
| to end up running timer code after the class had been destroyed. |
| |
| The issue I spotted was in this function: |
| ``` |
| void JSRunLoopTimer::timerDidFire() |
| { |
| JSLock* apiLock = m_apiLock.get(); |
| if (!apiLock) { |
| // Likely a buggy usage: the timer fired while JSRunLoopTimer was being destroyed. |
| return; |
| } |
| // HERE |
| std::lock_guard<JSLock> lock(*apiLock); |
| RefPtr<VM> vm = apiLock->vm(); |
| if (!vm) { |
| // The VM has been destroyed, so we should just give up. |
| return; |
| } |
| |
| doWork(); |
| } |
| ``` |
| |
| Look at the comment 'HERE'. Let's say that the timer callback thread gets context |
| switched before grabbing the API lock. Then, some other thread destroys the VM. |
| And let's say that the VM owns (perhaps transitively) this timer. Then, the |
| timer would run code and access member variables after it was destroyed. |
| |
| This patch fixes this issue by introducing a new timer manager class. |
| This class manages timers on a per VM basis. When a timer is scheduled, |
| this class refs the timer. It also calls the timer callback while actively |
| maintaining a +1 ref to it. So, it's no longer possible to call the timer |
| callback after the timer has been destroyed. However, calling a timer callback |
| can still race with the VM being destroyed. We continue to detect this case and |
| bail out of the callback early. |
| |
| This patch also removes a lot of duplicate code between GCActivityCallback |
| and JSRunLoopTimer. |
| |
| * heap/EdenGCActivityCallback.cpp: |
| (JSC::EdenGCActivityCallback::doCollection): |
| (JSC::EdenGCActivityCallback::lastGCLength): |
| (JSC::EdenGCActivityCallback::deathRate): |
| * heap/EdenGCActivityCallback.h: |
| * heap/FullGCActivityCallback.cpp: |
| (JSC::FullGCActivityCallback::doCollection): |
| (JSC::FullGCActivityCallback::lastGCLength): |
| (JSC::FullGCActivityCallback::deathRate): |
| * heap/FullGCActivityCallback.h: |
| * heap/GCActivityCallback.cpp: |
| (JSC::GCActivityCallback::doWork): |
| (JSC::GCActivityCallback::scheduleTimer): |
| (JSC::GCActivityCallback::didAllocate): |
| (JSC::GCActivityCallback::willCollect): |
| (JSC::GCActivityCallback::cancel): |
| (JSC::GCActivityCallback::cancelTimer): Deleted. |
| (JSC::GCActivityCallback::nextFireTime): Deleted. |
| * heap/GCActivityCallback.h: |
| * heap/Heap.cpp: |
| (JSC::Heap::reportAbandonedObjectGraph): |
| (JSC::Heap::notifyIncrementalSweeper): |
| (JSC::Heap::updateAllocationLimits): |
| (JSC::Heap::didAllocate): |
| * heap/IncrementalSweeper.cpp: |
| (JSC::IncrementalSweeper::scheduleTimer): |
| (JSC::IncrementalSweeper::doWork): |
| (JSC::IncrementalSweeper::doSweep): |
| (JSC::IncrementalSweeper::sweepNextBlock): |
| (JSC::IncrementalSweeper::startSweeping): |
| (JSC::IncrementalSweeper::stopSweeping): |
| * heap/IncrementalSweeper.h: |
| * heap/StopIfNecessaryTimer.cpp: |
| (JSC::StopIfNecessaryTimer::doWork): |
| (JSC::StopIfNecessaryTimer::scheduleSoon): |
| * heap/StopIfNecessaryTimer.h: |
| * runtime/JSRunLoopTimer.cpp: |
| (JSC::epochTime): |
| (JSC::JSRunLoopTimer::Manager::timerDidFireCallback): |
| (JSC::JSRunLoopTimer::Manager::PerVMData::setRunLoop): |
| (JSC::JSRunLoopTimer::Manager::PerVMData::PerVMData): |
| (JSC::JSRunLoopTimer::Manager::PerVMData::~PerVMData): |
| (JSC::JSRunLoopTimer::Manager::timerDidFire): |
| (JSC::JSRunLoopTimer::Manager::shared): |
| (JSC::JSRunLoopTimer::Manager::registerVM): |
| (JSC::JSRunLoopTimer::Manager::unregisterVM): |
| (JSC::JSRunLoopTimer::Manager::scheduleTimer): |
| (JSC::JSRunLoopTimer::Manager::cancelTimer): |
| (JSC::JSRunLoopTimer::Manager::timeUntilFire): |
| (JSC::JSRunLoopTimer::Manager::didChangeRunLoop): |
| (JSC::JSRunLoopTimer::timerDidFire): |
| (JSC::JSRunLoopTimer::JSRunLoopTimer): |
| (JSC::JSRunLoopTimer::timeUntilFire): |
| (JSC::JSRunLoopTimer::setTimeUntilFire): |
| (JSC::JSRunLoopTimer::cancelTimer): |
| (JSC::JSRunLoopTimer::setRunLoop): Deleted. |
| (JSC::JSRunLoopTimer::timerDidFireCallback): Deleted. |
| (JSC::JSRunLoopTimer::scheduleTimer): Deleted. |
| * runtime/JSRunLoopTimer.h: |
| (JSC::JSRunLoopTimer::Manager::PerVMData::PerVMData): |
| * runtime/PromiseDeferredTimer.cpp: |
| (JSC::PromiseDeferredTimer::doWork): |
| (JSC::PromiseDeferredTimer::runRunLoop): |
| (JSC::PromiseDeferredTimer::addPendingPromise): |
| (JSC::PromiseDeferredTimer::hasPendingPromise): |
| (JSC::PromiseDeferredTimer::hasDependancyInPendingPromise): |
| (JSC::PromiseDeferredTimer::cancelPendingPromise): |
| (JSC::PromiseDeferredTimer::scheduleWorkSoon): |
| * runtime/PromiseDeferredTimer.h: |
| * runtime/VM.cpp: |
| (JSC::VM::VM): |
| (JSC::VM::~VM): |
| (JSC::VM::setRunLoop): |
| (JSC::VM::registerRunLoopTimer): Deleted. |
| (JSC::VM::unregisterRunLoopTimer): Deleted. |
| * runtime/VM.h: |
| (JSC::VM::runLoop const): |
| * wasm/js/WebAssemblyPrototype.cpp: |
| (JSC::webAssemblyModuleValidateAsyncInternal): |
| (JSC::instantiate): |
| (JSC::compileAndInstantiate): |
| (JSC::webAssemblyModuleInstantinateAsyncInternal): |
| (JSC::webAssemblyCompileStreamingInternal): |
| (JSC::webAssemblyInstantiateStreamingInternal): |
| |
| 2018-08-23 Mark Lam <mark.lam@apple.com> |
| |
| Move vmEntryGlobalObject() to VM from CallFrame. |
| https://bugs.webkit.org/show_bug.cgi?id=188900 |
| <rdar://problem/43655753> |
| |
| Reviewed by Michael Saboff. |
| |
| Also introduced CallFrame::isGlobalExec() which makes use of one property of |
| GlobalExecs to identify them i.e. GlobalExecs have null callerFrame and returnPCs. |
| CallFrame::initGlobalExec() ensures this. |
| |
| In contrast, normal CallFrames always have a callerFrame (because they must at |
| least be preceded by a VM EntryFrame) and a returnPC (at least return to the |
| VM entry glue). |
| |
| * API/APIUtils.h: |
| (handleExceptionIfNeeded): |
| (setException): |
| * API/JSBase.cpp: |
| (JSEvaluateScript): |
| (JSCheckScriptSyntax): |
| * API/JSContextRef.cpp: |
| (JSGlobalContextRetain): |
| (JSGlobalContextRelease): |
| (JSGlobalContextCopyName): |
| (JSGlobalContextSetName): |
| (JSGlobalContextGetRemoteInspectionEnabled): |
| (JSGlobalContextSetRemoteInspectionEnabled): |
| (JSGlobalContextGetIncludesNativeCallStackWhenReportingExceptions): |
| (JSGlobalContextSetIncludesNativeCallStackWhenReportingExceptions): |
| (JSGlobalContextGetDebuggerRunLoop): |
| (JSGlobalContextSetDebuggerRunLoop): |
| (JSGlobalContextGetAugmentableInspectorController): |
| * API/JSValue.mm: |
| (reportExceptionToInspector): |
| * API/glib/JSCClass.cpp: |
| (jscContextForObject): |
| * API/glib/JSCContext.cpp: |
| (jsc_context_evaluate_in_object): |
| * debugger/Debugger.cpp: |
| (JSC::Debugger::pauseIfNeeded): |
| * debugger/DebuggerCallFrame.cpp: |
| (JSC::DebuggerCallFrame::vmEntryGlobalObject const): |
| (JSC::DebuggerCallFrame::evaluateWithScopeExtension): |
| * interpreter/CallFrame.cpp: |
| (JSC::CallFrame::vmEntryGlobalObject): Deleted. |
| * interpreter/CallFrame.h: |
| (JSC::ExecState::scope const): |
| (JSC::ExecState::noCaller): |
| (JSC::ExecState::isGlobalExec const): |
| * interpreter/Interpreter.cpp: |
| (JSC::notifyDebuggerOfUnwinding): |
| (JSC::Interpreter::notifyDebuggerOfExceptionToBeThrown): |
| (JSC::Interpreter::debug): |
| * runtime/CallData.cpp: |
| (JSC::profiledCall): |
| * runtime/Completion.cpp: |
| (JSC::evaluate): |
| (JSC::profiledEvaluate): |
| (JSC::evaluateWithScopeExtension): |
| (JSC::loadAndEvaluateModule): |
| (JSC::loadModule): |
| (JSC::linkAndEvaluateModule): |
| (JSC::importModule): |
| * runtime/ConstructData.cpp: |
| (JSC::profiledConstruct): |
| * runtime/Error.cpp: |
| (JSC::getStackTrace): |
| * runtime/VM.cpp: |
| (JSC::VM::throwException): |
| (JSC::VM::vmEntryGlobalObject const): |
| * runtime/VM.h: |
| |
| 2018-08-23 Andy Estes <aestes@apple.com> |
| |
| [Apple Pay] Introduce Apple Pay JS v4 on iOS 12 and macOS Mojave |
| https://bugs.webkit.org/show_bug.cgi?id=188829 |
| |
| Reviewed by Tim Horton. |
| |
| * Configurations/FeatureDefines.xcconfig: |
| |
| 2018-08-23 Devin Rousso <drousso@apple.com> |
| |
| Web Inspector: support breakpoints for timers and animation-frame events |
| https://bugs.webkit.org/show_bug.cgi?id=188778 |
| |
| Reviewed by Brian Burg. |
| |
| * inspector/protocol/Debugger.json: |
| Add `AnimationFrame` and `Timer` types to the list of pause reasons. |
| |
| * inspector/protocol/DOMDebugger.json: |
| Introduced `setEventBreakpoint` and `removeEventBreakpoint` to replace the more specific: |
| - `setEventListenerBreakpoint` |
| - `removeEventListenerBreakpoint` |
| - `setInstrumentationBreakpoint` |
| - `removeInstrumentationBreakpoint` |
| Also created an `EventBreakpointType` to enumerate the available types of event breakpoints. |
| |
| * inspector/scripts/codegen/generate_cpp_protocol_types_header.py: |
| (CppProtocolTypesHeaderGenerator.generate_output): |
| (CppProtocolTypesHeaderGenerator._generate_forward_declarations_for_binding_traits): |
| (CppProtocolTypesHeaderGenerator._generate_declarations_for_enum_conversion_methods): |
| (CppProtocolTypesHeaderGenerator._generate_hash_declarations): Added. |
| Generate `DefaultHash` for all `enum class` used by inspector protocols. |
| |
| * inspector/scripts/tests/generic/expected/commands-with-async-attribute.json-result: |
| * inspector/scripts/tests/generic/expected/commands-with-optional-call-return-parameters.json-result: |
| * inspector/scripts/tests/generic/expected/enum-values.json-result: |
| * inspector/scripts/tests/generic/expected/type-declaration-array-type.json-result: |
| * inspector/scripts/tests/generic/expected/type-declaration-enum-type.json-result: |
| * inspector/scripts/tests/generic/expected/type-declaration-object-type.json-result: |
| * inspector/scripts/tests/generic/expected/type-requiring-runtime-casts.json-result: |
| |
| 2018-08-23 Michael Saboff <msaboff@apple.com> |
| |
| YARR: Need to JIT compile a RegExp before using containsNestedSubpatterns flag |
| https://bugs.webkit.org/show_bug.cgi?id=188895 |
| |
| Reviewed by Mark Lam. |
| |
| Found while working on another change. This will allow processing of nested |
| parenthesis that require saved ParenContext structures. |
| |
| * yarr/YarrJIT.cpp: |
| (JSC::Yarr::YarrGenerator::compile): |
| |
| 2018-08-22 Michael Saboff <msaboff@apple.com> |
| |
| https://bugs.webkit.org/show_bug.cgi?id=188859 |
| Eliminate dead code operationThrowDivideError() and operationThrowOutOfBoundsAccessError() |
| |
| Rubber-stamped by Saam Barati. |
| |
| Deleted these two functions. |
| |
| * jit/JITOperations.cpp: |
| * jit/JITOperations.h: |
| |
| 2018-08-22 Mark Lam <mark.lam@apple.com> |
| |
| The DFG CFGSimplification phase shouldn’t jettison a block when it’s the target of both branch directions. |
| https://bugs.webkit.org/show_bug.cgi?id=188298 |
| <rdar://problem/42888427> |
| |
| Reviewed by Saam Barati. |
| |
| In the event that both targets of a Branch is the same block, then even if we'll |
| always take one path of the branch, the other target is not unreachable because |
| it is the same target as the one in the taken path. Hence, it should not be |
| jettisoned. |
| |
| * JavaScriptCore.xcodeproj/project.pbxproj: |
| - Added DFGCFG.h which is in use and should have been added to the project. |
| * dfg/DFGCFGSimplificationPhase.cpp: |
| (JSC::DFG::CFGSimplificationPhase::run): |
| |
| 2018-08-20 Yusuke Suzuki <yusukesuzuki@slowstart.org> |
| |
| [JSC] HeapUtil should care about pointer overflow |
| https://bugs.webkit.org/show_bug.cgi?id=188740 |
| |
| Reviewed by Saam Barati. |
| |
| `pointer - sizeof(IndexingHeader) - 1` causes an undefined behavior if a pointer overflows. |
| For example, if `pointer` is nullptr, it causes pointer overflow. Instead of calculating this |
| with `char*` pointer, we cast it to `uintptr_t` temporarily. This issue is found by UBSan. |
| |
| * heap/HeapUtil.h: |
| (JSC::HeapUtil::findGCObjectPointersForMarking): |
| |
| 2018-08-19 Yusuke Suzuki <yusukesuzuki@slowstart.org> |
| |
| [JSC] Should not rotate constant with 64 |
| https://bugs.webkit.org/show_bug.cgi?id=188556 |
| |
| Reviewed by Saam Barati. |
| |
| To defend against JIT splaying, we rotate a constant with a randomly generated seed. |
| But if a seed becomes 64 or 0, the following code performs `value << 64` or `value >> 64` |
| where value's type is uint64_t, and they cause undefined behaviors (UBs). This patch limits |
| the seed in the range of [1, 63] not to generate code causing UBs. This is found by UBSan. |
| |
| * assembler/MacroAssembler.h: |
| (JSC::MacroAssembler::generateRotationSeed): |
| (JSC::MacroAssembler::rotationBlindConstant): |
| |
| 2018-08-21 Commit Queue <commit-queue@webkit.org> |
| |
| Unreviewed, rolling out r235107. |
| https://bugs.webkit.org/show_bug.cgi?id=188832 |
| |
| "It revealed bugs in Blob code as well as regressed JS |
| performance tests" (Requested by saamyjoon on #webkit). |
| |
| Reverted changeset: |
| |
| "JSRunLoopTimer may run part of a member function after it's |
| destroyed" |
| https://bugs.webkit.org/show_bug.cgi?id=188426 |
| https://trac.webkit.org/changeset/235107 |
| |
| 2018-08-21 Saam barati <sbarati@apple.com> |
| |
| JSRunLoopTimer may run part of a member function after it's destroyed |
| https://bugs.webkit.org/show_bug.cgi?id=188426 |
| |
| Reviewed by Mark Lam. |
| |
| When I was reading the JSRunLoopTimer code, I noticed that it is possible |
| to end up running timer code after the class had been destroyed. |
| |
| The issue I spotted was in this function: |
| ``` |
| void JSRunLoopTimer::timerDidFire() |
| { |
| JSLock* apiLock = m_apiLock.get(); |
| if (!apiLock) { |
| // Likely a buggy usage: the timer fired while JSRunLoopTimer was being destroyed. |
| return; |
| } |
| // HERE |
| std::lock_guard<JSLock> lock(*apiLock); |
| RefPtr<VM> vm = apiLock->vm(); |
| if (!vm) { |
| // The VM has been destroyed, so we should just give up. |
| return; |
| } |
| |
| doWork(); |
| } |
| ``` |
| |
| Look at the comment 'HERE'. Let's say that the timer callback thread gets context |
| switched before grabbing the API lock. Then, some other thread destroys the VM. |
| And let's say that the VM owns (perhaps transitively) this timer. Then, the |
| timer would run code and access member variables after it was destroyed. |
| |
| This patch fixes this issue by introducing a new timer manager class. |
| This class manages timers on a per VM basis. When a timer is scheduled, |
| this class refs the timer. It also calls the timer callback while actively |
| maintaining a +1 ref to it. So, it's no longer possible to call the timer |
| callback after the timer has been destroyed. However, calling a timer callback |
| can still race with the VM being destroyed. We continue to detect this case and |
| bail out of the callback early. |
| |
| This patch also removes a lot of duplicate code between GCActivityCallback |
| and JSRunLoopTimer. |
| |
| * heap/EdenGCActivityCallback.cpp: |
| (JSC::EdenGCActivityCallback::doCollection): |
| (JSC::EdenGCActivityCallback::lastGCLength): |
| (JSC::EdenGCActivityCallback::deathRate): |
| * heap/EdenGCActivityCallback.h: |
| * heap/FullGCActivityCallback.cpp: |
| (JSC::FullGCActivityCallback::doCollection): |
| (JSC::FullGCActivityCallback::lastGCLength): |
| (JSC::FullGCActivityCallback::deathRate): |
| * heap/FullGCActivityCallback.h: |
| * heap/GCActivityCallback.cpp: |
| (JSC::GCActivityCallback::doWork): |
| (JSC::GCActivityCallback::scheduleTimer): |
| (JSC::GCActivityCallback::didAllocate): |
| (JSC::GCActivityCallback::willCollect): |
| (JSC::GCActivityCallback::cancel): |
| (JSC::GCActivityCallback::cancelTimer): Deleted. |
| (JSC::GCActivityCallback::nextFireTime): Deleted. |
| * heap/GCActivityCallback.h: |
| * heap/Heap.cpp: |
| (JSC::Heap::reportAbandonedObjectGraph): |
| (JSC::Heap::notifyIncrementalSweeper): |
| (JSC::Heap::updateAllocationLimits): |
| (JSC::Heap::didAllocate): |
| * heap/IncrementalSweeper.cpp: |
| (JSC::IncrementalSweeper::scheduleTimer): |
| (JSC::IncrementalSweeper::doWork): |
| (JSC::IncrementalSweeper::doSweep): |
| (JSC::IncrementalSweeper::sweepNextBlock): |
| (JSC::IncrementalSweeper::startSweeping): |
| (JSC::IncrementalSweeper::stopSweeping): |
| * heap/IncrementalSweeper.h: |
| * heap/StopIfNecessaryTimer.cpp: |
| (JSC::StopIfNecessaryTimer::doWork): |
| (JSC::StopIfNecessaryTimer::scheduleSoon): |
| * heap/StopIfNecessaryTimer.h: |
| * runtime/JSRunLoopTimer.cpp: |
| (JSC::epochTime): |
| (JSC::JSRunLoopTimer::Manager::timerDidFireCallback): |
| (JSC::JSRunLoopTimer::Manager::PerVMData::setRunLoop): |
| (JSC::JSRunLoopTimer::Manager::PerVMData::PerVMData): |
| (JSC::JSRunLoopTimer::Manager::PerVMData::~PerVMData): |
| (JSC::JSRunLoopTimer::Manager::timerDidFire): |
| (JSC::JSRunLoopTimer::Manager::shared): |
| (JSC::JSRunLoopTimer::Manager::registerVM): |
| (JSC::JSRunLoopTimer::Manager::unregisterVM): |
| (JSC::JSRunLoopTimer::Manager::scheduleTimer): |
| (JSC::JSRunLoopTimer::Manager::cancelTimer): |
| (JSC::JSRunLoopTimer::Manager::timeUntilFire): |
| (JSC::JSRunLoopTimer::Manager::didChangeRunLoop): |
| (JSC::JSRunLoopTimer::timerDidFire): |
| (JSC::JSRunLoopTimer::JSRunLoopTimer): |
| (JSC::JSRunLoopTimer::timeUntilFire): |
| (JSC::JSRunLoopTimer::setTimeUntilFire): |
| (JSC::JSRunLoopTimer::cancelTimer): |
| (JSC::JSRunLoopTimer::setRunLoop): Deleted. |
| (JSC::JSRunLoopTimer::timerDidFireCallback): Deleted. |
| (JSC::JSRunLoopTimer::scheduleTimer): Deleted. |
| * runtime/JSRunLoopTimer.h: |
| (JSC::JSRunLoopTimer::Manager::PerVMData::PerVMData): |
| * runtime/PromiseDeferredTimer.cpp: |
| (JSC::PromiseDeferredTimer::doWork): |
| (JSC::PromiseDeferredTimer::runRunLoop): |
| (JSC::PromiseDeferredTimer::addPendingPromise): |
| (JSC::PromiseDeferredTimer::hasPendingPromise): |
| (JSC::PromiseDeferredTimer::hasDependancyInPendingPromise): |
| (JSC::PromiseDeferredTimer::cancelPendingPromise): |
| (JSC::PromiseDeferredTimer::scheduleWorkSoon): |
| * runtime/PromiseDeferredTimer.h: |
| * runtime/VM.cpp: |
| (JSC::VM::VM): |
| (JSC::VM::~VM): |
| (JSC::VM::setRunLoop): |
| (JSC::VM::registerRunLoopTimer): Deleted. |
| (JSC::VM::unregisterRunLoopTimer): Deleted. |
| * runtime/VM.h: |
| (JSC::VM::runLoop const): |
| * wasm/js/WebAssemblyPrototype.cpp: |
| (JSC::webAssemblyModuleValidateAsyncInternal): |
| (JSC::instantiate): |
| (JSC::compileAndInstantiate): |
| (JSC::webAssemblyModuleInstantinateAsyncInternal): |
| (JSC::webAssemblyCompileStreamingInternal): |
| (JSC::webAssemblyInstantiateStreamingInternal): |
| |
| 2018-08-20 Saam barati <sbarati@apple.com> |
| |
| Inline DataView accesses into DFG/FTL |
| https://bugs.webkit.org/show_bug.cgi?id=188573 |
| <rdar://problem/43286746> |
| |
| Reviewed by Michael Saboff. |
| |
| This patch teaches the DFG/FTL to inline DataView accesses. The approach is |
| straight forward. We inline the various get*/set* operations as intrinsics. |
| |
| This patch takes the most obvious approach for now. We OSR exit when: |
| - An isLittleEndian argument is provided, and is not a boolean. |
| - The index isn't an integer. |
| - The |this| isn't a DataView. |
| - We do an OOB access (or see a neutered array) |
| |
| To implement this change in a performant way, this patch teaches the macro |
| assembler how to emit byte swap operations. The semantics of the added functions |
| are byteSwap + zero extend. This means for the 16bit byte swaps, we need |
| to actually emit zero extend instructions. For the 32/64bit byte swaps, |
| the instructions already have these semantics. |
| |
| This patch is just a lightweight initial implementation. There are some easy |
| extensions we can do in future changes: |
| - Teach B3 how to byte swap: https://bugs.webkit.org/show_bug.cgi?id=188759 |
| - CSE DataViewGet* nodes: https://bugs.webkit.org/show_bug.cgi?id=188768 |
| |
| * assembler/MacroAssemblerARM64.h: |
| (JSC::MacroAssemblerARM64::byteSwap16): |
| (JSC::MacroAssemblerARM64::byteSwap32): |
| (JSC::MacroAssemblerARM64::byteSwap64): |
| * assembler/MacroAssemblerX86Common.h: |
| (JSC::MacroAssemblerX86Common::byteSwap32): |
| (JSC::MacroAssemblerX86Common::byteSwap16): |
| (JSC::MacroAssemblerX86Common::byteSwap64): |
| * assembler/X86Assembler.h: |
| (JSC::X86Assembler::bswapl_r): |
| (JSC::X86Assembler::bswapq_r): |
| (JSC::X86Assembler::shiftInstruction16): |
| (JSC::X86Assembler::rolw_i8r): |
| (JSC::X86Assembler::X86InstructionFormatter::SingleInstructionBufferWriter::memoryModRM): |
| * assembler/testmasm.cpp: |
| (JSC::testByteSwap): |
| (JSC::run): |
| * bytecode/DataFormat.h: |
| * bytecode/SpeculatedType.cpp: |
| (JSC::dumpSpeculation): |
| (JSC::speculationFromClassInfo): |
| (JSC::speculationFromJSType): |
| (JSC::speculationFromString): |
| * bytecode/SpeculatedType.h: |
| * dfg/DFGAbstractInterpreterInlines.h: |
| (JSC::DFG::AbstractInterpreter<AbstractStateType>::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::dataViewData): |
| * dfg/DFGNodeType.h: |
| * dfg/DFGPredictionPropagationPhase.cpp: |
| * dfg/DFGSafeToExecute.h: |
| (JSC::DFG::SafeToExecuteEdge::operator()): |
| (JSC::DFG::safeToExecute): |
| * dfg/DFGSpeculativeJIT.cpp: |
| (JSC::DFG::SpeculativeJIT::speculateDataViewObject): |
| (JSC::DFG::SpeculativeJIT::speculate): |
| * dfg/DFGSpeculativeJIT.h: |
| * dfg/DFGSpeculativeJIT32_64.cpp: |
| (JSC::DFG::SpeculativeJIT::compile): |
| * dfg/DFGSpeculativeJIT64.cpp: |
| (JSC::DFG::SpeculativeJIT::compile): |
| * dfg/DFGUseKind.cpp: |
| (WTF::printInternal): |
| * dfg/DFGUseKind.h: |
| (JSC::DFG::typeFilterFor): |
| (JSC::DFG::isCell): |
| * ftl/FTLCapabilities.cpp: |
| (JSC::FTL::canCompile): |
| * ftl/FTLLowerDFGToB3.cpp: |
| (JSC::FTL::DFG::LowerDFGToB3::compileNode): |
| (JSC::FTL::DFG::LowerDFGToB3::byteSwap32): |
| (JSC::FTL::DFG::LowerDFGToB3::byteSwap64): |
| (JSC::FTL::DFG::LowerDFGToB3::emitCodeBasedOnEndiannessBranch): |
| (JSC::FTL::DFG::LowerDFGToB3::compileDataViewGet): |
| (JSC::FTL::DFG::LowerDFGToB3::compileDataViewSet): |
| (JSC::FTL::DFG::LowerDFGToB3::lowDataViewObject): |
| (JSC::FTL::DFG::LowerDFGToB3::speculate): |
| (JSC::FTL::DFG::LowerDFGToB3::speculateDataViewObject): |
| * runtime/Intrinsic.cpp: |
| (JSC::intrinsicName): |
| * runtime/Intrinsic.h: |
| * runtime/JSDataViewPrototype.cpp: |
| |
| 2018-08-20 Yusuke Suzuki <utatane.tea@gmail.com> |
| |
| [YARR] Extend size of fixed characters bulk matching in 64bit platform |
| https://bugs.webkit.org/show_bug.cgi?id=181989 |
| |
| Reviewed by Michael Saboff. |
| |
| This patch extends bulk matching style for fixed-sized characters. |
| In 64bit environment, the GPR can hold up to 8 characters. This change |
| reduces the code size since we can fuse multiple `mov` operations into one. |
| |
| * assembler/LinkBuffer.h: |
| * runtime/Options.h: |
| * yarr/YarrJIT.cpp: |
| (JSC::Yarr::YarrGenerator::generatePatternCharacterOnce): |
| (JSC::Yarr::YarrGenerator::compile): |
| |
| 2018-08-20 Devin Rousso <drousso@apple.com> |
| |
| Web Inspector: allow breakpoints to be set for specific event listeners |
| https://bugs.webkit.org/show_bug.cgi?id=183138 |
| |
| Reviewed by Joseph Pecoraro. |
| |
| * inspector/protocol/DOM.json: |
| Add `setBreakpointForEventListener` and `removeBreakpointForEventListener`, each of which |
| takes an `eventListenerId` and toggles whether that specific usage of that event listener |
| should have a breakpoint and pause before running. |
| |
| 2018-08-20 Mark Lam <mark.lam@apple.com> |
| |
| Fix the LLInt so that btjs shows vmEntryToJavaScript instead of llintPCRangeStart for the entry frame. |
| https://bugs.webkit.org/show_bug.cgi?id=188769 |
| |
| Reviewed by Michael Saboff. |
| |
| * llint/LowLevelInterpreter.asm: |
| - Just put an unused instruction between llintPCRangeStart and vmEntryToJavaScript |
| so that libunwind doesn't get confused by the 2 labels pointing to the same |
| code address. |
| |
| 2018-08-19 Carlos Garcia Campos <cgarcia@igalia.com> |
| |
| [GLIB] Add API to throw exceptions using printf formatted strings |
| https://bugs.webkit.org/show_bug.cgi?id=188698 |
| |
| Reviewed by Michael Catanzaro. |
| |
| Add jsc_context_throw_printf() and jsc_context_throw_with_name_printf(). Also add new public constructors of |
| JSCException using printf formatted string. |
| |
| * API/glib/JSCContext.cpp: |
| (jsc_context_throw_printf): |
| (jsc_context_throw_with_name_printf): |
| * API/glib/JSCContext.h: |
| * API/glib/JSCException.cpp: |
| (jsc_exception_new_printf): |
| (jsc_exception_new_vprintf): |
| (jsc_exception_new_with_name_printf): |
| (jsc_exception_new_with_name_vprintf): |
| * API/glib/JSCException.h: |
| * API/glib/docs/jsc-glib-4.0-sections.txt: |
| |
| 2018-08-19 Carlos Garcia Campos <cgarcia@igalia.com> |
| |
| [GLIB] Complete the JSCException API |
| https://bugs.webkit.org/show_bug.cgi?id=188695 |
| |
| Reviewed by Michael Catanzaro. |
| |
| Add more API to JSCException: |
| - New function to get the column number |
| - New function get exception as string (toString()) |
| - Add the possibility to create exceptions with a custom error name. |
| - New function to get the exception error name |
| - New function to get the exception backtrace. |
| - New convenience function to report a exception by returning a formatted string with all the exception |
| details, to be shown as a user error message. |
| |
| * API/glib/JSCContext.cpp: |
| (jsc_context_throw_with_name): |
| * API/glib/JSCContext.h: |
| * API/glib/JSCException.cpp: |
| (jscExceptionEnsureProperties): |
| (jsc_exception_new): |
| (jsc_exception_new_with_name): |
| (jsc_exception_get_name): |
| (jsc_exception_get_column_number): |
| (jsc_exception_get_back_trace_string): |
| (jsc_exception_to_string): |
| (jsc_exception_report): |
| * API/glib/JSCException.h: |
| * API/glib/docs/jsc-glib-4.0-sections.txt: |
| |
| 2018-08-19 Commit Queue <commit-queue@webkit.org> |
| |
| Unreviewed, rolling out r234852. |
| https://bugs.webkit.org/show_bug.cgi?id=188736 |
| |
| Workaround is not correct (Requested by yusukesuzuki on |
| #webkit). |
| |
| Reverted changeset: |
| |
| "[JSC] Should not rotate constant with 64" |
| https://bugs.webkit.org/show_bug.cgi?id=188556 |
| https://trac.webkit.org/changeset/234852 |
| |
| 2018-08-19 Yusuke Suzuki <yusukesuzuki@slowstart.org> |
| |
| [WTF] Add WTF::unalignedLoad and WTF::unalignedStore |
| https://bugs.webkit.org/show_bug.cgi?id=188716 |
| |
| Reviewed by Darin Adler. |
| |
| Use WTF::unalignedLoad and WTF::unalignedStore to avoid undefined behavior. |
| The compiler can emit appropriate mov operations in x86 even if we use these |
| helper functions. |
| |
| * assembler/AssemblerBuffer.h: |
| (JSC::AssemblerBuffer::LocalWriter::putIntegralUnchecked): |
| (JSC::AssemblerBuffer::putIntegral): |
| (JSC::AssemblerBuffer::putIntegralUnchecked): |
| * assembler/MacroAssemblerX86.h: |
| (JSC::MacroAssemblerX86::readCallTarget): |
| * assembler/X86Assembler.h: |
| (JSC::X86Assembler::linkJump): |
| (JSC::X86Assembler::readPointer): |
| (JSC::X86Assembler::replaceWithHlt): |
| (JSC::X86Assembler::replaceWithJump): |
| (JSC::X86Assembler::setPointer): |
| (JSC::X86Assembler::setInt32): |
| (JSC::X86Assembler::setInt8): |
| * interpreter/InterpreterInlines.h: |
| (JSC::Interpreter::getOpcodeID): Embedded opcode may be misaligned. Actually UBSan detects misaligned accesses here. |
| |
| 2018-08-17 Saam barati <sbarati@apple.com> |
| |
| intersectionOfPastValuesAtHead must filter values after they've observed an invalidation point |
| https://bugs.webkit.org/show_bug.cgi?id=188707 |
| <rdar://problem/43015442> |
| |
| Reviewed by Mark Lam. |
| |
| We use the values in intersectionOfPastValuesAtHead to verify that it is safe to |
| OSR enter at the head of a block. We verify it's safe to OSR enter by checking |
| that each incoming value is compatible with its corresponding AbstractValue. |
| |
| The bug is that we were sometimes filtering the intersectionOfPastValuesAtHead |
| with abstract values that were clobbererd. This meant that the value we're |
| verifying with at OSR entry effectively has an infinite structure set because |
| it's clobbered. So, imagine we have code like this: |
| ``` |
| ---> We OSR enter here, and we're clobbered here |
| InvalidationPoint |
| GetByOffset(@base) |
| ``` |
| |
| The abstract value for @base inside intersectionOfPastValuesAtHead has a |
| clobberred structure set, so we'd allow an incoming object with any |
| structure. However, this is wrong because the invalidation point is no |
| longer fulfilling its promise that it filters the structure that @base has. |
| |
| We fix this by filtering the AbstractValues in intersectionOfPastValuesAtHead |
| as if the incoming value may be live past an InvalidationPoint. |
| This places a stricter requirement that to safely OSR enter at any basic |
| block, all incoming values must be compatible as if they lived past |
| the execution of an invalidation point. |
| |
| * dfg/DFGCFAPhase.cpp: |
| (JSC::DFG::CFAPhase::run): |
| |
| 2018-08-17 Yusuke Suzuki <yusukesuzuki@slowstart.org> and Fujii Hironori <Hironori.Fujii@sony.com> |
| |
| [JSC] Add GPRReg::InvalidGPRReg and FPRReg::InvalidFPRReg |
| https://bugs.webkit.org/show_bug.cgi?id=188589 |
| |
| Reviewed by Mark Lam. |
| And reviewed by Yusuke Suzuki for Hironori's change. |
| |
| Since GPRReg(RegisterID) and FPRReg(FPRegisterID) do not include -1 in their enum values, |
| UBSan dumps bunch of warnings "runtime error: load of value 4294967295, which is not a valid value for type 'RegisterID'". |
| |
| - We add InvalidGPRReg and InvalidFPRReg to enum values of GPRReg and FPRReg to suppress the above warnings. |
| - We make GPRReg and FPRReg int8_t enums. |
| - We replace `#define InvalidGPRReg ((JSC::GPRReg)-1)` to `static constexpr GPRReg InvalidGPRReg { GPRReg::InvalidGPRReg };`. |
| - We add operator+/- definition for RegisterIDs as a MSVC workaround. MSVC fails to resolve operator+ and operator- |
| if `enum : int8_t` is used instead of `enum`. |
| |
| * assembler/ARM64Assembler.h: |
| * assembler/ARMAssembler.h: |
| * assembler/ARMv7Assembler.h: |
| * assembler/MIPSAssembler.h: |
| * assembler/MacroAssembler.h: |
| * assembler/X86Assembler.h: |
| * jit/CCallHelpers.h: |
| (JSC::CCallHelpers::clampArrayToSize): |
| * jit/FPRInfo.h: |
| * jit/GPRInfo.h: |
| (JSC::JSValueRegs::JSValueRegs): |
| (JSC::JSValueRegs::tagGPR const): |
| (JSC::JSValueRegs::payloadGPR const): |
| (JSC::JSValueSource::JSValueSource): |
| (JSC::JSValueSource::unboxedCell): |
| (JSC::JSValueSource::operator bool const): |
| (JSC::JSValueSource::base const): |
| (JSC::JSValueSource::tagGPR const): |
| (JSC::JSValueSource::payloadGPR const): |
| (JSC::JSValueSource::hasKnownTag const): |
| |
| 2018-08-16 Yusuke Suzuki <yusukesuzuki@slowstart.org> |
| |
| [JSC] alignas for RegisterState should respect alignof(RegisterState) too |
| https://bugs.webkit.org/show_bug.cgi?id=188686 |
| |
| Reviewed by Saam Barati. |
| |
| RegisterState would have larger alignment than `alignof(void*)`. We use the larger alignment value |
| for `alignof` for RegisterState. |
| |
| * heap/RegisterState.h: |
| |
| 2018-08-14 Yusuke Suzuki <yusukesuzuki@slowstart.org> |
| |
| [YARR] Align allocation size in BumpPointerAllocator with sizeof(void*) |
| https://bugs.webkit.org/show_bug.cgi?id=188571 |
| |
| Reviewed by Saam Barati. |
| |
| UBSan finds YarrInterpreter performs misaligned accesses. This is because YarrInterpreter |
| allocates DisjunctionContext and ParenthesesDisjunctionContext from BumpPointerAllocator |
| without considering alignment of them. This patch adds DisjunctionContext::allocationSize |
| and ParenthesesDisjunctionContext::allocationSize to calculate allocation sizes for them. |
| The size is always rounded to `sizeof(void*)` so that these classes are always allocated |
| with `sizeof(void*)` alignment. We also ensure the alignments of both classes are less |
| than or equal to `sizeof(void*)` by `static_assert`. |
| |
| * yarr/YarrInterpreter.cpp: |
| (JSC::Yarr::Interpreter::DisjunctionContext::allocationSize): |
| (JSC::Yarr::Interpreter::allocDisjunctionContext): |
| (JSC::Yarr::Interpreter::ParenthesesDisjunctionContext::ParenthesesDisjunctionContext): |
| (JSC::Yarr::Interpreter::ParenthesesDisjunctionContext::getDisjunctionContext): |
| (JSC::Yarr::Interpreter::ParenthesesDisjunctionContext::allocationSize): |
| (JSC::Yarr::Interpreter::allocParenthesesDisjunctionContext): |
| (JSC::Yarr::Interpreter::Interpreter): |
| (JSC::Yarr::Interpreter::DisjunctionContext::DisjunctionContext): Deleted. |
| |
| 2018-08-15 Keith Miller <keith_miller@apple.com> |
| |
| Remove evernote hacks |
| https://bugs.webkit.org/show_bug.cgi?id=188591 |
| |
| Reviewed by Joseph Pecoraro. |
| |
| The hack was added in 2012 and the evernote app seems to work now. |
| It's probably not needed anymore. |
| |
| * API/JSValueRef.cpp: |
| (JSValueUnprotect): |
| (evernoteHackNeeded): Deleted. |
| |
| 2018-08-14 Fujii Hironori <Hironori.Fujii@sony.com> |
| |
| Unreviewed, rolling out r234874 and r234876. |
| |
| WinCairo port can't compile |
| |
| Reverted changesets: |
| |
| "[JSC] Add GPRReg::InvalidGPRReg and FPRReg::InvalidFPRReg" |
| https://bugs.webkit.org/show_bug.cgi?id=188589 |
| https://trac.webkit.org/changeset/234874 |
| |
| "Unreviewed, attempt to fix CLoop build" |
| https://bugs.webkit.org/show_bug.cgi?id=188589 |
| https://trac.webkit.org/changeset/234876 |
| |
| 2018-08-14 Saam barati <sbarati@apple.com> |
| |
| HashMap<Ref<P>, V> asserts when V is not zero for its empty value |
| https://bugs.webkit.org/show_bug.cgi?id=188582 |
| |
| Reviewed by Sam Weinig. |
| |
| * runtime/SparseArrayValueMap.h: |
| |
| 2018-08-14 Yusuke Suzuki <yusukesuzuki@slowstart.org> |
| |
| Unreviewed, attempt to fix CLoop build |
| https://bugs.webkit.org/show_bug.cgi?id=188589 |
| |
| * assembler/MacroAssembler.h: |
| |
| 2018-08-14 Yusuke Suzuki <yusukesuzuki@slowstart.org> |
| |
| [JSC] Add GPRReg::InvalidGPRReg and FPRReg::InvalidFPRReg |
| https://bugs.webkit.org/show_bug.cgi?id=188589 |
| |
| Reviewed by Mark Lam. |
| |
| Since GPRReg(RegisterID) and FPRReg(FPRegisterID) do not include -1 in their enum values, |
| UBSan dumps bunch of warnings "runtime error: load of value 4294967295, which is not a valid value for type 'RegisterID'". |
| |
| 1. We add InvalidGPRReg and InvalidFPRReg to enum values of GPRReg and FPRReg to suppress the above warnings. |
| 2. We make GPRReg and FPRReg int8_t enums. |
| 3. We replace `#define InvalidGPRReg ((JSC::GPRReg)-1)` to `static constexpr GPRReg InvalidGPRReg { GPRReg::InvalidGPRReg };`. |
| |
| * assembler/ARM64Assembler.h: |
| * assembler/ARMAssembler.h: |
| * assembler/ARMv7Assembler.h: |
| * assembler/MIPSAssembler.h: |
| * assembler/X86Assembler.h: |
| * jit/FPRInfo.h: |
| * jit/GPRInfo.h: |
| (JSC::JSValueRegs::JSValueRegs): |
| (JSC::JSValueRegs::tagGPR const): |
| (JSC::JSValueRegs::payloadGPR const): |
| (JSC::JSValueSource::JSValueSource): |
| (JSC::JSValueSource::unboxedCell): |
| (JSC::JSValueSource::operator bool const): |
| (JSC::JSValueSource::base const): |
| (JSC::JSValueSource::tagGPR const): |
| (JSC::JSValueSource::payloadGPR const): |
| (JSC::JSValueSource::hasKnownTag const): |
| |
| 2018-08-14 Keith Miller <keith_miller@apple.com> |
| |
| Add missing availability macro. |
| https://bugs.webkit.org/show_bug.cgi?id=188563 |
| |
| Reviewed by Mark Lam. |
| |
| * API/JSValueRef.h: |
| |
| 2018-08-14 Yusuke Suzuki <yusukesuzuki@slowstart.org> |
| |
| [JSC] GetByIdStatus::m_wasSeenInJIT is touched in GetByIdStatus::slowVersion |
| https://bugs.webkit.org/show_bug.cgi?id=188560 |
| |
| Reviewed by Keith Miller. |
| |
| While GetByIdStatus() / GetByIdStatus(status) constructors do not set m_wasSeenInJIT, |
| it is loaded unconditionally in GetByIdStatus::slowVersion. This access to the |
| uninitialized member field is caught in UBSan. This patch fixes it by adding an initializer |
| `m_wasSeenInJIT { false }`. |
| |
| * bytecode/GetByIdStatus.h: |
| |
| 2018-08-14 Yusuke Suzuki <yusukesuzuki@slowstart.org> |
| |
| [DFG] DFGPredictionPropagation should set PrimaryPass when processing invariants |
| https://bugs.webkit.org/show_bug.cgi?id=188557 |
| |
| Reviewed by Mark Lam. |
| |
| DFGPredictionPropagationPhase should set PrimaryPass before processing invariants since |
| processing for ArithRound etc.'s invariants requires `m_pass` load. This issue is found |
| in UBSan's result. |
| |
| * dfg/DFGPredictionPropagationPhase.cpp: |
| |
| 2018-08-14 Yusuke Suzuki <yusukesuzuki@slowstart.org> |
| |
| [JSC] Should not rotate constant with 64 |
| https://bugs.webkit.org/show_bug.cgi?id=188556 |
| |
| Reviewed by Mark Lam. |
| |
| To defend against JIT splaying, we rotate a constant with a randomly generated seed. |
| But if a seed becomes 64, the following code performs `value << 64` where value's type |
| is uint64_t, and it causes undefined behaviors (UBs). This patch limits the seed in the |
| range of [0, 64) not to generate code causing UBs. This is found by UBSan. |
| |
| * assembler/MacroAssembler.h: |
| (JSC::MacroAssembler::generateRotationSeed): |
| (JSC::MacroAssembler::rotationBlindConstant): |
| |
| 2018-08-12 Karo Gyoker <karogyoker2+webkit@gmail.com> |
| |
| Disable JIT on IA-32 without SSE2 |
| https://bugs.webkit.org/show_bug.cgi?id=188476 |
| |
| Reviewed by Michael Catanzaro. |
| |
| Including missing header (MacroAssembler.h) in case of other |
| operating systems than Windows too. |
| |
| * runtime/Options.cpp: |
| |
| 2018-08-11 Karo Gyoker <karogyoker2+webkit@gmail.com> |
| |
| Disable JIT on IA-32 without SSE2 |
| https://bugs.webkit.org/show_bug.cgi?id=188476 |
| |
| Reviewed by Yusuke Suzuki. |
| |
| On IA-32 CPUs without SSE2 most of the webpages cannot load |
| if the JIT is turned on. |
| |
| * runtime/Options.cpp: |
| (JSC::recomputeDependentOptions): |
| |
| 2018-08-10 Joseph Pecoraro <pecoraro@apple.com> |
| |
| Web Inspector: console.log fires getters for deep properties |
| https://bugs.webkit.org/show_bug.cgi?id=187542 |
| <rdar://problem/42873158> |
| |
| Reviewed by Saam Barati. |
| |
| * inspector/InjectedScriptSource.js: |
| (RemoteObject.prototype._isPreviewableObject): |
| Avoid getters/setters when checking for simple properties to preview. |
| Here we avoid invoking `object[property]` if it could be a user getter. |
| |
| 2018-08-10 Keith Miller <keith_miller@apple.com> |
| |
| Slicing an ArrayBuffer with a long number returns an ArrayBuffer with byteLength zero |
| https://bugs.webkit.org/show_bug.cgi?id=185127 |
| |
| Reviewed by Saam Barati. |
| |
| Previously, we would truncate the indicies passed to slice to an |
| int. This meant that the value was not getting properly clamped |
| later. |
| |
| This patch also removes a non-spec compliant check that slice was |
| passed at least one argument. |
| |
| * runtime/ArrayBuffer.cpp: |
| (JSC::ArrayBuffer::clampValue): |
| (JSC::ArrayBuffer::clampIndex const): |
| (JSC::ArrayBuffer::slice const): |
| * runtime/ArrayBuffer.h: |
| (JSC::ArrayBuffer::clampValue): Deleted. |
| (JSC::ArrayBuffer::clampIndex const): Deleted. |
| * runtime/JSArrayBufferPrototype.cpp: |
| (JSC::arrayBufferProtoFuncSlice): |
| |
| 2018-08-10 Yusuke Suzuki <yusukesuzuki@slowstart.org> |
| |
| Date.UTC should not return NaN with only Year param |
| https://bugs.webkit.org/show_bug.cgi?id=188378 |
| |
| Reviewed by Keith Miller. |
| |
| Date.UTC requires one argument for |year|. But the other ones are optional. |
| This patch fix this handling. |
| |
| * runtime/DateConstructor.cpp: |
| (JSC::millisecondsFromComponents): |
| |
| 2018-08-08 Keith Miller <keith_miller@apple.com> |
| |
| Array.prototype.sort should call @toLength instead of ">>> 0" |
| https://bugs.webkit.org/show_bug.cgi?id=188430 |
| |
| Reviewed by Saam Barati. |
| |
| Also add a new function to $vm that will fetch a private |
| property. This can be useful for running builtin helper functions. |
| |
| * builtins/ArrayPrototype.js: |
| (sort): |
| * tools/JSDollarVM.cpp: |
| (JSC::functionGetPrivateProperty): |
| (JSC::JSDollarVM::finishCreation): |
| |
| 2018-08-08 Keith Miller <keith_miller@apple.com> |
| |
| Array.prototype.sort should throw TypeError if param is a not callable object |
| https://bugs.webkit.org/show_bug.cgi?id=188382 |
| |
| Reviewed by Saam Barati. |
| |
| Improve spec compatability by checking if the Array.prototype.sort comparator is a function |
| before doing anything else. |
| |
| Also, refactor the various helper functions to use let instead of var. |
| |
| * builtins/ArrayPrototype.js: |
| (sort.stringComparator): |
| (sort.compactSparse): |
| (sort.compactSlow): |
| (sort.compact): |
| (sort.merge): |
| (sort.mergeSort): |
| (sort.bucketSort): |
| (sort.comparatorSort): |
| (sort.stringSort): |
| (sort): |
| |
| 2018-08-08 Michael Saboff <msaboff@apple.com> |
| |
| Yarr JIT should include annotations with dumpDisassembly=true |
| https://bugs.webkit.org/show_bug.cgi?id=188415 |
| |
| Reviewed by Yusuke Suzuki. |
| |
| Created a YarrDisassembler class that handles annotations similar to the baseline JIT. |
| Given that the Yarr creates matching code bu going through the YarrPattern ops forward and |
| then the backtracking code through the YarrPattern ops in reverse order, the disassembler |
| needs to do the same think. |
| |
| Restructured some of the logging code in YarrPattern to eliminate redundent code and factor |
| out simple methods for what was needed by the YarrDisassembler. |
| |
| Here is abbreviated sample output after this change. |
| |
| Generated JIT code for 8-bit regular expression /ab*c/: |
| Code at [0x469561c03720, 0x469561c03840): |
| 0x469561c03720: push %rbp |
| 0x469561c03721: mov %rsp, %rbp |
| ... |
| 0x469561c03762: sub $0x40, %rsp |
| == Matching == |
| 0:OpBodyAlternativeBegin minimum size 2 |
| 0x469561c03766: add $0x2, %esi |
| 0x469561c03769: cmp %edx, %esi |
| 0x469561c0376b: ja 0x469561c037fa |
| 1:OpTerm TypePatternCharacter 'a' |
| 0x469561c03771: movzx -0x2(%rdi,%rsi), %eax |
| 0x469561c03776: cmp $0x61, %eax |
| 0x469561c03779: jnz 0x469561c037e9 |
| 2:OpTerm TypePatternCharacter 'b' {0,...} greedy |
| 0x469561c0377f: xor %r9d, %r9d |
| 0x469561c03782: cmp %edx, %esi |
| 0x469561c03784: jz 0x469561c037a2 |
| ... |
| 0x469561c0379d: jmp 0x469561c03782 |
| 0x469561c037a2: mov %r9, 0x8(%rsp) |
| 3:OpTerm TypePatternCharacter 'c' |
| 0x469561c037a7: movzx -0x1(%rdi,%rsi), %eax |
| 0x469561c037ac: cmp $0x63, %eax |
| 0x469561c037af: jnz 0x469561c037d1 |
| 4:OpBodyAlternativeEnd |
| 0x469561c037b5: add $0x40, %rsp |
| ... |
| 0x469561c037cf: pop %rbp |
| 0x469561c037d0: ret |
| == Backtracking == |
| 4:OpBodyAlternativeEnd |
| 3:OpTerm TypePatternCharacter 'c' |
| 2:OpTerm TypePatternCharacter 'b' {0,...} greedy |
| 0x469561c037d1: mov 0x8(%rsp), %r9 |
| ... |
| 0x469561c037e4: jmp 0x469561c037a2 |
| 1:OpTerm TypePatternCharacter 'a' |
| 0:OpBodyAlternativeBegin minimum size 2 |
| 0x469561c037e9: mov %rsi, %rax |
| ... |
| 0x469561c0382f: pop %rbp |
| 0x469561c03830: ret |
| |
| * JavaScriptCore.xcodeproj/project.pbxproj: |
| * Sources.txt: |
| * runtime/RegExp.cpp: |
| (JSC::RegExp::compile): |
| (JSC::RegExp::compileMatchOnly): |
| * yarr/YarrDisassembler.cpp: Added. |
| (JSC::Yarr::YarrDisassembler::indentString): |
| (JSC::Yarr::YarrDisassembler::YarrDisassembler): |
| (JSC::Yarr::YarrDisassembler::~YarrDisassembler): |
| (JSC::Yarr::YarrDisassembler::dump): |
| (JSC::Yarr::YarrDisassembler::dumpHeader): |
| (JSC::Yarr::YarrDisassembler::dumpVectorForInstructions): |
| (JSC::Yarr::YarrDisassembler::dumpForInstructions): |
| (JSC::Yarr::YarrDisassembler::dumpDisassembly): |
| * yarr/YarrDisassembler.h: Added. |
| (JSC::Yarr::YarrJITInfo::~YarrJITInfo): |
| (JSC::Yarr::YarrDisassembler::setStartOfCode): |
| (JSC::Yarr::YarrDisassembler::setForGenerate): |
| (JSC::Yarr::YarrDisassembler::setForBacktrack): |
| (JSC::Yarr::YarrDisassembler::setEndOfGenerate): |
| (JSC::Yarr::YarrDisassembler::setEndOfBacktrack): |
| (JSC::Yarr::YarrDisassembler::setEndOfCode): |
| (JSC::Yarr::YarrDisassembler::indentString): |
| * yarr/YarrJIT.cpp: |
| (JSC::Yarr::YarrGenerator::generate): |
| (JSC::Yarr::YarrGenerator::backtrack): |
| (JSC::Yarr::YarrGenerator::YarrGenerator): |
| (JSC::Yarr::YarrGenerator::compile): |
| (JSC::Yarr::jitCompile): |
| * yarr/YarrJIT.h: |
| * yarr/YarrPattern.cpp: |
| (JSC::Yarr::dumpCharacterClass): |
| (JSC::Yarr::PatternTerm::dump): |
| (JSC::Yarr::YarrPattern::dumpPatternString): |
| (JSC::Yarr::YarrPattern::dumpPattern): |
| * yarr/YarrPattern.h: |
| |
| 2018-08-05 Darin Adler <darin@apple.com> |
| |
| [Cocoa] More tweaks and refactoring to prepare for ARC |
| https://bugs.webkit.org/show_bug.cgi?id=188245 |
| |
| Reviewed by Dan Bernstein. |
| |
| * API/JSValue.mm: Use __unsafe_unretained. |
| (JSContainerConvertor::convert): Use auto for compatibility with the above. |
| * API/JSWrapperMap.mm: |
| (allocateConstructorForCustomClass): Use CFTypeRef instead of Protocol *. |
| (-[JSWrapperMap initWithGlobalContextRef:]): Use __unsafe_unretained. |
| |
| * heap/Heap.cpp: Updated include for rename: FoundationSPI.h -> objcSPI.h. |
| |
| 2018-08-07 Yusuke Suzuki <yusukesuzuki@slowstart.org> |
| |
| Shrink size of PropertyCondition by packing UniquedStringImpl* and Kind |
| https://bugs.webkit.org/show_bug.cgi?id=188328 |
| |
| Reviewed by Saam Barati. |
| |
| Shrinking the size of PropertyCondition can improve memory consumption by a lot. |
| For example, cnn.com can show 7000 persistent StructureStubClearingWatchpoint |
| and 6000 LLIntPrototypeLoadAdaptiveStructureWatchpoint which have PropertyCondition |
| as a member field. |
| |
| This patch shrinks the size of PropertyCondition by packing UniquedStringImpl* and |
| PropertyCondition::Kind into uint64_t data in 64bit architecture. Since our address |
| are within 48bit, we can put PropertyCondition::Kind in this unused bits. |
| To make it easy, we add WTF::CompactPointerTuple<PointerType, Type>, which automatically |
| folds a pointer and 1byte type into 64bit data. |
| |
| This change shrinks PropertyCondition from 24bytes to 16bytes. |
| |
| * bytecode/PropertyCondition.cpp: |
| (JSC::PropertyCondition::dumpInContext const): |
| (JSC::PropertyCondition::isStillValidAssumingImpurePropertyWatchpoint const): |
| (JSC::PropertyCondition::validityRequiresImpurePropertyWatchpoint const): |
| (JSC::PropertyCondition::isStillValid const): |
| (JSC::PropertyCondition::isWatchableWhenValid const): |
| * bytecode/PropertyCondition.h: |
| (JSC::PropertyCondition::PropertyCondition): |
| (JSC::PropertyCondition::presenceWithoutBarrier): |
| (JSC::PropertyCondition::absenceWithoutBarrier): |
| (JSC::PropertyCondition::absenceOfSetEffectWithoutBarrier): |
| (JSC::PropertyCondition::equivalenceWithoutBarrier): |
| (JSC::PropertyCondition::hasPrototypeWithoutBarrier): |
| (JSC::PropertyCondition::operator bool const): |
| (JSC::PropertyCondition::kind const): |
| (JSC::PropertyCondition::uid const): |
| (JSC::PropertyCondition::hasOffset const): |
| (JSC::PropertyCondition::hasAttributes const): |
| (JSC::PropertyCondition::hasPrototype const): |
| (JSC::PropertyCondition::hasRequiredValue const): |
| (JSC::PropertyCondition::hash const): |
| (JSC::PropertyCondition::operator== const): |
| (JSC::PropertyCondition::isHashTableDeletedValue const): |
| (JSC::PropertyCondition::watchingRequiresReplacementWatchpoint const): |
| |
| 2018-08-07 Mark Lam <mark.lam@apple.com> |
| |
| Use a more specific PtrTag for PlatformRegisters PC and LR. |
| https://bugs.webkit.org/show_bug.cgi?id=188366 |
| <rdar://problem/42984123> |
| |
| Reviewed by Keith Miller. |
| |
| Also fixed a bug in linkRegister(), which was previously returning the PC instead |
| of LR. It now returns LR. |
| |
| * runtime/JSCPtrTag.h: |
| * runtime/MachineContext.h: |
| (JSC::MachineContext::instructionPointer): |
| (JSC::MachineContext::linkRegister): |
| * runtime/VMTraps.cpp: |
| (JSC::SignalContext::SignalContext): |
| * tools/SigillCrashAnalyzer.cpp: |
| (JSC::SignalContext::SignalContext): |
| |
| 2018-08-07 Karo Gyoker <karogyoker2+webkit@gmail.com> |
| |
| Hardcoded LFENCE instruction |
| https://bugs.webkit.org/show_bug.cgi?id=188145 |
| |
| Reviewed by Filip Pizlo. |
| |
| Remove lfence instruction because it is crashing systems without SSE2 and |
| this is not the way how WebKit mitigates Spectre. |
| |
| * runtime/JSLock.cpp: |
| (JSC::JSLock::didAcquireLock): |
| (JSC::JSLock::willReleaseLock): |
| |
| 2018-08-04 David Kilzer <ddkilzer@apple.com> |
| |
| REGRESSION (r208953): TemplateObjectDescriptor constructor calculates m_hash on use-after-move variable |
| <https://webkit.org/b/188331> |
| |
| Reviewed by Yusuke Suzuki. |
| |
| * runtime/TemplateObjectDescriptor.h: |
| (JSC::TemplateObjectDescriptor::TemplateObjectDescriptor): |
| Use `m_rawstrings` instead of `rawStrings` to calculate hash. |
| |
| 2018-08-03 Saam Barati <sbarati@apple.com> |
| |
| Give the `jsc` shell the JIT entitlement |
| https://bugs.webkit.org/show_bug.cgi?id=188324 |
| <rdar://problem/42885806> |
| |
| Reviewed by Dan Bernstein. |
| |
| This should help us in ensuring the system jsc is able to JIT. |
| |
| * Configurations/JSC.xcconfig: |
| * JavaScriptCore.xcodeproj/project.pbxproj: |
| * allow-jit-macOS.entitlements: Added. |
| |
| 2018-08-03 Alex Christensen <achristensen@webkit.org> |
| |
| Fix spelling of "overridden" |
| https://bugs.webkit.org/show_bug.cgi?id=188315 |
| |
| Reviewed by Darin Adler. |
| |
| * API/JSExport.h: |
| * inspector/InjectedScriptSource.js: |
| |
| 2018-08-02 Saam Barati <sbarati@apple.com> |
| |
| Reading instructionPointer from PlatformRegisters may fail when using pointer profiling |
| https://bugs.webkit.org/show_bug.cgi?id=188271 |
| <rdar://problem/42850884> |
| |
| Reviewed by Michael Saboff. |
| |
| This patch defends against the instructionPointer containing garbage bits. |
| See radar for details. |
| |
| * runtime/MachineContext.h: |
| (JSC::MachineContext::instructionPointer): |
| * runtime/SamplingProfiler.cpp: |
| (JSC::SamplingProfiler::takeSample): |
| * runtime/VMTraps.cpp: |
| (JSC::SignalContext::SignalContext): |
| (JSC::SignalContext::tryCreate): |
| * tools/CodeProfiling.cpp: |
| (JSC::profilingTimer): |
| * tools/SigillCrashAnalyzer.cpp: |
| (JSC::SignalContext::SignalContext): |
| (JSC::SignalContext::tryCreate): |
| (JSC::SignalContext::dump): |
| (JSC::installCrashHandler): |
| * wasm/WasmFaultSignalHandler.cpp: |
| (JSC::Wasm::trapHandler): |
| |
| 2018-08-02 David Fenton <david_fenton@apple.com> |
| |
| Unreviewed, rolling out r234489. |
| |
| Caused 50+ crashes and 60+ API failures on iOS |
| |
| Reverted changeset: |
| |
| "[WTF] Rename String::format to String::deprecatedFormat" |
| https://bugs.webkit.org/show_bug.cgi?id=188191 |
| https://trac.webkit.org/changeset/234489 |
| |
| 2018-08-01 Yusuke Suzuki <utatane.tea@gmail.com> |
| |
| Add self.queueMicrotask(f) on DOMWindow |
| https://bugs.webkit.org/show_bug.cgi?id=188212 |
| |
| Reviewed by Ryosuke Niwa. |
| |
| * CMakeLists.txt: |
| * JavaScriptCore.xcodeproj/project.pbxproj: |
| * Sources.txt: |
| * runtime/JSGlobalObject.cpp: |
| (JSC::enqueueJob): |
| * runtime/JSMicrotask.cpp: Renamed from Source/JavaScriptCore/runtime/JSJob.cpp. |
| (JSC::createJSMicrotask): |
| Export them to WebCore. |
| |
| (JSC::JSMicrotask::run): |
| * runtime/JSMicrotask.h: Renamed from Source/JavaScriptCore/runtime/JSJob.h. |
| Add another version of JSMicrotask which does not have arguments. |
| |
| 2018-08-01 Tomas Popela <tpopela@redhat.com> |
| |
| [WTF] Rename String::format to String::deprecatedFormat |
| https://bugs.webkit.org/show_bug.cgi?id=188191 |
| |
| Reviewed by Darin Adler. |
| |
| It should be replaced with string concatenation. |
| |
| * bytecode/CodeBlock.cpp: |
| (JSC::CodeBlock::nameForRegister): |
| * inspector/InjectedScriptBase.cpp: |
| (Inspector::InjectedScriptBase::makeCall): |
| * inspector/InspectorBackendDispatcher.cpp: |
| (Inspector::BackendDispatcher::getPropertyValue): |
| * inspector/agents/InspectorConsoleAgent.cpp: |
| (Inspector::InspectorConsoleAgent::enable): |
| (Inspector::InspectorConsoleAgent::stopTiming): |
| * jsc.cpp: |
| (FunctionJSCStackFunctor::operator() const): |
| * parser/Lexer.cpp: |
| (JSC::Lexer<T>::invalidCharacterMessage const): |
| * runtime/IntlDateTimeFormat.cpp: |
| (JSC::IntlDateTimeFormat::initializeDateTimeFormat): |
| * runtime/IntlObject.cpp: |
| (JSC::canonicalizeLocaleList): |
| * runtime/LiteralParser.cpp: |
| (JSC::LiteralParser<CharType>::Lexer::lex): |
| (JSC::LiteralParser<CharType>::Lexer::lexStringSlow): |
| (JSC::LiteralParser<CharType>::parse): |
| * runtime/LiteralParser.h: |
| (JSC::LiteralParser::getErrorMessage): |
| |
| 2018-08-01 Andy VanWagoner <andy@vanwagoner.family> |
| |
| [INTL] Allow "unknown" formatToParts types |
| https://bugs.webkit.org/show_bug.cgi?id=188176 |
| |
| Reviewed by Darin Adler. |
| |
| Originally extra unexpected field types were marked as "literal", since |
| the spec did not account for these. The ECMA 402 spec has since been updated |
| to specify "unknown" should be used in these cases. |
| |
| Currently there is no known way to reach these cases, so no tests can |
| account for them. Theoretically they shoudn't exist, but they are specified, |
| just to be safe. Marking them as "unknown" instead of "literal" hopefully |
| will make such cases easy to identify if they ever happen. |
| |
| * runtime/IntlDateTimeFormat.cpp: |
| (JSC::IntlDateTimeFormat::partTypeString): |
| * runtime/IntlNumberFormat.cpp: |
| (JSC::IntlNumberFormat::partTypeString): |
| |
| 2018-08-01 Andy VanWagoner <andy@vanwagoner.family> |
| |
| [INTL] Implement hourCycle in DateTimeFormat |
| https://bugs.webkit.org/show_bug.cgi?id=188006 |
| |
| Reviewed by Darin Adler. |
| |
| Implemented hourCycle, updating both the skeleton and the final pattern. |
| Changed resolveLocale to assume undefined options are not given and null |
| strings actually mean null, which removes the tag extension. |
| |
| * runtime/CommonIdentifiers.h: |
| * runtime/IntlCollator.cpp: |
| (JSC::IntlCollator::initializeCollator): |
| * runtime/IntlDateTimeFormat.cpp: |
| (JSC::IntlDTFInternal::localeData): |
| (JSC::IntlDateTimeFormat::setFormatsFromPattern): |
| (JSC::IntlDateTimeFormat::initializeDateTimeFormat): |
| (JSC::IntlDateTimeFormat::resolvedOptions): |
| * runtime/IntlDateTimeFormat.h: |
| * runtime/IntlObject.cpp: |
| (JSC::resolveLocale): |
| |
| 2018-08-01 Keith Miller <keith_miller@apple.com> |
| |
| JSArrayBuffer should have its own JSType |
| https://bugs.webkit.org/show_bug.cgi?id=188231 |
| |
| Reviewed by Saam Barati. |
| |
| * runtime/JSArrayBuffer.cpp: |
| (JSC::JSArrayBuffer::createStructure): |
| * runtime/JSCast.h: |
| * runtime/JSType.h: |
| |
| 2018-07-31 Keith Miller <keith_miller@apple.com> |
| |
| Unreviewed 32-bit build fix... |
| |
| * dfg/DFGSpeculativeJIT32_64.cpp: |
| |
| 2018-07-31 Keith Miller <keith_miller@apple.com> |
| |
| Long compiling JSC files should not be unified |
| https://bugs.webkit.org/show_bug.cgi?id=188205 |
| |
| Reviewed by Saam Barati. |
| |
| The DFGSpeculativeJIT and FTLLowerDFGToB3 files take a long time |
| to compile. Unifying them means touching anything in the same |
| bundle as those files takes a long time to incrementally build. |
| This patch separates those files so they build standalone. |
| |
| * JavaScriptCore.xcodeproj/project.pbxproj: |
| * Sources.txt: |
| * dfg/DFGSpeculativeJIT64.cpp: |
| |
| 2018-07-31 Yusuke Suzuki <utatane.tea@gmail.com> |
| |
| [JSC] Remove unnecessary cellLock() in JSObject's GC marking if IndexingType is contiguous |
| https://bugs.webkit.org/show_bug.cgi?id=188201 |
| |
| Reviewed by Keith Miller. |
| |
| We do not reuse the existing butterfly with Contiguous shape for new ArrayStorage butterfly. |
| When converting the butterfly with Contiguous shape to ArrayStorage, we always allocate a |
| new one. So this cellLock() is unnecessary for contiguous shape since contigous shaped butterfly |
| never becomes broken state. This patch removes unnecessary locking. |
| |
| * runtime/JSObject.cpp: |
| (JSC::JSObject::visitButterflyImpl): |
| |
| 2018-07-31 Guillaume Emont <guijemont@igalia.com> |
| |
| [JSC] Remove gcc warnings for 32-bit platforms |
| https://bugs.webkit.org/show_bug.cgi?id=187803 |
| |
| Reviewed by Yusuke Suzuki. |
| |
| * assembler/MacroAssemblerPrinter.cpp: |
| (JSC::Printer::printPCRegister): |
| (JSC::Printer::printRegisterID): |
| (JSC::Printer::printAddress): |
| * dfg/DFGSpeculativeJIT.cpp: |
| (JSC::DFG::SpeculativeJIT::speculateNumber): |
| (JSC::DFG::SpeculativeJIT::speculateMisc): |
| * jit/CCallHelpers.h: |
| (JSC::CCallHelpers::calculatePokeOffset): |
| * runtime/Options.cpp: |
| (JSC::parse): |
| |
| 2018-07-30 Wenson Hsieh <wenson_hsieh@apple.com> |
| |
| watchOS engineering build is broken after r234227 |
| https://bugs.webkit.org/show_bug.cgi?id=188180 |
| |
| Reviewed by Keith Miller. |
| |
| In the case where we're building with a `PLATFORM_NAME` of neither "macosx" nor "iphone*", |
| postprocess-headers.sh attempts to delete any usage of the JSC availability macros. However, |
| `JSC_MAC_VERSION_TBA` and `JSC_IOS_VERSION_TBA` still remain, and JSValue.h's usage of |
| `JSC_IOS_VERSION_TBA` causes engineering watchOS builds to fail. |
| |
| To fix this, simply allow the fallback path to remove these macros from JavaScriptCore headers |
| entirely, since there's no relevant version to replace them with. |
| |
| * postprocess-headers.sh: |
| |
| 2018-07-30 Keith Miller <keith_miller@apple.com> |
| |
| Clarify conversion rules for JSValue property access API |
| https://bugs.webkit.org/show_bug.cgi?id=188179 |
| |
| Reviewed by Geoffrey Garen. |
| |
| * API/JSValue.h: |
| |
| 2018-07-30 Keith Miller <keith_miller@apple.com> |
| |
| Rename some JSC API functions/types. |
| https://bugs.webkit.org/show_bug.cgi?id=188173 |
| |
| Reviewed by Saam Barati. |
| |
| * API/JSObjectRef.cpp: |
| (JSObjectHasPropertyForKey): |
| (JSObjectGetPropertyForKey): |
| (JSObjectSetPropertyForKey): |
| (JSObjectDeletePropertyForKey): |
| (JSObjectHasPropertyKey): Deleted. |
| (JSObjectGetPropertyKey): Deleted. |
| (JSObjectSetPropertyKey): Deleted. |
| (JSObjectDeletePropertyKey): Deleted. |
| * API/JSObjectRef.h: |
| * API/JSValue.h: |
| * API/JSValue.mm: |
| (-[JSValue valueForProperty:]): |
| (-[JSValue setValue:forProperty:]): |
| (-[JSValue deleteProperty:]): |
| (-[JSValue hasProperty:]): |
| (-[JSValue defineProperty:descriptor:]): |
| * API/tests/testapi.cpp: |
| (TestAPI::run): |
| |
| 2018-07-30 Mark Lam <mark.lam@apple.com> |
| |
| Add a debugging utility to dump the memory layout of a JSCell. |
| https://bugs.webkit.org/show_bug.cgi?id=188157 |
| |
| Reviewed by Yusuke Suzuki. |
| |
| This patch adds $vm.dumpCell() and VMInspector::dumpCellMemory() to allow us to |
| dump the memory contents of a cell and if present, its butterfly for debugging |
| purposes. |
| |
| Example usage for JS code when JSC_useDollarVM=true: |
| |
| $vm.dumpCell(obj); |
| |
| Example usage from C++ code or from lldb: |
| |
| (lldb) p JSC::VMInspector::dumpCellMemory(obj) |
| |
| Some examples of dumps: |
| |
| <0x104bc8260, Object> |
| [0] 0x104bc8260 : 0x010016000000016c header |
| structureID 364 0x16c structure 0x104b721b0 |
| indexingTypeAndMisc 0 0x0 NonArray |
| type 22 0x16 |
| flags 0 0x0 |
| cellState 1 |
| [1] 0x104bc8268 : 0x0000000000000000 butterfly |
| [2] 0x104bc8270 : 0xffff000000000007 |
| [3] 0x104bc8278 : 0xffff000000000008 |
| |
| <0x104bb4360, Array> |
| [0] 0x104bb4360 : 0x0108210b00000171 header |
| structureID 369 0x171 structure 0x104b723e0 |
| indexingTypeAndMisc 11 0xb ArrayWithArrayStorage |
| type 33 0x21 |
| flags 8 0x8 |
| cellState 1 |
| [1] 0x104bb4368 : 0x00000008000f4718 butterfly |
| base 0x8000f46e0 |
| hasIndexingHeader YES hasAnyArrayStorage YES |
| publicLength 4 vectorLength 7 indexBias 2 |
| preCapacity 2 propertyCapacity 4 |
| <--- preCapacity |
| [0] 0x8000f46e0 : 0x0000000000000000 |
| [1] 0x8000f46e8 : 0x0000000000000000 |
| <--- propertyCapacity |
| [2] 0x8000f46f0 : 0x0000000000000000 |
| [3] 0x8000f46f8 : 0x0000000000000000 |
| [4] 0x8000f4700 : 0xffff00000000000d |
| [5] 0x8000f4708 : 0xffff00000000000c |
| <--- indexingHeader |
| [6] 0x8000f4710 : 0x0000000700000004 |
| <--- butterfly |
| <--- arrayStorage |
| [7] 0x8000f4718 : 0x0000000000000000 |
| [8] 0x8000f4720 : 0x0000000400000002 |
| <--- indexedProperties |
| [9] 0x8000f4728 : 0xffff000000000008 |
| [10] 0x8000f4730 : 0xffff000000000009 |
| [11] 0x8000f4738 : 0xffff000000000005 |
| [12] 0x8000f4740 : 0xffff000000000006 |
| [13] 0x8000f4748 : 0x0000000000000000 |
| [14] 0x8000f4750 : 0x0000000000000000 |
| [15] 0x8000f4758 : 0x0000000000000000 |
| <--- unallocated capacity |
| [16] 0x8000f4760 : 0x0000000000000000 |
| [17] 0x8000f4768 : 0x0000000000000000 |
| [18] 0x8000f4770 : 0x0000000000000000 |
| [19] 0x8000f4778 : 0x0000000000000000 |
| |
| * runtime/JSObject.h: |
| * tools/JSDollarVM.cpp: |
| (JSC::functionDumpCell): |
| (JSC::JSDollarVM::finishCreation): |
| * tools/VMInspector.cpp: |
| (JSC::VMInspector::dumpCellMemory): |
| (JSC::IndentationScope::IndentationScope): |
| (JSC::IndentationScope::~IndentationScope): |
| (JSC::VMInspector::dumpCellMemoryToStream): |
| * tools/VMInspector.h: |
| |
| 2018-07-27 Mark Lam <mark.lam@apple.com> |
| |
| Add some crash info to Heap::checkConn() RELEASE_ASSERTs. |
| https://bugs.webkit.org/show_bug.cgi?id=188123 |
| <rdar://problem/42672268> |
| |
| Reviewed by Keith Miller. |
| |
| 1. Add VM::m_id and Heap::m_lastPhase fields. Both of these fit within existing |
| padding space in VM and Heap, and should not cost any measurable perf to |
| initialize and update. |
| |
| 2. Add some crash info to the RELEASE_ASSERTs in Heap::checkConn(): |
| |
| worldState tells us the value we failed the assertion on. |
| |
| m_lastPhase, m_currentPhase, and m_nextPhase tells us the GC phase transition |
| that led us here. |
| |
| VM::id(), and VM::numberOfIDs() tells us how many VMs may be in play. |
| |
| VM::isEntered() tells us if the current VM is currently executing JS code. |
| |
| Some of this data may be redundant, but the redundancy is intentional so that |
| we can double check what is really happening at the time of crash. |
| |
| * heap/Heap.cpp: |
| (JSC::asInt): |
| (JSC::Heap::checkConn): |
| (JSC::Heap::changePhase): |
| * heap/Heap.h: |
| * runtime/VM.cpp: |
| (JSC::VM::nextID): |
| (JSC::VM::VM): |
| * runtime/VM.h: |
| (JSC::VM::numberOfIDs): |
| (JSC::VM::id const): |
| (JSC::VM::isEntered const): |
| |
| 2018-07-25 Yusuke Suzuki <utatane.tea@gmail.com> |
| |
| [JSC] Record CoW status in ArrayProfile correctly |
| https://bugs.webkit.org/show_bug.cgi?id=187949 |
| |
| Reviewed by Saam Barati. |
| |
| In this patch, we simplify asArrayModes: just shifting the value with IndexingMode. |
| This is important since our OSR exit compiler records m_observedArrayModes by calculating |
| ArrayModes with shifting. Since ArrayModes for CoW arrays are incorrectly calculated, |
| our OSR exit compiler records incorrect results in ArrayProfile. And it leads to |
| Array::Generic DFG nodes. |
| |
| * bytecode/ArrayProfile.h: |
| (JSC::asArrayModes): |
| (JSC::ArrayProfile::ArrayProfile): |
| * dfg/DFGOSRExit.cpp: |
| (JSC::DFG::OSRExit::compileExit): |
| * ftl/FTLOSRExitCompiler.cpp: |
| (JSC::FTL::compileStub): |
| * runtime/IndexingType.h: |
| |
| 2018-07-26 Andy VanWagoner <andy@vanwagoner.family> |
| |
| [INTL] Remove INTL sub-feature compile flags |
| https://bugs.webkit.org/show_bug.cgi?id=188081 |
| |
| Reviewed by Michael Catanzaro. |
| |
| Removed ENABLE_INTL_NUMBER_FORMAT_TO_PARTS and ENABLE_INTL_PLURAL_RULES flags. |
| The runtime flags are still present, and should be relied on instead. |
| The defines for ICU features have also been updated to match HAVE() style. |
| |
| * Configurations/FeatureDefines.xcconfig: |
| * runtime/IntlPluralRules.cpp: |
| (JSC::IntlPluralRules::resolvedOptions): |
| (JSC::IntlPluralRules::select): |
| * runtime/IntlPluralRules.h: |
| * runtime/Options.h: |
| |
| 2018-07-26 Yusuke Suzuki <utatane.tea@gmail.com> |
| |
| [JSC] Dump IndexingMode in Structure |
| https://bugs.webkit.org/show_bug.cgi?id=188085 |
| |
| Reviewed by Keith Miller. |
| |
| Dump IndexingMode instead of IndexingType. |
| |
| * runtime/Structure.cpp: |
| (JSC::Structure::dump const): |
| |
| 2018-07-26 Ross Kirsling <ross.kirsling@sony.com> |
| |
| String(View) should have a splitAllowingEmptyEntries function instead of a flag parameter |
| https://bugs.webkit.org/show_bug.cgi?id=187963 |
| |
| Reviewed by Alex Christensen. |
| |
| * inspector/InspectorBackendDispatcher.cpp: |
| (Inspector::BackendDispatcher::dispatch): |
| * jsc.cpp: |
| (ModuleName::ModuleName): |
| (resolvePath): |
| * runtime/IntlObject.cpp: |
| (JSC::canonicalizeLanguageTag): |
| (JSC::removeUnicodeLocaleExtension): |
| Update split/splitAllowingEmptyEntries usage. |
| |
| 2018-07-26 Commit Queue <commit-queue@webkit.org> |
| |
| Unreviewed, rolling out r234181 and r234189. |
| https://bugs.webkit.org/show_bug.cgi?id=188075 |
| |
| These are not needed right now (Requested by thorton on |
| #webkit). |
| |
| Reverted changesets: |
| |
| "Enable Web Content Filtering on watchOS" |
| https://bugs.webkit.org/show_bug.cgi?id=187979 |
| https://trac.webkit.org/changeset/234181 |
| |
| "HAVE(PARENTAL_CONTROLS) should be true on watchOS" |
| https://bugs.webkit.org/show_bug.cgi?id=187985 |
| https://trac.webkit.org/changeset/234189 |
| |
| 2018-07-26 Mark Lam <mark.lam@apple.com> |
| |
| arrayProtoPrivateFuncConcatMemcpy() should handle copying from an Undecided type array. |
| https://bugs.webkit.org/show_bug.cgi?id=188065 |
| <rdar://problem/42515726> |
| |
| Reviewed by Saam Barati. |
| |
| * runtime/ArrayPrototype.cpp: |
| (JSC::clearElement): |
| (JSC::copyElements): |
| (JSC::arrayProtoPrivateFuncConcatMemcpy): |
| |
| 2018-07-26 Andy VanWagoner <andy@vanwagoner.family> |
| |
| JSC: Intl API should ignore encoding when parsing BCP 47 language tag from ISO 15897 locale string (passed via LANG) |
| https://bugs.webkit.org/show_bug.cgi?id=167991 |
| |
| Reviewed by Michael Catanzaro. |
| |
| Improved the conversion of ICU locales to BCP47 tags, using their preferred method. |
| Checked locale.isEmpty() before returning it from defaultLocale, so there should be |
| no more cases where you might have an invalid locale come back from resolveLocale. |
| |
| * runtime/IntlObject.cpp: |
| (JSC::convertICULocaleToBCP47LanguageTag): |
| (JSC::defaultLocale): |
| (JSC::lookupMatcher): |
| * runtime/IntlObject.h: |
| * runtime/JSGlobalObject.cpp: |
| (JSC::JSGlobalObject::intlCollatorAvailableLocales): |
| (JSC::JSGlobalObject::intlDateTimeFormatAvailableLocales): |
| (JSC::JSGlobalObject::intlNumberFormatAvailableLocales): |
| (JSC::JSGlobalObject::intlPluralRulesAvailableLocales): |
| |
| 2018-07-26 Fujii Hironori <Hironori.Fujii@sony.com> |
| |
| REGRESSION(r234248) [Win] testapi.c: nonstandard extension used: non-constant aggregate initializer |
| https://bugs.webkit.org/show_bug.cgi?id=188040 |
| |
| Unreviewed build fix for AppleWin port. |
| |
| * API/tests/testapi.c: Disabled warning C4204. |
| (testMarkingConstraintsAndHeapFinalizers): Added an explicit void* cast for weakRefs. |
| |
| 2018-07-26 Fujii Hironori <Hironori.Fujii@sony.com> |
| |
| [JSC API] We should support the symbol type in our C/Obj-C API |
| https://bugs.webkit.org/show_bug.cgi?id=175836 |
| |
| Unreviewed build fix for Windows port. |
| |
| r234227 introduced a compilation error unresolved external symbol |
| "int __cdecl testCAPIViaCpp(void)" in testapi for Windows ports. |
| |
| Windows ports are compiling testapi.c as C++ by using /TP switch. |
| |
| * API/tests/testapi.c: |
| (main): Removed `::` prefix of ::SetErrorMode Windows API. |
| (dllLauncherEntryPoint): Converted into C style. |
| * shell/PlatformWin.cmake: Do not use /TP switch for testapi.c |
| |
| 2018-07-25 Keith Miller <keith_miller@apple.com> |
| |
| [JSC API] We should support the symbol type in our C/Obj-C API |
| https://bugs.webkit.org/show_bug.cgi?id=175836 |
| |
| Reviewed by Filip Pizlo. |
| |
| This patch makes the following API additions: |
| 1) Test if a JSValue/JSValueRef is a symbol via any of the methods API are able to test for the types of other JSValues. |
| 2) Create a symbol on both APIs. |
| 3) Get/Set/Delete/Define property now take ids in the Obj-C API. |
| 4) Add Get/Set/Delete in the C API. |
| |
| We can do 3 because it is both binary and source compatable with |
| the existing API. I added (4) because the current property access |
| APIs only have the ability to get Strings. It was possible to |
| merge symbols into JSStringRef but that felt confusing and exposes |
| implementation details of our engine. The new functions match the |
| same meaning that they have in JS, thus should be forward |
| compatible with any future language extensions. |
| |
| Lastly, this patch adds the same availability preproccessing phase |
| in WebCore to JavaScriptCore, which enables TBA features for |
| testing on previous releases. |
| |
| * API/APICast.h: |
| * API/JSBasePrivate.h: |
| * API/JSContext.h: |
| * API/JSContextPrivate.h: |
| * API/JSContextRef.h: |
| * API/JSContextRefInternal.h: |
| * API/JSContextRefPrivate.h: |
| * API/JSManagedValue.h: |
| * API/JSObjectRef.cpp: |
| (JSObjectHasPropertyKey): |
| (JSObjectGetPropertyKey): |
| (JSObjectSetPropertyKey): |
| (JSObjectDeletePropertyKey): |
| * API/JSObjectRef.h: |
| * API/JSRemoteInspector.h: |
| * API/JSTypedArray.h: |
| * API/JSValue.h: |
| * API/JSValue.mm: |
| (+[JSValue valueWithNewSymbolFromDescription:inContext:]): |
| (performPropertyOperation): |
| (-[JSValue valueForProperty:valueForProperty:]): |
| (-[JSValue setValue:forProperty:setValue:forProperty:]): |
| (-[JSValue deleteProperty:deleteProperty:]): |
| (-[JSValue hasProperty:hasProperty:]): |
| (-[JSValue defineProperty:descriptor:defineProperty:descriptor:]): |
| (-[JSValue isSymbol]): |
| (-[JSValue objectForKeyedSubscript:]): |
| (-[JSValue setObject:forKeyedSubscript:]): |
| (-[JSValue valueForProperty:]): Deleted. |
| (-[JSValue setValue:forProperty:]): Deleted. |
| (-[JSValue deleteProperty:]): Deleted. |
| (-[JSValue hasProperty:]): Deleted. |
| (-[JSValue defineProperty:descriptor:]): Deleted. |
| * API/JSValueRef.cpp: |
| (JSValueGetType): |
| (JSValueIsSymbol): |
| (JSValueMakeSymbol): |
| * API/JSValueRef.h: |
| * API/WebKitAvailability.h: |
| * API/tests/CurrentThisInsideBlockGetterTest.mm: |
| * API/tests/CustomGlobalObjectClassTest.c: |
| * API/tests/DateTests.mm: |
| * API/tests/JSExportTests.mm: |
| * API/tests/JSNode.c: |
| * API/tests/JSNodeList.c: |
| * API/tests/Node.c: |
| * API/tests/NodeList.c: |
| * API/tests/minidom.c: |
| * API/tests/testapi.c: |
| (main): |
| * API/tests/testapi.cpp: Added. |
| (APIString::APIString): |
| (APIString::~APIString): |
| (APIString::operator JSStringRef): |
| (APIContext::APIContext): |
| (APIContext::~APIContext): |
| (APIContext::operator JSGlobalContextRef): |
| (APIVector::APIVector): |
| (APIVector::~APIVector): |
| (APIVector::append): |
| (testCAPIViaCpp): |
| (TestAPI::evaluateScript): |
| (TestAPI::callFunction): |
| (TestAPI::functionReturnsTrue): |
| (TestAPI::check): |
| (TestAPI::checkJSAndAPIMatch): |
| (TestAPI::interestingObjects): |
| (TestAPI::interestingKeys): |
| (TestAPI::run): |
| * API/tests/testapi.mm: |
| (testObjectiveCAPIMain): |
| * JavaScriptCore.xcodeproj/project.pbxproj: |
| * config.h: |
| * postprocess-headers.sh: |
| * shell/CMakeLists.txt: |
| * testmem/testmem.mm: |
| |
| 2018-07-25 Andy VanWagoner <andy@vanwagoner.family> |
| |
| [INTL] Call Typed Array elements toLocaleString with locale and options |
| https://bugs.webkit.org/show_bug.cgi?id=185796 |
| |
| Reviewed by Keith Miller. |
| |
| Improve ECMA 402 compliance of typed array toLocaleString, passing along |
| the locale and options to element toLocaleString calls. |
| |
| * builtins/TypedArrayPrototype.js: |
| (toLocaleString): |
| |
| 2018-07-25 Andy VanWagoner <andy@vanwagoner.family> |
| |
| [INTL] Intl constructor lengths should be configurable |
| https://bugs.webkit.org/show_bug.cgi?id=187960 |
| |
| Reviewed by Saam Barati. |
| |
| Removed DontDelete from Intl constructor lengths. |
| Fixed DateTimeFormat formatToParts length. |
| |
| * runtime/IntlCollatorConstructor.cpp: |
| (JSC::IntlCollatorConstructor::finishCreation): |
| * runtime/IntlDateTimeFormatConstructor.cpp: |
| (JSC::IntlDateTimeFormatConstructor::finishCreation): |
| * runtime/IntlDateTimeFormatPrototype.cpp: |
| (JSC::IntlDateTimeFormatPrototype::finishCreation): |
| * runtime/IntlNumberFormatConstructor.cpp: |
| (JSC::IntlNumberFormatConstructor::finishCreation): |
| * runtime/IntlPluralRulesConstructor.cpp: |
| (JSC::IntlPluralRulesConstructor::finishCreation): |
| |
| 2018-07-24 Fujii Hironori <Hironori.Fujii@sony.com> |
| |
| runJITThreadLimitTests is failing |
| https://bugs.webkit.org/show_bug.cgi?id=187886 |
| <rdar://problem/42561966> |
| |
| Unreviewed build fix for MSVC. |
| |
| MSVC doen't support ternary operator without second operand. |
| |
| * dfg/DFGWorklist.cpp: |
| (JSC::DFG::getNumberOfDFGCompilerThreads): |
| (JSC::DFG::getNumberOfFTLCompilerThreads): |
| |
| 2018-07-24 Commit Queue <commit-queue@webkit.org> |
| |
| Unreviewed, rolling out r234183. |
| https://bugs.webkit.org/show_bug.cgi?id=187983 |
| |
| cause regression in Kraken gaussian blur and desaturate |
| (Requested by yusukesuzuki on #webkit). |
| |
| Reverted changeset: |
| |
| "[JSC] Record CoW status in ArrayProfile" |
| https://bugs.webkit.org/show_bug.cgi?id=187949 |
| https://trac.webkit.org/changeset/234183 |
| |
| 2018-07-24 Yusuke Suzuki <utatane.tea@gmail.com> |
| |
| [JSC] Record CoW status in ArrayProfile |
| https://bugs.webkit.org/show_bug.cgi?id=187949 |
| |
| Reviewed by Saam Barati. |
| |
| Once CoW array is converted to non-CoW array, subsequent operations are done for this non-CoW array. |
| Even though these operations are performed onto both CoW and non-CoW arrays in the code, array profiles |
| in these code typically record only non-CoW arrays since array profiles hold only one StructureID recently |
| seen. This results emitting CheckStructure for non-CoW arrays in DFG, and it soon causes OSR exits due to |
| CoW arrays. |
| |
| In this patch, we record CoW status in ArrayProfile separately to construct more appropriate DFG::ArrayMode |
| speculation. To do so efficiently, we store union of seen IndexingMode in ArrayProfile. |
| |
| This patch removes one of Kraken/stanford-crypto-aes's OSR exit reason, and improves the performance by 6-7%. |
| |
| baseline patched |
| |
| stanford-crypto-aes 60.893+-1.346 ^ 57.412+-1.298 ^ definitely 1.0606x faster |
| stanford-crypto-ccm 62.124+-1.992 58.921+-1.844 might be 1.0544x faster |
| |
| * bytecode/ArrayProfile.cpp: |
| (JSC::ArrayProfile::briefDescriptionWithoutUpdating): |
| * bytecode/ArrayProfile.h: |
| (JSC::asArrayModes): |
| We simplify asArrayModes instead of giving up Int8ArrayMode - Float64ArrayMode contiguous sequence. |
| |
| (JSC::ArrayProfile::ArrayProfile): |
| (JSC::ArrayProfile::addressOfObservedIndexingModes): |
| (JSC::ArrayProfile::observedIndexingModes const): |
| Currently, our macro assembler and offlineasm only support `or32` / `ori` operation onto addresses. |
| So storing the union of seen IndexingMode in `unsigned` instead. |
| |
| * dfg/DFGArrayMode.cpp: |
| (JSC::DFG::ArrayMode::fromObserved): |
| * dfg/DFGArrayMode.h: |
| (JSC::DFG::ArrayMode::withProfile const): |
| * jit/JITCall.cpp: |
| (JSC::JIT::compileOpCall): |
| * jit/JITCall32_64.cpp: |
| (JSC::JIT::compileOpCall): |
| * jit/JITInlines.h: |
| (JSC::JIT::emitArrayProfilingSiteWithCell): |
| * llint/LowLevelInterpreter.asm: |
| * llint/LowLevelInterpreter32_64.asm: |
| * llint/LowLevelInterpreter64.asm: |
| |
| 2018-07-24 Tim Horton <timothy_horton@apple.com> |
| |
| Enable Web Content Filtering on watchOS |
| https://bugs.webkit.org/show_bug.cgi?id=187979 |
| <rdar://problem/42559346> |
| |
| Reviewed by Wenson Hsieh. |
| |
| * Configurations/FeatureDefines.xcconfig: |
| |
| 2018-07-24 Tadeu Zagallo <tzagallo@apple.com> |
| |
| Don't modify Options when setting JIT thread limits |
| https://bugs.webkit.org/show_bug.cgi?id=187886 |
| |
| Reviewed by Filip Pizlo. |
| |
| Previously, when setting the JIT thread limit prior to the worklist |
| initialization, it'd be set via Options, which didn't work if Options |
| hadn't been initialized yet. Change it to use a static variable in the |
| Worklist instead. |
| |
| * API/JSVirtualMachine.mm: |
| (+[JSVirtualMachine setNumberOfDFGCompilerThreads:]): |
| (+[JSVirtualMachine setNumberOfFTLCompilerThreads:]): |
| * API/tests/testapi.mm: |
| (testObjectiveCAPIMain): |
| * dfg/DFGWorklist.cpp: |
| (JSC::DFG::getNumberOfDFGCompilerThreads): |
| (JSC::DFG::getNumberOfFTLCompilerThreads): |
| (JSC::DFG::setNumberOfDFGCompilerThreads): |
| (JSC::DFG::setNumberOfFTLCompilerThreads): |
| (JSC::DFG::ensureGlobalDFGWorklist): |
| (JSC::DFG::ensureGlobalFTLWorklist): |
| * dfg/DFGWorklist.h: |
| |
| 2018-07-24 Mark Lam <mark.lam@apple.com> |
| |
| Refactoring: make DFG::Plan a class. |
| https://bugs.webkit.org/show_bug.cgi?id=187968 |
| |
| Reviewed by Saam Barati. |
| |
| This patch makes all the DFG::Plan fields private, and provide accessor methods |
| for them. This makes it easier to reason about how these fields are used and |
| modified. |
| |
| * dfg/DFGAbstractInterpreterInlines.h: |
| (JSC::DFG::AbstractInterpreter<AbstractStateType>::executeEffects): |
| * dfg/DFGByteCodeParser.cpp: |
| (JSC::DFG::ByteCodeParser::handleCall): |
| (JSC::DFG::ByteCodeParser::handleVarargsCall): |
| (JSC::DFG::ByteCodeParser::handleInlining): |
| (JSC::DFG::ByteCodeParser::handleIntrinsicCall): |
| (JSC::DFG::ByteCodeParser::handleDOMJITGetter): |
| (JSC::DFG::ByteCodeParser::handleModuleNamespaceLoad): |
| (JSC::DFG::ByteCodeParser::handleGetById): |
| (JSC::DFG::ByteCodeParser::handlePutById): |
| (JSC::DFG::ByteCodeParser::parseBlock): |
| (JSC::DFG::ByteCodeParser::InlineStackEntry::InlineStackEntry): |
| (JSC::DFG::ByteCodeParser::parseCodeBlock): |
| (JSC::DFG::ByteCodeParser::parse): |
| * dfg/DFGCFAPhase.cpp: |
| (JSC::DFG::CFAPhase::run): |
| (JSC::DFG::CFAPhase::injectOSR): |
| * dfg/DFGClobberize.h: |
| (JSC::DFG::clobberize): |
| * dfg/DFGCommonData.cpp: |
| (JSC::DFG::CommonData::notifyCompilingStructureTransition): |
| * dfg/DFGCommonData.h: |
| * dfg/DFGConstantFoldingPhase.cpp: |
| (JSC::DFG::ConstantFoldingPhase::foldConstants): |
| * dfg/DFGDriver.cpp: |
| (JSC::DFG::compileImpl): |
| * dfg/DFGFinalizer.h: |
| * dfg/DFGFixupPhase.cpp: |
| (JSC::DFG::FixupPhase::fixupNode): |
| (JSC::DFG::FixupPhase::fixupCompareStrictEqAndSameValue): |
| * dfg/DFGGraph.cpp: |
| (JSC::DFG::Graph::Graph): |
| (JSC::DFG::Graph::watchCondition): |
| (JSC::DFG::Graph::inferredTypeFor): |
| (JSC::DFG::Graph::requiredRegisterCountForExit): |
| (JSC::DFG::Graph::registerFrozenValues): |
| (JSC::DFG::Graph::registerStructure): |
| (JSC::DFG::Graph::registerAndWatchStructureTransition): |
| (JSC::DFG::Graph::assertIsRegistered): |
| * dfg/DFGGraph.h: |
| (JSC::DFG::Graph::compilation): |
| (JSC::DFG::Graph::identifiers): |
| (JSC::DFG::Graph::watchpoints): |
| * dfg/DFGJITCompiler.cpp: |
| (JSC::DFG::JITCompiler::JITCompiler): |
| (JSC::DFG::JITCompiler::link): |
| (JSC::DFG::JITCompiler::compile): |
| (JSC::DFG::JITCompiler::compileFunction): |
| (JSC::DFG::JITCompiler::disassemble): |
| * dfg/DFGJITCompiler.h: |
| (JSC::DFG::JITCompiler::addWeakReference): |
| * dfg/DFGJITFinalizer.cpp: |
| (JSC::DFG::JITFinalizer::finalize): |
| (JSC::DFG::JITFinalizer::finalizeFunction): |
| (JSC::DFG::JITFinalizer::finalizeCommon): |
| * dfg/DFGOSREntrypointCreationPhase.cpp: |
| (JSC::DFG::OSREntrypointCreationPhase::run): |
| * dfg/DFGPhase.cpp: |
| (JSC::DFG::Phase::beginPhase): |
| * dfg/DFGPhase.h: |
| (JSC::DFG::runAndLog): |
| * dfg/DFGPlan.cpp: |
| (JSC::DFG::Plan::Plan): |
| (JSC::DFG::Plan::computeCompileTimes const): |
| (JSC::DFG::Plan::reportCompileTimes const): |
| (JSC::DFG::Plan::compileInThread): |
| (JSC::DFG::Plan::compileInThreadImpl): |
| (JSC::DFG::Plan::isStillValid): |
| (JSC::DFG::Plan::reallyAdd): |
| (JSC::DFG::Plan::notifyCompiling): |
| (JSC::DFG::Plan::notifyReady): |
| (JSC::DFG::Plan::finalizeWithoutNotifyingCallback): |
| (JSC::DFG::Plan::finalizeAndNotifyCallback): |
| (JSC::DFG::Plan::key): |
| (JSC::DFG::Plan::checkLivenessAndVisitChildren): |
| (JSC::DFG::Plan::finalizeInGC): |
| (JSC::DFG::Plan::isKnownToBeLiveDuringGC): |
| (JSC::DFG::Plan::cancel): |
| (JSC::DFG::Plan::cleanMustHandleValuesIfNecessary): |
| * dfg/DFGPlan.h: |
| (JSC::DFG::Plan::canTierUpAndOSREnter const): |
| (JSC::DFG::Plan::vm const): |
| (JSC::DFG::Plan::codeBlock): |
| (JSC::DFG::Plan::mode const): |
| (JSC::DFG::Plan::osrEntryBytecodeIndex const): |
| (JSC::DFG::Plan::mustHandleValues const): |
| (JSC::DFG::Plan::threadData const): |
| (JSC::DFG::Plan::compilation const): |
| (JSC::DFG::Plan::finalizer const): |
| (JSC::DFG::Plan::setFinalizer): |
| (JSC::DFG::Plan::inlineCallFrames const): |
| (JSC::DFG::Plan::watchpoints): |
| (JSC::DFG::Plan::identifiers): |
| (JSC::DFG::Plan::weakReferences): |
| (JSC::DFG::Plan::transitions): |
| (JSC::DFG::Plan::recordedStatuses): |
| (JSC::DFG::Plan::willTryToTierUp const): |
| (JSC::DFG::Plan::setWillTryToTierUp): |
| (JSC::DFG::Plan::tierUpInLoopHierarchy): |
| (JSC::DFG::Plan::tierUpAndOSREnterBytecodes): |
| (JSC::DFG::Plan::stage const): |
| (JSC::DFG::Plan::callback const): |
| (JSC::DFG::Plan::setCallback): |
| * dfg/DFGPlanInlines.h: |
| (JSC::DFG::Plan::iterateCodeBlocksForGC): |
| * dfg/DFGPreciseLocalClobberize.h: |
| (JSC::DFG::PreciseLocalClobberizeAdaptor::readTop): |
| * dfg/DFGPredictionInjectionPhase.cpp: |
| (JSC::DFG::PredictionInjectionPhase::run): |
| * dfg/DFGSafepoint.cpp: |
| (JSC::DFG::Safepoint::Safepoint): |
| (JSC::DFG::Safepoint::~Safepoint): |
| (JSC::DFG::Safepoint::begin): |
| * dfg/DFGSafepoint.h: |
| * dfg/DFGSpeculativeJIT.h: |
| (JSC::DFG::SpeculativeJIT::TrustedImmPtr::weakPointer): |
| (JSC::DFG::SpeculativeJIT::TrustedImmPtr::weakPoisonedPointer): |
| * dfg/DFGStackLayoutPhase.cpp: |
| (JSC::DFG::StackLayoutPhase::run): |
| * dfg/DFGStrengthReductionPhase.cpp: |
| (JSC::DFG::StrengthReductionPhase::handleNode): |
| * dfg/DFGTierUpCheckInjectionPhase.cpp: |
| (JSC::DFG::TierUpCheckInjectionPhase::run): |
| * dfg/DFGTypeCheckHoistingPhase.cpp: |
| (JSC::DFG::TypeCheckHoistingPhase::disableHoistingAcrossOSREntries): |
| * dfg/DFGWorklist.cpp: |
| (JSC::DFG::Worklist::isActiveForVM const): |
| (JSC::DFG::Worklist::compilationState): |
| (JSC::DFG::Worklist::waitUntilAllPlansForVMAreReady): |
| (JSC::DFG::Worklist::removeAllReadyPlansForVM): |
| (JSC::DFG::Worklist::completeAllReadyPlansForVM): |
| (JSC::DFG::Worklist::visitWeakReferences): |
| (JSC::DFG::Worklist::removeDeadPlans): |
| (JSC::DFG::Worklist::removeNonCompilingPlansForVM): |
| * dfg/DFGWorklistInlines.h: |
| (JSC::DFG::Worklist::iterateCodeBlocksForGC): |
| * ftl/FTLCompile.cpp: |
| (JSC::FTL::compile): |
| * ftl/FTLFail.cpp: |
| (JSC::FTL::fail): |
| * ftl/FTLJITFinalizer.cpp: |
| (JSC::FTL::JITFinalizer::finalizeCommon): |
| * ftl/FTLLink.cpp: |
| (JSC::FTL::link): |
| * ftl/FTLLowerDFGToB3.cpp: |
| (JSC::FTL::DFG::LowerDFGToB3::compileMultiPutByOffset): |
| (JSC::FTL::DFG::LowerDFGToB3::buildExitArguments): |
| (JSC::FTL::DFG::LowerDFGToB3::addWeakReference): |
| * ftl/FTLState.cpp: |
| (JSC::FTL::State::State): |
| |
| 2018-07-24 Saam Barati <sbarati@apple.com> |
| |
| Make VM::canUseJIT an inlined function |
| https://bugs.webkit.org/show_bug.cgi?id=187583 |
| |
| Reviewed by Mark Lam. |
| |
| We know the answer to this query in initializeThreading after initializing |
| the executable allocator. This patch makes it so that we just hold this value |
| in a static variable and have an inlined function that just returns the value |
| of that static variable. |
| |
| * runtime/InitializeThreading.cpp: |
| (JSC::initializeThreading): |
| * runtime/VM.cpp: |
| (JSC::VM::computeCanUseJIT): |
| (JSC::VM::canUseJIT): Deleted. |
| * runtime/VM.h: |
| (JSC::VM::canUseJIT): |
| |
| 2018-07-24 Mark Lam <mark.lam@apple.com> |
| |
| Placate exception check verification after recent changes. |
| https://bugs.webkit.org/show_bug.cgi?id=187961 |
| <rdar://problem/42545394> |
| |
| Reviewed by Saam Barati. |
| |
| * runtime/IntlObject.cpp: |
| (JSC::intlNumberOption): |
| |
| 2018-07-23 Saam Barati <sbarati@apple.com> |
| |
| need to didFoldClobberWorld when we constant fold GetByVal |
| https://bugs.webkit.org/show_bug.cgi?id=187917 |
| <rdar://problem/42505095> |
| |
| Reviewed by Yusuke Suzuki. |
| |
| * dfg/DFGAbstractInterpreterInlines.h: |
| (JSC::DFG::AbstractInterpreter<AbstractStateType>::executeEffects): |
| |
| 2018-07-23 Andy VanWagoner <andy@vanwagoner.family> |
| |
| [INTL] Language tags are not canonicalized |
| https://bugs.webkit.org/show_bug.cgi?id=185836 |
| |
| Reviewed by Keith Miller. |
| |
| Canonicalize language tags, replacing deprecated tag parts with the |
| preferred values. Remove broken support for algorithmic numbering systems, |
| that can cause an error in icu, and are not supported in other engines. |
| |
| Generate the lookup functions from the language-subtag-registry. |
| |
| Also initialize the UNumberFormat in initializeNumberFormat so any |
| failures are thrown immediately instead of failing to format later. |
| |
| * CMakeLists.txt: |
| * DerivedSources.make: |
| * JavaScriptCore.xcodeproj/project.pbxproj: |
| * Scripts/generateIntlCanonicalizeLanguage.py: Added. |
| * runtime/IntlDateTimeFormat.cpp: |
| (JSC::IntlDateTimeFormat::initializeDateTimeFormat): |
| * runtime/IntlNumberFormat.cpp: |
| (JSC::IntlNumberFormat::initializeNumberFormat): |
| (JSC::IntlNumberFormat::formatNumber): |
| (JSC::IntlNumberFormat::formatToParts): |
| (JSC::IntlNumberFormat::createNumberFormat): Deleted. |
| * runtime/IntlNumberFormat.h: |
| * runtime/IntlObject.cpp: |
| (JSC::intlNumberOption): |
| (JSC::intlDefaultNumberOption): |
| (JSC::preferredLanguage): |
| (JSC::preferredRegion): |
| (JSC::canonicalLangTag): |
| (JSC::canonicalizeLanguageTag): |
| (JSC::defaultLocale): |
| (JSC::removeUnicodeLocaleExtension): |
| (JSC::numberingSystemsForLocale): |
| (JSC::grandfatheredLangTag): Deleted. |
| * runtime/IntlObject.h: |
| * runtime/IntlPluralRules.cpp: |
| (JSC::IntlPluralRules::initializePluralRules): |
| * runtime/JSGlobalObject.cpp: |
| (JSC::addMissingScriptLocales): |
| (JSC::JSGlobalObject::intlCollatorAvailableLocales): |
| (JSC::JSGlobalObject::intlDateTimeFormatAvailableLocales): |
| (JSC::JSGlobalObject::intlNumberFormatAvailableLocales): |
| (JSC::JSGlobalObject::intlPluralRulesAvailableLocales): |
| * ucd/language-subtag-registry.txt: Added. |
| |
| 2018-07-23 Mark Lam <mark.lam@apple.com> |
| |
| Add some asserts to help diagnose a crash. |
| https://bugs.webkit.org/show_bug.cgi?id=187915 |
| <rdar://problem/42508166> |
| |
| Reviewed by Michael Saboff. |
| |
| Add some asserts to verify that an CodeBlock alternative should always have a |
| non-null jitCode. Also change a RELEASE_ASSERT_NOT_REACHED() in |
| CodeBlock::setOptimizationThresholdBasedOnCompilationResult() to a RELEASE_ASSERT() |
| so that we'll retain the state of the variables that failed the assertion (again |
| to help with diagnosis). |
| |
| * bytecode/CodeBlock.cpp: |
| (JSC::CodeBlock::setAlternative): |
| (JSC::CodeBlock::setOptimizationThresholdBasedOnCompilationResult): |
| * dfg/DFGPlan.cpp: |
| (JSC::DFG::Plan::Plan): |
| |
| 2018-07-23 Filip Pizlo <fpizlo@apple.com> |
| |
| Unreviewed, fix no-JIT build. |
| |
| * bytecode/CallLinkStatus.cpp: |
| (JSC::CallLinkStatus::computeFor): |
| * bytecode/CodeBlock.cpp: |
| (JSC::CodeBlock::finalizeUnconditionally): |
| * bytecode/GetByIdStatus.cpp: |
| (JSC::GetByIdStatus::computeFor): |
| (JSC::GetByIdStatus::computeForStubInfoWithoutExitSiteFeedback): |
| * bytecode/InByIdStatus.cpp: |
| * bytecode/PutByIdStatus.cpp: |
| (JSC::PutByIdStatus::computeForStubInfo): |
| |
| 2018-07-22 Yusuke Suzuki <utatane.tea@gmail.com> |
| |
| [JSC] GetByIdVariant and InByIdVariant do not need slot base if they are not "hit" variants |
| https://bugs.webkit.org/show_bug.cgi?id=187891 |
| |
| Reviewed by Saam Barati. |
| |
| When merging GetByIdVariant and InByIdVariant, we accidentally make merging failed if |
| two variants are mergeable but they have "Miss" status. We make merging failed if |
| the merged OPCSet says hasOneSlotBaseCondition() is false. But it is only reasonable |
| if the variant has "Hit" status. This bug is revealed when we introduce CreateThis in FTL, |
| which patch have more chances to merge variants. |
| |
| This patch fixes this issue by checking `!isPropertyUnset()` / `isHit()`. PutByIdVariant |
| is not related since it does not use this check in Transition case. |
| |
| * bytecode/GetByIdVariant.cpp: |
| (JSC::GetByIdVariant::attemptToMerge): |
| * bytecode/InByIdVariant.cpp: |
| (JSC::InByIdVariant::attemptToMerge): |
| |
| 2018-07-22 Yusuke Suzuki <utatane.tea@gmail.com> |
| |
| [DFG] Fold GetByVal if the indexed value is non configurable and non writable |
| https://bugs.webkit.org/show_bug.cgi?id=186462 |
| |
| Reviewed by Saam Barati. |
| |
| Non-special DontDelete | ReadOnly properties mean that it won't be changed. If DFG AI can retrieve this |
| property, AI can fold it into a constant. This type of property can be seen when we use ES6 tagged templates. |
| Tagged templates' callsite includes indexed properties whose attributes are DontDelete | ReadOnly. |
| |
| This patch attempts to fold such properties into constant in DFG AI. The challenge is that DFG AI runs |
| concurrently with the mutator thread. In this patch, we insert WTF::storeStoreFence between value setting |
| and attributes setting. The attributes must be set after the corresponding value is set. If the loaded |
| attributes (with WTF::loadLoadFence) include DontDelete | ReadOnly, it means the given value won't be |
| changed and we can safely use it. We arrange our existing code to use this protocol. |
| |
| Since GetByVal folding requires the correct Structure & Butterfly pairs, it is only enabled in x86 architecture |
| since it is TSO. So, our WTF::storeStoreFence in SparseArrayValueMap is also emitted only in x86. |
| |
| This patch improves SixSpeed/template_string_tag.es6. |
| |
| baseline patched |
| |
| template_string_tag.es6 237.0301+-4.8374 ^ 9.8779+-0.3628 ^ definitely 23.9960x faster |
| |
| * dfg/DFGAbstractInterpreterInlines.h: |
| (JSC::DFG::AbstractInterpreter<AbstractStateType>::executeEffects): |
| * runtime/JSArray.cpp: |
| (JSC::JSArray::setLengthWithArrayStorage): |
| * runtime/JSObject.cpp: |
| (JSC::JSObject::enterDictionaryIndexingModeWhenArrayStorageAlreadyExists): |
| (JSC::JSObject::deletePropertyByIndex): |
| (JSC::JSObject::getOwnPropertyNames): |
| (JSC::putIndexedDescriptor): |
| (JSC::JSObject::defineOwnIndexedProperty): |
| (JSC::JSObject::attemptToInterceptPutByIndexOnHoleForPrototype): |
| (JSC::JSObject::putIndexedDescriptor): Deleted. |
| * runtime/JSObject.h: |
| * runtime/SparseArrayValueMap.cpp: |
| (JSC::SparseArrayValueMap::SparseArrayValueMap): |
| (JSC::SparseArrayValueMap::add): |
| (JSC::SparseArrayValueMap::putDirect): |
| (JSC::SparseArrayValueMap::getConcurrently): |
| (JSC::SparseArrayEntry::get const): |
| (JSC::SparseArrayEntry::getConcurrently const): |
| (JSC::SparseArrayEntry::put): |
| (JSC::SparseArrayEntry::getNonSparseMode const): |
| (JSC::SparseArrayValueMap::visitChildren): |
| (JSC::SparseArrayValueMap::~SparseArrayValueMap): Deleted. |
| * runtime/SparseArrayValueMap.h: |
| (JSC::SparseArrayEntry::SparseArrayEntry): |
| (JSC::SparseArrayEntry::attributes const): |
| (JSC::SparseArrayEntry::forceSet): |
| (JSC::SparseArrayEntry::asValue): |
| |
| 2018-06-02 Filip Pizlo <fpizlo@apple.com> |
| |
| We should support CreateThis in the FTL |
| https://bugs.webkit.org/show_bug.cgi?id=164904 |
| |
| Reviewed by Yusuke Suzuki. |
| |
| This started with Saam's patch to implement CreateThis in the FTL, but turned into a type |
| inference adventure. |
| |
| CreateThis in the FTL was a massive regression in raytrace because it disturbed that |
| benchmark's extremely perverse way of winning at type inference: |
| |
| - The benchmark wanted polyvariant devirtualization of an object construction helper. But, |
| the polyvariant profiler wasn't powerful enough to reliably devirtualize that code. So, the |
| benchmark was falling back to other mechanisms... |
| |
| - The construction helper could not tier up into the FTL. When the DFG compiled it, it would |
| see that the IC had 4 cases. That's too polymorphic for the DFG. So, the DFG would emit a |
| GetById. Shortly after the DFG compile, that get_by_id would see many more cases, but now |
| that the helper was compiled by the DFG, the baseline get_by_id would not see those cases. |
| The DFG's GetById would "hide" those cases. The number of cases the DFG's GetById would see |
| is larger than our polymorphic list limit (limit = 8, case count = 13, I think). |
| |
| Note that if the FTL compiles that construction helper, it sees the 4 cases, turns them |
| into a MultiGetByOffset, then suffers from exits when the new cases hit, and then exits to |
| baseline, which then sees those cases. Luckily, the FTL was not compiling the construction |
| helper because it had a CreateThis. |
| |
| - Compilations that inlined the construction helper would have gotten super lucky with |
| parse-time constant folding, so they knew what structure the input to the get_by_id would |
| have at parse time. This is only profitable if the get_by_id parsing computed a |
| GetByIdStatus that had a finite number of cases. Because the 13 cases were being hidden by |
| the DFG GetById and GetByIdStatus would only look at the baseline get_by_id, which had 4 |
| cases, we would indeed get a finite number of cases. The parser would then prune those |
| cases to just one - based on its knowledge of the structure - and that would result in that |
| get_by_id being folded at parse time to a constant. |
| |
| - The subsequent op_call would inline based on parse-time knowledge of that constant. |
| |
| This patch comprehensively fixes these issues, as well as other issues that come up along the |
| way. The short version is that raytrace was revealing sloppiness in our use of profiling for |
| type inference. This patch fixes the sloppiness by vastly expanding *polyvariant* profiling, |
| i.e. the profiling that considers call context. I was encouraged to do this by the fact that |
| even the old version of polyvariant profiling was a speed-up on JetStream, ARES-6, and |
| Speedometer 2 (it's easy to measure since it's a runtime flag). So, it seemed worthwhile to |
| attack raytrace's problem as a shortcoming of polyvariant profiling. |
| |
| - Polyvariant profiling now consults every DFG or FTL code block that participated in any |
| subset of the inline stack that includes the IC we're profiling. For example, if we have |
| an inline stack like foo->bar->baz, with baz on top, then we will consult DFG or FTL |
| compilations for foo, bar, and baz. In foo, we'll look up foo->bar->baz; in bar we'll look |
| up bar->baz; etc. This fixes two problems encountered in raytrace. First, it ensures that |
| a DFG GetById cannot hide anything from the profiling of that get_by_id, since the |
| polyvariant profiling code will always consult it. Second, it enables raytrace to benefit |
| from polyvariant profling. Previously, the polyvariant profiler would only look at the |
| previous DFG compilation of foo and look up foo->bar->baz. But that only works if DFG-foo |
| had inlined bar and then baz. It may not have done that, because those calls could have |
| required polyvariant profiling that was only available in the FTL. |
| |
| - A particularly interesting case is when some IC in foo-baseline is also available in |
| foo-DFG. This case is encountered by the polyvariant profiler as it walks the inline stack. |
| In the case of gathering profiling for foo-FTL, the polyvariant profiler finds foo-DFG via |
| the trivial case of no inline stack. This also means that if foo ever gets inlined, we will |
| find foo-DFG or foo-FTL in the final case of polyvariant profiling. In those cases, we now |
| merge the IC of foo-baseline and foo-DFG. This avoids lots of unnecessary recompilations, |
| because it warns us of historical polymorphism. Historical polymorphism usually means |
| future polymorphism. IC status code already had some merging functionality, but I needed to |
| beef it up a lot to make this work right. |
| |
| - Inlining an inline cache now preserves as much information as profiling. One challenge of |
| polyvariant profiling is that the FTL compile for bar (that includes bar->baz) could have |
| inlined an inline cache based on polyvariant profiling. So, when the FTL compile for foo |
| (that includes foo->bar->baz) asks bar what it knows about that IC inside bar->baz, it will |
| say "I don't have such an IC". At this point the DFG compilation that included that IC that |
| gave us the information that we used to inline the IC is no longer alive. To keep us from |
| losing the information we learned about the IC, there is now a RecordedStatuses data |
| structure that preserves the statuses we use for inlining ICs. We also filter those |
| statuses according to things we learn from AI. This further reduces the risk of information |
| about an IC being forgotten. |
| |
| - Exit profiling now considers whether or not an exit happened from inline code. This |
| protects us in the case where the not-inlined version of an IC exited a lot because of |
| polymorphism that doesn't exist in the inlined version. So, when using polyvariant |
| profiling data, we consider only inlined exits. |
| |
| - CallLinkInfo now records when it's repatched to the virtual call thunk. Previously, this |
| would clear the CallLinkInfo, so CallLinkStatus would fall back to the lastSeenCallee. It's |
| surprising that we've had this bug. |
| |
| Altogether this patch is performance-neutral in run-jsc-benchmarks, except for speed-ups in |
| microbenchmarks and a compile time regression. Octane/deltablue speeds up by ~5%. |
| Octane/raytrace is regressed by a minuscule amount, which we could make up by implementing |
| prototype access folding in the bytecode parser and constant folder. That would require some |
| significant new logic in GetByIdStatus. That would also require a new benchmark - we want to |
| have a test that captures raytrace's behavior in the case that the parser cannot fold the |
| get_by_id. |
| |
| This change is a 1.2% regression on V8Spider-CompileTime. That's a smaller regression than |
| recent compile time progressions, so I think that's an OK trade-off. Also, I would expect a |
| compile time regression anytime we fill in FTL coverage. |
| |
| This is neutral on JetStream, ARES-6, and Speedometer2. JetStream agrees that deltablue |
| speeds up and that raytrace slows down, but these changes balance out and don't affect the |
| overall score. In ARES-6, it looks like individual tests have some significant 1-2% speed-ups |
| or slow-downs. Air-steady is definitely ~1.5% faster. Basic-worst is probably 2% slower (p ~ |
| 0.1, so it's not very certain). The JetStream, ARES-6, and Speedometer2 overall scores don't |
| see a significant difference. In all three cases the difference is <0.5% with a high p value, |
| with JetStream and Speedometer2 being insignificant infinitesimal speed-ups and ARES-6 being |
| an insignificant infinitesimal slow-down. |
| |
| Oh, and this change means that the FTL now has 100% coverage of JavaScript. You could do an |
| eval in a for-in loop in a for-of loop inside a with block that uses try/catch for control |
| flow in a polymorphic constructor while having a bad time, and we'll still compile it. |
| |
| * CMakeLists.txt: |
| * JavaScriptCore.xcodeproj/project.pbxproj: |
| * Sources.txt: |
| * bytecode/ByValInfo.h: |
| * bytecode/BytecodeDumper.cpp: |
| (JSC::BytecodeDumper<Block>::printGetByIdCacheStatus): |
| (JSC::BytecodeDumper<Block>::printPutByIdCacheStatus): |
| (JSC::BytecodeDumper<Block>::printInByIdCacheStatus): |
| (JSC::BytecodeDumper<Block>::dumpCallLinkStatus): |
| (JSC::BytecodeDumper<CodeBlock>::dumpCallLinkStatus): |
| (JSC::BytecodeDumper<Block>::printCallOp): |
| (JSC::BytecodeDumper<Block>::dumpBytecode): |
| (JSC::BytecodeDumper<Block>::dumpBlock): |
| * bytecode/BytecodeDumper.h: |
| * bytecode/CallLinkInfo.h: |
| * bytecode/CallLinkStatus.cpp: |
| (JSC::CallLinkStatus::computeFor): |
| (JSC::CallLinkStatus::computeExitSiteData): |
| (JSC::CallLinkStatus::computeFromCallLinkInfo): |
| (JSC::CallLinkStatus::accountForExits): |
| (JSC::CallLinkStatus::finalize): |
| (JSC::CallLinkStatus::filter): |
| (JSC::CallLinkStatus::computeDFGStatuses): Deleted. |
| * bytecode/CallLinkStatus.h: |
| (JSC::CallLinkStatus::operator bool const): |
| (JSC::CallLinkStatus::operator! const): Deleted. |
| * bytecode/CallVariant.cpp: |
| (JSC::CallVariant::finalize): |
| (JSC::CallVariant::filter): |
| * bytecode/CallVariant.h: |
| (JSC::CallVariant::operator bool const): |
| (JSC::CallVariant::operator! const): Deleted. |
| * bytecode/CodeBlock.cpp: |
| (JSC::CodeBlock::dumpBytecode): |
| (JSC::CodeBlock::propagateTransitions): |
| (JSC::CodeBlock::finalizeUnconditionally): |
| (JSC::CodeBlock::getICStatusMap): |
| (JSC::CodeBlock::resetJITData): |
| (JSC::CodeBlock::getStubInfoMap): Deleted. |
| (JSC::CodeBlock::getCallLinkInfoMap): Deleted. |
| (JSC::CodeBlock::getByValInfoMap): Deleted. |
| * bytecode/CodeBlock.h: |
| * bytecode/CodeOrigin.cpp: |
| (JSC::CodeOrigin::isApproximatelyEqualTo const): |
| (JSC::CodeOrigin::approximateHash const): |
| * bytecode/CodeOrigin.h: |
| (JSC::CodeOrigin::exitingInlineKind const): |
| * bytecode/DFGExitProfile.cpp: |
| (JSC::DFG::FrequentExitSite::dump const): |
| (JSC::DFG::ExitProfile::add): |
| * bytecode/DFGExitProfile.h: |
| (JSC::DFG::FrequentExitSite::FrequentExitSite): |
| (JSC::DFG::FrequentExitSite::operator== const): |
| (JSC::DFG::FrequentExitSite::subsumes const): |
| (JSC::DFG::FrequentExitSite::hash const): |
| (JSC::DFG::FrequentExitSite::inlineKind const): |
| (JSC::DFG::FrequentExitSite::withInlineKind const): |
| (JSC::DFG::QueryableExitProfile::hasExitSite const): |
| (JSC::DFG::QueryableExitProfile::hasExitSiteWithSpecificJITType const): |
| (JSC::DFG::QueryableExitProfile::hasExitSiteWithSpecificInlineKind const): |
| * bytecode/ExitFlag.cpp: Added. |
| (JSC::ExitFlag::dump const): |
| * bytecode/ExitFlag.h: Added. |
| (JSC::ExitFlag::ExitFlag): |
| (JSC::ExitFlag::operator| const): |
| (JSC::ExitFlag::operator|=): |
| (JSC::ExitFlag::operator& const): |
| (JSC::ExitFlag::operator&=): |
| (JSC::ExitFlag::operator bool const): |
| (JSC::ExitFlag::isSet const): |
| * bytecode/ExitingInlineKind.cpp: Added. |
| (WTF::printInternal): |
| * bytecode/ExitingInlineKind.h: Added. |
| * bytecode/GetByIdStatus.cpp: |
| (JSC::GetByIdStatus::computeFor): |
| (JSC::GetByIdStatus::computeForStubInfo): |
| (JSC::GetByIdStatus::slowVersion const): |
| (JSC::GetByIdStatus::markIfCheap): |
| (JSC::GetByIdStatus::finalize): |
| (JSC::GetByIdStatus::hasExitSite): Deleted. |
| * bytecode/GetByIdStatus.h: |
| * bytecode/GetByIdVariant.cpp: |
| (JSC::GetByIdVariant::markIfCheap): |
| (JSC::GetByIdVariant::finalize): |
| * bytecode/GetByIdVariant.h: |
| * bytecode/ICStatusMap.cpp: Added. |
| (JSC::ICStatusContext::get const): |
| (JSC::ICStatusContext::isInlined const): |
| (JSC::ICStatusContext::inlineKind const): |
| * bytecode/ICStatusMap.h: Added. |
| * bytecode/ICStatusUtils.cpp: Added. |
| (JSC::hasBadCacheExitSite): |
| * bytecode/ICStatusUtils.h: |
| * bytecode/InstanceOfStatus.cpp: |
| (JSC::InstanceOfStatus::computeFor): |
| * bytecode/InstanceOfStatus.h: |
| * bytecode/PolyProtoAccessChain.h: |
| * bytecode/PutByIdStatus.cpp: |
| (JSC::PutByIdStatus::hasExitSite): |
| (JSC::PutByIdStatus::computeFor): |
| (JSC::PutByIdStatus::slowVersion const): |
| (JSC::PutByIdStatus::markIfCheap): |
| (JSC::PutByIdStatus::finalize): |
| (JSC::PutByIdStatus::filter): |
| * bytecode/PutByIdStatus.h: |
| * bytecode/PutByIdVariant.cpp: |
| (JSC::PutByIdVariant::markIfCheap): |
| (JSC::PutByIdVariant::finalize): |
| * bytecode/PutByIdVariant.h: |
| (JSC::PutByIdVariant::structureSet const): |
| * bytecode/RecordedStatuses.cpp: Added. |
| (JSC::RecordedStatuses::operator=): |
| (JSC::RecordedStatuses::RecordedStatuses): |
| (JSC::RecordedStatuses::addCallLinkStatus): |
| (JSC::RecordedStatuses::addGetByIdStatus): |
| (JSC::RecordedStatuses::addPutByIdStatus): |
| (JSC::RecordedStatuses::markIfCheap): |
| (JSC::RecordedStatuses::finalizeWithoutDeleting): |
| (JSC::RecordedStatuses::finalize): |
| (JSC::RecordedStatuses::shrinkToFit): |
| * bytecode/RecordedStatuses.h: Added. |
| (JSC::RecordedStatuses::RecordedStatuses): |
| (JSC::RecordedStatuses::forEachVector): |
| * bytecode/StructureSet.cpp: |
| (JSC::StructureSet::markIfCheap const): |
| (JSC::StructureSet::isStillAlive const): |
| * bytecode/StructureSet.h: |
| * bytecode/TerminatedCodeOrigin.h: Added. |
| (JSC::TerminatedCodeOrigin::TerminatedCodeOrigin): |
| (JSC::TerminatedCodeOriginHashTranslator::hash): |
| (JSC::TerminatedCodeOriginHashTranslator::equal): |
| * bytecode/Watchpoint.cpp: |
| (WTF::printInternal): |
| * bytecode/Watchpoint.h: |
| * dfg/DFGAbstractInterpreter.h: |
| * dfg/DFGAbstractInterpreterInlines.h: |
| (JSC::DFG::AbstractInterpreter<AbstractStateType>::executeEffects): |
| (JSC::DFG::AbstractInterpreter<AbstractStateType>::filterICStatus): |
| * dfg/DFGByteCodeParser.cpp: |
| (JSC::DFG::ByteCodeParser::handleCall): |
| (JSC::DFG::ByteCodeParser::handleVarargsCall): |
| (JSC::DFG::ByteCodeParser::handleDOMJITGetter): |
| (JSC::DFG::ByteCodeParser::handleModuleNamespaceLoad): |
| (JSC::DFG::ByteCodeParser::handleGetById): |
| (JSC::DFG::ByteCodeParser::handlePutById): |
| (JSC::DFG::ByteCodeParser::parseBlock): |
| (JSC::DFG::ByteCodeParser::InlineStackEntry::InlineStackEntry): |
| (JSC::DFG::ByteCodeParser::InlineStackEntry::~InlineStackEntry): |
| (JSC::DFG::ByteCodeParser::parse): |
| * dfg/DFGClobberize.h: |
| (JSC::DFG::clobberize): |
| * dfg/DFGClobbersExitState.cpp: |
| (JSC::DFG::clobbersExitState): |
| * dfg/DFGCommonData.h: |
| * dfg/DFGConstantFoldingPhase.cpp: |
| (JSC::DFG::ConstantFoldingPhase::foldConstants): |
| * dfg/DFGDesiredWatchpoints.h: |
| (JSC::DFG::SetPointerAdaptor::hasBeenInvalidated): |
| * dfg/DFGDoesGC.cpp: |
| (JSC::DFG::doesGC): |
| * dfg/DFGFixupPhase.cpp: |
| (JSC::DFG::FixupPhase::fixupNode): |
| * dfg/DFGGraph.cpp: |
| (JSC::DFG::Graph::dump): |
| * dfg/DFGMayExit.cpp: |
| * dfg/DFGNode.h: |
| (JSC::DFG::Node::hasCallLinkStatus): |
| (JSC::DFG::Node::callLinkStatus): |
| (JSC::DFG::Node::hasGetByIdStatus): |
| (JSC::DFG::Node::getByIdStatus): |
| (JSC::DFG::Node::hasPutByIdStatus): |
| (JSC::DFG::Node::putByIdStatus): |
| * dfg/DFGNodeType.h: |
| * dfg/DFGOSRExitBase.cpp: |
| (JSC::DFG::OSRExitBase::considerAddingAsFrequentExitSiteSlow): |
| * dfg/DFGObjectAllocationSinkingPhase.cpp: |
| * dfg/DFGPlan.cpp: |
| (JSC::DFG::Plan::reallyAdd): |
| (JSC::DFG::Plan::checkLivenessAndVisitChildren): |
| (JSC::DFG::Plan::finalizeInGC): |
| * dfg/DFGPlan.h: |
| * dfg/DFGPredictionPropagationPhase.cpp: |
| * dfg/DFGSafeToExecute.h: |
| (JSC::DFG::safeToExecute): |
| * dfg/DFGSpeculativeJIT32_64.cpp: |
| (JSC::DFG::SpeculativeJIT::compile): |
| * dfg/DFGSpeculativeJIT64.cpp: |
| (JSC::DFG::SpeculativeJIT::compile): |
| * dfg/DFGStrengthReductionPhase.cpp: |
| (JSC::DFG::StrengthReductionPhase::handleNode): |
| * dfg/DFGWorklist.cpp: |
| (JSC::DFG::Worklist::removeDeadPlans): |
| * ftl/FTLAbstractHeapRepository.h: |
| * ftl/FTLCapabilities.cpp: |
| (JSC::FTL::canCompile): |
| * ftl/FTLLowerDFGToB3.cpp: |
| (JSC::FTL::DFG::LowerDFGToB3::compileNode): |
| (JSC::FTL::DFG::LowerDFGToB3::compileCreateThis): |
| (JSC::FTL::DFG::LowerDFGToB3::compileFilterICStatus): |
| * jit/PolymorphicCallStubRoutine.cpp: |
| (JSC::PolymorphicCallStubRoutine::hasEdges const): |
| (JSC::PolymorphicCallStubRoutine::edges const): |
| * jit/PolymorphicCallStubRoutine.h: |
| * profiler/ProfilerBytecodeSequence.cpp: |
| (JSC::Profiler::BytecodeSequence::BytecodeSequence): |
| * runtime/FunctionRareData.cpp: |
| (JSC::FunctionRareData::initializeObjectAllocationProfile): |
| * runtime/Options.h: |
| |
| 2018-07-21 Yusuke Suzuki <utatane.tea@gmail.com> |
| |
| [JSC] Use Function / ScopedLambda / RecursableLambda instead of std::function |
| https://bugs.webkit.org/show_bug.cgi?id=187472 |
| |
| Reviewed by Mark Lam. |
| |
| std::function allocates memory from standard malloc instead of bmalloc. Instead of |
| using that, we should use WTF::{Function,ScopedLambda,RecursableLambda}. |
| |
| This patch attempts to replace std::function with the above WTF function types. |
| If the function's lifetime can be the same to the stack, we can use ScopedLambda, which |
| is really efficient. Otherwise, we should use WTF::Function. |
| For recurring use cases, we can use RecursableLambda. |
| |
| * assembler/MacroAssembler.cpp: |
| (JSC::stdFunctionCallback): |
| (JSC::MacroAssembler::probe): |
| * assembler/MacroAssembler.h: |
| * b3/air/AirDisassembler.cpp: |
| (JSC::B3::Air::Disassembler::dump): |
| * b3/air/AirDisassembler.h: |
| * bytecompiler/BytecodeGenerator.cpp: |
| (JSC::BytecodeGenerator::BytecodeGenerator): |
| (JSC::BytecodeGenerator::initializeDefaultParameterValuesAndSetupFunctionScopeStack): |
| (JSC::BytecodeGenerator::emitEnumeration): |
| * bytecompiler/BytecodeGenerator.h: |
| * bytecompiler/NodesCodegen.cpp: |
| (JSC::ArrayNode::emitBytecode): |
| (JSC::ApplyFunctionCallDotNode::emitBytecode): |
| (JSC::ForOfNode::emitBytecode): |
| * dfg/DFGSpeculativeJIT.cpp: |
| (JSC::DFG::SpeculativeJIT::addSlowPathGeneratorLambda): |
| (JSC::DFG::SpeculativeJIT::compileMathIC): |
| * dfg/DFGSpeculativeJIT.h: |
| * dfg/DFGSpeculativeJIT64.cpp: |
| (JSC::DFG::SpeculativeJIT::compile): |
| * dfg/DFGValidate.cpp: |
| * ftl/FTLCompile.cpp: |
| (JSC::FTL::compile): |
| * heap/HeapSnapshotBuilder.cpp: |
| (JSC::HeapSnapshotBuilder::json): |
| * heap/HeapSnapshotBuilder.h: |
| * interpreter/StackVisitor.cpp: |
| (JSC::StackVisitor::Frame::dump const): |
| * interpreter/StackVisitor.h: |
| * runtime/PromiseDeferredTimer.h: |
| * runtime/VM.cpp: |
| (JSC::VM::whenIdle): |
| (JSC::enableProfilerWithRespectToCount): |
| (JSC::disableProfilerWithRespectToCount): |
| * runtime/VM.h: |
| * runtime/VMEntryScope.cpp: |
| (JSC::VMEntryScope::addDidPopListener): |
| * runtime/VMEntryScope.h: |
| * tools/HeapVerifier.cpp: |
| (JSC::HeapVerifier::verifyCellList): |
| (JSC::HeapVerifier::validateCell): |
| (JSC::HeapVerifier::validateJSCell): |
| * tools/HeapVerifier.h: |
| |
| 2018-07-20 Michael Saboff <msaboff@apple.com> |
| |
| DFG AbstractInterpreter: CheckArray filters array modes for DirectArguments/ScopedArguments using only NonArray |
| https://bugs.webkit.org/show_bug.cgi?id=187827 |
| rdar://problem/42146858 |
| |
| Reviewed by Saam Barati. |
| |
| When filtering array modes for DirectArguments or ScopedArguments, we need to allow for the possibility |
| that they can either be NonArray or NonArrayWithArrayStorage (aka ArrayStorageShape). |
| We can't end up with other shapes, Int32, Double, etc because GenericArguments sets |
| InterceptsGetOwnPropertySlotByIndexEvenWhenLengthIsNotZero which will cause us to go down a |
| putByIndex() path that doesn't change the shape. |
| |
| * dfg/DFGArrayMode.h: |
| (JSC::DFG::ArrayMode::arrayModesThatPassFiltering const): |
| |
| 2018-07-20 Yusuke Suzuki <utatane.tea@gmail.com> |
| |
| [DFG] Fold GetByVal if Array is CoW |
| https://bugs.webkit.org/show_bug.cgi?id=186459 |
| |
| Reviewed by Saam Barati. |
| |
| CoW indexing type means that we now tracks the changes in CoW Array by structure. So DFG has a chance to |
| fold GetByVal if the given array is CoW. This patch folds GetByVal onto the CoW Array. If the structure |
| is watched and the butterfly is JSImmutableButterfly, we can load the value from this butterfly. |
| |
| This can be useful since these CoW arrays are used for a storage for constants. Constant-indexed access |
| to these constant arrays can be folded into an actual constant by this patch. |
| |
| baseline patched |
| |
| template_string.es6 4993.9853+-147.5308 ^ 824.1685+-44.1839 ^ definitely 6.0594x faster |
| template_string_tag.es5 67.0822+-2.0100 ^ 9.3540+-0.5376 ^ definitely 7.1715x faster |
| |
| * dfg/DFGAbstractInterpreterInlines.h: |
| (JSC::DFG::AbstractInterpreter<AbstractStateType>::executeEffects): |
| |
| 2018-07-20 Yusuke Suzuki <utatane.tea@gmail.com> |
| |
| [JSC] Remove cellLock in JSObject::convertContiguousToArrayStorage |
| https://bugs.webkit.org/show_bug.cgi?id=186602 |
| |
| Reviewed by Saam Barati. |
| |
| JSObject::convertContiguousToArrayStorage's cellLock() is not necessary since we do not |
| change the part of the butterfly, length etc. We prove that our procedure is safe, and |
| drop the cellLock() here. |
| |
| * runtime/JSObject.cpp: |
| (JSC::JSObject::convertContiguousToArrayStorage): |
| |
| 2018-07-20 Saam Barati <sbarati@apple.com> |
| |
| CompareEq should be using KnownOtherUse instead of OtherUse |
| https://bugs.webkit.org/show_bug.cgi?id=186814 |
| <rdar://problem/39720030> |
| |
| Reviewed by Filip Pizlo. |
| |
| CompareEq in fixup phase was doing this: |
| insertCheck(child, OtherUse) |
| setUseKind(child, OtherUse) |
| And in the DFG/FTL backend, it would not emit a check for OtherUse. This could |
| lead to edge verification crashing because a phase may optimize the check out |
| by removing the node. However, AI may not be privy to that optimization, and |
| AI may think the incoming value may not be Other. AI is expecting the DFG/FTL |
| backend to actually emit a check here, but it does not. |
| |
| This exact pattern is why we have KnownXYZ use kinds. This patch introduces |
| KnownOtherUse and changes the above pattern to be: |
| insertCheck(child, OtherUse) |
| setUseKind(child, KnownOtherUse) |
| |
| * dfg/DFGFixupPhase.cpp: |
| (JSC::DFG::FixupPhase::fixupNode): |
| * dfg/DFGSafeToExecute.h: |
| (JSC::DFG::SafeToExecuteEdge::operator()): |
| * dfg/DFGSpeculativeJIT.cpp: |
| (JSC::DFG::SpeculativeJIT::speculate): |
| * dfg/DFGUseKind.cpp: |
| (WTF::printInternal): |
| * dfg/DFGUseKind.h: |
| (JSC::DFG::typeFilterFor): |
| (JSC::DFG::shouldNotHaveTypeCheck): |
| (JSC::DFG::checkMayCrashIfInputIsEmpty): |
| * dfg/DFGWatchpointCollectionPhase.cpp: |
| (JSC::DFG::WatchpointCollectionPhase::handle): |
| * ftl/FTLCapabilities.cpp: |
| (JSC::FTL::canCompile): |
| * ftl/FTLLowerDFGToB3.cpp: |
| (JSC::FTL::DFG::LowerDFGToB3::compileCompareEq): |
| (JSC::FTL::DFG::LowerDFGToB3::speculate): |
| |
| 2018-07-20 Yusuke Suzuki <utatane.tea@gmail.com> |
| |
| [JSC] A bit performance improvement for Object.assign by cleaning up code |
| https://bugs.webkit.org/show_bug.cgi?id=187852 |
| |
| Reviewed by Saam Barati. |
| |
| We clean up Object.assign code a bit. |
| |
| 1. Vector and MarkedArgumentBuffer are extracted out from the loop since repeatedly creating MarkedArgumentBuffer is costly. |
| 2. canDoFastPath is not necessary. Restructuring the code to clean up things. |
| |
| It improves the performance a bit. |
| |
| baseline patched |
| |
| object-assign.es6 237.7719+-5.5175 231.2856+-4.6907 might be 1.0280x faster |
| |
| * runtime/ObjectConstructor.cpp: |
| (JSC::objectConstructorAssign): |
| |
| 2018-07-19 Carlos Garcia Campos <cgarcia@igalia.com> |
| |
| [GLIB] jsc_context_evaluate_in_object() should receive an instance when a JSCClass is given |
| https://bugs.webkit.org/show_bug.cgi?id=187798 |
| |
| Reviewed by Michael Catanzaro. |
| |
| Because a JSCClass is pretty much useless without an instance in this case. It should be similar to |
| jsc_value_new_object() because indeed we are creating a new object. This makes destroy function and vtable |
| functions to work. We can't use JSAPIWrapperObject to wrap this object, because it's a global object, so this |
| patch adds JSAPIWrapperGlobalObject or that. |
| |
| * API/glib/JSAPIWrapperGlobalObject.cpp: Added. |
| (jsAPIWrapperGlobalObjectHandleOwner): |
| (JSAPIWrapperGlobalObjectHandleOwner::finalize): |
| (JSC::JSCallbackObject<JSAPIWrapperGlobalObject>::createStructure): |
| (JSC::JSCallbackObject<JSAPIWrapperGlobalObject>::create): |
| (JSC::JSAPIWrapperGlobalObject::JSAPIWrapperGlobalObject): |
| (JSC::JSAPIWrapperGlobalObject::finishCreation): |
| (JSC::JSAPIWrapperGlobalObject::visitChildren): |
| * API/glib/JSAPIWrapperGlobalObject.h: Added. |
| (JSC::JSAPIWrapperGlobalObject::wrappedObject const): |
| (JSC::JSAPIWrapperGlobalObject::setWrappedObject): |
| * API/glib/JSCClass.cpp: |
| (isWrappedObject): Helper to check if the given object is a JSAPIWrapperObject or JSAPIWrapperGlobalObject. |
| (wrappedObjectClass): Return the class of a wrapped object. |
| (jscContextForObject): Get the execution context of an object. If the object is a JSAPIWrapperGlobalObject, the |
| scope extension global object is used instead. |
| (getProperty): Use isWrappedObject, wrappedObjectClass and jscContextForObject. |
| (setProperty): Ditto. |
| (hasProperty): Ditto. |
| (deleteProperty): Ditto. |
| (getPropertyNames): Ditto. |
| (jscClassCreateContextWithJSWrapper): Call jscContextCreateContextWithJSWrapper(). |
| * API/glib/JSCClassPrivate.h: |
| * API/glib/JSCContext.cpp: |
| (jscContextCreateContextWithJSWrapper): Call WrapperMap::createContextWithJSWrappper(). |
| (jsc_context_evaluate_in_object): Use jscClassCreateContextWithJSWrapper() when a JSCClass is given. |
| * API/glib/JSCContext.h: |
| * API/glib/JSCContextPrivate.h: |
| * API/glib/JSCWrapperMap.cpp: |
| (JSC::WrapperMap::createContextWithJSWrappper): Create the new context for jsc_context_evaluate_in_object() here |
| when a JSCClass is used to create the JSAPIWrapperGlobalObject. |
| (JSC::WrapperMap::wrappedObject const): Return the wrapped object also in case of JSAPIWrapperGlobalObject. |
| * API/glib/JSCWrapperMap.h: |
| * GLib.cmake: |
| |
| 2018-07-19 Saam Barati <sbarati@apple.com> |
| |
| Conservatively make Object.assign's fast path do a two phase protocol of loading everything then storing everything to try to prevent a crash |
| https://bugs.webkit.org/show_bug.cgi?id=187836 |
| <rdar://problem/42409527> |
| |
| Reviewed by Mark Lam. |
| |
| We have crash reports that we're crashing on source->getDirect in Object.assign's |
| fast path. Mark investigated this and determined we end up with a nullptr for |
| butterfly. This is curious, because source's Structure indicated that it has |
| out of line properties. My leading hypothesis for this at the moment is a bit |
| handwavy, but it's essentially: |
| - We end up firing a watchpoint when assigning to the target (this can happen |
| if a watchpoint was set up for storing to that particular field) |
| - When we fire that watchpoint, we end up doing some kind work on the source, |
| perhaps causing it to flattenDictionaryStructure. Therefore, we end up |
| mutating source. |
| |
| I'm not super convinced this is what we're running into, but just by reading |
| the code, I think it needs to be something similar to this. Seeing if this change |
| fixes the crasher will give us good data to determine if something like this is |
| happening or if the bug is something else entirely. |
| |
| * runtime/ObjectConstructor.cpp: |
| (JSC::objectConstructorAssign): |
| |
| 2018-07-19 Commit Queue <commit-queue@webkit.org> |
| |
| Unreviewed, rolling out r233998. |
| https://bugs.webkit.org/show_bug.cgi?id=187815 |
| |
| Not needed. (Requested by mlam|a on #webkit). |
| |
| Reverted changeset: |
| |
| "Temporarily mitigate a bug where a source provider is null |
| when it shouldn't be." |
| https://bugs.webkit.org/show_bug.cgi?id=187812 |
| https://trac.webkit.org/changeset/233998 |
| |
| 2018-07-19 Mark Lam <mark.lam@apple.com> |
| |
| Temporarily mitigate a bug where a source provider is null when it shouldn't be. |
| https://bugs.webkit.org/show_bug.cgi?id=187812 |
| <rdar://problem/41192691> |
| |
| Reviewed by Michael Saboff. |
| |
| Adding a null check to temporarily mitigate https://bugs.webkit.org/show_bug.cgi?id=187811. |
| |
| * runtime/Error.cpp: |
| (JSC::addErrorInfo): |
| |
| 2018-07-19 Keith Rollin <krollin@apple.com> |
| |
| Adjust WEBCORE_EXPORT annotations for LTO |
| https://bugs.webkit.org/show_bug.cgi?id=187781 |
| <rdar://problem/42351124> |
| |
| Reviewed by Alex Christensen. |
| |
| Continuation of Bug 186944. This bug addresses issues not caught |
| during the first pass of adjustments. The initial work focussed on |
| macOS; this one addresses issues found when building for iOS. From |
| 186944: |
| |
| Adjust a number of places that result in WebKit's |
| 'check-for-weak-vtables-and-externals' script reporting weak external |
| symbols: |
| |
| ERROR: WebCore has a weak external symbol in it (/Volumes/Data/dev/webkit/OpenSource/WebKitBuild/Release/WebCore.framework/Versions/A/WebCore) |
| ERROR: A weak external symbol is generated when a symbol is defined in multiple compilation units and is also marked as being exported from the library. |
| ERROR: A common cause of weak external symbols is when an inline function is listed in the linker export file. |
| ... |
| |
| These cases are caused by inline methods being marked with WTF_EXPORT |
| (or related macro) or with an inline function being in a class marked |
| as such, and when enabling LTO builds. |
| |
| For the most part, address these by removing the WEBCORE_EXPORT |
| annotation from inline methods. In some cases, move the implementation |
| out-of-line because it's the class that has the WEBCORE_EXPORT on it |
| and removing the annotation from the class would be too disruptive. |
| Finally, in other cases, move the implementation out-of-line because |
| check-for-weak-vtables-and-externals still complains when keeping the |
| implementation inline and removing the annotation; this seems to |
| typically (but not always) happen with destructors. |
| |
| * inspector/remote/RemoteAutomationTarget.cpp: |
| (Inspector::RemoteAutomationTarget::~RemoteAutomationTarget): |
| * inspector/remote/RemoteAutomationTarget.h: |
| * inspector/remote/RemoteInspector.cpp: |
| (Inspector::RemoteInspector::Client::~Client): |
| * inspector/remote/RemoteInspector.h: |
| |
| 2018-07-19 Yusuke Suzuki <utatane.tea@gmail.com> |
| |
| Unreviewed, check scope after performing getPropertySlot in JSON.stringify |
| https://bugs.webkit.org/show_bug.cgi?id=187807 |
| |
| Properly putting EXCEPTION_ASSERT to tell our exception checker mechanism |
| that we know that exception occurrence and handle it well. |
| |
| * runtime/JSONObject.cpp: |
| (JSC::Stringifier::Holder::appendNextProperty): |
| |
| 2018-07-18 Yusuke Suzuki <utatane.tea@gmail.com> |
| |
| [JSC] Reduce size of AST nodes |
| https://bugs.webkit.org/show_bug.cgi?id=187689 |
| |
| Reviewed by Mark Lam. |
| |
| We clean up AST nodes to reduce size. By doing so, we can reduce the memory consumption |
| of ParserArena at peak state. |
| |
| 1. Annotate `final` to AST nodes to make them solid. And it allows the compiler to |
| devirtualize a call to the function which are implemented in a final class. |
| |
| 2. Use default member initializers more. |
| |
| 3. And use `nullptr` instead of `0`. |
| |
| 4. Arrange the layout of AST nodes to reduce the size. It includes changing the order |
| of classes in multiple inheritance. In particular, StatementNode is decreased from 48 |
| to 40. This decreases the sizes of all the derived Statement nodes. |
| |
| * parser/NodeConstructors.h: |
| (JSC::Node::Node): |
| (JSC::StatementNode::StatementNode): |
| (JSC::ElementNode::ElementNode): |
| (JSC::ArrayNode::ArrayNode): |
| (JSC::PropertyListNode::PropertyListNode): |
| (JSC::ObjectLiteralNode::ObjectLiteralNode): |
| (JSC::ArgumentListNode::ArgumentListNode): |
| (JSC::ArgumentsNode::ArgumentsNode): |
| (JSC::NewExprNode::NewExprNode): |
| (JSC::BytecodeIntrinsicNode::BytecodeIntrinsicNode): |
| (JSC::BinaryOpNode::BinaryOpNode): |
| (JSC::LogicalOpNode::LogicalOpNode): |
| (JSC::CommaNode::CommaNode): |
| (JSC::SourceElements::SourceElements): |
| (JSC::ClauseListNode::ClauseListNode): |
| * parser/Nodes.cpp: |
| (JSC::FunctionMetadataNode::FunctionMetadataNode): |
| (JSC::FunctionMetadataNode::operator== const): |
| (JSC::FunctionMetadataNode::dump const): |
| * parser/Nodes.h: |
| (JSC::BooleanNode::value): Deleted. |
| (JSC::StringNode::value): Deleted. |
| (JSC::TemplateExpressionListNode::value): Deleted. |
| (JSC::TemplateExpressionListNode::next): Deleted. |
| (JSC::TemplateStringNode::cooked): Deleted. |
| (JSC::TemplateStringNode::raw): Deleted. |
| (JSC::TemplateStringListNode::value): Deleted. |
| (JSC::TemplateStringListNode::next): Deleted. |
| (JSC::TemplateLiteralNode::templateStrings const): Deleted. |
| (JSC::TemplateLiteralNode::templateExpressions const): Deleted. |
| (JSC::TaggedTemplateNode::templateLiteral const): Deleted. |
| (JSC::ResolveNode::identifier const): Deleted. |
| (JSC::ElementNode::elision const): Deleted. |
| (JSC::ElementNode::value): Deleted. |
| (JSC::ElementNode::next): Deleted. |
| (JSC::ArrayNode::elements const): Deleted. |
| (JSC::PropertyNode::expressionName const): Deleted. |
| (JSC::PropertyNode::name const): Deleted. |
| (JSC::PropertyNode::type const): Deleted. |
| (JSC::PropertyNode::needsSuperBinding const): Deleted. |
| (JSC::PropertyNode::isClassProperty const): Deleted. |
| (JSC::PropertyNode::isStaticClassProperty const): Deleted. |
| (JSC::PropertyNode::isInstanceClassProperty const): Deleted. |
| (JSC::PropertyNode::isOverriddenByDuplicate const): Deleted. |
| (JSC::PropertyNode::setIsOverriddenByDuplicate): Deleted. |
| (JSC::PropertyNode::putType const): Deleted. |
| (JSC::BracketAccessorNode::base const): Deleted. |
| (JSC::BracketAccessorNode::subscript const): Deleted. |
| (JSC::BracketAccessorNode::subscriptHasAssignments const): Deleted. |
| (JSC::DotAccessorNode::base const): Deleted. |
| (JSC::DotAccessorNode::identifier const): Deleted. |
| (JSC::SpreadExpressionNode::expression const): Deleted. |
| (JSC::ObjectSpreadExpressionNode::expression const): Deleted. |
| (JSC::BytecodeIntrinsicNode::type const): Deleted. |
| (JSC::BytecodeIntrinsicNode::emitter const): Deleted. |
| (JSC::BytecodeIntrinsicNode::identifier const): Deleted. |
| (JSC::TypeOfResolveNode::identifier const): Deleted. |
| (JSC::BitwiseNotNode::expr): Deleted. |
| (JSC::BitwiseNotNode::expr const): Deleted. |
| (JSC::AssignResolveNode::identifier const): Deleted. |
| (JSC::ExprStatementNode::expr const): Deleted. |
| (JSC::ForOfNode::isForAwait const): Deleted. |
| (JSC::ReturnNode::value): Deleted. |
| (JSC::ProgramNode::startColumn const): Deleted. |
| (JSC::ProgramNode::endColumn const): Deleted. |
| (JSC::EvalNode::startColumn const): Deleted. |
| (JSC::EvalNode::endColumn const): Deleted. |
| (JSC::ModuleProgramNode::startColumn const): Deleted. |
| (JSC::ModuleProgramNode::endColumn const): Deleted. |
| (JSC::ModuleProgramNode::moduleScopeData): Deleted. |
| (JSC::ModuleNameNode::moduleName): Deleted. |
| (JSC::ImportSpecifierNode::importedName): Deleted. |
| (JSC::ImportSpecifierNode::localName): Deleted. |
| (JSC::ImportSpecifierListNode::specifiers const): Deleted. |
| (JSC::ImportSpecifierListNode::append): Deleted. |
| (JSC::ImportDeclarationNode::specifierList const): Deleted. |
| (JSC::ImportDeclarationNode::moduleName const): Deleted. |
| (JSC::ExportAllDeclarationNode::moduleName const): Deleted. |
| (JSC::ExportDefaultDeclarationNode::declaration const): Deleted. |
| (JSC::ExportDefaultDeclarationNode::localName const): Deleted. |
| (JSC::ExportLocalDeclarationNode::declaration const): Deleted. |
| (JSC::ExportSpecifierNode::exportedName): Deleted. |
| (JSC::ExportSpecifierNode::localName): Deleted. |
| (JSC::ExportSpecifierListNode::specifiers const): Deleted. |
| (JSC::ExportSpecifierListNode::append): Deleted. |
| (JSC::ExportNamedDeclarationNode::specifierList const): Deleted. |
| (JSC::ExportNamedDeclarationNode::moduleName const): Deleted. |
| (JSC::ArrayPatternNode::appendIndex): Deleted. |
| (JSC::ObjectPatternNode::appendEntry): Deleted. |
| (JSC::ObjectPatternNode::setContainsRestElement): Deleted. |
| (JSC::ObjectPatternNode::setContainsComputedProperty): Deleted. |
| (JSC::DestructuringAssignmentNode::bindings): Deleted. |
| (JSC::FunctionParameters::size const): Deleted. |
| (JSC::FunctionParameters::append): Deleted. |
| (JSC::FunctionParameters::isSimpleParameterList const): Deleted. |
| (JSC::FuncDeclNode::metadata): Deleted. |
| (JSC::CaseClauseNode::expr const): Deleted. |
| (JSC::CaseClauseNode::setStartOffset): Deleted. |
| (JSC::ClauseListNode::getClause const): Deleted. |
| (JSC::ClauseListNode::getNext const): Deleted. |
| * runtime/ExceptionHelpers.cpp: |
| * runtime/JSObject.cpp: |
| |
| 2018-07-18 Yusuke Suzuki <utatane.tea@gmail.com> |
| |
| JSON.stringify should emit non own properties if second array argument includes |
| https://bugs.webkit.org/show_bug.cgi?id=187724 |
| |
| Reviewed by Mark Lam. |
| |
| According to the spec[1], JSON.stringify needs to retrieve properties by using [[Get]], |
| instead of [[GetOwnProperty]]. It means that we would look up a properties defined |
| in [[Prototype]] or upper objects in the prototype chain. While enumeration is done |
| by using EnumerableOwnPropertyNames typically, we can pass replacer array including |
| property names which does not reside in the own properties. Or we can modify the |
| own properties by deleting properties while JSON.stringify is calling a getter. So, |
| using [[Get]] instead of [[GetOwnProperty]] is user-visible. |
| |
| This patch changes getOwnPropertySlot to getPropertySlot to align the behavior to the spec. |
| The performance of Kraken/json-stringify-tinderbox is neutral. |
| |
| [1]: https://tc39.github.io/ecma262/#sec-serializejsonproperty |
| |
| * runtime/JSONObject.cpp: |
| (JSC::Stringifier::toJSON): |
| (JSC::Stringifier::toJSONImpl): |
| (JSC::Stringifier::appendStringifiedValue): |
| (JSC::Stringifier::Holder::Holder): |
| (JSC::Stringifier::Holder::appendNextProperty): |
| |
| 2018-07-18 Yusuke Suzuki <utatane.tea@gmail.com> |
| |
| [JSC] JSON.stringify's replacer should use `isArray` instead of JSArray checks |
| https://bugs.webkit.org/show_bug.cgi?id=187755 |
| |
| Reviewed by Mark Lam. |
| |
| JSON.stringify used `inherits<JSArray>(vm)` to determine whether the given replacer is an array replacer. |
| But this is wrong. According to the spec, we should use `isArray`[1], which accepts Proxies. This difference |
| makes one test262 test failed. |
| |
| This patch changes the code to using `isArray()`. And we reorder the evaluations of replacer check and ident space check |
| to align these checks to the spec's order. |
| |
| [1]: https://tc39.github.io/ecma262/#sec-json.stringify |
| |
| * runtime/JSONObject.cpp: |
| (JSC::Stringifier::Stringifier): |
| |
| 2018-07-18 Yusuke Suzuki <utatane.tea@gmail.com> |
| |
| [JSC] Root wrapper object in JSON.stringify is not necessary if replacer is not callable |
| https://bugs.webkit.org/show_bug.cgi?id=187752 |
| |
| Reviewed by Mark Lam. |
| |
| JSON.stringify has an implicit root wrapper object since we would like to call replacer |
| with a wrapper object and a property name. While we always create this wrapper object, |
| it is unnecessary if the given replacer is not callable. |
| |
| This patch removes wrapper object creation when a replacer is not callable to avoid unnecessary |
| allocations. This change slightly improves the performance of Kraken/json-stringify-tinderbox. |
| |
| baseline patched |
| |
| json-stringify-tinderbox 39.730+-0.590 ^ 38.853+-0.266 ^ definitely 1.0226x faster |
| |
| * runtime/JSONObject.cpp: |
| (JSC::Stringifier::isCallableReplacer const): |
| (JSC::Stringifier::Stringifier): |
| (JSC::Stringifier::stringify): |
| (JSC::Stringifier::appendStringifiedValue): |
| |
| 2018-07-18 Carlos Garcia Campos <cgarcia@igalia.com> |
| |
| [GLIB] Add jsc_context_check_syntax() to GLib API |
| https://bugs.webkit.org/show_bug.cgi?id=187694 |
| |
| Reviewed by Yusuke Suzuki. |
| |
| A new function to be able to check for syntax errors without actually evaluating the code. |
| |
| * API/glib/JSCContext.cpp: |
| (jsc_context_check_syntax): |
| * API/glib/JSCContext.h: |
| * API/glib/docs/jsc-glib-4.0-sections.txt: |
| |
| 2018-07-17 Keith Miller <keith_miller@apple.com> |
| |
| Revert r233630 since it broke internal wasm benchmarks |
| https://bugs.webkit.org/show_bug.cgi?id=187746 |
| |
| Unreviewed revert. |
| |
| This patch seems to have broken internal Wasm benchmarks. This |
| issue is likely due to an underlying bug but let's rollout while |
| we investigate. |
| |
| * bytecode/CodeType.h: |
| * bytecode/UnlinkedCodeBlock.cpp: |
| (JSC::UnlinkedCodeBlock::UnlinkedCodeBlock): |
| * bytecode/UnlinkedCodeBlock.h: |
| (JSC::UnlinkedCodeBlock::codeType const): |
| (JSC::UnlinkedCodeBlock::didOptimize const): |
| (JSC::UnlinkedCodeBlock::setDidOptimize): |
| * bytecode/VirtualRegister.h: |
| (JSC::VirtualRegister::VirtualRegister): |
| (): Deleted. |
| |
| 2018-07-17 Mark Lam <mark.lam@apple.com> |
| |
| CodeBlock::baselineVersion() should account for executables with purged codeBlocks. |
| https://bugs.webkit.org/show_bug.cgi?id=187736 |
| <rdar://problem/42114371> |
| |
| Reviewed by Michael Saboff. |
| |
| CodeBlock::baselineVersion() currently checks for a null replacement but does not |
| account for the fact that that the replacement can also be null due to the |
| executable having being purged of its codeBlocks due to a memory event (see |
| ExecutableBase::clearCode()). This patch adds code to account for this. |
| |
| * bytecode/CodeBlock.cpp: |
| (JSC::CodeBlock::baselineVersion): |
| |
| 2018-07-16 Yusuke Suzuki <utatane.tea@gmail.com> |
| |
| [JSC] UnlinkedCodeBlock::shrinkToFit miss m_constantIdentifierSets |
| https://bugs.webkit.org/show_bug.cgi?id=187709 |
| |
| Reviewed by Mark Lam. |
| |
| UnlinkedCodeBlock::shrinkToFit accidentally misses m_constantIdentifierSets shrinking. |
| |
| * bytecode/UnlinkedCodeBlock.cpp: |
| (JSC::UnlinkedCodeBlock::shrinkToFit): |
| |
| 2018-07-16 Yusuke Suzuki <utatane.tea@gmail.com> |
| |
| [JSC] Make SourceParseMode small |
| https://bugs.webkit.org/show_bug.cgi?id=187705 |
| |
| Reviewed by Mark Lam. |
| |
| Each SourceParseMode is distinct. So we do not need to make it a set-style (power of 2 style). |
| Originally, this is done to make SourceParseModeSet faster because it is critical in our parser. |
| But we can keep SourceParseModeSet fast by `1U << mode | set`. And we can make SourceParseMode |
| within 5 bits. This reduces the size of UnlinkedCodeBlock from 288 to 280. |
| |
| * parser/ParserModes.h: |
| (JSC::SourceParseModeSet::SourceParseModeSet): |
| (JSC::SourceParseModeSet::contains): |
| (JSC::SourceParseModeSet::mergeSourceParseModes): |
| |
| 2018-07-12 Yusuke Suzuki <utatane.tea@gmail.com> |
| |
| [JSC] Generator and AsyncGeneratorMethod's prototype is incorrect |
| https://bugs.webkit.org/show_bug.cgi?id=187585 |
| |
| Reviewed by Darin Adler. |
| |
| This patch fixes Generator and AsyncGenerator's prototype issues. |
| |
| 1. Generator's default prototype is incorrect when `generator.prototype = null` is performed. |
| We fix this by changing JSFunction::prototypeForConstruction. |
| |
| 2. AsyncGeneratorMethod is not handled. We change the name isAsyncGeneratorFunctionParseMode |
| to isAsyncGeneratorWrapperParseMode since it is aligned to Generator's code. And use it well |
| to fix `prototype` issues for AsyncGeneratorMethod. |
| |
| * bytecompiler/BytecodeGenerator.cpp: |
| (JSC::BytecodeGenerator::emitPutAsyncGeneratorFields): |
| (JSC::BytecodeGenerator::emitNewFunction): |
| * bytecompiler/NodesCodegen.cpp: |
| (JSC::FunctionNode::emitBytecode): |
| * parser/ASTBuilder.h: |
| (JSC::ASTBuilder::createFunctionMetadata): |
| * parser/Parser.cpp: |
| (JSC::getAsynFunctionBodyParseMode): |
| (JSC::Parser<LexerType>::parseInner): |
| (JSC::Parser<LexerType>::parseAsyncGeneratorFunctionSourceElements): |
| * parser/ParserModes.h: |
| (JSC::isAsyncGeneratorParseMode): |
| (JSC::isAsyncGeneratorWrapperParseMode): |
| (JSC::isAsyncGeneratorFunctionParseMode): Deleted. |
| * runtime/FunctionExecutable.h: |
| * runtime/JSFunction.cpp: |
| (JSC::JSFunction::prototypeForConstruction): |
| (JSC::JSFunction::getOwnPropertySlot): |
| |
| 2018-07-16 Mark Lam <mark.lam@apple.com> |
| |
| jsc shell's noFTL utility test function should be more robust. |
| https://bugs.webkit.org/show_bug.cgi?id=187704 |
| <rdar://problem/42231988> |
| |
| Reviewed by Michael Saboff and Keith Miller. |
| |
| * jsc.cpp: |
| (functionNoFTL): |
| - only setNeverFTLOptimize() if the function is actually a JS function. |
| |
| 2018-07-15 Carlos Garcia Campos <cgarcia@igalia.com> |
| |
| [GLIB] Add API to evaluate code using a given object to store global symbols |
| https://bugs.webkit.org/show_bug.cgi?id=187639 |
| |
| Reviewed by Michael Catanzaro. |
| |
| Add jsc_context_evaluate_in_object(). It returns a new object as an out parameter. Global symbols in the |
| evaluated script are added as properties to the new object instead of to the context global object. This is |
| similar to JS::Evaluate in spider monkey when a scopeChain parameter is passed, but JSC doesn't support using a |
| scope for assignments, so we have to create a new context and get its global object. This patch also updates |
| jsc_context_evaluate_with_source_uri() to receive the starting line number for consistency with the new |
| jsc_context_evaluate_in_object(). |
| |
| * API/glib/JSCContext.cpp: |
| (jsc_context_evaluate): Pass 0 as line number to jsc_context_evaluate_with_source_uri(). |
| (evaluateScriptInContext): Helper function to evaluate a script in a JSGlobalContextRef. |
| (jsc_context_evaluate_with_source_uri): Use evaluateScriptInContext(). |
| (jsc_context_evaluate_in_object): Create a new context and set the main context global object as extension |
| scope of it. Evaluate the script in the new context and get its global object to be returned as parameter. |
| * API/glib/JSCContext.h: |
| * API/glib/docs/jsc-glib-4.0-sections.txt: |
| |
| 2018-07-13 Yusuke Suzuki <utatane.tea@gmail.com> |
| |
| [32bit JSC tests] stress/cow-convert-double-to-contiguous.js and stress/cow-convert-int32-to-contiguous.js are failing |
| https://bugs.webkit.org/show_bug.cgi?id=187561 |
| |
| Reviewed by Darin Adler. |
| |
| This patch fixes the issue that CoW array handling is not introduced in 32bit put_by_val code. |
| We clean up 32bit put_by_val code. |
| |
| 1. We remove inline out-of-bounds recording code since it is done in C operation code. This change |
| aligns 32bit implementation to 64bit implementation. |
| |
| 2. We add CoW array checking, which is done in 64bit implementation. |
| |
| * jit/JITPropertyAccess.cpp: |
| (JSC::JIT::emit_op_put_by_val): |
| * jit/JITPropertyAccess32_64.cpp: |
| (JSC::JIT::emit_op_put_by_val): |
| (JSC::JIT::emitSlow_op_put_by_val): |
| |
| 2018-07-12 Mark Lam <mark.lam@apple.com> |
| |
| Need to handle CodeBlock::replacement() being null. |
| https://bugs.webkit.org/show_bug.cgi?id=187569 |
| <rdar://problem/41468692> |
| |
| Reviewed by Saam Barati. |
| |
| CodeBlock::replacement() may return a nullptr. Some of our code already checks |
| for this while others do not. We should add null checks in all the places that |
| need it. |
| |
| * bytecode/CodeBlock.cpp: |
| (JSC::CodeBlock::hasOptimizedReplacement): |
| (JSC::CodeBlock::jettison): |
| (JSC::CodeBlock::numberOfDFGCompiles): |
| (JSC::CodeBlock::setOptimizationThresholdBasedOnCompilationResult): |
| * dfg/DFGOperations.cpp: |
| * dfg/DFGToFTLDeferredCompilationCallback.cpp: |
| (JSC::DFG::ToFTLDeferredCompilationCallback::compilationDidBecomeReadyAsynchronously): |
| (JSC::DFG::ToFTLDeferredCompilationCallback::compilationDidComplete): |
| * jit/JITOperations.cpp: |
| |
| 2018-07-12 Yusuke Suzuki <utatane.tea@gmail.com> |
| |
| [JSC] Thread VM& to JSCell::methodTable(VM&) |
| https://bugs.webkit.org/show_bug.cgi?id=187548 |
| |
| Reviewed by Saam Barati. |
| |
| This patch threads VM& to methodTable(VM&) and remove methodTable(). |
| We add VM& parameter to estimatedSize() to thread VM& in estimatedSize implementations. |
| |
| * API/APICast.h: |
| (toJS): |
| * API/JSCallbackObject.h: |
| * API/JSCallbackObjectFunctions.h: |
| (JSC::JSCallbackObject<Parent>::className): |
| * bytecode/CodeBlock.cpp: |
| (JSC::CodeBlock::estimatedSize): |
| * bytecode/CodeBlock.h: |
| * bytecode/UnlinkedCodeBlock.cpp: |
| (JSC::UnlinkedCodeBlock::estimatedSize): |
| * bytecode/UnlinkedCodeBlock.h: |
| * debugger/DebuggerScope.cpp: |
| (JSC::DebuggerScope::className): |
| * debugger/DebuggerScope.h: |
| * heap/Heap.cpp: |
| (JSC::GatherHeapSnapshotData::GatherHeapSnapshotData): |
| (JSC::GatherHeapSnapshotData::operator() const): |
| (JSC::Heap::gatherExtraHeapSnapshotData): |
| * heap/HeapSnapshotBuilder.cpp: |
| (JSC::HeapSnapshotBuilder::json): |
| * runtime/ArrayPrototype.cpp: |
| (JSC::arrayProtoFuncToString): |
| * runtime/ClassInfo.h: |
| * runtime/DirectArguments.cpp: |
| (JSC::DirectArguments::estimatedSize): |
| * runtime/DirectArguments.h: |
| * runtime/HashMapImpl.cpp: |
| (JSC::HashMapImpl<HashMapBucket>::estimatedSize): |
| * runtime/HashMapImpl.h: |
| * runtime/JSArrayBuffer.cpp: |
| (JSC::JSArrayBuffer::estimatedSize): |
| * runtime/JSArrayBuffer.h: |
| * runtime/JSBigInt.cpp: |
| (JSC::JSBigInt::estimatedSize): |
| * runtime/JSBigInt.h: |
| * runtime/JSCell.cpp: |
| (JSC::JSCell::dump const): |
| (JSC::JSCell::estimatedSizeInBytes const): |
| (JSC::JSCell::estimatedSize): |
| (JSC::JSCell::className): |
| * runtime/JSCell.h: |
| * runtime/JSCellInlines.h: |
| * runtime/JSGenericTypedArrayView.h: |
| * runtime/JSGenericTypedArrayViewInlines.h: |
| (JSC::JSGenericTypedArrayView<Adaptor>::estimatedSize): |
| * runtime/JSObject.cpp: |
| (JSC::JSObject::estimatedSize): |
| (JSC::JSObject::className): |
| (JSC::JSObject::toStringName): |
| (JSC::JSObject::calculatedClassName): |
| * runtime/JSObject.h: |
| * runtime/JSProxy.cpp: |
| (JSC::JSProxy::className): |
| * runtime/JSProxy.h: |
| * runtime/JSString.cpp: |
| (JSC::JSString::estimatedSize): |
| * runtime/JSString.h: |
| * runtime/RegExp.cpp: |
| (JSC::RegExp::estimatedSize): |
| * runtime/RegExp.h: |
| * runtime/WeakMapImpl.cpp: |
| (JSC::WeakMapImpl<WeakMapBucket>::estimatedSize): |
| * runtime/WeakMapImpl.h: |
| |
| 2018-07-11 Commit Queue <commit-queue@webkit.org> |
| |
| Unreviewed, rolling out r233714. |
| https://bugs.webkit.org/show_bug.cgi?id=187579 |
| |
| it made tests time out (Requested by pizlo on #webkit). |
| |
| Reverted changeset: |
| |
| "Change the reoptimization backoff base to 1.3 from 2" |
| https://bugs.webkit.org/show_bug.cgi?id=187540 |
| https://trac.webkit.org/changeset/233714 |
| |
| 2018-07-11 Carlos Garcia Campos <cgarcia@igalia.com> |
| |
| [GLIB] Add API to allow creating variadic functions |
| https://bugs.webkit.org/show_bug.cgi?id=187517 |
| |
| Reviewed by Michael Catanzaro. |
| |
| Add a _variadic alternate method for jsc_class_add_constructor, jsc_class_add_method and |
| jsc_value_new_function. In that case the callback always receives a GPtrArray of JSCValue. |
| |
| * API/glib/JSCCallbackFunction.cpp: |
| (JSC::JSCCallbackFunction::create): Make the parameters optional. |
| (JSC::JSCCallbackFunction::JSCCallbackFunction): Ditto. |
| (JSC::JSCCallbackFunction::call): Handle the case of parameters being nullopt by creating a GPtrArray of |
| JSCValue for the arguments. |
| (JSC::JSCCallbackFunction::construct): Ditto. |
| * API/glib/JSCCallbackFunction.h: |
| * API/glib/JSCClass.cpp: |
| (jscClassCreateConstructor): Make the parameters optional. |
| (jsc_class_add_constructor_variadic): Pass nullopt as parameters to jscClassCreateConstructor. |
| (jscClassAddMethod): Make the parameters optional. |
| (jsc_class_add_method_variadic): Pass nullopt as parameters to jscClassAddMethod. |
| * API/glib/JSCClass.h: |
| * API/glib/JSCValue.cpp: |
| (jsc_value_object_define_property_accessor): Update now that parameters are optional. |
| (jscValueFunctionCreate): Make the parameters optional. |
| (jsc_value_new_function_variadic): Pass nullopt as parameters to jscValueFunctionCreate. |
| * API/glib/JSCValue.h: |
| * API/glib/docs/jsc-glib-4.0-sections.txt: |
| |
| 2018-07-11 Carlos Garcia Campos <cgarcia@igalia.com> |
| |
| [GLIB] Add jsc_context_get_global_object() to GLib API |
| https://bugs.webkit.org/show_bug.cgi?id=187515 |
| |
| Reviewed by Michael Catanzaro. |
| |
| This wasn't exposed because we have convenient methods in JSCContext to get and set properties on the global |
| object. However, getting the global object could be useful in some cases, for example to give it a well known |
| name like 'window' in browsers and GJS. |
| |
| * API/glib/JSCContext.cpp: |
| (jsc_context_get_global_object): |
| * API/glib/JSCContext.h: |
| * API/glib/docs/jsc-glib-4.0-sections.txt: |
| |
| 2018-07-11 Carlos Garcia Campos <cgarcia@igalia.com> |
| |
| [GLIB] Handle G_TYPE_STRV in glib API |
| https://bugs.webkit.org/show_bug.cgi?id=187512 |
| |
| Reviewed by Michael Catanzaro. |
| |
| Add jsc_value_new_array_from_strv() and handle G_TYPE_STRV types in function parameters. |
| |
| * API/glib/JSCContext.cpp: |
| (jscContextGValueToJSValue): |
| (jscContextJSValueToGValue): |
| * API/glib/JSCValue.cpp: |
| (jsc_value_new_array_from_strv): |
| * API/glib/JSCValue.h: |
| * API/glib/docs/jsc-glib-4.0-sections.txt: |
| |
| 2018-07-11 Yusuke Suzuki <utatane.tea@gmail.com> |
| |
| Iterator of Array.keys() returns object in wrong order |
| https://bugs.webkit.org/show_bug.cgi?id=185197 |
| |
| Reviewed by Keith Miller. |
| |
| * builtins/ArrayIteratorPrototype.js: |
| (globalPrivate.arrayIteratorValueNext): |
| (globalPrivate.arrayIteratorKeyNext): |
| (globalPrivate.arrayIteratorKeyValueNext): |
| * builtins/AsyncFromSyncIteratorPrototype.js: |
| * builtins/AsyncGeneratorPrototype.js: |
| (globalPrivate.asyncGeneratorResolve): |
| * builtins/GeneratorPrototype.js: |
| (globalPrivate.generatorResume): |
| * builtins/MapIteratorPrototype.js: |
| (globalPrivate.mapIteratorNext): |
| * builtins/SetIteratorPrototype.js: |
| (globalPrivate.setIteratorNext): |
| * builtins/StringIteratorPrototype.js: |
| (next): |
| * runtime/IteratorOperations.cpp: |
| (JSC::createIteratorResultObjectStructure): |
| (JSC::createIteratorResultObject): |
| |
| 2018-07-10 Mark Lam <mark.lam@apple.com> |
| |
| constructArray() should always allocate the requested length. |
| https://bugs.webkit.org/show_bug.cgi?id=187543 |
| <rdar://problem/41947884> |
| |
| Reviewed by Saam Barati. |
| |
| Currently, it does not when we're having a bad time. We fix this by switching |
| back to using tryCreateUninitializedRestricted() exclusively in constructArray(). |
| If we detect that a structure transition is possible before we can initialize |
| the butterfly, we'll go ahead and eagerly initialize the rest of the butterfly. |
| We will introduce JSArray::eagerlyInitializeButterfly() to handle this. |
| |
| Also enhanced the DisallowScope and ObjectInitializationScope to support this |
| eager initialization when needed. |
| |
| * dfg/DFGOperations.cpp: |
| - the client of operationNewArrayWithSizeAndHint() (in FTL generated code) expects |
| the array allocation to always succeed. Adding this RELEASE_ASSERT here makes |
| it clearer that we encountered an OutOfMemory condition instead of failing in FTL |
| generated code, which will appear as a generic null pointer dereference. |
| |
| * runtime/ArrayPrototype.cpp: |
| (JSC::concatAppendOne): |
| - the code here clearly wants to check for an allocation failure. Switched to |
| using JSArray::tryCreate() instead of JSArray::create(). |
| |
| * runtime/DisallowScope.h: |
| (JSC::DisallowScope::disable): |
| * runtime/JSArray.cpp: |
| (JSC::JSArray::tryCreateUninitializedRestricted): |
| (JSC::JSArray::eagerlyInitializeButterfly): |
| (JSC::constructArray): |
| * runtime/JSArray.h: |
| * runtime/ObjectInitializationScope.cpp: |
| (JSC::ObjectInitializationScope::notifyInitialized): |
| * runtime/ObjectInitializationScope.h: |
| (JSC::ObjectInitializationScope::notifyInitialized): |
| |
| 2018-07-05 Yusuke Suzuki <utatane.tea@gmail.com> |
| |
| [JSC] Remove getTypedArrayImpl |
| https://bugs.webkit.org/show_bug.cgi?id=187338 |
| |
| Reviewed by Mark Lam. |
| |
| getTypedArrayImpl is overridden only by typed arrays and DataView. Since the number of these classes |
| are limited, we do not need to add this function to MethodTable: dispatching it in JSArrayBufferView is fine. |
| This patch removes getTypedArrayImpl from MethodTable, and moves it to JSArrayBufferView. |
| |
| * runtime/ClassInfo.h: |
| * runtime/GenericTypedArrayView.h: |
| (JSC::GenericTypedArrayView::data const): Deleted. |
| (JSC::GenericTypedArrayView::set): Deleted. |
| (JSC::GenericTypedArrayView::setRange): Deleted. |
| (JSC::GenericTypedArrayView::zeroRange): Deleted. |
| (JSC::GenericTypedArrayView::zeroFill): Deleted. |
| (JSC::GenericTypedArrayView::length const): Deleted. |
| (JSC::GenericTypedArrayView::item const): Deleted. |
| (JSC::GenericTypedArrayView::set const): Deleted. |
| (JSC::GenericTypedArrayView::setNative const): Deleted. |
| (JSC::GenericTypedArrayView::getRange): Deleted. |
| (JSC::GenericTypedArrayView::checkInboundData const): Deleted. |
| (JSC::GenericTypedArrayView::internalByteLength const): Deleted. |
| * runtime/JSArrayBufferView.cpp: |
| (JSC::JSArrayBufferView::possiblySharedImpl): |
| * runtime/JSArrayBufferView.h: |
| * runtime/JSArrayBufferViewInlines.h: |
| (JSC::JSArrayBufferView::possiblySharedImpl): Deleted. |
| * runtime/JSCell.cpp: |
| (JSC::JSCell::getTypedArrayImpl): Deleted. |
| * runtime/JSCell.h: |
| * runtime/JSDataView.cpp: |
| (JSC::JSDataView::getTypedArrayImpl): Deleted. |
| * runtime/JSDataView.h: |
| * runtime/JSGenericTypedArrayView.h: |
| * runtime/JSGenericTypedArrayViewInlines.h: |
| (JSC::JSGenericTypedArrayView<Adaptor>::getTypedArrayImpl): Deleted. |
| |
| 2018-07-10 Keith Miller <keith_miller@apple.com> |
| |
| hasOwnProperty returns true for out of bounds property index on TypedArray |
| https://bugs.webkit.org/show_bug.cgi?id=187520 |
| |
| Reviewed by Saam Barati. |
| |
| * runtime/JSGenericTypedArrayViewInlines.h: |
| (JSC::JSGenericTypedArrayView<Adaptor>::getOwnPropertySlot): |
| |
| 2018-07-10 Michael Saboff <msaboff@apple.com> |
| |
| DFG JIT: compileMathIC produces incorrect machine code |
| https://bugs.webkit.org/show_bug.cgi?id=187537 |
| |
| Reviewed by Saam Barati. |
| |
| Added checks for constant multipliers in JITMulGenerator::generateInline(). If we have a constant multiplier, |
| fall back to the fast path generator which handles such cases. |
| |
| * jit/JITMulGenerator.cpp: |
| (JSC::JITMulGenerator::generateInline): |
| |
| 2018-07-10 Filip Pizlo <fpizlo@apple.com> |
| |
| Change the reoptimization backoff base to 1.3 from 2 |
| https://bugs.webkit.org/show_bug.cgi?id=187540 |
| |
| Reviewed by Saam Barati. |
| |
| I have data that hints at this being a speed-up on JetStream, ARES-6, and Speedometer2. |
| |
| I also have data that hints that a backoff base of 1 might be even better, but I think that |
| we want to keep *some* backoff in case we find ourselves in an unmitigated recomp loop. |
| |
| * bytecode/CodeBlock.cpp: |
| (JSC::CodeBlock::reoptimizationRetryCounter const): |
| (JSC::CodeBlock::countReoptimization): |
| (JSC::CodeBlock::adjustedCounterValue): |
| * runtime/Options.cpp: |
| (JSC::recomputeDependentOptions): |
| * runtime/Options.h: |
| |
| 2018-07-10 Mark Lam <mark.lam@apple.com> |
| |
| [32-bit JSC tests] ASSERTION FAILED: !butterfly->propertyStorage()[-I - 1].get() under JSC::ObjectInitializationScope::verifyPropertiesAreInitialized. |
| https://bugs.webkit.org/show_bug.cgi?id=187362 |
| <rdar://problem/42027210> |
| |
| Reviewed by Saam Barati. |
| |
| On 32-bit targets, a 0 valued JSValue is not the empty JSValue, but it is a valid |
| value to use for initializing unused properties. Updated an assertion to account |
| for this. |
| |
| * runtime/ObjectInitializationScope.cpp: |
| (JSC::ObjectInitializationScope::verifyPropertiesAreInitialized): |
| |
| 2018-07-10 Michael Saboff <msaboff@apple.com> |
| |
| YARR: . doesn't match non-BMP Unicode characters in some cases |
| https://bugs.webkit.org/show_bug.cgi?id=187248 |
| |
| Reviewed by Geoffrey Garen. |
| |
| The safety check in optimizeAlternative() for moving character classes that only consist of BMP |
| characters did not take into account that the character class is inverted. In this case, we |
| represent '.' as "not a newline" using the newline character class with an inverted check. |
| Clearly that includes non-BMP characters. |
| |
| The fix is to check that the character class doesn't have non-BMP characters AND it isn't an |
| inverted use of that character class. |
| |
| * yarr/YarrJIT.cpp: |
| (JSC::Yarr::YarrGenerator::optimizeAlternative): |
| |
| 2018-07-09 Mark Lam <mark.lam@apple.com> |
| |
| Add --traceLLIntExecution and --traceLLIntSlowPath options. |
| https://bugs.webkit.org/show_bug.cgi?id=187479 |
| |
| Reviewed by Yusuke Suzuki and Saam Barati. |
| |
| These options are only available if LLINT_TRACING is enabled in LLIntCommon.h. |
| |
| The details: |
| 1. LLINT_TRACING consolidates and replaces LLINT_EXECUTION_TRACING and LLINT_SLOW_PATH_TRACING. |
| 2. Tracing is now guarded behind runtime options --traceLLIntExecution and --traceLLIntSlowPath. |
| This makes it such that enabling LLINT_TRACING doesn't means that we'll |
| continually spammed with logging until we rebuild. |
| 3. Fixed slow path LLINT tracing to work with exception check validation. |
| |
| * llint/LLIntCommon.h: |
| * llint/LLIntExceptions.cpp: |
| (JSC::LLInt::returnToThrow): |
| (JSC::LLInt::callToThrow): |
| * llint/LLIntOfflineAsmConfig.h: |
| * llint/LLIntSlowPaths.cpp: |
| (JSC::LLInt::slowPathLog): |
| (JSC::LLInt::slowPathLn): |
| (JSC::LLInt::slowPathLogF): |
| (JSC::LLInt::slowPathLogLn): |
| (JSC::LLInt::llint_trace_operand): |
| (JSC::LLInt::llint_trace_value): |
| (JSC::LLInt::LLINT_SLOW_PATH_DECL): |
| (JSC::LLInt::traceFunctionPrologue): |
| (JSC::LLInt::handleHostCall): |
| (JSC::LLInt::setUpCall): |
| * llint/LLIntSlowPaths.h: |
| * llint/LowLevelInterpreter.asm: |
| * runtime/CommonSlowPathsExceptions.cpp: |
| (JSC::CommonSlowPaths::interpreterThrowInCaller): |
| * runtime/Options.cpp: |
| (JSC::Options::isAvailable): |
| * runtime/Options.h: |
| |
| 2018-07-09 Yusuke Suzuki <utatane.tea@gmail.com> |
| |
| [JSC] Embed RegExp into constant buffer in UnlinkedCodeBlock and CodeBlock |
| https://bugs.webkit.org/show_bug.cgi?id=187477 |
| |
| Reviewed by Mark Lam. |
| |
| Before this patch, RegExp* is specially held in m_regexp buffer which resides in CodeBlock's RareData. |
| However, it is not necessary since JSCells can be reside in a constant buffer. |
| This patch embeds RegExp* to a constant buffer in UnlinkedCodeBlock and CodeBlock. And remove RegExp |
| vector from RareData. |
| |
| We also move the code of dumping RegExp from BytecodeDumper to RegExp::dumpToStream. |
| |
| * bytecode/BytecodeDumper.cpp: |
| (JSC::BytecodeDumper<Block>::dumpBytecode): |
| (JSC::BytecodeDumper<Block>::dumpBlock): |
| (JSC::regexpToSourceString): Deleted. |
| (JSC::regexpName): Deleted. |
| (JSC::BytecodeDumper<Block>::dumpRegExps): Deleted. |
| * bytecode/BytecodeDumper.h: |
| * bytecode/CodeBlock.h: |
| (JSC::CodeBlock::regexp const): Deleted. |
| (JSC::CodeBlock::numberOfRegExps const): Deleted. |
| * bytecode/UnlinkedCodeBlock.cpp: |
| (JSC::UnlinkedCodeBlock::visitChildren): |
| (JSC::UnlinkedCodeBlock::shrinkToFit): |
| * bytecode/UnlinkedCodeBlock.h: |
| (JSC::UnlinkedCodeBlock::addRegExp): Deleted. |
| (JSC::UnlinkedCodeBlock::numberOfRegExps const): Deleted. |
| (JSC::UnlinkedCodeBlock::regexp const): Deleted. |
| * bytecompiler/BytecodeGenerator.cpp: |
| (JSC::BytecodeGenerator::emitNewRegExp): |
| (JSC::BytecodeGenerator::addRegExp): Deleted. |
| * bytecompiler/BytecodeGenerator.h: |
| * dfg/DFGByteCodeParser.cpp: |
| (JSC::DFG::ByteCodeParser::parseBlock): |
| * jit/JITOpcodes.cpp: |
| (JSC::JIT::emit_op_new_regexp): |
| * llint/LLIntSlowPaths.cpp: |
| (JSC::LLInt::LLINT_SLOW_PATH_DECL): |
| * runtime/JSCJSValue.cpp: |
| (JSC::JSValue::dumpInContextAssumingStructure const): |
| * runtime/RegExp.cpp: |
| (JSC::regexpToSourceString): |
| (JSC::RegExp::dumpToStream): |
| * runtime/RegExp.h: |
| |
| 2018-07-09 Brian Burg <bburg@apple.com> |
| |
| REGRESSION: Web Inspector no longer pauses in internal injected scripts like WDFindNodes.js |
| https://bugs.webkit.org/show_bug.cgi?id=187350 |
| <rdar://problem/41728249> |
| |
| Reviewed by Matt Baker. |
| |
| Add a new command that toggles whether or not to blackbox internal scripts. |
| If blackboxed, the scripts will not be shown to the frontend and the debugger will |
| not pause in source frames from blackboxed scripts. Sometimes we want to break into |
| those scripts when debugging Web Inspector, WebDriver, or other WebKit-internal code |
| that injects scripts. |
| |
| * inspector/agents/InspectorDebuggerAgent.cpp: |
| (Inspector::InspectorDebuggerAgent::setPauseForInternalScripts): |
| (Inspector::InspectorDebuggerAgent::didParseSource): |
| * inspector/agents/InspectorDebuggerAgent.h: |
| * inspector/protocol/Debugger.json: |
| |
| 2018-07-09 Yusuke Suzuki <utatane.tea@gmail.com> |
| |
| [JSC] Make some data members of UnlinkedCodeBlock private |
| https://bugs.webkit.org/show_bug.cgi?id=187467 |
| |
| Reviewed by Mark Lam. |
| |
| This patch makes m_numVars, m_numCalleeLocals, and m_numParameters of UnlinkedCodeBlock private. |
| We also remove m_numCapturedVars since it is no longer used. |
| |
| * bytecode/CodeBlock.cpp: |
| (JSC::CodeBlock::CodeBlock): |
| * bytecode/CodeBlock.h: |
| * bytecode/UnlinkedCodeBlock.cpp: |
| (JSC::UnlinkedCodeBlock::UnlinkedCodeBlock): |
| * bytecode/UnlinkedCodeBlock.h: |
| |
| 2018-07-09 Yusuke Suzuki <utatane.tea@gmail.com> |
| |
| [JSC] Optimize layout of AccessCase / ProxyableAccessCase to reduce size of ProxyableAccessCase |
| https://bugs.webkit.org/show_bug.cgi?id=187465 |
| |
| Reviewed by Keith Miller. |
| |
| ProxyableAccessCase is allocated so frequently and it is persisted so long. Reducing the size |
| of ProxyableAccessCase can reduce the footprint of many web sites including nytimes.com. |
| |
| This patch uses a bit complicated layout to reduce ProxyableAccessCase. We add unused bool member |
| in AccessCase's padding, and use it in ProxyableAccessCase. By doing so, we can reduce the size |
| of ProxyableAccessCase from 56 to 48. And it also reduces the size of GetterSetterAccessCase |
| from 104 to 96 since it inherits ProxyableAccessCase. |
| |
| * bytecode/AccessCase.h: |
| (JSC::AccessCase::viaProxy const): |
| (JSC::AccessCase::AccessCase): |
| * bytecode/ProxyableAccessCase.cpp: |
| (JSC::ProxyableAccessCase::ProxyableAccessCase): |
| * bytecode/ProxyableAccessCase.h: |
| |
| 2018-07-08 Yusuke Suzuki <utatane.tea@gmail.com> |
| |
| Unreviewed, build fix for debug builds after r233630 |
| https://bugs.webkit.org/show_bug.cgi?id=187441 |
| |
| * jit/JIT.cpp: |
| (JSC::JIT::frameRegisterCountFor): |
| * llint/LLIntEntrypoint.cpp: |
| (JSC::LLInt::frameRegisterCountFor): |
| |
| 2018-07-08 Yusuke Suzuki <utatane.tea@gmail.com> |
| |
| [JSC] Optimize layout of CodeBlock to reduce padding |
| https://bugs.webkit.org/show_bug.cgi?id=187441 |
| |
| Reviewed by Mark Lam. |
| |
| Arrange the order of members to reduce the size of CodeBlock from 552 to 544. |
| We also make SourceCodeRepresentation 1 byte since CodeBlock has a vector of this, |
| Vector<SourceCodeRepresentation> m_constantsSourceCodeRepresentation. |
| |
| We also move m_numCalleeLocals and m_numVars from `public` to `private` in CodeBlock. |
| |
| * bytecode/BytecodeDumper.cpp: |
| (JSC::BytecodeDumper<Block>::dumpBlock): |
| * bytecode/BytecodeUseDef.h: |
| (JSC::computeDefsForBytecodeOffset): |
| * bytecode/CodeBlock.cpp: |
| (JSC::CodeBlock::CodeBlock): |
| * bytecode/CodeBlock.h: |
| (JSC::CodeBlock::numVars const): |
| * bytecode/UnlinkedCodeBlock.h: |
| (JSC::UnlinkedCodeBlock::numVars const): |
| * dfg/DFGByteCodeParser.cpp: |
| (JSC::DFG::ByteCodeParser::ByteCodeParser): |
| (JSC::DFG::ByteCodeParser::flushForTerminalImpl): |
| (JSC::DFG::ByteCodeParser::handleRecursiveTailCall): |
| (JSC::DFG::ByteCodeParser::inlineCall): |
| (JSC::DFG::ByteCodeParser::handleGetById): |
| (JSC::DFG::ByteCodeParser::handlePutById): |
| (JSC::DFG::ByteCodeParser::parseBlock): |
| * dfg/DFGGraph.h: |
| (JSC::DFG::Graph::forAllLocalsLiveInBytecode): |
| * dfg/DFGOSREntrypointCreationPhase.cpp: |
| (JSC::DFG::OSREntrypointCreationPhase::run): |
| * dfg/DFGVariableEventStream.cpp: |
| (JSC::DFG::VariableEventStream::reconstruct const): |
| * ftl/FTLOSREntry.cpp: |
| (JSC::FTL::prepareOSREntry): |
| * ftl/FTLState.cpp: |
| (JSC::FTL::State::State): |
| * interpreter/Interpreter.cpp: |
| (JSC::Interpreter::dumpRegisters): |
| * jit/JIT.cpp: |
| (JSC::JIT::frameRegisterCountFor): |
| * jit/JITOpcodes.cpp: |
| (JSC::JIT::emit_op_enter): |
| * jit/JITOpcodes32_64.cpp: |
| (JSC::JIT::emit_op_enter): |
| * jit/JITOperations.cpp: |
| * llint/LLIntEntrypoint.cpp: |
| (JSC::LLInt::frameRegisterCountFor): |
| * llint/LLIntSlowPaths.cpp: |
| (JSC::LLInt::traceFunctionPrologue): |
| (JSC::LLInt::LLINT_SLOW_PATH_DECL): |
| * runtime/JSCJSValue.h: |
| |
| 2018-07-08 Yusuke Suzuki <utatane.tea@gmail.com> |
| |
| [JSC] Optimize padding of UnlinkedCodeBlock to shrink |
| https://bugs.webkit.org/show_bug.cgi?id=187448 |
| |
| Reviewed by Saam Barati. |
| |
| We optimize the size of CodeType and TriState. And we arrange the layout of UnlinkedCodeBlock. |
| These optimizations reduce the size of UnlinkedCodeBlock from 304 to 288. |
| |
| * bytecode/CodeType.h: |
| * bytecode/UnlinkedCodeBlock.cpp: |
| (JSC::UnlinkedCodeBlock::UnlinkedCodeBlock): |
| * bytecode/UnlinkedCodeBlock.h: |
| (JSC::UnlinkedCodeBlock::codeType const): |
| (JSC::UnlinkedCodeBlock::didOptimize const): |
| (JSC::UnlinkedCodeBlock::setDidOptimize): |
| * bytecode/VirtualRegister.h: |
| |
| 2018-07-08 Yusuke Suzuki <utatane.tea@gmail.com> |
| |
| [JSC] Optimize padding of InferredTypeTable by using cellLock |
| https://bugs.webkit.org/show_bug.cgi?id=187447 |
| |
| Reviewed by Mark Lam. |
| |
| Use cellLock() in InferredTypeTable to guard changes of internal structures. |
| This is the same usage to SparseArrayValueMap. By using cellLock(), we can |
| reduce the size of InferredTypeTable from 40 to 32. |
| |
| * runtime/InferredTypeTable.cpp: |
| (JSC::InferredTypeTable::visitChildren): |
| (JSC::InferredTypeTable::get): |
| (JSC::InferredTypeTable::willStoreValue): |
| (JSC::InferredTypeTable::makeTop): |
| * runtime/InferredTypeTable.h: |
| Using enum class and using. And remove `isEmpty()` since it is not used. |
| |
| * runtime/Structure.h: |
| |
| 2018-07-07 Yusuke Suzuki <utatane.tea@gmail.com> |
| |
| [JSC] Optimize layout of SourceProvider to reduce padding |
| https://bugs.webkit.org/show_bug.cgi?id=187440 |
| |
| Reviewed by Mark Lam. |
| |
| Arrange members of SourceProvider to reduce the size from 80 to 72. |
| |
| * parser/SourceProvider.cpp: |
| (JSC::SourceProvider::SourceProvider): |
| * parser/SourceProvider.h: |
| |
| 2018-07-08 Mark Lam <mark.lam@apple.com> |
| |
| PropertyTable::skipDeletedEntries() should guard against iterating past the table end. |
| https://bugs.webkit.org/show_bug.cgi?id=187444 |
| <rdar://problem/41282849> |
| |
| Reviewed by Saam Barati. |
| |
| PropertyTable supports C++ iteration by offering begin() and end() methods, and |
| an iterator class. The begin() methods and the iterator operator++() method uses |
| PropertyTable::skipDeletedEntries() to skip over deleted entries in the table. |
| However, PropertyTable::skipDeletedEntries() does not prevent the iteration |
| pointer from being incremented past the end of the table. As a result, we can |
| iterate past the end of the table. Note that the C++ iteration protocol tests |
| for the iterator not being equal to the end() value. It does not do a <= test. |
| If the iterator ever shoots past end, the loop will effectively not terminate. |
| |
| This issue can manifest if and only if the last entry in the table is a deleted |
| one, and the key field of the PropertyMapEntry shaped space at the end of the |
| table (the one beyond the last) contains a 1 (i.e. PROPERTY_MAP_DELETED_ENTRY_KEY) |
| value. |
| |
| No test because manifesting this issue requires uncontrollable happenstance where |
| memory just beyond the end of the table looks like a deleted entry. |
| |
| * runtime/PropertyMapHashTable.h: |
| (JSC::PropertyTable::begin): |
| (JSC::PropertyTable::end): |
| (JSC::PropertyTable::begin const): |
| (JSC::PropertyTable::end const): |
| (JSC::PropertyTable::skipDeletedEntries): |
| |
| 2018-07-07 Yusuke Suzuki <utatane.tea@gmail.com> |
| |
| [JSC] Optimize layout of SymbolTable to reduce padding |
| https://bugs.webkit.org/show_bug.cgi?id=187437 |
| |
| Reviewed by Mark Lam. |
| |
| Arrange the layout of SymbolTable to reduce the size from 88 to 72. |
| |
| * runtime/SymbolTable.h: |
| |
| 2018-07-07 Yusuke Suzuki <utatane.tea@gmail.com> |
| |
| [JSC] Optimize layout of RegExp to reduce padding |
| https://bugs.webkit.org/show_bug.cgi?id=187438 |
| |
| Reviewed by Mark Lam. |
| |
| Reduce the size of RegExp from 168 to 144. |
| |
| * runtime/RegExp.cpp: |
| (JSC::RegExp::RegExp): |
| * runtime/RegExp.h: |
| * runtime/RegExpKey.h: |
| * yarr/YarrErrorCode.h: |
| |
| 2018-07-07 Yusuke Suzuki <utatane.tea@gmail.com> |
| |
| [JSC] Optimize layout of ValueProfile to reduce padding |
| https://bugs.webkit.org/show_bug.cgi?id=187439 |
| |
| Reviewed by Mark Lam. |
| |
| Reduce the size of ValueProfile from 40 to 32 by reordering members. |
| |
| * bytecode/ValueProfile.h: |
| (JSC::ValueProfileBase::ValueProfileBase): |
| |
| 2018-07-05 Saam Barati <sbarati@apple.com> |
| |
| ProgramExecutable may be collected as we checkSyntax on it |
| https://bugs.webkit.org/show_bug.cgi?id=187359 |
| <rdar://problem/41832135> |
| |
| Reviewed by Mark Lam. |
| |
| The bug was we were passing in a reference to the SourceCode field on ProgramExecutable as |
| the ProgramExecutable itself may be collected. The fix here is to make a copy |
| of the field instead of passing in a reference inside of ParserError::toErrorObject. |
| |
| No new tests here as this was already caught by our iOS JSC testers. |
| |
| * parser/ParserError.h: |
| (JSC::ParserError::toErrorObject): |
| |
| 2018-07-04 Tim Horton <timothy_horton@apple.com> |
| |
| Introduce PLATFORM(IOSMAC) |
| https://bugs.webkit.org/show_bug.cgi?id=187315 |
| |
| Reviewed by Dan Bernstein. |
| |
| * Configurations/Base.xcconfig: |
| * Configurations/FeatureDefines.xcconfig: |
| |
| 2018-07-03 Mark Lam <mark.lam@apple.com> |
| |
| [32-bit JSC tests] ASSERTION FAILED: !getDirect(offset) || !JSValue::encode(getDirect(offset)). |
| https://bugs.webkit.org/show_bug.cgi?id=187255 |
| <rdar://problem/41785257> |
| |
| Reviewed by Saam Barati. |
| |
| The 32-bit JIT::emit_op_create_this() needs to initialize uninitialized properties |
| too: basically, do what the 64-bit code is doing. At present, this change only |
| serves to pacify an assertion. It is not needed for correctness because the |
| concurrent GC is not used on 32-bit builds. |
| |
| This issue is already covered by the slowMicrobenchmarks/rest-parameter-allocation-elimination.js |
| test. |
| |
| * jit/JITOpcodes32_64.cpp: |
| (JSC::JIT::emit_op_create_this): |
| |
| 2018-07-03 Yusuke Suzuki <utatane.tea@gmail.com> |
| |
| [JSC] Move slowDownAndWasteMemory function to JSArrayBufferView |
| https://bugs.webkit.org/show_bug.cgi?id=187290 |
| |
| Reviewed by Saam Barati. |
| |
| slowDownAndWasteMemory is just overridden by typed arrays. Since they are limited, |
| we do not need to add this function to MethodTable: just dispatching it in JSArrayBufferView |
| is fine. And slowDownAndWasteMemory only requires the sizeof(element), which can be |
| easily calculated from JSType. |
| This patch removes slowDownAndWasteMemory from MethodTable, and moves it to JSArrayBufferView. |
| |
| * runtime/ClassInfo.h: |
| * runtime/JSArrayBufferView.cpp: |
| (JSC::elementSize): |
| (JSC::JSArrayBufferView::slowDownAndWasteMemory): |
| * runtime/JSArrayBufferView.h: |
| * runtime/JSArrayBufferViewInlines.h: |
| (JSC::JSArrayBufferView::possiblySharedBuffer): |
| * runtime/JSCell.cpp: |
| (JSC::JSCell::slowDownAndWasteMemory): Deleted. |
| * runtime/JSCell.h: |
| * runtime/JSDataView.cpp: |
| (JSC::JSDataView::slowDownAndWasteMemory): Deleted. |
| * runtime/JSDataView.h: |
| * runtime/JSGenericTypedArrayView.h: |
| * runtime/JSGenericTypedArrayViewInlines.h: |
| (JSC::JSGenericTypedArrayView<Adaptor>::slowDownAndWasteMemory): Deleted. |
| |
| 2018-07-02 Sukolsak Sakshuwong <sukolsak@gmail.com> |
| |
| Regular expressions with ".?" expressions at the start and the end match the entire string |
| https://bugs.webkit.org/show_bug.cgi?id=119191 |
| |
| Reviewed by Michael Saboff. |
| |
| r90962 optimized regular expressions in the form of /.*abc.*/ by looking |
| for "abc" first and then processing the leading and trailing dot stars |
| to find the beginning and the end of the match. However, it erroneously |
| enabled this optimization for regular expressions whose leading or |
| trailing dots had quantifiers that were not of arbitrary length, e.g., |
| /.?abc.*/, /.*abc.?/, /.{0,4}abc.*/, etc. This caused the expression to |
| match the entire string when it shouldn't. This patch disables the |
| optimization for those cases. |
| |
| * yarr/YarrPattern.cpp: |
| (JSC::Yarr::YarrPatternConstructor::optimizeDotStarWrappedExpressions): |
| |
| 2018-07-02 Sukolsak Sakshuwong <sukolsak@gmail.com> |
| |
| RegExp.exec returns wrong value with a long integer quantifier |
| https://bugs.webkit.org/show_bug.cgi?id=187042 |
| |
| Reviewed by Saam Barati. |
| |
| Prior to this patch, the Yarr parser checked for integer overflow when |
| parsing quantifiers in regular expressions by adding one digit at a time |
| to a number and checking if the result got larger. This is wrong; |
| The parser would fail to detect overflow when parsing, for example, |
| 10,000,000,003 because (1000000000*10 + 3) % (2^32) = 1410065411 > 1000000000. |
| |
| Another issue was that once it detected overflow, it stopped consuming |
| the remaining digits. Since it didn't find the closing bracket, it |
| parsed the quantifier as a normal string instead. |
| |
| This patch fixes these issues by reading all the digits and checking for |
| overflow with Checked<unsigned, RecordOverflow>. If it overflows, it |
| returns the largest possible value (quantifyInfinite in this case). This |
| matches Chrome [1], Firefox [2], and Edge [3]. |
| |
| [1] https://chromium.googlesource.com/v8/v8.git/+/23222f0a88599dcf302ccf395883944620b70fd5/src/regexp/regexp-parser.cc#1042 |
| [2] https://dxr.mozilla.org/mozilla-central/rev/aea3f3457f1531706923b8d4c595a1f271de83da/js/src/irregexp/RegExpParser.cpp#1310 |
| [3] https://github.com/Microsoft/ChakraCore/blob/fc08987381da141bb686b5d0c71d75da96f9eb8a/lib/Parser/RegexParser.cpp#L1149 |
| |
| * yarr/YarrParser.h: |
| (JSC::Yarr::Parser::consumeNumber): |
| |
| 2018-07-02 Keith Miller <keith_miller@apple.com> |
| |
| InstanceOf IC should do generic if the prototype is not an object. |
| https://bugs.webkit.org/show_bug.cgi?id=187250 |
| |
| Reviewed by Mark Lam. |
| |
| The old code was wrong for two reasons. First, the AccessCase expected that |
| the prototype value would be non-null. Second, we would end up returning |
| false instead of throwing an exception. |
| |
| * jit/Repatch.cpp: |
| (JSC::tryCacheInstanceOf): |
| |
| 2018-07-01 Mark Lam <mark.lam@apple.com> |
| |
| Builtins and host functions should get their own structures. |
| https://bugs.webkit.org/show_bug.cgi?id=187211 |
| <rdar://problem/41646336> |
| |
| Reviewed by Saam Barati. |
| |
| JSFunctions do lazy reification of properties, but ordinary functions applies |
| different rules of property reification than builtin and host functions. Hence, |
| we should give builtins and host functions their own structures. |
| |
| * runtime/JSFunction.cpp: |
| (JSC::JSFunction::selectStructureForNewFuncExp): |
| (JSC::JSFunction::create): |
| (JSC::JSFunction::getOwnPropertySlot): |
| * runtime/JSGlobalObject.cpp: |
| (JSC::JSGlobalObject::init): |
| (JSC::JSGlobalObject::visitChildren): |
| * runtime/JSGlobalObject.h: |
| (JSC::JSGlobalObject::hostFunctionStructure const): |
| (JSC::JSGlobalObject::arrowFunctionStructure const): |
| (JSC::JSGlobalObject::sloppyFunctionStructure const): |
| (JSC::JSGlobalObject::strictFunctionStructure const): |
| |
| 2018-07-01 David Kilzer <ddkilzer@apple.com> |
| |
| JavaScriptCore: Fix clang static analyzer warnings: Assigned value is garbage or undefined |
| <https://webkit.org/b/187233> |
| |
| Reviewed by Mark Lam. |
| |
| * b3/air/AirEliminateDeadCode.cpp: |
| (JSC::B3::Air::eliminateDeadCode): Initialize `changed`. |
| * parser/ParserTokens.h: |
| (JSC::JSTextPosition::JSTextPosition): Add struct member |
| initialization. Simplify default constructor. |
| (JSC::JSTokenLocation::JSTokenData): Move largest struct in the |
| union to the beginning to make it easy to zero out all fields. |
| (JSC::JSTokenLocation::JSTokenLocation): Add struct member |
| initialization. Simplify default constructor. Note that |
| `endOffset` was not being initialized previously. |
| (JSC::JSTextPosition::JSToken): Add struct member initialization |
| where necessary. |
| * runtime/IntlObject.cpp: |
| (JSC::MatcherResult): Add struct member initialization. |
| |
| 2018-06-23 Darin Adler <darin@apple.com> |
| |
| [Cocoa] Improve ARC compatibility of more code in JavaScriptCore |
| https://bugs.webkit.org/show_bug.cgi?id=186973 |
| |
| Reviewed by Dan Bernstein. |
| |
| * API/JSContext.mm: |
| (WeakContextRef::WeakContextRef): Deleted. |
| (WeakContextRef::~WeakContextRef): Deleted. |
| (WeakContextRef::get): Deleted. |
| (WeakContextRef::set): Deleted. |
| |
| * API/JSContextInternal.h: Removed unneeded header guards since this is |
| an Objective-C++ header. Removed unused WeakContextRef class. Removed declaration |
| of method -[JSContext initWithGlobalContextRef:] and JSContext property wrapperMap |
| since neither is used outside the class implementation. |
| |
| * API/JSManagedValue.mm: |
| (-[JSManagedValue initWithValue:]): Use a bridging cast. |
| (-[JSManagedValue dealloc]): Ditto. |
| (-[JSManagedValue didAddOwner:]): Ditto. |
| (-[JSManagedValue didRemoveOwner:]): Ditto. |
| (JSManagedValueHandleOwner::isReachableFromOpaqueRoots): Ditto. |
| (JSManagedValueHandleOwner::finalize): Ditto. |
| * API/JSValue.mm: |
| (+[JSValue valueWithNewRegularExpressionFromPattern:flags:inContext:]): Ditto. |
| (+[JSValue valueWithNewErrorFromMessage:inContext:]): Ditto. |
| (-[JSValue valueForProperty:]): Ditto. |
| (-[JSValue setValue:forProperty:]): Ditto. |
| (-[JSValue deleteProperty:]): Ditto. |
| (-[JSValue hasProperty:]): Ditto. |
| (-[JSValue invokeMethod:withArguments:]): Ditto. |
| (valueToObjectWithoutCopy): Ditto. Also removed unneeded explicit type names. |
| (valueToArray): Ditto. |
| (valueToDictionary): Ditto. |
| (objectToValueWithoutCopy): Ditto. |
| (objectToValue): Ditto. |
| * API/JSVirtualMachine.mm: |
| (+[JSVMWrapperCache addWrapper:forJSContextGroupRef:]): Ditto. |
| (+[JSVMWrapperCache wrapperForJSContextGroupRef:]): Ditto. |
| (-[JSVirtualMachine isOldExternalObject:]): Ditto. |
| (-[JSVirtualMachine addManagedReference:withOwner:]): Ditto. |
| (-[JSVirtualMachine removeManagedReference:withOwner:]): Ditto. |
| (-[JSVirtualMachine contextForGlobalContextRef:]): Ditto. |
| (-[JSVirtualMachine addContext:forGlobalContextRef:]): Ditto. |
| (scanExternalObjectGraph): Ditto. |
| (scanExternalRememberedSet): Ditto. |
| * API/JSWrapperMap.mm: |
| (makeWrapper): Ditto. |
| (-[JSObjCClassInfo wrapperForObject:inContext:]): Ditto. |
| (-[JSWrapperMap objcWrapperForJSValueRef:inContext:]): Ditto. |
| (tryUnwrapObjcObject): Ditto. |
| * API/ObjCCallbackFunction.mm: |
| (blockSignatureContainsClass): Ditto. |
| (objCCallbackFunctionForMethod): Switched from retain to CFRetain, but not |
| sure we will be keeping this the same way under ARC. |
| (objCCallbackFunctionForBlock): Use a bridging cast. |
| |
| * API/ObjcRuntimeExtras.h: |
| (protocolImplementsProtocol): Use a more specific type that includes the |
| explicit __unsafe_unretained for copied protocol lists. |
| (forEachProtocolImplementingProtocol): Ditto. |
| |
| * inspector/remote/cocoa/RemoteInspectorCocoa.mm: |
| (Inspector::convertNSNullToNil): Added to replace the CONVERT_NSNULL_TO_NIL macro. |
| (Inspector::RemoteInspector::receivedSetupMessage): Use convertNSNullToNil. |
| |
| * inspector/remote/cocoa/RemoteInspectorXPCConnection.mm: Moved the |
| CFXPCBridge SPI to a header named CFXPCBridgeSPI.h. |
| (auditTokenHasEntitlement): Deleted. Moved to Entitlements.h/cpp in WTF. |
| (Inspector::RemoteInspectorXPCConnection::handleEvent): Use WTF::hasEntitlement. |
| (Inspector::RemoteInspectorXPCConnection::sendMessage): Use a bridging cast. |
| |
| 2018-06-30 Adam Barth <abarth@webkit.org> |
| |
| Port JavaScriptCore to OS(FUCHSIA) |
| https://bugs.webkit.org/show_bug.cgi?id=187223 |
| |
| Reviewed by Daniel Bates. |
| |
| * assembler/ARM64Assembler.h: |
| (JSC::ARM64Assembler::cacheFlush): Call zx_cache_flush to flush cache. |
| * runtime/MachineContext.h: Fuchsia has the same mcontext_t as glibc. |
| (JSC::MachineContext::stackPointerImpl): |
| (JSC::MachineContext::framePointerImpl): |
| (JSC::MachineContext::instructionPointerImpl): |
| (JSC::MachineContext::argumentPointer<1>): |
| (JSC::MachineContext::llintInstructionPointer): |
| |
| 2018-06-30 David Kilzer <ddkilzer@apple.com> |
| |
| Fix clang static analyzer warnings: Garbage return value |
| <https://webkit.org/b/187224> |
| |
| Reviewed by Eric Carlson. |
| |
| * bytecode/UnlinkedCodeBlock.cpp: |
| (JSC::UnlinkedCodeBlock::lineNumberForBytecodeOffset): |
| - Use brace initialization for local variables. |
| * debugger/DebuggerCallFrame.cpp: |
| (class JSC::LineAndColumnFunctor): |
| - Use class member initialization for member variables. |
| |
| 2018-06-29 Saam Barati <sbarati@apple.com> |
| |
| Unreviewed. Try to fix Windows build after r233377 |
| |
| * builtins/BuiltinExecutables.cpp: |
| (JSC::BuiltinExecutables::createExecutable): |
| |
| 2018-06-29 Saam Barati <sbarati@apple.com> |
| |
| Don't use tracePoints in JS/Wasm entry |
| https://bugs.webkit.org/show_bug.cgi?id=187196 |
| |
| Reviewed by Mark Lam. |
| |
| This puts VM entry and Wasm entry tracePoints behind a runtime |
| option. This is a ~4x speedup on a soon to be released Wasm |
| benchmark. tracePoints should basically never run more than 50 |
| times a second. Entering the VM and entering Wasm are user controlled, |
| and can happen hundreds of thousands of times in a second. Depending |
| on how the Wasm/JS code is structured, this can be disastrous for |
| performance. |
| |
| * runtime/Options.h: |
| * runtime/VMEntryScope.cpp: |
| (JSC::VMEntryScope::VMEntryScope): |
| (JSC::VMEntryScope::~VMEntryScope): |
| * wasm/WasmBBQPlan.cpp: |
| (JSC::Wasm::BBQPlan::compileFunctions): |
| * wasm/js/WebAssemblyFunction.cpp: |
| (JSC::callWebAssemblyFunction): |
| |
| 2018-06-29 Saam Barati <sbarati@apple.com> |
| |
| We shouldn't recurse into the parser when gathering metadata about various function offsets |
| https://bugs.webkit.org/show_bug.cgi?id=184074 |
| <rdar://problem/37165897> |
| |
| Reviewed by Mark Lam. |
| |
| Prior to this patch, when we made a builtin, we had to make an UnlinkedFunctionExecutable |
| for that builtin. This required calling into the parser. However, the parser |
| may throw a stack overflow. We were not able to recover from that. The only |
| reason we called into the parser here is that we were gathering text offsets |
| and various metadata for things in the builtin function. This patch writes a |
| mini parser that figures this information out without calling into the full |
| parser. (I've also added a debug assert that verifies the mini parser stays in |
| sync with the full parser.) The result of this is that BuiltinExecutbles::createExecutable |
| always succeeds. |
| |
| * builtins/AsyncFromSyncIteratorPrototype.js: |
| (globalPrivate.createAsyncFromSyncIterator): |
| (globalPrivate.AsyncFromSyncIteratorConstructor): |
| * builtins/BuiltinExecutables.cpp: |
| (JSC::BuiltinExecutables::createExecutable): |
| * builtins/GlobalOperations.js: |
| (globalPrivate.getter.overriddenName.string_appeared_here.speciesGetter): |
| (globalPrivate.speciesConstructor): |
| (globalPrivate.copyDataProperties): |
| (globalPrivate.copyDataPropertiesNoExclusions): |
| * builtins/PromiseOperations.js: |
| (globalPrivate.newHandledRejectedPromise): |
| * builtins/RegExpPrototype.js: |
| (globalPrivate.hasObservableSideEffectsForRegExpMatch): |
| (globalPrivate.hasObservableSideEffectsForRegExpSplit): |
| * builtins/StringPrototype.js: |
| (globalPrivate.hasObservableSideEffectsForStringReplace): |
| (globalPrivate.getDefaultCollator): |
| * parser/Nodes.cpp: |
| (JSC::FunctionMetadataNode::FunctionMetadataNode): |
| (JSC::FunctionMetadataNode::operator== const): |
| (JSC::FunctionMetadataNode::dump const): |
| * parser/Nodes.h: |
| * parser/Parser.h: |
| (JSC::parse): |
| * parser/ParserError.h: |
| (JSC::ParserError::type const): |
| * parser/ParserTokens.h: |
| (JSC::JSTextPosition::operator== const): |
| (JSC::JSTextPosition::operator!= const): |
| * parser/SourceCode.h: |
| (JSC::SourceCode::operator== const): |
| (JSC::SourceCode::operator!= const): |
| (JSC::SourceCode::subExpression const): |
| (JSC::SourceCode::subExpression): Deleted. |
| |
| 2018-06-28 Michael Saboff <msaboff@apple.com> |
| |
| IsoCellSet::sweepToFreeList() not safe when Full GC in process |
| https://bugs.webkit.org/show_bug.cgi?id=187157 |
| |
| Reviewed by Mark Lam. |
| |
| * heap/IsoCellSet.cpp: |
| (JSC::IsoCellSet::sweepToFreeList): Changed the "stale marks logic" to match what |
| is in MarkedBlock::Handle::specializedSweep where it takes into account whether |
| or not we are in the process of marking during a full GC. |
| * heap/MarkedBlock.h: |
| * heap/MarkedBlockInlines.h: |
| (JSC::MarkedBlock::Handle::areMarksStaleForSweep): New helper. |
| |
| 2018-06-27 Saam Barati <sbarati@apple.com> |
| |
| Add some more register state information when we crash in repatchPutById |
| https://bugs.webkit.org/show_bug.cgi?id=187112 |
| |
| Reviewed by Mark Lam. |
| |
| This will help us gather info when we end up seeing a ObjectPropertyConditionSet |
| with an offset that is different than what the put tells us. |
| |
| * jit/Repatch.cpp: |
| (JSC::tryCachePutByID): |
| |
| 2018-06-27 Mark Lam <mark.lam@apple.com> |
| |
| Fix a bug in $vm.callFrame() and apply previously requested renaming of $vm.println to print. |
| https://bugs.webkit.org/show_bug.cgi?id=187119 |
| |
| Reviewed by Keith Miller. |
| |
| $vm.callFrame()'s JSDollarVMCallFrame::finishCreation() |
| should be checking for codeBlock instead of !codeBlock |
| before using the codeBlock. |
| |
| I also renamed some other "print" functions to use "dump" instead |
| to match their underlying C++ code that they will call e.g. |
| CodeBlock::dumpSource(). |
| |
| * tools/JSDollarVM.cpp: |
| (WTF::JSDollarVMCallFrame::finishCreation): |
| (JSC::functionDumpSourceFor): |
| (JSC::functionDumpBytecodeFor): |
| (JSC::doPrint): |
| (JSC::functionDataLog): |
| (JSC::functionPrint): |
| (JSC::functionDumpCallFrame): |
| (JSC::functionDumpStack): |
| (JSC::JSDollarVM::finishCreation): |
| (JSC::functionPrintSourceFor): Deleted. |
| (JSC::functionPrintBytecodeFor): Deleted. |
| (JSC::doPrintln): Deleted. |
| (JSC::functionPrintln): Deleted. |
| (JSC::functionPrintCallFrame): Deleted. |
| (JSC::functionPrintStack): Deleted. |
| * tools/VMInspector.cpp: |
| (JSC::DumpFrameFunctor::DumpFrameFunctor): |
| (JSC::DumpFrameFunctor::operator() const): |
| (JSC::VMInspector::dumpCallFrame): |
| (JSC::VMInspector::dumpStack): |
| (JSC::VMInspector::dumpValue): |
| (JSC::PrintFrameFunctor::PrintFrameFunctor): Deleted. |
| (JSC::PrintFrameFunctor::operator() const): Deleted. |
| (JSC::VMInspector::printCallFrame): Deleted. |
| (JSC::VMInspector::printStack): Deleted. |
| (JSC::VMInspector::printValue): Deleted. |
| * tools/VMInspector.h: |
| |
| 2018-06-27 Keith Miller <keith_miller@apple.com> |
| |
| Add logging to try to diagnose where we get a null structure. |
| https://bugs.webkit.org/show_bug.cgi?id=187106 |
| |
| Reviewed by Mark Lam. |
| |
| Add a logging to JSObject::toPrimitive to help diagnose a nullptr |
| structure crash. |
| |
| This code should be removed when we fix <rdar://problem/33451840> |
| |
| * runtime/JSObject.cpp: |
| (JSC::callToPrimitiveFunction): |
| * runtime/JSObject.h: |
| (JSC::JSObject::getPropertySlot): |
| |
| 2018-06-27 Mark Lam <mark.lam@apple.com> |
| |
| DFG's compileReallocatePropertyStorage() and compileAllocatePropertyStorage() slow paths should also clear unused properties. |
| https://bugs.webkit.org/show_bug.cgi?id=187091 |
| <rdar://problem/41395624> |
| |
| Reviewed by Yusuke Suzuki. |
| |
| Previously, when compileReallocatePropertyStorage() and compileAllocatePropertyStorage() |
| take their slow paths, the slow path would jump back to the fast path right after |
| the emitted code which clears the unused property values. As a result, the |
| unused properties are not initialized. We've fixed this by adding the slow path |
| generators before we emit the code to clear the unused properties. |
| |
| * dfg/DFGSpeculativeJIT.cpp: |
| (JSC::DFG::SpeculativeJIT::compileAllocatePropertyStorage): |
| (JSC::DFG::SpeculativeJIT::compileReallocatePropertyStorage): |
| |
| 2018-06-27 Yusuke Suzuki <utatane.tea@gmail.com> |
| |
| [JSC] ArrayPatternNode::emitDirectBinding does not return assignment target value if dst is nullptr |
| https://bugs.webkit.org/show_bug.cgi?id=185943 |
| |
| Reviewed by Mark Lam. |
| |
| ArrayPatternNode::emitDirectBinding should return a register with an assignment target instead of filling |
| the result with undefined if `dst` is nullptr. While `dst == ignoredResult()` means we do not require |
| the result, `dst == nullptr` just means "dst is required, but a register for dst is not allocated.". |
| This patch fixes emitDirectBinding to return an appropriate value with an allocated register for dst. |
| |
| ArrayPatternNode::emitDirectBinding() should be removed later since it does not follow array spreading protocol, |
| but it should be done in a separate patch since it would be performance sensitive. |
| |
| * bytecompiler/NodesCodegen.cpp: |
| (JSC::ArrayPatternNode::emitDirectBinding): |
| |
| 2018-06-26 Yusuke Suzuki <utatane.tea@gmail.com> |
| |
| [JSC] Pass VM& to functions more |
| https://bugs.webkit.org/show_bug.cgi?id=186241 |
| |
| Reviewed by Mark Lam. |
| |
| This patch threads VM& to functions requiring VM& more. |
| |
| * API/JSObjectRef.cpp: |
| (JSObjectIsConstructor): |
| * bytecode/AdaptiveInferredPropertyValueWatchpointBase.cpp: |
| (JSC::AdaptiveInferredPropertyValueWatchpointBase::install): |
| (JSC::AdaptiveInferredPropertyValueWatchpointBase::fire): |
| (JSC::AdaptiveInferredPropertyValueWatchpointBase::StructureWatchpoint::fireInternal): |
| (JSC::AdaptiveInferredPropertyValueWatchpointBase::PropertyWatchpoint::fireInternal): |
| * bytecode/AdaptiveInferredPropertyValueWatchpointBase.h: |
| * bytecode/CodeBlockJettisoningWatchpoint.cpp: |
| (JSC::CodeBlockJettisoningWatchpoint::fireInternal): |
| * bytecode/CodeBlockJettisoningWatchpoint.h: |
| * bytecode/LLIntPrototypeLoadAdaptiveStructureWatchpoint.cpp: |
| (JSC::LLIntPrototypeLoadAdaptiveStructureWatchpoint::install): |
| (JSC::LLIntPrototypeLoadAdaptiveStructureWatchpoint::fireInternal): |
| * bytecode/LLIntPrototypeLoadAdaptiveStructureWatchpoint.h: |
| * bytecode/StructureStubClearingWatchpoint.cpp: |
| (JSC::StructureStubClearingWatchpoint::fireInternal): |
| * bytecode/StructureStubClearingWatchpoint.h: |
| * bytecode/Watchpoint.cpp: |
| (JSC::Watchpoint::fire): |
| (JSC::WatchpointSet::fireAllWatchpoints): |
| * bytecode/Watchpoint.h: |
| * dfg/DFGAdaptiveInferredPropertyValueWatchpoint.cpp: |
| (JSC::DFG::AdaptiveInferredPropertyValueWatchpoint::handleFire): |
| * dfg/DFGAdaptiveInferredPropertyValueWatchpoint.h: |
| * dfg/DFGAdaptiveStructureWatchpoint.cpp: |
| (JSC::DFG::AdaptiveStructureWatchpoint::install): |
| (JSC::DFG::AdaptiveStructureWatchpoint::fireInternal): |
| * dfg/DFGAdaptiveStructureWatchpoint.h: |
| * dfg/DFGDesiredWatchpoints.cpp: |
| (JSC::DFG::AdaptiveStructureWatchpointAdaptor::add): |
| * llint/LLIntSlowPaths.cpp: |
| (JSC::LLInt::setupGetByIdPrototypeCache): |
| * runtime/ArrayPrototype.cpp: |
| (JSC::ArrayPrototype::tryInitializeSpeciesWatchpoint): |
| (JSC::ArrayPrototypeAdaptiveInferredPropertyWatchpoint::handleFire): |
| * runtime/ECMAScriptSpecInternalFunctions.cpp: |
| (JSC::esSpecIsConstructor): |
| * runtime/FunctionRareData.cpp: |
| (JSC::FunctionRareData::AllocationProfileClearingWatchpoint::fireInternal): |
| * runtime/FunctionRareData.h: |
| * runtime/InferredStructureWatchpoint.cpp: |
| (JSC::InferredStructureWatchpoint::fireInternal): |
| * runtime/InferredStructureWatchpoint.h: |
| * runtime/InternalFunction.cpp: |
| (JSC::InternalFunction::createSubclassStructureSlow): |
| * runtime/InternalFunction.h: |
| (JSC::InternalFunction::createSubclassStructure): |
| * runtime/JSCJSValue.h: |
| * runtime/JSCJSValueInlines.h: |
| (JSC::JSValue::isConstructor const): |
| * runtime/JSCell.h: |
| * runtime/JSCellInlines.h: |
| (JSC::JSCell::isConstructor): |
| (JSC::JSCell::methodTable const): |
| * runtime/JSGlobalObject.cpp: |
| (JSC::JSGlobalObject::init): |
| * runtime/ObjectPropertyChangeAdaptiveWatchpoint.h: |
| (JSC::ObjectPropertyChangeAdaptiveWatchpoint::ObjectPropertyChangeAdaptiveWatchpoint): |
| * runtime/ProxyObject.cpp: |
| (JSC::ProxyObject::finishCreation): |
| * runtime/ReflectObject.cpp: |
| (JSC::reflectObjectConstruct): |
| * runtime/StructureRareData.cpp: |
| (JSC::StructureRareData::setObjectToStringValue): |
| (JSC::ObjectToStringAdaptiveStructureWatchpoint::install): |
| (JSC::ObjectToStringAdaptiveStructureWatchpoint::fireInternal): |
| (JSC::ObjectToStringAdaptiveInferredPropertyValueWatchpoint::handleFire): |
| |
| 2018-06-26 Mark Lam <mark.lam@apple.com> |
| |
| eval() is wrong about the LiteralParser never throwing any exceptions. |
| https://bugs.webkit.org/show_bug.cgi?id=187074 |
| <rdar://problem/41461099> |
| |
| Reviewed by Saam Barati. |
| |
| Added the missing exception check, and removed an erroneous assertion. |
| |
| * interpreter/Interpreter.cpp: |
| (JSC::eval): |
| |
| 2018-06-26 Saam Barati <sbarati@apple.com> |
| |
| JSImmutableButterfly can't be allocated from a subspace with HeapCell::Kind::Auxiliary |
| https://bugs.webkit.org/show_bug.cgi?id=186878 |
| <rdar://problem/40568659> |
| |
| Reviewed by Filip Pizlo. |
| |
| This patch fixes a bug in our JSImmutableButterfly implementation uncovered by |
| our stress GC bots. Before this patch, JSImmutableButterfly was allocated |
| with HeapCell::Kind::Auxiliary. This is wrong. Things that are JSCells can't |
| be allocated from HeapCell::Kind::Auxiliary. This patch adds a new HeapCell::Kind |
| called JSCellWithInteriorPointers. It behaves like JSCell in all ways, except |
| conservative scan knows to treat it like a butterfly in when we we may be |
| pointing into the middle of it. |
| |
| The way we were crashing on the stress GC bots is that our conservative marking |
| won't do cell visiting for things that are Auxiliary. This meant that if the |
| stack were the only thing pointing to a JSImmutableButterfly when a GC took place, |
| that JSImmutableButterfly would not be visited. This is now fixed. |
| |
| * bytecompiler/NodesCodegen.cpp: |
| (JSC::ArrayNode::emitBytecode): |
| * debugger/Debugger.cpp: |
| * heap/ConservativeRoots.cpp: |
| (JSC::ConservativeRoots::genericAddPointer): |
| * heap/Heap.cpp: |
| (JSC::GatherHeapSnapshotData::operator() const): |
| (JSC::RemoveDeadHeapSnapshotNodes::operator() const): |
| (JSC::Heap::globalObjectCount): |
| (JSC::Heap::objectTypeCounts): |
| (JSC::Heap::deleteAllCodeBlocks): |
| * heap/HeapCell.cpp: |
| (WTF::printInternal): |
| * heap/HeapCell.h: |
| (JSC::isJSCellKind): |
| (JSC::hasInteriorPointers): |
| * heap/HeapUtil.h: |
| (JSC::HeapUtil::findGCObjectPointersForMarking): |
| (JSC::HeapUtil::isPointerGCObjectJSCell): |
| * heap/MarkedBlock.cpp: |
| (JSC::MarkedBlock::Handle::didAddToDirectory): |
| * heap/SlotVisitor.cpp: |
| (JSC::SlotVisitor::appendJSCellOrAuxiliary): |
| * runtime/JSGlobalObject.cpp: |
| * runtime/JSImmutableButterfly.h: |
| (JSC::JSImmutableButterfly::subspaceFor): |
| * runtime/VM.cpp: |
| (JSC::VM::VM): |
| * runtime/VM.h: |
| * tools/CellProfile.h: |
| (JSC::CellProfile::CellProfile): |
| (JSC::CellProfile::isJSCell const): |
| * tools/HeapVerifier.cpp: |
| (JSC::HeapVerifier::validateCell): |
| |
| 2018-06-26 Mark Lam <mark.lam@apple.com> |
| |
| Skip some unnecessary work in Interpreter::getStackTrace(). |
| https://bugs.webkit.org/show_bug.cgi?id=187070 |
| |
| Reviewed by Michael Saboff. |
| |
| * interpreter/Interpreter.cpp: |
| (JSC::Interpreter::getStackTrace): |
| |
| 2018-06-26 Mark Lam <mark.lam@apple.com> |
| |
| ASSERTION FAILED: length > butterfly->vectorLength() in JSObject::ensureLengthSlow(). |
| https://bugs.webkit.org/show_bug.cgi?id=187060 |
| <rdar://problem/41452767> |
| |
| Reviewed by Keith Miller. |
| |
| JSObject::ensureLengthSlow() may be called only because it needs to do a copy on |
| write conversion. Hence, we can return early after the conversion if the vector |
| length is already sufficient to cover the requested length. |
| |
| * runtime/JSObject.cpp: |
| (JSC::JSObject::ensureLengthSlow): |
| |
| 2018-06-26 Commit Queue <commit-queue@webkit.org> |
| |
| Unreviewed, rolling out r233184. |
| https://bugs.webkit.org/show_bug.cgi?id=187059 |
| |
| "It regressed JetStream between 5-8%" (Requested by saamyjoon |
| on #webkit). |
| |
| Reverted changeset: |
| |
| "JSImmutableButterfly can't be allocated from a subspace with |
| HeapCell::Kind::Auxiliary" |
| https://bugs.webkit.org/show_bug.cgi?id=186878 |
| https://trac.webkit.org/changeset/233184 |
| |
| 2018-06-26 Carlos Alberto Lopez Perez <clopez@igalia.com> |
| |
| REGRESSION(r233065): Build broken with clang-3.8 and libstdc++-5 |
| https://bugs.webkit.org/show_bug.cgi?id=187051 |
| |
| Reviewed by Mark Lam. |
| |
| Revert r233065 changes over UnlinkedCodeBlock.h to allow |
| clang-3.8 to be able to compile this back (with libstdc++5) |
| |
| * bytecode/UnlinkedCodeBlock.h: |
| (JSC::UnlinkedCodeBlock::decompressArrayAllocationProfile): |
| |
| 2018-06-26 Tadeu Zagallo <tzagallo@apple.com> |
| |
| Fix testapi build when DFG_JIT is disabled |
| https://bugs.webkit.org/show_bug.cgi?id=187038 |
| |
| Reviewed by Mark Lam. |
| |
| r233158 added a new API and tests for configuring the number of JIT threads, but |
| the API is only available when DFG_JIT is enabled and so should the tests. |
| |
| * API/tests/testapi.mm: |
| (runJITThreadLimitTests): |
| |
| 2018-06-25 Saam Barati <sbarati@apple.com> |
| |
| JSImmutableButterfly can't be allocated from a subspace with HeapCell::Kind::Auxiliary |
| https://bugs.webkit.org/show_bug.cgi?id=186878 |
| <rdar://problem/40568659> |
| |
| Reviewed by Mark Lam. |
| |
| This patch fixes a bug in our JSImmutableButterfly implementation uncovered by |
| our stress GC bots. Before this patch, JSImmutableButterfly was allocated |
| with HeapCell::Kind::Auxiliary. This is wrong. Things that are JSCells must be |
| allocated from HeapCell::Kind::JSCell. The way this broke on the stress GC |
| bots is that our conservative marking won't do cell marking for things that |
| are Auxiliary. This means that if the stack is the only thing pointing to a |
| JSImmutableButterfly when a GC took place, that JSImmutableButterfly would |
| not be visited. This patch fixes this bug. This patch also extends our conservative |
| marking to understand that there may be interior pointers to things that are HeapCell::Kind::JSCell. |
| |
| * bytecompiler/NodesCodegen.cpp: |
| (JSC::ArrayNode::emitBytecode): |
| * heap/HeapUtil.h: |
| (JSC::HeapUtil::findGCObjectPointersForMarking): |
| * runtime/JSImmutableButterfly.h: |
| (JSC::JSImmutableButterfly::subspaceFor): |
| |
| 2018-06-25 Mark Lam <mark.lam@apple.com> |
| |
| constructArray() should set m_numValuesInVector to the specified length. |
| https://bugs.webkit.org/show_bug.cgi?id=187010 |
| <rdar://problem/41392167> |
| |
| Reviewed by Filip Pizlo. |
| |
| Its client will fill in the storage vector with some values using initializeIndex() |
| and expects m_numValuesInVector to be set to the length i.e. the number of values |
| to be initialized. |
| |
| * runtime/JSArray.cpp: |
| (JSC::constructArray): |
| |
| 2018-06-25 Mark Lam <mark.lam@apple.com> |
| |
| Add missing exception check in RegExpObjectInlines.h's collectMatches. |
| https://bugs.webkit.org/show_bug.cgi?id=187006 |
| <rdar://problem/41418412> |
| |
| Reviewed by Keith Miller. |
| |
| * runtime/RegExpObjectInlines.h: |
| (JSC::collectMatches): |
| |
| 2018-06-25 Tadeu Zagallo <tzagallo@apple.com> |
| |
| Add API for configuring the number of threads used by DFG and FTL |
| https://bugs.webkit.org/show_bug.cgi?id=186859 |
| <rdar://problem/41093519> |
| |
| Reviewed by Filip Pizlo. |
| |
| Add new private APIs for limiting the number of threads to be used by |
| the DFG and FTL compilers. It was already possible to configure the |
| limit through JSC Options, but now it can be changed at runtime, even |
| in the case when the VM is already running. |
| |
| Add a test for both cases: when trying to configure the limit before |
| and after the Worklist has been created, but in order to simulate the |
| first scenario, we must guarantee that the test runs at the very |
| beginning, so I also added a check for that. |
| |
| * API/JSVirtualMachine.mm: |
| (+[JSVirtualMachine setNumberOfDFGCompilerThreads:]): |
| (+[JSVirtualMachine setNumberOfFTLCompilerThreads:]): |
| * API/JSVirtualMachinePrivate.h: |
| * API/tests/testapi.mm: |
| (runJITThreadLimitTests): |
| (testObjectiveCAPIMain): |
| * dfg/DFGWorklist.cpp: |
| (JSC::DFG::Worklist::finishCreation): |
| (JSC::DFG::Worklist::createNewThread): |
| (JSC::DFG::Worklist::setNumberOfThreads): |
| * dfg/DFGWorklist.h: |
| |
| 2018-06-25 Yusuke Suzuki <utatane.tea@gmail.com> |
| |
| [JSC] Remove unnecessary PLATFORM guards |
| https://bugs.webkit.org/show_bug.cgi?id=186995 |
| |
| Reviewed by Mark Lam. |
| |
| * assembler/AssemblerCommon.h: |
| (JSC::isIOS): |
| Add constexpr. |
| |
| * inspector/JSGlobalObjectInspectorController.cpp: |
| (Inspector::JSGlobalObjectInspectorController::appendAPIBacktrace): |
| StackFrame works in all the platforms. If StackFrame::demangle failed, |
| it just returns std::nullopt. And it is correctly handled in this code. |
| |
| 2018-06-23 Mark Lam <mark.lam@apple.com> |
| |
| Add more debugging features to $vm. |
| https://bugs.webkit.org/show_bug.cgi?id=186947 |
| |
| Reviewed by Keith Miller. |
| |
| Adding the following features: |
| |
| // We now have println in addition to print. |
| // println automatically adds a '\n' at the end. |
| $vm.println("Hello"); |
| |
| // We can now capture some info about a stack frame. |
| var currentFrame = $vm.callFrame(); // Same as $vm.callFrame(0); |
| var callerCallerFrame = $vm.callFrame(2); |
| |
| // We can inspect the following values associated with the frame: |
| if (currentFrame.valid) { |
| $vm.println("name is ", currentFrame.name)); |
| |
| // Note: For a WASM frame, all of these will be undefined. |
| $vm.println("callee is ", $vm.value(currentFrame.callee)); |
| $vm.println("codeBlock is ", currentFrame.codeBlock); |
| $vm.println("unlinkedCodeBlock is ", currentFrame.unlinkedCodeBlock); |
| $vm.println("executable is ", currentFrame.executable); |
| } |
| |
| // Note that callee is a JSObject. I printed its $vm.value() because I wanted |
| // to dataLog its JSValue instead of its toString() result. |
| |
| // Note that $vm.println() (and $vm.print()) can now print internal JSCells |
| // (and Symbols) as JSValue dumps. It won't just fail on trying to do a |
| // toString on a non-object. |
| |
| // Does what it says about enabling/disabling debugger mode. |
| $vm.enableDebuggerModeWhenIdle(); |
| $vm.disableDebuggerModeWhenIdle(); |
| |
| * tools/JSDollarVM.cpp: |
| (WTF::JSDollarVMCallFrame::JSDollarVMCallFrame): |
| (WTF::JSDollarVMCallFrame::createStructure): |
| (WTF::JSDollarVMCallFrame::create): |
| (WTF::JSDollarVMCallFrame::finishCreation): |
| (WTF::JSDollarVMCallFrame::addProperty): |
| (JSC::functionCallFrame): |
| (JSC::functionCodeBlockForFrame): |
| (JSC::codeBlockFromArg): |
| (JSC::doPrintln): |
| (JSC::functionPrint): |
| (JSC::functionPrintln): |
| (JSC::changeDebuggerModeWhenIdle): |
| (JSC::functionEnableDebuggerModeWhenIdle): |
| (JSC::functionDisableDebuggerModeWhenIdle): |
| (JSC::JSDollarVM::finishCreation): |
| |
| 2018-06-22 Keith Miller <keith_miller@apple.com> |
| |
| We need to have a getDirectConcurrently for use in the compilers |
| https://bugs.webkit.org/show_bug.cgi?id=186954 |
| |
| Reviewed by Mark Lam. |
| |
| It used to be that the propertyStorage of an object never shrunk |
| so if you called getDirect with some offset it would never be an |
| OOB read. However, this property storage can shrink when calling |
| flattenDictionaryStructure. Fortunately, flattenDictionaryStructure |
| holds the Structure's ConcurrentJSLock while shrinking. This patch, |
| adds a getDirectConcurrently that will safely try to load from the |
| butterfly. |
| |
| * bytecode/ObjectPropertyConditionSet.cpp: |
| * bytecode/PropertyCondition.cpp: |
| (JSC::PropertyCondition::isStillValidAssumingImpurePropertyWatchpoint const): |
| (JSC::PropertyCondition::attemptToMakeEquivalenceWithoutBarrier const): |
| * dfg/DFGGraph.cpp: |
| (JSC::DFG::Graph::tryGetConstantProperty): |
| * runtime/JSObject.h: |
| (JSC::JSObject::getDirectConcurrently const): |
| |
| 2018-06-22 Yusuke Suzuki <utatane.tea@gmail.com> |
| |
| [WTF] Use Ref<> for the result type of non-failing factory functions |
| https://bugs.webkit.org/show_bug.cgi?id=186920 |
| |
| Reviewed by Darin Adler. |
| |
| * dfg/DFGWorklist.cpp: |
| (JSC::DFG::Worklist::ThreadBody::ThreadBody): |
| (JSC::DFG::Worklist::finishCreation): |
| * dfg/DFGWorklist.h: |
| * heap/Heap.cpp: |
| (JSC::Heap::Thread::Thread): |
| * heap/Heap.h: |
| * jit/JITWorklist.cpp: |
| (JSC::JITWorklist::Thread::Thread): |
| * jit/JITWorklist.h: |
| * runtime/VMTraps.cpp: |
| * runtime/VMTraps.h: |
| * wasm/WasmWorklist.cpp: |
| * wasm/WasmWorklist.h: |
| |
| 2018-06-23 Yusuke Suzuki <utatane.tea@gmail.com> |
| |
| [WTF] Add user-defined literal for ASCIILiteral |
| https://bugs.webkit.org/show_bug.cgi?id=186839 |
| |
| Reviewed by Darin Adler. |
| |
| * API/JSCallbackObjectFunctions.h: |
| (JSC::JSCallbackObject<Parent>::staticFunctionGetter): |
| (JSC::JSCallbackObject<Parent>::callbackGetter): |
| * API/JSObjectRef.cpp: |
| (JSObjectMakeFunctionWithCallback): |
| * API/JSTypedArray.cpp: |
| (JSObjectGetArrayBufferBytesPtr): |
| * API/JSValue.mm: |
| (valueToArray): |
| (valueToDictionary): |
| * API/ObjCCallbackFunction.mm: |
| (JSC::objCCallbackFunctionCallAsFunction): |
| (JSC::objCCallbackFunctionCallAsConstructor): |
| (JSC::ObjCCallbackFunctionImpl::call): |
| * API/glib/JSCCallbackFunction.cpp: |
| (JSC::JSCCallbackFunction::call): |
| (JSC::JSCCallbackFunction::construct): |
| * API/glib/JSCContext.cpp: |
| (jscContextJSValueToGValue): |
| * API/glib/JSCValue.cpp: |
| (jsc_value_object_define_property_accessor): |
| (jscValueFunctionCreate): |
| * builtins/BuiltinUtils.h: |
| * bytecode/CodeBlock.cpp: |
| (JSC::CodeBlock::nameForRegister): |
| * bytecompiler/BytecodeGenerator.cpp: |
| (JSC::BytecodeGenerator::emitEnumeration): |
| (JSC::BytecodeGenerator::emitIteratorNext): |
| (JSC::BytecodeGenerator::emitIteratorClose): |
| (JSC::BytecodeGenerator::emitDelegateYield): |
| * bytecompiler/NodesCodegen.cpp: |
| (JSC::FunctionCallValueNode::emitBytecode): |
| (JSC::PostfixNode::emitBytecode): |
| (JSC::PrefixNode::emitBytecode): |
| (JSC::AssignErrorNode::emitBytecode): |
| (JSC::ForInNode::emitBytecode): |
| (JSC::ForOfNode::emitBytecode): |
| (JSC::ClassExprNode::emitBytecode): |
| (JSC::ObjectPatternNode::bindValue const): |
| * dfg/DFGDriver.cpp: |
| (JSC::DFG::compileImpl): |
| * dfg/DFGOperations.cpp: |
| (JSC::DFG::newTypedArrayWithSize): |
| * dfg/DFGStrengthReductionPhase.cpp: |
| (JSC::DFG::StrengthReductionPhase::handleNode): |
| * inspector/ConsoleMessage.cpp: |
| (Inspector::ConsoleMessage::addToFrontend): |
| (Inspector::ConsoleMessage::clear): |
| * inspector/ContentSearchUtilities.cpp: |
| (Inspector::ContentSearchUtilities::findStylesheetSourceMapURL): |
| * inspector/InjectedScript.cpp: |
| (Inspector::InjectedScript::InjectedScript): |
| (Inspector::InjectedScript::evaluate): |
| (Inspector::InjectedScript::callFunctionOn): |
| (Inspector::InjectedScript::evaluateOnCallFrame): |
| (Inspector::InjectedScript::getFunctionDetails): |
| (Inspector::InjectedScript::functionDetails): |
| (Inspector::InjectedScript::getPreview): |
| (Inspector::InjectedScript::getProperties): |
| (Inspector::InjectedScript::getDisplayableProperties): |
| (Inspector::InjectedScript::getInternalProperties): |
| (Inspector::InjectedScript::getCollectionEntries): |
| (Inspector::InjectedScript::saveResult): |
| (Inspector::InjectedScript::wrapCallFrames const): |
| (Inspector::InjectedScript::wrapObject const): |
| (Inspector::InjectedScript::wrapJSONString const): |
| (Inspector::InjectedScript::wrapTable const): |
| (Inspector::InjectedScript::previewValue const): |
| (Inspector::InjectedScript::setExceptionValue): |
| (Inspector::InjectedScript::clearExceptionValue): |
| (Inspector::InjectedScript::findObjectById const): |
| (Inspector::InjectedScript::inspectObject): |
| (Inspector::InjectedScript::releaseObject): |
| (Inspector::InjectedScript::releaseObjectGroup): |
| * inspector/InjectedScriptBase.cpp: |
| (Inspector::InjectedScriptBase::makeEvalCall): |
| * inspector/InjectedScriptManager.cpp: |
| (Inspector::InjectedScriptManager::injectedScriptForObjectId): |
| * inspector/InjectedScriptModule.cpp: |
| (Inspector::InjectedScriptModule::ensureInjected): |
| * inspector/InspectorBackendDispatcher.cpp: |
| (Inspector::BackendDispatcher::dispatch): |
| (Inspector::BackendDispatcher::sendResponse): |
| (Inspector::BackendDispatcher::sendPendingErrors): |
| * inspector/JSGlobalObjectConsoleClient.cpp: |
| (Inspector::JSGlobalObjectConsoleClient::profile): |
| (Inspector::JSGlobalObjectConsoleClient::profileEnd): |
| (Inspector::JSGlobalObjectConsoleClient::timeStamp): |
| * inspector/JSGlobalObjectInspectorController.cpp: |
| (Inspector::JSGlobalObjectInspectorController::appendAPIBacktrace): |
| * inspector/JSInjectedScriptHost.cpp: |
| (Inspector::JSInjectedScriptHost::evaluateWithScopeExtension): |
| (Inspector::JSInjectedScriptHost::subtype): |
| (Inspector::JSInjectedScriptHost::getInternalProperties): |
| * inspector/JSJavaScriptCallFrame.cpp: |
| (Inspector::JSJavaScriptCallFrame::evaluateWithScopeExtension): |
| (Inspector::JSJavaScriptCallFrame::type const): |
| * inspector/ScriptArguments.cpp: |
| (Inspector::ScriptArguments::getFirstArgumentAsString): |
| * inspector/ScriptCallStackFactory.cpp: |
| (Inspector::extractSourceInformationFromException): |
| * inspector/agents/InspectorAgent.cpp: |
| (Inspector::InspectorAgent::InspectorAgent): |
| * inspector/agents/InspectorConsoleAgent.cpp: |
| (Inspector::InspectorConsoleAgent::InspectorConsoleAgent): |
| (Inspector::InspectorConsoleAgent::clearMessages): |
| (Inspector::InspectorConsoleAgent::count): |
| (Inspector::InspectorConsoleAgent::setLoggingChannelLevel): |
| * inspector/agents/InspectorDebuggerAgent.cpp: |
| (Inspector::InspectorDebuggerAgent::InspectorDebuggerAgent): |
| (Inspector::InspectorDebuggerAgent::setAsyncStackTraceDepth): |
| (Inspector::buildObjectForBreakpointCookie): |
| (Inspector::InspectorDebuggerAgent::breakpointActionsFromProtocol): |
| (Inspector::parseLocation): |
| (Inspector::InspectorDebuggerAgent::setBreakpointByUrl): |
| (Inspector::InspectorDebuggerAgent::setBreakpoint): |
| (Inspector::InspectorDebuggerAgent::continueToLocation): |
| (Inspector::InspectorDebuggerAgent::searchInContent): |
| (Inspector::InspectorDebuggerAgent::getScriptSource): |
| (Inspector::InspectorDebuggerAgent::getFunctionDetails): |
| (Inspector::InspectorDebuggerAgent::resume): |
| (Inspector::InspectorDebuggerAgent::setPauseOnExceptions): |
| (Inspector::InspectorDebuggerAgent::evaluateOnCallFrame): |
| (Inspector::InspectorDebuggerAgent::didParseSource): |
| (Inspector::InspectorDebuggerAgent::assertPaused): |
| * inspector/agents/InspectorHeapAgent.cpp: |
| (Inspector::InspectorHeapAgent::InspectorHeapAgent): |
| (Inspector::InspectorHeapAgent::nodeForHeapObjectIdentifier): |
| (Inspector::InspectorHeapAgent::getPreview): |
| (Inspector::InspectorHeapAgent::getRemoteObject): |
| * inspector/agents/InspectorRuntimeAgent.cpp: |
| (Inspector::InspectorRuntimeAgent::InspectorRuntimeAgent): |
| (Inspector::InspectorRuntimeAgent::callFunctionOn): |
| (Inspector::InspectorRuntimeAgent::getPreview): |
| (Inspector::InspectorRuntimeAgent::getProperties): |
| (Inspector::InspectorRuntimeAgent::getDisplayableProperties): |
| (Inspector::InspectorRuntimeAgent::getCollectionEntries): |
| (Inspector::InspectorRuntimeAgent::saveResult): |
| (Inspector::InspectorRuntimeAgent::getRuntimeTypesForVariablesAtOffsets): |
| (Inspector::InspectorRuntimeAgent::getBasicBlocks): |
| * inspector/agents/InspectorScriptProfilerAgent.cpp: |
| (Inspector::InspectorScriptProfilerAgent::InspectorScriptProfilerAgent): |
| * inspector/agents/JSGlobalObjectDebuggerAgent.cpp: |
| (Inspector::JSGlobalObjectDebuggerAgent::injectedScriptForEval): |
| * inspector/agents/JSGlobalObjectRuntimeAgent.cpp: |
| (Inspector::JSGlobalObjectRuntimeAgent::injectedScriptForEval): |
| * inspector/scripts/codegen/cpp_generator_templates.py: |
| * inspector/scripts/codegen/generate_cpp_backend_dispatcher_implementation.py: |
| (CppBackendDispatcherImplementationGenerator._generate_async_dispatcher_class_for_domain): |
| (CppBackendDispatcherImplementationGenerator._generate_dispatcher_implementation_for_command): |
| * inspector/scripts/codegen/generate_cpp_frontend_dispatcher_implementation.py: |
| (CppFrontendDispatcherImplementationGenerator._generate_dispatcher_implementation_for_event): |
| * inspector/scripts/codegen/generate_cpp_protocol_types_header.py: |
| * inspector/scripts/codegen/generate_cpp_protocol_types_implementation.py: |
| (CppProtocolTypesImplementationGenerator): |
| * inspector/scripts/codegen/generate_objc_backend_dispatcher_implementation.py: |
| (ObjCBackendDispatcherImplementationGenerator._generate_success_block_for_command): |
| (ObjCBackendDispatcherImplementationGenerator._generate_conversions_for_command): |
| * inspector/scripts/codegen/generate_objc_frontend_dispatcher_implementation.py: |
| (ObjCFrontendDispatcherImplementationGenerator._generate_event): |
| (ObjCFrontendDispatcherImplementationGenerator._generate_event_out_parameters): |
| * inspector/scripts/codegen/generate_objc_protocol_type_conversions_header.py: |
| (ObjCProtocolTypeConversionsHeaderGenerator._generate_enum_objc_to_protocol_string): |
| * inspector/scripts/codegen/objc_generator_templates.py: |
| * inspector/scripts/tests/all/expected/definitions-with-mac-platform.json-result: |
| * inspector/scripts/tests/generic/expected/commands-with-async-attribute.json-result: |
| * inspector/scripts/tests/generic/expected/commands-with-optional-call-return-parameters.json-result: |
| * inspector/scripts/tests/generic/expected/definitions-with-mac-platform.json-result: |
| * inspector/scripts/tests/generic/expected/domain-availability.json-result: |
| * inspector/scripts/tests/generic/expected/domains-with-varying-command-sizes.json-result: |
| * inspector/scripts/tests/generic/expected/enum-values.json-result: |
| * inspector/scripts/tests/generic/expected/events-with-optional-parameters.json-result: |
| * inspector/scripts/tests/generic/expected/generate-domains-with-feature-guards.json-result: |
| * inspector/scripts/tests/generic/expected/same-type-id-different-domain.json-result: |
| * inspector/scripts/tests/generic/expected/shadowed-optional-type-setters.json-result: |
| * inspector/scripts/tests/generic/expected/type-declaration-aliased-primitive-type.json-result: |
| * inspector/scripts/tests/generic/expected/type-declaration-array-type.json-result: |
| * inspector/scripts/tests/generic/expected/type-declaration-enum-type.json-result: |
| * inspector/scripts/tests/generic/expected/type-declaration-object-type.json-result: |
| * inspector/scripts/tests/generic/expected/type-requiring-runtime-casts.json-result: |
| * inspector/scripts/tests/generic/expected/type-with-open-parameters.json-result: |
| * inspector/scripts/tests/generic/expected/worker-supported-domains.json-result: |
| * inspector/scripts/tests/ios/expected/definitions-with-mac-platform.json-result: |
| * inspector/scripts/tests/mac/expected/definitions-with-mac-platform.json-result: |
| * interpreter/CallFrame.cpp: |
| (JSC::CallFrame::friendlyFunctionName): |
| * interpreter/Interpreter.cpp: |
| (JSC::Interpreter::execute): |
| * interpreter/StackVisitor.cpp: |
| (JSC::StackVisitor::Frame::functionName const): |
| (JSC::StackVisitor::Frame::sourceURL const): |
| * jit/JIT.cpp: |
| (JSC::JIT::doMainThreadPreparationBeforeCompile): |
| * jit/JITOperations.cpp: |
| * jsc.cpp: |
| (resolvePath): |
| (GlobalObject::moduleLoaderImportModule): |
| (GlobalObject::moduleLoaderResolve): |
| (functionDescribeArray): |
| (functionRun): |
| (functionLoad): |
| (functionCheckSyntax): |
| (functionDollarEvalScript): |
| (functionDollarAgentStart): |
| (functionDollarAgentReceiveBroadcast): |
| (functionDollarAgentBroadcast): |
| (functionTransferArrayBuffer): |
| (functionLoadModule): |
| (functionSamplingProfilerStackTraces): |
| (functionAsyncTestStart): |
| (functionWebAssemblyMemoryMode): |
| (runWithOptions): |
| * parser/Lexer.cpp: |
| (JSC::Lexer<T>::invalidCharacterMessage const): |
| (JSC::Lexer<T>::parseString): |
| (JSC::Lexer<T>::parseComplexEscape): |
| (JSC::Lexer<T>::parseStringSlowCase): |
| (JSC::Lexer<T>::parseTemplateLiteral): |
| (JSC::Lexer<T>::lex): |
| * parser/Parser.cpp: |
| (JSC::Parser<LexerType>::parseInner): |
| * parser/Parser.h: |
| (JSC::Parser::setErrorMessage): |
| * runtime/AbstractModuleRecord.cpp: |
| (JSC::AbstractModuleRecord::finishCreation): |
| * runtime/ArrayBuffer.cpp: |
| (JSC::errorMesasgeForTransfer): |
| * runtime/ArrayBufferSharingMode.h: |
| (JSC::arrayBufferSharingModeName): |
| * runtime/ArrayConstructor.cpp: |
| (JSC::constructArrayWithSizeQuirk): |
| (JSC::isArraySlowInline): |
| * runtime/ArrayPrototype.cpp: |
| (JSC::setLength): |
| (JSC::shift): |
| (JSC::unshift): |
| (JSC::arrayProtoFuncPop): |
| (JSC::arrayProtoFuncReverse): |
| (JSC::arrayProtoFuncUnShift): |
| * runtime/AtomicsObject.cpp: |
| (JSC::atomicsFuncWait): |
| (JSC::atomicsFuncWake): |
| * runtime/BigIntConstructor.cpp: |
| (JSC::BigIntConstructor::finishCreation): |
| (JSC::toBigInt): |
| (JSC::callBigIntConstructor): |
| * runtime/BigIntObject.cpp: |
| (JSC::BigIntObject::toStringName): |
| * runtime/BigIntPrototype.cpp: |
| (JSC::bigIntProtoFuncToString): |
| (JSC::bigIntProtoFuncValueOf): |
| * runtime/CommonSlowPaths.cpp: |
| (JSC::SLOW_PATH_DECL): |
| * runtime/ConsoleClient.cpp: |
| (JSC::ConsoleClient::printConsoleMessageWithArguments): |
| * runtime/ConsoleObject.cpp: |
| (JSC::valueOrDefaultLabelString): |
| (JSC::consoleProtoFuncTime): |
| (JSC::consoleProtoFuncTimeEnd): |
| * runtime/DatePrototype.cpp: |
| (JSC::formatLocaleDate): |
| (JSC::formateDateInstance): |
| (JSC::DatePrototype::finishCreation): |
| (JSC::dateProtoFuncToISOString): |
| (JSC::dateProtoFuncToJSON): |
| * runtime/Error.cpp: |
| (JSC::createNotEnoughArgumentsError): |
| (JSC::throwSyntaxError): |
| (JSC::createTypeError): |
| (JSC::createOutOfMemoryError): |
| * runtime/Error.h: |
| (JSC::throwVMError): |
| * runtime/ErrorConstructor.cpp: |
| (JSC::ErrorConstructor::finishCreation): |
| * runtime/ErrorInstance.cpp: |
| (JSC::ErrorInstance::sanitizedToString): |
| * runtime/ErrorPrototype.cpp: |
| (JSC::ErrorPrototype::finishCreation): |
| (JSC::errorProtoFuncToString): |
| * runtime/ExceptionFuzz.cpp: |
| (JSC::doExceptionFuzzing): |
| * runtime/ExceptionHelpers.cpp: |
| (JSC::TerminatedExecutionError::defaultValue): |
| (JSC::createStackOverflowError): |
| (JSC::createNotAConstructorError): |
| (JSC::createNotAFunctionError): |
| (JSC::createNotAnObjectError): |
| * runtime/GetterSetter.cpp: |
| (JSC::callSetter): |
| * runtime/IntlCollator.cpp: |
| (JSC::sortLocaleData): |
| (JSC::searchLocaleData): |
| (JSC::IntlCollator::initializeCollator): |
| (JSC::IntlCollator::compareStrings): |
| (JSC::IntlCollator::usageString): |
| (JSC::IntlCollator::sensitivityString): |
| (JSC::IntlCollator::caseFirstString): |
| (JSC::IntlCollator::resolvedOptions): |
| * runtime/IntlCollator.h: |
| * runtime/IntlCollatorConstructor.cpp: |
| (JSC::IntlCollatorConstructor::finishCreation): |
| * runtime/IntlCollatorPrototype.cpp: |
| (JSC::IntlCollatorPrototypeGetterCompare): |
| (JSC::IntlCollatorPrototypeFuncResolvedOptions): |
| * runtime/IntlDateTimeFormat.cpp: |
| (JSC::defaultTimeZone): |
| (JSC::canonicalizeTimeZoneName): |
| (JSC::IntlDTFInternal::localeData): |
| (JSC::IntlDTFInternal::toDateTimeOptionsAnyDate): |
| (JSC::IntlDateTimeFormat::initializeDateTimeFormat): |
| (JSC::IntlDateTimeFormat::weekdayString): |
| (JSC::IntlDateTimeFormat::eraString): |
| (JSC::IntlDateTimeFormat::yearString): |
| (JSC::IntlDateTimeFormat::monthString): |
| (JSC::IntlDateTimeFormat::dayString): |
| (JSC::IntlDateTimeFormat::hourString): |
| (JSC::IntlDateTimeFormat::minuteString): |
| (JSC::IntlDateTimeFormat::secondString): |
| (JSC::IntlDateTimeFormat::timeZoneNameString): |
| (JSC::IntlDateTimeFormat::resolvedOptions): |
| (JSC::IntlDateTimeFormat::format): |
| (JSC::IntlDateTimeFormat::partTypeString): |
| (JSC::IntlDateTimeFormat::formatToParts): |
| * runtime/IntlDateTimeFormat.h: |
| * runtime/IntlDateTimeFormatConstructor.cpp: |
| (JSC::IntlDateTimeFormatConstructor::finishCreation): |
| * runtime/IntlDateTimeFormatPrototype.cpp: |
| (JSC::IntlDateTimeFormatPrototypeGetterFormat): |
| (JSC::IntlDateTimeFormatPrototypeFuncFormatToParts): |
| (JSC::IntlDateTimeFormatPrototypeFuncResolvedOptions): |
| * runtime/IntlNumberFormat.cpp: |
| (JSC::IntlNumberFormat::initializeNumberFormat): |
| (JSC::IntlNumberFormat::formatNumber): |
| (JSC::IntlNumberFormat::styleString): |
| (JSC::IntlNumberFormat::currencyDisplayString): |
| (JSC::IntlNumberFormat::resolvedOptions): |
| (JSC::IntlNumberFormat::partTypeString): |
| (JSC::IntlNumberFormat::formatToParts): |
| * runtime/IntlNumberFormat.h: |
| * runtime/IntlNumberFormatConstructor.cpp: |
| (JSC::IntlNumberFormatConstructor::finishCreation): |
| * runtime/IntlNumberFormatPrototype.cpp: |
| (JSC::IntlNumberFormatPrototypeGetterFormat): |
| (JSC::IntlNumberFormatPrototypeFuncFormatToParts): |
| (JSC::IntlNumberFormatPrototypeFuncResolvedOptions): |
| * runtime/IntlObject.cpp: |
| (JSC::grandfatheredLangTag): |
| (JSC::canonicalizeLocaleList): |
| (JSC::resolveLocale): |
| (JSC::supportedLocales): |
| * runtime/IntlPluralRules.cpp: |
| (JSC::IntlPluralRules::initializePluralRules): |
| (JSC::IntlPluralRules::resolvedOptions): |
| (JSC::IntlPluralRules::select): |
| * runtime/IntlPluralRulesConstructor.cpp: |
| (JSC::IntlPluralRulesConstructor::finishCreation): |
| * runtime/IntlPluralRulesPrototype.cpp: |
| (JSC::IntlPluralRulesPrototypeFuncSelect): |
| (JSC::IntlPluralRulesPrototypeFuncResolvedOptions): |
| * runtime/IteratorOperations.cpp: |
| (JSC::iteratorNext): |
| (JSC::iteratorClose): |
| (JSC::hasIteratorMethod): |
| (JSC::iteratorMethod): |
| * runtime/JSArray.cpp: |
| (JSC::JSArray::tryCreateUninitializedRestricted): |
| (JSC::JSArray::defineOwnProperty): |
| (JSC::JSArray::put): |
| (JSC::JSArray::setLengthWithArrayStorage): |
| (JSC::JSArray::appendMemcpy): |
| (JSC::JSArray::pop): |
| * runtime/JSArray.h: |
| * runtime/JSArrayBufferConstructor.cpp: |
| (JSC::JSArrayBufferConstructor::finishCreation): |
| * runtime/JSArrayBufferPrototype.cpp: |
| (JSC::arrayBufferProtoFuncSlice): |
| (JSC::arrayBufferProtoGetterFuncByteLength): |
| (JSC::sharedArrayBufferProtoGetterFuncByteLength): |
| * runtime/JSArrayBufferView.cpp: |
| (JSC::JSArrayBufferView::toStringName): |
| * runtime/JSArrayInlines.h: |
| (JSC::JSArray::pushInline): |
| * runtime/JSBigInt.cpp: |
| (JSC::JSBigInt::divide): |
| (JSC::JSBigInt::remainder): |
| (JSC::JSBigInt::toNumber const): |
| * runtime/JSCJSValue.cpp: |
| (JSC::JSValue::putToPrimitive): |
| (JSC::JSValue::putToPrimitiveByIndex): |
| (JSC::JSValue::toStringSlowCase const): |
| * runtime/JSCJSValueInlines.h: |
| (JSC::toPreferredPrimitiveType): |
| * runtime/JSDataView.cpp: |
| (JSC::JSDataView::create): |
| (JSC::JSDataView::put): |
| (JSC::JSDataView::defineOwnProperty): |
| * runtime/JSDataViewPrototype.cpp: |
| (JSC::getData): |
| (JSC::setData): |
| * runtime/JSFunction.cpp: |
| (JSC::JSFunction::callerGetter): |
| (JSC::JSFunction::put): |
| (JSC::JSFunction::defineOwnProperty): |
| * runtime/JSGenericTypedArrayView.h: |
| * runtime/JSGenericTypedArrayViewConstructorInlines.h: |
| (JSC::constructGenericTypedArrayViewWithArguments): |
| (JSC::constructGenericTypedArrayView): |
| * runtime/JSGenericTypedArrayViewInlines.h: |
| (JSC::JSGenericTypedArrayView<Adaptor>::deleteProperty): |
| * runtime/JSGenericTypedArrayViewPrototypeFunctions.h: |
| (JSC::speciesConstruct): |
| (JSC::genericTypedArrayViewProtoFuncSet): |
| (JSC::genericTypedArrayViewProtoFuncIndexOf): |
| (JSC::genericTypedArrayViewProtoFuncLastIndexOf): |
| (JSC::genericTypedArrayViewPrivateFuncSubarrayCreate): |
| * runtime/JSGlobalObject.cpp: |
| (JSC::JSGlobalObject::init): |
| * runtime/JSGlobalObjectDebuggable.cpp: |
| (JSC::JSGlobalObjectDebuggable::name const): |
| * runtime/JSGlobalObjectFunctions.cpp: |
| (JSC::encode): |
| (JSC::decode): |
| (JSC::globalFuncProtoSetter): |
| * runtime/JSGlobalObjectFunctions.h: |
| * runtime/JSMap.cpp: |
| (JSC::JSMap::toStringName): |
| * runtime/JSModuleEnvironment.cpp: |
| (JSC::JSModuleEnvironment::put): |
| * runtime/JSModuleNamespaceObject.cpp: |
| (JSC::JSModuleNamespaceObject::put): |
| (JSC::JSModuleNamespaceObject::putByIndex): |
| (JSC::JSModuleNamespaceObject::defineOwnProperty): |
| * runtime/JSONObject.cpp: |
| (JSC::Stringifier::appendStringifiedValue): |
| (JSC::JSONProtoFuncParse): |
| (JSC::JSONProtoFuncStringify): |
| * runtime/JSObject.cpp: |
| (JSC::getClassPropertyNames): |
| (JSC::JSObject::calculatedClassName): |
| (JSC::ordinarySetSlow): |
| (JSC::JSObject::putInlineSlow): |
| (JSC::JSObject::setPrototypeWithCycleCheck): |
| (JSC::callToPrimitiveFunction): |
| (JSC::JSObject::ordinaryToPrimitive const): |
| (JSC::JSObject::defaultHasInstance): |
| (JSC::JSObject::defineOwnIndexedProperty): |
| (JSC::JSObject::putByIndexBeyondVectorLengthWithArrayStorage): |
| (JSC::JSObject::putDirectIndexBeyondVectorLengthWithArrayStorage): |
| (JSC::validateAndApplyPropertyDescriptor): |
| * runtime/JSObject.h: |
| * runtime/JSObjectInlines.h: |
| (JSC::JSObject::putInlineForJSObject): |
| * runtime/JSPromiseConstructor.cpp: |
| (JSC::JSPromiseConstructor::finishCreation): |
| * runtime/JSSet.cpp: |
| (JSC::JSSet::toStringName): |
| * runtime/JSSymbolTableObject.h: |
| (JSC::symbolTablePut): |
| * runtime/JSTypedArrayViewConstructor.cpp: |
| (JSC::constructTypedArrayView): |
| * runtime/JSTypedArrayViewPrototype.cpp: |
| (JSC::typedArrayViewPrivateFuncLength): |
| (JSC::typedArrayViewProtoFuncSet): |
| (JSC::typedArrayViewProtoFuncCopyWithin): |
| (JSC::typedArrayViewProtoFuncLastIndexOf): |
| (JSC::typedArrayViewProtoFuncIndexOf): |
| (JSC::typedArrayViewProtoFuncJoin): |
| (JSC::typedArrayViewProtoGetterFuncBuffer): |
| (JSC::typedArrayViewProtoGetterFuncLength): |
| (JSC::typedArrayViewProtoGetterFuncByteLength): |
| (JSC::typedArrayViewProtoGetterFuncByteOffset): |
| (JSC::typedArrayViewProtoFuncReverse): |
| (JSC::typedArrayViewPrivateFuncSubarrayCreate): |
| (JSC::typedArrayViewProtoFuncSlice): |
| (JSC::JSTypedArrayViewPrototype::finishCreation): |
| * runtime/JSWeakMap.cpp: |
| (JSC::JSWeakMap::toStringName): |
| * runtime/JSWeakSet.cpp: |
| (JSC::JSWeakSet::toStringName): |
| * runtime/LiteralParser.cpp: |
| (JSC::LiteralParser<CharType>::Lexer::lex): |
| (JSC::LiteralParser<CharType>::Lexer::lexStringSlow): |
| (JSC::LiteralParser<CharType>::Lexer::lexNumber): |
| (JSC::LiteralParser<CharType>::parse): |
| * runtime/LiteralParser.h: |
| (JSC::LiteralParser::getErrorMessage): |
| * runtime/Lookup.cpp: |
| (JSC::reifyStaticAccessor): |
| * runtime/Lookup.h: |
| (JSC::putEntry): |
| * runtime/MapPrototype.cpp: |
| (JSC::getMap): |
| * runtime/NullSetterFunction.cpp: |
| (JSC::NullSetterFunctionInternal::callReturnUndefined): |
| * runtime/NumberPrototype.cpp: |
| (JSC::numberProtoFuncToExponential): |
| (JSC::numberProtoFuncToFixed): |
| (JSC::numberProtoFuncToPrecision): |
| (JSC::extractToStringRadixArgument): |
| * runtime/ObjectConstructor.cpp: |
| (JSC::objectConstructorSetPrototypeOf): |
| (JSC::objectConstructorAssign): |
| (JSC::objectConstructorValues): |
| (JSC::toPropertyDescriptor): |
| (JSC::objectConstructorDefineProperty): |
| (JSC::objectConstructorDefineProperties): |
| (JSC::objectConstructorCreate): |
| (JSC::objectConstructorSeal): |
| (JSC::objectConstructorFreeze): |
| * runtime/ObjectPrototype.cpp: |
| (JSC::objectProtoFuncDefineGetter): |
| (JSC::objectProtoFuncDefineSetter): |
| * runtime/Operations.cpp: |
| (JSC::jsAddSlowCase): |
| * runtime/Operations.h: |
| (JSC::jsSub): |
| (JSC::jsMul): |
| * runtime/ProgramExecutable.cpp: |
| (JSC::ProgramExecutable::initializeGlobalProperties): |
| * runtime/ProxyConstructor.cpp: |
| (JSC::makeRevocableProxy): |
| (JSC::proxyRevocableConstructorThrowError): |
| (JSC::ProxyConstructor::finishCreation): |
| (JSC::constructProxyObject): |
| * runtime/ProxyObject.cpp: |
| (JSC::ProxyObject::toStringName): |
| (JSC::ProxyObject::finishCreation): |
| (JSC::performProxyGet): |
| (JSC::ProxyObject::performInternalMethodGetOwnProperty): |
| (JSC::ProxyObject::performHasProperty): |
| (JSC::ProxyObject::performPut): |
| (JSC::performProxyCall): |
| (JSC::performProxyConstruct): |
| (JSC::ProxyObject::performDelete): |
| (JSC::ProxyObject::performPreventExtensions): |
| (JSC::ProxyObject::performIsExtensible): |
| (JSC::ProxyObject::performDefineOwnProperty): |
| (JSC::ProxyObject::performGetOwnPropertyNames): |
| (JSC::ProxyObject::performSetPrototype): |
| (JSC::ProxyObject::performGetPrototype): |
| * runtime/ReflectObject.cpp: |
| (JSC::reflectObjectConstruct): |
| (JSC::reflectObjectDefineProperty): |
| (JSC::reflectObjectGet): |
| (JSC::reflectObjectGetOwnPropertyDescriptor): |
| (JSC::reflectObjectGetPrototypeOf): |
| (JSC::reflectObjectIsExtensible): |
| (JSC::reflectObjectOwnKeys): |
| (JSC::reflectObjectPreventExtensions): |
| (JSC::reflectObjectSet): |
| (JSC::reflectObjectSetPrototypeOf): |
| * runtime/RegExpConstructor.cpp: |
| (JSC::RegExpConstructor::finishCreation): |
| (JSC::toFlags): |
| * runtime/RegExpObject.cpp: |
| (JSC::RegExpObject::defineOwnProperty): |
| * runtime/RegExpObject.h: |
| * runtime/RegExpPrototype.cpp: |
| (JSC::regExpProtoFuncCompile): |
| (JSC::regExpProtoGetterGlobal): |
| (JSC::regExpProtoGetterIgnoreCase): |
| (JSC::regExpProtoGetterMultiline): |
| (JSC::regExpProtoGetterDotAll): |
| (JSC::regExpProtoGetterSticky): |
| (JSC::regExpProtoGetterUnicode): |
| (JSC::regExpProtoGetterFlags): |
| (JSC::regExpProtoGetterSourceInternal): |
| (JSC::regExpProtoGetterSource): |
| * runtime/RuntimeType.cpp: |
| (JSC::runtimeTypeAsString): |
| * runtime/SamplingProfiler.cpp: |
| (JSC::SamplingProfiler::StackFrame::displayName): |
| (JSC::SamplingProfiler::StackFrame::displayNameForJSONTests): |
| * runtime/ScriptExecutable.cpp: |
| (JSC::ScriptExecutable::prepareForExecutionImpl): |
| * runtime/SetPrototype.cpp: |
| (JSC::getSet): |
| * runtime/SparseArrayValueMap.cpp: |
| (JSC::SparseArrayValueMap::putEntry): |
| (JSC::SparseArrayValueMap::putDirect): |
| (JSC::SparseArrayEntry::put): |
| * runtime/StackFrame.cpp: |
| (JSC::StackFrame::sourceURL const): |
| (JSC::StackFrame::functionName const): |
| * runtime/StringConstructor.cpp: |
| (JSC::stringFromCodePoint): |
| * runtime/StringObject.cpp: |
| (JSC::StringObject::put): |
| (JSC::StringObject::putByIndex): |
| * runtime/StringPrototype.cpp: |
| (JSC::StringPrototype::finishCreation): |
| (JSC::toLocaleCase): |
| (JSC::stringProtoFuncNormalize): |
| * runtime/Symbol.cpp: |
| (JSC::Symbol::toNumber const): |
| * runtime/SymbolConstructor.cpp: |
| (JSC::symbolConstructorKeyFor): |
| * runtime/SymbolObject.cpp: |
| (JSC::SymbolObject::toStringName): |
| * runtime/SymbolPrototype.cpp: |
| (JSC::SymbolPrototype::finishCreation): |
| * runtime/TypeSet.cpp: |
| (JSC::TypeSet::dumpTypes const): |
| (JSC::TypeSet::displayName const): |
| (JSC::StructureShape::leastCommonAncestor): |
| * runtime/TypeSet.h: |
| (JSC::StructureShape::setConstructorName): |
| * runtime/VM.cpp: |
| (JSC::VM::dumpTypeProfilerData): |
| * runtime/WeakMapPrototype.cpp: |
| (JSC::getWeakMap): |
| (JSC::protoFuncWeakMapSet): |
| * runtime/WeakSetPrototype.cpp: |
| (JSC::getWeakSet): |
| (JSC::protoFuncWeakSetAdd): |
| * tools/JSDollarVM.cpp: |
| (WTF::DOMJITGetterComplex::DOMJITAttribute::slowCall): |
| (WTF::DOMJITGetterComplex::customGetter): |
| (JSC::functionSetImpureGetterDelegate): |
| (JSC::functionCreateElement): |
| (JSC::functionGetHiddenValue): |
| (JSC::functionSetHiddenValue): |
| (JSC::functionFindTypeForExpression): |
| (JSC::functionReturnTypeFor): |
| (JSC::functionLoadGetterFromGetterSetter): |
| * wasm/WasmB3IRGenerator.cpp: |
| (JSC::Wasm::B3IRGenerator::fail const): |
| * wasm/WasmIndexOrName.cpp: |
| (JSC::Wasm::makeString): |
| * wasm/WasmParser.h: |
| (JSC::Wasm::FailureHelper::makeString): |
| (JSC::Wasm::Parser::fail const): |
| * wasm/WasmPlan.cpp: |
| (JSC::Wasm::Plan::tryRemoveContextAndCancelIfLast): |
| * wasm/WasmValidate.cpp: |
| (JSC::Wasm::Validate::fail const): |
| * wasm/js/JSWebAssemblyCodeBlock.cpp: |
| (JSC::JSWebAssemblyCodeBlock::JSWebAssemblyCodeBlock): |
| * wasm/js/JSWebAssemblyHelpers.h: |
| (JSC::toNonWrappingUint32): |
| (JSC::getWasmBufferFromValue): |
| * wasm/js/JSWebAssemblyInstance.cpp: |
| (JSC::JSWebAssemblyInstance::create): |
| * wasm/js/JSWebAssemblyMemory.cpp: |
| (JSC::JSWebAssemblyMemory::grow): |
| * wasm/js/WasmToJS.cpp: |
| (JSC::Wasm::handleBadI64Use): |
| * wasm/js/WebAssemblyCompileErrorConstructor.cpp: |
| (JSC::WebAssemblyCompileErrorConstructor::finishCreation): |
| * wasm/js/WebAssemblyInstanceConstructor.cpp: |
| (JSC::constructJSWebAssemblyInstance): |
| (JSC::WebAssemblyInstanceConstructor::finishCreation): |
| * wasm/js/WebAssemblyInstancePrototype.cpp: |
| (JSC::getInstance): |
| * wasm/js/WebAssemblyLinkErrorConstructor.cpp: |
| (JSC::WebAssemblyLinkErrorConstructor::finishCreation): |
| * wasm/js/WebAssemblyMemoryConstructor.cpp: |
| (JSC::constructJSWebAssemblyMemory): |
| (JSC::WebAssemblyMemoryConstructor::finishCreation): |
| * wasm/js/WebAssemblyMemoryPrototype.cpp: |
| (JSC::getMemory): |
| * wasm/js/WebAssemblyModuleConstructor.cpp: |
| (JSC::webAssemblyModuleCustomSections): |
| (JSC::webAssemblyModuleImports): |
| (JSC::webAssemblyModuleExports): |
| (JSC::WebAssemblyModuleConstructor::finishCreation): |
| * wasm/js/WebAssemblyModuleRecord.cpp: |
| (JSC::WebAssemblyModuleRecord::link): |
| (JSC::dataSegmentFail): |
| (JSC::WebAssemblyModuleRecord::evaluate): |
| * wasm/js/WebAssemblyPrototype.cpp: |
| (JSC::resolve): |
| (JSC::webAssemblyInstantiateFunc): |
| (JSC::webAssemblyInstantiateStreamingInternal): |
| * wasm/js/WebAssemblyRuntimeErrorConstructor.cpp: |
| (JSC::WebAssemblyRuntimeErrorConstructor::finishCreation): |
| * wasm/js/WebAssemblyTableConstructor.cpp: |
| (JSC::constructJSWebAssemblyTable): |
| (JSC::WebAssemblyTableConstructor::finishCreation): |
| * wasm/js/WebAssemblyTablePrototype.cpp: |
| (JSC::getTable): |
| (JSC::webAssemblyTableProtoFuncGrow): |
| (JSC::webAssemblyTableProtoFuncGet): |
| (JSC::webAssemblyTableProtoFuncSet): |
| |
| 2018-06-22 Keith Miller <keith_miller@apple.com> |
| |
| unshift should zero unused property storage |
| https://bugs.webkit.org/show_bug.cgi?id=186960 |
| |
| Reviewed by Saam Barati. |
| |
| Also, this patch adds the zeroed unused property storage assertion |
| to one more place it was missing. |
| |
| * runtime/JSArray.cpp: |
| (JSC::JSArray::unshiftCountSlowCase): |
| * runtime/JSObjectInlines.h: |
| (JSC::JSObject::putDirectInternal): |
| |
| 2018-06-22 Mark Lam <mark.lam@apple.com> |
| |
| PropertyCondition::isValidValueForAttributes() should also consider deleted values. |
| https://bugs.webkit.org/show_bug.cgi?id=186943 |
| <rdar://problem/41370337> |
| |
| Reviewed by Saam Barati. |
| |
| PropertyCondition::isValidValueForAttributes() should check if the passed in value |
| is a deleted one before it does a jsDynamicCast on it. |
| |
| * bytecode/PropertyCondition.cpp: |
| (JSC::PropertyCondition::isValidValueForAttributes): |
| * runtime/JSCJSValueInlines.h: |
| - removed an unnecessary #if. |
| |
| 2018-06-22 Keith Miller <keith_miller@apple.com> |
| |
| performProxyCall should toThis the value passed to its handler |
| https://bugs.webkit.org/show_bug.cgi?id=186951 |
| |
| Reviewed by Mark Lam. |
| |
| * runtime/ProxyObject.cpp: |
| (JSC::performProxyCall): |
| |
| 2018-06-22 Saam Barati <sbarati@apple.com> |
| |
| ensureWritableX should only convert away from CoW when it will succeed |
| https://bugs.webkit.org/show_bug.cgi?id=186898 |
| |
| Reviewed by Keith Miller. |
| |
| Otherwise, when we OSR exit, we'll end up profiling the array after |
| it has been converted away from CoW. It's better for the ArrayProfile |
| to see the array as it's still in CoW mode. |
| |
| This patch also renames ensureWritableX to tryMakeWritableX since these |
| were never really "ensure" operations -- they may fail and return null. |
| |
| * dfg/DFGOperations.cpp: |
| * runtime/JSObject.cpp: |
| (JSC::JSObject::tryMakeWritableInt32Slow): |
| (JSC::JSObject::tryMakeWritableDoubleSlow): |
| (JSC::JSObject::tryMakeWritableContiguousSlow): |
| (JSC::JSObject::ensureWritableInt32Slow): Deleted. |
| (JSC::JSObject::ensureWritableDoubleSlow): Deleted. |
| (JSC::JSObject::ensureWritableContiguousSlow): Deleted. |
| * runtime/JSObject.h: |
| (JSC::JSObject::tryMakeWritableInt32): |
| (JSC::JSObject::tryMakeWritableDouble): |
| (JSC::JSObject::tryMakeWritableContiguous): |
| (JSC::JSObject::ensureWritableInt32): Deleted. |
| (JSC::JSObject::ensureWritableDouble): Deleted. |
| (JSC::JSObject::ensureWritableContiguous): Deleted. |
| |
| 2018-06-22 Keith Miller <keith_miller@apple.com> |
| |
| We should call visitChildren on Base not the exact typename |
| https://bugs.webkit.org/show_bug.cgi?id=186928 |
| |
| Reviewed by Mark Lam. |
| |
| A lot of places were not properly calling visitChildren on their |
| superclass. For most of them it didn't matter because they had |
| immortal structures. If code changed in the future this might |
| break things however. |
| |
| Also, block off more of the MethodTable for GetterSetter objects. |
| |
| * bytecode/CodeBlock.cpp: |
| (JSC::CodeBlock::visitChildren): |
| * bytecode/ExecutableToCodeBlockEdge.cpp: |
| (JSC::ExecutableToCodeBlockEdge::visitChildren): |
| * debugger/DebuggerScope.cpp: |
| (JSC::DebuggerScope::visitChildren): |
| * runtime/EvalExecutable.cpp: |
| (JSC::EvalExecutable::visitChildren): |
| * runtime/FunctionExecutable.cpp: |
| (JSC::FunctionExecutable::visitChildren): |
| * runtime/FunctionRareData.cpp: |
| (JSC::FunctionRareData::visitChildren): |
| * runtime/GenericArgumentsInlines.h: |
| (JSC::GenericArguments<Type>::visitChildren): |
| * runtime/GetterSetter.cpp: |
| (JSC::GetterSetter::visitChildren): |
| * runtime/GetterSetter.h: |
| * runtime/InferredType.cpp: |
| (JSC::InferredType::visitChildren): |
| * runtime/InferredTypeTable.cpp: |
| (JSC::InferredTypeTable::visitChildren): |
| * runtime/InferredValue.cpp: |
| (JSC::InferredValue::visitChildren): |
| * runtime/JSArrayBufferView.cpp: |
| (JSC::JSArrayBufferView::visitChildren): |
| * runtime/JSGenericTypedArrayViewInlines.h: |
| (JSC::JSGenericTypedArrayView<Adaptor>::visitChildren): |
| * runtime/ModuleProgramExecutable.cpp: |
| (JSC::ModuleProgramExecutable::visitChildren): |
| * runtime/ProgramExecutable.cpp: |
| (JSC::ProgramExecutable::visitChildren): |
| * runtime/ScopedArguments.cpp: |
| (JSC::ScopedArguments::visitChildren): |
| * runtime/ScopedArguments.h: |
| * runtime/Structure.cpp: |
| (JSC::Structure::visitChildren): |
| * runtime/StructureRareData.cpp: |
| (JSC::StructureRareData::visitChildren): |
| * runtime/SymbolTable.cpp: |
| (JSC::SymbolTable::visitChildren): |
| |
| 2018-06-20 Darin Adler <darin@apple.com> |
| |
| [Cocoa] Use the isDirectory: variants of NSURL methods more to eliminate unnecessary file system activity |
| https://bugs.webkit.org/show_bug.cgi?id=186875 |
| |
| Reviewed by Anders Carlsson. |
| |
| * API/tests/testapi.mm: |
| (testObjectiveCAPIMain): Use isDirectory:NO when creating a URL for a JavaScript file. |
| |
| 2018-06-22 Carlos Garcia Campos <cgarcia@igalia.com> |
| |
| [GTK] WebDriver: use a dictionary for session capabilities in StartAutomationSession message |
| https://bugs.webkit.org/show_bug.cgi?id=186915 |
| |
| Reviewed by Žan Doberšek. |
| |
| Update StartAutomationSession message handling to receive a dictionary of session capabilities. |
| |
| * inspector/remote/glib/RemoteInspectorServer.cpp: |
| (Inspector::processSessionCapabilities): Helper method to process the session capabilities. |
| |
| 2018-06-21 Mark Lam <mark.lam@apple.com> |
| |
| WebKit (JavaScriptCore) compilation error with Clang ≥ 6. |
| https://bugs.webkit.org/show_bug.cgi?id=185947 |
| <rdar://problem/40131933> |
| |
| Reviewed by Saam Barati. |
| |
| Newer Clang versions (due to C++17 support) is not happy with how I implemented |
| conversions between CodeLocation types. We'll fix this by adding a conversion |
| operator for converting between CodeLocation types. |
| |
| * assembler/CodeLocation.h: |
| (JSC::CodeLocationCommon::operator T): |
| |
| 2018-06-21 Saam Barati <sbarati@apple.com> |
| |
| Do some CoW cleanup |
| https://bugs.webkit.org/show_bug.cgi?id=186896 |
| |
| Reviewed by Mark Lam. |
| |
| * bytecode/UnlinkedCodeBlock.h: |
| (JSC::UnlinkedCodeBlock::decompressArrayAllocationProfile): |
| We don't need to WTFMove() ints |
| |
| * dfg/DFGByteCodeParser.cpp: |
| (JSC::DFG::ByteCodeParser::parseBlock): |
| remove a TODO. |
| |
| * runtime/JSObject.cpp: |
| (JSC::JSObject::putByIndex): |
| We were checking for isCopyOnWrite even after we converted away |
| from CoW in above code. |
| (JSC::JSObject::ensureWritableInt32Slow): |
| Model this in the same way the other ensureWritableXSlow are modeled. |
| |
| 2018-06-20 Keith Miller <keith_miller@apple.com> |
| |
| flattenDictionaryStruture needs to zero inline storage. |
| https://bugs.webkit.org/show_bug.cgi?id=186869 |
| |
| Reviewed by Saam Barati. |
| |
| This patch also adds the assetion that unused property storage is |
| zero or JSValue() to putDirectInternal. Additionally, functions |
| have been added to $vm that flatten dictionary objects and return |
| the inline capacity of an object. |
| |
| * runtime/JSObjectInlines.h: |
| (JSC::JSObject::putDirectInternal): |
| * runtime/Structure.cpp: |
| (JSC::Structure::flattenDictionaryStructure): |
| * tools/JSDollarVM.cpp: |
| (JSC::functionInlineCapacity): |
| (JSC::functionFlattenDictionaryObject): |
| (JSC::JSDollarVM::finishCreation): |
| |
| 2018-06-21 Mark Lam <mark.lam@apple.com> |
| |
| Use IsoCellSets to track Executables with clearable code. |
| https://bugs.webkit.org/show_bug.cgi?id=186877 |
| |
| Reviewed by Filip Pizlo. |
| |
| Here’s an example of the results that this fix may yield: |
| 1. The workload: load cnn.com, wait for it to fully load, scroll down and up. |
| 2. Statistics on memory touched and memory freed by VM::deleteAllCode(): |
| |
| Visiting Executables: |
| Old New |
| Number of objects visited: 70897 14264 |
| Number of objects with deletable code: 14264 (20.1%) 14264 (100%) |
| Number of memory pages visited: 3224 1602 |
| Number of memory pages with deletable code: 1602 (49.7%) 1602 (100%) |
| |
| Visitng UnlinkedFunctionExecutables: |
| Old New |
| Number of objects visited: 105454 17231 |
| Number of objects with deletable code: 42319 (20.1%) 17231 (100%) ** |
| Number of memory pages visited: 4796 1349 |
| Number of memory pages with deletable code: 4013 (83.7%) 1349 (100%) |
| |
| ** The number of objects differ because the old code only visit unlinked |
| executables indirectly via linked executables, whereas the new behavior visit |
| all unlinked executables with deletable code directly. This means: |
| |
| a. we used to not visit unlinked executables that have not been linked yet |
| i.e. deleteAllCode() may not delete all code (especially code that is not |
| used). |
| b. we had to visit all linked executables to check if they of type |
| FunctionExecutable, before going on to visit their unlinked executable, and |
| this includes the ones that do not have deletable code. This means that we |
| would touch more memory in the process. |
| |
| Both of these these issues are now fixed with the new code. |
| |
| This code was tested with manually inserted instrumentation to track the above |
| statistics. It is not feasible to write an automated test for this without |
| leaving a lot of invasive instrumentation in the code. |
| |
| * bytecode/UnlinkedFunctionExecutable.cpp: |
| (JSC::UnlinkedFunctionExecutable::unlinkedCodeBlockFor): |
| * bytecode/UnlinkedFunctionExecutable.h: |
| * heap/CodeBlockSetInlines.h: |
| (JSC::CodeBlockSet::iterateViaSubspaces): |
| * heap/Heap.cpp: |
| (JSC::Heap::deleteAllCodeBlocks): |
| (JSC::Heap::deleteAllUnlinkedCodeBlocks): |
| (JSC::Heap::deleteUnmarkedCompiledCode): |
| (JSC::Heap::clearUnmarkedExecutables): Deleted. |
| (JSC::Heap::addExecutable): Deleted. |
| * heap/Heap.h: |
| * runtime/DirectEvalExecutable.h: |
| |
| * runtime/ExecutableBase.cpp: |
| (JSC::ExecutableBase::hasClearableCode const): |
| - this is written based on the implementation of ExecutableBase::clearCode(). |
| |
| * runtime/ExecutableBase.h: |
| * runtime/FunctionExecutable.h: |
| * runtime/IndirectEvalExecutable.h: |
| * runtime/ModuleProgramExecutable.h: |
| * runtime/ProgramExecutable.h: |
| * runtime/ScriptExecutable.cpp: |
| (JSC::ScriptExecutable::clearCode): |
| (JSC::ScriptExecutable::installCode): |
| * runtime/ScriptExecutable.h: |
| (JSC::ScriptExecutable::finishCreation): |
| * runtime/VM.cpp: |
| (JSC::VM::VM): |
| * runtime/VM.h: |
| (JSC::VM::ScriptExecutableSpaceAndSet::ScriptExecutableSpaceAndSet): |
| (JSC::VM::ScriptExecutableSpaceAndSet::clearableCodeSetFor): |
| (JSC::VM::forEachScriptExecutableSpace): |
| (JSC::VM::UnlinkedFunctionExecutableSpaceAndSet::UnlinkedFunctionExecutableSpaceAndSet): |
| (JSC::VM::UnlinkedFunctionExecutableSpaceAndSet::clearableCodeSetFor): |
| |
| 2018-06-21 Zan Dobersek <zdobersek@igalia.com> |
| |
| [GTK] WebDriver: allow applying host-specific TLS certificates for automated sessions |
| https://bugs.webkit.org/show_bug.cgi?id=186884 |
| |
| Reviewed by Carlos Garcia Campos. |
| |
| Add a tuple array input parameter to the StartAutomationSession DBus |
| message, representing a list of host-and-certificate pairs that have to |
| be allowed for a given session. This array is then unpacked and used to |
| fill out the certificates Vector object in the SessionCapabilities |
| struct. |
| |
| * inspector/remote/RemoteInspector.h: Add a GLib-specific Vector of |
| String pairs representing hosts and the certificate file paths. |
| * inspector/remote/glib/RemoteInspectorServer.cpp: |
| |
| 2018-06-20 Keith Miller <keith_miller@apple.com> |
| |
| Expand concurrent GC assertion to accept JSValue() or 0 |
| https://bugs.webkit.org/show_bug.cgi?id=186855 |
| |
| Reviewed by Mark Lam. |
| |
| We tend to set unused property slots to either JSValue() or 0 |
| depending on the context. On 64-bit these are the same but on |
| 32-bit JSValue() has a NaN tag. This patch makes it so we |
| the accept either JSValue() or 0. |
| |
| * runtime/JSObjectInlines.h: |
| (JSC::JSObject::prepareToPutDirectWithoutTransition): |
| |
| 2018-06-20 Guillaume Emont <guijemont@igalia.com> |
| |
| [Armv7] Linkbuffer: executableOffsetFor() fails for location 2 |
| https://bugs.webkit.org/show_bug.cgi?id=186765 |
| |
| Reviewed by Michael Saboff. |
| |
| This widens the check for 0 so that we handle that case more correctly. |
| |
| * assembler/LinkBuffer.h: |
| (JSC::LinkBuffer::executableOffsetFor): |
| |
| 2018-06-19 Keith Miller <keith_miller@apple.com> |
| |
| Fix broken assertion on 32-bit |
| https://bugs.webkit.org/show_bug.cgi?id=186830 |
| |
| Reviewed by Mark Lam. |
| |
| The assertion was intended to catch concurrent GC issues. We don't |
| run them on 32-bit so we don't need this assertion there. The |
| assertion was broken because zero is not JSValue() on 32-bit. |
| |
| * runtime/JSObjectInlines.h: |
| (JSC::JSObject::prepareToPutDirectWithoutTransition): |
| |
| 2018-06-19 Keith Miller <keith_miller@apple.com> |
| |
| flattenDictionaryStructure needs to zero properties that have been compressed away |
| https://bugs.webkit.org/show_bug.cgi?id=186828 |
| |
| Reviewed by Mark Lam. |
| |
| This patch fixes a bunch of crashing Mozilla tests on the bots. |
| |
| * runtime/Structure.cpp: |
| (JSC::Structure::flattenDictionaryStructure): |
| |
| 2018-06-19 Saam Barati <sbarati@apple.com> |
| |
| DirectArguments::create needs to initialize to undefined instead of the empty value |
| https://bugs.webkit.org/show_bug.cgi?id=186818 |
| <rdar://problem/38415177> |
| |
| Reviewed by Filip Pizlo. |
| |
| The bug here is that we will emit code that just loads from DirectArguments as |
| long as the index is within the known capacity of the arguments object (op_get_from_arguments). |
| The arguments object has at least enough capacity to hold the declared parameters. |
| When we materialized this object in OSR exit, we initialized up to to the capacity |
| with JSValue(). In OSR exit, though, we only filled up to the length of the |
| object with actual values. So we'd end up with a DirectArguments object with |
| capacity minus length slots of JSValue(). To fix this, we need initialize up to |
| capacity with jsUndefined during construction. The invariant of this object is |
| that the capacity minus length slots at the end are filled in with jsUndefined. |
| |
| * runtime/DirectArguments.cpp: |
| (JSC::DirectArguments::create): |
| |
| 2018-06-19 Michael Saboff <msaboff@apple.com> |
| |
| Crash in sanitizeStackForVMImpl sometimes when switching threads with same VM |
| https://bugs.webkit.org/show_bug.cgi?id=186827 |
| |
| Reviewed by Saam Barati. |
| |
| Need to set VM::lastStackTop before any possible calls to sanitizeStack(). |
| |
| * runtime/JSLock.cpp: |
| (JSC::JSLock::didAcquireLock): |
| |
| 2018-06-19 Tadeu Zagallo <tzagallo@apple.com> |
| |
| ShadowChicken crashes with stack overflow in the LLInt |
| https://bugs.webkit.org/show_bug.cgi?id=186540 |
| <rdar://problem/39682133> |
| |
| Reviewed by Saam Barati. |
| |
| Stack overflows in the LLInt were crashing in ShadowChicken when compiling |
| with debug opcodes because it was accessing the scope of the incomplete top |
| frame, which hadn't been set yet. Check that we have moved past the first |
| opcode (enter) and that the scope is not undefined (enter will |
| initialize it to undefined). |
| |
| * interpreter/ShadowChicken.cpp: |
| (JSC::ShadowChicken::update): |
| |
| 2018-06-19 Keith Miller <keith_miller@apple.com> |
| |
| constructArray variants should take the slow path for subclasses of Array |
| https://bugs.webkit.org/show_bug.cgi?id=186812 |
| |
| Reviewed by Saam Barati and Mark Lam. |
| |
| This patch fixes a crashing test in ObjectInitializationScope where we would |
| allocate a new structure for an indexing type change while initializing |
| a subclass of Array. Since the new array hasn't been fully initialized |
| if the GC ran it would see garbage and we might crash. |
| |
| * runtime/JSArray.cpp: |
| (JSC::constructArray): |
| (JSC::constructArrayNegativeIndexed): |
| * runtime/JSArray.h: |
| (JSC::constructArray): Deleted. |
| (JSC::constructArrayNegativeIndexed): Deleted. |
| |
| 2018-06-19 Saam Barati <sbarati@apple.com> |
| |
| Wasm: Any function argument of type Void should be a validation error |
| https://bugs.webkit.org/show_bug.cgi?id=186794 |
| <rdar://problem/41140257> |
| |
| Reviewed by Keith Miller. |
| |
| * wasm/WasmModuleParser.cpp: |
| (JSC::Wasm::ModuleParser::parseType): |
| |
| 2018-06-18 Keith Miller <keith_miller@apple.com> |
| |
| JSImmutableButterfly should assert m_header is adjacent to the data |
| https://bugs.webkit.org/show_bug.cgi?id=186795 |
| |
| Reviewed by Saam Barati. |
| |
| * runtime/JSImmutableButterfly.cpp: |
| * runtime/JSImmutableButterfly.h: |
| |
| 2018-06-18 Keith Miller <keith_miller@apple.com> |
| |
| Unreviewed, fix the build... |
| |
| * runtime/JSArray.cpp: |
| (JSC::JSArray::tryCreateUninitializedRestricted): |
| |
| 2018-06-18 Keith Miller <keith_miller@apple.com> |
| |
| Unreviewed, remove bad assertion. |
| |
| * runtime/JSArray.cpp: |
| (JSC::JSArray::tryCreateUninitializedRestricted): |
| |
| 2018-06-18 Keith Miller <keith_miller@apple.com> |
| |
| Properly zero unused property storage offsets |
| https://bugs.webkit.org/show_bug.cgi?id=186692 |
| |
| Reviewed by Filip Pizlo. |
| |
| Since the concurrent GC might see a property slot before the mutator has actually |
| stored the value there, we need to ensure that slot doesn't have garbage in it. |
| |
| Right now when calling constructConvertedArrayStorageWithoutCopyingElements |
| or creating a RegExp matches array, we never cleared the unused |
| property storage. ObjectIntializationScope has also been upgraded |
| to look for our invariants around property storage. Additionally, |
| a new assertion has been added to check for JSValue() when adding |
| a new property. |
| |
| We used to put undefined into deleted property offsets. To |
| make things simpler, this patch causes us to store JSValue() there |
| instead. |
| |
| Lastly, this patch fixes an issue where we would initialize the |
| array storage of RegExpMatchesArray twice. First with 0 and |
| secondly with the actual result. Now we only zero memory between |
| vector length and public length. |
| |
| * runtime/Butterfly.h: |
| (JSC::Butterfly::offsetOfVectorLength): |
| * runtime/ButterflyInlines.h: |
| (JSC::Butterfly::tryCreateUninitialized): |
| (JSC::Butterfly::createUninitialized): |
| (JSC::Butterfly::tryCreate): |
| (JSC::Butterfly::create): |
| (JSC::Butterfly::createOrGrowPropertyStorage): |
| (JSC::Butterfly::createOrGrowArrayRight): |
| (JSC::Butterfly::growArrayRight): |
| (JSC::Butterfly::resizeArray): |
| * runtime/JSArray.cpp: |
| (JSC::JSArray::tryCreateUninitializedRestricted): |
| (JSC::createArrayButterflyInDictionaryIndexingMode): Deleted. |
| * runtime/JSArray.h: |
| (JSC::tryCreateArrayButterfly): |
| * runtime/JSObject.cpp: |
| (JSC::JSObject::createArrayStorageButterfly): |
| (JSC::JSObject::constructConvertedArrayStorageWithoutCopyingElements): |
| (JSC::JSObject::deleteProperty): |
| (JSC::JSObject::shiftButterflyAfterFlattening): |
| * runtime/JSObject.h: |
| * runtime/JSObjectInlines.h: |
| (JSC::JSObject::prepareToPutDirectWithoutTransition): |
| * runtime/ObjectInitializationScope.cpp: |
| (JSC::ObjectInitializationScope::verifyPropertiesAreInitialized): |
| * runtime/ObjectInitializationScope.h: |
| (JSC::ObjectInitializationScope::release): |
| * runtime/RegExpMatchesArray.h: |
| (JSC::tryCreateUninitializedRegExpMatchesArray): |
| (JSC::createRegExpMatchesArray): |
| |
| * runtime/Butterfly.h: |
| (JSC::Butterfly::offsetOfVectorLength): |
| * runtime/ButterflyInlines.h: |
| (JSC::Butterfly::tryCreateUninitialized): |
| (JSC::Butterfly::createUninitialized): |
| (JSC::Butterfly::tryCreate): |
| (JSC::Butterfly::create): |
| (JSC::Butterfly::createOrGrowPropertyStorage): |
| (JSC::Butterfly::createOrGrowArrayRight): |
| (JSC::Butterfly::growArrayRight): |
| (JSC::Butterfly::resizeArray): |
| * runtime/JSArray.cpp: |
| (JSC::JSArray::tryCreateUninitializedRestricted): |
| (JSC::createArrayButterflyInDictionaryIndexingMode): Deleted. |
| * runtime/JSArray.h: |
| (JSC::tryCreateArrayButterfly): |
| * runtime/JSObject.cpp: |
| (JSC::JSObject::createArrayStorageButterfly): |
| (JSC::JSObject::constructConvertedArrayStorageWithoutCopyingElements): |
| (JSC::JSObject::deleteProperty): |
| (JSC::JSObject::shiftButterflyAfterFlattening): |
| * runtime/JSObject.h: |
| * runtime/JSObjectInlines.h: |
| (JSC::JSObject::prepareToPutDirectWithoutTransition): |
| * runtime/ObjectInitializationScope.cpp: |
| (JSC::ObjectInitializationScope::verifyPropertiesAreInitialized): |
| * runtime/RegExpMatchesArray.cpp: |
| (JSC::createEmptyRegExpMatchesArray): |
| * runtime/RegExpMatchesArray.h: |
| (JSC::tryCreateUninitializedRegExpMatchesArray): |
| (JSC::createRegExpMatchesArray): |
| |
| 2018-06-18 Tadeu Zagallo <tzagallo@apple.com> |
| |
| Share structure across instances of classes exported through the ObjC API |
| https://bugs.webkit.org/show_bug.cgi?id=186579 |
| <rdar://problem/40969212> |
| |
| Reviewed by Saam Barati. |
| |
| A new structure was being created for each instance of exported ObjC |
| classes due to setting the prototype in the structure for every object, |
| since prototype transitions are not cached by the structure. Cache the |
| Structure in the JSObjcClassInfo to avoid the transition. |
| |
| * API/JSWrapperMap.mm: |
| (-[JSObjCClassInfo wrapperForObject:inContext:]): |
| (-[JSObjCClassInfo structureInContext:]): |
| * API/tests/JSWrapperMapTests.h: Added. |
| * API/tests/JSWrapperMapTests.mm: Added. |
| (+[JSWrapperMapTests testStructureIdentity]): |
| (runJSWrapperMapTests): |
| * API/tests/testapi.mm: |
| (testObjectiveCAPIMain): |
| * JavaScriptCore.xcodeproj/project.pbxproj: |
| |
| 2018-06-18 Michael Saboff <msaboff@apple.com> |
| |
| Support Unicode 11 in RegExp |
| https://bugs.webkit.org/show_bug.cgi?id=186685 |
| |
| Reviewed by Mark Lam. |
| |
| Updated the UCD tables used to generate RegExp property tables to version 11.0. |
| |
| * Scripts/generateYarrUnicodePropertyTables.py: |
| * ucd/CaseFolding.txt: |
| * ucd/DerivedBinaryProperties.txt: |
| * ucd/DerivedCoreProperties.txt: |
| * ucd/DerivedNormalizationProps.txt: |
| * ucd/PropList.txt: |
| * ucd/PropertyAliases.txt: |
| * ucd/PropertyValueAliases.txt: |
| * ucd/ScriptExtensions.txt: |
| * ucd/Scripts.txt: |
| * ucd/UnicodeData.txt: |
| * ucd/emoji-data.txt: |
| |
| 2018-06-18 Carlos Alberto Lopez Perez <clopez@igalia.com> |
| |
| [WTF] Remove workarounds needed to support libstdc++-4 |
| https://bugs.webkit.org/show_bug.cgi?id=186762 |
| |
| Reviewed by Michael Catanzaro. |
| |
| Revert r226299, r226300 r226301 and r226302. |
| |
| * API/tests/TypedArrayCTest.cpp: |
| (assertEqualsAsNumber): |
| |
| 2018-06-16 Michael Catanzaro <mcatanzaro@igalia.com> |
| |
| REGRESSION(r227717): Hardcoded page size causing JSC crashes on platforms with page size bigger than 16 KB |
| https://bugs.webkit.org/show_bug.cgi?id=182923 |
| |
| Reviewed by Mark Lam. |
| |
| The blockSize used by MarkedBlock is incorrect on platforms with pages larger than 16 KB. |
| Upstream Fedora's patch to use a safer 64 KB default. This fixes PowerPC and s390x. |
| |
| * heap/MarkedBlock.h: |
| |
| 2018-06-16 Yusuke Suzuki <utatane.tea@gmail.com> |
| |
| [JSC] Inline JSArray::pushInline and Structure::nonPropertyTransition |
| https://bugs.webkit.org/show_bug.cgi?id=186723 |
| |
| Reviewed by Mark Lam. |
| |
| Now, CoW -> non-CoW transition is heavy path. We inline the part of Structure::nonPropertyTransition |
| to catch the major path. And we also inline JSArray::pushInline well to spread this in operationArrayPushMultiple. |
| |
| This patch improves SixSpeed/spread-literal.es5. |
| |
| baseline patched |
| |
| spread-literal.es5 114.4140+-4.5146 ^ 104.5475+-3.6157 ^ definitely 1.0944x faster |
| |
| * runtime/JSArrayInlines.h: |
| (JSC::JSArray::pushInline): |
| * runtime/Structure.cpp: |
| (JSC::Structure::nonPropertyTransitionSlow): |
| (JSC::Structure::nonPropertyTransition): Deleted. |
| * runtime/Structure.h: |
| * runtime/StructureInlines.h: |
| (JSC::Structure::nonPropertyTransition): |
| |
| 2018-06-16 Yusuke Suzuki <utatane.tea@gmail.com> |
| |
| [DFG] Reduce OSRExit for Kraken/crypto-aes due to CoW array |
| https://bugs.webkit.org/show_bug.cgi?id=186721 |
| |
| Reviewed by Keith Miller. |
| |
| We still have several other OSRExits, but this patch reduces that. |
| |
| 1. While ArraySlice code accepts CoW arrays, it always emits CheckStructure without CoW Array structures. |
| So DFG emits ArraySlice onto CoW arrays, and always performs OSRExits. |
| |
| 2. The CoW patch removed ArrayAllocationProfile updates. This makes allocated JSImmutableButterfly |
| non-appropriate. |
| |
| These changes a bit fix Kraken/crypto-aes regression. |
| |
| baseline patched |
| |
| stanford-crypto-aes 63.718+-2.312 ^ 56.140+-0.966 ^ definitely 1.1350x faster |
| |
| |
| * dfg/DFGByteCodeParser.cpp: |
| (JSC::DFG::ByteCodeParser::handleIntrinsicCall): |
| * ftl/FTLOperations.cpp: |
| (JSC::FTL::operationMaterializeObjectInOSR): |
| * runtime/CommonSlowPaths.cpp: |
| (JSC::SLOW_PATH_DECL): |
| |
| 2018-06-15 Yusuke Suzuki <utatane.tea@gmail.com> |
| |
| [DFG][FTL] Spread onto PhantomNewArrayBuffer assumes JSFixedArray, but JSImmutableButterfly is returned |
| https://bugs.webkit.org/show_bug.cgi?id=186460 |
| |
| Reviewed by Saam Barati. |
| |
| Spread(PhantomNewArrayBuffer) returns JSImmutableButterfly. But it is wrong. |
| We should return JSFixedArray for Spread. This patch adds a code generating |
| a JSFixedArray from JSImmutableButterfly. |
| |
| Merging JSFixedArray into JSImmutableButterfly is possible future extension. |
| |
| * ftl/FTLLowerDFGToB3.cpp: |
| (JSC::FTL::DFG::LowerDFGToB3::compileSpread): |
| * runtime/JSFixedArray.h: |
| |
| 2018-06-15 Saam Barati <sbarati@apple.com> |
| |
| Annotate shrinkFootprintWhenIdle with NS_AVAILABLE |
| https://bugs.webkit.org/show_bug.cgi?id=186687 |
| <rdar://problem/40071332> |
| |
| Reviewed by Keith Miller. |
| |
| * API/JSVirtualMachinePrivate.h: |
| |
| 2018-06-15 Saam Barati <sbarati@apple.com> |
| |
| Make ForceOSRExit CFG pruning in bytecode parser more aggressive by making the original block to ignore be the plan's osrEntryBytecodeIndex |
| https://bugs.webkit.org/show_bug.cgi?id=186648 |
| |
| Reviewed by Michael Saboff. |
| |
| This patch is neutral on SunSpider/bitops-bitwise-and. That test originally |
| regressed with my first version of ForceOSRExit CFG pruning. This patch makes |
| ForceOSRExit CFG pruning more aggressive by not ignoring everything that |
| can reach any loop_hint, but only ignoring blocks that can reach a loop_hint |
| if it's the plan's osr entry bytecode target. The goal is to get a speedometer |
| 2 speedup with this change on iOS. |
| |
| * dfg/DFGByteCodeParser.cpp: |
| (JSC::DFG::ByteCodeParser::parse): |
| |
| 2018-06-15 Michael Catanzaro <mcatanzaro@igalia.com> |
| |
| Unreviewed, rolling out r232816. |
| |
| Suggested by Caitlin: |
| "this patch clearly does get some things wrong, and it's not |
| easy to find what those things are" |
| |
| Reverted changeset: |
| |
| "[LLInt] use loadp consistently for |
| get_from_scope/put_to_scope" |
| https://bugs.webkit.org/show_bug.cgi?id=132333 |
| https://trac.webkit.org/changeset/232816 |
| |
| 2018-06-14 Michael Saboff <msaboff@apple.com> |
| |
| REGRESSION(232741): Crash running ARES-6 |
| https://bugs.webkit.org/show_bug.cgi?id=186630 |
| |
| Reviewed by Saam Barati. |
| |
| The de-duplicating work in r232741 caused a bug in breakCriticalEdge() where it |
| treated edges between identical predecessor->successor pairs independently. |
| This fixes the issue by handling such edges once, using the added intermediate |
| pad for all instances of the edges between the same pairs. |
| |
| * dfg/DFGCriticalEdgeBreakingPhase.cpp: |
| (JSC::DFG::CriticalEdgeBreakingPhase::run): |
| (JSC::DFG::CriticalEdgeBreakingPhase::breakCriticalEdge): Deleted. |
| |
| 2018-06-14 Carlos Garcia Campos <cgarcia@igalia.com> |
| |
| [GTK][WPE] WebDriver: handle acceptInsecureCertificates capability |
| https://bugs.webkit.org/show_bug.cgi?id=186560 |
| |
| Reviewed by Brian Burg. |
| |
| Add SessionCapabilities struct to Client class and unify requestAutomationSession() methods into a single one |
| that always receives the session capabilities. |
| |
| * inspector/remote/RemoteInspector.h: |
| * inspector/remote/RemoteInspectorConstants.h: |
| * inspector/remote/cocoa/RemoteInspectorCocoa.mm: |
| (Inspector::RemoteInspector::receivedAutomationSessionRequestMessage): Move the parsing of mac capabilities from |
| WebKit here and fill the SessionCapabilities instead. |
| * inspector/remote/glib/RemoteInspectorGlib.cpp: |
| (Inspector::RemoteInspector::requestAutomationSession): Pass SessionCapabilities to the client. |
| * inspector/remote/glib/RemoteInspectorServer.cpp: |
| (Inspector::RemoteInspectorServer::startAutomationSession): Process SessionCapabilities. |
| * inspector/remote/glib/RemoteInspectorServer.h: |
| |
| 2018-06-13 Adrian Perez de Castro <aperez@igalia.com> |
| |
| [WPE] Trying to access the remote inspector hits an assertion in the UIProcess |
| https://bugs.webkit.org/show_bug.cgi?id=186588 |
| |
| Reviewed by Carlos Garcia Campos. |
| |
| Make both the WPE and GTK+ ports use /org/webkit/inspector as base prefix |
| for resource paths, which avoids needing a switcheroo depending on the port. |
| |
| * inspector/remote/glib/RemoteInspectorUtils.cpp: |
| |
| 2018-06-13 Caitlin Potter <caitp@igalia.com> |
| |
| [LLInt] use loadp consistently for get_from_scope/put_to_scope |
| https://bugs.webkit.org/show_bug.cgi?id=132333 |
| |
| Reviewed by Mark Lam. |
| |
| Using `loadis` for register indexes and `loadp` for constant scopes / |
| symboltables makes sense, but is problematic for big-endian |
| architectures. |
| |
| Consistently treating the operand as a pointer simplifies determining |
| how to access the operand, and helps avoid bad accesses and crashes on |
| big-endian ports. |
| |
| * bytecode/CodeBlock.cpp: |
| (JSC::CodeBlock::finishCreation): |
| * bytecode/Instruction.h: |
| * jit/JITOperations.cpp: |
| * llint/LLIntSlowPaths.cpp: |
| (JSC::LLInt::LLINT_SLOW_PATH_DECL): |
| * llint/LowLevelInterpreter32_64.asm: |
| * llint/LowLevelInterpreter64.asm: |
| * runtime/CommonSlowPaths.h: |
| (JSC::CommonSlowPaths::tryCachePutToScopeGlobal): |
| (JSC::CommonSlowPaths::tryCacheGetFromScopeGlobal): |
| |
| 2018-06-13 Keith Miller <keith_miller@apple.com> |
| |
| AutomaticThread should have a way to provide a thread name |
| https://bugs.webkit.org/show_bug.cgi?id=186604 |
| |
| Reviewed by Filip Pizlo. |
| |
| Add names for JSC's automatic threads. |
| |
| * dfg/DFGWorklist.cpp: |
| * heap/Heap.cpp: |
| * jit/JITWorklist.cpp: |
| * runtime/VMTraps.cpp: |
| * wasm/WasmWorklist.cpp: |
| |
| 2018-06-13 Saam Barati <sbarati@apple.com> |
| |
| CFGSimplificationPhase should de-dupe jettisonedBlocks |
| https://bugs.webkit.org/show_bug.cgi?id=186583 |
| |
| Reviewed by Filip Pizlo. |
| |
| When making the predecessors list unique in r232741, it revealed a bug inside |
| of CFG simplification, where we try to remove the same predecessor more than |
| once from a blocks predecessors list. We built the list of blocks to remove |
| from the list of successors, which is not unique, causing us to try to remove |
| the same predecessor more than once. The solution here is to just add to this |
| list of blocks to remove only if the block is not already in the list. |
| |
| * dfg/DFGCFGSimplificationPhase.cpp: |
| (JSC::DFG::CFGSimplificationPhase::run): |
| |
| 2018-06-13 Yusuke Suzuki <utatane.tea@gmail.com> |
| |
| [JSC] Always use Nuke & Set procedure for x86 |
| https://bugs.webkit.org/show_bug.cgi?id=186592 |
| |
| Reviewed by Keith Miller. |
| |
| We always use nukeStructureAndStoreButterfly for Contiguous -> ArrayStorage conversion if the architecture is x86. |
| By doing so, we can concurrently load structure and butterfly at least in x86 environment even in non-collector |
| threads. |
| |
| * runtime/JSObject.cpp: |
| (JSC::JSObject::convertContiguousToArrayStorage): |
| |
| 2018-06-12 Saam Barati <sbarati@apple.com> |
| |
| Remove JSVirtualMachine shrinkFootprint when clients move to shrinkFootprintWhenIdle |
| https://bugs.webkit.org/show_bug.cgi?id=186071 |
| |
| Reviewed by Mark Lam. |
| |
| * API/JSVirtualMachine.mm: |
| (-[JSVirtualMachine shrinkFootprint]): Deleted. |
| * API/JSVirtualMachinePrivate.h: |
| |
| 2018-06-11 Saam Barati <sbarati@apple.com> |
| |
| Reduce graph size by replacing terminal nodes in blocks that have a ForceOSRExit with Unreachable |
| https://bugs.webkit.org/show_bug.cgi?id=181409 |
| <rdar://problem/36383749> |
| |
| Reviewed by Keith Miller. |
| |
| This patch is me redoing r226655. This is a patch I wrote when |
| profiling Speedometer. Fil rolled this change out in r230928. He |
| showed this slowed down a sunspider tests by ~2x. This sunspider |
| regression revealed a real performance bug in the original change: |
| we would kill blocks that reached OSR entry targets, sometimes leading |
| us to not do OSR entry into the DFG, since we could end up deleting |
| entire loops from the CFG. The reason for this is that code that has run |
| ~once and that reaches loops often has ForceOSRExits inside of it. The |
| solution to this is to not perform this optimization on blocks that can |
| reach OSR entry targets. |
| |
| The reason I'm redoing this patch is that it turns out Fil rolling |
| out the change was a Speedometer 2 regression. |
| |
| This is a modified version of the original ChangeLog I wrote in r226655: |
| |
| When I was looking at profiler data for Speedometer, I noticed that one of |
| the hottest functions in Speedometer is around 1100 bytecode operations long. |
| Only about 100 of those bytecode ops ever execute. However, we ended up |
| spending a lot of time compiling basic blocks that never executed. We often |
| plant ForceOSRExit nodes when we parse bytecodes that have a null value profile. |
| This is the case when such a node never executes. |
| |
| This patch makes it so that anytime a block has a ForceOSRExit, and that block |
| can not reach an OSR entry target, we replace its terminal node with an Unreachable |
| node, and remove all nodes after the ForceOSRExit. This cuts down the graph |
| size since it removes control flow edges from the CFG. This allows us to get |
| rid of huge chunks of the CFG in certain programs. When doing this transformation, |
| we also insert Flushes/PhantomLocals to ensure we can recover values that are bytecode |
| live-in to the ForceOSRExit. |
| |
| Using ForceOSRExit as the signal for this is a bit of a hack. It definitely |
| does not get rid of all the CFG that it could. If we decide it's worth |
| it, we could use additional inputs into this mechanism. For example, we could |
| profile if a basic block ever executes inside the LLInt/Baseline, and |
| remove parts of the CFG based on that. |
| |
| When running Speedometer with the concurrent JIT turned off, this patch |
| improves DFG/FTL compile times by around 5%. |
| |
| * dfg/DFGByteCodeParser.cpp: |
| (JSC::DFG::ByteCodeParser::addToGraph): |
| (JSC::DFG::ByteCodeParser::inlineCall): |
| (JSC::DFG::ByteCodeParser::parse): |
| * dfg/DFGGraph.cpp: |
| (JSC::DFG::Graph::blocksInPostOrder): |
| |
| 2018-06-11 Saam Barati <sbarati@apple.com> |
| |
| The NaturalLoops algorithm only works when the list of blocks in a loop is de-duplicated |
| https://bugs.webkit.org/show_bug.cgi?id=184829 |
| |
| Reviewed by Michael Saboff. |
| |
| This patch codifies that a BasicBlock's list of predecessors is de-duplicated. |
| In B3/Air, this just meant writing a validation rule. In DFG, this meant |
| ensuring this property when building up the predecessors list, and also adding |
| a validation rule. The NaturalLoops algorithm relies on this property. |
| |
| * b3/B3Validate.cpp: |
| * b3/air/AirValidate.cpp: |
| * b3/testb3.cpp: |
| (JSC::B3::testLoopWithMultipleHeaderEdges): |
| (JSC::B3::run): |
| * dfg/DFGGraph.cpp: |
| (JSC::DFG::Graph::handleSuccessor): |
| * dfg/DFGValidate.cpp: |
| |
| 2018-06-11 Keith Miller <keith_miller@apple.com> |
| |
| Loading cnn.com in MiniBrowser hits Structure::dump() under DFG::AdaptiveInferredPropertyValueWatchpoint::handleFire which churns 65KB of memory |
| https://bugs.webkit.org/show_bug.cgi?id=186467 |
| |
| Reviewed by Simon Fraser. |
| |
| This patch adds a LazyFireDetail that wraps ScopedLambda so that |
| we don't actually malloc any strings for firing unless those |
| Strings are actually going to be printed. |
| |
| * bytecode/Watchpoint.h: |
| (JSC::LazyFireDetail::LazyFireDetail): |
| * dfg/DFGAdaptiveInferredPropertyValueWatchpoint.cpp: |
| (JSC::DFG::AdaptiveInferredPropertyValueWatchpoint::handleFire): |
| * dfg/DFGAdaptiveStructureWatchpoint.cpp: |
| (JSC::DFG::AdaptiveStructureWatchpoint::fireInternal): |
| * runtime/ArrayPrototype.cpp: |
| (JSC::ArrayPrototypeAdaptiveInferredPropertyWatchpoint::handleFire): |
| |
| 2018-06-11 Mark Lam <mark.lam@apple.com> |
| |
| Add support for webkit-test-runner jscOptions in DumpRenderTree and WebKitTestRunner. |
| https://bugs.webkit.org/show_bug.cgi?id=186451 |
| <rdar://problem/40875792> |
| |
| Reviewed by Tim Horton. |
| |
| Enhance setOptions() to be able to take a comma separated options string in |
| addition to white space separated options strings. |
| |
| * runtime/Options.cpp: |
| (JSC::isSeparator): |
| (JSC::Options::setOptions): |
| |
| 2018-06-11 Michael Saboff <msaboff@apple.com> |
| |
| JavaScriptCore: Disable 32-bit JIT on Windows |
| https://bugs.webkit.org/show_bug.cgi?id=185989 |
| |
| Reviewed by Mark Lam. |
| |
| Fixed the CLOOP so it can work when COMPUTED_GOTOs are not supported. |
| |
| * llint/LLIntData.h: |
| (JSC::LLInt::getCodePtr): Used a reinterpret_cast since Opcode could be an int. |
| * llint/LowLevelInterpreter.cpp: Changed the definition of OFFLINE_ASM_GLOBAL_LABEL to not |
| have a case label because these aren't opcodes. |
| * runtime/Options.cpp: Made assembler related Windows conditional code also conditional |
| on the JIT being enabled. |
| (JSC::recomputeDependentOptions): |
| |
| 2018-06-11 Michael Saboff <msaboff@apple.com> |
| |
| Test js/regexp-zero-length-alternatives.html fails when RegExpJIT is disabled |
| https://bugs.webkit.org/show_bug.cgi?id=186477 |
| |
| Reviewed by Filip Pizlo. |
| |
| Fixed bug where we were using the wrong frame size for TypeParenthesesSubpatternTerminalBegin |
| YARR interpreter nodes. This caused us to overwrite other frame information. |
| |
| Added frame offset debugging code to YARR interpreter. |
| |
| * yarr/YarrInterpreter.cpp: |
| (JSC::Yarr::ByteCompiler::emitDisjunction): |
| (JSC::Yarr::ByteCompiler::dumpDisjunction): |
| |
| 2018-06-10 Yusuke Suzuki <utatane.tea@gmail.com> |
| |
| [JSC] Array.prototype.sort should rejects null comparator |
| https://bugs.webkit.org/show_bug.cgi?id=186458 |
| |
| Reviewed by Keith Miller. |
| |
| This relaxed behavior is once introduced in r216169 to fix some pages by aligning |
| the behavior to Chrome and Firefox. |
| |
| However, now Chrome, Firefox and Edge reject a null comparator. So only JavaScriptCore |
| accepts it. This patch reverts r216169 to align JSC to the other engines and fix |
| the spec issue. |
| |
| * builtins/ArrayPrototype.js: |
| (sort): |
| |
| 2018-06-09 Dan Bernstein <mitz@apple.com> |
| |
| [Xcode] Clean up and modernize some build setting definitions |
| https://bugs.webkit.org/show_bug.cgi?id=186463 |
| |
| Reviewed by Sam Weinig. |
| |
| * Configurations/Base.xcconfig: Removed definition for macOS 10.11. Simplified the |
| definition of WK_PRIVATE_FRAMEWORK_STUBS_DIR now that WK_XCODE_SUPPORTS_TEXT_BASED_STUBS |
| is true for all supported Xcode versions. |
| * Configurations/DebugRelease.xcconfig: Removed definition for macOS 10.11. |
| * Configurations/FeatureDefines.xcconfig: Simplified the definitions of ENABLE_APPLE_PAY and |
| ENABLE_VIDEO_PRESENTATION_MODE now macOS 10.12 is the earliest supported version. |
| * Configurations/Version.xcconfig: Removed definition for macOS 10.11. |
| * Configurations/WebKitTargetConditionals.xcconfig: Removed definitions for macOS 10.11. |
| |
| 2018-06-09 Dan Bernstein <mitz@apple.com> |
| |
| Added missing file references to the Configuration group. |
| |
| * JavaScriptCore.xcodeproj/project.pbxproj: |
| |
| 2018-06-08 Darin Adler <darin@apple.com> |
| |
| [Cocoa] Remove all uses of NSAutoreleasePool as part of preparation for ARC |
| https://bugs.webkit.org/show_bug.cgi?id=186436 |
| |
| Reviewed by Anders Carlsson. |
| |
| * heap/Heap.cpp: Include FoundationSPI.h rather than directly including |
| objc-internal.h and explicitly declaring the alternative. |
| |
| 2018-06-08 Wenson Hsieh <wenson_hsieh@apple.com> |
| |
| [WebKit on watchOS] Upstream watchOS source additions to OpenSource (Part 1) |
| https://bugs.webkit.org/show_bug.cgi?id=186442 |
| <rdar://problem/40879364> |
| |
| Reviewed by Tim Horton. |
| |
| * Configurations/FeatureDefines.xcconfig: |
| |
| 2018-06-08 Tadeu Zagallo <tzagallo@apple.com> |
| |
| jumpTrueOrFalse only takes the fast path for boolean false on 64bit LLInt |
| https://bugs.webkit.org/show_bug.cgi?id=186446 |
| <rdar://problem/40949995> |
| |
| Reviewed by Mark Lam. |
| |
| On 64bit LLInt, jumpTrueOrFalse did a mask check to take the fast path for |
| boolean literals, but it would only work for false. Change it so that it |
| takes the fast path for true, false, null and undefined. |
| |
| * llint/LowLevelInterpreter.asm: |
| * llint/LowLevelInterpreter64.asm: |
| |
| 2018-06-08 Brian Burg <bburg@apple.com> |
| |
| [Cocoa] Web Automation: include browser name and version in listing for automation targets |
| https://bugs.webkit.org/show_bug.cgi?id=186204 |
| <rdar://problem/36950423> |
| |
| Reviewed by Darin Adler. |
| |
| Ask the client what the reported browser name and version should be, then |
| send this as part of the listing for an automation target. |
| |
| * inspector/remote/RemoteInspectorConstants.h: |
| * inspector/remote/cocoa/RemoteInspectorCocoa.mm: |
| (Inspector::RemoteInspector::listingForAutomationTarget const): |
| |
| 2018-06-07 Chris Dumez <cdumez@apple.com> |
| |
| Add base class to get WeakPtrFactory member and avoid some boilerplate code |
| https://bugs.webkit.org/show_bug.cgi?id=186407 |
| |
| Reviewed by Brent Fulgham. |
| |
| Add CanMakeWeakPtr base class to get WeakPtrFactory member and its getter, in |
| order to avoid some boilerplate code in every class needing a WeakPtrFactory. |
| This also gets rid of old-style createWeakPtr() methods in favor of the newer |
| makeWeakPtr(). |
| |
| * wasm/WasmInstance.h: |
| * wasm/WasmMemory.cpp: |
| (JSC::Wasm::Memory::registerInstance): |
| |
| 2018-06-07 Tadeu Zagallo <tzagallo@apple.com> |
| |
| Don't try to allocate JIT memory if we don't have the JIT entitlement |
| https://bugs.webkit.org/show_bug.cgi?id=182605 |
| <rdar://problem/38271229> |
| |
| Reviewed by Mark Lam. |
| |
| Check that the current process has the correct entitlements before |
| trying to allocate JIT memory to silence warnings. |
| |
| * jit/ExecutableAllocator.cpp: |
| (JSC::allowJIT): Helper that checks entitlements on iOS and returns true in other platforms |
| (JSC::FixedVMPoolExecutableAllocator::FixedVMPoolExecutableAllocator): check allowJIT before trying to allocate |
| |
| 2018-06-07 Saam Barati <sbarati@apple.com> |
| |
| TierUpCheckInjectionPhase systematically never puts the outer-most loop in an inner loop's vector of outer loops |
| https://bugs.webkit.org/show_bug.cgi?id=186386 |
| |
| Reviewed by Filip Pizlo. |
| |
| This looks like an 8% speedup on Kraken's imaging-gaussian-blur subtest. |
| |
| * dfg/DFGTierUpCheckInjectionPhase.cpp: |
| (JSC::DFG::TierUpCheckInjectionPhase::run): |
| |
| 2018-06-02 Filip Pizlo <fpizlo@apple.com> |
| |
| FunctionRareData::m_objectAllocationProfileWatchpoint is racy |
| https://bugs.webkit.org/show_bug.cgi?id=186237 |
| |
| Reviewed by Saam Barati. |
| |
| We initialize it blind and let it go into auto-watch mode once the DFG adds a watchpoint, but |
| that means that we never notice that it fired if it fires between when the DFG decides to |
| watch it and when it actually adds the watchpoint. |
| |
| Most watchpoints are initialized watched for this purpose. This one had a somewhat good |
| reason for being initialized blind: that's how we knew to ignore changes to the prototype |
| before the first allocation. However, that functionality also arose out of the fact that the |
| rare data is created lazily and usually won't exist until the first allocation. |
| |
| The fix here is to make the watchpoint go into watched mode as soon as we initialize the |
| object allocation profile. |
| |
| It's hard to repro this race, however it started causing spurious test failures for me after |
| bug 164904. |
| |
| * runtime/FunctionRareData.cpp: |
| (JSC::FunctionRareData::FunctionRareData): |
| (JSC::FunctionRareData::initializeObjectAllocationProfile): |
| |
| 2018-06-07 Saam Barati <sbarati@apple.com> |
| |
| Make DFG to FTL OSR entry code more sane by removing bad RELEASE_ASSERTS and making it trigger compiles in outer loops before inner ones |
| https://bugs.webkit.org/show_bug.cgi?id=186218 |
| <rdar://problem/38449540> |
| |
| Reviewed by Filip Pizlo. |
| |
| This patch makes tierUpCommon a tad bit more sane. There are a few things |
| that I did: |
| - There were a few release asserts that were crashing. Those release asserts |
| were incorrect. They were making assumptions about how the code and data |
| structures were ordered that were wrong. This patch removes them. The code |
| was using the loop hierarchy vector to make assumptions about which loop we |
| were currently executing in, which is incorrect. The only information that |
| can be used about where we're currently executing is the bytecode index we're |
| at. |
| - This makes it so that we go back to trying to compile outer loops before |
| inner loops. JF accidentally reverted this behavior that Ben implemented. |
| JF made it so that we just compiled the inner most loop. I make this |
| functionality work by first triggering a compile for the outer most loop |
| that the code is currently executing in and that can perform OSR entry. |
| However, some programs can get stuck in inner loops. The code works by |
| progressively asking inner loops to compile if program execution has not |
| yet reached an outer loop. |
| |
| * dfg/DFGOperations.cpp: |
| |
| 2018-06-06 Guillaume Emont <guijemont@igalia.com> |
| |
| ArityFixup should adjust SP first on 32-bit platforms too |
| https://bugs.webkit.org/show_bug.cgi?id=186351 |
| |
| Reviewed by Yusuke Suzuki. |
| |
| * jit/ThunkGenerators.cpp: |
| (JSC::arityFixupGenerator): |
| |
| 2018-06-06 Yusuke Suzuki <utatane.tea@gmail.com> |
| |
| [DFG] Compare operations do not respect negative zeros |
| https://bugs.webkit.org/show_bug.cgi?id=183729 |
| |
| Reviewed by Saam Barati. |
| |
| Compare operations do not respect negative zeros. So propagating this can |
| reduce the size of the produced code for negative zero case. This pattern |
| can be seen in Kraken stanford-crypto-aes. |
| |
| This also causes an existing bug which converts CompareEq(Int32Only, NonIntAsdouble) to false. |
| However, NonIntAsdouble includes negative zero, which can be equal to Int32 positive zero. |
| This issue is covered by fold-based-on-int32-proof-mul-branch.js, and we fix this. |
| |
| * bytecode/SpeculatedType.cpp: |
| (JSC::leastUpperBoundOfStrictlyEquivalentSpeculations): |
| SpecNonIntAsDouble includes negative zero (-0.0), which can be equal to 0 and 0.0. |
| To emphasize this, we use SpecAnyIntAsDouble | SpecNonIntAsDouble directly instead of |
| SpecDoubleReal. |
| |
| * dfg/DFGBackwardsPropagationPhase.cpp: |
| (JSC::DFG::BackwardsPropagationPhase::propagate): |
| |
| 2018-06-06 Saam Barati <sbarati@apple.com> |
| |
| generateConditionsForInstanceOf needs to see if the object has a poly proto structure before assuming it has a constant prototype |
| https://bugs.webkit.org/show_bug.cgi?id=186363 |
| |
| Rubber-stamped by Filip Pizlo. |
| |
| The code was assuming that the object it was creating an OPC for always |
| had a non-poly-proto structure. However, this assumption was wrong. For |
| example, an object in the prototype chain could be poly proto. That type |
| of object graph would cause a crash in this code. This patch makes it so |
| that we fail to generate an ObjectPropertyConditionSet if we see a poly proto |
| object as we traverse the prototype chain. |
| |
| * bytecode/ObjectPropertyConditionSet.cpp: |
| (JSC::generateConditionsForInstanceOf): |
| |
| 2018-06-05 Brent Fulgham <bfulgham@apple.com> |
| |
| Adjust compile and runtime flags to match shippable state of features |
| https://bugs.webkit.org/show_bug.cgi?id=186319 |
| <rdar://problem/40352045> |
| |
| Reviewed by Maciej Stachowiak, Jon Lee, and others. |
| |
| This patch revises the compile time and runtime state for various features to match their |
| suitability for end-user releases. |
| |
| * Configurations/DebugRelease.xcconfig: Update to match WebKit definition of |
| WK_RELOCATABLE_FRAMEWORKS so that ENABLE(EXPERIMENTAL_FEATURES) is defined properly for |
| Cocoa builds. |
| * Configurations/FeatureDefines.xcconfig: Don't build ENABLE_INPUT_TYPE_COLOR |
| or ENABLE_INPUT_TYPE_COLOR_POPOVER. |
| * runtime/Options.h: Only enable INTL_NUMBER_FORMAT_TO_PARTS and INTL_PLURAL_RULES |
| at runtime for non-production builds. |
| |
| 2018-06-05 Brent Fulgham <bfulgham@apple.com> |
| |
| Revise DEFAULT_EXPERIMENTAL_FEATURES_ENABLED to work properly on Apple builds |
| https://bugs.webkit.org/show_bug.cgi?id=186286 |
| <rdar://problem/40782992> |
| |
| Reviewed by Dan Bernstein. |
| |
| Use the WK_RELOCATABLE_FRAMEWORKS flag (which is always defined for non-production builds) |
| to define ENABLE(EXPERIMENTAL_FEATURES) so that we do not need to manually |
| change this flag when preparing for a production release. |
| |
| * Configurations/FeatureDefines.xcconfig: Use WK_RELOCATABLE_FRAMEWORKS to determine |
| whether experimental features should be enabled, and use it to properly define the |
| feature flag. |
| |
| 2018-06-05 Darin Adler <darin@apple.com> |
| |
| [Cocoa] Update some JavaScriptCore code to be more ready for ARC |
| https://bugs.webkit.org/show_bug.cgi?id=186301 |
| |
| Reviewed by Anders Carlsson. |
| |
| * API/JSContext.mm: |
| (-[JSContext evaluateScript:withSourceURL:]): Use __bridge for typecast. |
| (-[JSContext setName:]): Removed unnecessary call to copy, since the |
| JSStringCreateWithCFString function already reads the characters out |
| of the string and does not retain the string, so there is no need to |
| make an immutable copy. And used __bridge for typecast. |
| * inspector/remote/cocoa/RemoteInspectorCocoa.mm: |
| (Inspector::RemoteInspector::receivedProxyApplicationSetupMessage): |
| Ditto. |
| |
| * inspector/remote/cocoa/RemoteInspectorXPCConnection.mm: |
| (Inspector::RemoteInspectorXPCConnection::deserializeMessage): |
| Use CFBridgingRelease instead of autorelease for a CF dictionary that |
| we return as an NSDictionary. |
| |
| 2018-06-04 Keith Miller <keith_miller@apple.com> |
| |
| Remove missing files from JavaScriptCore Xcode project |
| https://bugs.webkit.org/show_bug.cgi?id=186297 |
| |
| Reviewed by Saam Barati. |
| |
| * JavaScriptCore.xcodeproj/project.pbxproj: |
| |
| 2018-06-04 Keith Miller <keith_miller@apple.com> |
| |
| Add test for CoW conversions in the DFG/FTL |
| https://bugs.webkit.org/show_bug.cgi?id=186295 |
| |
| Reviewed by Saam Barati. |
| |
| Add a function to $vm that returns a JSString containing the |
| dataLog dump of the indexingMode of an Object. |
| |
| * tools/JSDollarVM.cpp: |
| (JSC::functionIndexingMode): |
| (JSC::JSDollarVM::finishCreation): |
| |
| 2018-06-04 Saam Barati <sbarati@apple.com> |
| |
| Set the activeLength of all ScratchBuffers to zero when exiting the VM |
| https://bugs.webkit.org/show_bug.cgi?id=186284 |
| <rdar://problem/40780738> |
| |
| Reviewed by Keith Miller. |
| |
| Simon recently found instances where we leak global objects from the |
| ScratchBuffer. Yusuke found that we forgot to set the active length |
| back to zero when doing catch OSR entry in the DFG/FTL. His solution |
| to this was adding a node that cleared the active length. This is |
| a good node to have, but it's not a complete solution: the DFG/FTL |
| could OSR exit before that node executes, which would cause us to leak |
| the data in it. |
| |
| This patch makes it so that we set each scratch buffer's active length |
| to zero on VM exit. This helps prevent leaks for JS code that eventually |
| exits the VM (which is essentially all code on the web and all API users). |
| |
| * runtime/VM.cpp: |
| (JSC::VM::clearScratchBuffers): |
| * runtime/VM.h: |
| * runtime/VMEntryScope.cpp: |
| (JSC::VMEntryScope::~VMEntryScope): |
| |
| 2018-06-04 Keith Miller <keith_miller@apple.com> |
| |
| JSLock should clear last exception when releasing the lock |
| https://bugs.webkit.org/show_bug.cgi?id=186277 |
| |
| Reviewed by Mark Lam. |
| |
| If we don't clear the last exception we essentially leak the |
| object and everything referenced by it until another exception is |
| thrown. |
| |
| * runtime/JSLock.cpp: |
| (JSC::JSLock::willReleaseLock): |
| |
| 2018-06-04 Yusuke Suzuki <utatane.tea@gmail.com> |
| |
| Get rid of UnconditionalFinalizers and WeakReferenceHarvesters |
| https://bugs.webkit.org/show_bug.cgi?id=180248 |
| |
| Reviewed by Sam Weinig. |
| |
| As a final step, this patch removes ListableHandler from JSC. |
| Nobody uses UnconditionalFinalizers and WeakReferenceHarvesters now. |
| |
| * CMakeLists.txt: |
| * JavaScriptCore.xcodeproj/project.pbxproj: |
| * heap/Heap.h: |
| * heap/ListableHandler.h: Removed. |
| |
| 2018-06-03 Yusuke Suzuki <utatane.tea@gmail.com> |
| |
| LayoutTests/fast/css/parsing-css-matches-7.html always abandons its Document (disabling JIT fixes it) |
| https://bugs.webkit.org/show_bug.cgi?id=186223 |
| |
| Reviewed by Keith Miller. |
| |
| After preparing catchOSREntryBuffer, we do not clear the active length of this scratch buffer. |
| It makes this buffer conservative GC root, and allows it to hold GC objects unnecessarily long. |
| |
| This patch introduces DFG ClearCatchLocals node, which clears catchOSREntryBuffer's active length. |
| We model ExtractCatchLocal and ClearCatchLocals appropriately in DFG clobberize too to make |
| this ClearCatchLocals valid. |
| |
| The existing tests for ExtractCatchLocal just pass. |
| |
| * dfg/DFGAbstractHeap.h: |
| * dfg/DFGAbstractInterpreterInlines.h: |
| (JSC::DFG::AbstractInterpreter<AbstractStateType>::executeEffects): |
| * dfg/DFGByteCodeParser.cpp: |
| (JSC::DFG::ByteCodeParser::parseBlock): |
| * dfg/DFGClobberize.h: |
| (JSC::DFG::clobberize): |
| * dfg/DFGDoesGC.cpp: |
| (JSC::DFG::doesGC): |
| * dfg/DFGFixupPhase.cpp: |
| (JSC::DFG::FixupPhase::fixupNode): |
| * dfg/DFGMayExit.cpp: |
| * dfg/DFGNodeType.h: |
| * dfg/DFGOSREntry.cpp: |
| (JSC::DFG::prepareCatchOSREntry): |
| * dfg/DFGPredictionPropagationPhase.cpp: |
| * dfg/DFGSafeToExecute.h: |
| (JSC::DFG::safeToExecute): |
| * dfg/DFGSpeculativeJIT.cpp: |
| (JSC::DFG::SpeculativeJIT::compileClearCatchLocals): |
| * 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::compileClearCatchLocals): |
| |
| 2018-06-02 Darin Adler <darin@apple.com> |
| |
| [Cocoa] Update some code to be more ARC-compatible to prepare for future ARC adoption |
| https://bugs.webkit.org/show_bug.cgi?id=186227 |
| |
| Reviewed by Dan Bernstein. |
| |
| * API/JSContext.mm: |
| (-[JSContext name]): Use CFBridgingRelease instead of autorelease. |
| * API/JSValue.mm: |
| (valueToObjectWithoutCopy): Use CFBridgingRelease instead of autorelease. |
| (containerValueToObject): Use adoptCF instead of autorelease. This is not only more |
| ARC-compatible, but more efficient. |
| (valueToString): Use CFBridgingRelease instead of autorelease. |
| |
| 2018-06-02 Caio Lima <ticaiolima@gmail.com> |
| |
| [ESNext][BigInt] Implement support for addition operations |
| https://bugs.webkit.org/show_bug.cgi?id=179002 |
| |
| Reviewed by Yusuke Suzuki. |
| |
| This patch is implementing support to BigInt Operands into binary "+" |
| and binary "-" operators. Right now, we have limited support to DFG |
| and FTL JIT layers, but we plan to fix this support in future |
| patches. |
| |
| * jit/JITOperations.cpp: |
| * runtime/CommonSlowPaths.cpp: |
| (JSC::SLOW_PATH_DECL): |
| * runtime/JSBigInt.cpp: |
| (JSC::JSBigInt::parseInt): |
| (JSC::JSBigInt::stringToBigInt): |
| (JSC::JSBigInt::toString): |
| (JSC::JSBigInt::multiply): |
| (JSC::JSBigInt::divide): |
| (JSC::JSBigInt::remainder): |
| (JSC::JSBigInt::add): |
| (JSC::JSBigInt::sub): |
| (JSC::JSBigInt::absoluteAdd): |
| (JSC::JSBigInt::absoluteSub): |
| (JSC::JSBigInt::toStringGeneric): |
| (JSC::JSBigInt::allocateFor): |
| (JSC::JSBigInt::toNumber const): |
| (JSC::JSBigInt::getPrimitiveNumber const): |
| * runtime/JSBigInt.h: |
| * runtime/JSCJSValueInlines.h: |
| * runtime/Operations.cpp: |
| (JSC::jsAddSlowCase): |
| * runtime/Operations.h: |
| (JSC::jsSub): |
| |
| 2018-06-02 Commit Queue <commit-queue@webkit.org> |
| |
| Unreviewed, rolling out r232439. |
| https://bugs.webkit.org/show_bug.cgi?id=186238 |
| |
| It breaks gtk-linux-32-release (Requested by caiolima on |
| #webkit). |
| |
| Reverted changeset: |
| |
| "[ESNext][BigInt] Implement support for addition operations" |
| https://bugs.webkit.org/show_bug.cgi?id=179002 |
| https://trac.webkit.org/changeset/232439 |
| |
| 2018-06-01 Yusuke Suzuki <utatane.tea@gmail.com> |
| |
| Baseline op_jtrue emits an insane amount of code |
| https://bugs.webkit.org/show_bug.cgi?id=185708 |
| |
| Reviewed by Filip Pizlo. |
| |
| op_jtrue / op_jfalse bloats massive amount of code. This patch attempts to reduce the size of this code by, |
| |
| 1. op_jtrue / op_jfalse immediately jumps if the condition met. We add AssemblyHelpers::branchIf{Truthy,Falsey} |
| to jump directly. This tightens the code. |
| |
| 2. Align our emitConvertValueToBoolean implementation to FTL's boolify function. It emits less code. |
| |
| This reduces the code size of op_jtrue in x64 from 220 bytes to 164 bytes. |
| |
| [ 12] jtrue arg1, 6(->18) |
| 0x7f233170162c: mov 0x30(%rbp), %rax |
| 0x7f2331701630: mov %rax, %rsi |
| 0x7f2331701633: xor $0x6, %rsi |
| 0x7f2331701637: test $0xfffffffffffffffe, %rsi |
| 0x7f233170163e: jnz 0x7f2331701654 |
| 0x7f2331701644: cmp $0x7, %eax |
| 0x7f2331701647: setz %sil |
| 0x7f233170164b: movzx %sil, %esi |
| 0x7f233170164f: jmp 0x7f2331701705 |
| 0x7f2331701654: test %rax, %r14 |
| 0x7f2331701657: jz 0x7f233170169c |
| 0x7f233170165d: cmp %r14, %rax |
| 0x7f2331701660: jb 0x7f2331701675 |
| 0x7f2331701666: test %eax, %eax |
| 0x7f2331701668: setnz %sil |
| 0x7f233170166c: movzx %sil, %esi |
| 0x7f2331701670: jmp 0x7f2331701705 |
| 0x7f2331701675: lea (%r14,%rax), %rsi |
| 0x7f2331701679: movq %rsi, %xmm0 |
| 0x7f233170167e: xorps %xmm1, %xmm1 |
| 0x7f2331701681: ucomisd %xmm1, %xmm0 |
| 0x7f2331701685: jz 0x7f2331701695 |
| 0x7f233170168b: mov $0x1, %esi |
| 0x7f2331701690: jmp 0x7f2331701705 |
| 0x7f2331701695: xor %esi, %esi |
| 0x7f2331701697: jmp 0x7f2331701705 |
| 0x7f233170169c: test %rax, %r15 |
| 0x7f233170169f: jnz 0x7f2331701703 |
| 0x7f23317016a5: cmp $0x1, 0x5(%rax) |
| 0x7f23317016a9: jnz 0x7f23317016c1 |
| 0x7f23317016af: mov 0x8(%rax), %esi |
| 0x7f23317016b2: test %esi, %esi |
| 0x7f23317016b4: setnz %sil |
| 0x7f23317016b8: movzx %sil, %esi |
| 0x7f23317016bc: jmp 0x7f2331701705 |
| 0x7f23317016c1: test $0x1, 0x6(%rax) |
| 0x7f23317016c5: jz 0x7f23317016f9 |
| 0x7f23317016cb: mov (%rax), %esi |
| 0x7f23317016cd: mov $0x7f23315000c8, %rdx |
| 0x7f23317016d7: mov (%rdx), %rdx |
| 0x7f23317016da: mov (%rdx,%rsi,8), %rsi |
| 0x7f23317016de: mov $0x7f2330de0000, %rdx |
| 0x7f23317016e8: cmp %rdx, 0x18(%rsi) |
| 0x7f23317016ec: jnz 0x7f23317016f9 |
| 0x7f23317016f2: xor %esi, %esi |
| 0x7f23317016f4: jmp 0x7f2331701705 |
| 0x7f23317016f9: mov $0x1, %esi |
| 0x7f23317016fe: jmp 0x7f2331701705 |
| 0x7f2331701703: xor %esi, %esi |
| 0x7f2331701705: test %esi, %esi |
| 0x7f2331701707: jnz 0x7f233170171b |
| |
| [ 12] jtrue arg1, 6(->18) |
| 0x7f6c8710156c: mov 0x30(%rbp), %rax |
| 0x7f6c87101570: test %rax, %r15 |
| 0x7f6c87101573: jnz 0x7f6c871015c8 |
| 0x7f6c87101579: cmp $0x1, 0x5(%rax) |
| 0x7f6c8710157d: jnz 0x7f6c87101592 |
| 0x7f6c87101583: cmp $0x0, 0x8(%rax) |
| 0x7f6c87101587: jnz 0x7f6c87101623 |
| 0x7f6c8710158d: jmp 0x7f6c87101615 |
| 0x7f6c87101592: test $0x1, 0x6(%rax) |
| 0x7f6c87101596: jz 0x7f6c87101623 |
| 0x7f6c8710159c: mov (%rax), %esi |
| 0x7f6c8710159e: mov $0x7f6c86f000e0, %rdx |
| 0x7f6c871015a8: mov (%rdx), %rdx |
| 0x7f6c871015ab: mov (%rdx,%rsi,8), %rsi |
| 0x7f6c871015af: mov $0x7f6c867e0000, %rdx |
| 0x7f6c871015b9: cmp %rdx, 0x18(%rsi) |
| 0x7f6c871015bd: jnz 0x7f6c87101623 |
| 0x7f6c871015c3: jmp 0x7f6c87101615 |
| 0x7f6c871015c8: cmp %r14, %rax |
| 0x7f6c871015cb: jb 0x7f6c871015de |
| 0x7f6c871015d1: test %eax, %eax |
| 0x7f6c871015d3: jnz 0x7f6c87101623 |
| 0x7f6c871015d9: jmp 0x7f6c87101615 |
| 0x7f6c871015de: test %rax, %r14 |
| 0x7f6c871015e1: jz 0x7f6c87101602 |
| 0x7f6c871015e7: lea (%r14,%rax), %rsi |
| 0x7f6c871015eb: movq %rsi, %xmm0 |
| 0x7f6c871015f0: xorps %xmm1, %xmm1 |
| 0x7f6c871015f3: ucomisd %xmm1, %xmm0 |
| 0x7f6c871015f7: jz 0x7f6c87101615 |
| 0x7f6c871015fd: jmp 0x7f6c87101623 |
| 0x7f6c87101602: mov $0x7, %r11 |
| 0x7f6c8710160c: cmp %r11, %rax |
| 0x7f6c8710160f: jz 0x7f6c87101623 |
| |
| * dfg/DFGSpeculativeJIT32_64.cpp: |
| (JSC::DFG::SpeculativeJIT::emitBranch): |
| * dfg/DFGSpeculativeJIT64.cpp: |
| (JSC::DFG::SpeculativeJIT::emitBranch): |
| * jit/AssemblyHelpers.cpp: |
| (JSC::AssemblyHelpers::emitConvertValueToBoolean): |
| (JSC::AssemblyHelpers::branchIfValue): |
| * jit/AssemblyHelpers.h: |
| (JSC::AssemblyHelpers::branchIfTruthy): |
| (JSC::AssemblyHelpers::branchIfFalsey): |
| * jit/JIT.h: |
| * jit/JITInlines.h: |
| (JSC::JIT::addJump): |
| * jit/JITOpcodes.cpp: |
| (JSC::JIT::emit_op_jfalse): |
| (JSC::JIT::emit_op_jtrue): |
| * jit/JITOpcodes32_64.cpp: |
| (JSC::JIT::emit_op_jfalse): |
| (JSC::JIT::emit_op_jtrue): |
| |
| 2018-06-02 Yusuke Suzuki <utatane.tea@gmail.com> |
| |
| [JSC] Remove WeakReferenceHarvester |
| https://bugs.webkit.org/show_bug.cgi?id=186102 |
| |
| Reviewed by Filip Pizlo. |
| |
| After several cleanups, now JSWeakMap becomes the last user of WeakReferenceHarvester. |
| Since JSWeakMap is already managed in IsoSubspace, we can iterate marked JSWeakMap |
| by using output constraints & Subspace iteration. |
| |
| This patch removes WeakReferenceHarvester. Instead of managing this linked-list, our |
| output constraint set iterates marked JSWeakMap by using Subspace. |
| |
| And we also add locking for JSWeakMap's rehash and output constraint visiting. |
| |
| Attached microbenchmark does not show any regression. |
| |
| * API/JSAPIWrapperObject.h: |
| * CMakeLists.txt: |
| * JavaScriptCore.xcodeproj/project.pbxproj: |
| * heap/Heap.cpp: |
| (JSC::Heap::endMarking): |
| (JSC::Heap::addCoreConstraints): |
| * heap/Heap.h: |
| * heap/SlotVisitor.cpp: |
| (JSC::SlotVisitor::addWeakReferenceHarvester): Deleted. |
| * heap/SlotVisitor.h: |
| * heap/WeakReferenceHarvester.h: Removed. |
| * runtime/WeakMapImpl.cpp: |
| (JSC::WeakMapImpl<WeakMapBucket>::visitChildren): |
| (JSC::WeakMapImpl<WeakMapBucket<WeakMapBucketDataKey>>::visitOutputConstraints): |
| (JSC::WeakMapImpl<WeakMapBucket<WeakMapBucketDataKeyValue>>::visitOutputConstraints): |
| (JSC::WeakMapImpl<WeakMapBucket<WeakMapBucketDataKey>>::visitWeakReferences): Deleted. |
| (JSC::WeakMapImpl<WeakMapBucket<WeakMapBucketDataKeyValue>>::visitWeakReferences): Deleted. |
| * runtime/WeakMapImpl.h: |
| (JSC::WeakMapImpl::WeakMapImpl): |
| (JSC::WeakMapImpl::finishCreation): |
| (JSC::WeakMapImpl::rehash): |
| (JSC::WeakMapImpl::makeAndSetNewBuffer): |
| (JSC::WeakMapImpl::DeadKeyCleaner::target): Deleted. |
| |
| 2018-06-02 Yusuke Suzuki <utatane.tea@gmail.com> |
| |
| [JSC] Object.create should have intrinsic |
| https://bugs.webkit.org/show_bug.cgi?id=186200 |
| |
| Reviewed by Filip Pizlo. |
| |
| Object.create is used in various JS code. `Object.create(null)` is particularly used |
| to create empty plain object with null [[Prototype]]. We can find `Object.create(null)` |
| call in ARES-6/Babylon code. |
| |
| This patch adds ObjectCreateIntrinsic to JSC. DFG recognizes it and produces ObjectCreate |
| DFG node. DFG AI and constant folding attempt to convert it to NewObject when prototype |
| object is null. It offers significant performance boost for `Object.create(null)`. |
| |
| baseline patched |
| |
| object-create-null 53.7940+-1.5297 ^ 19.8846+-0.6584 ^ definitely 2.7053x faster |
| object-create-unknown-object-prototype 38.9977+-1.1364 ^ 37.2207+-0.6143 ^ definitely 1.0477x faster |
| object-create-untyped-prototype 22.5632+-0.6917 22.2539+-0.6876 might be 1.0139x faster |
| |
| * dfg/DFGAbstractInterpreterInlines.h: |
| (JSC::DFG::AbstractInterpreter<AbstractStateType>::executeEffects): |
| * dfg/DFGByteCodeParser.cpp: |
| (JSC::DFG::ByteCodeParser::handleIntrinsicCall): |
| * dfg/DFGClobberize.h: |
| (JSC::DFG::clobberize): |
| * dfg/DFGConstantFoldingPhase.cpp: |
| (JSC::DFG::ConstantFoldingPhase::foldConstants): |
| * dfg/DFGDoesGC.cpp: |
| (JSC::DFG::doesGC): |
| * dfg/DFGFixupPhase.cpp: |
| (JSC::DFG::FixupPhase::fixupNode): |
| * dfg/DFGNode.h: |
| (JSC::DFG::Node::convertToNewObject): |
| * dfg/DFGNodeType.h: |
| * dfg/DFGOperations.cpp: |
| * dfg/DFGOperations.h: |
| * dfg/DFGPredictionPropagationPhase.cpp: |
| * dfg/DFGSafeToExecute.h: |
| (JSC::DFG::safeToExecute): |
| * dfg/DFGSpeculativeJIT.cpp: |
| (JSC::DFG::SpeculativeJIT::compileObjectCreate): |
| * 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::compileObjectCreate): |
| * runtime/Intrinsic.cpp: |
| (JSC::intrinsicName): |
| * runtime/Intrinsic.h: |
| * runtime/JSGlobalObject.cpp: |
| (JSC::JSGlobalObject::init): |
| (JSC::JSGlobalObject::visitChildren): |
| * runtime/JSGlobalObject.h: |
| (JSC::JSGlobalObject::nullPrototypeObjectStructure const): |
| * runtime/ObjectConstructor.cpp: |
| |
| 2018-06-02 Caio Lima <ticaiolima@gmail.com> |
| |
| [ESNext][BigInt] Implement support for addition operations |
| https://bugs.webkit.org/show_bug.cgi?id=179002 |
| |
| Reviewed by Yusuke Suzuki. |
| |
| This patch is implementing support to BigInt Operands into binary "+" |
| and binary "-" operators. Right now, we have limited support to DFG |
| and FTL JIT layers, but we plan to fix this support in future |
| patches. |
| |
| * jit/JITOperations.cpp: |
| * runtime/CommonSlowPaths.cpp: |
| (JSC::SLOW_PATH_DECL): |
| * runtime/JSBigInt.cpp: |
| (JSC::JSBigInt::parseInt): |
| (JSC::JSBigInt::stringToBigInt): |
| (JSC::JSBigInt::toString): |
| (JSC::JSBigInt::multiply): |
| (JSC::JSBigInt::divide): |
| (JSC::JSBigInt::remainder): |
| (JSC::JSBigInt::add): |
| (JSC::JSBigInt::sub): |
| (JSC::JSBigInt::absoluteAdd): |
| (JSC::JSBigInt::absoluteSub): |
| (JSC::JSBigInt::toStringGeneric): |
| (JSC::JSBigInt::allocateFor): |
| (JSC::JSBigInt::toNumber const): |
| (JSC::JSBigInt::getPrimitiveNumber const): |
| * runtime/JSBigInt.h: |
| * runtime/JSCJSValueInlines.h: |
| * runtime/Operations.cpp: |
| (JSC::jsAddSlowCase): |
| * runtime/Operations.h: |
| (JSC::jsSub): |
| |
| 2018-06-01 Wenson Hsieh <wenson_hsieh@apple.com> |
| |
| Fix the watchOS build after r232385 |
| https://bugs.webkit.org/show_bug.cgi?id=186203 |
| |
| Reviewed by Keith Miller. |
| |
| Add a missing header include for JSImmutableButterfly. |
| |
| * runtime/ArrayPrototype.cpp: |
| |
| 2018-05-29 Yusuke Suzuki <utatane.tea@gmail.com> |
| |
| [JSC] Add Symbol.prototype.description getter |
| https://bugs.webkit.org/show_bug.cgi?id=186053 |
| |
| Reviewed by Keith Miller. |
| |
| Symbol.prototype.description accessor is now stage 3[1]. |
| This adds a getter to retrieve [[Description]] value from Symbol. |
| Previously, Symbol#toString() returns `Symbol(${description})` value. |
| So users need to extract `description` part if they want it. |
| |
| [1]: https://tc39.github.io/proposal-Symbol-description/ |
| |
| * runtime/Symbol.cpp: |
| (JSC::Symbol::description const): |
| * runtime/Symbol.h: |
| * runtime/SymbolPrototype.cpp: |
| (JSC::tryExtractSymbol): |
| (JSC::symbolProtoGetterDescription): |
| (JSC::symbolProtoFuncToString): |
| (JSC::symbolProtoFuncValueOf): |
| |
| 2018-06-01 Yusuke Suzuki <utatane.tea@gmail.com> |
| |
| [JSC] Correct values and members of JSBigInt appropriately |
| https://bugs.webkit.org/show_bug.cgi?id=186196 |
| |
| Reviewed by Darin Adler. |
| |
| This patch cleans up a bit to select more appropriate values and members of JSBigInt. |
| |
| 1. JSBigInt's structure should be StructureIsImmortal. |
| 2. JSBigInt::allocationSize should be annotated with `inline`. |
| 3. Remove JSBigInt::visitChildren since it is completely the same to JSCell::visitChildren. |
| 4. Remove JSBigInt::finishCreation since it is completely the same to JSCell::finishCreation. |
| |
| * runtime/JSBigInt.cpp: |
| (JSC::JSBigInt::allocationSize): |
| (JSC::JSBigInt::allocateFor): |
| (JSC::JSBigInt::compareToDouble): |
| (JSC::JSBigInt::visitChildren): Deleted. |
| (JSC::JSBigInt::finishCreation): Deleted. |
| * runtime/JSBigInt.h: |
| |
| 2018-05-30 Yusuke Suzuki <utatane.tea@gmail.com> |
| |
| [DFG] InById should be converted to MatchStructure |
| https://bugs.webkit.org/show_bug.cgi?id=185803 |
| |
| Reviewed by Keith Miller. |
| |
| MatchStructure is introduced for instanceof optimization. But this node |
| is also useful for InById node. This patch converts InById to MatchStructure |
| node with CheckStructures if possible by using InByIdStatus. |
| |
| Added microbenchmarks show improvements. |
| |
| baseline patched |
| |
| in-by-id-removed 18.1196+-0.8108 ^ 16.1702+-0.9773 ^ definitely 1.1206x faster |
| in-by-id-match 16.3912+-0.2608 ^ 15.2736+-0.8173 ^ definitely 1.0732x faster |
| |
| * JavaScriptCore.xcodeproj/project.pbxproj: |
| * Sources.txt: |
| * bytecode/InByIdStatus.cpp: Added. |
| (JSC::InByIdStatus::appendVariant): |
| (JSC::InByIdStatus::computeFor): |
| (JSC::InByIdStatus::hasExitSite): |
| (JSC::InByIdStatus::computeForStubInfo): |
| (JSC::InByIdStatus::computeForStubInfoWithoutExitSiteFeedback): |
| (JSC::InByIdStatus::filter): |
| (JSC::InByIdStatus::dump const): |
| * bytecode/InByIdStatus.h: Added. |
| (JSC::InByIdStatus::InByIdStatus): |
| (JSC::InByIdStatus::state const): |
| (JSC::InByIdStatus::isSet const): |
| (JSC::InByIdStatus::operator bool const): |
| (JSC::InByIdStatus::isSimple const): |
| (JSC::InByIdStatus::numVariants const): |
| (JSC::InByIdStatus::variants const): |
| (JSC::InByIdStatus::at const): |
| (JSC::InByIdStatus::operator[] const): |
| (JSC::InByIdStatus::takesSlowPath const): |
| * bytecode/InByIdVariant.cpp: Added. |
| (JSC::InByIdVariant::InByIdVariant): |
| (JSC::InByIdVariant::attemptToMerge): |
| (JSC::InByIdVariant::dump const): |
| (JSC::InByIdVariant::dumpInContext const): |
| * bytecode/InByIdVariant.h: Added. |
| (JSC::InByIdVariant::isSet const): |
| (JSC::InByIdVariant::operator bool const): |
| (JSC::InByIdVariant::structureSet const): |
| (JSC::InByIdVariant::structureSet): |
| (JSC::InByIdVariant::conditionSet const): |
| (JSC::InByIdVariant::offset const): |
| (JSC::InByIdVariant::isHit const): |
| * bytecode/PolyProtoAccessChain.h: |
| * dfg/DFGByteCodeParser.cpp: |
| (JSC::DFG::ByteCodeParser::parseBlock): |
| |
| 2018-06-01 Keith Miller <keith_miller@apple.com> |
| |
| move should only emit the move if it's actually needed |
| https://bugs.webkit.org/show_bug.cgi?id=186123 |
| |
| Reviewed by Saam Barati. |
| |
| This patch relpaces move with moveToDestinationIfNeeded. This |
| will prevent us from emiting moves to the same location. The old |
| move, has been renamed to emitMove and made private. |
| |
| * bytecompiler/BytecodeGenerator.cpp: |
| (JSC::BytecodeGenerator::BytecodeGenerator): |
| (JSC::BytecodeGenerator::emitMove): |
| (JSC::BytecodeGenerator::emitGetGlobalPrivate): |
| (JSC::BytecodeGenerator::emitGetAsyncIterator): |
| (JSC::BytecodeGenerator::move): Deleted. |
| * bytecompiler/BytecodeGenerator.h: |
| (JSC::BytecodeGenerator::move): |
| (JSC::BytecodeGenerator::moveToDestinationIfNeeded): Deleted. |
| * bytecompiler/NodesCodegen.cpp: |
| (JSC::ThisNode::emitBytecode): |
| (JSC::SuperNode::emitBytecode): |
| (JSC::NewTargetNode::emitBytecode): |
| (JSC::ResolveNode::emitBytecode): |
| (JSC::TaggedTemplateNode::emitBytecode): |
| (JSC::ArrayNode::emitBytecode): |
| (JSC::ObjectLiteralNode::emitBytecode): |
| (JSC::EvalFunctionCallNode::emitBytecode): |
| (JSC::FunctionCallResolveNode::emitBytecode): |
| (JSC::BytecodeIntrinsicNode::emit_intrinsic_putByIdDirect): |
| (JSC::BytecodeIntrinsicNode::emit_intrinsic_putByIdDirectPrivate): |
| (JSC::BytecodeIntrinsicNode::emit_intrinsic_putByValDirect): |
| (JSC::BytecodeIntrinsicNode::emit_intrinsic_toNumber): |
| (JSC::BytecodeIntrinsicNode::emit_intrinsic_toString): |
| (JSC::BytecodeIntrinsicNode::emit_intrinsic_toObject): |
| (JSC::BytecodeIntrinsicNode::emit_intrinsic_idWithProfile): |
| (JSC::BytecodeIntrinsicNode::emit_intrinsic_isJSArray): |
| (JSC::BytecodeIntrinsicNode::emit_intrinsic_isProxyObject): |
| (JSC::BytecodeIntrinsicNode::emit_intrinsic_isRegExpObject): |
| (JSC::BytecodeIntrinsicNode::emit_intrinsic_isObject): |
| (JSC::BytecodeIntrinsicNode::emit_intrinsic_isDerivedArray): |
| (JSC::BytecodeIntrinsicNode::emit_intrinsic_isMap): |
| (JSC::BytecodeIntrinsicNode::emit_intrinsic_isSet): |
| (JSC::CallFunctionCallDotNode::emitBytecode): |
| (JSC::ApplyFunctionCallDotNode::emitBytecode): |
| (JSC::emitPostIncOrDec): |
| (JSC::PostfixNode::emitBracket): |
| (JSC::PostfixNode::emitDot): |
| (JSC::PrefixNode::emitResolve): |
| (JSC::PrefixNode::emitBracket): |
| (JSC::PrefixNode::emitDot): |
| (JSC::LogicalOpNode::emitBytecode): |
| (JSC::ReadModifyResolveNode::emitBytecode): |
| (JSC::AssignResolveNode::emitBytecode): |
| (JSC::AssignDotNode::emitBytecode): |
| (JSC::AssignBracketNode::emitBytecode): |
| (JSC::FunctionNode::emitBytecode): |
| (JSC::ClassExprNode::emitBytecode): |
| (JSC::DestructuringAssignmentNode::emitBytecode): |
| (JSC::ArrayPatternNode::emitDirectBinding): |
| (JSC::ObjectPatternNode::bindValue const): |
| (JSC::AssignmentElementNode::bindValue const): |
| (JSC::ObjectSpreadExpressionNode::emitBytecode): |
| |
| 2018-05-31 Yusuke Suzuki <utatane.tea@gmail.com> |
| |
| [Baseline] Store constant directly in emit_op_mov |
| https://bugs.webkit.org/show_bug.cgi?id=186182 |
| |
| Reviewed by Saam Barati. |
| |
| In the old code, we first move a constant to a register and store it to the specified address. |
| But in 64bit JSC, we can directly store a constant to the specified address. This reduces the |
| generated code size. Since the old code was emitting a constant in a code anyway, this change |
| never increases the size of the generated code. |
| |
| * jit/JITInlines.h: |
| (JSC::JIT::emitGetVirtualRegister): |
| We remove this obsolete comment. Our OSR relies on the fact that values are stored and loaded |
| from the stack. If we transfer values in registers without loading values from the stack, it |
| breaks this assumption. |
| |
| * jit/JITOpcodes.cpp: |
| (JSC::JIT::emit_op_mov): |
| |
| 2018-05-31 Caio Lima <ticaiolima@gmail.com> |
| |
| [ESNext][BigInt] Implement support for "=<" and ">=" relational operation |
| https://bugs.webkit.org/show_bug.cgi?id=185929 |
| |
| Reviewed by Yusuke Suzuki. |
| |
| This patch is introducing support to BigInt operands into ">=" and |
| "<=" operators. |
| Here we introduce ```bigIntCompareResult``` that is a helper function |
| to reuse code between "less than" and "less than or equal" operators. |
| |
| * runtime/JSBigInt.h: |
| * runtime/Operations.h: |
| (JSC::bigIntCompareResult): |
| (JSC::bigIntCompare): |
| (JSC::jsLess): |
| (JSC::jsLessEq): |
| (JSC::bigIntCompareLess): Deleted. |
| |
| 2018-05-31 Saam Barati <sbarati@apple.com> |
| |
| Cache toString results for CoW arrays |
| https://bugs.webkit.org/show_bug.cgi?id=186160 |
| |
| Reviewed by Keith Miller. |
| |
| This patch makes it so that we cache the result of toString on |
| arrays with a CoW butterfly. This cache lives on Heap and is |
| cleared after every GC. We only cache the toString result when |
| the CoW butterfly doesn't have a hole (currently, all CoW arrays |
| have a hole, but this isn't an invariant we want to rely on). The |
| reason for this is that if there is a hole, the value may be loaded |
| from the prototype, and the cache may produce a stale result. |
| |
| This is a ~4% speedup on the ML subtest in ARES. And is a ~1% overall |
| progression on ARES. |
| |
| * heap/Heap.cpp: |
| (JSC::Heap::finalize): |
| (JSC::Heap::addCoreConstraints): |
| * heap/Heap.h: |
| * runtime/ArrayPrototype.cpp: |
| (JSC::canUseFastJoin): |
| (JSC::holesMustForwardToPrototype): |
| (JSC::isHole): |
| (JSC::containsHole): |
| (JSC::fastJoin): |
| (JSC::arrayProtoFuncToString): |
| |
| 2018-05-31 Saam Barati <sbarati@apple.com> |
| |
| PutStructure AI rule needs to call didFoldClobberStructures when the incoming value's structure set is clear |
| https://bugs.webkit.org/show_bug.cgi?id=186169 |
| |
| Reviewed by Mark Lam. |
| |
| If we don't do this, the CFA validation rule about StructureID being |
| clobbered but AI not clobbering or folding a clobber will cause us |
| to crash. Simon was running into this yesterday on arstechnica.com. |
| I couldn't come up with a test case for this, but it's obvious |
| what the issue is by looking at the IR dump at the time of the crash. |
| |
| * dfg/DFGAbstractInterpreterInlines.h: |
| (JSC::DFG::AbstractInterpreter<AbstractStateType>::executeEffects): |
| |
| 2018-05-31 Saam Barati <sbarati@apple.com> |
| |
| JSImmutableButterfly should align its variable storage |
| https://bugs.webkit.org/show_bug.cgi?id=186159 |
| |
| Reviewed by Mark Lam. |
| |
| I'm also making the use of reinterpret_cast and bitwise_cast consistent |
| inside of JSImmutableButterfly. I switched everything to use bitwise_cast. |
| |
| * runtime/JSImmutableButterfly.h: |
| (JSC::JSImmutableButterfly::toButterfly const): |
| (JSC::JSImmutableButterfly::fromButterfly): |
| (JSC::JSImmutableButterfly::offsetOfData): |
| (JSC::JSImmutableButterfly::allocationSize): |
| |
| 2018-05-31 Keith Miller <keith_miller@apple.com> |
| |
| DFGArrayModes needs to know more about CoW arrays |
| https://bugs.webkit.org/show_bug.cgi?id=186162 |
| |
| Reviewed by Filip Pizlo. |
| |
| This patch fixes two issues in DFGArrayMode. |
| |
| 1) fromObserved was missing switch cases for when the only observed ArrayModes are CopyOnWrite. |
| 2) DFGArrayModes needs to track if the ArrayClass is an OriginalCopyOnWriteArray in order |
| to vend an accurate original structure. |
| |
| Additionally, this patch fixes some places in Bytecode parsing where we told the array mode |
| we were doing a read but actually doing a write. Also, DFGArrayMode will now print the |
| action it is expecting when being dumped. |
| |
| * bytecode/ArrayProfile.h: |
| (JSC::hasSeenWritableArray): |
| * dfg/DFGArrayMode.cpp: |
| (JSC::DFG::ArrayMode::fromObserved): |
| (JSC::DFG::ArrayMode::refine const): |
| (JSC::DFG::ArrayMode::originalArrayStructure const): |
| (JSC::DFG::arrayActionToString): |
| (JSC::DFG::arrayClassToString): |
| (JSC::DFG::ArrayMode::dump const): |
| (WTF::printInternal): |
| * dfg/DFGArrayMode.h: |
| (JSC::DFG::ArrayMode::withProfile const): |
| (JSC::DFG::ArrayMode::isJSArray const): |
| (JSC::DFG::ArrayMode::isJSArrayWithOriginalStructure const): |
| (JSC::DFG::ArrayMode::arrayModesWithIndexingShape const): |
| * dfg/DFGByteCodeParser.cpp: |
| (JSC::DFG::ByteCodeParser::handleIntrinsicCall): |
| (JSC::DFG::ByteCodeParser::parseBlock): |
| * dfg/DFGFixupPhase.cpp: |
| (JSC::DFG::FixupPhase::fixupNode): |
| * dfg/DFGSpeculativeJIT.cpp: |
| (JSC::DFG::SpeculativeJIT::jumpSlowForUnwantedArrayMode): |
| * ftl/FTLLowerDFGToB3.cpp: |
| (JSC::FTL::DFG::LowerDFGToB3::isArrayTypeForArrayify): |
| |
| 2018-05-30 Yusuke Suzuki <utatane.tea@gmail.com> |
| |
| [JSC] Pass VM& parameter as much as possible |
| https://bugs.webkit.org/show_bug.cgi?id=186085 |
| |
| Reviewed by Saam Barati. |
| |
| JSCell::vm() is slow compared to ExecState::vm(). That's why we have bunch of functions in JSCell/JSObject that take VM& as a parameter. |
| For example, we have JSCell::structure() and JSCell::structure(VM&), the former retrieves VM& from the cell and invokes structure(VM&). |
| If we can get VM& from ExecState* or the other place, it reduces the inlined code size. |
| This patch attempts to pass VM& parameter to such functions as much as possible. |
| |
| * API/APICast.h: |
| (toJS): |
| (toJSForGC): |
| * API/JSCallbackObjectFunctions.h: |
| (JSC::JSCallbackObject<Parent>::getOwnPropertySlotByIndex): |
| (JSC::JSCallbackObject<Parent>::deletePropertyByIndex): |
| (JSC::JSCallbackObject<Parent>::staticFunctionGetter): |
| * API/JSObjectRef.cpp: |
| (JSObjectIsConstructor): |
| * API/JSTypedArray.cpp: |
| (JSObjectGetTypedArrayBuffer): |
| * API/JSValueRef.cpp: |
| (JSValueIsInstanceOfConstructor): |
| * bindings/ScriptFunctionCall.cpp: |
| (Deprecated::ScriptFunctionCall::call): |
| * bindings/ScriptValue.cpp: |
| (Inspector::jsToInspectorValue): |
| * bytecode/AccessCase.cpp: |
| (JSC::AccessCase::generateImpl): |
| * bytecode/CodeBlock.cpp: |
| (JSC::CodeBlock::CodeBlock): |
| * bytecode/ObjectAllocationProfileInlines.h: |
| (JSC::ObjectAllocationProfile::possibleDefaultPropertyCount): |
| * bytecode/ObjectPropertyConditionSet.cpp: |
| (JSC::generateConditionsForInstanceOf): |
| * bytecode/PropertyCondition.cpp: |
| (JSC::PropertyCondition::isWatchableWhenValid const): |
| (JSC::PropertyCondition::attemptToMakeEquivalenceWithoutBarrier const): |
| * bytecode/StructureStubClearingWatchpoint.cpp: |
| (JSC::StructureStubClearingWatchpoint::fireInternal): |
| * debugger/Debugger.cpp: |
| (JSC::Debugger::detach): |
| * debugger/DebuggerScope.cpp: |
| (JSC::DebuggerScope::create): |
| (JSC::DebuggerScope::put): |
| (JSC::DebuggerScope::deleteProperty): |
| (JSC::DebuggerScope::getOwnPropertyNames): |
| (JSC::DebuggerScope::defineOwnProperty): |
| * dfg/DFGAbstractInterpreterInlines.h: |
| (JSC::DFG::AbstractInterpreter<AbstractStateType>::executeEffects): |
| * dfg/DFGAbstractValue.cpp: |
| (JSC::DFG::AbstractValue::mergeOSREntryValue): |
| * dfg/DFGArgumentsEliminationPhase.cpp: |
| * dfg/DFGArrayMode.cpp: |
| (JSC::DFG::ArrayMode::refine const): |
| * dfg/DFGByteCodeParser.cpp: |
| (JSC::DFG::ByteCodeParser::handleIntrinsicCall): |
| (JSC::DFG::ByteCodeParser::handleTypedArrayConstructor): |
| (JSC::DFG::ByteCodeParser::handleConstantInternalFunction): |
| (JSC::DFG::ByteCodeParser::check): |
| * dfg/DFGConstantFoldingPhase.cpp: |
| (JSC::DFG::ConstantFoldingPhase::foldConstants): |
| (JSC::DFG::ConstantFoldingPhase::addStructureTransitionCheck): |
| * dfg/DFGFixupPhase.cpp: |
| (JSC::DFG::FixupPhase::fixupNode): |
| * dfg/DFGGraph.cpp: |
| (JSC::DFG::Graph::tryGetConstantProperty): |
| * dfg/DFGOperations.cpp: |
| * dfg/DFGSpeculativeJIT.cpp: |
| (JSC::DFG::SpeculativeJIT::compileGetByValOnString): |
| * dfg/DFGStrengthReductionPhase.cpp: |
| (JSC::DFG::StrengthReductionPhase::handleNode): |
| * ftl/FTLLowerDFGToB3.cpp: |
| (JSC::FTL::DFG::LowerDFGToB3::compileStringCharAt): |
| * ftl/FTLOperations.cpp: |
| (JSC::FTL::operationPopulateObjectInOSR): |
| * inspector/InjectedScriptManager.cpp: |
| (Inspector::InjectedScriptManager::createInjectedScript): |
| * inspector/JSJavaScriptCallFrame.cpp: |
| (Inspector::JSJavaScriptCallFrame::caller const): |
| (Inspector::JSJavaScriptCallFrame::scopeChain const): |
| * interpreter/CallFrame.cpp: |
| (JSC::CallFrame::wasmAwareLexicalGlobalObject): |
| * interpreter/Interpreter.cpp: |
| (JSC::Interpreter::executeProgram): |
| (JSC::Interpreter::executeCall): |
| (JSC::Interpreter::executeConstruct): |
| (JSC::Interpreter::execute): |
| (JSC::Interpreter::executeModuleProgram): |
| * jit/JITOperations.cpp: |
| (JSC::getByVal): |
| * jit/Repatch.cpp: |
| (JSC::tryCacheInByID): |
| * jsc.cpp: |
| (functionDollarAgentReceiveBroadcast): |
| (functionHasCustomProperties): |
| * llint/LLIntSlowPaths.cpp: |
| (JSC::LLInt::LLINT_SLOW_PATH_DECL): |
| (JSC::LLInt::setupGetByIdPrototypeCache): |
| (JSC::LLInt::getByVal): |
| (JSC::LLInt::handleHostCall): |
| (JSC::LLInt::llint_throw_stack_overflow_error): |
| * runtime/AbstractModuleRecord.cpp: |
| (JSC::AbstractModuleRecord::finishCreation): |
| * runtime/ArrayConstructor.cpp: |
| (JSC::constructArrayWithSizeQuirk): |
| * runtime/ArrayPrototype.cpp: |
| (JSC::speciesWatchpointIsValid): |
| (JSC::arrayProtoFuncToString): |
| (JSC::arrayProtoFuncToLocaleString): |
| (JSC::ArrayPrototype::tryInitializeSpeciesWatchpoint): |
| * runtime/AsyncFunctionConstructor.cpp: |
| (JSC::callAsyncFunctionConstructor): |
| (JSC::constructAsyncFunctionConstructor): |
| * runtime/AsyncGeneratorFunctionConstructor.cpp: |
| (JSC::callAsyncGeneratorFunctionConstructor): |
| (JSC::constructAsyncGeneratorFunctionConstructor): |
| * runtime/BooleanConstructor.cpp: |
| (JSC::constructWithBooleanConstructor): |
| * runtime/ClonedArguments.cpp: |
| (JSC::ClonedArguments::createEmpty): |
| (JSC::ClonedArguments::createWithInlineFrame): |
| (JSC::ClonedArguments::createWithMachineFrame): |
| (JSC::ClonedArguments::createByCopyingFrom): |
| (JSC::ClonedArguments::getOwnPropertySlot): |
| (JSC::ClonedArguments::materializeSpecials): |
| * runtime/CommonSlowPaths.cpp: |
| (JSC::SLOW_PATH_DECL): |
| * runtime/CommonSlowPaths.h: |
| (JSC::CommonSlowPaths::tryCachePutToScopeGlobal): |
| (JSC::CommonSlowPaths::tryCacheGetFromScopeGlobal): |
| (JSC::CommonSlowPaths::canAccessArgumentIndexQuickly): |
| * runtime/ConstructData.cpp: |
| (JSC::construct): |
| * runtime/DateConstructor.cpp: |
| (JSC::constructWithDateConstructor): |
| * runtime/DatePrototype.cpp: |
| (JSC::dateProtoFuncToJSON): |
| * runtime/DirectArguments.cpp: |
| (JSC::DirectArguments::overrideThings): |
| * runtime/Error.cpp: |
| (JSC::getStackTrace): |
| * runtime/ErrorConstructor.cpp: |
| (JSC::Interpreter::constructWithErrorConstructor): |
| (JSC::Interpreter::callErrorConstructor): |
| * runtime/FunctionConstructor.cpp: |
| (JSC::constructWithFunctionConstructor): |
| (JSC::callFunctionConstructor): |
| * runtime/GeneratorFunctionConstructor.cpp: |
| (JSC::callGeneratorFunctionConstructor): |
| (JSC::constructGeneratorFunctionConstructor): |
| * runtime/GenericArgumentsInlines.h: |
| (JSC::GenericArguments<Type>::getOwnPropertySlot): |
| * runtime/InferredStructureWatchpoint.cpp: |
| (JSC::InferredStructureWatchpoint::fireInternal): |
| * runtime/InferredType.cpp: |
| (JSC::InferredType::removeStructure): |
| * runtime/InferredType.h: |
| * runtime/InferredTypeInlines.h: |
| (JSC::InferredType::finalizeUnconditionally): |
| * runtime/IntlCollator.cpp: |
| (JSC::IntlCollator::initializeCollator): |
| * runtime/IntlCollatorConstructor.cpp: |
| (JSC::IntlCollatorConstructorFuncSupportedLocalesOf): |
| * runtime/IntlCollatorPrototype.cpp: |
| (JSC::IntlCollatorPrototypeGetterCompare): |
| * runtime/IntlDateTimeFormat.cpp: |
| (JSC::IntlDateTimeFormat::initializeDateTimeFormat): |
| (JSC::IntlDateTimeFormat::formatToParts): |
| * runtime/IntlDateTimeFormatConstructor.cpp: |
| (JSC::IntlDateTimeFormatConstructorFuncSupportedLocalesOf): |
| * runtime/IntlDateTimeFormatPrototype.cpp: |
| (JSC::IntlDateTimeFormatPrototypeGetterFormat): |
| * runtime/IntlNumberFormat.cpp: |
| (JSC::IntlNumberFormat::initializeNumberFormat): |
| (JSC::IntlNumberFormat::formatToParts): |
| * runtime/IntlNumberFormatConstructor.cpp: |
| (JSC::IntlNumberFormatConstructorFuncSupportedLocalesOf): |
| * runtime/IntlNumberFormatPrototype.cpp: |
| (JSC::IntlNumberFormatPrototypeGetterFormat): |
| * runtime/IntlObject.cpp: |
| (JSC::canonicalizeLocaleList): |
| (JSC::defaultLocale): |
| (JSC::lookupSupportedLocales): |
| (JSC::intlObjectFuncGetCanonicalLocales): |
| * runtime/IntlPluralRules.cpp: |
| (JSC::IntlPluralRules::initializePluralRules): |
| (JSC::IntlPluralRules::resolvedOptions): |
| * runtime/IntlPluralRulesConstructor.cpp: |
| (JSC::IntlPluralRulesConstructorFuncSupportedLocalesOf): |
| * runtime/IteratorOperations.cpp: |
| (JSC::iteratorNext): |
| (JSC::iteratorClose): |
| (JSC::iteratorForIterable): |
| * runtime/JSArray.cpp: |
| (JSC::JSArray::shiftCountWithArrayStorage): |
| (JSC::JSArray::unshiftCountWithArrayStorage): |
| (JSC::JSArray::isIteratorProtocolFastAndNonObservable): |
| * runtime/JSArrayBufferConstructor.cpp: |
| (JSC::JSArrayBufferConstructor::finishCreation): |
| (JSC::constructArrayBuffer): |
| * runtime/JSArrayBufferPrototype.cpp: |
| (JSC::arrayBufferProtoFuncSlice): |
| * runtime/JSArrayBufferView.cpp: |
| (JSC::JSArrayBufferView::unsharedJSBuffer): |
| (JSC::JSArrayBufferView::possiblySharedJSBuffer): |
| * runtime/JSAsyncFunction.cpp: |
| (JSC::JSAsyncFunction::createImpl): |
| (JSC::JSAsyncFunction::create): |
| (JSC::JSAsyncFunction::createWithInvalidatedReallocationWatchpoint): |
| * runtime/JSAsyncGeneratorFunction.cpp: |
| (JSC::JSAsyncGeneratorFunction::createImpl): |
| (JSC::JSAsyncGeneratorFunction::create): |
| (JSC::JSAsyncGeneratorFunction::createWithInvalidatedReallocationWatchpoint): |
| * runtime/JSBoundFunction.cpp: |
| (JSC::boundThisNoArgsFunctionCall): |
| (JSC::boundFunctionCall): |
| (JSC::boundThisNoArgsFunctionConstruct): |
| (JSC::boundFunctionConstruct): |
| (JSC::getBoundFunctionStructure): |
| (JSC::JSBoundFunction::create): |
| (JSC::JSBoundFunction::boundArgsCopy): |
| * runtime/JSCJSValue.cpp: |
| (JSC::JSValue::putToPrimitive): |
| * runtime/JSCellInlines.h: |
| (JSC::JSCell::setStructure): |
| (JSC::JSCell::methodTable const): |
| (JSC::JSCell::toBoolean const): |
| * runtime/JSFunction.h: |
| (JSC::JSFunction::createImpl): |
| * runtime/JSGeneratorFunction.cpp: |
| (JSC::JSGeneratorFunction::createImpl): |
| (JSC::JSGeneratorFunction::create): |
| (JSC::JSGeneratorFunction::createWithInvalidatedReallocationWatchpoint): |
| * runtime/JSGenericTypedArrayViewConstructorInlines.h: |
| (JSC::constructGenericTypedArrayViewWithArguments): |
| (JSC::constructGenericTypedArrayView): |
| * runtime/JSGenericTypedArrayViewInlines.h: |
| (JSC::JSGenericTypedArrayView<Adaptor>::getOwnPropertySlotByIndex): |
| (JSC::JSGenericTypedArrayView<Adaptor>::putByIndex): |
| (JSC::JSGenericTypedArrayView<Adaptor>::deletePropertyByIndex): |
| (JSC::JSGenericTypedArrayView<Adaptor>::slowDownAndWasteMemory): |
| * runtime/JSGenericTypedArrayViewPrototypeFunctions.h: |
| (JSC::genericTypedArrayViewProtoFuncSlice): |
| (JSC::genericTypedArrayViewPrivateFuncSubarrayCreate): |
| * runtime/JSGlobalObject.cpp: |
| (JSC::JSGlobalObject::init): |
| (JSC::JSGlobalObject::exposeDollarVM): |
| (JSC::JSGlobalObject::finishCreation): |
| * runtime/JSGlobalObject.h: |
| * runtime/JSGlobalObjectFunctions.cpp: |
| (JSC::globalFuncEval): |
| * runtime/JSInternalPromise.cpp: |
| (JSC::JSInternalPromise::then): |
| * runtime/JSInternalPromiseConstructor.cpp: |
| (JSC::constructPromise): |
| * runtime/JSJob.cpp: |
| (JSC::JSJobMicrotask::run): |
| * runtime/JSLexicalEnvironment.cpp: |
| (JSC::JSLexicalEnvironment::getOwnPropertySlot): |
| (JSC::JSLexicalEnvironment::put): |
| * runtime/JSMap.cpp: |
| (JSC::JSMap::isIteratorProtocolFastAndNonObservable): |
| * runtime/JSMapIterator.cpp: |
| (JSC::JSMapIterator::createPair): |
| * runtime/JSModuleLoader.cpp: |
| (JSC::JSModuleLoader::provideFetch): |
| (JSC::JSModuleLoader::loadAndEvaluateModule): |
| (JSC::JSModuleLoader::loadModule): |
| (JSC::JSModuleLoader::linkAndEvaluateModule): |
| (JSC::JSModuleLoader::requestImportModule): |
| * runtime/JSONObject.cpp: |
| (JSC::JSONProtoFuncParse): |
| * runtime/JSObject.cpp: |
| (JSC::JSObject::putInlineSlow): |
| (JSC::JSObject::putByIndex): |
| (JSC::JSObject::notifyPresenceOfIndexedAccessors): |
| (JSC::JSObject::createInitialIndexedStorage): |
| (JSC::JSObject::createArrayStorage): |
| (JSC::JSObject::convertUndecidedToArrayStorage): |
| (JSC::JSObject::convertInt32ToArrayStorage): |
| (JSC::JSObject::convertDoubleToArrayStorage): |
| (JSC::JSObject::convertContiguousToArrayStorage): |
| (JSC::JSObject::convertFromCopyOnWrite): |
| (JSC::JSObject::ensureWritableInt32Slow): |
| (JSC::JSObject::ensureWritableDoubleSlow): |
| (JSC::JSObject::ensureWritableContiguousSlow): |
| (JSC::JSObject::ensureArrayStorageSlow): |
| (JSC::JSObject::setPrototypeDirect): |
| (JSC::JSObject::deleteProperty): |
| (JSC::callToPrimitiveFunction): |
| (JSC::JSObject::hasInstance): |
| (JSC::JSObject::getOwnNonIndexPropertyNames): |
| (JSC::JSObject::preventExtensions): |
| (JSC::JSObject::isExtensible): |
| (JSC::JSObject::reifyAllStaticProperties): |
| (JSC::JSObject::fillGetterPropertySlot): |
| (JSC::JSObject::defineOwnIndexedProperty): |
| (JSC::JSObject::putByIndexBeyondVectorLengthWithoutAttributes): |
| (JSC::JSObject::putByIndexBeyondVectorLengthWithArrayStorage): |
| (JSC::JSObject::putByIndexBeyondVectorLength): |
| (JSC::JSObject::putDirectIndexBeyondVectorLengthWithArrayStorage): |
| (JSC::JSObject::putDirectIndexSlowOrBeyondVectorLength): |
| (JSC::JSObject::getNewVectorLength): |
| (JSC::JSObject::increaseVectorLength): |
| (JSC::JSObject::reallocateAndShrinkButterfly): |
| (JSC::JSObject::shiftButterflyAfterFlattening): |
| (JSC::JSObject::anyObjectInChainMayInterceptIndexedAccesses const): |
| (JSC::JSObject::prototypeChainMayInterceptStoreTo): |
| (JSC::JSObject::needsSlowPutIndexing const): |
| (JSC::JSObject::suggestedArrayStorageTransition const): |
| * runtime/JSObject.h: |
| (JSC::JSObject::mayInterceptIndexedAccesses): |
| (JSC::JSObject::hasIndexingHeader const): |
| (JSC::JSObject::hasCustomProperties): |
| (JSC::JSObject::hasGetterSetterProperties): |
| (JSC::JSObject::hasCustomGetterSetterProperties): |
| (JSC::JSObject::isExtensibleImpl): |
| (JSC::JSObject::isStructureExtensible): |
| (JSC::JSObject::indexingShouldBeSparse): |
| (JSC::JSObject::staticPropertiesReified): |
| (JSC::JSObject::globalObject const): |
| (JSC::JSObject::finishCreation): |
| (JSC::JSNonFinalObject::finishCreation): |
| (JSC::getCallData): |
| (JSC::getConstructData): |
| (JSC::JSObject::getOwnNonIndexPropertySlot): |
| (JSC::JSObject::putOwnDataProperty): |
| (JSC::JSObject::putOwnDataPropertyMayBeIndex): |
| (JSC::JSObject::butterflyPreCapacity): |
| (JSC::JSObject::butterflyTotalSize): |
| * runtime/JSObjectInlines.h: |
| (JSC::JSObject::putDirectInternal): |
| * runtime/JSPromise.cpp: |
| (JSC::JSPromise::initialize): |
| (JSC::JSPromise::resolve): |
| * runtime/JSPromiseConstructor.cpp: |
| (JSC::constructPromise): |
| * runtime/JSPromiseDeferred.cpp: |
| (JSC::newPromiseCapability): |
| (JSC::callFunction): |
| * runtime/JSScope.cpp: |
| (JSC::abstractAccess): |
| * runtime/JSScope.h: |
| (JSC::JSScope::globalObject): Deleted. |
| Remove this JSScope::globalObject function since it is completely the same to JSObject::globalObject(). |
| |
| * runtime/JSSet.cpp: |
| (JSC::JSSet::isIteratorProtocolFastAndNonObservable): |
| * runtime/JSSetIterator.cpp: |
| (JSC::JSSetIterator::createPair): |
| * runtime/JSStringIterator.cpp: |
| (JSC::JSStringIterator::clone): |
| * runtime/Lookup.cpp: |
| (JSC::reifyStaticAccessor): |
| (JSC::setUpStaticFunctionSlot): |
| * runtime/Lookup.h: |
| (JSC::getStaticPropertySlotFromTable): |
| (JSC::replaceStaticPropertySlot): |
| (JSC::reifyStaticProperty): |
| * runtime/MapConstructor.cpp: |
| (JSC::constructMap): |
| * runtime/NumberConstructor.cpp: |
| (JSC::NumberConstructor::finishCreation): |
| * runtime/ObjectConstructor.cpp: |
| (JSC::constructObject): |
| (JSC::objectConstructorAssign): |
| (JSC::toPropertyDescriptor): |
| * runtime/ObjectPrototype.cpp: |
| (JSC::objectProtoFuncDefineGetter): |
| (JSC::objectProtoFuncDefineSetter): |
| (JSC::objectProtoFuncToLocaleString): |
| * runtime/Operations.cpp: |
| (JSC::jsIsFunctionType): Deleted. |
| Replace it with JSValue::isFunction(VM&). |
| |
| * runtime/Operations.h: |
| * runtime/ProgramExecutable.cpp: |
| (JSC::ProgramExecutable::initializeGlobalProperties): |
| * runtime/RegExpConstructor.cpp: |
| (JSC::constructWithRegExpConstructor): |
| (JSC::callRegExpConstructor): |
| * runtime/SamplingProfiler.cpp: |
| (JSC::SamplingProfiler::processUnverifiedStackTraces): |
| (JSC::SamplingProfiler::StackFrame::nameFromCallee): |
| * runtime/ScopedArguments.cpp: |
| (JSC::ScopedArguments::overrideThings): |
| * runtime/ScriptExecutable.cpp: |
| (JSC::ScriptExecutable::newCodeBlockFor): |
| (JSC::ScriptExecutable::prepareForExecutionImpl): |
| * runtime/SetConstructor.cpp: |
| (JSC::constructSet): |
| * runtime/SparseArrayValueMap.cpp: |
| (JSC::SparseArrayValueMap::putEntry): |
| (JSC::SparseArrayValueMap::putDirect): |
| * runtime/StringConstructor.cpp: |
| (JSC::constructWithStringConstructor): |
| * runtime/StringPrototype.cpp: |
| (JSC::replaceUsingRegExpSearch): |
| (JSC::replaceUsingStringSearch): |
| (JSC::stringProtoFuncIterator): |
| * runtime/Structure.cpp: |
| (JSC::Structure::materializePropertyTable): |
| (JSC::Structure::willStoreValueSlow): |
| * runtime/StructureCache.cpp: |
| (JSC::StructureCache::emptyStructureForPrototypeFromBaseStructure): |
| * runtime/StructureInlines.h: |
| (JSC::Structure::get): |
| * runtime/WeakMapConstructor.cpp: |
| (JSC::constructWeakMap): |
| * runtime/WeakSetConstructor.cpp: |
| (JSC::constructWeakSet): |
| * tools/HeapVerifier.cpp: |
| (JSC::HeapVerifier::reportCell): |
| * tools/JSDollarVM.cpp: |
| (JSC::functionGlobalObjectForObject): |
| (JSC::JSDollarVM::finishCreation): |
| * wasm/js/JSWebAssemblyInstance.cpp: |
| (JSC::JSWebAssemblyInstance::finalizeCreation): |
| * wasm/js/WasmToJS.cpp: |
| (JSC::Wasm::handleBadI64Use): |
| (JSC::Wasm::wasmToJSException): |
| * wasm/js/WebAssemblyCompileErrorConstructor.cpp: |
| (JSC::constructJSWebAssemblyCompileError): |
| (JSC::callJSWebAssemblyCompileError): |
| * wasm/js/WebAssemblyLinkErrorConstructor.cpp: |
| (JSC::constructJSWebAssemblyLinkError): |
| (JSC::callJSWebAssemblyLinkError): |
| * wasm/js/WebAssemblyModuleRecord.cpp: |
| (JSC::WebAssemblyModuleRecord::evaluate): |
| * wasm/js/WebAssemblyPrototype.cpp: |
| (JSC::instantiate): |
| * wasm/js/WebAssemblyRuntimeErrorConstructor.cpp: |
| (JSC::constructJSWebAssemblyRuntimeError): |
| (JSC::callJSWebAssemblyRuntimeError): |
| * wasm/js/WebAssemblyToJSCallee.cpp: |
| (JSC::WebAssemblyToJSCallee::create): |
| |
| 2018-05-30 Saam Barati <sbarati@apple.com> |
| |
| DFG combined liveness needs to say that the machine CodeBlock's arguments are live |
| https://bugs.webkit.org/show_bug.cgi?id=186121 |
| <rdar://problem/39377796> |
| |
| Reviewed by Keith Miller. |
| |
| DFG's combined liveness was reporting that the machine CodeBlock's |this| |
| argument was dead at certain points in the program. However, a CodeBlock's |
| arguments are considered live for the entire function. This fixes a bug |
| where object allocation sinking phase skipped materializing an allocation |
| because it thought that the argument it was associated with, |this|, was dead. |
| |
| * dfg/DFGCombinedLiveness.cpp: |
| (JSC::DFG::liveNodesAtHead): |
| |
| 2018-05-30 Daniel Bates <dabates@apple.com> |
| |
| Web Inspector: Annotate Same-Site cookies |
| https://bugs.webkit.org/show_bug.cgi?id=184897 |
| <rdar://problem/35178209> |
| |
| Reviewed by Brian Burg. |
| |
| Update protocol to include cookie Same-Site policy. |
| |
| * inspector/protocol/Page.json: |
| |
| 2018-05-29 Keith Miller <keith_miller@apple.com> |
| |
| Error instances should not strongly hold onto StackFrames |
| https://bugs.webkit.org/show_bug.cgi?id=185996 |
| |
| Reviewed by Mark Lam. |
| |
| Previously, we would hold onto all the StackFrames until the the user |
| looked at one of the properties on the Error object. This patch makes us |
| only weakly retain the StackFrames and collect all the information |
| if we are about to collect any frame. |
| |
| This patch also adds a method to $vm that returns the heaps count |
| of live global objects. |
| |
| * heap/Heap.cpp: |
| (JSC::Heap::finalizeUnconditionalFinalizers): |
| * interpreter/Interpreter.cpp: |
| (JSC::Interpreter::stackTraceAsString): |
| * interpreter/Interpreter.h: |
| * runtime/Error.cpp: |
| (JSC::addErrorInfo): |
| * runtime/ErrorInstance.cpp: |
| (JSC::ErrorInstance::finalizeUnconditionally): |
| (JSC::ErrorInstance::computeErrorInfo): |
| (JSC::ErrorInstance::materializeErrorInfoIfNeeded): |
| (JSC::ErrorInstance::visitChildren): Deleted. |
| * runtime/ErrorInstance.h: |
| (JSC::ErrorInstance::subspaceFor): |
| * runtime/JSFunction.cpp: |
| (JSC::getCalculatedDisplayName): |
| * runtime/StackFrame.h: |
| (JSC::StackFrame::isMarked const): |
| * runtime/VM.cpp: |
| (JSC::VM::VM): |
| * runtime/VM.h: |
| * tools/JSDollarVM.cpp: |
| (JSC::functionGlobalObjectCount): |
| (JSC::JSDollarVM::finishCreation): |
| |
| 2018-05-30 Keith Miller <keith_miller@apple.com> |
| |
| LLInt get_by_id prototype caching doesn't properly handle changes |
| https://bugs.webkit.org/show_bug.cgi?id=186112 |
| |
| Reviewed by Filip Pizlo. |
| |
| The caching would sometimes fail to track that a prototype had changed |
| and wouldn't update its set of watchpoints. |
| |
| * bytecode/CodeBlock.cpp: |
| (JSC::CodeBlock::finalizeLLIntInlineCaches): |
| * bytecode/CodeBlock.h: |
| * bytecode/LLIntPrototypeLoadAdaptiveStructureWatchpoint.h: |
| (JSC::LLIntPrototypeLoadAdaptiveStructureWatchpoint::key const): |
| * bytecode/ObjectPropertyConditionSet.h: |
| (JSC::ObjectPropertyConditionSet::size const): |
| * bytecode/Watchpoint.h: |
| (JSC::Watchpoint::Watchpoint): Deleted. |
| * llint/LLIntSlowPaths.cpp: |
| (JSC::LLInt::setupGetByIdPrototypeCache): |
| |
| 2018-05-30 Caio Lima <ticaiolima@gmail.com> |
| |
| [ESNext][BigInt] Implement support for "%" operation |
| https://bugs.webkit.org/show_bug.cgi?id=184327 |
| |
| Reviewed by Yusuke Suzuki. |
| |
| We are introducing the support of BigInt into remainder (a.k.a mod) |
| operation. |
| |
| * runtime/CommonSlowPaths.cpp: |
| (JSC::SLOW_PATH_DECL): |
| * runtime/JSBigInt.cpp: |
| (JSC::JSBigInt::remainder): |
| (JSC::JSBigInt::rightTrim): |
| * runtime/JSBigInt.h: |
| |
| 2018-05-30 Saam Barati <sbarati@apple.com> |
| |
| AI for Atomics.load() is too conservative in always clobbering world |
| https://bugs.webkit.org/show_bug.cgi?id=185738 |
| <rdar://problem/40342214> |
| |
| Reviewed by Yusuke Suzuki. |
| |
| It fails the assertion that Fil added for catching disagreements between |
| AI and clobberize. This patch fixes that. You'd run into this if you |
| manually enabled SAB in a build and ran any SAB tests. |
| |
| * dfg/DFGAbstractInterpreterInlines.h: |
| (JSC::DFG::AbstractInterpreter<AbstractStateType>::executeEffects): |
| |
| 2018-05-30 Michael Saboff <msaboff@apple.com> |
| |
| REGRESSION(r232212): Broke Win32 Builds |
| https://bugs.webkit.org/show_bug.cgi?id=186061 |
| |
| Reviewed by Yusuke Suzuki. |
| |
| Changed Windows builds with the JIT disabled to generate and use LLIntAssembly.h |
| instead of LowLevelInterpreterWin.asm. |
| |
| * CMakeLists.txt: |
| |
| 2018-05-30 Dominik Infuehr <dinfuehr@igalia.com> |
| |
| [MIPS] Fix build on MIPS32r1 |
| https://bugs.webkit.org/show_bug.cgi?id=185944 |
| |
| Reviewed by Yusuke Suzuki. |
| |
| Only use instructions on MIPS32r2 or later. mthc1 and mfhc1 are not supported |
| on MIPS32r1. |
| |
| * offlineasm/mips.rb: |
| |
| 2018-05-29 Saam Barati <sbarati@apple.com> |
| |
| Add a version of JSVirtualMachine shrinkFootprint that runs when the VM goes idle |
| https://bugs.webkit.org/show_bug.cgi?id=186064 |
| |
| Reviewed by Mark Lam. |
| |
| shrinkFootprint was implemented as: |
| ``` |
| sanitizeStackForVM(this); |
| deleteAllCode(DeleteAllCodeIfNotCollecting); |
| heap.collectNow(Synchronousness::Sync); |
| WTF::releaseFastMallocFreeMemory(); |
| ``` |
| |
| However, for correctness reasons, deleteAllCode is implemented to do |
| work when the VM is idle: no JS is running on the stack. This means |
| that if shrinkFootprint is called when JS is running on the stack, it |
| ends up freeing less memory than it could have if it waited to run until |
| the VM goes idle. |
| |
| This patch makes it so we wait until idle before doing work. I'm seeing a |
| 10% footprint progression when testing this against a client of the JSC SPI. |
| |
| Because this is a semantic change in how the SPI works, this patch |
| adds new SPI named shrinkFootprintWhenIdle. The plan is to move |
| all clients of the shrinkFootprint SPI to shrinkFootprintWhenIdle. |
| Once that happens, we will delete shrinkFootprint. Until then, |
| we make shrinkFootprint do exactly what shrinkFootprintWhenIdle does. |
| |
| * API/JSVirtualMachine.mm: |
| (-[JSVirtualMachine shrinkFootprint]): |
| (-[JSVirtualMachine shrinkFootprintWhenIdle]): |
| * API/JSVirtualMachinePrivate.h: |
| * runtime/VM.cpp: |
| (JSC::VM::shrinkFootprintWhenIdle): |
| (JSC::VM::shrinkFootprint): Deleted. |
| * runtime/VM.h: |
| |
| 2018-05-29 Saam Barati <sbarati@apple.com> |
| |
| shrinkFootprint needs to request a full collection |
| https://bugs.webkit.org/show_bug.cgi?id=186069 |
| |
| Reviewed by Mark Lam. |
| |
| * runtime/VM.cpp: |
| (JSC::VM::shrinkFootprint): |
| |
| 2018-05-29 Caio Lima <ticaiolima@gmail.com> |
| |
| [ESNext][BigInt] Implement support for "<" and ">" relational operation |
| https://bugs.webkit.org/show_bug.cgi?id=185379 |
| |
| Reviewed by Yusuke Suzuki. |
| |
| This patch is changing the ``jsLess``` operation to follow the |
| semantics of Abstract Relational Comparison[1] that supports BigInt. |
| For that, we create 2 new helper functions ```bigIntCompareLess``` and |
| ```toPrimitiveNumeric``` that considers BigInt as a valid type to be |
| compared. |
| |
| [1] - https://tc39.github.io/proposal-bigint/#sec-abstract-relational-comparison |
| |
| * runtime/JSBigInt.cpp: |
| (JSC::JSBigInt::unequalSign): |
| (JSC::JSBigInt::absoluteGreater): |
| (JSC::JSBigInt::absoluteLess): |
| (JSC::JSBigInt::compare): |
| (JSC::JSBigInt::absoluteCompare): |
| * runtime/JSBigInt.h: |
| * runtime/JSCJSValueInlines.h: |
| (JSC::JSValue::isPrimitive const): |
| * runtime/Operations.h: |
| (JSC::bigIntCompareLess): |
| (JSC::toPrimitiveNumeric): |
| (JSC::jsLess): |
| |
| 2018-05-29 Yusuke Suzuki <utatane.tea@gmail.com> |
| |
| [Baseline] Merge loading functionalities |
| https://bugs.webkit.org/show_bug.cgi?id=185907 |
| |
| Reviewed by Saam Barati. |
| |
| This patch unifies emitXXXLoad functions in 32bit and 64bit. |
| |
| * jit/JITInlines.h: |
| (JSC::JIT::emitDoubleGetByVal): |
| * jit/JITPropertyAccess.cpp: |
| (JSC::JIT::emitDoubleLoad): |
| (JSC::JIT::emitContiguousLoad): |
| (JSC::JIT::emitArrayStorageLoad): |
| (JSC::JIT::emitIntTypedArrayGetByVal): |
| (JSC::JIT::emitFloatTypedArrayGetByVal): |
| Define register usage first, and share the same code in 32bit and 64bit. |
| |
| * jit/JITPropertyAccess32_64.cpp: |
| (JSC::JIT::emitSlow_op_put_by_val): |
| Now C-stack is always enabled in JIT platform and temporary registers increases from 5 to 6 in x86. |
| We can remove this special handling. |
| |
| (JSC::JIT::emitContiguousLoad): Deleted. |
| (JSC::JIT::emitDoubleLoad): Deleted. |
| (JSC::JIT::emitArrayStorageLoad): Deleted. |
| |
| 2018-05-29 Saam Barati <sbarati@apple.com> |
| |
| JSC should put bmalloc's scavenger into mini mode |
| https://bugs.webkit.org/show_bug.cgi?id=185988 |
| |
| Reviewed by Michael Saboff. |
| |
| When we InitializeThreading, we'll now enable bmalloc's mini mode |
| if the VM is in mini mode. This is an 8-10% progression on the footprint |
| at end score in run-testmem, making it a 4-5% memory score progression. |
| It's between a 0-1% regression in its time score. |
| |
| * runtime/InitializeThreading.cpp: |
| (JSC::initializeThreading): |
| |
| 2018-05-29 Caitlin Potter <caitp@igalia.com> |
| |
| [JSC] Fix Array.prototype.concat fast case when single argument is Proxy |
| https://bugs.webkit.org/show_bug.cgi?id=184267 |
| |
| Reviewed by Saam Barati. |
| |
| Before this patch, the fast case for Array.prototype.concat was taken if |
| there was a single argument passed to the function, which is either a |
| non-JSCell, or an ObjectType JSCell not marked as concat-spreadable. |
| This incorrectly prevented Proxy objects from being spread when |
| they were the only argument passed to A.prototype.concat(), violating ECMA-262. |
| |
| * builtins/ArrayPrototype.js: |
| (concat): |
| |
| 2018-05-27 Yusuke Suzuki <utatane.tea@gmail.com> |
| |
| [JSC] JSBigInt::digitDiv has undefined behavior which causes test failures |
| https://bugs.webkit.org/show_bug.cgi?id=186022 |
| |
| Reviewed by Darin Adler. |
| |
| digitDiv performs Value64Bit >> 64 / Value32Bit >> 32, which is undefined behavior. And zero mask |
| creation has an issue (`s` should be casted to signed one before negating). They cause test failures |
| in non x86 / x86_64 environments. x86 and x86_64 work well since they have a fast path written |
| in asm. |
| |
| This patch fixes digitDiv by carefully avoiding undefined behaviors. We mask the left value of the |
| rshift with `digitBits - 1`, which makes `digitBits` 0 while it keeps 0 <= n < digitBits values. |
| This makes the target rshift well-defined in C++. While produced value by the rshift covers 0 <= `s` < 64 (32 |
| in 32bit envirnoment) cases, this rshift does not shift if `s` is 0. sZeroMask clears the value |
| if `s` is 0, so that `s == 0` case is also covered. Note that `s == 64` never happens since `divisor` |
| is never 0 here. We add assertion for that. We also fixes `sZeroMask` calculation. |
| |
| This patch also fixes naming convention for constant values. |
| |
| * runtime/JSBigInt.cpp: |
| (JSC::JSBigInt::digitMul): |
| (JSC::JSBigInt::digitDiv): |
| * runtime/JSBigInt.h: |
| |
| 2018-05-27 Yusuke Suzuki <utatane.tea@gmail.com> |
| |
| [WTF] Add clz32 / clz64 for MSVC |
| https://bugs.webkit.org/show_bug.cgi?id=186023 |
| |
| Reviewed by Daniel Bates. |
| |
| Move clz32 and clz64 to WTF. |
| |
| * runtime/MathCommon.h: |
| (JSC::clz32): Deleted. |
| (JSC::clz64): Deleted. |
| |
| 2018-05-27 Caio Lima <ticaiolima@gmail.com> |
| |
| [ESNext][BigInt] Implement "+" and "-" unary operation |
| https://bugs.webkit.org/show_bug.cgi?id=182214 |
| |
| Reviewed by Yusuke Suzuki. |
| |
| This Patch is implementing support to "-" unary operation on BigInt. |
| It is also changing the logic of ASTBuilder::makeNegateNode to |
| calculate BigInt literals with properly sign, avoiding |
| unecessary operation. It required a refactoring into |
| JSBigInt::parseInt to consider the sign as parameter. |
| |
| We are also introducing a new DFG Node called ValueNegate to handle BigInt negate |
| operations. With the introduction of BigInt, it is not true |
| that every negate operation returns a Number. As ArithNegate is a |
| node that considers its result is always a Number, like all other |
| Arith<Operation>, we decided to keep this consistency and use ValueNegate when |
| speculation indicates that the operand is a BigInt. |
| This design is following the same distinction between ArithAdd and |
| ValueAdd. Also, this new node will make simpler the introduction of |
| optimizations when we create speculation paths for BigInt in future |
| patches. |
| |
| In the case of "+" unary operation on BigInt, the current semantic we already have |
| is correctly, since it needs to throw TypeError because of ToNumber call[1]. |
| In such case, we are adding tests to verify other edge cases. |
| |
| [1] - https://tc39.github.io/proposal-bigint/#sec-unary-plus-operator |
| |
| * bytecompiler/BytecodeGenerator.cpp: |
| (JSC::BytecodeGenerator::addBigIntConstant): |
| * bytecompiler/BytecodeGenerator.h: |
| * bytecompiler/NodesCodegen.cpp: |
| (JSC::BigIntNode::jsValue const): |
| * dfg/DFGAbstractInterpreterInlines.h: |
| (JSC::DFG::AbstractInterpreter<AbstractStateType>::executeEffects): |
| * dfg/DFGByteCodeParser.cpp: |
| (JSC::DFG::ByteCodeParser::makeSafe): |
| (JSC::DFG::ByteCodeParser::parseBlock): |
| * 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::arithNodeFlags): |
| * dfg/DFGNodeType.h: |
| * dfg/DFGPredictionPropagationPhase.cpp: |
| * dfg/DFGSafeToExecute.h: |
| (JSC::DFG::safeToExecute): |
| * dfg/DFGSpeculativeJIT.cpp: |
| (JSC::DFG::SpeculativeJIT::compileValueNegate): |
| (JSC::DFG::SpeculativeJIT::compileArithNegate): |
| * 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::compileValueNegate): |
| (JSC::FTL::DFG::LowerDFGToB3::compileArithNegate): |
| * jit/JITOperations.cpp: |
| * parser/ASTBuilder.h: |
| (JSC::ASTBuilder::createBigIntWithSign): |
| (JSC::ASTBuilder::createBigIntFromUnaryOperation): |
| (JSC::ASTBuilder::makeNegateNode): |
| * parser/NodeConstructors.h: |
| (JSC::BigIntNode::BigIntNode): |
| * parser/Nodes.h: |
| * runtime/CommonSlowPaths.cpp: |
| (JSC::updateArithProfileForUnaryArithOp): |
| (JSC::SLOW_PATH_DECL): |
| * runtime/JSBigInt.cpp: |
| (JSC::JSBigInt::parseInt): |
| * runtime/JSBigInt.h: |
| * runtime/JSCJSValueInlines.h: |
| (JSC::JSValue::strictEqualSlowCaseInline): |
| |
| 2018-05-27 Dan Bernstein <mitz@apple.com> |
| |
| Tried to fix the 32-bit !ASSERT_DISABLED build after r232211. |
| |
| * jit/JITOperations.cpp: |
| |
| 2018-05-26 Yusuke Suzuki <utatane.tea@gmail.com> |
| |
| [JSC] Rename Array#flatten to flat |
| https://bugs.webkit.org/show_bug.cgi?id=186012 |
| |
| Reviewed by Saam Barati. |
| |
| Rename Array#flatten to Array#flat. This rename is done in TC39 since flatten |
| conflicts with the mootools' function name. |
| |
| * builtins/ArrayPrototype.js: |
| (globalPrivate.flatIntoArray): |
| (flat): |
| (globalPrivate.flatIntoArrayWithCallback): |
| (flatMap): |
| (globalPrivate.flattenIntoArray): Deleted. |
| (flatten): Deleted. |
| (globalPrivate.flattenIntoArrayWithCallback): Deleted. |
| * runtime/ArrayPrototype.cpp: |
| (JSC::ArrayPrototype::finishCreation): |
| |
| 2018-05-25 Mark Lam <mark.lam@apple.com> |
| |
| for-in loops should preserve and restore the TDZ stack for each of its internal loops. |
| https://bugs.webkit.org/show_bug.cgi?id=185995 |
| <rdar://problem/40173142> |
| |
| Reviewed by Saam Barati. |
| |
| This is because there's no guarantee that any of the loop bodies will be |
| executed. Hence, there's no guarantee that the TDZ variables will have been |
| initialized after each loop body. |
| |
| * bytecompiler/BytecodeGenerator.cpp: |
| (JSC::BytecodeGenerator::preserveTDZStack): |
| (JSC::BytecodeGenerator::restoreTDZStack): |
| * bytecompiler/BytecodeGenerator.h: |
| * bytecompiler/NodesCodegen.cpp: |
| (JSC::ForInNode::emitBytecode): |
| |
| 2018-05-25 Mark Lam <mark.lam@apple.com> |
| |
| MachineContext's instructionPointer() should handle null PCs correctly. |
| https://bugs.webkit.org/show_bug.cgi?id=186004 |
| <rdar://problem/40570067> |
| |
| Reviewed by Saam Barati. |
| |
| instructionPointer() returns a MacroAssemblerCodePtr<CFunctionPtrTag>. However, |
| MacroAssemblerCodePtr's constructor does not accept a null pointer value and will |
| assert accordingly with a debug ASSERT. This is inconsequential for release |
| builds, but to avoid this assertion failure, we should check for a null PC and |
| return MacroAssemblerCodePtr<CFunctionPtrTag>(nullptr) instead (which uses the |
| MacroAssemblerCodePtr(std::nullptr_t) version of the constructor instead). |
| |
| Alternatively, we can change all of MacroAssemblerCodePtr's constructors to check |
| for null pointers, but I rather not do that yet. In general, |
| MacroAssemblerCodePtrs are constructed with non-null pointers, and I prefer to |
| leave it that way for now. |
| |
| Note: this assertion failure only manifests when we have signal traps enabled, |
| and encounter a null pointer deref. |
| |
| * runtime/MachineContext.h: |
| (JSC::MachineContext::instructionPointer): |
| |
| 2018-05-25 Mark Lam <mark.lam@apple.com> |
| |
| Enforce invariant that GetterSetter objects are invariant. |
| https://bugs.webkit.org/show_bug.cgi?id=185968 |
| <rdar://problem/40541416> |
| |
| Reviewed by Saam Barati. |
| |
| The code already assumes the invariant that GetterSetter objects are immutable. |
| For example, the use of @tryGetById in builtins expect this invariant to be true. |
| The existing code mostly enforces this except for one case: JSObject's |
| validateAndApplyPropertyDescriptor, where it will re-use the same GetterSetter |
| object. |
| |
| This patch enforces this invariant by removing the setGetter and setSetter methods |
| of GetterSetter, and requiring the getter/setter callback functions to be |
| specified at construction time. |
| |
| * jit/JITOperations.cpp: |
| * llint/LLIntSlowPaths.cpp: |
| (JSC::LLInt::LLINT_SLOW_PATH_DECL): |
| * runtime/GetterSetter.cpp: |
| (JSC::GetterSetter::withGetter): Deleted. |
| (JSC::GetterSetter::withSetter): Deleted. |
| * runtime/GetterSetter.h: |
| * runtime/JSGlobalObject.cpp: |
| (JSC::JSGlobalObject::init): |
| * runtime/JSObject.cpp: |
| (JSC::JSObject::putIndexedDescriptor): |
| (JSC::JSObject::putDirectNativeIntrinsicGetter): |
| (JSC::putDescriptor): |
| (JSC::validateAndApplyPropertyDescriptor): |
| * runtime/JSTypedArrayViewPrototype.cpp: |
| (JSC::JSTypedArrayViewPrototype::finishCreation): |
| * runtime/Lookup.cpp: |
| (JSC::reifyStaticAccessor): |
| * runtime/PropertyDescriptor.cpp: |
| (JSC::PropertyDescriptor::slowGetterSetter): |
| |
| 2018-05-25 Saam Barati <sbarati@apple.com> |
| |
| Make JSC have a mini mode that kicks in when the JIT is disabled |
| https://bugs.webkit.org/show_bug.cgi?id=185931 |
| |
| Reviewed by Mark Lam. |
| |
| This patch makes JSC have a mini VM mode. This currently only kicks in |
| when the process can't JIT. Mini VM now means a few things: |
| - We always use a 1.27x heap growth factor. This number was the best tradeoff |
| between memory use progression and time regression in run-testmem. We may |
| want to tune this more in the future as we make other mini VM changes. |
| - We always sweep synchronously. |
| - We disable generational GC. |
| |
| I'm going to continue to extend what mini VM mode means in future changes. |
| |
| This patch is a 50% memory progression and an ~8-9% time regression |
| on run-testmem when running in mini VM mode with the JIT disabled. |
| |
| * heap/Heap.cpp: |
| (JSC::Heap::collectNow): |
| (JSC::Heap::finalize): |
| (JSC::Heap::useGenerationalGC): |
| (JSC::Heap::shouldSweepSynchronously): |
| (JSC::Heap::shouldDoFullCollection): |
| * heap/Heap.h: |
| * runtime/Options.h: |
| * runtime/VM.cpp: |
| (JSC::VM::isInMiniMode): |
| * runtime/VM.h: |
| |
| 2018-05-25 Saam Barati <sbarati@apple.com> |
| |
| Have a memory test where we can validate JSCs mini memory mode |
| https://bugs.webkit.org/show_bug.cgi?id=185932 |
| |
| Reviewed by Mark Lam. |
| |
| This patch adds the testmem CLI. It takes as input a file to run |
| and the number of iterations to run it (by default it runs it |
| 20 times). Each iteration runs in a new JSContext. Each JSContext |
| belongs to a VM that is created once. When finished, the CLI dumps |
| out the peak memory usage of the process, the memory usage at the end |
| of running all the iterations of the process, and the total time it |
| took to run all the iterations. |
| |
| * JavaScriptCore.xcodeproj/project.pbxproj: |
| * testmem: Added. |
| * testmem/testmem.mm: Added. |
| (description): |
| (Footprint::now): |
| (main): |
| |
| 2018-05-25 David Kilzer <ddkilzer@apple.com> |
| |
| Fix issues with -dealloc methods found by clang static analyzer |
| <https://webkit.org/b/185887> |
| |
| Reviewed by Joseph Pecoraro. |
| |
| * API/JSValue.mm: |
| (-[JSValue dealloc]): |
| (-[JSValue description]): |
| - Move method implementations from (Internal) category to the |
| main category since these are public API. This fixes the |
| false positive warning about a missing -dealloc method. |
| |
| 2018-05-24 Yusuke Suzuki <utatane.tea@gmail.com> |
| |
| [Baseline] Remove a hack for DCE removal of NewFunction |
| https://bugs.webkit.org/show_bug.cgi?id=185945 |
| |
| Reviewed by Saam Barati. |
| |
| This `undefined` check in baseline is originally introduced in r177871. The problem was, |
| when NewFunction is removed in DFG DCE, its referencing scope DFG node is also removed. |
| While op_new_func_xxx want to have scope for function creation, DFG OSR exit cannot |
| retrieve this into the stack since the scope is not referenced from anywhere. |
| |
| In r177871, we fixed this by accepting `undefined` scope in the baseline op_new_func_xxx |
| implementation. But rather than that, just emitting `Phantom` for this scope is clean |
| and consistent to the other DFG nodes like GetClosureVar. |
| |
| This patch emits Phantom instead, and removes unnecessary `undefined` check in baseline. |
| While we emit Phantom, it is not testable since NewFunction is guarded by MovHint which |
| is not removed in DFG. And in FTL, NewFunction will be converted to PhantomNewFunction |
| if it is not referenced. And scope node is kept by PutHint. But emitting Phantom is nice |
| since it conservatively guards the scope, and it does not introduce any additional overhead |
| compared to the current status. |
| |
| * dfg/DFGByteCodeParser.cpp: |
| (JSC::DFG::ByteCodeParser::parseBlock): |
| * jit/JITOpcodes.cpp: |
| (JSC::JIT::emitNewFuncExprCommon): |
| |
| 2018-05-23 Keith Miller <keith_miller@apple.com> |
| |
| Expose $vm if window.internals is exposed |
| https://bugs.webkit.org/show_bug.cgi?id=185900 |
| |
| Reviewed by Mark Lam. |
| |
| This is useful for testing vm internals when running LayoutTests. |
| |
| * runtime/JSGlobalObject.cpp: |
| (JSC::JSGlobalObject::init): |
| (JSC::JSGlobalObject::visitChildren): |
| (JSC::JSGlobalObject::exposeDollarVM): |
| * runtime/JSGlobalObject.h: |
| |
| 2018-05-23 Keith Miller <keith_miller@apple.com> |
| |
| Define length on CoW array should properly convert to writable |
| https://bugs.webkit.org/show_bug.cgi?id=185927 |
| |
| Reviewed by Yusuke Suzuki. |
| |
| * runtime/JSArray.cpp: |
| (JSC::JSArray::setLength): |
| |
| 2018-05-23 Keith Miller <keith_miller@apple.com> |
| |
| InPlaceAbstractState should filter variables at the tail from a GetLocal by their flush format |
| https://bugs.webkit.org/show_bug.cgi?id=185923 |
| |
| Reviewed by Saam Barati. |
| |
| Previously, we could confuse AI by overly broadening a type. This happens when a block in a |
| loop has a local mutated following a GetLocal but never SetLocaled to the stack. For example, |
| |
| Block 1: |
| @1: GetLocal(loc42, FlushedInt32); |
| @2: PutStructure(Check: Cell: @1); |
| @3: Jump(Block 1); |
| |
| Would cause us to claim that loc42 could be either an int32 or a some cell. However, |
| the type of an local cannot change without writing to it. |
| |
| This fixes a crash in destructuring-rest-element.js |
| |
| * dfg/DFGInPlaceAbstractState.cpp: |
| (JSC::DFG::InPlaceAbstractState::endBasicBlock): |
| |
| 2018-05-23 Filip Pizlo <fpizlo@apple.com> |
| |
| Speed up JetStream/base64 |
| https://bugs.webkit.org/show_bug.cgi?id=185914 |
| |
| Reviewed by Michael Saboff. |
| |
| Make allocation fast paths ALWAYS_INLINE. |
| |
| This is a 1% speed-up on SunSpider, mostly because of base64. It also speeds up pdfjs by |
| ~6%. |
| |
| * CMakeLists.txt: |
| * JavaScriptCore.xcodeproj/project.pbxproj: |
| * heap/AllocatorInlines.h: |
| (JSC::Allocator::allocate const): |
| * heap/CompleteSubspace.cpp: |
| (JSC::CompleteSubspace::allocateNonVirtual): Deleted. |
| * heap/CompleteSubspace.h: |
| * heap/CompleteSubspaceInlines.h: Added. |
| (JSC::CompleteSubspace::allocateNonVirtual): |
| * heap/FreeListInlines.h: |
| (JSC::FreeList::allocate): |
| * heap/IsoSubspace.cpp: |
| (JSC::IsoSubspace::allocateNonVirtual): Deleted. |
| * heap/IsoSubspace.h: |
| (JSC::IsoSubspace::allocatorForNonVirtual): |
| * heap/IsoSubspaceInlines.h: Added. |
| (JSC::IsoSubspace::allocateNonVirtual): |
| * runtime/JSCellInlines.h: |
| * runtime/VM.h: |
| |
| 2018-05-23 Rick Waldron <waldron.rick@gmail.com> |
| |
| Conversion misspelled "Convertion" in error message string |
| https://bugs.webkit.org/show_bug.cgi?id=185436 |
| |
| Reviewed by Saam Barati, Michael Saboff |
| |
| * runtime/JSBigInt.cpp: |
| (JSC::JSBigInt::toNumber const): |
| |
| 2018-05-22 Yusuke Suzuki <utatane.tea@gmail.com> |
| |
| [JSC] Clean up stringGetByValStubGenerator |
| https://bugs.webkit.org/show_bug.cgi?id=185864 |
| |
| Reviewed by Saam Barati. |
| |
| We clean up stringGetByValStubGenerator. |
| |
| 1. Unify 32bit and 64bit implementations. |
| 2. Rename stringGetByValStubGenerator to stringGetByValGenerator, move it to ThunkGenerators.cpp. |
| 3. Remove string type check since this code is invoked only when we know regT0 is JSString*. |
| 4. Do not tag Cell in stringGetByValGenerator side. 32bit code stores Cell with tag in JITPropertyAccess32_64 side. |
| 5. Fix invalid use of loadPtr for StringImpl::flags. Should use load32. |
| |
| * jit/JIT.h: |
| * jit/JITPropertyAccess.cpp: |
| (JSC::JIT::emitSlow_op_get_by_val): |
| (JSC::JIT::stringGetByValStubGenerator): Deleted. |
| * jit/JITPropertyAccess32_64.cpp: |
| (JSC::JIT::emit_op_get_by_val): |
| (JSC::JIT::emitSlow_op_get_by_val): |
| (JSC::JIT::stringGetByValStubGenerator): Deleted. |
| * jit/ThunkGenerators.cpp: |
| (JSC::stringGetByValGenerator): |
| * jit/ThunkGenerators.h: |
| |
| 2018-05-22 Yusuke Suzuki <utatane.tea@gmail.com> |
| |
| [JSC] Use branchIfString/branchIfNotString instead of structure checkings |
| https://bugs.webkit.org/show_bug.cgi?id=185810 |
| |
| Reviewed by Saam Barati. |
| |
| Let's use branchIfString/branchIfNotString helper functions instead of |
| checking structure with jsString's structure. It's easy to read. And |
| it emits less code since we do not need to embed string structure's |
| raw pointer in 32bit environment. |
| |
| * jit/JIT.h: |
| * jit/JITInlines.h: |
| (JSC::JIT::emitLoadCharacterString): |
| (JSC::JIT::checkStructure): Deleted. |
| * jit/JITOpcodes32_64.cpp: |
| (JSC::JIT::emitSlow_op_eq): |
| (JSC::JIT::compileOpEqJumpSlow): |
| (JSC::JIT::emitSlow_op_neq): |
| * jit/JITPropertyAccess.cpp: |
| (JSC::JIT::stringGetByValStubGenerator): |
| (JSC::JIT::emitSlow_op_get_by_val): |
| (JSC::JIT::emitByValIdentifierCheck): |
| * jit/JITPropertyAccess32_64.cpp: |
| (JSC::JIT::stringGetByValStubGenerator): |
| (JSC::JIT::emitSlow_op_get_by_val): |
| * jit/JSInterfaceJIT.h: |
| (JSC::ThunkHelpers::jsStringLengthOffset): Deleted. |
| (JSC::ThunkHelpers::jsStringValueOffset): Deleted. |
| * jit/SpecializedThunkJIT.h: |
| (JSC::SpecializedThunkJIT::loadJSStringArgument): |
| * jit/ThunkGenerators.cpp: |
| (JSC::stringCharLoad): |
| (JSC::charCodeAtThunkGenerator): |
| (JSC::charAtThunkGenerator): |
| * runtime/JSString.h: |
| |
| 2018-05-22 Mark Lam <mark.lam@apple.com> |
| |
| BytecodeGeneratorification shouldn't add a ValueProfile if the JIT is disabled. |
| https://bugs.webkit.org/show_bug.cgi?id=185896 |
| <rdar://problem/40471403> |
| |
| Reviewed by Saam Barati. |
| |
| * bytecode/BytecodeGeneratorification.cpp: |
| (JSC::BytecodeGeneratorification::run): |
| |
| 2018-05-22 Yusuke Suzuki <utatane.tea@gmail.com> |
| |
| [JSC] Fix CachedCall's argument count if RegExp has named captures |
| https://bugs.webkit.org/show_bug.cgi?id=185587 |
| |
| Reviewed by Mark Lam. |
| |
| If the given RegExp has named captures, the argument count of CachedCall in String#replace |
| should be increased by one. This causes crash with assertion in test262. This patch corrects |
| the argument count. |
| |
| This patch also unifies source.is8Bit()/!source.is8Bit() code since they are now completely |
| the same. |
| |
| * runtime/StringPrototype.cpp: |
| (JSC::replaceUsingRegExpSearch): |
| |
| 2018-05-22 Mark Lam <mark.lam@apple.com> |
| |
| StringImpl utf8 conversion should not fail silently. |
| https://bugs.webkit.org/show_bug.cgi?id=185888 |
| <rdar://problem/40464506> |
| |
| Reviewed by Filip Pizlo. |
| |
| * dfg/DFGLazyJSValue.cpp: |
| (JSC::DFG::LazyJSValue::dumpInContext const): |
| * runtime/DateConstructor.cpp: |
| (JSC::constructDate): |
| (JSC::dateParse): |
| * runtime/JSDateMath.cpp: |
| (JSC::parseDate): |
| * runtime/JSDateMath.h: |
| |
| 2018-05-22 Keith Miller <keith_miller@apple.com> |
| |
| Remove the UnconditionalFinalizer class |
| https://bugs.webkit.org/show_bug.cgi?id=185881 |
| |
| Reviewed by Filip Pizlo. |
| |
| The only remaining user of this API is |
| JSWebAssemblyCodeBlock. This patch changes, JSWebAssemblyCodeBlock |
| to use the newer template based API and removes the old class. |
| |
| * JavaScriptCore.xcodeproj/project.pbxproj: |
| * bytecode/CodeBlock.h: |
| * heap/Heap.cpp: |
| (JSC::Heap::finalizeUnconditionalFinalizers): |
| * heap/Heap.h: |
| * heap/SlotVisitor.cpp: |
| (JSC::SlotVisitor::addUnconditionalFinalizer): Deleted. |
| * heap/SlotVisitor.h: |
| * heap/UnconditionalFinalizer.h: Removed. |
| * wasm/js/JSWebAssemblyCodeBlock.cpp: |
| (JSC::JSWebAssemblyCodeBlock::JSWebAssemblyCodeBlock): |
| (JSC::JSWebAssemblyCodeBlock::visitChildren): |
| (JSC::JSWebAssemblyCodeBlock::finalizeUnconditionally): |
| (JSC::JSWebAssemblyCodeBlock::UnconditionalFinalizer::finalizeUnconditionally): Deleted. |
| * wasm/js/JSWebAssemblyCodeBlock.h: |
| * wasm/js/JSWebAssemblyModule.h: |
| |
| * CMakeLists.txt: |
| * JavaScriptCore.xcodeproj/project.pbxproj: |
| * bytecode/CodeBlock.h: |
| * heap/Heap.cpp: |
| (JSC::Heap::finalizeUnconditionalFinalizers): |
| * heap/Heap.h: |
| * heap/SlotVisitor.cpp: |
| (JSC::SlotVisitor::addUnconditionalFinalizer): Deleted. |
| * heap/SlotVisitor.h: |
| * heap/UnconditionalFinalizer.h: Removed. |
| * wasm/js/JSWebAssemblyCodeBlock.cpp: |
| (JSC::JSWebAssemblyCodeBlock::JSWebAssemblyCodeBlock): |
| (JSC::JSWebAssemblyCodeBlock::visitChildren): |
| (JSC::JSWebAssemblyCodeBlock::finalizeUnconditionally): |
| (JSC::JSWebAssemblyCodeBlock::UnconditionalFinalizer::finalizeUnconditionally): Deleted. |
| * wasm/js/JSWebAssemblyCodeBlock.h: |
| * wasm/js/JSWebAssemblyModule.h: |
| |
| 2018-05-22 Keith Miller <keith_miller@apple.com> |
| |
| Unreviewed, fix internal build. |
| |
| * runtime/JSImmutableButterfly.cpp: |
| |
| 2018-05-22 Saam Barati <sbarati@apple.com> |
| |
| DFG::LICMPhase should attempt to hoist edge type checks if hoisting the whole node fails |
| https://bugs.webkit.org/show_bug.cgi?id=144525 |
| |
| Reviewed by Filip Pizlo. |
| |
| This patch teaches LICM to fall back to hoisting a node's type checks when |
| hoisting the entire node fails. |
| |
| This patch follow the same principles we use when deciding to hoist nodes in general: |
| - If the pre header is control equivalent to where the current check is, we |
| go ahead and hoist the check. |
| - Otherwise, if hoisting hasn't failed before, we go ahead and gamble and |
| hoist the check. If hoisting failed in the past, we will not hoist the check. |
| |
| * dfg/DFGLICMPhase.cpp: |
| (JSC::DFG::LICMPhase::attemptHoist): |
| * dfg/DFGUseKind.h: |
| (JSC::DFG::checkMayCrashIfInputIsEmpty): |
| |
| 2018-05-21 Filip Pizlo <fpizlo@apple.com> |
| |
| Get rid of TLCs |
| https://bugs.webkit.org/show_bug.cgi?id=185846 |
| |
| Rubber stamped by Geoffrey Garen. |
| |
| This removes support for thread-local caches from the GC in order to speed up allocation a |
| bit. |
| |
| We added TLCs as part of Spectre mitigations, which we have since removed. |
| |
| We will want some kind of TLCs eventually, since they allow us to: |
| |
| - have a global GC, which may be a perf optimization at some point. |
| - allocate objects from JIT threads, which we've been wanting to do for a while. |
| |
| This change keeps the most interesting aspect of TLCs, which is the |
| LocalAllocator/BlockDirectory separation. This means that it ought to be easy to implement |
| TLCs again in the future if we wanted this feature. |
| |
| This change removes the part of TLCs that causes a perf regression, namely that Allocator is |
| an offset that requires a bounds check and lookup that makes the rest of the allocation fast |
| path dependent on the load of the TLC. Now, Allocator is really just a LocalAllocator*, so |
| you can directly use it to allocate. This removes two loads and a check from the allocation |
| fast path. In hindsight, I probably could have made that whole thing more efficient, had I |
| allowed us to have a statically known set of LocalAllocators. This would have removed the |
| bounds check (one load and one branch) and it would have made it possible to CSE the load of |
| the TLC data structure, since that would no longer resize. But that's a harder change that |
| this patch, and we don't need it right now. |
| |
| While reviewing the allocation hot paths, I found that CreateThis had an unnecessary branch |
| to check if the allocator is null. I removed that check. AssemblyHelpers::emitAllocate() does |
| that check already. Previously, the TLC bounds check doubled as this check. |
| |
| This is a 1% speed-up on Octane and a 2.3% speed-up on TailBench. However, the Octane |
| speed-up on my machine includes an 8% regexp speed-up. I've found that sometimes regexp |
| speeds up or slows down by 8% depending on which path I build JSC from. Without that 8%, this |
| is still an Octane speed-up due to 2-4% speed-ups in earley, boyer, raytrace, and splay. |
| |
| * JavaScriptCore.xcodeproj/project.pbxproj: |
| * Sources.txt: |
| * bytecode/ObjectAllocationProfileInlines.h: |
| (JSC::ObjectAllocationProfile::initializeProfile): |
| * dfg/DFGSpeculativeJIT.cpp: |
| (JSC::DFG::SpeculativeJIT::compileCreateThis): |
| * ftl/FTLLowerDFGToB3.cpp: |
| (JSC::FTL::DFG::LowerDFGToB3::compileMakeRope): |
| (JSC::FTL::DFG::LowerDFGToB3::compileMaterializeNewObject): |
| (JSC::FTL::DFG::LowerDFGToB3::allocatePropertyStorageWithSizeImpl): |
| (JSC::FTL::DFG::LowerDFGToB3::allocateHeapCell): |
| (JSC::FTL::DFG::LowerDFGToB3::allocateObject): |
| (JSC::FTL::DFG::LowerDFGToB3::allocatorForSize): |
| * heap/Allocator.cpp: |
| (JSC::Allocator::cellSize const): |
| * heap/Allocator.h: |
| (JSC::Allocator::Allocator): |
| (JSC::Allocator::localAllocator const): |
| (JSC::Allocator::operator== const): |
| (JSC::Allocator::offset const): Deleted. |
| * heap/AllocatorInlines.h: |
| (JSC::Allocator::allocate const): |
| (JSC::Allocator::tryAllocate const): Deleted. |
| * heap/BlockDirectory.cpp: |
| (JSC::BlockDirectory::BlockDirectory): |
| (JSC::BlockDirectory::~BlockDirectory): |
| * heap/BlockDirectory.h: |
| (JSC::BlockDirectory::allocator const): Deleted. |
| * heap/CompleteSubspace.cpp: |
| (JSC::CompleteSubspace::allocateNonVirtual): |
| (JSC::CompleteSubspace::allocatorForSlow): |
| (JSC::CompleteSubspace::tryAllocateSlow): |
| * heap/CompleteSubspace.h: |
| * heap/Heap.cpp: |
| (JSC::Heap::Heap): |
| * heap/Heap.h: |
| (JSC::Heap::threadLocalCacheLayout): Deleted. |
| * heap/IsoSubspace.cpp: |
| (JSC::IsoSubspace::IsoSubspace): |
| (JSC::IsoSubspace::allocateNonVirtual): |
| * heap/IsoSubspace.h: |
| (JSC::IsoSubspace::allocatorForNonVirtual): |
| * heap/LocalAllocator.cpp: |
| (JSC::LocalAllocator::LocalAllocator): |
| (JSC::LocalAllocator::~LocalAllocator): |
| * heap/LocalAllocator.h: |
| (JSC::LocalAllocator::cellSize const): |
| (JSC::LocalAllocator::tlc const): Deleted. |
| * heap/ThreadLocalCache.cpp: Removed. |
| * heap/ThreadLocalCache.h: Removed. |
| * heap/ThreadLocalCacheInlines.h: Removed. |
| * heap/ThreadLocalCacheLayout.cpp: Removed. |
| * heap/ThreadLocalCacheLayout.h: Removed. |
| * jit/AssemblyHelpers.cpp: |
| (JSC::AssemblyHelpers::emitAllocateWithNonNullAllocator): |
| (JSC::AssemblyHelpers::emitAllocate): |
| (JSC::AssemblyHelpers::emitAllocateVariableSized): |
| * jit/JITOpcodes.cpp: |
| (JSC::JIT::emit_op_create_this): |
| * runtime/JSLock.cpp: |
| (JSC::JSLock::didAcquireLock): |
| * runtime/VM.cpp: |
| (JSC::VM::VM): |
| (JSC::VM::~VM): |
| * runtime/VM.h: |
| * runtime/VMEntryScope.cpp: |
| (JSC::VMEntryScope::~VMEntryScope): |
| * runtime/VMEntryScope.h: |
| |
| 2018-05-22 Keith Miller <keith_miller@apple.com> |
| |
| We should have a CoW storage for NewArrayBuffer arrays. |
| https://bugs.webkit.org/show_bug.cgi?id=185003 |
| |
| Reviewed by Filip Pizlo. |
| |
| This patch adds copy on write storage for new array buffers. In |
| order to do this there needed to be significant changes to the |
| layout of IndexingType. The new indexing type has the following |
| shape: |
| |
| struct IndexingTypeAndMisc { |
| struct IndexingModeIncludingHistory { |
| struct IndexingMode { |
| struct IndexingType { |
| uint8_t isArray:1; // bit 0 |
| uint8_t shape:3; // bit 1 - 3 |
| }; |
| uint8_t copyOnWrite:1; // bit 4 |
| }; |
| uint8_t mayHaveIndexedAccessors:1; // bit 5 |
| }; |
| uint8_t cellLockBits:2; // bit 6 - 7 |
| }; |
| |
| For simplicity ArrayStorage shapes cannot be CoW. So the only |
| valid CoW indexing shapes are ArrayWithInt32, ArrayWithDouble, and |
| ArrayWithContiguous. |
| |
| The backing store for a CoW array is a new class |
| JSImmutableButterfly, which looks exactly the same as a normal |
| butterfly except that it has a JSCell header. Like other |
| butterflies, JSImmutableButterfies are allocated out of the |
| Auxiliary Gigacage and are pointed to by JSCells in the same |
| way. However, when marking JSImmutableButterflies they are marked |
| as if they were a property. |
| |
| With CoW arrays, the new_array_buffer bytecode will reallocate the |
| shared JSImmutableButterfly if it sees from the allocation profile |
| that the last array it allocated has transitioned to a different |
| indexing type. From then on, all arrays created by that |
| new_array_buffer bytecode will have the promoted indexing |
| type. This is more or less the same as what we used to do. The |
| only difference is that we don't promote all the way to array |
| storage even if we have seen it before. |
| |
| Transitioning from a CoW indexing mode occurs whenever someone |
| tries to store to an element, grow the array, or add properties. |
| Storing or growing the array will call into code that does the |
| stupid thing of copying the butterfly then continue into the old |
| code. This doesn't end up costing us as future allocations will |
| use any upgraded indexing shape. We get adding properties for |
| free by just changing the indexing mode on transition (our C++ |
| code always updates the indexing mode). |
| |
| * JavaScriptCore.xcodeproj/project.pbxproj: |
| * Sources.txt: |
| * bytecode/ArrayAllocationProfile.cpp: |
| (JSC::ArrayAllocationProfile::updateProfile): |
| * bytecode/ArrayAllocationProfile.h: |
| (JSC::ArrayAllocationProfile::initializeIndexingMode): |
| * bytecode/ArrayProfile.cpp: |
| (JSC::dumpArrayModes): |
| (JSC::ArrayProfile::briefDescriptionWithoutUpdating): |
| * bytecode/ArrayProfile.h: |
| (JSC::asArrayModes): |
| (JSC::arrayModeFromStructure): |
| (JSC::arrayModesInclude): |
| (JSC::hasSeenCopyOnWriteArray): |
| * bytecode/BytecodeList.json: |
| * bytecode/CodeBlock.cpp: |
| (JSC::CodeBlock::finishCreation): |
| * bytecode/InlineAccess.cpp: |
| (JSC::InlineAccess::generateArrayLength): |
| * bytecode/UnlinkedCodeBlock.h: |
| (JSC::UnlinkedCodeBlock::addArrayAllocationProfile): |
| (JSC::UnlinkedCodeBlock::decompressArrayAllocationProfile): |
| * bytecompiler/BytecodeGenerator.cpp: |
| (JSC::BytecodeGenerator::newArrayAllocationProfile): |
| (JSC::BytecodeGenerator::emitNewArrayBuffer): |
| (JSC::BytecodeGenerator::emitNewArray): |
| (JSC::BytecodeGenerator::emitNewArrayWithSize): |
| (JSC::BytecodeGenerator::emitExpectedFunctionSnippet): |
| * bytecompiler/BytecodeGenerator.h: |
| * bytecompiler/NodesCodegen.cpp: |
| (JSC::ArrayNode::emitBytecode): |
| (JSC::ArrayPatternNode::bindValue const): |
| (JSC::ArrayPatternNode::emitDirectBinding): |
| * dfg/DFGAbstractInterpreterInlines.h: |
| (JSC::DFG::AbstractInterpreter<AbstractStateType>::executeEffects): |
| * dfg/DFGArgumentsEliminationPhase.cpp: |
| * dfg/DFGArgumentsUtilities.cpp: |
| (JSC::DFG::emitCodeToGetArgumentsArrayLength): |
| * dfg/DFGArrayMode.cpp: |
| (JSC::DFG::ArrayMode::fromObserved): |
| (JSC::DFG::ArrayMode::refine const): |
| (JSC::DFG::ArrayMode::alreadyChecked const): |
| * dfg/DFGArrayMode.h: |
| (JSC::DFG::ArrayMode::ArrayMode): |
| (JSC::DFG::ArrayMode::action const): |
| (JSC::DFG::ArrayMode::withSpeculation const): |
| (JSC::DFG::ArrayMode::withArrayClass const): |
| (JSC::DFG::ArrayMode::withType const): |
| (JSC::DFG::ArrayMode::withConversion const): |
| (JSC::DFG::ArrayMode::withTypeAndConversion const): |
| (JSC::DFG::ArrayMode::arrayModesThatPassFiltering const): |
| (JSC::DFG::ArrayMode::arrayModesWithIndexingShape const): |
| * dfg/DFGByteCodeParser.cpp: |
| (JSC::DFG::ByteCodeParser::handleIntrinsicCall): |
| (JSC::DFG::ByteCodeParser::handleIntrinsicGetter): |
| (JSC::DFG::ByteCodeParser::parseBlock): |
| * dfg/DFGClobberize.h: |
| (JSC::DFG::clobberize): |
| * dfg/DFGConstantFoldingPhase.cpp: |
| (JSC::DFG::ConstantFoldingPhase::foldConstants): |
| * dfg/DFGFixupPhase.cpp: |
| (JSC::DFG::FixupPhase::fixupNode): |
| (JSC::DFG::FixupPhase::attemptToForceStringArrayModeByToStringConversion): |
| (JSC::DFG::FixupPhase::attemptToMakeGetArrayLength): |
| * dfg/DFGGraph.cpp: |
| (JSC::DFG::Graph::dump): |
| * dfg/DFGNode.h: |
| (JSC::DFG::Node::indexingType): |
| (JSC::DFG::Node::indexingMode): |
| * dfg/DFGOSRExit.cpp: |
| (JSC::DFG::OSRExit::compileExit): |
| * dfg/DFGOperations.cpp: |
| * dfg/DFGOperations.h: |
| * dfg/DFGSpeculativeJIT.cpp: |
| (JSC::DFG::SpeculativeJIT::emitAllocateRawObject): |
| (JSC::DFG::SpeculativeJIT::jumpSlowForUnwantedArrayMode): |
| (JSC::DFG::SpeculativeJIT::arrayify): |
| (JSC::DFG::SpeculativeJIT::compileGetByValOnString): |
| (JSC::DFG::SpeculativeJIT::compileGetByValOnDirectArguments): |
| (JSC::DFG::SpeculativeJIT::compileGetByValOnScopedArguments): |
| (JSC::DFG::SpeculativeJIT::compileGetArrayLength): |
| (JSC::DFG::SpeculativeJIT::compileCreateRest): |
| (JSC::DFG::SpeculativeJIT::compileArraySlice): |
| (JSC::DFG::SpeculativeJIT::compileNewArrayBuffer): |
| * dfg/DFGSpeculativeJIT32_64.cpp: |
| (JSC::DFG::SpeculativeJIT::compile): |
| * dfg/DFGSpeculativeJIT64.cpp: |
| (JSC::DFG::SpeculativeJIT::compile): |
| * dfg/DFGValidate.cpp: |
| * ftl/FTLAbstractHeapRepository.h: |
| * ftl/FTLLowerDFGToB3.cpp: |
| (JSC::FTL::DFG::LowerDFGToB3::compilePutStructure): |
| (JSC::FTL::DFG::LowerDFGToB3::compileArraySlice): |
| (JSC::FTL::DFG::LowerDFGToB3::compileNewArrayWithSpread): |
| (JSC::FTL::DFG::LowerDFGToB3::compileNewArrayBuffer): |
| (JSC::FTL::DFG::LowerDFGToB3::compileCallOrConstructVarargsSpread): |
| (JSC::FTL::DFG::LowerDFGToB3::compileForwardVarargsWithSpread): |
| (JSC::FTL::DFG::LowerDFGToB3::storeStructure): |
| (JSC::FTL::DFG::LowerDFGToB3::isArrayTypeForArrayify): |
| * ftl/FTLOperations.cpp: |
| (JSC::FTL::operationMaterializeObjectInOSR): |
| * generate-bytecode-files: |
| * interpreter/Interpreter.cpp: |
| (JSC::sizeOfVarargs): |
| (JSC::loadVarargs): |
| * jit/AssemblyHelpers.cpp: |
| (JSC::AssemblyHelpers::emitStoreStructureWithTypeInfo): |
| * jit/AssemblyHelpers.h: |
| (JSC::AssemblyHelpers::emitStoreStructureWithTypeInfo): |
| * jit/JITOperations.cpp: |
| * jit/JITPropertyAccess.cpp: |
| (JSC::JIT::emit_op_put_by_val): |
| (JSC::JIT::emitSlow_op_put_by_val): |
| * jit/Repatch.cpp: |
| (JSC::tryCachePutByID): |
| * llint/LowLevelInterpreter.asm: |
| * llint/LowLevelInterpreter32_64.asm: |
| * llint/LowLevelInterpreter64.asm: |
| * runtime/Butterfly.h: |
| (JSC::ContiguousData::Data::Data): |
| (JSC::ContiguousData::Data::operator bool const): |
| (JSC::ContiguousData::Data::operator=): |
| (JSC::ContiguousData::Data::operator const T& const): |
| (JSC::ContiguousData::Data::set): |
| (JSC::ContiguousData::Data::setWithoutWriteBarrier): |
| (JSC::ContiguousData::Data::clear): |
| (JSC::ContiguousData::Data::get const): |
| (JSC::ContiguousData::atUnsafe): |
| (JSC::ContiguousData::at const): Deleted. |
| (JSC::ContiguousData::at): Deleted. |
| * runtime/ButterflyInlines.h: |
| (JSC::ContiguousData<T>::at const): |
| (JSC::ContiguousData<T>::at): |
| * runtime/ClonedArguments.cpp: |
| (JSC::ClonedArguments::createEmpty): |
| * runtime/CommonSlowPaths.cpp: |
| (JSC::SLOW_PATH_DECL): |
| * runtime/CommonSlowPaths.h: |
| (JSC::CommonSlowPaths::allocateNewArrayBuffer): |
| * runtime/IndexingType.cpp: |
| (JSC::leastUpperBoundOfIndexingTypeAndType): |
| (JSC::leastUpperBoundOfIndexingTypeAndValue): |
| (JSC::dumpIndexingType): |
| * runtime/IndexingType.h: |
| (JSC::hasIndexedProperties): |
| (JSC::hasUndecided): |
| (JSC::hasInt32): |
| (JSC::hasDouble): |
| (JSC::hasContiguous): |
| (JSC::hasArrayStorage): |
| (JSC::hasAnyArrayStorage): |
| (JSC::hasSlowPutArrayStorage): |
| (JSC::shouldUseSlowPut): |
| (JSC::isCopyOnWrite): |
| (JSC::arrayIndexFromIndexingType): |
| * runtime/JSArray.cpp: |
| (JSC::JSArray::tryCreateUninitializedRestricted): |
| (JSC::JSArray::put): |
| (JSC::JSArray::appendMemcpy): |
| (JSC::JSArray::setLength): |
| (JSC::JSArray::pop): |
| (JSC::JSArray::fastSlice): |
| (JSC::JSArray::shiftCountWithAnyIndexingType): |
| (JSC::JSArray::unshiftCountWithAnyIndexingType): |
| (JSC::JSArray::fillArgList): |
| (JSC::JSArray::copyToArguments): |
| * runtime/JSArrayInlines.h: |
| (JSC::JSArray::pushInline): |
| * runtime/JSCell.h: |
| * runtime/JSCellInlines.h: |
| (JSC::JSCell::JSCell): |
| (JSC::JSCell::finishCreation): |
| (JSC::JSCell::indexingType const): |
| (JSC::JSCell::indexingMode const): |
| (JSC::JSCell::setStructure): |
| * runtime/JSFixedArray.h: |
| * runtime/JSGlobalObject.cpp: |
| (JSC::JSGlobalObject::init): |
| (JSC::JSGlobalObject::haveABadTime): |
| (JSC::JSGlobalObject::visitChildren): |
| * runtime/JSGlobalObject.h: |
| (JSC::JSGlobalObject::originalArrayStructureForIndexingType const): |
| (JSC::JSGlobalObject::arrayStructureForIndexingTypeDuringAllocation const): |
| (JSC::JSGlobalObject::isOriginalArrayStructure): |
| * runtime/JSImmutableButterfly.cpp: Added. |
| (JSC::JSImmutableButterfly::visitChildren): |
| (JSC::JSImmutableButterfly::copyToArguments): |
| * runtime/JSImmutableButterfly.h: Added. |
| (JSC::JSImmutableButterfly::createStructure): |
| (JSC::JSImmutableButterfly::tryCreate): |
| (JSC::JSImmutableButterfly::create): |
| (JSC::JSImmutableButterfly::publicLength const): |
| (JSC::JSImmutableButterfly::vectorLength const): |
| (JSC::JSImmutableButterfly::length const): |
| (JSC::JSImmutableButterfly::toButterfly const): |
| (JSC::JSImmutableButterfly::fromButterfly): |
| (JSC::JSImmutableButterfly::get const): |
| (JSC::JSImmutableButterfly::subspaceFor): |
| (JSC::JSImmutableButterfly::setIndex): |
| (JSC::JSImmutableButterfly::allocationSize): |
| (JSC::JSImmutableButterfly::JSImmutableButterfly): |
| * runtime/JSObject.cpp: |
| (JSC::JSObject::markAuxiliaryAndVisitOutOfLineProperties): |
| (JSC::JSObject::visitButterflyImpl): |
| (JSC::JSObject::getOwnPropertySlotByIndex): |
| (JSC::JSObject::putByIndex): |
| (JSC::JSObject::createInitialInt32): |
| (JSC::JSObject::createInitialDouble): |
| (JSC::JSObject::createInitialContiguous): |
| (JSC::JSObject::convertUndecidedToInt32): |
| (JSC::JSObject::convertUndecidedToDouble): |
| (JSC::JSObject::convertUndecidedToContiguous): |
| (JSC::JSObject::convertInt32ToDouble): |
| (JSC::JSObject::convertInt32ToArrayStorage): |
| (JSC::JSObject::convertDoubleToContiguous): |
| (JSC::JSObject::convertDoubleToArrayStorage): |
| (JSC::JSObject::convertContiguousToArrayStorage): |
| (JSC::JSObject::createInitialForValueAndSet): |
| (JSC::JSObject::convertInt32ForValue): |
| (JSC::JSObject::convertFromCopyOnWrite): |
| (JSC::JSObject::ensureWritableInt32Slow): |
| (JSC::JSObject::ensureWritableDoubleSlow): |
| (JSC::JSObject::ensureWritableContiguousSlow): |
| (JSC::JSObject::ensureArrayStorageSlow): |
| (JSC::JSObject::ensureArrayStorageExistsAndEnterDictionaryIndexingMode): |
| (JSC::JSObject::switchToSlowPutArrayStorage): |
| (JSC::JSObject::deletePropertyByIndex): |
| (JSC::JSObject::getOwnPropertyNames): |
| (JSC::canDoFastPutDirectIndex): |
| (JSC::JSObject::defineOwnIndexedProperty): |
| (JSC::JSObject::putByIndexBeyondVectorLengthWithoutAttributes): |
| (JSC::JSObject::putByIndexBeyondVectorLengthWithArrayStorage): |
| (JSC::JSObject::putByIndexBeyondVectorLength): |
| (JSC::JSObject::countElements): |
| (JSC::JSObject::ensureLengthSlow): |
| (JSC::JSObject::getEnumerableLength): |
| (JSC::JSObject::ensureInt32Slow): Deleted. |
| (JSC::JSObject::ensureDoubleSlow): Deleted. |
| (JSC::JSObject::ensureContiguousSlow): Deleted. |
| * runtime/JSObject.h: |
| (JSC::JSObject::putDirectIndex): |
| (JSC::JSObject::canGetIndexQuickly): |
| (JSC::JSObject::getIndexQuickly): |
| (JSC::JSObject::tryGetIndexQuickly const): |
| (JSC::JSObject::canSetIndexQuickly): |
| (JSC::JSObject::setIndexQuickly): |
| (JSC::JSObject::initializeIndex): |
| (JSC::JSObject::initializeIndexWithoutBarrier): |
| (JSC::JSObject::ensureWritableInt32): |
| (JSC::JSObject::ensureWritableDouble): |
| (JSC::JSObject::ensureWritableContiguous): |
| (JSC::JSObject::ensureLength): |
| (JSC::JSObject::ensureInt32): Deleted. |
| (JSC::JSObject::ensureDouble): Deleted. |
| (JSC::JSObject::ensureContiguous): Deleted. |
| * runtime/JSObjectInlines.h: |
| (JSC::JSObject::putDirectInternal): |
| * runtime/JSType.h: |
| * runtime/RegExpMatchesArray.h: |
| (JSC::tryCreateUninitializedRegExpMatchesArray): |
| * runtime/Structure.cpp: |
| (JSC::Structure::Structure): |
| (JSC::Structure::addNewPropertyTransition): |
| (JSC::Structure::nonPropertyTransition): |
| * runtime/Structure.h: |
| * runtime/StructureIDBlob.h: |
| (JSC::StructureIDBlob::StructureIDBlob): |
| (JSC::StructureIDBlob::indexingModeIncludingHistory const): |
| (JSC::StructureIDBlob::setIndexingModeIncludingHistory): |
| (JSC::StructureIDBlob::indexingModeIncludingHistoryOffset): |
| (JSC::StructureIDBlob::indexingTypeIncludingHistory const): Deleted. |
| (JSC::StructureIDBlob::setIndexingTypeIncludingHistory): Deleted. |
| (JSC::StructureIDBlob::indexingTypeIncludingHistoryOffset): Deleted. |
| * runtime/StructureTransitionTable.h: |
| (JSC::newIndexingType): |
| * runtime/VM.cpp: |
| (JSC::VM::VM): |
| * runtime/VM.h: |
| |
| 2018-05-22 Ryan Haddad <ryanhaddad@apple.com> |
| |
| Unreviewed, rolling out r232052. |
| |
| Breaks internal builds. |
| |
| Reverted changeset: |
| |
| "Use more C++17" |
| https://bugs.webkit.org/show_bug.cgi?id=185176 |
| https://trac.webkit.org/changeset/232052 |
| |
| 2018-05-22 Alberto Garcia <berto@igalia.com> |
| |
| [CMake] Properly detect compiler flags, needed libs, and fallbacks for usage of 64-bit atomic operations |
| https://bugs.webkit.org/show_bug.cgi?id=182622 |
| <rdar://problem/40292317> |
| |
| Reviewed by Michael Catanzaro. |
| |
| We were linking JavaScriptCore against libatomic in MIPS because |
| in that architecture __atomic_fetch_add_8() is not a compiler |
| intrinsic and is provided by that library instead. However other |
| architectures (e.g armel) are in the same situation, so we need a |
| generic test. |
| |
| That test already exists in WebKit/CMakeLists.txt, so we just have |
| to move it to a common file (WebKitCompilerFlags.cmake) and use |
| its result (ATOMIC_INT64_REQUIRES_LIBATOMIC) here. |
| |
| * CMakeLists.txt: |
| |
| 2018-05-22 Michael Catanzaro <mcatanzaro@igalia.com> |
| |
| Unreviewed, rolling out r231843. |
| |
| Broke cross build |
| |
| Reverted changeset: |
| |
| "[CMake] Properly detect compiler flags, needed libs, and |
| fallbacks for usage of 64-bit atomic operations" |
| https://bugs.webkit.org/show_bug.cgi?id=182622 |
| https://trac.webkit.org/changeset/231843 |
| |
| 2018-05-21 Yusuke Suzuki <utatane.tea@gmail.com> |
| |
| Use more C++17 |
| https://bugs.webkit.org/show_bug.cgi?id=185176 |
| |
| Reviewed by JF Bastien. |
| |
| * Configurations/Base.xcconfig: |
| |
| 2018-05-21 Yusuke Suzuki <utatane.tea@gmail.com> |
| |
| [JSC] Remove duplicate methods in JSInterfaceJIT |
| https://bugs.webkit.org/show_bug.cgi?id=185813 |
| |
| Reviewed by Saam Barati. |
| |
| Some methods of JSInterfaceJIT are duplicate with AssemblyHelpers' ones. |
| This patch removes these ones and use AssemblyHelpers' ones instead. |
| |
| This patch also a bit cleans up ThunkGenerators' unnecessary ifdefs. |
| |
| * jit/AssemblyHelpers.h: |
| (JSC::AssemblyHelpers::tagFor): |
| (JSC::AssemblyHelpers::payloadFor): |
| * jit/JIT.h: |
| * jit/JITArithmetic.cpp: |
| (JSC::JIT::emit_op_unsigned): |
| (JSC::JIT::emit_compareUnsigned): |
| (JSC::JIT::emit_op_inc): |
| (JSC::JIT::emit_op_dec): |
| (JSC::JIT::emit_op_mod): |
| * jit/JITCall32_64.cpp: |
| (JSC::JIT::compileOpCall): |
| * jit/JITInlines.h: |
| (JSC::JIT::emitPutIntToCallFrameHeader): |
| (JSC::JIT::updateTopCallFrame): |
| (JSC::JIT::emitInitRegister): |
| (JSC::JIT::emitLoad): |
| (JSC::JIT::emitStore): |
| (JSC::JIT::emitStoreInt32): |
| (JSC::JIT::emitStoreCell): |
| (JSC::JIT::emitStoreBool): |
| (JSC::JIT::emitGetVirtualRegister): |
| (JSC::JIT::emitPutVirtualRegister): |
| (JSC::JIT::emitTagBool): Deleted. |
| * jit/JITOpcodes.cpp: |
| (JSC::JIT::emit_op_overrides_has_instance): |
| (JSC::JIT::emit_op_is_empty): |
| (JSC::JIT::emit_op_is_undefined): |
| (JSC::JIT::emit_op_is_boolean): |
| (JSC::JIT::emit_op_is_number): |
| (JSC::JIT::emit_op_is_cell_with_type): |
| (JSC::JIT::emit_op_is_object): |
| (JSC::JIT::emit_op_eq): |
| (JSC::JIT::emit_op_neq): |
| (JSC::JIT::compileOpStrictEq): |
| (JSC::JIT::emit_op_eq_null): |
| (JSC::JIT::emit_op_neq_null): |
| (JSC::JIT::emitSlow_op_eq): |
| (JSC::JIT::emitSlow_op_neq): |
| (JSC::JIT::emitSlow_op_instanceof_custom): |
| (JSC::JIT::emitNewFuncExprCommon): |
| * jit/JSInterfaceJIT.h: |
| (JSC::JSInterfaceJIT::emitLoadInt32): |
| (JSC::JSInterfaceJIT::emitLoadDouble): |
| (JSC::JSInterfaceJIT::emitPutToCallFrameHeader): |
| (JSC::JSInterfaceJIT::emitPutCellToCallFrameHeader): |
| (JSC::JSInterfaceJIT::tagFor): Deleted. |
| (JSC::JSInterfaceJIT::payloadFor): Deleted. |
| (JSC::JSInterfaceJIT::intPayloadFor): Deleted. |
| (JSC::JSInterfaceJIT::intTagFor): Deleted. |
| (JSC::JSInterfaceJIT::emitTagInt): Deleted. |
| (JSC::JSInterfaceJIT::addressFor): Deleted. |
| * jit/SpecializedThunkJIT.h: |
| (JSC::SpecializedThunkJIT::returnDouble): |
| * jit/ThunkGenerators.cpp: |
| (JSC::nativeForGenerator): |
| (JSC::arityFixupGenerator): |
| |
| 2018-05-21 Yusuke Suzuki <utatane.tea@gmail.com> |
| |
| Unreviewed, reland InById cache |
| https://bugs.webkit.org/show_bug.cgi?id=185682 |
| |
| Includes Dominik's 32bit fix. |
| |
| * bytecode/AccessCase.cpp: |
| (JSC::AccessCase::fromStructureStubInfo): |
| (JSC::AccessCase::generateWithGuard): |
| (JSC::AccessCase::generateImpl): |
| * bytecode/BytecodeDumper.cpp: |
| (JSC::BytecodeDumper<Block>::printInByIdCacheStatus): |
| (JSC::BytecodeDumper<Block>::dumpBytecode): |
| * bytecode/BytecodeDumper.h: |
| * bytecode/BytecodeList.json: |
| * bytecode/BytecodeUseDef.h: |
| (JSC::computeUsesForBytecodeOffset): |
| (JSC::computeDefsForBytecodeOffset): |
| * bytecode/CodeBlock.cpp: |
| (JSC::CodeBlock::finishCreation): |
| * bytecode/InlineAccess.cpp: |
| (JSC::InlineAccess::generateSelfInAccess): |
| * bytecode/InlineAccess.h: |
| * bytecode/StructureStubInfo.cpp: |
| (JSC::StructureStubInfo::initInByIdSelf): |
| (JSC::StructureStubInfo::deref): |
| (JSC::StructureStubInfo::aboutToDie): |
| (JSC::StructureStubInfo::reset): |
| (JSC::StructureStubInfo::visitWeakReferences): |
| (JSC::StructureStubInfo::propagateTransitions): |
| * bytecode/StructureStubInfo.h: |
| (JSC::StructureStubInfo::patchableJump): |
| * bytecompiler/BytecodeGenerator.cpp: |
| (JSC::BytecodeGenerator::emitInByVal): |
| (JSC::BytecodeGenerator::emitInById): |
| (JSC::BytecodeGenerator::emitIn): Deleted. |
| * bytecompiler/BytecodeGenerator.h: |
| * bytecompiler/NodesCodegen.cpp: |
| (JSC::InNode::emitBytecode): |
| * dfg/DFGAbstractInterpreterInlines.h: |
| (JSC::DFG::AbstractInterpreter<AbstractStateType>::executeEffects): |
| * dfg/DFGByteCodeParser.cpp: |
| (JSC::DFG::ByteCodeParser::parseBlock): |
| * dfg/DFGCapabilities.cpp: |
| (JSC::DFG::capabilityLevel): |
| * dfg/DFGClobberize.h: |
| (JSC::DFG::clobberize): |
| * dfg/DFGConstantFoldingPhase.cpp: |
| (JSC::DFG::ConstantFoldingPhase::foldConstants): |
| * dfg/DFGDoesGC.cpp: |
| (JSC::DFG::doesGC): |
| * dfg/DFGFixupPhase.cpp: |
| (JSC::DFG::FixupPhase::fixupNode): |
| * dfg/DFGJITCompiler.cpp: |
| (JSC::DFG::JITCompiler::link): |
| * dfg/DFGJITCompiler.h: |
| (JSC::DFG::JITCompiler::addInById): |
| (JSC::DFG::InRecord::InRecord): Deleted. |
| (JSC::DFG::JITCompiler::addIn): Deleted. |
| * dfg/DFGNode.h: |
| (JSC::DFG::Node::convertToInById): |
| (JSC::DFG::Node::hasIdentifier): |
| (JSC::DFG::Node::hasArrayMode): |
| * dfg/DFGNodeType.h: |
| * dfg/DFGPredictionPropagationPhase.cpp: |
| * dfg/DFGSafeToExecute.h: |
| (JSC::DFG::safeToExecute): |
| * dfg/DFGSpeculativeJIT.cpp: |
| (JSC::DFG::SpeculativeJIT::compileInById): |
| (JSC::DFG::SpeculativeJIT::compileInByVal): |
| (JSC::DFG::SpeculativeJIT::compileIn): 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::compileInByVal): |
| (JSC::FTL::DFG::LowerDFGToB3::compileInById): |
| (JSC::FTL::DFG::LowerDFGToB3::compileIn): Deleted. |
| * jit/AssemblyHelpers.h: |
| (JSC::AssemblyHelpers::boxBoolean): |
| * jit/ICStats.h: |
| * jit/JIT.cpp: |
| (JSC::JIT::JIT): |
| (JSC::JIT::privateCompileMainPass): |
| (JSC::JIT::privateCompileSlowCases): |
| (JSC::JIT::link): |
| * jit/JIT.h: |
| * jit/JITInlineCacheGenerator.cpp: |
| (JSC::JITInByIdGenerator::JITInByIdGenerator): |
| (JSC::JITInByIdGenerator::generateFastPath): |
| * jit/JITInlineCacheGenerator.h: |
| (JSC::JITInByIdGenerator::JITInByIdGenerator): |
| * jit/JITOperations.cpp: |
| * jit/JITOperations.h: |
| * jit/JITPropertyAccess.cpp: |
| (JSC::JIT::emit_op_in_by_id): |
| (JSC::JIT::emitSlow_op_in_by_id): |
| * jit/JITPropertyAccess32_64.cpp: |
| (JSC::JIT::emit_op_in_by_id): |
| (JSC::JIT::emitSlow_op_in_by_id): |
| * jit/Repatch.cpp: |
| (JSC::tryCacheInByID): |
| (JSC::repatchInByID): |
| (JSC::resetInByID): |
| (JSC::tryCacheIn): Deleted. |
| (JSC::repatchIn): Deleted. |
| (JSC::resetIn): Deleted. |
| * jit/Repatch.h: |
| * llint/LowLevelInterpreter.asm: |
| * llint/LowLevelInterpreter64.asm: |
| * parser/NodeConstructors.h: |
| (JSC::InNode::InNode): |
| * runtime/CommonSlowPaths.cpp: |
| (JSC::SLOW_PATH_DECL): |
| * runtime/CommonSlowPaths.h: |
| (JSC::CommonSlowPaths::opInByVal): |
| (JSC::CommonSlowPaths::opIn): Deleted. |
| |
| 2018-05-21 Commit Queue <commit-queue@webkit.org> |
| |
| Unreviewed, rolling out r231998 and r232017. |
| https://bugs.webkit.org/show_bug.cgi?id=185842 |
| |
| causes crashes on 32 JSC bot (Requested by realdawei on |
| #webkit). |
| |
| Reverted changesets: |
| |
| "[JSC] JSC should have consistent InById IC" |
| https://bugs.webkit.org/show_bug.cgi?id=185682 |
| https://trac.webkit.org/changeset/231998 |
| |
| "Unreviewed, fix 32bit and scope release" |
| https://bugs.webkit.org/show_bug.cgi?id=185682 |
| https://trac.webkit.org/changeset/232017 |
| |
| 2018-05-21 Jer Noble <jer.noble@apple.com> |
| |
| Complete fix for enabling modern EME by default |
| https://bugs.webkit.org/show_bug.cgi?id=185770 |
| <rdar://problem/40368220> |
| |
| Reviewed by Eric Carlson. |
| |
| * Configurations/FeatureDefines.xcconfig: |
| |
| 2018-05-21 Yusuke Suzuki <utatane.tea@gmail.com> |
| |
| Unreviewed, fix 32bit and scope release |
| https://bugs.webkit.org/show_bug.cgi?id=185682 |
| |
| * jit/JITOperations.cpp: |
| * jit/JITPropertyAccess32_64.cpp: |
| (JSC::JIT::emitSlow_op_in_by_id): |
| |
| 2018-05-20 Filip Pizlo <fpizlo@apple.com> |
| |
| Revert the B3 compiler pipeline's treatment of taildup |
| https://bugs.webkit.org/show_bug.cgi?id=185808 |
| |
| Reviewed by Yusuke Suzuki. |
| |
| While trying to implement path specialization (bug 185060), I reorganized the B3 pass pipeline. |
| But then path specialization turned out to be a negative result. This reverts the pipeline to the |
| way it was before that work. |
| |
| 1.5% progression on V8Spider-CompileTime. |
| |
| * b3/B3Generate.cpp: |
| (JSC::B3::generateToAir): |
| |
| 2018-05-20 Yusuke Suzuki <utatane.tea@gmail.com> |
| |
| [DFG] CheckTypeInfoFlags should say `eliminated` if it is removed in constant folding phase |
| https://bugs.webkit.org/show_bug.cgi?id=185802 |
| |
| Reviewed by Saam Barati. |
| |
| * dfg/DFGConstantFoldingPhase.cpp: |
| (JSC::DFG::ConstantFoldingPhase::foldConstants): |
| |
| 2018-05-18 Filip Pizlo <fpizlo@apple.com> |
| |
| DFG should inline InstanceOf ICs |
| https://bugs.webkit.org/show_bug.cgi?id=185695 |
| |
| Reviewed by Yusuke Suzuki. |
| |
| This teaches the DFG how to inline InstanceOf ICs into a MatchStructure node. This can then |
| be folded to a CheckStructure + JSConstant. |
| |
| In the process of testing this, I found a bug where LICM was not hoisting things that |
| depended on ExtraOSREntryLocal because that might return SpecEmpty. I fixed that by teaching |
| LICM how to materialize CheckNotEmpty on demand whenever !HoistingFailed. |
| |
| This is a ~5% speed-up on boyer. |
| |
| ~2x speed-up on the instanceof-always-hit-one, instanceof-always-hit-two, and |
| instanceof-sometimes-hit microbenchmarks. |
| |
| * JavaScriptCore.xcodeproj/project.pbxproj: |
| * Sources.txt: |
| * bytecode/GetByIdStatus.cpp: |
| (JSC::GetByIdStatus::appendVariant): |
| (JSC::GetByIdStatus::filter): |
| * bytecode/GetByIdStatus.h: |
| (JSC::GetByIdStatus::operator bool const): |
| (JSC::GetByIdStatus::operator! const): Deleted. |
| * bytecode/GetByIdVariant.h: |
| (JSC::GetByIdVariant::operator bool const): |
| (JSC::GetByIdVariant::operator! const): Deleted. |
| * bytecode/ICStatusUtils.h: Added. |
| (JSC::appendICStatusVariant): |
| (JSC::filterICStatusVariants): |
| * bytecode/InstanceOfStatus.cpp: Added. |
| (JSC::InstanceOfStatus::appendVariant): |
| (JSC::InstanceOfStatus::computeFor): |
| (JSC::InstanceOfStatus::computeForStubInfo): |
| (JSC::InstanceOfStatus::commonPrototype const): |
| (JSC::InstanceOfStatus::filter): |
| * bytecode/InstanceOfStatus.h: Added. |
| (JSC::InstanceOfStatus::InstanceOfStatus): |
| (JSC::InstanceOfStatus::state const): |
| (JSC::InstanceOfStatus::isSet const): |
| (JSC::InstanceOfStatus::operator bool const): |
| (JSC::InstanceOfStatus::isSimple const): |
| (JSC::InstanceOfStatus::takesSlowPath const): |
| (JSC::InstanceOfStatus::numVariants const): |
| (JSC::InstanceOfStatus::variants const): |
| (JSC::InstanceOfStatus::at const): |
| (JSC::InstanceOfStatus::operator[] const): |
| * bytecode/InstanceOfVariant.cpp: Added. |
| (JSC::InstanceOfVariant::InstanceOfVariant): |
| (JSC::InstanceOfVariant::attemptToMerge): |
| (JSC::InstanceOfVariant::dump const): |
| (JSC::InstanceOfVariant::dumpInContext const): |
| * bytecode/InstanceOfVariant.h: Added. |
| (JSC::InstanceOfVariant::InstanceOfVariant): |
| (JSC::InstanceOfVariant::operator bool const): |
| (JSC::InstanceOfVariant::structureSet const): |
| (JSC::InstanceOfVariant::structureSet): |
| (JSC::InstanceOfVariant::conditionSet const): |
| (JSC::InstanceOfVariant::prototype const): |
| (JSC::InstanceOfVariant::isHit const): |
| * bytecode/StructureStubInfo.cpp: |
| (JSC::StructureStubInfo::StructureStubInfo): |
| * bytecode/StructureStubInfo.h: |
| (JSC::StructureStubInfo::considerCaching): |
| * dfg/DFGAbstractInterpreterInlines.h: |
| (JSC::DFG::AbstractInterpreter<AbstractStateType>::executeEffects): |
| * dfg/DFGByteCodeParser.cpp: |
| (JSC::DFG::ByteCodeParser::parseBlock): |
| * dfg/DFGClobberize.h: |
| (JSC::DFG::clobberize): |
| * dfg/DFGConstantFoldingPhase.cpp: |
| (JSC::DFG::ConstantFoldingPhase::foldConstants): |
| * dfg/DFGDoesGC.cpp: |
| (JSC::DFG::doesGC): |
| * dfg/DFGFixupPhase.cpp: |
| (JSC::DFG::FixupPhase::fixupNode): |
| * dfg/DFGGraph.cpp: |
| (JSC::DFG::Graph::dump): |
| * dfg/DFGGraph.h: |
| * dfg/DFGLICMPhase.cpp: |
| (JSC::DFG::LICMPhase::attemptHoist): |
| * dfg/DFGNode.cpp: |
| (JSC::DFG::Node::remove): |
| * dfg/DFGNode.h: |
| (JSC::DFG::Node::hasMatchStructureData): |
| (JSC::DFG::Node::matchStructureData): |
| * dfg/DFGNodeType.h: |
| * dfg/DFGSafeToExecute.h: |
| (JSC::DFG::safeToExecute): |
| * dfg/DFGSpeculativeJIT.cpp: |
| (JSC::DFG::SpeculativeJIT::compileMatchStructure): |
| * 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::compileMatchStructure): |
| |
| 2018-05-19 Yusuke Suzuki <utatane.tea@gmail.com> |
| |
| [JSC] JSC should have consistent InById IC |
| https://bugs.webkit.org/show_bug.cgi?id=185682 |
| |
| Reviewed by Filip Pizlo. |
| |
| Current our op_in IC is adhoc: It is only emitted in DFG and FTL layers, |
| when we found that DFG::In's parameter is constant string. We should |
| align this IC to the other ById ICs to clean up and remove adhoc code |
| in DFG and FTL. |
| |
| This patch cleans up our "In" IC by aligning it to the other ById ICs. |
| We split op_in bytecode to op_in_by_id and op_in_by_val. op_in_by_val |
| is the same to the original op_in. For op_in_by_id, we use JITInByIdGenerator |
| to emit InById IC code. In addition, our JITInByIdGenerator and op_in_by_id |
| has a inline access cache for own property case, which is the same to |
| JITGetByIdGenerator. |
| |
| And we split DFG::In to DFG::InById and DFG::InByVal. InByVal is the same |
| to the original In DFG node. DFG AI attempts to lower InByVal to InById |
| if AI figured out that the property name is a constant string. And in |
| InById node, we use JITInByIdGenerator code. |
| |
| This patch cleans up DFG and FTL's adhoc In IC code. |
| |
| In a subsequent patch, we should introduce InByIdStatus to optimize |
| InById in DFG and FTL. We would like to have a new InByIdStatus instead of |
| reusing GetByIdStatus since GetByIdStatus becomes too complicated, and |
| AccessCase::Types are different from them (AccessCase::InHit / InMiss). |
| |
| * bytecode/AccessCase.cpp: |
| (JSC::AccessCase::fromStructureStubInfo): |
| (JSC::AccessCase::generateWithGuard): |
| * bytecode/BytecodeDumper.cpp: |
| (JSC::BytecodeDumper<Block>::printInByIdCacheStatus): |
| (JSC::BytecodeDumper<Block>::dumpBytecode): |
| * bytecode/BytecodeDumper.h: |
| * bytecode/BytecodeList.json: |
| * bytecode/BytecodeUseDef.h: |
| (JSC::computeUsesForBytecodeOffset): |
| (JSC::computeDefsForBytecodeOffset): |
| * bytecode/CodeBlock.cpp: |
| (JSC::CodeBlock::finishCreation): |
| * bytecode/InlineAccess.cpp: |
| (JSC::InlineAccess::generateSelfInAccess): |
| * bytecode/InlineAccess.h: |
| * bytecode/StructureStubInfo.cpp: |
| (JSC::StructureStubInfo::initInByIdSelf): |
| (JSC::StructureStubInfo::deref): |
| (JSC::StructureStubInfo::aboutToDie): |
| (JSC::StructureStubInfo::reset): |
| (JSC::StructureStubInfo::visitWeakReferences): |
| (JSC::StructureStubInfo::propagateTransitions): |
| * bytecode/StructureStubInfo.h: |
| (JSC::StructureStubInfo::patchableJump): |
| * bytecompiler/BytecodeGenerator.cpp: |
| (JSC::BytecodeGenerator::emitInByVal): |
| (JSC::BytecodeGenerator::emitInById): |
| (JSC::BytecodeGenerator::emitIn): Deleted. |
| * bytecompiler/BytecodeGenerator.h: |
| * bytecompiler/NodesCodegen.cpp: |
| (JSC::InNode::emitBytecode): |
| * dfg/DFGAbstractInterpreterInlines.h: |
| (JSC::DFG::AbstractInterpreter<AbstractStateType>::executeEffects): |
| * dfg/DFGByteCodeParser.cpp: |
| (JSC::DFG::ByteCodeParser::parseBlock): |
| * dfg/DFGCapabilities.cpp: |
| (JSC::DFG::capabilityLevel): |
| * dfg/DFGClobberize.h: |
| (JSC::DFG::clobberize): |
| * dfg/DFGConstantFoldingPhase.cpp: |
| (JSC::DFG::ConstantFoldingPhase::foldConstants): |
| * dfg/DFGDoesGC.cpp: |
| (JSC::DFG::doesGC): |
| * dfg/DFGFixupPhase.cpp: |
| (JSC::DFG::FixupPhase::fixupNode): |
| * dfg/DFGJITCompiler.cpp: |
| (JSC::DFG::JITCompiler::link): |
| * dfg/DFGJITCompiler.h: |
| (JSC::DFG::JITCompiler::addInById): |
| (JSC::DFG::InRecord::InRecord): Deleted. |
| (JSC::DFG::JITCompiler::addIn): Deleted. |
| * dfg/DFGNode.h: |
| (JSC::DFG::Node::convertToInById): |
| (JSC::DFG::Node::hasIdentifier): |
| (JSC::DFG::Node::hasArrayMode): |
| * dfg/DFGNodeType.h: |
| * dfg/DFGPredictionPropagationPhase.cpp: |
| * dfg/DFGSafeToExecute.h: |
| (JSC::DFG::safeToExecute): |
| * dfg/DFGSpeculativeJIT.cpp: |
| (JSC::DFG::SpeculativeJIT::compileInById): |
| (JSC::DFG::SpeculativeJIT::compileInByVal): |
| (JSC::DFG::SpeculativeJIT::compileIn): 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::compileInByVal): |
| (JSC::FTL::DFG::LowerDFGToB3::compileInById): |
| (JSC::FTL::DFG::LowerDFGToB3::compileIn): Deleted. |
| * jit/ICStats.h: |
| * jit/JIT.cpp: |
| (JSC::JIT::JIT): |
| (JSC::JIT::privateCompileMainPass): |
| (JSC::JIT::privateCompileSlowCases): |
| (JSC::JIT::link): |
| * jit/JIT.h: |
| * jit/JITInlineCacheGenerator.cpp: |
| (JSC::JITInByIdGenerator::JITInByIdGenerator): |
| (JSC::JITInByIdGenerator::generateFastPath): |
| * jit/JITInlineCacheGenerator.h: |
| (JSC::JITInByIdGenerator::JITInByIdGenerator): |
| * jit/JITOperations.cpp: |
| * jit/JITOperations.h: |
| * jit/JITPropertyAccess.cpp: |
| (JSC::JIT::emit_op_in_by_id): |
| (JSC::JIT::emitSlow_op_in_by_id): |
| * jit/JITPropertyAccess32_64.cpp: |
| (JSC::JIT::emit_op_in_by_id): |
| (JSC::JIT::emitSlow_op_in_by_id): |
| * jit/Repatch.cpp: |
| (JSC::tryCacheInByID): |
| (JSC::repatchInByID): |
| (JSC::resetInByID): |
| (JSC::tryCacheIn): Deleted. |
| (JSC::repatchIn): Deleted. |
| (JSC::resetIn): Deleted. |
| * jit/Repatch.h: |
| * llint/LowLevelInterpreter.asm: |
| * llint/LowLevelInterpreter64.asm: |
| * parser/NodeConstructors.h: |
| (JSC::InNode::InNode): |
| * runtime/CommonSlowPaths.cpp: |
| (JSC::SLOW_PATH_DECL): |
| * runtime/CommonSlowPaths.h: |
| (JSC::CommonSlowPaths::opInByVal): |
| (JSC::CommonSlowPaths::opIn): Deleted. |
| |
| 2018-05-18 Commit Queue <commit-queue@webkit.org> |
| |
| Unreviewed, rolling out r231982. |
| https://bugs.webkit.org/show_bug.cgi?id=185793 |
| |
| Caused layout test failures (Requested by realdawei on |
| #webkit). |
| |
| Reverted changeset: |
| |
| "Complete fix for enabling modern EME by default" |
| https://bugs.webkit.org/show_bug.cgi?id=185770 |
| https://trac.webkit.org/changeset/231982 |
| |
| 2018-05-18 Keith Miller <keith_miller@apple.com> |
| |
| op_in should mark if it sees out of bounds accesses |
| https://bugs.webkit.org/show_bug.cgi?id=185792 |
| |
| Reviewed by Filip Pizlo. |
| |
| This would used to cause us to OSR loop since we would always speculate |
| we were in bounds in HasIndexedProperty. |
| |
| * bytecode/ArrayProfile.cpp: |
| (JSC::ArrayProfile::observeIndexedRead): |
| * bytecode/ArrayProfile.h: |
| * runtime/CommonSlowPaths.h: |
| (JSC::CommonSlowPaths::opIn): |
| |
| 2018-05-18 Mark Lam <mark.lam@apple.com> |
| |
| Add missing exception check. |
| https://bugs.webkit.org/show_bug.cgi?id=185786 |
| <rdar://problem/35686560> |
| |
| Reviewed by Michael Saboff. |
| |
| * runtime/JSPropertyNameEnumerator.h: |
| (JSC::propertyNameEnumerator): |
| |
| 2018-05-18 Jer Noble <jer.noble@apple.com> |
| |
| Complete fix for enabling modern EME by default |
| https://bugs.webkit.org/show_bug.cgi?id=185770 |
| <rdar://problem/40368220> |
| |
| Reviewed by Eric Carlson. |
| |
| * Configurations/FeatureDefines.xcconfig: |
| |
| 2018-05-18 Yusuke Suzuki <utatane.tea@gmail.com> |
| |
| Unreviewed, fix exception checking, part 2 |
| https://bugs.webkit.org/show_bug.cgi?id=185350 |
| |
| * dfg/DFGOperations.cpp: |
| (JSC::DFG::putByValInternal): |
| * jit/JITOperations.cpp: |
| * runtime/CommonSlowPaths.h: |
| (JSC::CommonSlowPaths::putDirectAccessorWithReify): |
| |
| 2018-05-16 Filip Pizlo <fpizlo@apple.com> |
| |
| JSC should have InstanceOf inline caching |
| https://bugs.webkit.org/show_bug.cgi?id=185652 |
| |
| Reviewed by Saam Barati. |
| |
| This adds a polymorphic inline cache for instanceof. It caches hits and misses. It uses the |
| existing PolymorphicAccess IC machinery along with all of its heuristics. If we ever generate |
| too many cases, we emit the generic instanceof implementation instead. |
| |
| All of the JIT tiers use the same InstanceOf IC. It uses the existing JITInlineCacheGenerator |
| abstraction. |
| |
| This is a ~40% speed-up on instanceof microbenchmarks. It's a *tiny* (~1%) speed-up on |
| Octane/boyer. I think I can make that speed-up bigger by inlining the inline cache. |
| |
| * API/tests/testapi.mm: |
| (testObjectiveCAPIMain): |
| * JavaScriptCore.xcodeproj/project.pbxproj: |
| * Sources.txt: |
| * b3/B3Effects.h: |
| (JSC::B3::Effects::forReadOnlyCall): |
| * bytecode/AccessCase.cpp: |
| (JSC::AccessCase::guardedByStructureCheck const): |
| (JSC::AccessCase::canReplace const): |
| (JSC::AccessCase::visitWeak const): |
| (JSC::AccessCase::generateWithGuard): |
| (JSC::AccessCase::generateImpl): |
| * bytecode/AccessCase.h: |
| * bytecode/InstanceOfAccessCase.cpp: Added. |
| (JSC::InstanceOfAccessCase::create): |
| (JSC::InstanceOfAccessCase::dumpImpl const): |
| (JSC::InstanceOfAccessCase::clone const): |
| (JSC::InstanceOfAccessCase::~InstanceOfAccessCase): |
| (JSC::InstanceOfAccessCase::InstanceOfAccessCase): |
| * bytecode/InstanceOfAccessCase.h: Added. |
| (JSC::InstanceOfAccessCase::prototype const): |
| * bytecode/ObjectPropertyCondition.h: |
| (JSC::ObjectPropertyCondition::hasPrototypeWithoutBarrier): |
| (JSC::ObjectPropertyCondition::hasPrototype): |
| * bytecode/ObjectPropertyConditionSet.cpp: |
| (JSC::generateConditionsForInstanceOf): |
| * bytecode/ObjectPropertyConditionSet.h: |
| * bytecode/PolymorphicAccess.cpp: |
| (JSC::PolymorphicAccess::addCases): |
| (JSC::PolymorphicAccess::regenerate): |
| (WTF::printInternal): |
| * bytecode/PropertyCondition.cpp: |
| (JSC::PropertyCondition::dumpInContext const): |
| (JSC::PropertyCondition::isStillValidAssumingImpurePropertyWatchpoint const): |
| (JSC::PropertyCondition::validityRequiresImpurePropertyWatchpoint const): |
| (WTF::printInternal): |
| * bytecode/PropertyCondition.h: |
| (JSC::PropertyCondition::absenceWithoutBarrier): |
| (JSC::PropertyCondition::absenceOfSetEffectWithoutBarrier): |
| (JSC::PropertyCondition::hasPrototypeWithoutBarrier): |
| (JSC::PropertyCondition::hasPrototype): |
| (JSC::PropertyCondition::hasPrototype const): |
| (JSC::PropertyCondition::prototype const): |
| (JSC::PropertyCondition::hash const): |
| (JSC::PropertyCondition::operator== const): |
| * bytecode/StructureStubInfo.cpp: |
| (JSC::StructureStubInfo::StructureStubInfo): |
| (JSC::StructureStubInfo::reset): |
| * bytecode/StructureStubInfo.h: |
| (JSC::StructureStubInfo::considerCaching): |
| * dfg/DFGByteCodeParser.cpp: |
| (JSC::DFG::ByteCodeParser::parseBlock): |
| * dfg/DFGFixupPhase.cpp: |
| (JSC::DFG::FixupPhase::fixupNode): |
| * dfg/DFGInlineCacheWrapper.h: |
| * dfg/DFGInlineCacheWrapperInlines.h: |
| (JSC::DFG::InlineCacheWrapper<GeneratorType>::finalize): |
| * dfg/DFGJITCompiler.cpp: |
| (JSC::DFG::JITCompiler::link): |
| * dfg/DFGJITCompiler.h: |
| (JSC::DFG::JITCompiler::addInstanceOf): |
| * dfg/DFGOperations.cpp: |
| * dfg/DFGSpeculativeJIT.cpp: |
| (JSC::DFG::SpeculativeJIT::usedRegisters): |
| (JSC::DFG::SpeculativeJIT::compileInstanceOfForCells): |
| (JSC::DFG::SpeculativeJIT::compileInstanceOf): |
| (JSC::DFG::SpeculativeJIT::compileInstanceOfForObject): Deleted. |
| * dfg/DFGSpeculativeJIT.h: |
| * dfg/DFGSpeculativeJIT64.cpp: |
| (JSC::DFG::SpeculativeJIT::cachedGetById): |
| (JSC::DFG::SpeculativeJIT::cachedGetByIdWithThis): |
| * ftl/FTLLowerDFGToB3.cpp: |
| (JSC::FTL::DFG::LowerDFGToB3::compileAssertNotEmpty): |
| (JSC::FTL::DFG::LowerDFGToB3::compilePutById): |
| (JSC::FTL::DFG::LowerDFGToB3::compileNumberIsInteger): |
| (JSC::FTL::DFG::LowerDFGToB3::compileIn): |
| (JSC::FTL::DFG::LowerDFGToB3::compileInstanceOf): |
| (JSC::FTL::DFG::LowerDFGToB3::getById): |
| (JSC::FTL::DFG::LowerDFGToB3::getByIdWithThis): |
| * jit/ICStats.h: |
| * jit/JIT.cpp: |
| (JSC::JIT::privateCompileSlowCases): |
| (JSC::JIT::link): |
| * jit/JIT.h: |
| * jit/JITInlineCacheGenerator.cpp: |
| (JSC::JITInlineCacheGenerator::JITInlineCacheGenerator): |
| (JSC::JITInlineCacheGenerator::finalize): |
| (JSC::JITByIdGenerator::JITByIdGenerator): |
| (JSC::JITByIdGenerator::finalize): |
| (JSC::JITInstanceOfGenerator::JITInstanceOfGenerator): |
| (JSC::JITInstanceOfGenerator::generateFastPath): |
| (JSC::JITInstanceOfGenerator::finalize): |
| * jit/JITInlineCacheGenerator.h: |
| (JSC::JITInlineCacheGenerator::reportSlowPathCall): |
| (JSC::JITInlineCacheGenerator::slowPathBegin const): |
| (JSC::JITInstanceOfGenerator::JITInstanceOfGenerator): |
| (JSC::finalizeInlineCaches): |
| (JSC::JITByIdGenerator::reportSlowPathCall): Deleted. |
| (JSC::JITByIdGenerator::slowPathBegin const): Deleted. |
| * jit/JITOpcodes.cpp: |
| (JSC::JIT::emit_op_instanceof): |
| (JSC::JIT::emitSlow_op_instanceof): |
| * jit/JITOperations.cpp: |
| * jit/JITOperations.h: |
| * jit/JITPropertyAccess.cpp: |
| (JSC::JIT::privateCompileGetByValWithCachedId): |
| (JSC::JIT::privateCompilePutByValWithCachedId): |
| * jit/RegisterSet.cpp: |
| (JSC::RegisterSet::stubUnavailableRegisters): |
| * jit/Repatch.cpp: |
| (JSC::tryCacheIn): |
| (JSC::tryCacheInstanceOf): |
| (JSC::repatchInstanceOf): |
| (JSC::resetPatchableJump): |
| (JSC::resetIn): |
| (JSC::resetInstanceOf): |
| * jit/Repatch.h: |
| * runtime/Options.h: |
| * runtime/Structure.h: |
| |
| 2018-05-18 Yusuke Suzuki <utatane.tea@gmail.com> |
| |
| Unreviewed, fix exception checking |
| https://bugs.webkit.org/show_bug.cgi?id=185350 |
| |
| * runtime/CommonSlowPaths.h: |
| (JSC::CommonSlowPaths::putDirectWithReify): |
| (JSC::CommonSlowPaths::putDirectAccessorWithReify): |
| |
| 2018-05-17 Michael Saboff <msaboff@apple.com> |
| |
| We don't throw SyntaxErrors for runtime generated regular expressions with errors |
| https://bugs.webkit.org/show_bug.cgi?id=185755 |
| |
| Reviewed by Keith Miller. |
| |
| Added a new helper that creates the correct exception to throw for each type of error when |
| compiling a RegExp. Using that new helper, added missing checks for RegExp for the cases |
| where we create a new RegExp from an existing one. Also refactored other places that we |
| throw SyntaxErrors after a failed RegExp compile to use the new helper. |
| |
| * runtime/RegExp.h: |
| * runtime/RegExpConstructor.cpp: |
| (JSC::regExpCreate): |
| (JSC::constructRegExp): |
| * runtime/RegExpPrototype.cpp: |
| (JSC::regExpProtoFuncCompile): |
| * yarr/YarrErrorCode.cpp: |
| (JSC::Yarr::errorToThrow): |
| * yarr/YarrErrorCode.h: |
| |
| 2018-05-17 Saam Barati <sbarati@apple.com> |
| |
| Remove shrinkFootprint test from apitests since it's flaky |
| https://bugs.webkit.org/show_bug.cgi?id=185754 |
| |
| Reviewed by Mark Lam. |
| |
| This test is flaky as it keeps failing on certain people's machines. |
| Having a test about OS footprint seems like it'll forever be doomed |
| to being flaky. |
| |
| * API/tests/testapi.mm: |
| (testObjectiveCAPIMain): |
| |
| 2018-05-17 Saam Barati <sbarati@apple.com> |
| |
| defaultConstructorSourceCode needs to makeSource every time it's called |
| https://bugs.webkit.org/show_bug.cgi?id=185753 |
| |
| Rubber-stamped by Mark Lam. |
| |
| The bug here is multiple VMs can be running concurrently to one another |
| in the same process. They may each ref/deref something that isn't ThreadSafeRefCounted |
| if we copy a static SourceCode. instead, we create a new one each time |
| this function is called. |
| |
| * builtins/BuiltinExecutables.cpp: |
| (JSC::BuiltinExecutables::defaultConstructorSourceCode): |
| |
| 2018-05-17 Yusuke Suzuki <utatane.tea@gmail.com> |
| |
| [JSC] Use AssemblyHelpers' type checking functions as much as possible |
| https://bugs.webkit.org/show_bug.cgi?id=185730 |
| |
| Reviewed by Saam Barati. |
| |
| Let's use AssemblyHelpers' type checking functions as much as possible. This hides the complex |
| bit and register operations for type tagging of JSValue. It is really useful when we would like |
| to tweak type tagging representation since the code is collected into AssemblyHelpers. And |
| the named function is more readable than some branching operations. |
| |
| We also remove unnecessary branching functions in JIT / JSInterfaceJIT. Some of them are duplicate |
| to AssemblyHelpers' one. |
| |
| We add several new type checking functions to AssemblyHelpers. Moreover, we add branchIfXXX(GPRReg) |
| functions even for 32bit environment. In 32bit environment, this function takes tag register. This |
| semantics is aligned to the existing branchIfCell / branchIfNotCell. |
| |
| * bytecode/AccessCase.cpp: |
| (JSC::AccessCase::generateWithGuard): |
| * dfg/DFGSpeculativeJIT.cpp: |
| (JSC::DFG::SpeculativeJIT::compileValueToInt32): |
| (JSC::DFG::SpeculativeJIT::compileDoubleRep): |
| (JSC::DFG::SpeculativeJIT::compileInstanceOfForObject): |
| (JSC::DFG::SpeculativeJIT::compileSpread): |
| (JSC::DFG::SpeculativeJIT::speculateCellTypeWithoutTypeFiltering): |
| (JSC::DFG::SpeculativeJIT::speculateCellType): |
| (JSC::DFG::SpeculativeJIT::speculateNumber): |
| (JSC::DFG::SpeculativeJIT::speculateMisc): |
| (JSC::DFG::SpeculativeJIT::compileExtractValueFromWeakMapGet): |
| (JSC::DFG::SpeculativeJIT::compileCreateThis): |
| (JSC::DFG::SpeculativeJIT::compileGetPrototypeOf): |
| (JSC::DFG::SpeculativeJIT::compileHasIndexedProperty): |
| * dfg/DFGSpeculativeJIT32_64.cpp: |
| (JSC::DFG::SpeculativeJIT::emitCall): |
| (JSC::DFG::SpeculativeJIT::fillSpeculateInt32Internal): |
| (JSC::DFG::SpeculativeJIT::fillSpeculateBoolean): |
| (JSC::DFG::SpeculativeJIT::compile): |
| * dfg/DFGSpeculativeJIT64.cpp: |
| (JSC::DFG::SpeculativeJIT::nonSpeculativePeepholeStrictEq): |
| (JSC::DFG::SpeculativeJIT::nonSpeculativeNonPeepholeStrictEq): |
| (JSC::DFG::SpeculativeJIT::emitCall): |
| (JSC::DFG::SpeculativeJIT::fillSpeculateInt32Internal): |
| (JSC::DFG::SpeculativeJIT::compile): |
| (JSC::DFG::SpeculativeJIT::convertAnyInt): |
| * ftl/FTLLowerDFGToB3.cpp: |
| (JSC::FTL::DFG::LowerDFGToB3::compileAssertNotEmpty): |
| * jit/AssemblyHelpers.h: |
| (JSC::AssemblyHelpers::branchIfInt32): |
| (JSC::AssemblyHelpers::branchIfNotInt32): |
| (JSC::AssemblyHelpers::branchIfNumber): |
| (JSC::AssemblyHelpers::branchIfNotNumber): |
| (JSC::AssemblyHelpers::branchIfBoolean): |
| (JSC::AssemblyHelpers::branchIfNotBoolean): |
| (JSC::AssemblyHelpers::branchIfEmpty): |
| (JSC::AssemblyHelpers::branchIfNotEmpty): |
| (JSC::AssemblyHelpers::branchIfUndefined): |
| (JSC::AssemblyHelpers::branchIfNotUndefined): |
| (JSC::AssemblyHelpers::branchIfNull): |
| (JSC::AssemblyHelpers::branchIfNotNull): |
| * jit/JIT.h: |
| * jit/JITArithmetic.cpp: |
| (JSC::JIT::emit_compareAndJump): |
| (JSC::JIT::emit_compareAndJumpSlow): |
| * jit/JITArithmetic32_64.cpp: |
| (JSC::JIT::emit_compareAndJump): |
| (JSC::JIT::emit_op_unsigned): |
| (JSC::JIT::emit_op_inc): |
| (JSC::JIT::emit_op_dec): |
| (JSC::JIT::emitBinaryDoubleOp): |
| (JSC::JIT::emit_op_mod): |
| * jit/JITCall.cpp: |
| (JSC::JIT::compileCallEval): |
| (JSC::JIT::compileOpCall): |
| * jit/JITCall32_64.cpp: |
| (JSC::JIT::compileCallEval): |
| (JSC::JIT::compileOpCall): |
| * jit/JITInlines.h: |
| (JSC::JIT::emitJumpSlowCaseIfNotJSCell): |
| (JSC::JIT::emitJumpIfBothJSCells): |
| (JSC::JIT::emitJumpSlowCaseIfJSCell): |
| (JSC::JIT::emitJumpIfNotInt): |
| (JSC::JIT::emitJumpSlowCaseIfNotInt): |
| (JSC::JIT::emitJumpSlowCaseIfNotNumber): |
| (JSC::JIT::emitJumpIfCellObject): Deleted. |
| (JSC::JIT::emitJumpIfCellNotObject): Deleted. |
| (JSC::JIT::emitJumpIfJSCell): Deleted. |
| (JSC::JIT::emitJumpIfInt): Deleted. |
| * jit/JITOpcodes.cpp: |
| (JSC::JIT::emit_op_instanceof): |
| (JSC::JIT::emit_op_is_undefined): |
| (JSC::JIT::emit_op_is_cell_with_type): |
| (JSC::JIT::emit_op_is_object): |
| (JSC::JIT::emit_op_to_primitive): |
| (JSC::JIT::emit_op_jeq_null): |
| (JSC::JIT::emit_op_jneq_null): |
| (JSC::JIT::compileOpStrictEq): |
| (JSC::JIT::compileOpStrictEqJump): |
| (JSC::JIT::emit_op_to_number): |
| (JSC::JIT::emit_op_to_string): |
| (JSC::JIT::emit_op_to_object): |
| (JSC::JIT::emit_op_eq_null): |
| (JSC::JIT::emit_op_neq_null): |
| (JSC::JIT::emit_op_to_this): |
| (JSC::JIT::emit_op_create_this): |
| (JSC::JIT::emit_op_check_tdz): |
| (JSC::JIT::emitNewFuncExprCommon): |
| (JSC::JIT::emit_op_profile_type): |
| * jit/JITOpcodes32_64.cpp: |
| (JSC::JIT::emit_op_instanceof): |
| (JSC::JIT::emit_op_is_undefined): |
| (JSC::JIT::emit_op_is_cell_with_type): |
| (JSC::JIT::emit_op_is_object): |
| (JSC::JIT::emit_op_to_primitive): |
| (JSC::JIT::emit_op_not): |
| (JSC::JIT::emit_op_jeq_null): |
| (JSC::JIT::emit_op_jneq_null): |
| (JSC::JIT::emit_op_jneq_ptr): |
| (JSC::JIT::emit_op_eq): |
| (JSC::JIT::emit_op_jeq): |
| (JSC::JIT::emit_op_neq): |
| (JSC::JIT::emit_op_jneq): |
| (JSC::JIT::compileOpStrictEq): |
| (JSC::JIT::compileOpStrictEqJump): |
| (JSC::JIT::emit_op_eq_null): |
| (JSC::JIT::emit_op_neq_null): |
| (JSC::JIT::emit_op_to_number): |
| (JSC::JIT::emit_op_to_string): |
| (JSC::JIT::emit_op_to_object): |
| (JSC::JIT::emit_op_create_this): |
| (JSC::JIT::emit_op_to_this): |
| (JSC::JIT::emit_op_check_tdz): |
| (JSC::JIT::emit_op_profile_type): |
| * jit/JITPropertyAccess.cpp: |
| (JSC::JIT::emit_op_get_by_val): |
| (JSC::JIT::emitGetByValWithCachedId): |
| (JSC::JIT::emitGenericContiguousPutByVal): |
| (JSC::JIT::emitPutByValWithCachedId): |
| (JSC::JIT::emit_op_get_from_scope): |
| (JSC::JIT::emit_op_put_to_scope): |
| (JSC::JIT::emitWriteBarrier): |
| (JSC::JIT::emitIntTypedArrayPutByVal): |
| (JSC::JIT::emitFloatTypedArrayPutByVal): |
| * jit/JITPropertyAccess32_64.cpp: |
| (JSC::JIT::emit_op_get_by_val): |
| (JSC::JIT::emitContiguousLoad): |
| (JSC::JIT::emitArrayStorageLoad): |
| (JSC::JIT::emitGetByValWithCachedId): |
| (JSC::JIT::emitGenericContiguousPutByVal): |
| (JSC::JIT::emitPutByValWithCachedId): |
| (JSC::JIT::emit_op_get_from_scope): |
| (JSC::JIT::emit_op_put_to_scope): |
| * jit/JSInterfaceJIT.h: |
| (JSC::JSInterfaceJIT::emitLoadJSCell): |
| (JSC::JSInterfaceJIT::emitLoadInt32): |
| (JSC::JSInterfaceJIT::emitLoadDouble): |
| (JSC::JSInterfaceJIT::emitJumpIfNumber): Deleted. |
| (JSC::JSInterfaceJIT::emitJumpIfNotNumber): Deleted. |
| (JSC::JSInterfaceJIT::emitJumpIfNotType): Deleted. |
| * jit/Repatch.cpp: |
| (JSC::linkPolymorphicCall): |
| * jit/ThunkGenerators.cpp: |
| (JSC::virtualThunkFor): |
| (JSC::absThunkGenerator): |
| * tools/JSDollarVM.cpp: |
| (WTF::DOMJITNode::checkSubClassSnippet): |
| (WTF::DOMJITFunctionObject::checkSubClassSnippet): |
| |
| 2018-05-17 Saam Barati <sbarati@apple.com> |
| |
| Unreviewed. Fix the build after my attempted build fix broke the build. |
| |
| * builtins/BuiltinExecutables.cpp: |
| (JSC::BuiltinExecutables::defaultConstructorSourceCode): |
| (JSC::BuiltinExecutables::createDefaultConstructor): |
| * builtins/BuiltinExecutables.h: |
| |
| 2018-05-17 Yusuke Suzuki <utatane.tea@gmail.com> |
| |
| [JSC] Remove reifyPropertyNameIfNeeded |
| https://bugs.webkit.org/show_bug.cgi?id=185350 |
| |
| Reviewed by Saam Barati. |
| |
| reifyPropertyNameIfNeeded is in the middle of putDirectInternal, which is super critical path. |
| This is a virtual call, and it is only used by JSFunction right now. Since this causes too much |
| cost, we should remove this from the critical path. |
| |
| This patch removes this function call from the critical path. And in our slow paths, we call |
| helper functions which calls reifyLazyPropertyIfNeeded if the given value is a JSFunction. |
| While putDirect is a bit raw API, our slow paths just call it. This helper wraps this calls |
| and care the edge cases. The other callsites of putDirect should know the type of the given |
| object and the name of the property (And avoid these edge cases). |
| |
| This improves SixSpeed/object-assign.es6 by ~4% on MacBook Pro. And this patch does not cause |
| regressions of the existing tests. |
| |
| baseline patched |
| Kraken: |
| json-parse-financial 35.522+-0.069 ^ 34.708+-0.097 ^ definitely 1.0234x faster |
| |
| SixSpeed: |
| object-assign.es6 145.8779+-0.2838 ^ 140.1019+-0.8007 ^ definitely 1.0412x faster |
| |
| * dfg/DFGOperations.cpp: |
| (JSC::DFG::putByValInternal): |
| (JSC::DFG::putByValCellInternal): |
| * jit/JITOperations.cpp: |
| * llint/LLIntSlowPaths.cpp: |
| (JSC::LLInt::LLINT_SLOW_PATH_DECL): |
| * runtime/ClassInfo.h: |
| * runtime/CommonSlowPaths.h: |
| (JSC::CommonSlowPaths::putDirectWithReify): |
| (JSC::CommonSlowPaths::putDirectAccessorWithReify): |
| * runtime/JSCell.cpp: |
| (JSC::JSCell::reifyPropertyNameIfNeeded): Deleted. |
| * runtime/JSCell.h: |
| * runtime/JSFunction.cpp: |
| (JSC::JSFunction::reifyPropertyNameIfNeeded): Deleted. |
| * runtime/JSFunction.h: |
| * runtime/JSObject.cpp: |
| (JSC::JSObject::putDirectAccessor): |
| (JSC::JSObject::putDirectNonIndexAccessor): |
| * runtime/JSObject.h: |
| * runtime/JSObjectInlines.h: |
| (JSC::JSObject::putDirectInternal): |
| |
| 2018-05-17 Saam Barati <sbarati@apple.com> |
| |
| Unreviewed. Try to fix windows build. |
| |
| * builtins/BuiltinExecutables.cpp: |
| (JSC::BuiltinExecutables::defaultConstructorSourceCode): |
| |
| 2018-05-16 Saam Barati <sbarati@apple.com> |
| |
| UnlinkedFunctionExecutable doesn't need a parent source override field since it's only used for default class constructors |
| https://bugs.webkit.org/show_bug.cgi?id=185637 |
| |
| Reviewed by Keith Miller. |
| |
| We had this general mechanism for overriding an UnlinkedFunctionExecutable's parent |
| source code. However, we were only using this for default class constructors. There |
| are only two types of default class constructors. This patch makes it so that |
| we just store this information inside of a single bit, and ask for the source |
| code as needed instead of holding it in a nullable field that is 24 bytes in size. |
| |
| This brings UnlinkedFunctionExecutable's size down from 184 bytes to 160 bytes. |
| This has the consequence of making it allocated out of a 160 byte size class |
| instead of a 224 byte size class. This should bring down its memory footprint |
| by ~40%. |
| |
| * builtins/BuiltinExecutables.cpp: |
| (JSC::BuiltinExecutables::defaultConstructorSourceCode): |
| (JSC::BuiltinExecutables::createDefaultConstructor): |
| (JSC::BuiltinExecutables::createExecutable): |
| * builtins/BuiltinExecutables.h: |
| * bytecode/UnlinkedFunctionExecutable.cpp: |
| (JSC::UnlinkedFunctionExecutable::UnlinkedFunctionExecutable): |
| (JSC::UnlinkedFunctionExecutable::link): |
| * bytecode/UnlinkedFunctionExecutable.h: |
| * runtime/CodeCache.cpp: |
| (JSC::CodeCache::getUnlinkedGlobalFunctionExecutable): |
| |
| 2018-05-16 Saam Barati <sbarati@apple.com> |
| |
| VM::shrinkFootprint should call collectNow(Sync) instead of collectSync so it also eagerly sweeps |
| https://bugs.webkit.org/show_bug.cgi?id=185707 |
| |
| Reviewed by Mark Lam. |
| |
| * runtime/VM.cpp: |
| (JSC::VM::shrinkFootprint): |
| |
| 2018-05-16 Caio Lima <ticaiolima@gmail.com> |
| |
| [ESNext][BigInt] Implement support for "/" operation |
| https://bugs.webkit.org/show_bug.cgi?id=183996 |
| |
| Reviewed by Yusuke Suzuki. |
| |
| This patch is introducing the support for BigInt into divide |
| operation int LLInt and JIT layers. |
| |
| * dfg/DFGOperations.cpp: |
| * runtime/CommonSlowPaths.cpp: |
| (JSC::SLOW_PATH_DECL): |
| * runtime/JSBigInt.cpp: |
| (JSC::JSBigInt::divide): |
| (JSC::JSBigInt::copy): |
| (JSC::JSBigInt::unaryMinus): |
| (JSC::JSBigInt::absoluteCompare): |
| (JSC::JSBigInt::absoluteDivLarge): |
| (JSC::JSBigInt::productGreaterThan): |
| (JSC::JSBigInt::inplaceAdd): |
| (JSC::JSBigInt::inplaceSub): |
| (JSC::JSBigInt::inplaceRightShift): |
| (JSC::JSBigInt::specialLeftShift): |
| (JSC::JSBigInt::digit): |
| (JSC::JSBigInt::setDigit): |
| * runtime/JSBigInt.h: |
| |
| 2018-05-16 Saam Barati <sbarati@apple.com> |
| |
| Constant fold CheckTypeInfoFlags on ImplementsDefaultHasInstance |
| https://bugs.webkit.org/show_bug.cgi?id=185670 |
| |
| Reviewed by Yusuke Suzuki. |
| |
| This patch makes it so that we constant fold CheckTypeInfoFlags for |
| ImplementsDefaultHasInstance inside of AI/constant folding. We constant |
| fold in three ways: |
| - When the incoming value is a constant, we just look at its inline type |
| flags. Since those flags never change after an object is created, this |
| is sound. |
| - Based on the incoming value having a finite structure set. We just iterate |
| all structures and ensure they have the bit set. |
| - Based on speculated type. To do this, I split up SpecFunction into two |
| subheaps where one is for functions that have the bit set, and one for |
| functions that don't have the bit set. The latter is currently only comprised |
| of JSBoundFunctions. To constant fold, we check that the incoming |
| value only has the SpecFunction type with ImplementsDefaultHasInstance set. |
| |
| * bytecode/SpeculatedType.cpp: |
| (JSC::speculationFromClassInfo): |
| * bytecode/SpeculatedType.h: |
| * dfg/DFGAbstractInterpreterInlines.h: |
| (JSC::DFG::AbstractInterpreter<AbstractStateType>::executeEffects): |
| * dfg/DFGConstantFoldingPhase.cpp: |
| (JSC::DFG::ConstantFoldingPhase::foldConstants): |
| * dfg/DFGSpeculativeJIT.cpp: |
| (JSC::DFG::SpeculativeJIT::compileCheckTypeInfoFlags): |
| * dfg/DFGStrengthReductionPhase.cpp: |
| (JSC::DFG::StrengthReductionPhase::handleNode): |
| * runtime/JSFunction.cpp: |
| (JSC::JSFunction::JSFunction): |
| (JSC::JSFunction::assertTypeInfoFlagInvariants): |
| * runtime/JSFunction.h: |
| (JSC::JSFunction::assertTypeInfoFlagInvariants): |
| * runtime/JSFunctionInlines.h: |
| (JSC::JSFunction::JSFunction): |
| |
| 2018-05-16 Devin Rousso <webkit@devinrousso.com> |
| |
| Web Inspector: create a navigation item for toggling the overlay rulers/guides |
| https://bugs.webkit.org/show_bug.cgi?id=185644 |
| |
| Reviewed by Matt Baker. |
| |
| * inspector/protocol/OverlayTypes.json: |
| * inspector/protocol/Page.json: |
| |
| 2018-05-16 Commit Queue <commit-queue@webkit.org> |
| |
| Unreviewed, rolling out r231845. |
| https://bugs.webkit.org/show_bug.cgi?id=185702 |
| |
| it is breaking Apple High Sierra 32-bit JSC bot (Requested by |
| caiolima on #webkit). |
| |
| Reverted changeset: |
| |
| "[ESNext][BigInt] Implement support for "/" operation" |
| https://bugs.webkit.org/show_bug.cgi?id=183996 |
| https://trac.webkit.org/changeset/231845 |
| |
| 2018-05-16 Filip Pizlo <fpizlo@apple.com> |
| |
| DFG models InstanceOf incorrectly |
| https://bugs.webkit.org/show_bug.cgi?id=185694 |
| |
| Reviewed by Keith Miller. |
| |
| Proxies mean that InstanceOf can have effects. Exceptions mean that it's illegal to DCE it or |
| hoist it. |
| |
| * dfg/DFGAbstractInterpreterInlines.h: |
| (JSC::DFG::AbstractInterpreter<AbstractStateType>::executeEffects): |
| * dfg/DFGClobberize.h: |
| (JSC::DFG::clobberize): |
| * dfg/DFGHeapLocation.cpp: |
| (WTF::printInternal): |
| * dfg/DFGHeapLocation.h: |
| * dfg/DFGNodeType.h: |
| |
| 2018-05-16 Andy VanWagoner <andy@vanwagoner.family> |
| |
| Add support for Intl NumberFormat formatToParts |
| https://bugs.webkit.org/show_bug.cgi?id=185375 |
| |
| Reviewed by Yusuke Suzuki. |
| |
| Add flag for NumberFormat formatToParts. Implement formatToParts using |
| unum_formatDoubleForFields. Because the fields are nested and come back |
| in no guaranteed order, the simple algorithm to convert them to the |
| desired format is roughly O(n^2). However, even with Number.MAX_VALUE |
| it appears to perform well enough for the initial implementation. Another |
| issue has been created to improve this algorithm. |
| |
| This requires ICU v59+ for unum_formatDoubleForFields, so it is disabled |
| on macOS, since only v57 is available. |
| |
| * Configurations/FeatureDefines.xcconfig: |
| * runtime/IntlNumberFormat.cpp: |
| (JSC::IntlNumberFormat::UFieldPositionIteratorDeleter::operator() const): |
| (JSC::IntlNumberFormat::partTypeString): |
| (JSC::IntlNumberFormat::formatToParts): |
| * runtime/IntlNumberFormat.h: |
| * runtime/IntlNumberFormatPrototype.cpp: |
| (JSC::IntlNumberFormatPrototype::create): |
| (JSC::IntlNumberFormatPrototype::finishCreation): |
| (JSC::IntlNumberFormatPrototypeFuncFormatToParts): |
| * runtime/IntlNumberFormatPrototype.h: |
| * runtime/Options.h: |
| |
| 2018-05-16 Caio Lima <ticaiolima@gmail.com> |
| |
| [ESNext][BigInt] Implement support for "/" operation |
| https://bugs.webkit.org/show_bug.cgi?id=183996 |
| |
| Reviewed by Yusuke Suzuki. |
| |
| This patch is introducing the support for BigInt into divide |
| operation int LLInt and JIT layers. |
| |
| * dfg/DFGOperations.cpp: |
| * runtime/CommonSlowPaths.cpp: |
| (JSC::SLOW_PATH_DECL): |
| * runtime/JSBigInt.cpp: |
| (JSC::JSBigInt::divide): |
| (JSC::JSBigInt::copy): |
| (JSC::JSBigInt::unaryMinus): |
| (JSC::JSBigInt::absoluteCompare): |
| (JSC::JSBigInt::absoluteDivLarge): |
| (JSC::JSBigInt::productGreaterThan): |
| (JSC::JSBigInt::inplaceAdd): |
| (JSC::JSBigInt::inplaceSub): |
| (JSC::JSBigInt::inplaceRightShift): |
| (JSC::JSBigInt::specialLeftShift): |
| (JSC::JSBigInt::digit): |
| (JSC::JSBigInt::setDigit): |
| * runtime/JSBigInt.h: |
| |
| 2018-05-16 Alberto Garcia <berto@igalia.com> |
| |
| [CMake] Properly detect compiler flags, needed libs, and fallbacks for usage of 64-bit atomic operations |
| https://bugs.webkit.org/show_bug.cgi?id=182622 |
| |
| Reviewed by Michael Catanzaro. |
| |
| We were linking JavaScriptCore against libatomic in MIPS because |
| in that architecture __atomic_fetch_add_8() is not a compiler |
| intrinsic and is provided by that library instead. However other |
| architectures (e.g armel) are in the same situation, so we need a |
| generic test. |
| |
| That test already exists in WebKit/CMakeLists.txt, so we just have |
| to move it to a common file (WebKitCompilerFlags.cmake) and use |
| its result (ATOMIC_INT64_REQUIRES_LIBATOMIC) here. |
| |
| * CMakeLists.txt: |
| |
| 2018-05-15 Yusuke Suzuki <utatane.tea@gmail.com> |
| |
| [JSC] Check TypeInfo first before calling getCallData when we would like to check whether given object is a function |
| https://bugs.webkit.org/show_bug.cgi?id=185601 |
| |
| Reviewed by Saam Barati. |
| |
| Rename TypeOfShouldCallGetCallData to OverridesGetCallData. And check OverridesGetCallData |
| before calling getCallData when we would like to check whether a given object is callable |
| since getCallData is a virtual call. When we call the object anyway, directly calling getCallData |
| is fine. But if we would like to check whether the object is callable, we can have non |
| callable objects frequently. In that case, we should not call getCallData if we can avoid it. |
| |
| To do this cleanly, we refactor JSValue::{isFunction,isCallable}. We add JSCell::{isFunction,isCallable} |
| and JSValue ones call into these functions. Inside JSCell::{isFunction,isCallable}, we perform |
| OverridesGetCallData checking before calling getCallData. |
| |
| We found that this virtual call exists in JSON.stringify's critial path. Checking |
| OverridesGetCallData improves Kraken/json-stringify-tinderbox by 2-4%. |
| |
| baseline patched |
| |
| json-stringify-tinderbox 38.807+-0.350 ^ 37.216+-0.337 ^ definitely 1.0427x faster |
| |
| In addition to that, we also add OverridesGetCallData flag to JSFunction while we keep JSFunctionType checking fast path |
| since major cases are covered by this fast JSFunctionType checking. |
| |
| * API/JSCallbackObject.h: |
| * dfg/DFGAbstractInterpreterInlines.h: |
| (JSC::DFG::AbstractInterpreter<AbstractStateType>::executeEffects): |
| * dfg/DFGOperations.cpp: |
| * dfg/DFGSpeculativeJIT.cpp: |
| (JSC::DFG::SpeculativeJIT::compileIsObjectOrNull): |
| (JSC::DFG::SpeculativeJIT::compileIsFunction): |
| * ftl/FTLLowerDFGToB3.cpp: |
| (JSC::FTL::DFG::LowerDFGToB3::isExoticForTypeof): |
| * jit/AssemblyHelpers.h: |
| (JSC::AssemblyHelpers::emitTypeOf): |
| * runtime/ExceptionHelpers.cpp: |
| (JSC::createError): |
| (JSC::createInvalidFunctionApplyParameterError): |
| * runtime/FunctionPrototype.cpp: |
| (JSC::functionProtoFuncToString): |
| * runtime/InternalFunction.h: |
| * runtime/JSCJSValue.h: |
| * runtime/JSCJSValueInlines.h: |
| (JSC::JSValue::isFunction const): |
| (JSC::JSValue::isCallable const): |
| * runtime/JSCell.h: |
| * runtime/JSCellInlines.h: |
| (JSC::JSCell::isFunction): |
| ALWAYS_INLINE works well for my environment. |
| (JSC::JSCell::isCallable): |
| * runtime/JSFunction.h: |
| * runtime/JSONObject.cpp: |
| (JSC::Stringifier::toJSON): |
| (JSC::Stringifier::toJSONImpl): |
| (JSC::Stringifier::appendStringifiedValue): |
| * runtime/JSObjectInlines.h: |
| (JSC::createListFromArrayLike): |
| * runtime/JSTypeInfo.h: |
| (JSC::TypeInfo::overridesGetCallData const): |
| (JSC::TypeInfo::typeOfShouldCallGetCallData const): Deleted. |
| * runtime/Operations.cpp: |
| (JSC::jsTypeStringForValue): |
| (JSC::jsIsObjectTypeOrNull): |
| * runtime/ProxyObject.h: |
| * runtime/RuntimeType.cpp: |
| (JSC::runtimeTypeForValue): |
| * runtime/RuntimeType.h: |
| * runtime/Structure.cpp: |
| (JSC::Structure::Structure): |
| * runtime/TypeProfilerLog.cpp: |
| (JSC::TypeProfilerLog::TypeProfilerLog): |
| (JSC::TypeProfilerLog::processLogEntries): |
| * runtime/TypeProfilerLog.h: |
| * runtime/VM.cpp: |
| (JSC::VM::enableTypeProfiler): |
| * tools/JSDollarVM.cpp: |
| (JSC::functionFindTypeForExpression): |
| (JSC::functionReturnTypeFor): |
| (JSC::functionHasBasicBlockExecuted): |
| (JSC::functionBasicBlockExecutionCount): |
| * wasm/js/JSWebAssemblyHelpers.h: |
| (JSC::getWasmBufferFromValue): |
| * wasm/js/JSWebAssemblyInstance.cpp: |
| (JSC::JSWebAssemblyInstance::create): |
| * wasm/js/WebAssemblyFunction.cpp: |
| (JSC::callWebAssemblyFunction): |
| * wasm/js/WebAssemblyInstanceConstructor.cpp: |
| (JSC::constructJSWebAssemblyInstance): |
| * wasm/js/WebAssemblyModuleRecord.cpp: |
| (JSC::WebAssemblyModuleRecord::link): |
| * wasm/js/WebAssemblyPrototype.cpp: |
| (JSC::webAssemblyInstantiateFunc): |
| (JSC::webAssemblyInstantiateStreamingInternal): |
| * wasm/js/WebAssemblyWrapperFunction.cpp: |
| (JSC::WebAssemblyWrapperFunction::finishCreation): |
| |
| 2018-05-15 Devin Rousso <webkit@devinrousso.com> |
| |
| Web Inspector: Add rulers and guides |
| https://bugs.webkit.org/show_bug.cgi?id=32263 |
| <rdar://problem/19281564> |
| |
| Reviewed by Matt Baker. |
| |
| * inspector/protocol/OverlayTypes.json: |
| |
| 2018-05-14 Keith Miller <keith_miller@apple.com> |
| |
| Remove butterflyMask from DFGAbstractHeap |
| https://bugs.webkit.org/show_bug.cgi?id=185640 |
| |
| Reviewed by Saam Barati. |
| |
| We don't have a butterfly indexing mask anymore so we don't need |
| the abstract heap information for it anymore. |
| |
| * dfg/DFGAbstractHeap.h: |
| * dfg/DFGClobberize.h: |
| (JSC::DFG::clobberize): |
| |
| 2018-05-14 Andy VanWagoner <andy@vanwagoner.family> |
| |
| [INTL] Handle error in defineProperty for supported locales length |
| https://bugs.webkit.org/show_bug.cgi?id=185623 |
| |
| Reviewed by Saam Barati. |
| |
| Adds the missing RETURN_IF_EXCEPTION after defineOwnProperty for the |
| length of the supported locales array. |
| |
| * runtime/IntlObject.cpp: |
| (JSC::supportedLocales): |
| |
| 2018-05-14 Yusuke Suzuki <utatane.tea@gmail.com> |
| |
| [JSC] Tweak LiteralParser to improve lexing performance |
| https://bugs.webkit.org/show_bug.cgi?id=185541 |
| |
| Reviewed by Saam Barati. |
| |
| This patch attemps to improve LiteralParser performance. |
| |
| This patch improves Kraken/json-parse-financial by roughly ~10%. |
| baseline patched |
| |
| json-parse-financial 65.810+-1.591 ^ 59.943+-1.784 ^ definitely 1.0979x faster |
| |
| * parser/Lexer.cpp: |
| (JSC::Lexer<T>::Lexer): |
| * runtime/ArgList.h: |
| (JSC::MarkedArgumentBuffer::takeLast): |
| Add takeLast() for idiomatic last() + removeLast() calls. |
| |
| * runtime/LiteralParser.cpp: |
| (JSC::LiteralParser<CharType>::Lexer::lex): |
| Do not have mode in its template parameter. While lex function is large, this mode is not used in a critical path. |
| We should not include this mode in its template parameter to reduce the code size. |
| And we do not use template parameter for a terminator since duplicating ' and " code for lexString is not good. |
| Also, we construct TokenType table to remove bunch of unnecessary switch cases. |
| |
| (JSC::LiteralParser<CharType>::Lexer::next): |
| (JSC::isSafeStringCharacter): |
| Take mode in its template parameter. But do not take terminator character in its template parameter. |
| |
| (JSC::LiteralParser<CharType>::Lexer::lexString): |
| (JSC::LiteralParser<CharType>::Lexer::lexStringSlow): |
| Duplicate while statements manually since this is a critical path. |
| |
| (JSC::LiteralParser<CharType>::parse): |
| Use takeLast(). |
| |
| * runtime/LiteralParser.h: |
| |
| 2018-05-14 Dominik Infuehr <dinfuehr@igalia.com> |
| |
| [MIPS] Use btpz to compare against 0 instead of bpeq |
| https://bugs.webkit.org/show_bug.cgi?id=185607 |
| |
| Reviewed by Yusuke Suzuki. |
| |
| Fixes build on MIPS since MIPS doesn't have an instruction to |
| compare a register against an immediate. Since the immediate is just 0 |
| in this case the simplest solution is just to use btpz instead of bpeq |
| to compare to 0. |
| |
| * llint/LowLevelInterpreter.asm: |
| |
| 2018-05-12 Filip Pizlo <fpizlo@apple.com> |
| |
| CachedCall::call() should be faster |
| https://bugs.webkit.org/show_bug.cgi?id=185583 |
| |
| Reviewed by Yusuke Suzuki. |
| |
| CachedCall is an optimization for String.prototype.replace(r, f) where f is a function. |
| Unfortunately, because of a combination of abstraction and assertions, this code path had a |
| lot of overhead. This patch reduces this overhead by: |
| |
| - Turning off some assertions. These assertions don't look to have security value; they're |
| mostly for sanity. I turned off stack alignment checks and VM state checks having to do |
| with whether the JSLock is held. The JSLock checks are not relevant when doing a cached |
| call, considering that the caller would have already been strongly assuming that the JSLock |
| is held. |
| |
| - Making more things inlineable. |
| |
| This looks like a small (4% ish) speed-up on SunSpider/string-unpack-code. |
| |
| * JavaScriptCore.xcodeproj/project.pbxproj: |
| * interpreter/CachedCall.h: |
| (JSC::CachedCall::call): |
| * interpreter/Interpreter.cpp: |
| (JSC::checkedReturn): Deleted. |
| * interpreter/Interpreter.h: |
| (JSC::Interpreter::checkedReturn): |
| * interpreter/InterpreterInlines.h: |
| (JSC::Interpreter::execute): |
| * jit/JITCode.cpp: |
| (JSC::JITCode::execute): Deleted. |
| * jit/JITCodeInlines.h: Added. |
| (JSC::JITCode::execute): |
| * llint/LowLevelInterpreter.asm: |
| * runtime/StringPrototype.cpp: |
| |
| 2018-05-13 Andy VanWagoner <andy@vanwagoner.family> |
| |
| [INTL] Improve spec & test262 compliance for Intl APIs |
| https://bugs.webkit.org/show_bug.cgi?id=185578 |
| |
| Reviewed by Yusuke Suzuki. |
| |
| Use putDirectIndex over push for lists to arrays. |
| Update default options to construct with a null prototype. |
| Define constructor and toStringTag on prototypes. |
| Add proper time clipping. |
| Remove some outdated comment spec text, use url instead. |
| |
| * runtime/IntlCollator.cpp: |
| (JSC::IntlCollator::initializeCollator): |
| * runtime/IntlCollatorConstructor.cpp: |
| (JSC::IntlCollatorConstructor::finishCreation): |
| * runtime/IntlCollatorPrototype.cpp: |
| (JSC::IntlCollatorPrototype::finishCreation): |
| * runtime/IntlDateTimeFormatConstructor.cpp: |
| (JSC::IntlDateTimeFormatConstructor::finishCreation): |
| * runtime/IntlDateTimeFormatPrototype.cpp: |
| (JSC::IntlDateTimeFormatPrototype::finishCreation): |
| (JSC::IntlDateTimeFormatFuncFormatDateTime): |
| (JSC::IntlDateTimeFormatPrototypeFuncFormatToParts): |
| * runtime/IntlNumberFormat.cpp: |
| (JSC::IntlNumberFormat::initializeNumberFormat): |
| * runtime/IntlNumberFormatConstructor.cpp: |
| (JSC::IntlNumberFormatConstructor::finishCreation): |
| * runtime/IntlNumberFormatPrototype.cpp: |
| (JSC::IntlNumberFormatPrototype::finishCreation): |
| * runtime/IntlObject.cpp: |
| (JSC::lookupSupportedLocales): |
| (JSC::supportedLocales): |
| (JSC::intlObjectFuncGetCanonicalLocales): |
| * runtime/IntlPluralRules.cpp: |
| (JSC::IntlPluralRules::resolvedOptions): |
| * runtime/IntlPluralRulesConstructor.cpp: |
| (JSC::IntlPluralRulesConstructor::finishCreation): |
| |
| 2018-05-11 Caio Lima <ticaiolima@gmail.com> |
| |
| [ESNext][BigInt] Implement support for "*" operation |
| https://bugs.webkit.org/show_bug.cgi?id=183721 |
| |
| Reviewed by Yusuke Suzuki. |
| |
| Added BigInt support into times binary operator into LLInt and on |
| JITOperations profiledMul and unprofiledMul. We are also replacing all |
| uses of int to unsigned when there is no negative values for |
| variables. |
| |
| * dfg/DFGConstantFoldingPhase.cpp: |
| (JSC::DFG::ConstantFoldingPhase::foldConstants): |
| * jit/JITOperations.cpp: |
| * runtime/CommonSlowPaths.cpp: |
| (JSC::SLOW_PATH_DECL): |
| * runtime/JSBigInt.cpp: |
| (JSC::JSBigInt::JSBigInt): |
| (JSC::JSBigInt::allocationSize): |
| (JSC::JSBigInt::createWithLength): |
| (JSC::JSBigInt::toString): |
| (JSC::JSBigInt::multiply): |
| (JSC::JSBigInt::digitDiv): |
| (JSC::JSBigInt::internalMultiplyAdd): |
| (JSC::JSBigInt::multiplyAccumulate): |
| (JSC::JSBigInt::equals): |
| (JSC::JSBigInt::absoluteDivSmall): |
| (JSC::JSBigInt::calculateMaximumCharactersRequired): |
| (JSC::JSBigInt::toStringGeneric): |
| (JSC::JSBigInt::rightTrim): |
| (JSC::JSBigInt::allocateFor): |
| (JSC::JSBigInt::parseInt): |
| (JSC::JSBigInt::digit): |
| (JSC::JSBigInt::setDigit): |
| * runtime/JSBigInt.h: |
| * runtime/JSCJSValue.h: |
| * runtime/JSCJSValueInlines.h: |
| (JSC::JSValue::toNumeric const): |
| * runtime/Operations.h: |
| (JSC::jsMul): |
| |
| 2018-05-11 Commit Queue <commit-queue@webkit.org> |
| |
| Unreviewed, rolling out r231316 and r231332. |
| https://bugs.webkit.org/show_bug.cgi?id=185564 |
| |
| Appears to be a Speedometer2/MotionMark regression (Requested |
| by keith_miller on #webkit). |
| |
| Reverted changesets: |
| |
| "Remove the prototype caching for get_by_id in the LLInt" |
| https://bugs.webkit.org/show_bug.cgi?id=185226 |
| https://trac.webkit.org/changeset/231316 |
| |
| "Unreviewed, fix 32-bit profile offset for change in bytecode" |
| https://trac.webkit.org/changeset/231332 |
| |
| 2018-05-11 Michael Saboff <msaboff@apple.com> |
| |
| [DFG] Compiler uses incorrect output register for NumberIsInteger operation |
| https://bugs.webkit.org/show_bug.cgi?id=185328 |
| |
| Reviewed by Keith Miller. |
| |
| Fixed a typo from when this code was added in r228968 where resultGPR |
| was assigned the input register instead of the result.gpr(). |
| |
| * dfg/DFGSpeculativeJIT64.cpp: |
| (JSC::DFG::SpeculativeJIT::compile): |
| |
| 2018-05-11 Saam Barati <sbarati@apple.com> |
| |
| Don't use inferred types when the JIT is disabled |
| https://bugs.webkit.org/show_bug.cgi?id=185539 |
| |
| Reviewed by Yusuke Suzuki. |
| |
| There are many JSC API clients that run with the JIT disabled. They were |
| all allocating and tracking inferred types for no benefit. Inferred types |
| only benefit programs when they make it to the DFG/FTL. I was seeing cases |
| where the inferred type machinery used ~0.5MB. This patch makes is so we |
| don't allocate that machinery when the JIT is disabled. |
| |
| * runtime/Structure.cpp: |
| (JSC::Structure::willStoreValueSlow): |
| * runtime/Structure.h: |
| |
| 2018-05-11 Saam Barati <sbarati@apple.com> |
| |
| Don't allocate value profiles when the JIT is disabled |
| https://bugs.webkit.org/show_bug.cgi?id=185525 |
| |
| Reviewed by Michael Saboff. |
| |
| There are many JSC API clients that run with the JIT disabled. We were |
| still allocating a ton of value profiles in this use case even though |
| these clients get no benefit from doing value profiling. This patch makes |
| it so that we don't allocate value profiles or argument value profiles |
| when we're not using the JIT. We now just make all value profiles in |
| the instruction stream point to a global value profile that the VM owns. |
| And we make the argument value profile array have zero length and teach |
| the LLInt how to handle that. Heap clears the global value profile on each GC. |
| |
| In an app that I'm testing this against, this saves ~1MB of memory. |
| |
| * bytecode/CodeBlock.cpp: |
| (JSC::CodeBlock::finishCreation): |
| (JSC::CodeBlock::setNumParameters): |
| * bytecode/CodeBlock.h: |
| (JSC::CodeBlock::numberOfArgumentValueProfiles): |
| (JSC::CodeBlock::valueProfileForArgument): |
| * bytecompiler/BytecodeGenerator.cpp: |
| (JSC::BytecodeGenerator::emitProfiledOpcode): |
| * heap/Heap.cpp: |
| (JSC::Heap::runEndPhase): |
| * llint/LowLevelInterpreter.asm: |
| * runtime/VM.cpp: |
| (JSC::VM::VM): |
| * runtime/VM.h: |
| |
| 2018-05-10 Carlos Garcia Campos <cgarcia@igalia.com> |
| |
| [JSC][GLIB] Add introspectable alternatives to functions using vargars |
| https://bugs.webkit.org/show_bug.cgi?id=185508 |
| |
| Reviewed by Michael Catanzaro. |
| |
| * API/glib/JSCClass.cpp: |
| (jscClassCreateConstructor): |
| (jsc_class_add_constructor): |
| (jsc_class_add_constructorv): |
| (jscClassAddMethod): |
| (jsc_class_add_method): |
| (jsc_class_add_methodv): |
| * API/glib/JSCClass.h: |
| * API/glib/JSCValue.cpp: |
| (jsObjectCall): |
| (jscValueCallFunction): |
| (jsc_value_object_invoke_methodv): |
| (jscValueFunctionCreate): |
| (jsc_value_new_function): |
| (jsc_value_new_functionv): |
| (jsc_value_function_callv): |
| (jsc_value_constructor_callv): |
| * API/glib/JSCValue.h: |
| * API/glib/docs/jsc-glib-4.0-sections.txt: |
| |
| 2018-05-10 Yusuke Suzuki <utatane.tea@gmail.com> |
| |
| [JSC] Make return types of construction functions tight |
| https://bugs.webkit.org/show_bug.cgi?id=185509 |
| |
| Reviewed by Saam Barati. |
| |
| Array and Object construction functions should return strict types instead of returning JSObject*/JSValue. |
| |
| * runtime/ArrayConstructor.cpp: |
| (JSC::constructArrayWithSizeQuirk): |
| * runtime/ArrayConstructor.h: |
| * runtime/ObjectConstructor.h: |
| (JSC::constructEmptyObject): |
| |
| 2018-05-09 Yusuke Suzuki <utatane.tea@gmail.com> |
| |
| [JSC] Object.assign for final objects should be faster |
| https://bugs.webkit.org/show_bug.cgi?id=185348 |
| |
| Reviewed by Saam Barati. |
| |
| Object.assign is so heavily used to clone an object. For example, speedometer react-redux can be significantly |
| improved if Object.assign becomes fast. It is worth adding a complex fast path to accelerate the major use cases. |
| |
| If enumerating properties of source objects and putting properties to target object are non observable, |
| we can avoid hash table looking up of source object properties. We can enumerate object property entries, |
| and put them to target object. This patch adds this fast path to Object.assign implementation. |
| |
| When enumerating properties, we need to ensure that the given |source| object does not include "__proto__" |
| property since we cannot perform fast [[Put]] for the |target| object. We add a new flag |
| "HasUnderscoreProtoPropertyExcludingOriginalProto" to Structure to track this state. |
| |
| This improves object-assign.es6 by 1.85x. |
| |
| baseline patched |
| |
| object-assign.es6 368.6132+-8.3508 ^ 198.8775+-4.9042 ^ definitely 1.8535x faster |
| |
| And Speedometer2.0 React-Redux-TodoMVC's total time is improved from 490ms to 431ms. |
| |
| * runtime/JSObject.h: |
| * runtime/JSObjectInlines.h: |
| (JSC::JSObject::canPerformFastPutInlineExcludingProto): |
| (JSC::JSObject::canPerformFastPutInline): |
| * runtime/ObjectConstructor.cpp: |
| (JSC::objectConstructorAssign): |
| * runtime/Structure.cpp: |
| (JSC::Structure::Structure): |
| * runtime/Structure.h: |
| * runtime/StructureInlines.h: |
| (JSC::Structure::forEachProperty): |
| (JSC::Structure::add): |
| |
| 2018-05-10 Filip Pizlo <fpizlo@apple.com> |
| |
| DFG CFA should pick the right time to inject OSR entry data |
| https://bugs.webkit.org/show_bug.cgi?id=185530 |
| |
| Reviewed by Saam Barati. |
| |
| Previously, we would do a bonus run of CFA to inject OSR entry data. This patch makes us inject |
| OSR entry data as part of the normal flow of CFA, which reduces the total number of CFA |
| reexecutions while minimizing the likelihood that we have CFA execute constants in paths that |
| would eventually LUB to non-constant. |
| |
| This looks like almost a 1% speed-up on SunSpider-CompileTime. All of the logic for preventing |
| execution over constants is for V8Spider-CompileTime/regexp, which would otherwise do a lot of |
| useless regexp/string execution in the compiler. |
| |
| * dfg/DFGBlockSet.h: |
| (JSC::DFG::BlockSet::remove): |
| * dfg/DFGCFAPhase.cpp: |
| (JSC::DFG::CFAPhase::run): |
| (JSC::DFG::CFAPhase::injectOSR): |
| (JSC::DFG::CFAPhase::performBlockCFA): |
| |
| 2018-05-09 Filip Pizlo <fpizlo@apple.com> |
| |
| InPlaceAbstractState::beginBasicBlock shouldn't copy all m_variables every time |
| https://bugs.webkit.org/show_bug.cgi?id=185452 |
| |
| Reviewed by Michael Saboff. |
| |
| We were spending a lot of time in beginBasicBlock() just copying the state of all variables |
| from the block head to InPlaceAbstractState::m_variables. It is necessary for |
| InPlaceAbstractState to have its own copy since we need to mutate it separately from |
| block->valuesAtHead. But most variables are untouched by most basic blocks, so this was a lot |
| of superfluous work. |
| |
| This change adds a bitvector called m_activeVariables that tracks which variables have been |
| copied. We lazily copy the variables on first use. Variables that were never copied also have |
| a simplified merging path, which just needs to consider if the variable got clobbered between |
| head and tail. |
| |
| This is a 1.5% speed-up on SunSpider-CompileTime and a 1.7% speed-up on V8Spider-CompileTime. |
| |
| * bytecode/Operands.h: |
| (JSC::Operands::argumentIndex const): |
| (JSC::Operands::localIndex const): |
| (JSC::Operands::argument): |
| (JSC::Operands::argument const): |
| (JSC::Operands::local): |
| (JSC::Operands::local const): |
| (JSC::Operands::operandIndex const): |
| * dfg/DFGAbstractValue.h: |
| (JSC::DFG::AbstractValue::fastForwardFromTo): |
| * dfg/DFGCFAPhase.cpp: |
| (JSC::DFG::CFAPhase::performForwardCFA): |
| * dfg/DFGInPlaceAbstractState.cpp: |
| (JSC::DFG::InPlaceAbstractState::beginBasicBlock): |
| (JSC::DFG::InPlaceAbstractState::variablesForDebugging): |
| (JSC::DFG::InPlaceAbstractState::activateAllVariables): |
| (JSC::DFG::InPlaceAbstractState::endBasicBlock): |
| (JSC::DFG::InPlaceAbstractState::activateVariable): |
| (JSC::DFG::InPlaceAbstractState::mergeStateAtTail): Deleted. |
| * dfg/DFGInPlaceAbstractState.h: |
| (JSC::DFG::InPlaceAbstractState::variableAt): |
| (JSC::DFG::InPlaceAbstractState::operand): |
| (JSC::DFG::InPlaceAbstractState::local): |
| (JSC::DFG::InPlaceAbstractState::argument): |
| (JSC::DFG::InPlaceAbstractState::activateVariableIfNecessary): |
| (JSC::DFG::InPlaceAbstractState::variablesForDebugging): Deleted. |
| |
| 2018-05-09 Caio Lima <ticaiolima@gmail.com> |
| |
| [ESNext][BigInt] Implement support for "==" operation |
| https://bugs.webkit.org/show_bug.cgi?id=184474 |
| |
| Reviewed by Yusuke Suzuki. |
| |
| This patch is implementing support of BigInt for equals operator |
| following the spec semantics[1]. |
| |
| [1] - https://tc39.github.io/proposal-bigint/#sec-abstract-equality-comparison |
| |
| * runtime/JSBigInt.cpp: |
| (JSC::JSBigInt::parseInt): |
| (JSC::JSBigInt::stringToBigInt): |
| (JSC::JSBigInt::toString): |
| (JSC::JSBigInt::setDigit): |
| (JSC::JSBigInt::equalsToNumber): |
| (JSC::JSBigInt::compareToDouble): |
| * runtime/JSBigInt.h: |
| * runtime/JSCJSValueInlines.h: |
| (JSC::JSValue::equalSlowCaseInline): |
| |
| 2018-05-09 Filip Pizlo <fpizlo@apple.com> |
| |
| Speed up AbstractInterpreter::executeEdges |
| https://bugs.webkit.org/show_bug.cgi?id=185457 |
| |
| Reviewed by Saam Barati. |
| |
| This patch started out with the desire to make executeEdges() faster by making filtering faster. |
| However, when I studied the disassembly, I found that there are many opportunities for |
| improvement and I implemented all of them: |
| |
| - Filtering itself now has an inline fast path for when the filtering didn't change the value or |
| for non-cells. |
| |
| - Edge execution doesn't fast-forward anything if the filtering fast path would have succeeded, |
| since fast-forwarding is only interesting for cells and only if we have a clobbered value. |
| |
| - Similarly, edge verification doesn't need to fast-forward in the common case. |
| |
| - A bunch of stuff related to Graph::doToChildren is now inlined properly. |
| |
| - The edge doesn't even have to be considered for execution if it's UntypedUse. |
| |
| That last bit was the trickiest. We had gotten into a bad habit of using SpecFullNumber in the |
| abstract interpreter. It's not correct to use SpecFullNumber in the abstract interpreter, because |
| it means proving that the value could either be formatted as a double (with impure NaN values), |
| or as any JSValue, or as an Int52. There is no value that could possibly hold all of those |
| states. This "worked" before because UntypedUse would filter this down to SpecBytecodeNumber. To |
| make it work again, I needed to fix all of those uses of SpecFullNumber. In the future, we need |
| to be careful about picking either SpecFullDouble (if returning a DoubleRep) or |
| SpecBytecodeNumber (if returning a JSValueRep). |
| |
| But that fix revealed an amazing timeout in |
| stress/keep-checks-when-converting-to-lazy-js-constant-in-strength-reduction.js. We were getting |
| stuck in an OSR loop (baseline->DFG->FTL->baseline), all involving the same bytecode, without |
| ever realizing that we should jettison something. The problem was with how |
| triggerReoptimizationNow was getting the optimizedCodeBlock. It was trying to guess it by using |
| baselineCodeBlock->replacement(), but that's wrong for FTL-for-OSR-entry code blocks. |
| |
| This is a 1% improvement in V8Spider-CompileTime. |
| |
| * bytecode/ExitKind.cpp: |
| (JSC::exitKindMayJettison): |
| * dfg/DFGAbstractInterpreter.h: |
| (JSC::DFG::AbstractInterpreter::filterEdgeByUse): |
| (JSC::DFG::AbstractInterpreter::filterByType): Deleted. |
| * dfg/DFGAbstractInterpreterInlines.h: |
| (JSC::DFG::AbstractInterpreterExecuteEdgesFunc::AbstractInterpreterExecuteEdgesFunc): |
| (JSC::DFG::AbstractInterpreterExecuteEdgesFunc::operator() const): |
| (JSC::DFG::AbstractInterpreter<AbstractStateType>::executeEdges): |
| (JSC::DFG::AbstractInterpreter<AbstractStateType>::filterByType): |
| (JSC::DFG::AbstractInterpreter<AbstractStateType>::verifyEdge): |
| (JSC::DFG::AbstractInterpreter<AbstractStateType>::executeEffects): |
| (JSC::DFG::AbstractInterpreter<AbstractStateType>::executeDoubleUnaryOpEffects): |
| * dfg/DFGAbstractValue.cpp: |
| (JSC::DFG::AbstractValue::filterSlow): |
| (JSC::DFG::AbstractValue::fastForwardToAndFilterSlow): |
| * dfg/DFGAbstractValue.h: |
| (JSC::DFG::AbstractValue::filter): |
| (JSC::DFG::AbstractValue::fastForwardToAndFilter): |
| (JSC::DFG::AbstractValue::fastForwardToAndFilterUnproven): |
| (JSC::DFG::AbstractValue::makeTop): |
| * dfg/DFGAtTailAbstractState.h: |
| (JSC::DFG::AtTailAbstractState::fastForward): |
| (JSC::DFG::AtTailAbstractState::forNodeWithoutFastForward): |
| (JSC::DFG::AtTailAbstractState::fastForwardAndFilterUnproven): |
| * dfg/DFGGraph.h: |
| (JSC::DFG::Graph::doToChildren): |
| * dfg/DFGInPlaceAbstractState.h: |
| (JSC::DFG::InPlaceAbstractState::fastForward): |
| (JSC::DFG::InPlaceAbstractState::fastForwardAndFilterUnproven): |
| (JSC::DFG::InPlaceAbstractState::forNodeWithoutFastForward): |
| * dfg/DFGOSRExit.cpp: |
| (JSC::DFG::OSRExit::executeOSRExit): |
| * dfg/DFGOSRExitCompilerCommon.cpp: |
| (JSC::DFG::handleExitCounts): |
| * dfg/DFGOperations.cpp: |
| * dfg/DFGOperations.h: |
| |
| 2018-05-09 Saam Barati <sbarati@apple.com> |
| |
| Add JSVirtualMachine SPI to shrink the memory footprint of the VM |
| https://bugs.webkit.org/show_bug.cgi?id=185441 |
| <rdar://problem/39999414> |
| |
| Reviewed by Keith Miller. |
| |
| This patch adds JSVirtualMachine SPI to release as much memory as possible. |
| The SPI does: |
| - Deletes all code caches. |
| - Synchronous GC. |
| - Run the scavenger. |
| |
| * API/JSVirtualMachine.mm: |
| (-[JSVirtualMachine shrinkFootprint]): |
| * API/JSVirtualMachinePrivate.h: Added. |
| * API/tests/testapi.mm: |
| (testObjectiveCAPIMain): |
| * JavaScriptCore.xcodeproj/project.pbxproj: |
| * runtime/VM.cpp: |
| (JSC::VM::shrinkFootprint): |
| * runtime/VM.h: |
| |
| 2018-05-09 Leo Balter <leonardo.balter@gmail.com> |
| |
| [JSC] Fix ArraySpeciesCreate to return a new Array when the given object is not an array |
| Error found in the following Test262 tests: |
| |
| - test/built-ins/Array/prototype/slice/create-non-array-invalid-len.js |
| - test/built-ins/Array/prototype/slice/create-proxied-array-invalid-len.js |
| - test/built-ins/Array/prototype/splice/create-species-undef-invalid-len.js |
| |
| The ArraySpeciesCreate should throw a RangeError with non-Array custom objects |
| presenting a length > 2**32-1 |
| https://bugs.webkit.org/show_bug.cgi?id=185476 |
| |
| Reviewed by Yusuke Suzuki. |
| |
| * runtime/ArrayPrototype.cpp: |
| |
| 2018-05-09 Michael Catanzaro <mcatanzaro@igalia.com> |
| |
| [WPE] Build cleanly with GCC 8 and ICU 60 |
| https://bugs.webkit.org/show_bug.cgi?id=185462 |
| |
| Reviewed by Carlos Alberto Lopez Perez. |
| |
| * API/glib/JSCClass.cpp: Silence many -Wcast-function-type warnings. |
| (jsc_class_add_constructor): |
| (jsc_class_add_method): |
| * API/glib/JSCValue.cpp: Silence many -Wcast-function-type warnings. |
| (jsc_value_object_define_property_accessor): |
| (jsc_value_new_function): |
| * CMakeLists.txt: Build BuiltinNames.cpp with -fno-var-tracking-assignments. This was a |
| problem with GCC 7 too, but might as well fix it now. |
| * assembler/ProbeContext.h: |
| (JSC::Probe::CPUState::gpr const): Silence a -Wclass-memaccess warning. |
| (JSC::Probe::CPUState::spr const): Ditto. Assume std::remove_const is safe to clobber. |
| * b3/air/AirArg.h: |
| (JSC::B3::Air::Arg::isRepresentableAs): Silence -Wfallthrough warning. |
| * builtins/BuiltinNames.cpp: |
| (JSC::BuiltinNames::BuiltinNames): Moved from BuiltinNames.h so we can use a special flag. |
| * builtins/BuiltinNames.h: |
| (JSC::BuiltinNames::BuiltinNames): Moved to BuiltinNames.cpp. |
| * dfg/DFGDoubleFormatState.h: |
| (JSC::DFG::mergeDoubleFormatStates): Silence -Wfallthrough warnings. |
| * heap/MarkedBlockInlines.h: |
| (JSC::MarkedBlock::Handle::finishSweepKnowingHeapCellType): Silence -Wfallthrough warnings. |
| * runtime/ConfigFile.cpp: |
| (JSC::ConfigFile::canonicalizePaths): Here GCC found a genuine mistake, strncat is called |
| with the wrong length parameter and the result is not null-terminated. Also, silence a |
| -Wstringop-truncation warning as we intentionally truncate filenames that exceed PATH_MAX. |
| * runtime/IntlDateTimeFormat.cpp: |
| (JSC::IntlDateTimeFormat::partTypeString): Avoid an ICU deprecation warning. |
| * runtime/JSGlobalObject.cpp: |
| (JSC::JSGlobalObject::init): We were unconditionally running some BigInt code by accident. |
| (JSC::JSGlobalObject::visitChildren): Probably a serious bug? Fixed. |
| |
| 2018-05-09 Yusuke Suzuki <utatane.tea@gmail.com> |
| |
| [ARMv7] Drop ARMv7 disassembler in favor of capstone |
| https://bugs.webkit.org/show_bug.cgi?id=185423 |
| |
| Reviewed by Michael Catanzaro. |
| |
| This patch removes ARMv7Disassembler in our tree. |
| We already adopted Capstone, and it is already used in ARMv7 JIT environments. |
| |
| * CMakeLists.txt: |
| * JavaScriptCore.xcodeproj/project.pbxproj: |
| * Sources.txt: |
| * disassembler/ARMv7/ARMv7DOpcode.cpp: Removed. |
| * disassembler/ARMv7/ARMv7DOpcode.h: Removed. |
| * disassembler/ARMv7Disassembler.cpp: Removed. |
| |
| 2018-05-09 Srdjan Lazarevic <srdjan.lazarevic@rt-rk.com> |
| |
| [MIPS] Optimize generated JIT code using r2 |
| https://bugs.webkit.org/show_bug.cgi?id=184584 |
| |
| Reviewed by Yusuke Suzuki. |
| |
| EXT and MFHC1 instructions from MIPSR2 implemented and used where it is possible. |
| Also, done some code size optimizations that were discovered in meantime. |
| |
| * assembler/MIPSAssembler.h: |
| (JSC::MIPSAssembler::ext): |
| (JSC::MIPSAssembler::mfhc1): |
| * assembler/MacroAssemblerMIPS.cpp: |
| * assembler/MacroAssemblerMIPS.h: |
| (JSC::MacroAssemblerMIPS::isPowerOf2): |
| (JSC::MacroAssemblerMIPS::bitPosition): |
| (JSC::MacroAssemblerMIPS::loadAddress): |
| (JSC::MacroAssemblerMIPS::getEffectiveAddress): |
| (JSC::MacroAssemblerMIPS::load8): |
| (JSC::MacroAssemblerMIPS::load8SignedExtendTo32): |
| (JSC::MacroAssemblerMIPS::load32): |
| (JSC::MacroAssemblerMIPS::load16Unaligned): |
| (JSC::MacroAssemblerMIPS::load32WithUnalignedHalfWords): |
| (JSC::MacroAssemblerMIPS::load16): |
| (JSC::MacroAssemblerMIPS::load16SignedExtendTo32): |
| (JSC::MacroAssemblerMIPS::store8): |
| (JSC::MacroAssemblerMIPS::store16): |
| (JSC::MacroAssemblerMIPS::store32): |
| (JSC::MacroAssemblerMIPS::branchTest32): |
| (JSC::MacroAssemblerMIPS::loadFloat): |
| (JSC::MacroAssemblerMIPS::loadDouble): |
| (JSC::MacroAssemblerMIPS::storeFloat): |
| (JSC::MacroAssemblerMIPS::storeDouble): |
| |
| 2018-05-06 Yusuke Suzuki <utatane.tea@gmail.com> |
| |
| [JSC][GTK][JSCONLY] Use capstone disassembler |
| https://bugs.webkit.org/show_bug.cgi?id=185283 |
| |
| Reviewed by Michael Catanzaro. |
| |
| Instead of adding MIPS disassembler baked by ourselves, we import capstone disassembler. |
| And use capstone disassembler for MIPS, ARM, and ARMv7 in GTK, WPE, WinCairo and JSCOnly ports. |
| |
| And we remove ARM LLVM disassembler. |
| |
| Capstone is licensed under 3-clause BSD, which is acceptable in WebKit tree. |
| |
| * CMakeLists.txt: |
| * Sources.txt: |
| * disassembler/ARMLLVMDisassembler.cpp: Removed. |
| * disassembler/CapstoneDisassembler.cpp: Added. |
| (JSC::tryToDisassemble): |
| |
| 2018-05-09 Dominik Infuehr <dinfuehr@igalia.com> |
| |
| [MIPS] Use mfhc1 and mthc1 to fix assembler error |
| https://bugs.webkit.org/show_bug.cgi?id=185464 |
| |
| Reviewed by Yusuke Suzuki. |
| |
| The binutils-assembler started to report failures for copying words between |
| GP and FP registers for odd FP register indices. Use mfhc1 and mthc1 instead |
| of mfc1 and mtc1 for conversion. |
| |
| * offlineasm/mips.rb: |
| |
| 2018-05-08 Dominik Infuehr <dinfuehr@igalia.com> |
| |
| [MIPS] Collect callee-saved register using inline assembly |
| https://bugs.webkit.org/show_bug.cgi?id=185428 |
| |
| Reviewed by Yusuke Suzuki. |
| |
| MIPS used setjmp instead of collecting registers with inline assembly like |
| other architectures. |
| |
| * heap/RegisterState.h: |
| |
| 2018-05-07 Yusuke Suzuki <utatane.tea@gmail.com> |
| |
| [BigInt] Simplifying JSBigInt by using bool addition |
| https://bugs.webkit.org/show_bug.cgi?id=185374 |
| |
| Reviewed by Alex Christensen. |
| |
| Since using TWO_DIGIT does not produce good code, we remove this part from digitAdd and digitSub. |
| Just adding overflow flag to carry/borrow produces setb + add in x86. |
| |
| Also we annotate small helper functions and accessors with `inline` not to call these functions |
| inside internalMultiplyAdd loop. |
| |
| * runtime/JSBigInt.cpp: |
| (JSC::JSBigInt::isZero): |
| (JSC::JSBigInt::inplaceMultiplyAdd): |
| (JSC::JSBigInt::digitAdd): |
| (JSC::JSBigInt::digitSub): |
| (JSC::JSBigInt::digitMul): |
| (JSC::JSBigInt::digitPow): |
| (JSC::JSBigInt::digitDiv): |
| (JSC::JSBigInt::offsetOfData): |
| (JSC::JSBigInt::dataStorage): |
| (JSC::JSBigInt::digit): |
| (JSC::JSBigInt::setDigit): |
| |
| 2018-05-08 Michael Saboff <msaboff@apple.com> |
| |
| Replace multiple Watchpoint Set fireAll() methods with templates |
| https://bugs.webkit.org/show_bug.cgi?id=185456 |
| |
| Reviewed by Saam Barati. |
| |
| Refactored to minimize duplicate code. |
| |
| * bytecode/Watchpoint.h: |
| (JSC::WatchpointSet::fireAll): |
| (JSC::InlineWatchpointSet::fireAll): |
| |
| 2018-05-08 Filip Pizlo <fpizlo@apple.com> |
| |
| DFG::FlowMap::resize() shouldn't resize the shadow map unless we're in SSA |
| https://bugs.webkit.org/show_bug.cgi?id=185453 |
| |
| Reviewed by Michael Saboff. |
| |
| Tiny improvement for compile times. |
| |
| * dfg/DFGFlowMap.h: |
| (JSC::DFG::FlowMap::resize): Remove one Vector::resize() when we're not in SSA. |
| * dfg/DFGInPlaceAbstractState.cpp: |
| (JSC::DFG::InPlaceAbstractState::beginBasicBlock): Record some data about how long we spend in different parts of this and add a FIXME linking bug 185452. |
| |
| 2018-05-08 Michael Saboff <msaboff@apple.com> |
| |
| Deferred firing of structure transition watchpoints is racy |
| https://bugs.webkit.org/show_bug.cgi?id=185438 |
| |
| Reviewed by Saam Barati. |
| |
| Changed DeferredStructureTransitionWatchpointFire to take the watchpoints to fire |
| and fire them in the destructor. When the watchpoints are taken from the |
| original WatchpointSet, that WatchpointSet if marked invalid. |
| |
| * bytecode/Watchpoint.cpp: |
| (JSC::WatchpointSet::fireAllSlow): |
| (JSC::WatchpointSet::take): |
| (JSC::DeferredWatchpointFire::DeferredWatchpointFire): |
| (JSC::DeferredWatchpointFire::~DeferredWatchpointFire): |
| (JSC::DeferredWatchpointFire::fireAll): |
| (JSC::DeferredWatchpointFire::takeWatchpointsToFire): |
| * bytecode/Watchpoint.h: |
| (JSC::WatchpointSet::fireAll): |
| (JSC::InlineWatchpointSet::fireAll): |
| * runtime/JSObject.cpp: |
| (JSC::JSObject::setPrototypeDirect): |
| (JSC::JSObject::convertToDictionary): |
| * runtime/JSObjectInlines.h: |
| (JSC::JSObject::putDirectInternal): |
| * runtime/Structure.cpp: |
| (JSC::Structure::Structure): |
| (JSC::DeferredStructureTransitionWatchpointFire::DeferredStructureTransitionWatchpointFire): |
| (JSC::DeferredStructureTransitionWatchpointFire::~DeferredStructureTransitionWatchpointFire): |
| (JSC::DeferredStructureTransitionWatchpointFire::dump const): |
| (JSC::Structure::didTransitionFromThisStructure const): |
| (JSC::DeferredStructureTransitionWatchpointFire::add): Deleted. |
| * runtime/Structure.h: |
| (JSC::DeferredStructureTransitionWatchpointFire::structure const): |
| |
| 2018-05-08 Eric Carlson <eric.carlson@apple.com> |
| |
| Consecutive messages logged as JSON are coalesced |
| https://bugs.webkit.org/show_bug.cgi?id=185432 |
| |
| Reviewed by Joseph Pecoraro. |
| |
| * inspector/ConsoleMessage.cpp: |
| (Inspector::ConsoleMessage::isEqual const): Messages with JSON arguments are not equal. |
| |
| 2018-05-06 Filip Pizlo <fpizlo@apple.com> |
| |
| InPlaceAbstractState::beginBasicBlock shouldn't have to clear any abstract values |
| https://bugs.webkit.org/show_bug.cgi?id=185365 |
| |
| Reviewed by Saam Barati. |
| |
| This patch does three things to improve compile times: |
| |
| - Fixes some inlining goofs. |
| |
| - Adds the ability to measure compile times with run-jsc-benchmarks. |
| |
| - Dramatically improves the performance of InPlaceAbstractState::beginBasicBlock by removing the |
| code that clears abstract values. It turns out that on constant folding "needed" this, in the |
| sense that this was the only thing protecting it from loading the abstract value of a no-result |
| node and then concluding that because it had a non-empty m_value, it could be constant-folded. |
| Any node that produces a result will explicitly set its abstract value, so this problem can |
| also be guarded by just having constant folding check if the node it wants to fold returns any |
| result. |
| |
| Solid 0.96% compile time speed-up across SunSpider-CompileTime and V8Spider-CompileTime. |
| |
| Rolling back in after fixing cloop build. |
| |
| * dfg/DFGAbstractInterpreterInlines.h: |
| (JSC::DFG::AbstractInterpreter<AbstractStateType>::executeEffects): |
| * dfg/DFGAbstractValue.cpp: |
| (JSC::DFG::AbstractValue::set): |
| * dfg/DFGAbstractValue.h: |
| (JSC::DFG::AbstractValue::merge): |
| * dfg/DFGConstantFoldingPhase.cpp: |
| (JSC::DFG::ConstantFoldingPhase::foldConstants): |
| * dfg/DFGGraph.h: |
| (JSC::DFG::Graph::doToChildrenWithNode): |
| (JSC::DFG::Graph::doToChildren): |
| * dfg/DFGInPlaceAbstractState.cpp: |
| (JSC::DFG::InPlaceAbstractState::beginBasicBlock): |
| * jit/JIT.cpp: |
| (JSC::JIT::totalCompileTime): |
| * jit/JIT.h: |
| * jsc.cpp: |
| (GlobalObject::finishCreation): |
| (functionTotalCompileTime): |
| |
| 2018-05-08 Ryan Haddad <ryanhaddad@apple.com> |
| |
| Unreviewed, rolling out r231468. |
| |
| Broke the CLoop build |
| |
| Reverted changeset: |
| |
| "InPlaceAbstractState::beginBasicBlock shouldn't have to clear |
| any abstract values" |
| https://bugs.webkit.org/show_bug.cgi?id=185365 |
| https://trac.webkit.org/changeset/231468 |
| |
| 2018-05-07 Daniel Bates <dabates@apple.com> |
| |
| Check X-Frame-Options and CSP frame-ancestors in network process |
| https://bugs.webkit.org/show_bug.cgi?id=185410 |
| <rdar://problem/37733934> |
| |
| Reviewed by Ryosuke Niwa. |
| |
| Add enum traits for MessageSource and MessageLevel so that we can encode and decode them for IPC. |
| |
| * runtime/ConsoleTypes.h: |
| |
| 2018-05-07 Saam Barati <sbarati@apple.com> |
| |
| Make a compact version of VariableEnvironment that UnlinkedFunctionExecutable stores and hash-cons these compact environments as we make them |
| https://bugs.webkit.org/show_bug.cgi?id=185329 |
| <rdar://problem/39961536> |
| |
| Reviewed by Michael Saboff. |
| |
| I was made aware of a memory goof inside of JSC where we would inefficiently |
| use space to represent an UnlinkedFunctionExecutable's parent TDZ variables. |
| |
| We did two things badly: |
| 1. We used a HashMap instead of a Vector to represent the environment. Having |
| a HashMap is useful when looking things up when generating bytecode, but it's |
| space inefficient. Because UnlinkedFunctionExecutables live a long time because |
| of the code cache, we should have them store this information efficiently |
| inside of a Vector. |
| |
| 2. We didn't hash-cons these environments together. If you think about how |
| some programs are structured, hash-consing these together is hugely profitable. |
| Consider some code like this: |
| ``` |
| const/let V_1 = ...; |
| const/let V_2 = ...; |
| ... |
| const/let V_n = ...; |
| |
| function f_1() { ... }; |
| function f_2() { ... }; |
| ... |
| function f_n() { ... }; |
| ``` |
| |
| Each f_i would store an identical hash map for its parent TDZ variables |
| consisting of {V_1, ..., V_n}. This was incredibly dumb. With hash-consing, |
| each f_i just holds onto a reference to the environment. |
| |
| I benchmarked this change against an app that made heavy use of the |
| above code pattern and it reduced its peak memory footprint from ~220MB |
| to ~160MB. |
| |
| * bytecode/UnlinkedFunctionExecutable.cpp: |
| (JSC::generateUnlinkedFunctionCodeBlock): |
| (JSC::UnlinkedFunctionExecutable::UnlinkedFunctionExecutable): |
| * bytecode/UnlinkedFunctionExecutable.h: |
| * parser/VariableEnvironment.cpp: |
| (JSC::CompactVariableEnvironment::CompactVariableEnvironment): |
| (JSC::CompactVariableEnvironment::operator== const): |
| (JSC::CompactVariableEnvironment::toVariableEnvironment const): |
| (JSC::CompactVariableMap::get): |
| (JSC::CompactVariableMap::Handle::~Handle): |
| * parser/VariableEnvironment.h: |
| (JSC::VariableEnvironmentEntry::bits const): |
| (JSC::VariableEnvironmentEntry::operator== const): |
| (JSC::VariableEnvironment::isEverythingCaptured const): |
| (JSC::CompactVariableEnvironment::hash const): |
| (JSC::CompactVariableMapKey::CompactVariableMapKey): |
| (JSC::CompactVariableMapKey::hash): |
| (JSC::CompactVariableMapKey::equal): |
| (JSC::CompactVariableMapKey::makeDeletedValue): |
| (JSC::CompactVariableMapKey::isHashTableDeletedValue const): |
| (JSC::CompactVariableMapKey::isHashTableEmptyValue const): |
| (JSC::CompactVariableMapKey::environment): |
| (WTF::HashTraits<JSC::CompactVariableMapKey>::emptyValue): |
| (WTF::HashTraits<JSC::CompactVariableMapKey>::isEmptyValue): |
| (WTF::HashTraits<JSC::CompactVariableMapKey>::constructDeletedValue): |
| (WTF::HashTraits<JSC::CompactVariableMapKey>::isDeletedValue): |
| (JSC::CompactVariableMap::Handle::Handle): |
| (JSC::CompactVariableMap::Handle::environment const): |
| (JSC::VariableEnvironment::VariableEnvironment): Deleted. |
| * runtime/VM.cpp: |
| (JSC::VM::VM): |
| * runtime/VM.h: |
| |
| 2018-05-06 Yusuke Suzuki <utatane.tea@gmail.com> |
| |
| [DFG][MIPS] Simplify DFG code by increasing MIPS temporary registers |
| https://bugs.webkit.org/show_bug.cgi?id=185371 |
| |
| Reviewed by Mark Lam. |
| |
| Since MIPS GPRInfo claims it has only 7 registers, some of DFG code exhausts registers. |
| As a result, we need to maintain separated code for MIPS. This increases DFG maintenance burden, |
| but actually MIPS have much more registers. |
| |
| This patch adds $a0 - $a3 to temporary registers. This is OK since our temporary registers can be overlapped with |
| argument registers (see ARM, X86 implementations). These registers are caller-save ones, so we do not need to |
| have extra mechanism. |
| |
| Then, we remove several unnecessary MIPS code in our JIT infrastructure. |
| |
| * dfg/DFGByteCodeParser.cpp: |
| (JSC::DFG::ByteCodeParser::handleIntrinsicCall): |
| * dfg/DFGFixupPhase.cpp: |
| (JSC::DFG::FixupPhase::fixupNode): |
| * dfg/DFGSpeculativeJIT32_64.cpp: |
| (JSC::DFG::SpeculativeJIT::compile): |
| * jit/CCallHelpers.h: |
| * jit/GPRInfo.h: |
| (JSC::GPRInfo::toRegister): |
| (JSC::GPRInfo::toIndex): |
| * offlineasm/mips.rb: |
| |
| 2018-05-05 Filip Pizlo <fpizlo@apple.com> |
| |
| DFG AI should have O(1) clobbering |
| https://bugs.webkit.org/show_bug.cgi?id=185287 |
| |
| Reviewed by Saam Barati. |
| |
| This fixes an old scalability probem in AI. Previously, if we did clobberWorld(), then we |
| would traverse all of the state available to the AI at that time and clobber it. |
| |
| This changes clobberWorld() to be O(1). It just does some math to a clobber epoch. |
| |
| This is a ~1% speed-up for compile times. |
| |
| * JavaScriptCore.xcodeproj/project.pbxproj: |
| * Sources.txt: |
| * dfg/DFGAbstractInterpreter.h: |
| (JSC::DFG::AbstractInterpreter::forNode): |
| (JSC::DFG::AbstractInterpreter::setForNode): |
| (JSC::DFG::AbstractInterpreter::clearForNode): |
| (JSC::DFG::AbstractInterpreter::variables): Deleted. |
| * dfg/DFGAbstractInterpreterInlines.h: |
| (JSC::DFG::AbstractInterpreter<AbstractStateType>::executeEffects): |
| (JSC::DFG::AbstractInterpreter<AbstractStateType>::clobberWorld): |
| (JSC::DFG::AbstractInterpreter<AbstractStateType>::forAllValues): |
| (JSC::DFG::AbstractInterpreter<AbstractStateType>::clobberStructures): |
| (JSC::DFG::AbstractInterpreter<AbstractStateType>::executeDoubleUnaryOpEffects): |
| * dfg/DFGAbstractValue.cpp: |
| (JSC::DFG::AbstractValue::fastForwardToSlow): |
| * dfg/DFGAbstractValue.h: |
| (JSC::DFG::AbstractValue::fastForwardTo): |
| (JSC::DFG::AbstractValue::clobberStructuresFor): Deleted. |
| (JSC::DFG::AbstractValue::observeInvalidationPoint): Deleted. |
| (JSC::DFG::AbstractValue::observeInvalidationPointFor): Deleted. |
| * dfg/DFGAbstractValueClobberEpoch.cpp: Added. |
| (JSC::DFG::AbstractValueClobberEpoch::dump const): |
| * dfg/DFGAbstractValueClobberEpoch.h: Added. |
| (JSC::DFG::AbstractValueClobberEpoch::AbstractValueClobberEpoch): |
| (JSC::DFG::AbstractValueClobberEpoch::first): |
| (JSC::DFG::AbstractValueClobberEpoch::clobber): |
| (JSC::DFG::AbstractValueClobberEpoch::observeInvalidationPoint): |
| (JSC::DFG::AbstractValueClobberEpoch::operator== const): |
| (JSC::DFG::AbstractValueClobberEpoch::operator!= const): |
| (JSC::DFG::AbstractValueClobberEpoch::structureClobberState const): |
| (JSC::DFG::AbstractValueClobberEpoch::clobberEpoch const): |
| * dfg/DFGAtTailAbstractState.h: |
| (JSC::DFG::AtTailAbstractState::setForNode): |
| (JSC::DFG::AtTailAbstractState::clearForNode): |
| (JSC::DFG::AtTailAbstractState::numberOfArguments const): |
| (JSC::DFG::AtTailAbstractState::numberOfLocals const): |
| (JSC::DFG::AtTailAbstractState::operand): |
| (JSC::DFG::AtTailAbstractState::local): |
| (JSC::DFG::AtTailAbstractState::argument): |
| (JSC::DFG::AtTailAbstractState::clobberStructures): |
| (JSC::DFG::AtTailAbstractState::observeInvalidationPoint): |
| (JSC::DFG::AtTailAbstractState::variables): Deleted. |
| * dfg/DFGCFAPhase.cpp: |
| (JSC::DFG::CFAPhase::performBlockCFA): |
| * dfg/DFGConstantFoldingPhase.cpp: |
| (JSC::DFG::ConstantFoldingPhase::foldConstants): |
| * dfg/DFGFlowMap.h: |
| (JSC::DFG::FlowMap::at): |
| (JSC::DFG::FlowMap::atShadow): |
| (JSC::DFG::FlowMap::at const): |
| (JSC::DFG::FlowMap::atShadow const): |
| * dfg/DFGInPlaceAbstractState.cpp: |
| (JSC::DFG::InPlaceAbstractState::beginBasicBlock): |
| (JSC::DFG::InPlaceAbstractState::endBasicBlock): |
| * dfg/DFGInPlaceAbstractState.h: |
| (JSC::DFG::InPlaceAbstractState::forNode): |
| (JSC::DFG::InPlaceAbstractState::setForNode): |
| (JSC::DFG::InPlaceAbstractState::clearForNode): |
| (JSC::DFG::InPlaceAbstractState::variablesForDebugging): |
| (JSC::DFG::InPlaceAbstractState::numberOfArguments const): |
| (JSC::DFG::InPlaceAbstractState::numberOfLocals const): |
| (JSC::DFG::InPlaceAbstractState::operand): |
| (JSC::DFG::InPlaceAbstractState::local): |
| (JSC::DFG::InPlaceAbstractState::argument): |
| (JSC::DFG::InPlaceAbstractState::variableAt): |
| (JSC::DFG::InPlaceAbstractState::clobberStructures): |
| (JSC::DFG::InPlaceAbstractState::observeInvalidationPoint): |
| (JSC::DFG::InPlaceAbstractState::fastForward): |
| (JSC::DFG::InPlaceAbstractState::variables): Deleted. |
| * dfg/DFGSpeculativeJIT64.cpp: |
| (JSC::DFG::SpeculativeJIT::compile): |
| * ftl/FTLLowerDFGToB3.cpp: |
| (JSC::FTL::DFG::LowerDFGToB3::compileGetStack): |
| |
| 2018-05-06 Filip Pizlo <fpizlo@apple.com> |
| |
| InPlaceAbstractState::beginBasicBlock shouldn't have to clear any abstract values |
| https://bugs.webkit.org/show_bug.cgi?id=185365 |
| |
| Reviewed by Saam Barati. |
| |
| This patch does three things to improve compile times: |
| |
| - Fixes some inlining goofs. |
| |
| - Adds the ability to measure compile times with run-jsc-benchmarks. |
| |
| - Dramatically improves the performance of InPlaceAbstractState::beginBasicBlock by removing the |
| code that clears abstract values. It turns out that on constant folding "needed" this, in the |
| sense that this was the only thing protecting it from loading the abstract value of a no-result |
| node and then concluding that because it had a non-empty m_value, it could be constant-folded. |
| Any node that produces a result will explicitly set its abstract value, so this problem can |
| also be guarded by just having constant folding check if the node it wants to fold returns any |
| result. |
| |
| Solid 0.96% compile time speed-up across SunSpider-CompileTime and V8Spider-CompileTime. |
| |
| * dfg/DFGAbstractInterpreterInlines.h: |
| (JSC::DFG::AbstractInterpreter<AbstractStateType>::executeEffects): |
| * dfg/DFGAbstractValue.cpp: |
| (JSC::DFG::AbstractValue::set): |
| * dfg/DFGAbstractValue.h: |
| (JSC::DFG::AbstractValue::merge): |
| * dfg/DFGConstantFoldingPhase.cpp: |
| (JSC::DFG::ConstantFoldingPhase::foldConstants): |
| * dfg/DFGGraph.h: |
| (JSC::DFG::Graph::doToChildrenWithNode): |
| (JSC::DFG::Graph::doToChildren): |
| * dfg/DFGInPlaceAbstractState.cpp: |
| (JSC::DFG::InPlaceAbstractState::beginBasicBlock): |
| * jit/JIT.cpp: |
| (JSC::JIT::totalCompileTime): |
| * jit/JIT.h: |
| * jsc.cpp: |
| (GlobalObject::finishCreation): |
| (functionTotalCompileTime): |
| |
| 2018-05-05 Filip Pizlo <fpizlo@apple.com> |
| |
| DFG AI doesn't need to merge valuesAtTail - it can just assign them |
| https://bugs.webkit.org/show_bug.cgi?id=185355 |
| |
| Reviewed by Mark Lam. |
| |
| This is a further attempt to improve compile times. Assigning AbstractValue ought to always |
| be faster than merging. There's no need to merge valuesAtTail. In most cases, assigning and |
| merging will get the same answer because the value computed this time will be either the same |
| as or more general than the value computed last time. If the value does change for some |
| reason, then valuesAtHead are already merged, which ensures monotonicity. Also, if the value |
| changes, then we have no reason to believe that this new value is less right than the last |
| one we computed. Finally, the one client of valuesAtTail (AtTailAbstractState) doesn't care |
| if it's getting the merged valuesAtTail or just some correct answer for valuesAtTail. |
| |
| * dfg/DFGInPlaceAbstractState.cpp: |
| (JSC::DFG::InPlaceAbstractState::endBasicBlock): |
| |
| 2018-05-07 Andy VanWagoner <andy@vanwagoner.family> |
| |
| Remove defunct email address |
| https://bugs.webkit.org/show_bug.cgi?id=185396 |
| |
| Reviewed by Mark Lam. |
| |
| The email address thetalecrafter@gmail.com is no longer valid, as the |
| associated google account has been closed. This updates the email |
| address so questions about these Intl contributions go to the right |
| place. |
| |
| * builtins/DatePrototype.js: |
| * builtins/NumberPrototype.js: |
| * builtins/StringPrototype.js: |
| * runtime/IntlCollator.cpp: |
| * runtime/IntlCollator.h: |
| * runtime/IntlCollatorConstructor.cpp: |
| * runtime/IntlCollatorConstructor.h: |
| * runtime/IntlCollatorPrototype.cpp: |
| * runtime/IntlCollatorPrototype.h: |
| * runtime/IntlDateTimeFormat.cpp: |
| * runtime/IntlDateTimeFormat.h: |
| * runtime/IntlDateTimeFormatConstructor.cpp: |
| * runtime/IntlDateTimeFormatConstructor.h: |
| * runtime/IntlDateTimeFormatPrototype.cpp: |
| * runtime/IntlDateTimeFormatPrototype.h: |
| * runtime/IntlNumberFormat.cpp: |
| * runtime/IntlNumberFormat.h: |
| * runtime/IntlNumberFormatConstructor.cpp: |
| * runtime/IntlNumberFormatConstructor.h: |
| * runtime/IntlNumberFormatPrototype.cpp: |
| * runtime/IntlNumberFormatPrototype.h: |
| * runtime/IntlObject.cpp: |
| * runtime/IntlObject.h: |
| * runtime/IntlPluralRules.cpp: |
| * runtime/IntlPluralRules.h: |
| * runtime/IntlPluralRulesConstructor.cpp: |
| * runtime/IntlPluralRulesConstructor.h: |
| * runtime/IntlPluralRulesPrototype.cpp: |
| * runtime/IntlPluralRulesPrototype.h: |
| |
| 2018-05-06 Yusuke Suzuki <utatane.tea@gmail.com> |
| |
| [JSC] Remove "using namespace std;" from JSC, bmalloc, WTF |
| https://bugs.webkit.org/show_bug.cgi?id=185362 |
| |
| Reviewed by Sam Weinig. |
| |
| "namespace std" may include many names. It can conflict with names defined by our code, |
| and the other platform provided headers. For example, std::byte conflicts with Windows' |
| ::byte. |
| This patch removes "using namespace std;" from JSC and bmalloc. |
| |
| * API/JSClassRef.cpp: |
| (OpaqueJSClass::create): |
| * bytecode/Opcode.cpp: |
| * bytecompiler/BytecodeGenerator.cpp: |
| (JSC::BytecodeGenerator::newRegister): |
| * heap/Heap.cpp: |
| (JSC::Heap::updateAllocationLimits): |
| * interpreter/Interpreter.cpp: |
| * jit/JIT.cpp: |
| * parser/Parser.cpp: |
| * runtime/JSArray.cpp: |
| * runtime/JSLexicalEnvironment.cpp: |
| * runtime/JSModuleEnvironment.cpp: |
| * runtime/Structure.cpp: |
| * shell/DLLLauncherMain.cpp: |
| (getStringValue): |
| (applePathFromRegistry): |
| (appleApplicationSupportDirectory): |
| (copyEnvironmentVariable): |
| (prependPath): |
| (fatalError): |
| (directoryExists): |
| (modifyPath): |
| (getLastErrorString): |
| (wWinMain): |
| |
| 2018-05-05 Filip Pizlo <fpizlo@apple.com> |
| |
| DFG CFA phase should only do clobber asserts in debug |
| https://bugs.webkit.org/show_bug.cgi?id=185354 |
| |
| Reviewed by Saam Barati. |
| |
| Clobber asserts are responsible for 1% of compile time. That's too much. This disables them |
| unless asserts are enabled. |
| |
| * dfg/DFGCFAPhase.cpp: |
| (JSC::DFG::CFAPhase::performBlockCFA): |
| |
| 2018-05-04 Keith Miller <keith_miller@apple.com> |
| |
| isCacheableArrayLength should return true for undecided arrays |
| https://bugs.webkit.org/show_bug.cgi?id=185309 |
| |
| Reviewed by Michael Saboff. |
| |
| Undecided arrays have butterflies so there is no reason why we |
| should not be able to cache their length. |
| |
| * bytecode/InlineAccess.cpp: |
| (JSC::InlineAccess::isCacheableArrayLength): |
| |
| 2018-05-03 Yusuke Suzuki <utatane.tea@gmail.com> |
| |
| Remove std::random_shuffle |
| https://bugs.webkit.org/show_bug.cgi?id=185292 |
| |
| Reviewed by Darin Adler. |
| |
| std::random_shuffle is deprecated in C++14 and removed in C++17, |
| since std::random_shuffle relies on rand and srand. |
| Use std::shuffle instead. |
| |
| * jit/BinarySwitch.cpp: |
| (JSC::RandomNumberGenerator::RandomNumberGenerator): |
| (JSC::RandomNumberGenerator::operator()): |
| (JSC::RandomNumberGenerator::min): |
| (JSC::RandomNumberGenerator::max): |
| (JSC::BinarySwitch::build): |
| |
| 2018-05-03 Saam Barati <sbarati@apple.com> |
| |
| Don't prevent CreateThis being folded to NewObject when the structure is poly proto |
| https://bugs.webkit.org/show_bug.cgi?id=185177 |
| |
| Reviewed by Filip Pizlo. |
| |
| This patch teaches the DFG/FTL how to constant fold CreateThis with |
| a known poly proto Structure to NewObject. We do it by emitting a NewObject |
| followed by a PutByOffset for the prototype value. |
| |
| We make it so that ObjectAllocationProfile holds the prototype value. |
| This is sound because JSFunction clears that profile when its 'prototype' |
| field changes. |
| |
| This patch also renames underscoreProtoPrivateName to polyProtoName since |
| that name was nonsensical: it was only used for poly proto. |
| |
| This is a 2x speedup on the get_callee_polymorphic microbenchmark. I had |
| regressed that benchmark when I first introduced poly proto. |
| |
| * builtins/BuiltinNames.cpp: |
| * builtins/BuiltinNames.h: |
| (JSC::BuiltinNames::BuiltinNames): |
| (JSC::BuiltinNames::polyProtoName const): |
| (JSC::BuiltinNames::underscoreProtoPrivateName const): Deleted. |
| * bytecode/ObjectAllocationProfile.h: |
| (JSC::ObjectAllocationProfile::prototype): |
| (JSC::ObjectAllocationProfile::clear): |
| (JSC::ObjectAllocationProfile::visitAggregate): |
| * bytecode/ObjectAllocationProfileInlines.h: |
| (JSC::ObjectAllocationProfile::initializeProfile): |
| * dfg/DFGAbstractInterpreterInlines.h: |
| (JSC::DFG::AbstractInterpreter<AbstractStateType>::executeEffects): |
| * dfg/DFGByteCodeParser.cpp: |
| (JSC::DFG::ByteCodeParser::parseBlock): |
| * dfg/DFGConstantFoldingPhase.cpp: |
| (JSC::DFG::ConstantFoldingPhase::foldConstants): |
| * dfg/DFGOperations.cpp: |
| * runtime/CommonSlowPaths.cpp: |
| (JSC::SLOW_PATH_DECL): |
| * runtime/FunctionRareData.h: |
| * runtime/Structure.cpp: |
| (JSC::Structure::create): |
| |
| 2018-05-03 Michael Saboff <msaboff@apple.com> |
| |
| OSR entry pruning of Program Bytecodes doesn't take into account try/catch |
| https://bugs.webkit.org/show_bug.cgi?id=185281 |
| |
| Reviewed by Saam Barati. |
| |
| When we compute bytecode block reachability, we need to take into account blocks |
| containing try/catch. |
| |
| * jit/JIT.cpp: |
| (JSC::JIT::privateCompileMainPass): |
| |
| 2018-05-03 Dominik Infuehr <dinfuehr@igalia.com> |
| |
| ARM: Wrong offset for operand rt in disassembler |
| https://bugs.webkit.org/show_bug.cgi?id=184083 |
| |
| Reviewed by Yusuke Suzuki. |
| |
| * disassembler/ARMv7/ARMv7DOpcode.h: |
| (JSC::ARMv7Disassembler::ARMv7DOpcodeVMOVDoublePrecision::rt): |
| (JSC::ARMv7Disassembler::ARMv7DOpcodeVMOVSinglePrecision::rt): |
| |
| 2018-05-03 Dominik Infuehr <dinfuehr@igalia.com> |
| |
| ARM: Support vstr in disassembler |
| https://bugs.webkit.org/show_bug.cgi?id=184084 |
| |
| Reviewed by Yusuke Suzuki. |
| |
| * disassembler/ARMv7/ARMv7DOpcode.cpp: |
| (JSC::ARMv7Disassembler::ARMv7DOpcodeVLDRSTR::format): |
| (JSC::ARMv7Disassembler::ARMv7DOpcodeVLDR::format): Deleted. |
| * disassembler/ARMv7/ARMv7DOpcode.h: |
| (JSC::ARMv7Disassembler::ARMv7DOpcodeVLDRSTR::opName): |
| (JSC::ARMv7Disassembler::ARMv7DOpcodeVLDR::condition): Deleted. |
| (JSC::ARMv7Disassembler::ARMv7DOpcodeVLDR::uBit): Deleted. |
| (JSC::ARMv7Disassembler::ARMv7DOpcodeVLDR::rn): Deleted. |
| (JSC::ARMv7Disassembler::ARMv7DOpcodeVLDR::vd): Deleted. |
| (JSC::ARMv7Disassembler::ARMv7DOpcodeVLDR::doubleReg): Deleted. |
| (JSC::ARMv7Disassembler::ARMv7DOpcodeVLDR::immediate8): Deleted. |
| |
| 2018-05-03 Dominik Infuehr <dinfuehr@igalia.com> |
| |
| Invoke ensureArrayStorage for all arguments |
| https://bugs.webkit.org/show_bug.cgi?id=185247 |
| |
| Reviewed by Yusuke Suzuki. |
| |
| ensureArrayStorage was only invoked for first argument in each loop iteration. |
| |
| * jsc.cpp: |
| (functionEnsureArrayStorage): |
| |
| 2018-05-03 Filip Pizlo <fpizlo@apple.com> |
| |
| Make it easy to log compile times for all optimizing tiers |
| https://bugs.webkit.org/show_bug.cgi?id=185270 |
| |
| Reviewed by Keith Miller. |
| |
| This makes --logPhaseTimes=true enable logging of phase times for DFG and B3 using a common |
| helper class, CompilerTimingScope. This used to be called B3::TimingScope and only B3 used |
| it. |
| |
| This should help us reduce compile times by telling us where to look. So, far, it looks like |
| CFA is the worst. |
| |
| * JavaScriptCore.xcodeproj/project.pbxproj: |
| * Sources.txt: |
| * b3/B3Common.cpp: |
| (JSC::B3::shouldMeasurePhaseTiming): Deleted. |
| * b3/B3Common.h: |
| * b3/B3TimingScope.cpp: Removed. |
| * b3/B3TimingScope.h: |
| (JSC::B3::TimingScope::TimingScope): |
| * dfg/DFGPhase.h: |
| (JSC::DFG::runAndLog): |
| * dfg/DFGPlan.cpp: |
| (JSC::DFG::Plan::compileInThread): |
| * tools/CompilerTimingScope.cpp: Added. |
| (JSC::CompilerTimingScope::CompilerTimingScope): |
| (JSC::CompilerTimingScope::~CompilerTimingScope): |
| * tools/CompilerTimingScope.h: Added. |
| * runtime/Options.cpp: |
| (JSC::recomputeDependentOptions): |
| * runtime/Options.h: |
| |
| 2018-05-03 Filip Pizlo <fpizlo@apple.com> |
| |
| Strings should not be allocated in a gigacage |
| https://bugs.webkit.org/show_bug.cgi?id=185218 |
| |
| Reviewed by Saam Barati. |
| |
| * runtime/JSBigInt.cpp: |
| (JSC::JSBigInt::toStringGeneric): |
| * runtime/JSString.cpp: |
| (JSC::JSRopeString::resolveRopeToAtomicString const): |
| (JSC::JSRopeString::resolveRope const): |
| * runtime/JSString.h: |
| (JSC::JSString::create): |
| (JSC::JSString::createHasOtherOwner): |
| * runtime/VM.h: |
| (JSC::VM::gigacageAuxiliarySpace): |
| |
| 2018-05-03 Keith Miller <keith_miller@apple.com> |
| |
| Unreviewed, fix 32-bit profile offset for change in bytecode |
| length of the get_by_id and get_array_length opcodes. |
| |
| * llint/LowLevelInterpreter32_64.asm: |
| |
| 2018-05-03 Michael Saboff <msaboff@apple.com> |
| |
| WebContent crash loading page on seas.upenn.edu @ JavaScriptCore: vmEntryToJavaScript |
| https://bugs.webkit.org/show_bug.cgi?id=185231 |
| |
| Reviewed by Saam Barati. |
| |
| We weren't clearing the scratch register cache when switching back and forth between |
| allowing scratch register usage. We disallow scratch register usage when we are in |
| code that will freely allocate and use any register. Such usage can change the |
| contents of scratch registers. For ARM64, where we cache the contents of scratch |
| registers to reuse some or all of the contained values, we need to invalidate these |
| caches. We do this when re-enabling scratch register usage, that is when we transition |
| from disallow to allow scratch register usage. |
| |
| Added a new Air regression test. |
| |
| * assembler/AllowMacroScratchRegisterUsage.h: |
| (JSC::AllowMacroScratchRegisterUsage::AllowMacroScratchRegisterUsage): |
| * assembler/AllowMacroScratchRegisterUsageIf.h: |
| (JSC::AllowMacroScratchRegisterUsageIf::AllowMacroScratchRegisterUsageIf): |
| * assembler/DisallowMacroScratchRegisterUsage.h: |
| (JSC::DisallowMacroScratchRegisterUsage::~DisallowMacroScratchRegisterUsage): |
| * b3/air/testair.cpp: |
| |
| 2018-05-03 Keith Miller <keith_miller@apple.com> |
| |
| Remove the prototype caching for get_by_id in the LLInt |
| https://bugs.webkit.org/show_bug.cgi?id=185226 |
| |
| Reviewed by Michael Saboff. |
| |
| There is no evidence that this is actually a speedup and we keep |
| getting bugs with it. At this point it seems like we should just |
| remove this code. |
| |
| * CMakeLists.txt: |
| * JavaScriptCore.xcodeproj/project.pbxproj: |
| * Sources.txt: |
| * bytecode/BytecodeDumper.cpp: |
| (JSC::BytecodeDumper<Block>::printGetByIdOp): |
| (JSC::BytecodeDumper<Block>::printGetByIdCacheStatus): |
| (JSC::BytecodeDumper<Block>::dumpBytecode): |
| * bytecode/BytecodeList.json: |
| * bytecode/BytecodeUseDef.h: |
| (JSC::computeUsesForBytecodeOffset): |
| (JSC::computeDefsForBytecodeOffset): |
| * bytecode/CodeBlock.cpp: |
| (JSC::CodeBlock::finalizeLLIntInlineCaches): |
| * bytecode/CodeBlock.h: |
| (JSC::CodeBlock::llintGetByIdWatchpointMap): Deleted. |
| * bytecode/GetByIdStatus.cpp: |
| (JSC::GetByIdStatus::computeFromLLInt): |
| * bytecode/LLIntPrototypeLoadAdaptiveStructureWatchpoint.cpp: Removed. |
| * bytecode/LLIntPrototypeLoadAdaptiveStructureWatchpoint.h: Removed. |
| * bytecompiler/BytecodeGenerator.cpp: |
| (JSC::BytecodeGenerator::emitGetById): |
| * dfg/DFGByteCodeParser.cpp: |
| (JSC::DFG::ByteCodeParser::parseBlock): |
| * dfg/DFGCapabilities.cpp: |
| (JSC::DFG::capabilityLevel): |
| * jit/JIT.cpp: |
| (JSC::JIT::privateCompileMainPass): |
| (JSC::JIT::privateCompileSlowCases): |
| * llint/LLIntSlowPaths.cpp: |
| (JSC::LLInt::LLINT_SLOW_PATH_DECL): |
| (JSC::LLInt::setupGetByIdPrototypeCache): Deleted. |
| * llint/LowLevelInterpreter32_64.asm: |
| * llint/LowLevelInterpreter64.asm: |
| * runtime/Options.h: |
| |
| 2018-05-03 Ryan Haddad <ryanhaddad@apple.com> |
| |
| Unreviewed, rolling out r231197. |
| |
| The test added with this change crashes on the 32-bit JSC bot. |
| |
| Reverted changeset: |
| |
| "Correctly detect string overflow when using the 'Function' |
| constructor" |
| https://bugs.webkit.org/show_bug.cgi?id=184883 |
| https://trac.webkit.org/changeset/231197 |
| |
| 2018-05-03 Dominik Infuehr <dinfuehr@igalia.com> |
| |
| Disable usage of fused multiply-add instructions for JSC with compiler flag |
| https://bugs.webkit.org/show_bug.cgi?id=184909 |
| |
| Reviewed by Yusuke Suzuki. |
| |
| Adds -ffp-contract as compiler flag for building JSC. This ensures that functions |
| like parseInt() do not return slightly different results depending on whether the |
| compiler was able to use fused multiply-add instructions or not. |
| |
| * CMakeLists.txt: |
| |
| 2018-05-02 Yusuke Suzuki <utatane.tea@gmail.com> |
| |
| Unreviewed, fix build failure in ARM, ARMv7 and MIPS |
| https://bugs.webkit.org/show_bug.cgi?id=185192 |
| |
| compareDouble relies on MacroAssembler::invert function. |
| |
| * assembler/MacroAssembler.h: |
| (JSC::MacroAssembler::compareDouble): |
| * assembler/MacroAssemblerARM.h: |
| (JSC::MacroAssemblerARM::compareDouble): Deleted. |
| * assembler/MacroAssemblerARMv7.h: |
| (JSC::MacroAssemblerARMv7::compareDouble): Deleted. |
| * assembler/MacroAssemblerMIPS.h: |
| (JSC::MacroAssemblerMIPS::compareDouble): Deleted. |
| |
| 2018-05-02 Yusuke Suzuki <utatane.tea@gmail.com> |
| |
| [JSC] Add MacroAssembler::and16 and store16 |
| https://bugs.webkit.org/show_bug.cgi?id=185188 |
| |
| Reviewed by Mark Lam. |
| |
| r231129 requires and16(ImplicitAddress, RegisterID) and store16(RegisterID, ImplicitAddress) implementations. |
| This patch adds these methods for ARM. |
| |
| * assembler/MacroAssemblerARM.h: |
| (JSC::MacroAssemblerARM::and16): |
| (JSC::MacroAssemblerARM::store16): |
| |
| 2018-05-02 Yusuke Suzuki <utatane.tea@gmail.com> |
| |
| [DFG] Unify compare related code in 32bit and 64bit |
| https://bugs.webkit.org/show_bug.cgi?id=185189 |
| |
| Reviewed by Mark Lam. |
| |
| This patch unifies some part of compare related code in 32bit and 64bit |
| to reduce the size of 32bit specific DFG code. |
| |
| * dfg/DFGSpeculativeJIT.cpp: |
| (JSC::DFG::SpeculativeJIT::compileInt32Compare): |
| (JSC::DFG::SpeculativeJIT::compileDoubleCompare): |
| (JSC::DFG::SpeculativeJIT::compileObjectEquality): |
| * dfg/DFGSpeculativeJIT32_64.cpp: |
| (JSC::DFG::SpeculativeJIT::compileObjectEquality): Deleted. |
| (JSC::DFG::SpeculativeJIT::compileInt32Compare): Deleted. |
| (JSC::DFG::SpeculativeJIT::compileDoubleCompare): Deleted. |
| * dfg/DFGSpeculativeJIT64.cpp: |
| (JSC::DFG::SpeculativeJIT::compileObjectEquality): Deleted. |
| (JSC::DFG::SpeculativeJIT::compileInt32Compare): Deleted. |
| (JSC::DFG::SpeculativeJIT::compileDoubleCompare): Deleted. |
| |
| 2018-05-02 Yusuke Suzuki <utatane.tea@gmail.com> |
| |
| [JSC] Add compareDouble and compareFloat for ARM64, X86, and X86_64 |
| https://bugs.webkit.org/show_bug.cgi?id=185192 |
| |
| Reviewed by Mark Lam. |
| |
| Now Object.is starts using compareDouble. So we would like to have |
| efficient implementation for compareDouble and compareFloat for |
| major architectures, ARM64, X86, and X86_64. |
| |
| This patch adds compareDouble and compareFloat implementations for |
| these architectures. And generic implementation is moved to each |
| architecture's MacroAssembler implementation. |
| |
| We also add tests for them in testmasm. To implement this test |
| easily, we also add loadFloat(TrustedImmPtr, FPRegisterID) for the |
| major architectures. |
| |
| * assembler/MacroAssembler.h: |
| (JSC::MacroAssembler::compareDouble): Deleted. |
| (JSC::MacroAssembler::compareFloat): Deleted. |
| * assembler/MacroAssemblerARM.h: |
| (JSC::MacroAssemblerARM::compareDouble): |
| * assembler/MacroAssemblerARM64.h: |
| (JSC::MacroAssemblerARM64::compareDouble): |
| (JSC::MacroAssemblerARM64::compareFloat): |
| (JSC::MacroAssemblerARM64::loadFloat): |
| (JSC::MacroAssemblerARM64::floatingPointCompare): |
| * assembler/MacroAssemblerARMv7.h: |
| (JSC::MacroAssemblerARMv7::compareDouble): |
| * assembler/MacroAssemblerMIPS.h: |
| (JSC::MacroAssemblerMIPS::compareDouble): |
| * assembler/MacroAssemblerX86Common.h: |
| (JSC::MacroAssemblerX86Common::loadFloat): |
| (JSC::MacroAssemblerX86Common::compareDouble): |
| (JSC::MacroAssemblerX86Common::compareFloat): |
| (JSC::MacroAssemblerX86Common::floatingPointCompare): |
| * assembler/X86Assembler.h: |
| (JSC::X86Assembler::movss_mr): |
| (JSC::X86Assembler::movss_rm): |
| * assembler/testmasm.cpp: |
| (JSC::floatOperands): |
| (JSC::testCompareFloat): |
| (JSC::run): |
| |
| 2018-05-02 Yusuke Suzuki <utatane.tea@gmail.com> |
| |
| Unreviewed, fix 32bit DFG code |
| https://bugs.webkit.org/show_bug.cgi?id=185065 |
| |
| * dfg/DFGSpeculativeJIT.cpp: |
| (JSC::DFG::SpeculativeJIT::compileSameValue): |
| |
| 2018-05-02 Filip Pizlo <fpizlo@apple.com> |
| |
| JSC should know how to cache custom getter accesses on the prototype chain |
| https://bugs.webkit.org/show_bug.cgi?id=185213 |
| |
| Reviewed by Keith Miller. |
| |
| This was a simple fix after the work I did for bug 185174. >4x speed-up on the new get-custom-getter.js test. |
| |
| * jit/Repatch.cpp: |
| (JSC::tryCacheGetByID): |
| |
| 2018-05-01 Filip Pizlo <fpizlo@apple.com> |
| |
| JSC should be able to cache custom setter calls on the prototype chain |
| https://bugs.webkit.org/show_bug.cgi?id=185174 |
| |
| Reviewed by Saam Barati. |
| |
| We broke custom-setter-on-the-prototype-chain caching when we fixed a bug involving the conditionSet.isEmpty() |
| condition being used to determine if we have an alternateBase. The fix in r222671 incorrectly tried to add |
| impossible-to-validate conditions to the conditionSet by calling generateConditionsForPrototypePropertyHit() instead |
| of generateConditionsForPrototypePropertyHitCustom(). The problem is that the former function will always fail for |
| custom accessors because it won't find the custom property in the structure. |
| |
| The fix is to add a virtual hasAlternateBase() function and use that instead of conditionSet.isEmpty(). |
| |
| This is a 4x speed-up on assign-custom-setter.js. |
| |
| * bytecode/AccessCase.cpp: |
| (JSC::AccessCase::hasAlternateBase const): |
| (JSC::AccessCase::alternateBase const): |
| (JSC::AccessCase::generateImpl): |
| * bytecode/AccessCase.h: |
| (JSC::AccessCase::alternateBase const): Deleted. |
| * bytecode/GetterSetterAccessCase.cpp: |
| (JSC::GetterSetterAccessCase::hasAlternateBase const): |
| (JSC::GetterSetterAccessCase::alternateBase const): |
| * bytecode/GetterSetterAccessCase.h: |
| * bytecode/ObjectPropertyConditionSet.cpp: |
| (JSC::generateConditionsForPrototypePropertyHitCustom): |
| * bytecode/ObjectPropertyConditionSet.h: |
| * jit/Repatch.cpp: |
| (JSC::tryCacheGetByID): |
| (JSC::tryCachePutByID): |
| |
| 2018-05-02 Dominik Infuehr <dinfuehr@igalia.com> |
| |
| [MIPS] Implement and16 and store16 for MacroAssemblerMIPS |
| https://bugs.webkit.org/show_bug.cgi?id=185195 |
| |
| Reviewed by Mark Lam. |
| |
| This implements the given function for MIPS, such that it builds again. |
| |
| * assembler/MacroAssemblerMIPS.h: |
| (JSC::MacroAssemblerMIPS::and16): |
| (JSC::MacroAssemblerMIPS::store16): |
| |
| 2018-05-02 Rick Waldron <waldron.rick@gmail.com> |
| |
| Expose "$262.agent.monotonicNow()" for use in testing Atomic operation timeouts |
| https://bugs.webkit.org/show_bug.cgi?id=185043 |
| |
| Reviewed by Filip Pizlo. |
| |
| * jsc.cpp: |
| (GlobalObject::finishCreation): |
| (functionDollarAgentMonotonicNow): |
| |
| 2018-05-02 Dominik Infuehr <dinfuehr@igalia.com> |
| |
| [ARM] Implement and16 and store16 for MacroAssemblerARMv7 |
| https://bugs.webkit.org/show_bug.cgi?id=185196 |
| |
| Reviewed by Mark Lam. |
| |
| This implements and16 and store16 for MacroAssemblerARMv7 such that JSC builds again. |
| |
| * assembler/MacroAssemblerARMv7.h: |
| (JSC::MacroAssemblerARMv7::and16): |
| (JSC::MacroAssemblerARMv7::store16): |
| |
| 2018-05-02 Robin Morisset <rmorisset@apple.com> |
| |
| emitCodeToGetArgumentsArrayLength should not crash on PhantomNewArrayWithSpread |
| https://bugs.webkit.org/show_bug.cgi?id=183172 |
| |
| Reviewed by Filip Pizlo. |
| |
| DFGArgumentsEliminationPhase.cpp currently believes that allocations of NewArrayWithSpread can be deleted if they are only used by GetArrayLength, |
| but when it then calls emitCodeToGetArgumentsArrayLength, the latter has no idea what to do with GetArrayLength. |
| |
| I fix the problem by teaching emitCodeToGetArgumentsArrayLength how to deal with GetArrayLength. |
| Because this requires emitting an Add that can overflow and thus exit, we also tell DFGArgumentsEliminationPhase to give up on eliminating |
| a NewArrayWithSpread when it is used by a GetArrayLength that is not allowed to exit. |
| |
| * dfg/DFGArgumentsEliminationPhase.cpp: |
| * dfg/DFGArgumentsUtilities.cpp: |
| (JSC::DFG::emitCodeToGetArgumentsArrayLength): |
| |
| 2018-05-02 Yusuke Suzuki <utatane.tea@gmail.com> |
| |
| Unreviewed, stackPointer signature is different from declaration |
| https://bugs.webkit.org/show_bug.cgi?id=184790 |
| |
| * runtime/MachineContext.h: |
| (JSC::MachineContext::stackPointer): |
| |
| 2018-05-01 Yusuke Suzuki <utatane.tea@gmail.com> |
| |
| [JSC] Add SameValue DFG node |
| https://bugs.webkit.org/show_bug.cgi?id=185065 |
| |
| Reviewed by Saam Barati. |
| |
| This patch adds Object.is handling in DFG and FTL. Object.is is converted to SameValue DFG node. |
| And DFG fixup phase attempts to convert SameValue node to CompareStrictEq with type filter edges |
| if possible. Since SameValue(Untyped, Untyped) and SameValue(Double, Double) have different semantics |
| from CompareStrictEq, we do not convert SameValue to CompareStrictEq for them. DFG and FTL have |
| implementations for these SameValue nodes. |
| |
| This old MacroAssemblerX86Common::compareDouble was dead code since the derived class, "MacroAssembler" |
| has a generalized compareDouble, which just uses branchDouble. Since this was not used, this function |
| was broken. This patch fixes issues and move compareDouble to MacroAssemblerX86Common, and remove a |
| generalized compareDouble for x86 arch to use this specialized efficient version instead. The fixes are |
| correctly using set32 to zero-extending the result, and setting the initial value of `dest` register |
| correctly for DoubleEqual and DoubleNotEqualOrUnordered cases. |
| |
| Added microbenchmark shows performance improvement. |
| |
| object-is 651.0053+-38.8204 ^ 241.3467+-15.8753 ^ definitely 2.6974x faster |
| |
| * assembler/MacroAssembler.h: |
| * assembler/MacroAssemblerX86Common.h: |
| (JSC::MacroAssemblerX86Common::compareDouble): |
| * assembler/MacroAssemblerX86_64.h: |
| (JSC::MacroAssemblerX86_64::compareDouble): Deleted. |
| * assembler/testmasm.cpp: |
| (JSC::doubleOperands): |
| (JSC::testCompareDouble): |
| (JSC::run): |
| * dfg/DFGAbstractInterpreterInlines.h: |
| (JSC::DFG::AbstractInterpreter<AbstractStateType>::executeEffects): |
| * dfg/DFGByteCodeParser.cpp: |
| (JSC::DFG::ByteCodeParser::handleIntrinsicCall): |
| * dfg/DFGClobberize.h: |
| (JSC::DFG::clobberize): |
| * dfg/DFGConstantFoldingPhase.cpp: |
| (JSC::DFG::ConstantFoldingPhase::foldConstants): |
| * dfg/DFGDoesGC.cpp: |
| (JSC::DFG::doesGC): |
| * dfg/DFGFixupPhase.cpp: |
| (JSC::DFG::FixupPhase::fixupNode): |
| (JSC::DFG::FixupPhase::fixupCompareStrictEqAndSameValue): |
| * dfg/DFGNodeType.h: |
| * dfg/DFGOperations.cpp: |
| * dfg/DFGOperations.h: |
| * dfg/DFGPredictionPropagationPhase.cpp: |
| * dfg/DFGSafeToExecute.h: |
| (JSC::DFG::safeToExecute): |
| * dfg/DFGSpeculativeJIT.cpp: |
| (JSC::DFG::SpeculativeJIT::compileSameValue): |
| * dfg/DFGSpeculativeJIT.h: |
| * dfg/DFGSpeculativeJIT32_64.cpp: |
| (JSC::DFG::SpeculativeJIT::compile): |
| * dfg/DFGSpeculativeJIT64.cpp: |
| (JSC::DFG::SpeculativeJIT::compile): |
| * dfg/DFGValidate.cpp: |
| * ftl/FTLCapabilities.cpp: |
| (JSC::FTL::canCompile): |
| * ftl/FTLLowerDFGToB3.cpp: |
| (JSC::FTL::DFG::LowerDFGToB3::compileNode): |
| (JSC::FTL::DFG::LowerDFGToB3::compileSameValue): |
| * runtime/Intrinsic.cpp: |
| (JSC::intrinsicName): |
| * runtime/Intrinsic.h: |
| * runtime/ObjectConstructor.cpp: |
| |
| 2018-04-30 Filip Pizlo <fpizlo@apple.com> |
| |
| B3::demoteValues should be able to handle patchpoint terminals |
| https://bugs.webkit.org/show_bug.cgi?id=185151 |
| |
| Reviewed by Saam Barati. |
| |
| If we try to demote a patchpoint terminal then prior to this change we would append a Set to |
| the basic block that the patchpoint terminated. That's wrong because then the terminal is no |
| longer the last thing in the block. |
| |
| Air encounters this problem in spilling and solves it by doing a fixup afterwards. We can't |
| really do that because demotion happens as a prerequisite to other transformations. |
| |
| One solution might have been to make demoteValues insert a basic block whenever it encounters |
| this problem. But that would break clients that do CFG analysis before demoteValues and use |
| the results of the CFG analysis after demoteValues. Taildup does this. Fortunately, taildup |
| also runs breakCriticalEdges. Probably anyone using demoteValues will use breakCriticalEdges, |
| so it's not bad to introduce that requirement. |
| |
| So, this patch solves the problem by ensuring that breakCriticalEdges treats any patchpoint |
| terminal as if it had multiple successors. This means that a patchpoint terminal's successors |
| will only have it as their predecessor. Then, demoteValues just prepends the Set to the |
| successors of the patchpoint terminal. |
| |
| This was probably asymptomatic. It's hard to write a JS test that triggers this, so I added |
| a unit test in testb3. |
| |
| * b3/B3BreakCriticalEdges.cpp: |
| (JSC::B3::breakCriticalEdges): |
| * b3/B3BreakCriticalEdges.h: |
| * b3/B3FixSSA.cpp: |
| (JSC::B3::demoteValues): |
| (JSC::B3::fixSSA): |
| * b3/B3FixSSA.h: |
| * b3/B3Value.cpp: |
| (JSC::B3::Value::foldIdentity const): |
| (JSC::B3::Value::performSubstitution): |
| * b3/B3Value.h: |
| * b3/testb3.cpp: |
| (JSC::B3::testDemotePatchpointTerminal): |
| (JSC::B3::run): |
| |
| 2018-05-01 Robin Morisset <rmorisset@apple.com> |
| |
| Use CheckedArithmetic for length computation in JSArray::unshiftCountWithAnyIndexingType |
| https://bugs.webkit.org/show_bug.cgi?id=184772 |
| <rdar://problem/39146327> |
| |
| Reviewed by Filip Pizlo. |
| |
| Related to https://bugs.webkit.org/show_bug.cgi?id=183657 (<rdar://problem/38464399), where a check was missing. |
| This patch now makes sure that the check correctly detects if there is an integer overflow. |
| |
| * runtime/JSArray.cpp: |
| (JSC::JSArray::unshiftCountWithAnyIndexingType): |
| |
| 2018-05-01 Robin Morisset <rmorisset@apple.com> |
| |
| Correctly detect string overflow when using the 'Function' constructor |
| https://bugs.webkit.org/show_bug.cgi?id=184883 |
| <rdar://problem/36320331> |
| |
| Reviewed by Filip Pizlo. |
| |
| The 'Function' constructor creates a string containing the source code of the new function through repeated string concatenation. |
| Because there was no way for the string concatenation routines in WTF to return an error, they just crashed in that case. |
| |
| I added new tryAppend methods alongside the old append methods, that return a boolean (true means success, false means an overflow happened). |
| In this way, it becomes possible for the Function constructor to just throw a proper JS exception when asked to create a string > 4GB. |
| I made new methods instead of just adapting the existing ones (and reverted such a change on appendQuotedJSONString) so that callers that rely on the old behaviour (a hard CRASH() on overflow) don't silently start failing. |
| |
| * runtime/FunctionConstructor.cpp: |
| (JSC::constructFunctionSkippingEvalEnabledCheck): |
| * runtime/JSONObject.cpp: |
| (JSC::Stringifier::appendStringifiedValue): |
| |
| 2018-05-01 Robin Morisset <rmorisset@apple.com> |
| |
| IntlObject.cpp::removeUnicodeLocaleExtension() should not touch locales that end in '-u' |
| https://bugs.webkit.org/show_bug.cgi?id=185162 |
| |
| Reviewed by Filip Pizlo. |
| |
| * runtime/IntlObject.cpp: |
| (JSC::removeUnicodeLocaleExtension): |
| |
| 2018-05-01 Dominik Infuehr <dinfuehr@igalia.com> |
| |
| Add SetCallee as DFG-Operation |
| https://bugs.webkit.org/show_bug.cgi?id=184582 |
| |
| Reviewed by Filip Pizlo. |
| |
| For recursive tail calls not only the argument count can change but also the |
| callee. Add SetCallee to DFG that sets the callee slot in the current call frame. |
| Also update the callee when optimizing a recursive tail call. |
| Enable recursive tail call optimization also for closures. |
| |
| * dfg/DFGAbstractInterpreterInlines.h: |
| (JSC::DFG::AbstractInterpreter<AbstractStateType>::executeEffects): |
| * dfg/DFGByteCodeParser.cpp: |
| (JSC::DFG::ByteCodeParser::handleRecursiveTailCall): |
| (JSC::DFG::ByteCodeParser::handleCallVariant): |
| * dfg/DFGClobberize.h: |
| (JSC::DFG::clobberize): |
| * dfg/DFGDoesGC.cpp: |
| (JSC::DFG::doesGC): |
| * dfg/DFGFixupPhase.cpp: |
| (JSC::DFG::FixupPhase::fixupNode): |
| * dfg/DFGMayExit.cpp: |
| * dfg/DFGNodeType.h: |
| * dfg/DFGPredictionPropagationPhase.cpp: |
| * dfg/DFGSafeToExecute.h: |
| (JSC::DFG::safeToExecute): |
| * dfg/DFGSpeculativeJIT.cpp: |
| (JSC::DFG::SpeculativeJIT::compileSetCallee): |
| * 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::compileSetCallee): |
| |
| 2018-05-01 Oleksandr Skachkov <gskachkov@gmail.com> |
| |
| WebAssembly: add support for stream APIs - JavaScript API |
| https://bugs.webkit.org/show_bug.cgi?id=183442 |
| |
| Reviewed by Yusuke Suzuki and JF Bastien. |
| |
| Add WebAssembly stream API. Current patch only add functions |
| WebAssembly.compileStreaming and WebAssembly.instantiateStreaming but, |
| does not add streaming way of the implementation. So in current version it |
| only wait for load whole module, than start to parse. |
| |
| * CMakeLists.txt: |
| * Configurations/FeatureDefines.xcconfig: |
| * DerivedSources.make: |
| * JavaScriptCore.xcodeproj/project.pbxproj: |
| * builtins/BuiltinNames.h: |
| * builtins/WebAssemblyPrototype.js: Copied from Source/JavaScriptCore/wasm/js/WebAssemblyPrototype.h. |
| (compileStreaming): |
| (instantiateStreaming): |
| * jsc.cpp: |
| * runtime/JSGlobalObject.cpp: |
| (JSC::JSGlobalObject::init): |
| * runtime/JSGlobalObject.h: |
| * runtime/Options.h: |
| * runtime/PromiseDeferredTimer.cpp: |
| (JSC::PromiseDeferredTimer::hasPendingPromise): |
| (JSC::PromiseDeferredTimer::hasDependancyInPendingPromise): |
| * runtime/PromiseDeferredTimer.h: |
| * wasm/js/WebAssemblyPrototype.cpp: |
| (JSC::webAssemblyModuleValidateAsyncInternal): |
| (JSC::webAssemblyCompileFunc): |
| (JSC::WebAssemblyPrototype::webAssemblyModuleValidateAsync): |
| (JSC::webAssemblyModuleInstantinateAsyncInternal): |
| (JSC::WebAssemblyPrototype::webAssemblyModuleInstantinateAsync): |
| (JSC::webAssemblyCompileStreamingInternal): |
| (JSC::webAssemblyInstantiateStreamingInternal): |
| (JSC::WebAssemblyPrototype::create): |
| (JSC::WebAssemblyPrototype::finishCreation): |
| * wasm/js/WebAssemblyPrototype.h: |
| |
| 2018-04-30 Saam Barati <sbarati@apple.com> |
| |
| ToString constant folds without preserving checks, causing us to break assumptions that the code would OSR exit |
| https://bugs.webkit.org/show_bug.cgi?id=185149 |
| <rdar://problem/39455917> |
| |
| Reviewed by Filip Pizlo. |
| |
| The bug was that we were deleting checks that we shouldn't have deleted. |
| This patch makes a helper inside strength reduction that converts to |
| a LazyJSConstant while maintaining checks, and switches users of the |
| node API inside strength reduction to instead call the helper function. |
| |
| This patch also fixes a potential bug where StringReplace and |
| StringReplaceRegExp may not preserve all their checks. |
| |
| |
| * dfg/DFGStrengthReductionPhase.cpp: |
| (JSC::DFG::StrengthReductionPhase::handleNode): |
| (JSC::DFG::StrengthReductionPhase::convertToLazyJSValue): |
| |
| 2018-04-29 Filip Pizlo <fpizlo@apple.com> |
| |
| LICM shouldn't hoist nodes if hoisted nodes exited in that code block |
| https://bugs.webkit.org/show_bug.cgi?id=185126 |
| |
| Reviewed by Saam Barati. |
| |
| This change is just restoring functionality that we've already had for a while. It had been |
| accidentally broken due to an unrelated CodeBlock refactoring. |
| |
| * dfg/DFGLICMPhase.cpp: |
| (JSC::DFG::LICMPhase::attemptHoist): |
| |
| 2018-04-30 Mark Lam <mark.lam@apple.com> |
| |
| Apply PtrTags to the MetaAllocator and friends. |
| https://bugs.webkit.org/show_bug.cgi?id=185110 |
| <rdar://problem/39533895> |
| |
| Reviewed by Saam Barati. |
| |
| 1. LinkBuffer now takes a MacroAssemblerCodePtr instead of a void* pointer. |
| 2. Apply pointer tagging to the boundary pointers of the FixedExecutableMemoryPool, |
| and add a sanity check to verify that allocated code buffers are within those |
| bounds. |
| |
| * assembler/LinkBuffer.cpp: |
| (JSC::LinkBuffer::finalizeCodeWithoutDisassemblyImpl): |
| (JSC::LinkBuffer::copyCompactAndLinkCode): |
| (JSC::LinkBuffer::linkCode): |
| (JSC::LinkBuffer::allocate): |
| * assembler/LinkBuffer.h: |
| (JSC::LinkBuffer::LinkBuffer): |
| (JSC::LinkBuffer::debugAddress): |
| (JSC::LinkBuffer::code): |
| * assembler/MacroAssemblerCodeRef.h: |
| (JSC::MacroAssemblerCodeRef::MacroAssemblerCodeRef): |
| * bytecode/InlineAccess.cpp: |
| (JSC::linkCodeInline): |
| (JSC::InlineAccess::rewireStubAsJump): |
| * dfg/DFGJITCode.cpp: |
| (JSC::DFG::JITCode::findPC): |
| * ftl/FTLJITCode.cpp: |
| (JSC::FTL::JITCode::findPC): |
| * jit/ExecutableAllocator.cpp: |
| (JSC::FixedVMPoolExecutableAllocator::FixedVMPoolExecutableAllocator): |
| (JSC::FixedVMPoolExecutableAllocator::jitWriteThunkGenerator): |
| (JSC::ExecutableAllocator::allocate): |
| * jit/ExecutableAllocator.h: |
| (JSC::isJITPC): |
| (JSC::performJITMemcpy): |
| * jit/JIT.cpp: |
| (JSC::JIT::link): |
| * jit/JITMathIC.h: |
| (JSC::isProfileEmpty): |
| * runtime/JSCPtrTag.h: |
| * wasm/WasmCallee.cpp: |
| (JSC::Wasm::Callee::Callee): |
| * wasm/WasmFaultSignalHandler.cpp: |
| (JSC::Wasm::trapHandler): |
| |
| 2018-04-30 Keith Miller <keith_miller@apple.com> |
| |
| Move the MayBePrototype JSCell header bit to InlineTypeFlags |
| https://bugs.webkit.org/show_bug.cgi?id=185143 |
| |
| Reviewed by Mark Lam. |
| |
| * runtime/IndexingType.h: |
| * runtime/JSCellInlines.h: |
| (JSC::JSCell::setStructure): |
| (JSC::JSCell::mayBePrototype const): |
| (JSC::JSCell::didBecomePrototype): |
| * runtime/JSTypeInfo.h: |
| (JSC::TypeInfo::mayBePrototype): |
| (JSC::TypeInfo::mergeInlineTypeFlags): |
| |
| 2018-04-30 Keith Miller <keith_miller@apple.com> |
| |
| Remove unneeded exception check from String.fromCharCode |
| https://bugs.webkit.org/show_bug.cgi?id=185083 |
| |
| Reviewed by Mark Lam. |
| |
| * runtime/StringConstructor.cpp: |
| (JSC::stringFromCharCode): |
| |
| 2018-04-30 Keith Miller <keith_miller@apple.com> |
| |
| Move StructureIsImmortal to out of line flags. |
| https://bugs.webkit.org/show_bug.cgi?id=185101 |
| |
| Reviewed by Saam Barati. |
| |
| This will free up a bit in the inline flags where we can move the |
| isPrototype bit to. This will, in turn, free a bit for use in |
| implementing copy on write butterflies. |
| |
| Also, this patch removes an assertion from Structure::typeInfo() |
| that inadvertently makes the function invalid to call while |
| cleaning up the vm. |
| |
| * heap/HeapCellType.cpp: |
| (JSC::DefaultDestroyFunc::operator() const): |
| * runtime/JSCell.h: |
| * runtime/JSCellInlines.h: |
| (JSC::JSCell::callDestructor): Deleted. |
| * runtime/JSTypeInfo.h: |
| (JSC::TypeInfo::hasStaticPropertyTable): |
| (JSC::TypeInfo::structureIsImmortal const): |
| * runtime/Structure.h: |
| |
| 2018-04-30 Yusuke Suzuki <utatane.tea@gmail.com> |
| |
| [JSC] Remove arity fixup check if the number of parameters is 1 |
| https://bugs.webkit.org/show_bug.cgi?id=183984 |
| |
| Reviewed by Mark Lam. |
| |
| If the number of parameters is one (|this|), we never hit arity fixup check. |
| We do not need to emit arity fixup check code. |
| |
| * dfg/DFGDriver.cpp: |
| (JSC::DFG::compileImpl): |
| * dfg/DFGJITCompiler.cpp: |
| (JSC::DFG::JITCompiler::compileFunction): |
| * dfg/DFGJITCompiler.h: |
| * ftl/FTLLink.cpp: |
| (JSC::FTL::link): |
| * jit/JIT.cpp: |
| (JSC::JIT::compileWithoutLinking): |
| |
| 2018-04-30 Yusuke Suzuki <utatane.tea@gmail.com> |
| |
| Use WordLock instead of std::mutex for Threading |
| https://bugs.webkit.org/show_bug.cgi?id=185121 |
| |
| Reviewed by Geoffrey Garen. |
| |
| ThreadGroup starts using WordLock. |
| |
| * heap/MachineStackMarker.h: |
| (JSC::MachineThreads::getLock): |
| |
| 2018-04-29 Filip Pizlo <fpizlo@apple.com> |
| |
| B3 should run tail duplication at the bitter end |
| https://bugs.webkit.org/show_bug.cgi?id=185123 |
| |
| Reviewed by Geoffrey Garen. |
| |
| Also added an option to disable taildup. This appears to be a 1% AsmBench speed-up. It's neutral |
| everywhere else. |
| |
| The goal of this change is to allow us to run path specialization after switch lowering but |
| before tail duplication. |
| |
| * b3/B3Generate.cpp: |
| (JSC::B3::generateToAir): |
| * runtime/Options.h: |
| |
| 2018-04-29 Commit Queue <commit-queue@webkit.org> |
| |
| Unreviewed, rolling out r231137. |
| https://bugs.webkit.org/show_bug.cgi?id=185118 |
| |
| It is breaking Test262 language/expressions/multiplication |
| /order-of-evaluation.js (Requested by caiolima on #webkit). |
| |
| Reverted changeset: |
| |
| "[ESNext][BigInt] Implement support for "*" operation" |
| https://bugs.webkit.org/show_bug.cgi?id=183721 |
| https://trac.webkit.org/changeset/231137 |
| |
| 2018-04-28 Saam Barati <sbarati@apple.com> |
| |
| We don't model regexp effects properly |
| https://bugs.webkit.org/show_bug.cgi?id=185059 |
| <rdar://problem/39736150> |
| |
| Reviewed by Filip Pizlo. |
| |
| RegExp exec/test can do arbitrary effects when toNumbering the lastIndex if |
| the regexp is global. |
| |
| * dfg/DFGAbstractInterpreterInlines.h: |
| (JSC::DFG::AbstractInterpreter<AbstractStateType>::executeEffects): |
| * dfg/DFGClobberize.h: |
| (JSC::DFG::clobberize): |
| |
| 2018-04-28 Rick Waldron <waldron.rick@gmail.com> |
| |
| Token misspelled "tocken" in error message string |
| https://bugs.webkit.org/show_bug.cgi?id=185030 |
| |
| Reviewed by Saam Barati. |
| |
| * parser/Parser.cpp: Fix typo "tocken" => "token" in SyntaxError message string |
| (JSC::Parser<LexerType>::Parser): |
| (JSC::Parser<LexerType>::didFinishParsing): |
| (JSC::Parser<LexerType>::parseSourceElements): |
| (JSC::Parser<LexerType>::parseAsyncGeneratorFunctionSourceElements): |
| (JSC::Parser<LexerType>::parseVariableDeclaration): |
| (JSC::Parser<LexerType>::parseWhileStatement): |
| (JSC::Parser<LexerType>::parseVariableDeclarationList): |
| (JSC::Parser<LexerType>::createBindingPattern): |
| (JSC::Parser<LexerType>::parseArrowFunctionSingleExpressionBodySourceElements): |
| (JSC::Parser<LexerType>::parseObjectRestElement): |
| (JSC::Parser<LexerType>::parseDestructuringPattern): |
| (JSC::Parser<LexerType>::parseForStatement): |
| (JSC::Parser<LexerType>::parseBreakStatement): |
| (JSC::Parser<LexerType>::parseContinueStatement): |
| (JSC::Parser<LexerType>::parseThrowStatement): |
| (JSC::Parser<LexerType>::parseWithStatement): |
| (JSC::Parser<LexerType>::parseSwitchStatement): |
| (JSC::Parser<LexerType>::parseSwitchClauses): |
| (JSC::Parser<LexerType>::parseTryStatement): |
| (JSC::Parser<LexerType>::parseBlockStatement): |
| (JSC::Parser<LexerType>::parseFormalParameters): |
| (JSC::Parser<LexerType>::parseFunctionParameters): |
| (JSC::Parser<LexerType>::parseFunctionInfo): |
| (JSC::Parser<LexerType>::parseExpressionOrLabelStatement): |
| (JSC::Parser<LexerType>::parseExpressionStatement): |
| (JSC::Parser<LexerType>::parseIfStatement): |
| (JSC::Parser<LexerType>::parseAssignmentExpression): |
| (JSC::Parser<LexerType>::parseConditionalExpression): |
| (JSC::Parser<LexerType>::parseBinaryExpression): |
| (JSC::Parser<LexerType>::parseObjectLiteral): |
| (JSC::Parser<LexerType>::parseStrictObjectLiteral): |
| (JSC::Parser<LexerType>::parseArrayLiteral): |
| (JSC::Parser<LexerType>::parseArguments): |
| (JSC::Parser<LexerType>::parseMemberExpression): |
| (JSC::operatorString): |
| (JSC::Parser<LexerType>::parseUnaryExpression): |
| (JSC::Parser<LexerType>::printUnexpectedTokenText): |
| |
| 2018-04-28 Caio Lima <ticaiolima@gmail.com> |
| |
| [ESNext][BigInt] Implement support for "*" operation |
| https://bugs.webkit.org/show_bug.cgi?id=183721 |
| |
| Reviewed by Saam Barati. |
| |
| Added BigInt support into times binary operator into LLInt and on |
| JITOperations profiledMul and unprofiledMul. We are also replacing all |
| uses of int to unsigned when there is no negative values for |
| variables. |
| |
| * dfg/DFGConstantFoldingPhase.cpp: |
| (JSC::DFG::ConstantFoldingPhase::foldConstants): |
| * jit/JITOperations.cpp: |
| * runtime/CommonSlowPaths.cpp: |
| (JSC::SLOW_PATH_DECL): |
| * runtime/JSBigInt.cpp: |
| (JSC::JSBigInt::JSBigInt): |
| (JSC::JSBigInt::allocationSize): |
| (JSC::JSBigInt::createWithLength): |
| (JSC::JSBigInt::toString): |
| (JSC::JSBigInt::multiply): |
| (JSC::JSBigInt::digitDiv): |
| (JSC::JSBigInt::internalMultiplyAdd): |
| (JSC::JSBigInt::multiplyAccumulate): |
| (JSC::JSBigInt::equals): |
| (JSC::JSBigInt::absoluteDivSmall): |
| (JSC::JSBigInt::calculateMaximumCharactersRequired): |
| (JSC::JSBigInt::toStringGeneric): |
| (JSC::JSBigInt::rightTrim): |
| (JSC::JSBigInt::allocateFor): |
| (JSC::JSBigInt::parseInt): |
| (JSC::JSBigInt::digit): |
| (JSC::JSBigInt::setDigit): |
| * runtime/JSBigInt.h: |
| * runtime/Operations.h: |
| (JSC::jsMul): |
| |
| 2018-04-28 Commit Queue <commit-queue@webkit.org> |
| |
| Unreviewed, rolling out r231131. |
| https://bugs.webkit.org/show_bug.cgi?id=185112 |
| |
| It is breaking Debug build due to unchecked exception |
| (Requested by caiolima on #webkit). |
| |
| Reverted changeset: |
| |
| "[ESNext][BigInt] Implement support for "*" operation" |
| https://bugs.webkit.org/show_bug.cgi?id=183721 |
| https://trac.webkit.org/changeset/231131 |
| |
| 2018-04-27 Caio Lima <ticaiolima@gmail.com> |
| |
| [ESNext][BigInt] Implement support for "*" operation |
| https://bugs.webkit.org/show_bug.cgi?id=183721 |
| |
| Reviewed by Saam Barati. |
| |
| Added BigInt support into times binary operator into LLInt and on |
| JITOperations profiledMul and unprofiledMul. We are also replacing all |
| uses of int to unsigned when there is no negative values for |
| variables. |
| |
| * dfg/DFGConstantFoldingPhase.cpp: |
| (JSC::DFG::ConstantFoldingPhase::foldConstants): |
| * jit/JITOperations.cpp: |
| * runtime/CommonSlowPaths.cpp: |
| (JSC::SLOW_PATH_DECL): |
| * runtime/JSBigInt.cpp: |
| (JSC::JSBigInt::JSBigInt): |
| (JSC::JSBigInt::allocationSize): |
| (JSC::JSBigInt::createWithLength): |
| (JSC::JSBigInt::toString): |
| (JSC::JSBigInt::multiply): |
| (JSC::JSBigInt::digitDiv): |
| (JSC::JSBigInt::internalMultiplyAdd): |
| (JSC::JSBigInt::multiplyAccumulate): |
| (JSC::JSBigInt::equals): |
| (JSC::JSBigInt::absoluteDivSmall): |
| (JSC::JSBigInt::calculateMaximumCharactersRequired): |
| (JSC::JSBigInt::toStringGeneric): |
| (JSC::JSBigInt::rightTrim): |
| (JSC::JSBigInt::allocateFor): |
| (JSC::JSBigInt::parseInt): |
| (JSC::JSBigInt::digit): |
| (JSC::JSBigInt::setDigit): |
| * runtime/JSBigInt.h: |
| * runtime/Operations.h: |
| (JSC::jsMul): |
| |
| 2018-04-27 JF Bastien <jfbastien@apple.com> |
| |
| Make the first 64 bits of JSString look like a double JSValue |
| https://bugs.webkit.org/show_bug.cgi?id=185081 |
| |
| Reviewed by Filip Pizlo. |
| |
| We can be clever about how we lay out JSString so that, were it |
| reinterpreted as a JSValue, it would look like a double. |
| |
| * assembler/MacroAssemblerX86Common.h: |
| (JSC::MacroAssemblerX86Common::and16): |
| * assembler/X86Assembler.h: |
| (JSC::X86Assembler::andw_mr): |
| * dfg/DFGSpeculativeJIT.cpp: |
| (JSC::DFG::SpeculativeJIT::compileMakeRope): |
| * ftl/FTLLowerDFGToB3.cpp: |
| (JSC::FTL::DFG::LowerDFGToB3::compileMakeRope): |
| * ftl/FTLOutput.h: |
| (JSC::FTL::Output::store32As8): |
| (JSC::FTL::Output::store32As16): |
| * runtime/JSString.h: |
| (JSC::JSString::JSString): |
| |
| 2018-04-27 Yusuke Suzuki <utatane.tea@gmail.com> |
| |
| [JSC][ARM64][Linux] Add collectCPUFeatures using auxiliary vector |
| https://bugs.webkit.org/show_bug.cgi?id=185055 |
| |
| Reviewed by JF Bastien. |
| |
| This patch is paving the way to emitting jscvt instruction if possible. |
| To do that, we need to determine jscvt instruction is supported in the |
| given CPU. |
| |
| We add a function collectCPUFeatures, which is responsible to collect |
| CPU features if necessary. In Linux, we can use auxiliary vector to get |
| the information without parsing /proc/cpuinfo. |
| |
| Currently, nobody calls this function. It is later called when we emit |
| jscvt instruction. To make it possible, we also need to add disassembler |
| support too. |
| |
| * assembler/AbstractMacroAssembler.h: |
| * assembler/MacroAssemblerARM64.cpp: |
| (JSC::MacroAssemblerARM64::collectCPUFeatures): |
| * assembler/MacroAssemblerARM64.h: |
| * assembler/MacroAssemblerX86Common.h: |
| |
| 2018-04-26 Filip Pizlo <fpizlo@apple.com> |
| |
| Also run foldPathConstants before mussing up SSA |
| https://bugs.webkit.org/show_bug.cgi?id=185069 |
| |
| Reviewed by Saam Barati. |
| |
| This isn't needed now, but will be once I implement the phase in bug 185060. |
| |
| This could be a speed-up, or a slow-down, independent of that phase. Most likely it's neutral. |
| Local testing seems to suggest that it's neutral. Anyway, whatever it ends up being, I want it to |
| be landed separately and measured separately from that phase. |
| |
| It's probably nice for sanity to have this and reduceStrength run before tail duplication and |
| another round of reduceStrength, since that make for something that is closer to a fixpoint. But |
| it will increase FTL compile times. So, there's no way to guess if this change is good, bad, or |
| neutral. It all depends on what programs typically look like. |
| |
| * b3/B3Generate.cpp: |
| (JSC::B3::generateToAir): |
| |
| 2018-04-27 Ryan Haddad <ryanhaddad@apple.com> |
| |
| Unreviewed, rolling out r231086. |
| |
| Caused JSC test failures due to an unchecked exception. |
| |
| Reverted changeset: |
| |
| "[ESNext][BigInt] Implement support for "*" operation" |
| https://bugs.webkit.org/show_bug.cgi?id=183721 |
| https://trac.webkit.org/changeset/231086 |
| |
| 2018-04-26 Caio Lima <ticaiolima@gmail.com> |
| |
| [ESNext][BigInt] Implement support for "*" operation |
| https://bugs.webkit.org/show_bug.cgi?id=183721 |
| |
| Reviewed by Saam Barati. |
| |
| Added BigInt support into times binary operator into LLInt and on |
| JITOperations profiledMul and unprofiledMul. We are also replacing all |
| uses of int to unsigned when there is no negative values for |
| variables. |
| |
| * dfg/DFGConstantFoldingPhase.cpp: |
| (JSC::DFG::ConstantFoldingPhase::foldConstants): |
| * jit/JITOperations.cpp: |
| * runtime/CommonSlowPaths.cpp: |
| (JSC::SLOW_PATH_DECL): |
| * runtime/JSBigInt.cpp: |
| (JSC::JSBigInt::JSBigInt): |
| (JSC::JSBigInt::allocationSize): |
| (JSC::JSBigInt::createWithLength): |
| (JSC::JSBigInt::toString): |
| (JSC::JSBigInt::multiply): |
| (JSC::JSBigInt::digitDiv): |
| (JSC::JSBigInt::internalMultiplyAdd): |
| (JSC::JSBigInt::multiplyAccumulate): |
| (JSC::JSBigInt::equals): |
| (JSC::JSBigInt::absoluteDivSmall): |
| (JSC::JSBigInt::calculateMaximumCharactersRequired): |
| (JSC::JSBigInt::toStringGeneric): |
| (JSC::JSBigInt::rightTrim): |
| (JSC::JSBigInt::allocateFor): |
| (JSC::JSBigInt::parseInt): |
| (JSC::JSBigInt::digit): |
| (JSC::JSBigInt::setDigit): |
| * runtime/JSBigInt.h: |
| * runtime/Operations.h: |
| (JSC::jsMul): |
| |
| 2018-04-26 Mark Lam <mark.lam@apple.com> |
| |
| Gardening: Speculative build fix for Windows. |
| https://bugs.webkit.org/show_bug.cgi?id=184976 |
| <rdar://problem/39723901> |
| |
| Not reviewed. |
| |
| * runtime/JSCPtrTag.h: |
| |
| 2018-04-26 Mark Lam <mark.lam@apple.com> |
| |
| Gardening: Windows build fix. |
| |
| Not reviewed. |
| |
| * runtime/Options.cpp: |
| |
| 2018-04-26 Jer Noble <jer.noble@apple.com> |
| |
| WK_COCOA_TOUCH all the things. |
| https://bugs.webkit.org/show_bug.cgi?id=185006 |
| <rdar://problem/39736025> |
| |
| Reviewed by Tim Horton. |
| |
| * Configurations/Base.xcconfig: |
| |
| 2018-04-26 Per Arne Vollan <pvollan@apple.com> |
| |
| Disable content filtering in minimal simulator mode |
| https://bugs.webkit.org/show_bug.cgi?id=185027 |
| <rdar://problem/39736091> |
| |
| Reviewed by Jer Noble. |
| |
| * Configurations/FeatureDefines.xcconfig: |
| |
| 2018-04-26 Andy VanWagoner <thetalecrafter@gmail.com> |
| |
| [INTL] Implement Intl.PluralRules |
| https://bugs.webkit.org/show_bug.cgi?id=184312 |
| |
| Reviewed by JF Bastien. |
| |
| Use UNumberFormat to enforce formatting, and then UPluralRules to find |
| the correct plural rule for the given number. Relies on ICU v59+ for |
| resolvedOptions().pluralCategories and trailing 0 detection. |
| Behind the useIntlPluralRules option and INTL_PLURAL_RULES flag. |
| |
| * CMakeLists.txt: |
| * Configurations/FeatureDefines.xcconfig: |
| * DerivedSources.make: |
| * JavaScriptCore.xcodeproj/project.pbxproj: |
| * Sources.txt: |
| * builtins/BuiltinNames.h: |
| * runtime/BigIntObject.cpp: |
| (JSC::BigIntObject::create): Moved to ensure complete JSGlobalObject definition. |
| * runtime/BigIntObject.h: |
| * runtime/CommonIdentifiers.h: |
| * runtime/IntlObject.cpp: |
| (JSC::IntlObject::finishCreation): |
| * runtime/IntlObject.h: |
| * runtime/IntlPluralRules.cpp: Added. |
| (JSC::IntlPluralRules::UPluralRulesDeleter::operator() const): |
| (JSC::IntlPluralRules::UNumberFormatDeleter::operator() const): |
| (JSC::UEnumerationDeleter::operator() const): |
| (JSC::IntlPluralRules::create): |
| (JSC::IntlPluralRules::createStructure): |
| (JSC::IntlPluralRules::IntlPluralRules): |
| (JSC::IntlPluralRules::finishCreation): |
| (JSC::IntlPluralRules::destroy): |
| (JSC::IntlPluralRules::visitChildren): |
| (JSC::IntlPRInternal::localeData): |
| (JSC::IntlPluralRules::initializePluralRules): |
| (JSC::IntlPluralRules::resolvedOptions): |
| (JSC::IntlPluralRules::select): |
| * runtime/IntlPluralRules.h: Added. |
| * runtime/IntlPluralRulesConstructor.cpp: Added. |
| (JSC::IntlPluralRulesConstructor::create): |
| (JSC::IntlPluralRulesConstructor::createStructure): |
| (JSC::IntlPluralRulesConstructor::IntlPluralRulesConstructor): |
| (JSC::IntlPluralRulesConstructor::finishCreation): |
| (JSC::constructIntlPluralRules): |
| (JSC::callIntlPluralRules): |
| (JSC::IntlPluralRulesConstructorFuncSupportedLocalesOf): |
| (JSC::IntlPluralRulesConstructor::visitChildren): |
| * runtime/IntlPluralRulesConstructor.h: Added. |
| * runtime/IntlPluralRulesPrototype.cpp: Added. |
| (JSC::IntlPluralRulesPrototype::create): |
| (JSC::IntlPluralRulesPrototype::createStructure): |
| (JSC::IntlPluralRulesPrototype::IntlPluralRulesPrototype): |
| (JSC::IntlPluralRulesPrototype::finishCreation): |
| (JSC::IntlPluralRulesPrototypeFuncSelect): |
| (JSC::IntlPluralRulesPrototypeFuncResolvedOptions): |
| * runtime/IntlPluralRulesPrototype.h: Added. |
| * runtime/JSGlobalObject.cpp: |
| (JSC::JSGlobalObject::init): |
| (JSC::JSGlobalObject::intlPluralRulesAvailableLocales): |
| * runtime/JSGlobalObject.h: |
| * runtime/Options.h: |
| * runtime/RegExpPrototype.cpp: Added inlines header. |
| * runtime/VM.cpp: |
| (JSC::VM::VM): |
| * runtime/VM.h: |
| |
| 2018-04-26 Dominik Infuehr <dinfuehr@igalia.com> |
| |
| [MIPS] Fix branch offsets in branchNeg32 |
| https://bugs.webkit.org/show_bug.cgi?id=185025 |
| |
| Reviewed by Yusuke Suzuki. |
| |
| Two nops were removed in branch(Not)Equal in #183130 but the offset wasn't adjusted. |
| |
| * assembler/MacroAssemblerMIPS.h: |
| (JSC::MacroAssemblerMIPS::branchNeg32): |
| |
| 2018-04-25 Robin Morisset <rmorisset@apple.com> |
| |
| In FTLLowerDFGToB3.cpp::compileCreateRest, always use a contiguous array as the indexing type when under isWatchingHavingABadTimeWatchpoint |
| https://bugs.webkit.org/show_bug.cgi?id=184773 |
| <rdar://problem/37773612> |
| |
| Reviewed by Filip Pizlo. |
| |
| We were calling restParameterStructure(), which returns arrayStructureForIndexingTypeDuringAllocation(ArrayWithContiguous). |
| arrayStructureForIndexingTypeDuringAllocation uses m_arrayStructureForIndexingShapeDuringAllocation, which is set to SlowPutArrayStorage when we are 'having a bad time'. |
| This is problematic, because the structure is then passed to allocateUninitializedContiguousJSArray, which ASSERTs that the indexing type is contiguous (or int32). |
| We solve the problem by using originalArrayStructureForIndexingType which always returns a structure with the right indexing type (contiguous), even if we are having a bad time. |
| This is safe, as we are under isWatchingHavingABadTimeWatchpoint, so if we have a bad time, the code we generate will never be installed. |
| |
| * ftl/FTLLowerDFGToB3.cpp: |
| (JSC::FTL::DFG::LowerDFGToB3::compileCreateRest): |
| |
| 2018-04-25 Mark Lam <mark.lam@apple.com> |
| |
| Push the definition of PtrTag down to the WTF layer. |
| https://bugs.webkit.org/show_bug.cgi?id=184976 |
| <rdar://problem/39723901> |
| |
| Reviewed by Saam Barati. |
| |
| * CMakeLists.txt: |
| * JavaScriptCore.xcodeproj/project.pbxproj: |
| * assembler/ARM64Assembler.h: |
| * assembler/AbstractMacroAssembler.h: |
| * assembler/MacroAssemblerCodeRef.cpp: |
| * assembler/MacroAssemblerCodeRef.h: |
| * b3/B3MathExtras.cpp: |
| * bytecode/LLIntCallLinkInfo.h: |
| * disassembler/Disassembler.h: |
| * ftl/FTLJITCode.cpp: |
| * interpreter/InterpreterInlines.h: |
| * jit/ExecutableAllocator.h: |
| * jit/JITOperations.cpp: |
| * jit/ThunkGenerator.h: |
| * jit/ThunkGenerators.h: |
| * llint/LLIntOffsetsExtractor.cpp: |
| * llint/LLIntPCRanges.h: |
| * runtime/JSCPtrTag.h: Added. |
| * runtime/NativeFunction.h: |
| * runtime/PtrTag.h: Removed. |
| * runtime/VMTraps.cpp: |
| |
| 2018-04-25 Keith Miller <keith_miller@apple.com> |
| |
| getUnlinkedGlobalFunctionExecutable should only save things to the code cache if the option is set |
| https://bugs.webkit.org/show_bug.cgi?id=184998 |
| |
| Reviewed by Saam Barati. |
| |
| * runtime/CodeCache.cpp: |
| (JSC::CodeCache::getUnlinkedGlobalFunctionExecutable): |
| |
| 2018-04-25 Keith Miller <keith_miller@apple.com> |
| |
| Add missing scope release to functionProtoFuncToString |
| https://bugs.webkit.org/show_bug.cgi?id=184995 |
| |
| Reviewed by Saam Barati. |
| |
| * runtime/FunctionPrototype.cpp: |
| (JSC::functionProtoFuncToString): |
| |
| 2018-04-25 Yusuke Suzuki <utatane.tea@gmail.com> |
| |
| REGRESSION(r230748) [GTK][ARM] no matching function for call to 'JSC::CCallHelpers::swap(JSC::ARMRegisters::FPRegisterID&, JSC::ARMRegisters::FPRegisterID&)' |
| https://bugs.webkit.org/show_bug.cgi?id=184730 |
| |
| Reviewed by Mark Lam. |
| |
| Add swap(FPRegisterID, FPRegisterID) implementation using ARMRegisters::SD0 (temporary register in MacroAssemblerARM). |
| And we now use dataTempRegister, addressTempRegister, and fpTempRegister instead of using S0, S1, and SD0. |
| |
| We also change swap(RegisterID, RegisterID) implementation to use moves and temporaries simply. This is aligned to |
| ARMv7 implementation. |
| |
| * assembler/ARMAssembler.h: |
| * assembler/MacroAssemblerARM.h: |
| (JSC::MacroAssemblerARM::add32): |
| (JSC::MacroAssemblerARM::and32): |
| (JSC::MacroAssemblerARM::lshift32): |
| (JSC::MacroAssemblerARM::mul32): |
| (JSC::MacroAssemblerARM::or32): |
| (JSC::MacroAssemblerARM::rshift32): |
| (JSC::MacroAssemblerARM::urshift32): |
| (JSC::MacroAssemblerARM::sub32): |
| (JSC::MacroAssemblerARM::xor32): |
| (JSC::MacroAssemblerARM::load8): |
| (JSC::MacroAssemblerARM::abortWithReason): |
| (JSC::MacroAssemblerARM::load32WithAddressOffsetPatch): |
| (JSC::MacroAssemblerARM::store32WithAddressOffsetPatch): |
| (JSC::MacroAssemblerARM::store8): |
| (JSC::MacroAssemblerARM::store32): |
| (JSC::MacroAssemblerARM::push): |
| (JSC::MacroAssemblerARM::swap): |
| (JSC::MacroAssemblerARM::branch8): |
| (JSC::MacroAssemblerARM::branchPtr): |
| (JSC::MacroAssemblerARM::branch32): |
| (JSC::MacroAssemblerARM::branch32WithUnalignedHalfWords): |
| (JSC::MacroAssemblerARM::branchTest8): |
| (JSC::MacroAssemblerARM::branchTest32): |
| (JSC::MacroAssemblerARM::jump): |
| (JSC::MacroAssemblerARM::branchAdd32): |
| (JSC::MacroAssemblerARM::mull32): |
| (JSC::MacroAssemblerARM::branchMul32): |
| (JSC::MacroAssemblerARM::patchableBranch32): |
| (JSC::MacroAssemblerARM::nearCall): |
| (JSC::MacroAssemblerARM::compare32): |
| (JSC::MacroAssemblerARM::compare8): |
| (JSC::MacroAssemblerARM::test32): |
| (JSC::MacroAssemblerARM::test8): |
| (JSC::MacroAssemblerARM::add64): |
| (JSC::MacroAssemblerARM::load32): |
| (JSC::MacroAssemblerARM::call): |
| (JSC::MacroAssemblerARM::branchPtrWithPatch): |
| (JSC::MacroAssemblerARM::branch32WithPatch): |
| (JSC::MacroAssemblerARM::storePtrWithPatch): |
| (JSC::MacroAssemblerARM::loadDouble): |
| (JSC::MacroAssemblerARM::storeDouble): |
| (JSC::MacroAssemblerARM::addDouble): |
| (JSC::MacroAssemblerARM::divDouble): |
| (JSC::MacroAssemblerARM::subDouble): |
| (JSC::MacroAssemblerARM::mulDouble): |
| (JSC::MacroAssemblerARM::convertInt32ToDouble): |
| (JSC::MacroAssemblerARM::branchDouble): |
| (JSC::MacroAssemblerARM::branchTruncateDoubleToInt32): |
| (JSC::MacroAssemblerARM::truncateDoubleToInt32): |
| (JSC::MacroAssemblerARM::truncateDoubleToUint32): |
| (JSC::MacroAssemblerARM::branchConvertDoubleToInt32): |
| (JSC::MacroAssemblerARM::branchDoubleNonZero): |
| (JSC::MacroAssemblerARM::branchDoubleZeroOrNaN): |
| (JSC::MacroAssemblerARM::call32): |
| (JSC::MacroAssemblerARM::internalCompare32): |
| |
| 2018-04-25 Ross Kirsling <ross.kirsling@sony.com> |
| |
| [WinCairo] Fix js/regexp-unicode.html crash. |
| https://bugs.webkit.org/show_bug.cgi?id=184891 |
| |
| Reviewed by Yusuke Suzuki. |
| |
| On Win64, register RDI is "considered nonvolatile and must be saved and restored by a function that uses [it]". |
| RDI is being used as a scratch register for JIT_UNICODE_EXPRESSIONS, not just YARR_JIT_ALL_PARENS_EXPRESSIONS. |
| |
| * yarr/YarrJIT.cpp: |
| (JSC::Yarr::YarrGenerator::generateEnter): |
| (JSC::Yarr::YarrGenerator::generateReturn): |
| Unconditionally save and restore RDI on 64-bit Windows. |
| |
| 2018-04-25 Michael Catanzaro <mcatanzaro@igalia.com> |
| |
| [GTK] Miscellaneous build cleanups |
| https://bugs.webkit.org/show_bug.cgi?id=184399 |
| |
| Reviewed by Žan Doberšek. |
| |
| * PlatformGTK.cmake: |
| |
| 2018-04-24 Keith Miller <keith_miller@apple.com> |
| |
| fromCharCode is missing some exception checks |
| https://bugs.webkit.org/show_bug.cgi?id=184952 |
| |
| Reviewed by Saam Barati. |
| |
| I also removed the pointless slow path function and moved it into the |
| main function. |
| |
| * runtime/StringConstructor.cpp: |
| (JSC::stringFromCharCode): |
| (JSC::stringFromCharCodeSlowCase): Deleted. |
| |
| 2018-04-24 Filip Pizlo <fpizlo@apple.com> |
| |
| MultiByOffset should emit one fewer branches in the case that the set of structures is proved already |
| https://bugs.webkit.org/show_bug.cgi?id=184923 |
| |
| Reviewed by Saam Barati. |
| |
| If we have a MultiGetByOffset or MultiPutByOffset over a structure set that we've already proved |
| (i.e. we know that the object has one of those structures), then previously we would still emit a |
| switch with a case per structure along with a default case. That would mean one extra redundant |
| branch to check that whatever structure we wound up with belongs to the set. In that case, we |
| were already making the default case be an Oops. |
| |
| One possible solution would be to say that the default case being Oops means that B3 doesn't need |
| to emit the extra branch. But that would require having B3 exploit the fact that Oops is known to |
| be unreachable. Although B3 IR semantics (webkit.org/docs/b3/intermediate-representation.html) |
| seem to allow this, I don't particularly like that style of optimization. I like Oops to mean |
| trap. |
| |
| So, this patch makes FTL lowering turn one of the cases into the default, explicitly removing the |
| extra branch. |
| |
| This is not a speed-up. But it makes the B3 IR for MultiByOffset a lot simpler, which should make |
| it easier to implement B3-level optimizations for MultiByOffset. It also makes the IR easier to |
| read. |
| |
| * ftl/FTLLowerDFGToB3.cpp: |
| (JSC::FTL::DFG::LowerDFGToB3::compileMultiGetByOffset): |
| (JSC::FTL::DFG::LowerDFGToB3::compileMultiPutByOffset): |
| (JSC::FTL::DFG::LowerDFGToB3::emitSwitchForMultiByOffset): |
| |
| 2018-04-24 Filip Pizlo <fpizlo@apple.com> |
| |
| DFG CSE should know how to decay a MultiGetByOffset |
| https://bugs.webkit.org/show_bug.cgi?id=159859 |
| |
| Reviewed by Keith Miller. |
| |
| This teaches Node::remove() how to decay a MultiGetByOffset to a CheckStructure, so that |
| clobberize() can report a def() for MultiGetByOffset. |
| |
| This is a slight improvement to codegen in splay because splay is a heavy user of |
| MultiGetByOffset. It uses it redundantly in one of its hot functions (the function called |
| "splay_"). I don't see a net speed-up in the benchmark. However, this is just a first step to |
| removing MultiXByOffset-related redundancies, which by my estimates account for 16% of |
| splay's time. |
| |
| * dfg/DFGClobberize.h: |
| (JSC::DFG::clobberize): |
| * dfg/DFGNode.cpp: |
| (JSC::DFG::Node::remove): |
| (JSC::DFG::Node::removeWithoutChecks): |
| (JSC::DFG::Node::replaceWith): |
| (JSC::DFG::Node::replaceWithWithoutChecks): |
| * dfg/DFGNode.h: |
| (JSC::DFG::Node::convertToMultiGetByOffset): |
| (JSC::DFG::Node::replaceWith): Deleted. |
| * dfg/DFGNodeType.h: |
| * dfg/DFGObjectAllocationSinkingPhase.cpp: |
| |
| 2018-04-24 Keith Miller <keith_miller@apple.com> |
| |
| Update API docs with information on which run loop the VM will use |
| https://bugs.webkit.org/show_bug.cgi?id=184900 |
| <rdar://problem/39166054> |
| |
| Reviewed by Mark Lam. |
| |
| * API/JSContextRef.h: |
| * API/JSVirtualMachine.h: |
| |
| 2018-04-24 Filip Pizlo <fpizlo@apple.com> |
| |
| $vm.totalGCTime() should be a thing |
| https://bugs.webkit.org/show_bug.cgi?id=184916 |
| |
| Reviewed by Sam Weinig. |
| |
| When debugging regressions in tests that are GC heavy, it's nice to be able to query the total |
| time spent in GC to determine if the regression is because the GC got slower. |
| |
| This adds $vm.totalGCTime(), which tells you the total time spent in GC, in seconds. |
| |
| * heap/Heap.cpp: |
| (JSC::Heap::runEndPhase): |
| * heap/Heap.h: |
| (JSC::Heap::totalGCTime const): |
| * tools/JSDollarVM.cpp: |
| (JSC::functionTotalGCTime): |
| (JSC::JSDollarVM::finishCreation): |
| |
| 2018-04-23 Zalan Bujtas <zalan@apple.com> |
| |
| [LayoutFormattingContext] Initial commit. |
| https://bugs.webkit.org/show_bug.cgi?id=184896 |
| |
| Reviewed by Antti Koivisto. |
| |
| * Configurations/FeatureDefines.xcconfig: |
| |
| 2018-04-23 Filip Pizlo <fpizlo@apple.com> |
| |
| Unreviewed, revert accidental change to verbose flag. |
| |
| * dfg/DFGByteCodeParser.cpp: |
| |
| 2018-04-23 Filip Pizlo <fpizlo@apple.com> |
| |
| Roll out r226655 because it broke OSR entry when the pre-header is inadequately profiled. |
| |
| Rubber stamped by Saam Barati. |
| |
| This is a >2x speed-up in SunSpider/bitops-bitwise-and. We don't really care about SunSpider |
| anymore, but r226655 didn't result in any benchmark wins and just regressed this test by a lot. |
| Seems sensible to just roll it out. |
| |
| * dfg/DFGByteCodeParser.cpp: |
| (JSC::DFG::ByteCodeParser::addToGraph): |
| (JSC::DFG::ByteCodeParser::parse): |
| |
| 2018-04-22 Yusuke Suzuki <utatane.tea@gmail.com> |
| |
| [JSC] Remove ModuleLoaderPrototype |
| https://bugs.webkit.org/show_bug.cgi?id=184784 |
| |
| Reviewed by Mark Lam. |
| |
| When we introduce ModuleLoaderPrototype, ModuleLoader may be created by users and exposed to users. |
| However, the loader spec is abandoned. So we do not need to have ModuleLoaderPrototype and JSModuleLoader. |
| This patch merges ModuleLoaderPrototype's functionality into JSModuleLoader. |
| |
| * CMakeLists.txt: |
| * DerivedSources.make: |
| * JavaScriptCore.xcodeproj/project.pbxproj: |
| * Sources.txt: |
| * builtins/ModuleLoader.js: Renamed from Source/JavaScriptCore/builtins/ModuleLoaderPrototype.js. |
| * runtime/JSGlobalObject.cpp: |
| (JSC::JSGlobalObject::init): |
| (JSC::JSGlobalObject::visitChildren): |
| * runtime/JSGlobalObject.h: |
| (JSC::JSGlobalObject::proxyRevokeStructure const): |
| (JSC::JSGlobalObject::moduleLoaderStructure const): Deleted. |
| * runtime/JSModuleLoader.cpp: |
| (JSC::moduleLoaderParseModule): |
| (JSC::moduleLoaderRequestedModules): |
| (JSC::moduleLoaderModuleDeclarationInstantiation): |
| (JSC::moduleLoaderResolve): |
| (JSC::moduleLoaderResolveSync): |
| (JSC::moduleLoaderFetch): |
| (JSC::moduleLoaderGetModuleNamespaceObject): |
| (JSC::moduleLoaderEvaluate): |
| * runtime/JSModuleLoader.h: |
| * runtime/ModuleLoaderPrototype.cpp: Removed. |
| * runtime/ModuleLoaderPrototype.h: Removed. |
| |
| 2018-04-20 Carlos Garcia Campos <cgarcia@igalia.com> |
| |
| [GLIB] All API tests fail in debug builds |
| https://bugs.webkit.org/show_bug.cgi?id=184813 |
| |
| Reviewed by Mark Lam. |
| |
| This is because of a conflict of ExceptionHandler class used in tests and ExceptionHandler struct defined in |
| JSCContext.cpp. This patch renames the ExceptionHandler struct as JSCContextExceptionHandler. |
| |
| * API/glib/JSCContext.cpp: |
| (JSCContextExceptionHandler::JSCContextExceptionHandler): |
| (JSCContextExceptionHandler::~JSCContextExceptionHandler): |
| (jscContextConstructed): |
| (ExceptionHandler::ExceptionHandler): Deleted. |
| (ExceptionHandler::~ExceptionHandler): Deleted. |
| |
| 2018-04-20 Tim Horton <timothy_horton@apple.com> |
| |
| Adjust geolocation feature flag |
| https://bugs.webkit.org/show_bug.cgi?id=184856 |
| |
| Reviewed by Wenson Hsieh. |
| |
| * Configurations/FeatureDefines.xcconfig: |
| |
| 2018-04-20 Brian Burg <bburg@apple.com> |
| |
| Web Inspector: remove some dead code in IdentifiersFactory |
| https://bugs.webkit.org/show_bug.cgi?id=184839 |
| |
| Reviewed by Timothy Hatcher. |
| |
| This was never used on non-Chrome ports, so the identifier always has a |
| prefix of '0.'. We may change this in the future, but for now remove this. |
| Using a PID for this purpose is problematic anyway. |
| |
| * inspector/IdentifiersFactory.cpp: |
| (Inspector::addPrefixToIdentifier): |
| (Inspector::IdentifiersFactory::createIdentifier): |
| (Inspector::IdentifiersFactory::requestId): |
| (Inspector::IdentifiersFactory::addProcessIdPrefixTo): Deleted. |
| * inspector/IdentifiersFactory.h: |
| |
| 2018-04-20 Mark Lam <mark.lam@apple.com> |
| |
| Add the ability to use a hash for setting PtrTag enum values. |
| https://bugs.webkit.org/show_bug.cgi?id=184852 |
| <rdar://problem/39613891> |
| |
| Reviewed by Saam Barati. |
| |
| * runtime/PtrTag.h: |
| |
| 2018-04-20 Mark Lam <mark.lam@apple.com> |
| |
| Some JSEntryPtrTags should actually be JSInternalPtrTags. |
| https://bugs.webkit.org/show_bug.cgi?id=184712 |
| <rdar://problem/39507381> |
| |
| Reviewed by Michael Saboff. |
| |
| 1. Convert some uses of JSEntryPtrTag into JSInternalPtrTags. |
| 2. Tag all LLInt bytecodes consistently with BytecodePtrTag now and retag them |
| only when needed. |
| |
| * bytecode/AccessCase.cpp: |
| (JSC::AccessCase::generateImpl): |
| * bytecode/ByValInfo.h: |
| (JSC::ByValInfo::ByValInfo): |
| * bytecode/CallLinkInfo.cpp: |
| (JSC::CallLinkInfo::callReturnLocation): |
| (JSC::CallLinkInfo::patchableJump): |
| (JSC::CallLinkInfo::hotPathBegin): |
| (JSC::CallLinkInfo::slowPathStart): |
| * bytecode/CallLinkInfo.h: |
| (JSC::CallLinkInfo::setCallLocations): |
| (JSC::CallLinkInfo::hotPathOther): |
| * bytecode/PolymorphicAccess.cpp: |
| (JSC::PolymorphicAccess::regenerate): |
| * bytecode/StructureStubInfo.h: |
| (JSC::StructureStubInfo::doneLocation): |
| * dfg/DFGJITCompiler.cpp: |
| (JSC::DFG::JITCompiler::link): |
| * dfg/DFGOSRExit.cpp: |
| (JSC::DFG::reifyInlinedCallFrames): |
| * ftl/FTLLazySlowPath.cpp: |
| (JSC::FTL::LazySlowPath::initialize): |
| * ftl/FTLLazySlowPath.h: |
| (JSC::FTL::LazySlowPath::done const): |
| * ftl/FTLLowerDFGToB3.cpp: |
| (JSC::FTL::DFG::LowerDFGToB3::compileCallOrConstruct): |
| (JSC::FTL::DFG::LowerDFGToB3::compileDirectCallOrConstruct): |
| (JSC::FTL::DFG::LowerDFGToB3::compileTailCall): |
| (JSC::FTL::DFG::LowerDFGToB3::compileCallOrConstructVarargsSpread): |
| (JSC::FTL::DFG::LowerDFGToB3::compileCallOrConstructVarargs): |
| (JSC::FTL::DFG::LowerDFGToB3::compileIn): |
| (JSC::FTL::DFG::LowerDFGToB3::lazySlowPath): |
| * jit/JIT.cpp: |
| (JSC::JIT::link): |
| * jit/JITExceptions.cpp: |
| (JSC::genericUnwind): |
| * jit/JITMathIC.h: |
| (JSC::isProfileEmpty): |
| * llint/LLIntData.cpp: |
| (JSC::LLInt::initialize): |
| * llint/LLIntData.h: |
| (JSC::LLInt::getCodePtr): |
| (JSC::LLInt::getExecutableAddress): Deleted. |
| * llint/LLIntExceptions.cpp: |
| (JSC::LLInt::callToThrow): |
| * llint/LLIntSlowPaths.cpp: |
| (JSC::LLInt::LLINT_SLOW_PATH_DECL): |
| * wasm/js/WasmToJS.cpp: |
| (JSC::Wasm::wasmToJS): |
| |
| 2018-04-18 Jer Noble <jer.noble@apple.com> |
| |
| Don't put build products into WK_ALTERNATE_WEBKIT_SDK_PATH for engineering builds |
| https://bugs.webkit.org/show_bug.cgi?id=184762 |
| |
| Reviewed by Dan Bernstein. |
| |
| * Configurations/Base.xcconfig: |
| * JavaScriptCore.xcodeproj/project.pbxproj: |
| |
| 2018-04-20 Daniel Bates <dabates@apple.com> |
| |
| Remove code for compilers that did not support NSDMI for aggregates |
| https://bugs.webkit.org/show_bug.cgi?id=184599 |
| |
| Reviewed by Per Arne Vollan. |
| |
| Remove workaround for earlier Visual Studio versions that did not support non-static data |
| member initializers (NSDMI) for aggregates. We have since updated all the build.webkit.org |
| and EWS bots to a newer version that supports this feature. |
| |
| * domjit/DOMJITEffect.h: |
| (JSC::DOMJIT::Effect::Effect): Deleted. |
| * runtime/HasOwnPropertyCache.h: |
| (JSC::HasOwnPropertyCache::Entry::Entry): Deleted. |
| * wasm/WasmFormat.h: |
| (JSC::Wasm::WasmToWasmImportableFunction::WasmToWasmImportableFunction): Deleted. |
| |
| 2018-04-20 Mark Lam <mark.lam@apple.com> |
| |
| Build fix for internal builds after r230826. |
| https://bugs.webkit.org/show_bug.cgi?id=184790 |
| <rdar://problem/39301369> |
| |
| Not reviewed. |
| |
| * runtime/Options.cpp: |
| (JSC::overrideDefaults): |
| * tools/SigillCrashAnalyzer.cpp: |
| (JSC::SignalContext::dump): |
| |
| 2018-04-19 Tadeu Zagallo <tzagallo@apple.com> |
| |
| REGRESSION(r227340): ArrayBuffers were not being serialized when sent via MessagePorts |
| https://bugs.webkit.org/show_bug.cgi?id=184254 |
| <rdar://problem/39140200> |
| |
| Reviewed by Daniel Bates. |
| |
| Expose an extra constructor of ArrayBufferContents in order to be able to decode SerializedScriptValues. |
| |
| * runtime/ArrayBuffer.h: |
| (JSC::ArrayBufferContents::ArrayBufferContents): |
| |
| 2018-04-19 Mark Lam <mark.lam@apple.com> |
| |
| Apply pointer profiling to Signal pointers. |
| https://bugs.webkit.org/show_bug.cgi?id=184790 |
| <rdar://problem/39301369> |
| |
| Reviewed by Michael Saboff. |
| |
| 1. Change stackPointer, framePointer, and instructionPointer accessors to |
| be a pair of getter/setter functions. |
| 2. Add support for USE(PLATFORM_REGISTERS_WITH_PROFILE) to allow use of a |
| a pointer profiling variants of these accessors. |
| 3. Also add a linkRegister accessor only for ARM64 on OS(DARWIN). |
| |
| * JavaScriptCorePrefix.h: |
| * runtime/MachineContext.h: |
| (JSC::MachineContext::stackPointerImpl): |
| (JSC::MachineContext::stackPointer): |
| (JSC::MachineContext::setStackPointer): |
| (JSC::MachineContext::framePointerImpl): |
| (JSC::MachineContext::framePointer): |
| (JSC::MachineContext::setFramePointer): |
| (JSC::MachineContext::instructionPointerImpl): |
| (JSC::MachineContext::instructionPointer): |
| (JSC::MachineContext::setInstructionPointer): |
| (JSC::MachineContext::linkRegisterImpl): |
| (JSC::MachineContext::linkRegister): |
| (JSC::MachineContext::setLinkRegister): |
| * runtime/SamplingProfiler.cpp: |
| (JSC::SamplingProfiler::takeSample): |
| * runtime/VMTraps.cpp: |
| (JSC::SignalContext::SignalContext): |
| (JSC::VMTraps::tryInstallTrapBreakpoints): |
| * tools/CodeProfiling.cpp: |
| (JSC::profilingTimer): |
| * tools/SigillCrashAnalyzer.cpp: |
| (JSC::SignalContext::dump): |
| (JSC::installCrashHandler): |
| (JSC::SigillCrashAnalyzer::analyze): |
| * wasm/WasmFaultSignalHandler.cpp: |
| (JSC::Wasm::trapHandler): |
| |
| 2018-04-19 David Kilzer <ddkilzer@apple.com> |
| |
| Enable Objective-C weak references |
| <https://webkit.org/b/184789> |
| <rdar://problem/39571716> |
| |
| Reviewed by Dan Bernstein. |
| |
| * Configurations/Base.xcconfig: |
| (CLANG_ENABLE_OBJC_WEAK): Enable. |
| * Configurations/ToolExecutable.xcconfig: |
| (CLANG_ENABLE_OBJC_ARC): Simplify. |
| |
| 2018-04-17 Filip Pizlo <fpizlo@apple.com> |
| |
| The InternalFunction hierarchy should be in IsoSubspaces |
| https://bugs.webkit.org/show_bug.cgi?id=184721 |
| |
| Reviewed by Saam Barati. |
| |
| This moves InternalFunction into a IsoSubspace. It also moves all subclasses into IsoSubspaces, |
| but subclasses that are the same size as InternalFunction share its subspace. I did this |
| because the subclasses appear to just override methods, which are called dynamically via the |
| structure or class of the object. So, I don't see a type confusion risk if UAF is used to |
| allocate one kind of InternalFunction over another. |
| |
| * API/JSBase.h: |
| * API/JSCallbackFunction.h: |
| * API/ObjCCallbackFunction.h: |
| (JSC::ObjCCallbackFunction::subspaceFor): |
| * CMakeLists.txt: |
| * JavaScriptCore.xcodeproj/project.pbxproj: |
| * Sources.txt: |
| * heap/IsoSubspacePerVM.cpp: Added. |
| (JSC::IsoSubspacePerVM::AutoremovingIsoSubspace::AutoremovingIsoSubspace): |
| (JSC::IsoSubspacePerVM::AutoremovingIsoSubspace::~AutoremovingIsoSubspace): |
| (JSC::IsoSubspacePerVM::IsoSubspacePerVM): |
| (JSC::IsoSubspacePerVM::~IsoSubspacePerVM): |
| (JSC::IsoSubspacePerVM::forVM): |
| * heap/IsoSubspacePerVM.h: Added. |
| (JSC::IsoSubspacePerVM::SubspaceParameters::SubspaceParameters): |
| * runtime/Error.h: |
| * runtime/ErrorConstructor.h: |
| * runtime/InternalFunction.h: |
| (JSC::InternalFunction::subspaceFor): |
| * runtime/IntlCollatorConstructor.h: |
| * runtime/IntlDateTimeFormatConstructor.h: |
| * runtime/IntlNumberFormatConstructor.h: |
| * runtime/JSArrayBufferConstructor.h: |
| * runtime/NativeErrorConstructor.h: |
| * runtime/ProxyRevoke.h: |
| * runtime/RegExpConstructor.h: |
| * runtime/VM.cpp: |
| (JSC::VM::VM): |
| * runtime/VM.h: |
| |
| 2018-04-19 Yusuke Suzuki <utatane.tea@gmail.com> |
| |
| Unreviewed, Fix jsc shell |
| https://bugs.webkit.org/show_bug.cgi?id=184600 |
| |
| WebAssembly module loading does not finish with drainMicrotasks(). |
| So JSNativeStdFunction's capturing variables become invalid. |
| This patch fixes this issue. |
| |
| * jsc.cpp: |
| (functionDollarAgentStart): |
| (runWithOptions): |
| (runJSC): |
| (jscmain): |
| |
| 2018-04-18 Ross Kirsling <ross.kirsling@sony.com> |
| |
| REGRESSION(r230748) [WinCairo] 'JSC::JIT::appendCallWithSlowPathReturnType': function does not take 1 arguments |
| https://bugs.webkit.org/show_bug.cgi?id=184725 |
| |
| Reviewed by Mark Lam. |
| |
| * jit/JIT.h: |
| |
| 2018-04-18 Yusuke Suzuki <utatane.tea@gmail.com> |
| |
| [WebAssembly][Modules] Import tables in wasm modules |
| https://bugs.webkit.org/show_bug.cgi?id=184738 |
| |
| Reviewed by JF Bastien. |
| |
| This patch simply allows wasm modules to import table from wasm modules / js re-exporting. |
| Basically moving JSWebAssemblyInstance's table linking code to WebAssemblyModuleRecord::link |
| just works. |
| |
| * wasm/js/JSWebAssemblyInstance.cpp: |
| (JSC::JSWebAssemblyInstance::create): |
| * wasm/js/WebAssemblyModuleRecord.cpp: |
| (JSC::WebAssemblyModuleRecord::link): |
| |
| 2018-04-18 Dominik Infuehr <dinfuehr@igalia.com> |
| |
| [ARM] Fix build error and crash after PtrTag change |
| https://bugs.webkit.org/show_bug.cgi?id=184732 |
| |
| Reviewed by Mark Lam. |
| |
| Do not pass NoPtrTag in callOperation and fix misspelled JSEntryPtrTag. Use |
| MacroAssemblerCodePtr::createFromExecutableAddress to avoid tagging a pointer |
| twice with ARM-Thumb2. |
| |
| * assembler/MacroAssemblerCodeRef.h: |
| (JSC::MacroAssemblerCodeRef::MacroAssemblerCodeRef): |
| * jit/JITPropertyAccess32_64.cpp: |
| (JSC::JIT::emitSlow_op_put_by_val): |
| * jit/Repatch.cpp: |
| (JSC::linkPolymorphicCall): |
| |
| 2018-04-18 Yusuke Suzuki <utatane.tea@gmail.com> |
| |
| [WebAssembly][Modules] Import globals from wasm modules |
| https://bugs.webkit.org/show_bug.cgi?id=184736 |
| |
| Reviewed by JF Bastien. |
| |
| This patch implements a feature importing globals to/from wasm modules. |
| Since we are not supporting mutable globals now, we can just copy the |
| global data when importing. Currently we do not support importing/exporting |
| i64 globals. This will be supported once (1) mutable global bindings are |
| specified and (2) BigInt based i64 importing/exporting is specified. |
| |
| * wasm/js/JSWebAssemblyInstance.cpp: |
| (JSC::JSWebAssemblyInstance::create): |
| * wasm/js/WebAssemblyModuleRecord.cpp: |
| (JSC::WebAssemblyModuleRecord::link): |
| |
| 2018-04-18 Tomas Popela <tpopela@redhat.com> |
| |
| Unreviewed, fix build on ARM |
| |
| * assembler/MacroAssemblerARM.h: |
| (JSC::MacroAssemblerARM::readCallTarget): |
| |
| 2018-04-18 Tomas Popela <tpopela@redhat.com> |
| |
| Unreviewed, fix build with GCC |
| |
| * assembler/LinkBuffer.h: |
| (JSC::LinkBuffer::finalizeCodeWithDisassembly): |
| |
| 2018-04-18 Yusuke Suzuki <utatane.tea@gmail.com> |
| |
| Unreviewed, reland r230697, r230720, and r230724. |
| https://bugs.webkit.org/show_bug.cgi?id=184600 |
| |
| With CatchScope check. |
| |
| * JavaScriptCore.xcodeproj/project.pbxproj: |
| * builtins/ModuleLoaderPrototype.js: |
| (globalPrivate.newRegistryEntry): |
| (requestInstantiate): |
| (link): |
| * jsc.cpp: |
| (convertShebangToJSComment): |
| (fillBufferWithContentsOfFile): |
| (fetchModuleFromLocalFileSystem): |
| (GlobalObject::moduleLoaderFetch): |
| (functionDollarAgentStart): |
| (checkException): |
| (runWithOptions): |
| * parser/NodesAnalyzeModule.cpp: |
| (JSC::ImportDeclarationNode::analyzeModule): |
| * parser/SourceProvider.h: |
| (JSC::WebAssemblySourceProvider::create): |
| (JSC::WebAssemblySourceProvider::WebAssemblySourceProvider): |
| * runtime/AbstractModuleRecord.cpp: |
| (JSC::AbstractModuleRecord::hostResolveImportedModule): |
| (JSC::AbstractModuleRecord::resolveImport): |
| (JSC::AbstractModuleRecord::link): |
| (JSC::AbstractModuleRecord::evaluate): |
| (JSC::identifierToJSValue): Deleted. |
| * runtime/AbstractModuleRecord.h: |
| (JSC::AbstractModuleRecord::moduleEnvironmentMayBeNull): |
| (JSC::AbstractModuleRecord::ImportEntry::isNamespace const): Deleted. |
| * runtime/JSModuleEnvironment.cpp: |
| (JSC::JSModuleEnvironment::getOwnNonIndexPropertyNames): |
| * runtime/JSModuleLoader.cpp: |
| (JSC::JSModuleLoader::evaluate): |
| * runtime/JSModuleRecord.cpp: |
| (JSC::JSModuleRecord::link): |
| (JSC::JSModuleRecord::instantiateDeclarations): |
| * runtime/JSModuleRecord.h: |
| * runtime/ModuleLoaderPrototype.cpp: |
| (JSC::moduleLoaderPrototypeParseModule): |
| (JSC::moduleLoaderPrototypeRequestedModules): |
| (JSC::moduleLoaderPrototypeModuleDeclarationInstantiation): |
| * wasm/WasmCreationMode.h: Copied from Source/JavaScriptCore/wasm/js/WebAssemblyPrototype.h. |
| * wasm/js/JSWebAssemblyHelpers.h: |
| (JSC::getWasmBufferFromValue): |
| (JSC::createSourceBufferFromValue): |
| * wasm/js/JSWebAssemblyInstance.cpp: |
| (JSC::JSWebAssemblyInstance::finalizeCreation): |
| (JSC::JSWebAssemblyInstance::createPrivateModuleKey): |
| (JSC::JSWebAssemblyInstance::create): |
| * wasm/js/JSWebAssemblyInstance.h: |
| * wasm/js/WebAssemblyInstanceConstructor.cpp: |
| (JSC::constructJSWebAssemblyInstance): |
| * wasm/js/WebAssemblyModuleRecord.cpp: |
| (JSC::WebAssemblyModuleRecord::prepareLink): |
| (JSC::WebAssemblyModuleRecord::link): |
| * wasm/js/WebAssemblyModuleRecord.h: |
| * wasm/js/WebAssemblyPrototype.cpp: |
| (JSC::resolve): |
| (JSC::instantiate): |
| (JSC::compileAndInstantiate): |
| (JSC::WebAssemblyPrototype::instantiate): |
| (JSC::webAssemblyInstantiateFunc): |
| (JSC::webAssemblyValidateFunc): |
| * wasm/js/WebAssemblyPrototype.h: |
| |
| 2018-04-17 Carlos Garcia Campos <cgarcia@igalia.com> |
| |
| [GLIB] Make it possible to handle JSCClass external properties not added to the prototype |
| https://bugs.webkit.org/show_bug.cgi?id=184687 |
| |
| Reviewed by Michael Catanzaro. |
| |
| Add JSCClassVTable that can be optionally passed to jsc_context_register_class() to provide implmentations for |
| JSClassDefinition. This is required to implement dynamic properties that can't be added with |
| jsc_class_add_property() for example to implement something like imports object in seed/gjs. |
| |
| * API/glib/JSCClass.cpp: |
| (VTableExceptionHandler::VTableExceptionHandler): Helper class to handle the exceptions in vtable functions that |
| can throw exceptions. |
| (VTableExceptionHandler::~VTableExceptionHandler): |
| (getProperty): Iterate the class chain to call get_property function. |
| (setProperty): Iterate the class chain to call set_property function. |
| (hasProperty): Iterate the class chain to call has_property function. |
| (deleteProperty): Iterate the class chain to call delete_property function. |
| (getPropertyNames): Iterate the class chain to call enumerate_properties function. |
| (jsc_class_class_init): Remove constructed implementation, since we need to initialize the JSClassDefinition in |
| jscClassCreate now. |
| (jscClassCreate): Receive an optional JSCClassVTable that is used to initialize the JSClassDefinition. |
| * API/glib/JSCClass.h: |
| * API/glib/JSCClassPrivate.h: |
| * API/glib/JSCContext.cpp: |
| (jscContextGetRegisteredClass): Helper to get the JSCClass for a given JSClassRef. |
| (jsc_context_register_class): Add JSCClassVTable parameter. |
| * API/glib/JSCContext.h: |
| * API/glib/JSCContextPrivate.h: |
| * API/glib/JSCWrapperMap.cpp: |
| (JSC::WrapperMap::registeredClass const): Get the JSCClass for a given JSClassRef. |
| * API/glib/JSCWrapperMap.h: |
| * API/glib/docs/jsc-glib-4.0-sections.txt: Add new symbols. |
| |
| 2018-04-17 Mark Lam <mark.lam@apple.com> |
| |
| Templatize CodePtr/Refs/FunctionPtrs with PtrTags. |
| https://bugs.webkit.org/show_bug.cgi?id=184702 |
| <rdar://problem/35391681> |
| |
| Reviewed by Filip Pizlo and Saam Barati. |
| |
| 1. Templatized MacroAssemblerCodePtr/Ref, FunctionPtr, and CodeLocation variants |
| to take a PtrTag template argument. |
| 2. Replaced some uses of raw pointers with the equivalent CodePtr / FunctionPtr. |
| |
| * assembler/AbstractMacroAssembler.h: |
| (JSC::AbstractMacroAssembler::differenceBetweenCodePtr): |
| (JSC::AbstractMacroAssembler::linkJump): |
| (JSC::AbstractMacroAssembler::linkPointer): |
| (JSC::AbstractMacroAssembler::getLinkerAddress): |
| (JSC::AbstractMacroAssembler::repatchJump): |
| (JSC::AbstractMacroAssembler::repatchJumpToNop): |
| (JSC::AbstractMacroAssembler::repatchNearCall): |
| (JSC::AbstractMacroAssembler::repatchCompact): |
| (JSC::AbstractMacroAssembler::repatchInt32): |
| (JSC::AbstractMacroAssembler::repatchPointer): |
| (JSC::AbstractMacroAssembler::readPointer): |
| (JSC::AbstractMacroAssembler::replaceWithLoad): |
| (JSC::AbstractMacroAssembler::replaceWithAddressComputation): |
| * assembler/CodeLocation.h: |
| (JSC::CodeLocationCommon:: const): |
| (JSC::CodeLocationCommon::CodeLocationCommon): |
| (JSC::CodeLocationInstruction::CodeLocationInstruction): |
| (JSC::CodeLocationLabel::CodeLocationLabel): |
| (JSC::CodeLocationLabel::retagged): |
| (JSC::CodeLocationLabel:: const): |
| (JSC::CodeLocationJump::CodeLocationJump): |
| (JSC::CodeLocationJump::retagged): |
| (JSC::CodeLocationCall::CodeLocationCall): |
| (JSC::CodeLocationCall::retagged): |
| (JSC::CodeLocationNearCall::CodeLocationNearCall): |
| (JSC::CodeLocationDataLabel32::CodeLocationDataLabel32): |
| (JSC::CodeLocationDataLabelCompact::CodeLocationDataLabelCompact): |
| (JSC::CodeLocationDataLabelPtr::CodeLocationDataLabelPtr): |
| (JSC::CodeLocationConvertibleLoad::CodeLocationConvertibleLoad): |
| (JSC::CodeLocationCommon<tag>::instructionAtOffset): |
| (JSC::CodeLocationCommon<tag>::labelAtOffset): |
| (JSC::CodeLocationCommon<tag>::jumpAtOffset): |
| (JSC::CodeLocationCommon<tag>::callAtOffset): |
| (JSC::CodeLocationCommon<tag>::nearCallAtOffset): |
| (JSC::CodeLocationCommon<tag>::dataLabelPtrAtOffset): |
| (JSC::CodeLocationCommon<tag>::dataLabel32AtOffset): |
| (JSC::CodeLocationCommon<tag>::dataLabelCompactAtOffset): |
| (JSC::CodeLocationCommon<tag>::convertibleLoadAtOffset): |
| (JSC::CodeLocationCommon::instructionAtOffset): Deleted. |
| (JSC::CodeLocationCommon::labelAtOffset): Deleted. |
| (JSC::CodeLocationCommon::jumpAtOffset): Deleted. |
| (JSC::CodeLocationCommon::callAtOffset): Deleted. |
| (JSC::CodeLocationCommon::nearCallAtOffset): Deleted. |
| (JSC::CodeLocationCommon::dataLabelPtrAtOffset): Deleted. |
| (JSC::CodeLocationCommon::dataLabel32AtOffset): Deleted. |
| (JSC::CodeLocationCommon::dataLabelCompactAtOffset): Deleted. |
| (JSC::CodeLocationCommon::convertibleLoadAtOffset): Deleted. |
| * assembler/LinkBuffer.cpp: |
| (JSC::LinkBuffer::finalizeCodeWithoutDisassemblyImpl): |
| (JSC::LinkBuffer::finalizeCodeWithDisassemblyImpl): |
| (JSC::LinkBuffer::finalizeCodeWithoutDisassembly): Deleted. |
| (JSC::LinkBuffer::finalizeCodeWithDisassembly): Deleted. |
| * assembler/LinkBuffer.h: |
| (JSC::LinkBuffer::link): |
| (JSC::LinkBuffer::patch): |
| (JSC::LinkBuffer::entrypoint): |
| (JSC::LinkBuffer::locationOf): |
| (JSC::LinkBuffer::locationOfNearCall): |
| (JSC::LinkBuffer::finalizeCodeWithoutDisassembly): |
| (JSC::LinkBuffer::finalizeCodeWithDisassembly): |
| (JSC::LinkBuffer::trampolineAt): |
| * assembler/MacroAssemblerARM.h: |
| (JSC::MacroAssemblerARM::readCallTarget): |
| (JSC::MacroAssemblerARM::replaceWithJump): |
| (JSC::MacroAssemblerARM::startOfPatchableBranch32WithPatchOnAddress): |
| (JSC::MacroAssemblerARM::startOfPatchableBranchPtrWithPatchOnAddress): |
| (JSC::MacroAssemblerARM::startOfBranchPtrWithPatchOnRegister): |
| (JSC::MacroAssemblerARM::revertJumpReplacementToBranchPtrWithPatch): |
| (JSC::MacroAssemblerARM::revertJumpReplacementToPatchableBranch32WithPatch): |
| (JSC::MacroAssemblerARM::revertJumpReplacementToPatchableBranchPtrWithPatch): |
| (JSC::MacroAssemblerARM::repatchCall): |
| (JSC::MacroAssemblerARM::linkCall): |
| * assembler/MacroAssemblerARM64.h: |
| (JSC::MacroAssemblerARM64::readCallTarget): |
| (JSC::MacroAssemblerARM64::replaceWithVMHalt): |
| (JSC::MacroAssemblerARM64::replaceWithJump): |
| (JSC::MacroAssemblerARM64::startOfBranchPtrWithPatchOnRegister): |
| (JSC::MacroAssemblerARM64::startOfPatchableBranchPtrWithPatchOnAddress): |
| (JSC::MacroAssemblerARM64::startOfPatchableBranch32WithPatchOnAddress): |
| (JSC::MacroAssemblerARM64::revertJumpReplacementToBranchPtrWithPatch): |
| (JSC::MacroAssemblerARM64::revertJumpReplacementToPatchableBranchPtrWithPatch): |
| (JSC::MacroAssemblerARM64::revertJumpReplacementToPatchableBranch32WithPatch): |
| (JSC::MacroAssemblerARM64::repatchCall): |
| (JSC::MacroAssemblerARM64::linkCall): |
| * assembler/MacroAssemblerARMv7.h: |
| (JSC::MacroAssemblerARMv7::replaceWithJump): |
| (JSC::MacroAssemblerARMv7::readCallTarget): |
| (JSC::MacroAssemblerARMv7::startOfBranchPtrWithPatchOnRegister): |
| (JSC::MacroAssemblerARMv7::revertJumpReplacementToBranchPtrWithPatch): |
| (JSC::MacroAssemblerARMv7::startOfPatchableBranchPtrWithPatchOnAddress): |
| (JSC::MacroAssemblerARMv7::startOfPatchableBranch32WithPatchOnAddress): |
| (JSC::MacroAssemblerARMv7::revertJumpReplacementToPatchableBranchPtrWithPatch): |
| (JSC::MacroAssemblerARMv7::revertJumpReplacementToPatchableBranch32WithPatch): |
| (JSC::MacroAssemblerARMv7::repatchCall): |
| (JSC::MacroAssemblerARMv7::linkCall): |
| * assembler/MacroAssemblerCodeRef.cpp: |
| (JSC::MacroAssemblerCodePtrBase::dumpWithName): |
| (JSC::MacroAssemblerCodeRefBase::tryToDisassemble): |
| (JSC::MacroAssemblerCodeRefBase::disassembly): |
| (JSC::MacroAssemblerCodePtr::createLLIntCodePtr): Deleted. |
| (JSC::MacroAssemblerCodePtr::dumpWithName const): Deleted. |
| (JSC::MacroAssemblerCodePtr::dump const): Deleted. |
| (JSC::MacroAssemblerCodeRef::createLLIntCodeRef): Deleted. |
| (JSC::MacroAssemblerCodeRef::tryToDisassemble const): Deleted. |
| (JSC::MacroAssemblerCodeRef::disassembly const): Deleted. |
| (JSC::MacroAssemblerCodeRef::dump const): Deleted. |
| * assembler/MacroAssemblerCodeRef.h: |
| (JSC::FunctionPtr::FunctionPtr): |
| (JSC::FunctionPtr::retagged const): |
| (JSC::FunctionPtr::retaggedExecutableAddress const): |
| (JSC::FunctionPtr::operator== const): |
| (JSC::FunctionPtr::operator!= const): |
| (JSC::ReturnAddressPtr::ReturnAddressPtr): |
| (JSC::MacroAssemblerCodePtr::MacroAssemblerCodePtr): |
| (JSC::MacroAssemblerCodePtr::createFromExecutableAddress): |
| (JSC::MacroAssemblerCodePtr::retagged const): |
| (JSC::MacroAssemblerCodePtr:: const): |
| (JSC::MacroAssemblerCodePtr::dumpWithName const): |
| (JSC::MacroAssemblerCodePtr::dump const): |
| (JSC::MacroAssemblerCodePtrHash::hash): |
| (JSC::MacroAssemblerCodePtrHash::equal): |
| (JSC::MacroAssemblerCodeRef::MacroAssemblerCodeRef): |
| (JSC::MacroAssemblerCodeRef::createSelfManagedCodeRef): |
| (JSC::MacroAssemblerCodeRef::code const): |
| (JSC::MacroAssemblerCodeRef::retaggedCode const): |
| (JSC::MacroAssemblerCodeRef::retagged const): |
| (JSC::MacroAssemblerCodeRef::tryToDisassemble const): |
| (JSC::MacroAssemblerCodeRef::disassembly const): |
| (JSC::MacroAssemblerCodeRef::dump const): |
| (JSC::FunctionPtr<tag>::FunctionPtr): |
| * assembler/MacroAssemblerMIPS.h: |
| (JSC::MacroAssemblerMIPS::readCallTarget): |
| (JSC::MacroAssemblerMIPS::replaceWithJump): |
| (JSC::MacroAssemblerMIPS::startOfPatchableBranch32WithPatchOnAddress): |
| (JSC::MacroAssemblerMIPS::startOfBranchPtrWithPatchOnRegister): |
| (JSC::MacroAssemblerMIPS::revertJumpReplacementToBranchPtrWithPatch): |
| (JSC::MacroAssemblerMIPS::startOfPatchableBranchPtrWithPatchOnAddress): |
| (JSC::MacroAssemblerMIPS::revertJumpReplacementToPatchableBranch32WithPatch): |
| (JSC::MacroAssemblerMIPS::revertJumpReplacementToPatchableBranchPtrWithPatch): |
| (JSC::MacroAssemblerMIPS::repatchCall): |
| (JSC::MacroAssemblerMIPS::linkCall): |
| * assembler/MacroAssemblerX86.h: |
| (JSC::MacroAssemblerX86::readCallTarget): |
| (JSC::MacroAssemblerX86::startOfBranchPtrWithPatchOnRegister): |
| (JSC::MacroAssemblerX86::startOfPatchableBranchPtrWithPatchOnAddress): |
| (JSC::MacroAssemblerX86::startOfPatchableBranch32WithPatchOnAddress): |
| (JSC::MacroAssemblerX86::revertJumpReplacementToBranchPtrWithPatch): |
| (JSC::MacroAssemblerX86::revertJumpReplacementToPatchableBranchPtrWithPatch): |
| (JSC::MacroAssemblerX86::revertJumpReplacementToPatchableBranch32WithPatch): |
| (JSC::MacroAssemblerX86::repatchCall): |
| (JSC::MacroAssemblerX86::linkCall): |
| * assembler/MacroAssemblerX86Common.h: |
| (JSC::MacroAssemblerX86Common::repatchCompact): |
| (JSC::MacroAssemblerX86Common::replaceWithVMHalt): |
| (JSC::MacroAssemblerX86Common::replaceWithJump): |
| * assembler/MacroAssemblerX86_64.h: |
| (JSC::MacroAssemblerX86_64::readCallTarget): |
| (JSC::MacroAssemblerX86_64::startOfBranchPtrWithPatchOnRegister): |
| (JSC::MacroAssemblerX86_64::startOfBranch32WithPatchOnRegister): |
| (JSC::MacroAssemblerX86_64::startOfPatchableBranchPtrWithPatchOnAddress): |
| (JSC::MacroAssemblerX86_64::startOfPatchableBranch32WithPatchOnAddress): |
| (JSC::MacroAssemblerX86_64::revertJumpReplacementToPatchableBranchPtrWithPatch): |
| (JSC::MacroAssemblerX86_64::revertJumpReplacementToPatchableBranch32WithPatch): |
| (JSC::MacroAssemblerX86_64::revertJumpReplacementToBranchPtrWithPatch): |
| (JSC::MacroAssemblerX86_64::repatchCall): |
| (JSC::MacroAssemblerX86_64::linkCall): |
| * assembler/testmasm.cpp: |
| (JSC::compile): |
| (JSC::invoke): |
| (JSC::testProbeModifiesProgramCounter): |
| * b3/B3Compilation.cpp: |
| (JSC::B3::Compilation::Compilation): |
| * b3/B3Compilation.h: |
| (JSC::B3::Compilation::code const): |
| (JSC::B3::Compilation::codeRef const): |
| * b3/B3Compile.cpp: |
| (JSC::B3::compile): |
| * b3/B3LowerMacros.cpp: |
| * b3/air/AirDisassembler.cpp: |
| (JSC::B3::Air::Disassembler::dump): |
| * b3/air/testair.cpp: |
| * b3/testb3.cpp: |
| (JSC::B3::invoke): |
| (JSC::B3::testInterpreter): |
| (JSC::B3::testEntrySwitchSimple): |
| (JSC::B3::testEntrySwitchNoEntrySwitch): |
| (JSC::B3::testEntrySwitchWithCommonPaths): |
| (JSC::B3::testEntrySwitchWithCommonPathsAndNonTrivialEntrypoint): |
| (JSC::B3::testEntrySwitchLoop): |
| * bytecode/AccessCase.cpp: |
| (JSC::AccessCase::generateImpl): |
| * bytecode/AccessCaseSnippetParams.cpp: |
| (JSC::SlowPathCallGeneratorWithArguments::generateImpl): |
| * bytecode/ByValInfo.h: |
| (JSC::ByValInfo::ByValInfo): |
| * bytecode/CallLinkInfo.cpp: |
| (JSC::CallLinkInfo::callReturnLocation): |
| (JSC::CallLinkInfo::patchableJump): |
| (JSC::CallLinkInfo::hotPathBegin): |
| (JSC::CallLinkInfo::slowPathStart): |
| * bytecode/CallLinkInfo.h: |
| (JSC::CallLinkInfo::setCallLocations): |
| (JSC::CallLinkInfo::hotPathOther): |
| * bytecode/CodeBlock.cpp: |
| (JSC::CodeBlock::finishCreation): |
| * bytecode/GetByIdStatus.cpp: |
| (JSC::GetByIdStatus::computeForStubInfoWithoutExitSiteFeedback): |
| * bytecode/GetByIdVariant.cpp: |
| (JSC::GetByIdVariant::GetByIdVariant): |
| (JSC::GetByIdVariant::dumpInContext const): |
| * bytecode/GetByIdVariant.h: |
| (JSC::GetByIdVariant::customAccessorGetter const): |
| * bytecode/GetterSetterAccessCase.cpp: |
| (JSC::GetterSetterAccessCase::create): |
| (JSC::GetterSetterAccessCase::GetterSetterAccessCase): |
| (JSC::GetterSetterAccessCase::dumpImpl const): |
| * bytecode/GetterSetterAccessCase.h: |
| (JSC::GetterSetterAccessCase::customAccessor const): |
| (): Deleted. |
| * bytecode/HandlerInfo.h: |
| (JSC::HandlerInfo::initialize): |
| * bytecode/InlineAccess.cpp: |
| (JSC::linkCodeInline): |
| (JSC::InlineAccess::rewireStubAsJump): |
| * bytecode/InlineAccess.h: |
| * bytecode/JumpTable.h: |
| (JSC::StringJumpTable::ctiForValue): |
| (JSC::SimpleJumpTable::ctiForValue): |
| * bytecode/LLIntCallLinkInfo.h: |
| (JSC::LLIntCallLinkInfo::unlink): |
| * bytecode/PolymorphicAccess.cpp: |
| (JSC::AccessGenerationState::emitExplicitExceptionHandler): |
| (JSC::PolymorphicAccess::regenerate): |
| * bytecode/PolymorphicAccess.h: |
| (JSC::AccessGenerationResult::AccessGenerationResult): |
| (JSC::AccessGenerationResult::code const): |
| * bytecode/StructureStubInfo.h: |
| (JSC::StructureStubInfo::slowPathCallLocation): |
| (JSC::StructureStubInfo::doneLocation): |
| (JSC::StructureStubInfo::slowPathStartLocation): |
| (JSC::StructureStubInfo::patchableJumpForIn): |
| * dfg/DFGCommonData.h: |
| (JSC::DFG::CommonData::appendCatchEntrypoint): |
| * dfg/DFGDisassembler.cpp: |
| (JSC::DFG::Disassembler::dumpDisassembly): |
| * dfg/DFGDriver.h: |
| * dfg/DFGJITCompiler.cpp: |
| (JSC::DFG::JITCompiler::linkOSRExits): |
| (JSC::DFG::JITCompiler::compileExceptionHandlers): |
| (JSC::DFG::JITCompiler::link): |
| (JSC::DFG::JITCompiler::compileFunction): |
| (JSC::DFG::JITCompiler::noticeCatchEntrypoint): |
| * dfg/DFGJITCompiler.h: |
| (JSC::DFG::CallLinkRecord::CallLinkRecord): |
| (JSC::DFG::JITCompiler::appendCall): |
| (JSC::DFG::JITCompiler::JSCallRecord::JSCallRecord): |
| (JSC::DFG::JITCompiler::JSDirectCallRecord::JSDirectCallRecord): |
| (JSC::DFG::JITCompiler::JSDirectTailCallRecord::JSDirectTailCallRecord): |
| * dfg/DFGJITFinalizer.cpp: |
| (JSC::DFG::JITFinalizer::JITFinalizer): |
| (JSC::DFG::JITFinalizer::finalize): |
| (JSC::DFG::JITFinalizer::finalizeFunction): |
| * dfg/DFGJITFinalizer.h: |
| * dfg/DFGJumpReplacement.h: |
| (JSC::DFG::JumpReplacement::JumpReplacement): |
| * dfg/DFGNode.h: |
| * dfg/DFGOSREntry.cpp: |
| (JSC::DFG::prepareOSREntry): |
| (JSC::DFG::prepareCatchOSREntry): |
| * dfg/DFGOSREntry.h: |
| (JSC::DFG::prepareOSREntry): |
| * dfg/DFGOSRExit.cpp: |
| (JSC::DFG::OSRExit::executeOSRExit): |
| (JSC::DFG::reifyInlinedCallFrames): |
| (JSC::DFG::adjustAndJumpToTarget): |
| (JSC::DFG::OSRExit::codeLocationForRepatch const): |
| (JSC::DFG::OSRExit::emitRestoreArguments): |
| (JSC::DFG::OSRExit::compileOSRExit): |
| * dfg/DFGOSRExit.h: |
| * dfg/DFGOSRExitCompilerCommon.cpp: |
| (JSC::DFG::handleExitCounts): |
| (JSC::DFG::reifyInlinedCallFrames): |
| (JSC::DFG::osrWriteBarrier): |
| (JSC::DFG::adjustAndJumpToTarget): |
| * dfg/DFGOperations.cpp: |
| * dfg/DFGSlowPathGenerator.h: |
| (JSC::DFG::CallResultAndArgumentsSlowPathGenerator::CallResultAndArgumentsSlowPathGenerator): |
| (JSC::DFG::CallResultAndArgumentsSlowPathGenerator::unpackAndGenerate): |
| (JSC::DFG::slowPathCall): |
| * dfg/DFGSpeculativeJIT.cpp: |
| (JSC::DFG::SpeculativeJIT::compileMathIC): |
| (JSC::DFG::SpeculativeJIT::compileCallDOM): |
| (JSC::DFG::SpeculativeJIT::compileCallDOMGetter): |
| (JSC::DFG::SpeculativeJIT::emitSwitchIntJump): |
| (JSC::DFG::SpeculativeJIT::emitSwitchImm): |
| (JSC::DFG::SpeculativeJIT::emitSwitchStringOnString): |
| (JSC::DFG::SpeculativeJIT::compileHasIndexedProperty): |
| (JSC::DFG::SpeculativeJIT::compileGetDirectPname): |
| (JSC::DFG::SpeculativeJIT::cachedPutById): |
| * dfg/DFGSpeculativeJIT.h: |
| (JSC::DFG::SpeculativeJIT::callOperation): |
| (JSC::DFG::SpeculativeJIT::appendCall): |
| (JSC::DFG::SpeculativeJIT::appendCallWithCallFrameRollbackOnException): |
| (JSC::DFG::SpeculativeJIT::appendCallWithCallFrameRollbackOnExceptionSetResult): |
| (JSC::DFG::SpeculativeJIT::appendCallSetResult): |
| * dfg/DFGSpeculativeJIT64.cpp: |
| (JSC::DFG::SpeculativeJIT::cachedGetById): |
| (JSC::DFG::SpeculativeJIT::cachedGetByIdWithThis): |
| (JSC::DFG::SpeculativeJIT::compile): |
| * dfg/DFGThunks.cpp: |
| (JSC::DFG::osrExitThunkGenerator): |
| (JSC::DFG::osrExitGenerationThunkGenerator): |
| (JSC::DFG::osrEntryThunkGenerator): |
| * dfg/DFGThunks.h: |
| * disassembler/ARM64Disassembler.cpp: |
| (JSC::tryToDisassemble): |
| * disassembler/ARMv7Disassembler.cpp: |
| (JSC::tryToDisassemble): |
| * disassembler/Disassembler.cpp: |
| (JSC::disassemble): |
| (JSC::disassembleAsynchronously): |
| * disassembler/Disassembler.h: |
| (JSC::tryToDisassemble): |
| * disassembler/UDis86Disassembler.cpp: |
| (JSC::tryToDisassembleWithUDis86): |
| * disassembler/UDis86Disassembler.h: |
| (JSC::tryToDisassembleWithUDis86): |
| * disassembler/X86Disassembler.cpp: |
| (JSC::tryToDisassemble): |
| * ftl/FTLCompile.cpp: |
| (JSC::FTL::compile): |
| * ftl/FTLExceptionTarget.cpp: |
| (JSC::FTL::ExceptionTarget::label): |
| (JSC::FTL::ExceptionTarget::jumps): |
| * ftl/FTLExceptionTarget.h: |
| * ftl/FTLGeneratedFunction.h: |
| * ftl/FTLJITCode.cpp: |
| (JSC::FTL::JITCode::initializeB3Code): |
| (JSC::FTL::JITCode::initializeAddressForCall): |
| (JSC::FTL::JITCode::initializeArityCheckEntrypoint): |
| (JSC::FTL::JITCode::addressForCall): |
| (JSC::FTL::JITCode::executableAddressAtOffset): |
| * ftl/FTLJITCode.h: |
| (JSC::FTL::JITCode::b3Code const): |
| * ftl/FTLJITFinalizer.cpp: |
| (JSC::FTL::JITFinalizer::finalizeCommon): |
| * ftl/FTLLazySlowPath.cpp: |
| (JSC::FTL::LazySlowPath::initialize): |
| (JSC::FTL::LazySlowPath::generate): |
| * ftl/FTLLazySlowPath.h: |
| (JSC::FTL::LazySlowPath::patchableJump const): |
| (JSC::FTL::LazySlowPath::done const): |
| (JSC::FTL::LazySlowPath::stub const): |
| * ftl/FTLLazySlowPathCall.h: |
| (JSC::FTL::createLazyCallGenerator): |
| * ftl/FTLLink.cpp: |
| (JSC::FTL::link): |
| * ftl/FTLLowerDFGToB3.cpp: |
| (JSC::FTL::DFG::LowerDFGToB3::lower): |
| (JSC::FTL::DFG::LowerDFGToB3::compileCallOrConstruct): |
| (JSC::FTL::DFG::LowerDFGToB3::compileDirectCallOrConstruct): |
| (JSC::FTL::DFG::LowerDFGToB3::compileTailCall): |
| (JSC::FTL::DFG::LowerDFGToB3::compileCallOrConstructVarargsSpread): |
| (JSC::FTL::DFG::LowerDFGToB3::compileCallOrConstructVarargs): |
| (JSC::FTL::DFG::LowerDFGToB3::compileCallEval): |
| (JSC::FTL::DFG::LowerDFGToB3::compileInvalidationPoint): |
| (JSC::FTL::DFG::LowerDFGToB3::compileIn): |
| (JSC::FTL::DFG::LowerDFGToB3::compileCheckSubClass): |
| (JSC::FTL::DFG::LowerDFGToB3::compileCallDOM): |
| (JSC::FTL::DFG::LowerDFGToB3::compileCallDOMGetter): |
| (JSC::FTL::DFG::LowerDFGToB3::lazySlowPath): |
| * ftl/FTLOSRExit.cpp: |
| (JSC::FTL::OSRExit::codeLocationForRepatch const): |
| * ftl/FTLOSRExit.h: |
| * ftl/FTLOSRExitCompiler.cpp: |
| (JSC::FTL::compileStub): |
| (JSC::FTL::compileFTLOSRExit): |
| * ftl/FTLOSRExitHandle.cpp: |
| (JSC::FTL::OSRExitHandle::emitExitThunk): |
| * ftl/FTLOperations.cpp: |
| (JSC::FTL::compileFTLLazySlowPath): |
| * ftl/FTLPatchpointExceptionHandle.cpp: |
| (JSC::FTL::PatchpointExceptionHandle::scheduleExitCreationForUnwind): |
| * ftl/FTLSlowPathCall.cpp: |
| (JSC::FTL::SlowPathCallContext::keyWithTarget const): |
| (JSC::FTL::SlowPathCallContext::makeCall): |
| * ftl/FTLSlowPathCall.h: |
| (JSC::FTL::callOperation): |
| * ftl/FTLSlowPathCallKey.cpp: |
| (JSC::FTL::SlowPathCallKey::dump const): |
| * ftl/FTLSlowPathCallKey.h: |
| (JSC::FTL::SlowPathCallKey::SlowPathCallKey): |
| (JSC::FTL::SlowPathCallKey::callTarget const): |
| (JSC::FTL::SlowPathCallKey::withCallTarget): |
| (JSC::FTL::SlowPathCallKey::hash const): |
| (JSC::FTL::SlowPathCallKey::callPtrTag const): Deleted. |
| * ftl/FTLState.cpp: |
| (JSC::FTL::State::State): |
| * ftl/FTLThunks.cpp: |
| (JSC::FTL::genericGenerationThunkGenerator): |
| (JSC::FTL::osrExitGenerationThunkGenerator): |
| (JSC::FTL::lazySlowPathGenerationThunkGenerator): |
| (JSC::FTL::slowPathCallThunkGenerator): |
| * ftl/FTLThunks.h: |
| (JSC::FTL::generateIfNecessary): |
| (JSC::FTL::keyForThunk): |
| (JSC::FTL::Thunks::getSlowPathCallThunk): |
| (JSC::FTL::Thunks::keyForSlowPathCallThunk): |
| * interpreter/InterpreterInlines.h: |
| (JSC::Interpreter::getOpcodeID): |
| * jit/AssemblyHelpers.cpp: |
| (JSC::AssemblyHelpers::callExceptionFuzz): |
| (JSC::AssemblyHelpers::emitDumbVirtualCall): |
| (JSC::AssemblyHelpers::debugCall): |
| * jit/CCallHelpers.cpp: |
| (JSC::CCallHelpers::ensureShadowChickenPacket): |
| * jit/ExecutableAllocator.cpp: |
| (JSC::FixedVMPoolExecutableAllocator::initializeSeparatedWXHeaps): |
| (JSC::FixedVMPoolExecutableAllocator::jitWriteThunkGenerator): |
| * jit/ExecutableAllocator.h: |
| (JSC::performJITMemcpy): |
| * jit/GCAwareJITStubRoutine.cpp: |
| (JSC::GCAwareJITStubRoutine::GCAwareJITStubRoutine): |
| (JSC::MarkingGCAwareJITStubRoutine::MarkingGCAwareJITStubRoutine): |
| (JSC::GCAwareJITStubRoutineWithExceptionHandler::GCAwareJITStubRoutineWithExceptionHandler): |
| (JSC::createJITStubRoutine): |
| * jit/GCAwareJITStubRoutine.h: |
| (JSC::createJITStubRoutine): |
| * jit/JIT.cpp: |
| (JSC::ctiPatchCallByReturnAddress): |
| (JSC::JIT::compileWithoutLinking): |
| (JSC::JIT::link): |
| (JSC::JIT::privateCompileExceptionHandlers): |
| * jit/JIT.h: |
| (JSC::CallRecord::CallRecord): |
| * jit/JITArithmetic.cpp: |
| (JSC::JIT::emitMathICFast): |
| (JSC::JIT::emitMathICSlow): |
| * jit/JITCall.cpp: |
| (JSC::JIT::compileOpCallSlowCase): |
| * jit/JITCall32_64.cpp: |
| (JSC::JIT::compileOpCallSlowCase): |
| * jit/JITCode.cpp: |
| (JSC::JITCodeWithCodeRef::JITCodeWithCodeRef): |
| (JSC::JITCodeWithCodeRef::executableAddressAtOffset): |
| (JSC::DirectJITCode::DirectJITCode): |
| (JSC::DirectJITCode::initializeCodeRef): |
| (JSC::DirectJITCode::addressForCall): |
| (JSC::NativeJITCode::NativeJITCode): |
| (JSC::NativeJITCode::initializeCodeRef): |
| (JSC::NativeJITCode::addressForCall): |
| * jit/JITCode.h: |
| * jit/JITCodeMap.h: |
| (JSC::JITCodeMap::Entry::Entry): |
| (JSC::JITCodeMap::Entry::codeLocation): |
| (JSC::JITCodeMap::append): |
| (JSC::JITCodeMap::find const): |
| * jit/JITDisassembler.cpp: |
| (JSC::JITDisassembler::dumpDisassembly): |
| * jit/JITExceptions.cpp: |
| (JSC::genericUnwind): |
| * jit/JITInlineCacheGenerator.cpp: |
| (JSC::JITByIdGenerator::finalize): |
| * jit/JITInlines.h: |
| (JSC::JIT::emitNakedCall): |
| (JSC::JIT::emitNakedTailCall): |
| (JSC::JIT::appendCallWithExceptionCheck): |
| (JSC::JIT::appendCallWithExceptionCheckAndSlowPathReturnType): |
| (JSC::JIT::appendCallWithCallFrameRollbackOnException): |
| (JSC::JIT::appendCallWithExceptionCheckSetJSValueResult): |
| (JSC::JIT::appendCallWithExceptionCheckSetJSValueResultWithProfile): |
| * jit/JITMathIC.h: |
| (JSC::isProfileEmpty): |
| * jit/JITOpcodes.cpp: |
| (JSC::JIT::emit_op_catch): |
| (JSC::JIT::emit_op_switch_imm): |
| (JSC::JIT::emit_op_switch_char): |
| (JSC::JIT::emit_op_switch_string): |
| (JSC::JIT::privateCompileHasIndexedProperty): |
| (JSC::JIT::emitSlow_op_has_indexed_property): |
| * jit/JITOpcodes32_64.cpp: |
| (JSC::JIT::privateCompileHasIndexedProperty): |
| * jit/JITOperations.cpp: |
| (JSC::getByVal): |
| * jit/JITPropertyAccess.cpp: |
| (JSC::JIT::stringGetByValStubGenerator): |
| (JSC::JIT::emitGetByValWithCachedId): |
| (JSC::JIT::emitSlow_op_get_by_val): |
| (JSC::JIT::emitPutByValWithCachedId): |
| (JSC::JIT::emitSlow_op_put_by_val): |
| (JSC::JIT::emitSlow_op_try_get_by_id): |
| (JSC::JIT::emitSlow_op_get_by_id_direct): |
| (JSC::JIT::emitSlow_op_get_by_id): |
| (JSC::JIT::emitSlow_op_get_by_id_with_this): |
| (JSC::JIT::emitSlow_op_put_by_id): |
| (JSC::JIT::privateCompileGetByVal): |
| (JSC::JIT::privateCompileGetByValWithCachedId): |
| (JSC::JIT::privateCompilePutByVal): |
| (JSC::JIT::privateCompilePutByValWithCachedId): |
| * jit/JITPropertyAccess32_64.cpp: |
| (JSC::JIT::stringGetByValStubGenerator): |
| (JSC::JIT::emitSlow_op_get_by_val): |
| (JSC::JIT::emitSlow_op_put_by_val): |
| * jit/JITStubRoutine.h: |
| (JSC::JITStubRoutine::JITStubRoutine): |
| (JSC::JITStubRoutine::createSelfManagedRoutine): |
| (JSC::JITStubRoutine::code const): |
| (JSC::JITStubRoutine::asCodePtr): |
| * jit/JITThunks.cpp: |
| (JSC::JITThunks::ctiNativeCall): |
| (JSC::JITThunks::ctiNativeConstruct): |
| (JSC::JITThunks::ctiNativeTailCall): |
| (JSC::JITThunks::ctiNativeTailCallWithoutSavedTags): |
| (JSC::JITThunks::ctiInternalFunctionCall): |
| (JSC::JITThunks::ctiInternalFunctionConstruct): |
| (JSC::JITThunks::ctiStub): |
| (JSC::JITThunks::existingCTIStub): |
| (JSC::JITThunks::hostFunctionStub): |
| * jit/JITThunks.h: |
| * jit/PCToCodeOriginMap.cpp: |
| (JSC::PCToCodeOriginMap::PCToCodeOriginMap): |
| * jit/PCToCodeOriginMap.h: |
| * jit/PolymorphicCallStubRoutine.cpp: |
| (JSC::PolymorphicCallStubRoutine::PolymorphicCallStubRoutine): |
| * jit/PolymorphicCallStubRoutine.h: |
| * jit/Repatch.cpp: |
| (JSC::readPutICCallTarget): |
| (JSC::ftlThunkAwareRepatchCall): |
| (JSC::appropriateOptimizingGetByIdFunction): |
| (JSC::appropriateGetByIdFunction): |
| (JSC::tryCacheGetByID): |
| (JSC::repatchGetByID): |
| (JSC::tryCachePutByID): |
| (JSC::repatchPutByID): |
| (JSC::tryCacheIn): |
| (JSC::repatchIn): |
| (JSC::linkSlowFor): |
| (JSC::linkFor): |
| (JSC::linkDirectFor): |
| (JSC::revertCall): |
| (JSC::unlinkFor): |
| (JSC::linkVirtualFor): |
| (JSC::linkPolymorphicCall): |
| (JSC::resetGetByID): |
| (JSC::resetPutByID): |
| * jit/Repatch.h: |
| * jit/SlowPathCall.h: |
| (JSC::JITSlowPathCall::call): |
| * jit/SpecializedThunkJIT.h: |
| (JSC::SpecializedThunkJIT::finalize): |
| (JSC::SpecializedThunkJIT::callDoubleToDouble): |
| (JSC::SpecializedThunkJIT::callDoubleToDoublePreservingReturn): |
| * jit/ThunkGenerator.h: |
| * jit/ThunkGenerators.cpp: |
| (JSC::throwExceptionFromCallSlowPathGenerator): |
| (JSC::slowPathFor): |
| (JSC::linkCallThunkGenerator): |
| (JSC::linkPolymorphicCallThunkGenerator): |
| (JSC::virtualThunkFor): |
| (JSC::nativeForGenerator): |
| (JSC::nativeCallGenerator): |
| (JSC::nativeTailCallGenerator): |
| (JSC::nativeTailCallWithoutSavedTagsGenerator): |
| (JSC::nativeConstructGenerator): |
| (JSC::internalFunctionCallGenerator): |
| (JSC::internalFunctionConstructGenerator): |
| (JSC::arityFixupGenerator): |
| (JSC::unreachableGenerator): |
| (JSC::charCodeAtThunkGenerator): |
| (JSC::charAtThunkGenerator): |
| (JSC::fromCharCodeThunkGenerator): |
| (JSC::clz32ThunkGenerator): |
| (JSC::sqrtThunkGenerator): |
| (JSC::floorThunkGenerator): |
| (JSC::ceilThunkGenerator): |
| (JSC::truncThunkGenerator): |
| (JSC::roundThunkGenerator): |
| (JSC::expThunkGenerator): |
| (JSC::logThunkGenerator): |
| (JSC::absThunkGenerator): |
| (JSC::imulThunkGenerator): |
| (JSC::randomThunkGenerator): |
| (JSC::boundThisNoArgsFunctionCallGenerator): |
| * jit/ThunkGenerators.h: |
| * llint/LLIntData.cpp: |
| (JSC::LLInt::initialize): |
| * llint/LLIntData.h: |
| (JSC::LLInt::getExecutableAddress): |
| (JSC::LLInt::getCodePtr): |
| (JSC::LLInt::getCodeRef): |
| (JSC::LLInt::getCodeFunctionPtr): |
| * llint/LLIntEntrypoint.cpp: |
| (JSC::LLInt::setFunctionEntrypoint): |
| (JSC::LLInt::setEvalEntrypoint): |
| (JSC::LLInt::setProgramEntrypoint): |
| (JSC::LLInt::setModuleProgramEntrypoint): |
| * llint/LLIntExceptions.cpp: |
| (JSC::LLInt::callToThrow): |
| * llint/LLIntSlowPaths.cpp: |
| (JSC::LLInt::LLINT_SLOW_PATH_DECL): |
| (JSC::LLInt::setUpCall): |
| * llint/LLIntThunks.cpp: |
| (JSC::vmEntryToWasm): |
| (JSC::LLInt::generateThunkWithJumpTo): |
| (JSC::LLInt::functionForCallEntryThunkGenerator): |
| (JSC::LLInt::functionForConstructEntryThunkGenerator): |
| (JSC::LLInt::functionForCallArityCheckThunkGenerator): |
| (JSC::LLInt::functionForConstructArityCheckThunkGenerator): |
| (JSC::LLInt::evalEntryThunkGenerator): |
| (JSC::LLInt::programEntryThunkGenerator): |
| (JSC::LLInt::moduleProgramEntryThunkGenerator): |
| * llint/LLIntThunks.h: |
| * llint/LowLevelInterpreter.asm: |
| * llint/LowLevelInterpreter32_64.asm: |
| * llint/LowLevelInterpreter64.asm: |
| * profiler/ProfilerCompilation.cpp: |
| (JSC::Profiler::Compilation::addOSRExitSite): |
| * profiler/ProfilerCompilation.h: |
| * profiler/ProfilerOSRExitSite.cpp: |
| (JSC::Profiler::OSRExitSite::toJS const): |
| * profiler/ProfilerOSRExitSite.h: |
| (JSC::Profiler::OSRExitSite::OSRExitSite): |
| (JSC::Profiler::OSRExitSite::codeAddress const): |
| (JSC::Profiler::OSRExitSite:: const): Deleted. |
| * runtime/ExecutableBase.cpp: |
| (JSC::ExecutableBase::clearCode): |
| * runtime/ExecutableBase.h: |
| (JSC::ExecutableBase::entrypointFor): |
| * runtime/NativeExecutable.cpp: |
| (JSC::NativeExecutable::finishCreation): |
| * runtime/NativeFunction.h: |
| (JSC::TaggedNativeFunction::TaggedNativeFunction): |
| (JSC::TaggedNativeFunction::operator NativeFunction): |
| * runtime/PtrTag.h: |
| (JSC::tagCodePtr): |
| (JSC::untagCodePtr): |
| (JSC::retagCodePtr): |
| (JSC::tagCFunctionPtr): |
| (JSC::untagCFunctionPtr): |
| (JSC::nextPtrTagID): Deleted. |
| * runtime/PutPropertySlot.h: |
| (JSC::PutPropertySlot::PutPropertySlot): |
| (JSC::PutPropertySlot::setCustomValue): |
| (JSC::PutPropertySlot::setCustomAccessor): |
| (JSC::PutPropertySlot::customSetter const): |
| * runtime/ScriptExecutable.cpp: |
| (JSC::ScriptExecutable::installCode): |
| * runtime/VM.cpp: |
| (JSC::VM::getHostFunction): |
| (JSC::VM::getCTIInternalFunctionTrampolineFor): |
| * runtime/VM.h: |
| (JSC::VM::getCTIStub): |
| * wasm/WasmB3IRGenerator.cpp: |
| (JSC::Wasm::B3IRGenerator::B3IRGenerator): |
| (JSC::Wasm::B3IRGenerator::emitExceptionCheck): |
| (JSC::Wasm::B3IRGenerator::emitTierUpCheck): |
| (JSC::Wasm::B3IRGenerator::addCall): |
| (JSC::Wasm::B3IRGenerator::addCallIndirect): |
| * wasm/WasmBBQPlan.cpp: |
| (JSC::Wasm::BBQPlan::prepare): |
| (JSC::Wasm::BBQPlan::complete): |
| * wasm/WasmBBQPlan.h: |
| * wasm/WasmBinding.cpp: |
| (JSC::Wasm::wasmToWasm): |
| * wasm/WasmBinding.h: |
| * wasm/WasmCallee.h: |
| (JSC::Wasm::Callee::entrypoint const): |
| * wasm/WasmCallingConvention.h: |
| (JSC::Wasm::CallingConvention::setupFrameInPrologue const): |
| * wasm/WasmCodeBlock.h: |
| (JSC::Wasm::CodeBlock::entrypointLoadLocationFromFunctionIndexSpace): |
| * wasm/WasmFaultSignalHandler.cpp: |
| (JSC::Wasm::trapHandler): |
| * wasm/WasmFormat.h: |
| * wasm/WasmInstance.h: |
| * wasm/WasmOMGPlan.cpp: |
| (JSC::Wasm::OMGPlan::work): |
| * wasm/WasmThunks.cpp: |
| (JSC::Wasm::throwExceptionFromWasmThunkGenerator): |
| (JSC::Wasm::throwStackOverflowFromWasmThunkGenerator): |
| (JSC::Wasm::triggerOMGTierUpThunkGenerator): |
| (JSC::Wasm::Thunks::stub): |
| (JSC::Wasm::Thunks::existingStub): |
| * wasm/WasmThunks.h: |
| * wasm/js/JSToWasm.cpp: |
| (JSC::Wasm::createJSToWasmWrapper): |
| * wasm/js/JSWebAssemblyCodeBlock.h: |
| * wasm/js/WasmToJS.cpp: |
| (JSC::Wasm::handleBadI64Use): |
| (JSC::Wasm::wasmToJS): |
| * wasm/js/WasmToJS.h: |
| * wasm/js/WebAssemblyFunction.h: |
| * yarr/YarrJIT.cpp: |
| (JSC::Yarr::YarrGenerator::loadFromFrameAndJump): |
| (JSC::Yarr::YarrGenerator::BacktrackingState::linkDataLabels): |
| (JSC::Yarr::YarrGenerator::compile): |
| * yarr/YarrJIT.h: |
| (JSC::Yarr::YarrCodeBlock::set8BitCode): |
| (JSC::Yarr::YarrCodeBlock::set16BitCode): |
| (JSC::Yarr::YarrCodeBlock::set8BitCodeMatchOnly): |
| (JSC::Yarr::YarrCodeBlock::set16BitCodeMatchOnly): |
| (JSC::Yarr::YarrCodeBlock::execute): |
| (JSC::Yarr::YarrCodeBlock::clear): |
| |
| 2018-04-17 Commit Queue <commit-queue@webkit.org> |
| |
| Unreviewed, rolling out r230697, r230720, and r230724. |
| https://bugs.webkit.org/show_bug.cgi?id=184717 |
| |
| These caused multiple failures on the Test262 testers. |
| (Requested by mlewis13 on #webkit). |
| |
| Reverted changesets: |
| |
| "[WebAssembly][Modules] Prototype wasm import" |
| https://bugs.webkit.org/show_bug.cgi?id=184600 |
| https://trac.webkit.org/changeset/230697 |
| |
| "[WebAssembly][Modules] Implement function import from wasm |
| modules" |
| https://bugs.webkit.org/show_bug.cgi?id=184689 |
| https://trac.webkit.org/changeset/230720 |
| |
| "[JSC] Rename runWebAssembly to runWebAssemblySuite" |
| https://bugs.webkit.org/show_bug.cgi?id=184703 |
| https://trac.webkit.org/changeset/230724 |
| |
| 2018-04-17 JF Bastien <jfbastien@apple.com> |
| |
| A put is not an ExistingProperty put when we transition a structure because of an attributes change |
| https://bugs.webkit.org/show_bug.cgi?id=184706 |
| <rdar://problem/38871451> |
| |
| Reviewed by Saam Barati. |
| |
| When putting a property on a structure and the slot is a different |
| type, the slot can't be said to have already been existing. |
| |
| * runtime/JSObjectInlines.h: |
| (JSC::JSObject::putDirectInternal): |
| |
| 2018-04-17 Filip Pizlo <fpizlo@apple.com> |
| |
| JSGenericTypedArrayView<>::visitChildren has a race condition reading m_mode and m_vector |
| https://bugs.webkit.org/show_bug.cgi?id=184705 |
| |
| Reviewed by Michael Saboff. |
| |
| My old multisocket Mac Pro is amazing at catching race conditions in the GC. Earlier today |
| while testing an unrelated patch, a concurrent GC thread crashed inside |
| JSGenericTypedArrayView<>::visitChildren() calling markAuxiliary(). I'm pretty sure it's |
| because a typed array became wasteful concurrently to the GC. So, visitChildren() read one |
| mode and another vector. |
| |
| The fix is to lock inside visitChildren and anyone who changes those fields. |
| |
| I'm not even going to try to write a test. I think it's super lucky that my Mac Pro caught |
| this. |
| |
| * runtime/JSArrayBufferView.cpp: |
| (JSC::JSArrayBufferView::neuter): |
| * runtime/JSGenericTypedArrayViewInlines.h: |
| (JSC::JSGenericTypedArrayView<Adaptor>::visitChildren): |
| (JSC::JSGenericTypedArrayView<Adaptor>::slowDownAndWasteMemory): |
| |
| 2018-04-16 Filip Pizlo <fpizlo@apple.com> |
| |
| PutStackSinkingPhase should know that KillStack means ConflictingFlush |
| https://bugs.webkit.org/show_bug.cgi?id=184672 |
| |
| Reviewed by Michael Saboff. |
| |
| We've had a long history of KillStack and PutStackSinkingPhase having problems. We kept changing the meaning of |
| KillStack, and at some point we removed reasoning about KillStack from PutStackSinkingPhase. I tried doing some |
| archeology - but I'm still not sure why that phase ignores KillStack entirely. Maybe it's an oversight or maybe it's |
| intentional - I don't know. |
| |
| Whatever the history, it's clear from the attached test case that ignoring KillStack is not correct. The outcome of |
| doing so is that we will sometimes sink a PutStack below a KillStack. That's wrong because then, OSR exit will use |
| the value from the PutStack instead of using the value from the MovHint that is associated with the KillStack. So, |
| KillStack must be seen as a special kind of clobber of the stack slot. OSRAvailabiity uses ConflictingFlush. I think |
| that's correct here, too. If we used DeadFlush and that was merged with another control flow path that had a |
| specific flush format, then we would think that we could sink the flush from that path. That's not right, since that |
| could still lead to sinking a PutStack past the KillStack in the sense that a PutStack will appear after the |
| KillStack along one path through the CFG. Also, the definition of DeadFlush and ConflictingFlush in the comment |
| inside PutStackSinkingPhase seems to suggest that KillStack is a ConflictingFlush, since DeadFlush means that we |
| have done some PutStack and their values are still valid. KillStack is not a PutStack and it means that previous |
| values are not valid. The definition of ConflictingFlush is that "we know, via forward flow, that there isn't any |
| value in the given local that anyone should have been relying on" - which exactly matches KillStack's definition. |
| |
| This also means that we cannot eliminate arguments allocations that are live over KillStacks, since if we eliminated |
| them then we would have a GetStack after a KillStack. One easy way to fix this is to say that KillStack writes to |
| its stack slot for the purpose of clobberize. |
| |
| * dfg/DFGClobberize.h: KillStack "writes" to its stack slot. |
| * dfg/DFGPutStackSinkingPhase.cpp: Fix the bug. |
| * ftl/FTLLowerDFGToB3.cpp: Add better assertion failure. |
| (JSC::FTL::DFG::LowerDFGToB3::buildExitArguments): |
| |
| 2018-04-17 Filip Pizlo <fpizlo@apple.com> |
| |
| JSWebAssemblyCodeBlock should be in an IsoSubspace |
| https://bugs.webkit.org/show_bug.cgi?id=184704 |
| |
| Reviewed by Mark Lam. |
| |
| Previously it was in a CompleteSubspace, which is pretty good, but also quite wasteful. |
| CompleteSubspace means about 4KB of data to track the size-allocator mapping. IsoSubspace |
| shortcircuits this. Also, IsoSubspace uses the iso allocator, so it provides stronger UAF |
| protection. |
| |
| * runtime/VM.cpp: |
| (JSC::VM::VM): |
| * runtime/VM.h: |
| * wasm/js/JSWebAssemblyCodeBlock.h: |
| |
| 2018-04-17 Jer Noble <jer.noble@apple.com> |
| |
| Only enable useSeparatedWXHeap on ARM64. |
| https://bugs.webkit.org/show_bug.cgi?id=184697 |
| |
| Reviewed by Saam Barati. |
| |
| * runtime/Options.cpp: |
| (JSC::recomputeDependentOptions): |
| |
| 2018-04-17 Yusuke Suzuki <utatane.tea@gmail.com> |
| |
| [WebAssembly][Modules] Implement function import from wasm modules |
| https://bugs.webkit.org/show_bug.cgi?id=184689 |
| |
| Reviewed by JF Bastien. |
| |
| This patch implements function import from wasm modules. We move function importing part |
| from JSWebAssemblyInstance's creation function to WebAssemblyModuleRecord::link. This |
| is because linking these functions requires that all the dependent modules are created. |
| While we want to move all the linking functionality from JSWebAssemblyInstance to |
| WebAssemblyModuleRecord::link, we do not that in this patch. In this patch, we move only |
| function importing part because efficient compilation of WebAssembly needs to know |
| the type of WebAssemblyMemory (signaling or bound checking). This needs to know imported |
| or attached WebAssembly memory object. So we cannot defer this linking to |
| WebAssemblyModuleRecord::link now. |
| |
| The largest difference from JS module linking is that WebAssembly module linking links |
| function from the module by snapshotting. When you have a cyclic module graph like this, |
| |
| -> JS1 (export "fun") -> Wasm1 (import "fun from JS1) -+ |
| ^ | |
| +--------------------------------------------------+ |
| |
| we fail to link this since "fun" is not instantiated when Wasm1 is first linked. This behavior |
| is described in [1], and tested in this patch. |
| |
| [1]: https://github.com/WebAssembly/esm-integration/tree/master/proposals/esm-integration#js---wasm-cycle-where-js-is-higher-in-the-module-graph |
| |
| * JavaScriptCore.xcodeproj/project.pbxproj: |
| * jsc.cpp: |
| (functionDollarAgentStart): |
| (checkException): |
| (runWithOptions): |
| Small fixes for wasm module loading. |
| |
| * parser/NodesAnalyzeModule.cpp: |
| (JSC::ImportDeclarationNode::analyzeModule): |
| * runtime/AbstractModuleRecord.cpp: |
| (JSC::AbstractModuleRecord::resolveImport): |
| (JSC::AbstractModuleRecord::link): |
| * runtime/AbstractModuleRecord.h: |
| (JSC::AbstractModuleRecord::moduleEnvironmentMayBeNull): |
| (JSC::AbstractModuleRecord::ImportEntry::isNamespace const): Deleted. |
| Now, wasm modules can have import which is named "*". So this function does not work. |
| Since wasm modules never have namespace importing, we check this in JS's module analyzer. |
| |
| * runtime/JSModuleEnvironment.cpp: |
| (JSC::JSModuleEnvironment::getOwnNonIndexPropertyNames): |
| * runtime/JSModuleRecord.cpp: |
| (JSC::JSModuleRecord::instantiateDeclarations): |
| * wasm/WasmCreationMode.h: Added. |
| * wasm/js/JSWebAssemblyInstance.cpp: |
| (JSC::JSWebAssemblyInstance::finalizeCreation): |
| (JSC::JSWebAssemblyInstance::create): |
| * wasm/js/JSWebAssemblyInstance.h: |
| * wasm/js/WebAssemblyInstanceConstructor.cpp: |
| (JSC::constructJSWebAssemblyInstance): |
| * wasm/js/WebAssemblyModuleRecord.cpp: |
| (JSC::WebAssemblyModuleRecord::link): |
| * wasm/js/WebAssemblyModuleRecord.h: |
| * wasm/js/WebAssemblyPrototype.cpp: |
| (JSC::resolve): |
| (JSC::instantiate): |
| (JSC::compileAndInstantiate): |
| (JSC::WebAssemblyPrototype::instantiate): |
| (JSC::webAssemblyInstantiateFunc): |
| |
| 2018-04-17 Dominik Infuehr <dinfuehr@igalia.com> |
| |
| Implement setupArgumentsImpl for ARM and MIPS |
| https://bugs.webkit.org/show_bug.cgi?id=183786 |
| |
| Reviewed by Yusuke Suzuki. |
| |
| Implement setupArgumentsImpl for ARM (hardfp and softfp) and MIPS calling convention. Added |
| numCrossSources and extraGPRArgs to ArgCollection to keep track of extra |
| registers used for 64-bit values on 32-bit architectures. numCrossSources |
| keeps track of assignments from FPR to GPR registers as happens e.g. on MIPS. |
| |
| * assembler/MacroAssemblerARMv7.h: |
| (JSC::MacroAssemblerARMv7::moveDouble): |
| * assembler/MacroAssemblerMIPS.h: |
| (JSC::MacroAssemblerMIPS::moveDouble): |
| * jit/CCallHelpers.h: |
| (JSC::CCallHelpers::setupStubCrossArgs): |
| (JSC::CCallHelpers::ArgCollection::ArgCollection): |
| (JSC::CCallHelpers::ArgCollection::pushRegArg): |
| (JSC::CCallHelpers::ArgCollection::pushExtraRegArg): |
| (JSC::CCallHelpers::ArgCollection::addGPRArg): |
| (JSC::CCallHelpers::ArgCollection::addGPRExtraArg): |
| (JSC::CCallHelpers::ArgCollection::addStackArg): |
| (JSC::CCallHelpers::ArgCollection::addPoke): |
| (JSC::CCallHelpers::ArgCollection::argCount): |
| (JSC::CCallHelpers::calculatePokeOffset): |
| (JSC::CCallHelpers::pokeForArgument): |
| (JSC::CCallHelpers::stackAligned): |
| (JSC::CCallHelpers::marshallArgumentRegister): |
| (JSC::CCallHelpers::setupArgumentsImpl): |
| (JSC::CCallHelpers::pokeArgumentsAligned): |
| (JSC::CCallHelpers::std::is_integral<CURRENT_ARGUMENT_TYPE>::value): |
| (JSC::CCallHelpers::std::is_pointer<CURRENT_ARGUMENT_TYPE>::value): |
| (JSC::CCallHelpers::setupArguments): |
| * jit/FPRInfo.h: |
| (JSC::FPRInfo::toArgumentRegister): |
| |
| 2018-04-17 Saam Barati <sbarati@apple.com> |
| |
| Add system trace points for process launch and for initializeWebProcess |
| https://bugs.webkit.org/show_bug.cgi?id=184669 |
| |
| Reviewed by Simon Fraser. |
| |
| * runtime/VMEntryScope.cpp: |
| (JSC::VMEntryScope::VMEntryScope): |
| (JSC::VMEntryScope::~VMEntryScope): |
| |
| 2018-04-17 Jer Noble <jer.noble@apple.com> |
| |
| Fix duplicate symbol errors when building JavaScriptCore with non-empty WK_ALTERNATE_WEBKIT_SDK_PATH |
| https://bugs.webkit.org/show_bug.cgi?id=184602 |
| |
| Reviewed by Beth Dakin. |
| |
| * JavaScriptCore.xcodeproj/project.pbxproj: |
| |
| 2018-04-17 Carlos Garcia Campos <cgarcia@igalia.com> |
| |
| [GLIB] Add API to clear JSCContext uncaught exception |
| https://bugs.webkit.org/show_bug.cgi?id=184685 |
| |
| Reviewed by Žan Doberšek. |
| |
| Add jsc_context_clear_exception() to clear any possible uncaught exception in a JSCContext. |
| |
| * API/glib/JSCContext.cpp: |
| (jsc_context_clear_exception): |
| * API/glib/JSCContext.h: |
| * API/glib/docs/jsc-glib-4.0-sections.txt: |
| |
| 2018-04-17 Carlos Garcia Campos <cgarcia@igalia.com> |
| |
| [GLIB] Add API to query, delete and enumerate properties |
| https://bugs.webkit.org/show_bug.cgi?id=184647 |
| |
| Reviewed by Michael Catanzaro. |
| |
| Add jsc_value_object_has_property(), jsc_value_object_delete_property() and jsc_value_object_enumerate_properties(). |
| |
| * API/glib/JSCValue.cpp: |
| (jsc_value_object_has_property): |
| (jsc_value_object_delete_property): |
| (jsc_value_object_enumerate_properties): |
| * API/glib/JSCValue.h: |
| * API/glib/docs/jsc-glib-4.0-sections.txt: |
| |
| 2018-04-16 Yusuke Suzuki <utatane.tea@gmail.com> |
| |
| [WebAssembly][Modules] Prototype wasm import |
| https://bugs.webkit.org/show_bug.cgi?id=184600 |
| |
| Reviewed by JF Bastien. |
| |
| This patch is an initial attempt to implement Wasm loading in module pipeline. |
| Currently, |
| |
| 1. We only support Wasm loading in the JSC shell. Once loading mechanism is specified |
| in whatwg HTML, we should integrate this into WebCore. |
| |
| 2. We only support exporting values from Wasm. Wasm module cannot import anything from |
| the other modules now. |
| |
| When loading a file, JSC shell checks wasm magic. If the wasm magic is found, JSC shell |
| loads the file with WebAssemblySourceProvider. It is wrapped into JSSourceCode and |
| module loader pipeline just handles it as the same to JS. When parsing a module, we |
| checks the type of JSSourceCode. If the source code is Wasm source code, we create a |
| WebAssemblyModuleRecord instead of JSModuleRecord. Our module pipeline handles |
| AbstractModuleRecord and Wasm module is instantiated, linked, and evaluated. |
| |
| * builtins/ModuleLoaderPrototype.js: |
| (globalPrivate.newRegistryEntry): |
| (requestInstantiate): |
| (link): |
| * jsc.cpp: |
| (convertShebangToJSComment): |
| (fillBufferWithContentsOfFile): |
| (fetchModuleFromLocalFileSystem): |
| (GlobalObject::moduleLoaderFetch): |
| * parser/SourceProvider.h: |
| (JSC::WebAssemblySourceProvider::create): |
| (JSC::WebAssemblySourceProvider::WebAssemblySourceProvider): |
| * runtime/AbstractModuleRecord.cpp: |
| (JSC::AbstractModuleRecord::hostResolveImportedModule): |
| (JSC::AbstractModuleRecord::link): |
| (JSC::AbstractModuleRecord::evaluate): |
| (JSC::identifierToJSValue): Deleted. |
| * runtime/AbstractModuleRecord.h: |
| * runtime/JSModuleLoader.cpp: |
| (JSC::JSModuleLoader::evaluate): |
| * runtime/JSModuleRecord.cpp: |
| (JSC::JSModuleRecord::link): |
| (JSC::JSModuleRecord::instantiateDeclarations): |
| * runtime/JSModuleRecord.h: |
| * runtime/ModuleLoaderPrototype.cpp: |
| (JSC::moduleLoaderPrototypeParseModule): |
| (JSC::moduleLoaderPrototypeRequestedModules): |
| (JSC::moduleLoaderPrototypeModuleDeclarationInstantiation): |
| * wasm/js/JSWebAssemblyHelpers.h: |
| (JSC::getWasmBufferFromValue): |
| (JSC::createSourceBufferFromValue): |
| * wasm/js/JSWebAssemblyInstance.cpp: |
| (JSC::JSWebAssemblyInstance::finalizeCreation): |
| (JSC::JSWebAssemblyInstance::createPrivateModuleKey): |
| (JSC::JSWebAssemblyInstance::create): |
| * wasm/js/JSWebAssemblyInstance.h: |
| * wasm/js/WebAssemblyInstanceConstructor.cpp: |
| (JSC::constructJSWebAssemblyInstance): |
| * wasm/js/WebAssemblyModuleRecord.cpp: |
| (JSC::WebAssemblyModuleRecord::prepareLink): |
| (JSC::WebAssemblyModuleRecord::link): |
| * wasm/js/WebAssemblyModuleRecord.h: |
| * wasm/js/WebAssemblyPrototype.cpp: |
| (JSC::resolve): |
| (JSC::instantiate): |
| (JSC::compileAndInstantiate): |
| (JSC::WebAssemblyPrototype::instantiate): |
| (JSC::webAssemblyInstantiateFunc): |
| (JSC::webAssemblyValidateFunc): |
| * wasm/js/WebAssemblyPrototype.h: |
| |
| 2018-04-14 Filip Pizlo <fpizlo@apple.com> |
| |
| Function.prototype.caller shouldn't return generator bodies |
| https://bugs.webkit.org/show_bug.cgi?id=184630 |
| |
| Reviewed by Yusuke Suzuki. |
| |
| Function.prototype.caller no longer returns generator bodies. Those are meant to be |
| private. |
| |
| Also added some builtin debugging tools so that it's easier to do the investigation that I |
| did. |
| |
| * builtins/BuiltinNames.h: |
| * runtime/JSFunction.cpp: |
| (JSC::JSFunction::callerGetter): |
| * runtime/JSGlobalObject.cpp: |
| (JSC::JSGlobalObject::init): |
| * runtime/JSGlobalObjectFunctions.cpp: |
| (JSC::globalFuncBuiltinDescribe): |
| * runtime/JSGlobalObjectFunctions.h: |
| |
| 2018-04-13 Yusuke Suzuki <utatane.tea@gmail.com> |
| |
| [DFG] Remove duplicate 32bit ProfileType implementation |
| https://bugs.webkit.org/show_bug.cgi?id=184536 |
| |
| Reviewed by Saam Barati. |
| |
| This patch removes duplicate 32bit ProfileType implementation by unifying 32/64 implementations. |
| |
| * dfg/DFGSpeculativeJIT.cpp: |
| (JSC::DFG::SpeculativeJIT::compileProfileType): |
| * dfg/DFGSpeculativeJIT.h: |
| * dfg/DFGSpeculativeJIT32_64.cpp: |
| (JSC::DFG::SpeculativeJIT::compile): |
| * dfg/DFGSpeculativeJIT64.cpp: |
| (JSC::DFG::SpeculativeJIT::compile): |
| * jit/AssemblyHelpers.h: |
| (JSC::AssemblyHelpers::branchIfUndefined): |
| (JSC::AssemblyHelpers::branchIfNull): |
| |
| 2018-04-12 Mark Lam <mark.lam@apple.com> |
| |
| Consolidate some PtrTags. |
| https://bugs.webkit.org/show_bug.cgi?id=184552 |
| <rdar://problem/39389404> |
| |
| Reviewed by Filip Pizlo. |
| |
| Consolidate CodeEntryPtrTag and CodeEntryWithArityCheckPtrTag into CodePtrTag. |
| Consolidate NearCallPtrTag and NearJumpPtrTag into NearCodePtrTag. |
| |
| * assembler/AbstractMacroAssembler.h: |
| (JSC::AbstractMacroAssembler::repatchNearCall): |
| * assembler/MacroAssemblerARM.h: |
| (JSC::MacroAssemblerARM::readCallTarget): |
| * assembler/MacroAssemblerARMv7.h: |
| (JSC::MacroAssemblerARMv7::readCallTarget): |
| * assembler/MacroAssemblerMIPS.h: |
| (JSC::MacroAssemblerMIPS::readCallTarget): |
| * assembler/MacroAssemblerX86.h: |
| (JSC::MacroAssemblerX86::readCallTarget): |
| * assembler/MacroAssemblerX86_64.h: |
| (JSC::MacroAssemblerX86_64::readCallTarget): |
| * bytecode/AccessCase.cpp: |
| (JSC::AccessCase::generateImpl): |
| * bytecode/InlineAccess.cpp: |
| (JSC::InlineAccess::rewireStubAsJump): |
| * bytecode/PolymorphicAccess.cpp: |
| (JSC::PolymorphicAccess::regenerate): |
| * dfg/DFGJITCompiler.cpp: |
| (JSC::DFG::JITCompiler::linkOSRExits): |
| (JSC::DFG::JITCompiler::link): |
| (JSC::DFG::JITCompiler::compileFunction): |
| * dfg/DFGJITFinalizer.cpp: |
| (JSC::DFG::JITFinalizer::finalize): |
| (JSC::DFG::JITFinalizer::finalizeFunction): |
| * dfg/DFGOSREntry.cpp: |
| (JSC::DFG::prepareOSREntry): |
| * dfg/DFGOSRExit.cpp: |
| (JSC::DFG::OSRExit::executeOSRExit): |
| (JSC::DFG::adjustAndJumpToTarget): |
| (JSC::DFG::OSRExit::compileOSRExit): |
| * dfg/DFGOSRExitCompilerCommon.cpp: |
| (JSC::DFG::adjustAndJumpToTarget): |
| * dfg/DFGOperations.cpp: |
| * ftl/FTLJITCode.cpp: |
| (JSC::FTL::JITCode::executableAddressAtOffset): |
| * ftl/FTLJITFinalizer.cpp: |
| (JSC::FTL::JITFinalizer::finalizeCommon): |
| * 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::compileDirectCallOrConstruct): |
| (JSC::FTL::DFG::LowerDFGToB3::compileTailCall): |
| (JSC::FTL::DFG::LowerDFGToB3::compileCallOrConstructVarargsSpread): |
| (JSC::FTL::DFG::LowerDFGToB3::compileCallOrConstructVarargs): |
| (JSC::FTL::DFG::LowerDFGToB3::lazySlowPath): |
| * ftl/FTLOSRExitCompiler.cpp: |
| (JSC::FTL::compileFTLOSRExit): |
| * ftl/FTLOSRExitHandle.cpp: |
| (JSC::FTL::OSRExitHandle::emitExitThunk): |
| * jit/AssemblyHelpers.cpp: |
| (JSC::AssemblyHelpers::emitDumbVirtualCall): |
| * jit/JIT.cpp: |
| (JSC::JIT::compileWithoutLinking): |
| (JSC::JIT::link): |
| * jit/JITCall.cpp: |
| (JSC::JIT::compileOpCallSlowCase): |
| * jit/JITCode.cpp: |
| (JSC::JITCodeWithCodeRef::executableAddressAtOffset): |
| (JSC::NativeJITCode::addressForCall): |
| * jit/JITInlines.h: |
| (JSC::JIT::emitNakedCall): |
| (JSC::JIT::emitNakedTailCall): |
| * jit/JITMathIC.h: |
| (JSC::isProfileEmpty): |
| * jit/JITOpcodes.cpp: |
| (JSC::JIT::privateCompileHasIndexedProperty): |
| * jit/JITOperations.cpp: |
| * jit/JITPropertyAccess.cpp: |
| (JSC::JIT::stringGetByValStubGenerator): |
| (JSC::JIT::privateCompileGetByVal): |
| (JSC::JIT::privateCompileGetByValWithCachedId): |
| (JSC::JIT::privateCompilePutByVal): |
| (JSC::JIT::privateCompilePutByValWithCachedId): |
| * jit/JITThunks.cpp: |
| (JSC::JITThunks::hostFunctionStub): |
| * jit/Repatch.cpp: |
| (JSC::linkSlowFor): |
| (JSC::linkFor): |
| (JSC::linkPolymorphicCall): |
| * jit/SpecializedThunkJIT.h: |
| (JSC::SpecializedThunkJIT::finalize): |
| * jit/ThunkGenerators.cpp: |
| (JSC::virtualThunkFor): |
| (JSC::nativeForGenerator): |
| (JSC::boundThisNoArgsFunctionCallGenerator): |
| * llint/LLIntData.cpp: |
| (JSC::LLInt::initialize): |
| * llint/LLIntEntrypoint.cpp: |
| (JSC::LLInt::setEvalEntrypoint): |
| (JSC::LLInt::setProgramEntrypoint): |
| (JSC::LLInt::setModuleProgramEntrypoint): |
| * llint/LLIntSlowPaths.cpp: |
| (JSC::LLInt::LLINT_SLOW_PATH_DECL): |
| (JSC::LLInt::setUpCall): |
| * llint/LLIntThunks.cpp: |
| (JSC::LLInt::generateThunkWithJumpTo): |
| (JSC::LLInt::functionForCallEntryThunkGenerator): |
| (JSC::LLInt::functionForConstructEntryThunkGenerator): |
| (JSC::LLInt::functionForCallArityCheckThunkGenerator): |
| (JSC::LLInt::functionForConstructArityCheckThunkGenerator): |
| (JSC::LLInt::evalEntryThunkGenerator): |
| (JSC::LLInt::programEntryThunkGenerator): |
| (JSC::LLInt::moduleProgramEntryThunkGenerator): |
| * llint/LowLevelInterpreter.asm: |
| * llint/LowLevelInterpreter64.asm: |
| * runtime/NativeExecutable.cpp: |
| (JSC::NativeExecutable::finishCreation): |
| * runtime/NativeFunction.h: |
| (JSC::TaggedNativeFunction::TaggedNativeFunction): |
| (JSC::TaggedNativeFunction::operator NativeFunction): |
| * runtime/PtrTag.h: |
| * wasm/WasmBBQPlan.cpp: |
| (JSC::Wasm::BBQPlan::complete): |
| * wasm/WasmOMGPlan.cpp: |
| (JSC::Wasm::OMGPlan::work): |
| * wasm/WasmThunks.cpp: |
| (JSC::Wasm::throwExceptionFromWasmThunkGenerator): |
| (JSC::Wasm::throwStackOverflowFromWasmThunkGenerator): |
| (JSC::Wasm::triggerOMGTierUpThunkGenerator): |
| * wasm/js/WasmToJS.cpp: |
| (JSC::Wasm::wasmToJS): |
| * wasm/js/WebAssemblyFunction.h: |
| * yarr/YarrJIT.cpp: |
| (JSC::Yarr::YarrGenerator::compile): |
| |
| 2018-04-12 Michael Catanzaro <mcatanzaro@igalia.com> |
| |
| [WPE] Move libWPEWebInspectorResources.so to pkglibdir |
| https://bugs.webkit.org/show_bug.cgi?id=184379 |
| |
| Reviewed by Žan Doberšek. |
| |
| Load the module from the new location. |
| |
| * PlatformWPE.cmake: |
| * inspector/remote/glib/RemoteInspectorUtils.cpp: |
| (Inspector::backendCommands): |
| |
| 2018-04-12 Yusuke Suzuki <utatane.tea@gmail.com> |
| |
| [DFG] Remove compileBigIntEquality in DFG 32bit |
| https://bugs.webkit.org/show_bug.cgi?id=184535 |
| |
| Reviewed by Saam Barati. |
| |
| We can have the unified implementation for compileBigIntEquality. |
| |
| * dfg/DFGSpeculativeJIT.cpp: |
| (JSC::DFG::SpeculativeJIT::compileBigIntEquality): |
| * dfg/DFGSpeculativeJIT32_64.cpp: |
| (JSC::DFG::SpeculativeJIT::compileBigIntEquality): Deleted. |
| * dfg/DFGSpeculativeJIT64.cpp: |
| (JSC::DFG::SpeculativeJIT::compileBigIntEquality): Deleted. |
| |
| 2018-04-12 Michael Catanzaro <mcatanzaro@igalia.com> |
| |
| [WPE] Improve include hierarchy |
| https://bugs.webkit.org/show_bug.cgi?id=184376 |
| |
| Reviewed by Žan Doberšek. |
| |
| Install JSC headers under /usr/include/wpe-webkit-0.1/jsc instead of |
| /usr/include/wpe-0.1/WPE/jsc. |
| |
| * PlatformWPE.cmake: |
| |
| 2018-04-11 Carlos Garcia Campos <cgarcia@igalia.com> |
| |
| [GLIB] Handle strings containing null characters |
| https://bugs.webkit.org/show_bug.cgi?id=184450 |
| |
| Reviewed by Michael Catanzaro. |
| |
| We should be able to evaluate scripts containing null characters and to handle strings that contains them |
| too. In JavaScript strings are not null-terminated, they can contain null characters. This patch adds a length |
| parameter to jsc_context_valuate() to pass the script length (or -1 if it's null terminated), and new functions |
| jsc_value_new_string_from_bytes() and jsc_value_to_string_as_bytes() using GBytes to store strings that might |
| contain null characters. |
| |
| * API/OpaqueJSString.cpp: |
| (OpaqueJSString::create): Add a create constructor that takes the String. |
| * API/OpaqueJSString.h: |
| (OpaqueJSString::OpaqueJSString): Add a constructor that takes the String. |
| * API/glib/JSCContext.cpp: |
| (jsc_context_evaluate): Add length parameter. |
| (jsc_context_evaluate_with_source_uri): Ditto. |
| * API/glib/JSCContext.h: |
| * API/glib/JSCValue.cpp: |
| (jsc_value_new_string_from_bytes): |
| (jsc_value_to_string): |
| (jsc_value_to_string_as_bytes): |
| (jsc_value_object_is_instance_of): Pass length to evaluate. |
| * API/glib/JSCValue.h: |
| * API/glib/docs/jsc-glib-4.0-sections.txt: |
| |
| 2018-04-11 Yusuke Suzuki <utatane.tea@gmail.com> |
| |
| [JSC] Add CCallHelpers::CellValue to wrap JSCell GPR to convert it to EncodedJSValue |
| https://bugs.webkit.org/show_bug.cgi?id=184500 |
| |
| Reviewed by Mark Lam. |
| |
| Instead of passing JSValue::JSCellTag to callOperation meta-program to convert |
| JSCell GPR to EncodedJSValue in 32bit code, we add CallHelpers::CellValue. |
| It is a wrapper for GPRReg, like TrustedImmPtr for pointer value. When poking |
| CellValue, 32bit code emits JSValue::CellTag automatically. In 64bit, we just |
| poke held GPR. The benefit from this CellValue is that we can use the same code |
| for 32bit and 64bit. This patch removes several ifdefs. |
| |
| * bytecode/AccessCase.cpp: |
| (JSC::AccessCase::generateImpl): |
| * dfg/DFGSpeculativeJIT.cpp: |
| (JSC::DFG::SpeculativeJIT::compileCallDOMGetter): |
| (JSC::DFG::SpeculativeJIT::compileGetDirectPname): |
| (JSC::DFG::SpeculativeJIT::cachedPutById): |
| * dfg/DFGSpeculativeJIT32_64.cpp: |
| (JSC::DFG::SpeculativeJIT::cachedGetById): |
| (JSC::DFG::SpeculativeJIT::cachedGetByIdWithThis): |
| * jit/CCallHelpers.h: |
| (JSC::CCallHelpers::CellValue::CellValue): |
| (JSC::CCallHelpers::CellValue::gpr const): |
| (JSC::CCallHelpers::setupArgumentsImpl): |
| |
| 2018-04-11 Mark Lam <mark.lam@apple.com> |
| |
| [Build fix] Replace CompactJITCodeMap with JITCodeMap. |
| https://bugs.webkit.org/show_bug.cgi?id=184512 |
| <rdar://problem/35391728> |
| |
| Not reviewed. |
| |
| * bytecode/CodeBlock.h: |
| * jit/JITCodeMap.h: |
| |
| 2018-04-11 Mark Lam <mark.lam@apple.com> |
| |
| Replace CompactJITCodeMap with JITCodeMap. |
| https://bugs.webkit.org/show_bug.cgi?id=184512 |
| <rdar://problem/35391728> |
| |
| Reviewed by Filip Pizlo. |
| |
| * CMakeLists.txt: |
| * JavaScriptCore.xcodeproj/project.pbxproj: |
| * bytecode/CodeBlock.h: |
| (JSC::CodeBlock::setJITCodeMap): |
| (JSC::CodeBlock::jitCodeMap const): |
| (JSC::CodeBlock::jitCodeMap): Deleted. |
| * dfg/DFGOSRExit.cpp: |
| (JSC::DFG::OSRExit::executeOSRExit): |
| * dfg/DFGOSRExitCompilerCommon.cpp: |
| (JSC::DFG::adjustAndJumpToTarget): |
| * jit/AssemblyHelpers.cpp: |
| (JSC::AssemblyHelpers::decodedCodeMapFor): Deleted. |
| * jit/AssemblyHelpers.h: |
| * jit/CompactJITCodeMap.h: Removed. |
| * jit/JIT.cpp: |
| (JSC::JIT::link): |
| * jit/JITCodeMap.h: Added. |
| (JSC::JITCodeMap::Entry::Entry): |
| (JSC::JITCodeMap::Entry::bytecodeIndex const): |
| (JSC::JITCodeMap::Entry::codeLocation): |
| (JSC::JITCodeMap::append): |
| (JSC::JITCodeMap::finish): |
| (JSC::JITCodeMap::find const): |
| (JSC::JITCodeMap::operator bool const): |
| * llint/LLIntSlowPaths.cpp: |
| (JSC::LLInt::LLINT_SLOW_PATH_DECL): |
| |
| 2018-04-11 Yusuke Suzuki <utatane.tea@gmail.com> |
| |
| [DFG] Remove CompareSlowPathGenerator |
| https://bugs.webkit.org/show_bug.cgi?id=184492 |
| |
| Reviewed by Mark Lam. |
| |
| Now CompareSlowPathGenerator is just calling a specified function. |
| This can be altered with slowPathCall. This patch removes CompareSlowPathGenerator. |
| |
| We also remove some of unnecessary USE(JSVALUE32_64) / USE(JSVALUE64) ifdefs by |
| introducing a new constructor for GPRTemporary. |
| |
| * JavaScriptCore.xcodeproj/project.pbxproj: |
| * dfg/DFGCompareSlowPathGenerator.h: Removed. |
| * dfg/DFGSpeculativeJIT.cpp: |
| (JSC::DFG::GPRTemporary::GPRTemporary): |
| (JSC::DFG::SpeculativeJIT::compileIsCellWithType): |
| (JSC::DFG::SpeculativeJIT::compileIsTypedArrayView): |
| (JSC::DFG::SpeculativeJIT::compileToObjectOrCallObjectConstructor): |
| (JSC::DFG::SpeculativeJIT::compileIsObject): |
| (JSC::DFG::SpeculativeJIT::nonSpeculativeNonPeepholeCompare): |
| (JSC::DFG::SpeculativeJIT::nonSpeculativePeepholeBranch): |
| * dfg/DFGSpeculativeJIT.h: |
| (JSC::DFG::GPRTemporary::GPRTemporary): |
| * dfg/DFGSpeculativeJIT64.cpp: |
| (JSC::DFG::SpeculativeJIT::nonSpeculativeNonPeepholeStrictEq): |
| |
| 2018-04-11 Yusuke Suzuki <utatane.tea@gmail.com> |
| |
| Unreviewed, build fix for 32bit |
| https://bugs.webkit.org/show_bug.cgi?id=184236 |
| |
| * dfg/DFGSpeculativeJIT.cpp: |
| (JSC::DFG::SpeculativeJIT::compileGetDirectPname): |
| |
| 2018-04-11 Yusuke Suzuki <utatane.tea@gmail.com> |
| |
| [DFG] Remove duplicate 32bit code more |
| https://bugs.webkit.org/show_bug.cgi?id=184236 |
| |
| Reviewed by Mark Lam. |
| |
| Remove duplicate 32bit code more aggressively part 2. |
| |
| * JavaScriptCore.xcodeproj/project.pbxproj: |
| * dfg/DFGCompareSlowPathGenerator.h: Added. |
| (JSC::DFG::CompareSlowPathGenerator::CompareSlowPathGenerator): |
| Drop boxing part. Use unblessedBooleanResult in DFGSpeculativeJIT side instead. |
| |
| * dfg/DFGOperations.cpp: |
| * dfg/DFGOperations.h: |
| * dfg/DFGSpeculativeJIT.cpp: |
| (JSC::DFG::SpeculativeJIT::compileOverridesHasInstance): |
| (JSC::DFG::SpeculativeJIT::compileLoadVarargs): |
| (JSC::DFG::SpeculativeJIT::compileIsObject): |
| (JSC::DFG::SpeculativeJIT::compileCheckNotEmpty): |
| (JSC::DFG::SpeculativeJIT::compilePutByIdFlush): |
| (JSC::DFG::SpeculativeJIT::compilePutById): |
| (JSC::DFG::SpeculativeJIT::compilePutByIdDirect): |
| (JSC::DFG::SpeculativeJIT::compileNewArrayWithSize): |
| (JSC::DFG::SpeculativeJIT::compileMiscStrictEq): |
| (JSC::DFG::SpeculativeJIT::emitInitializeButterfly): |
| (JSC::DFG::SpeculativeJIT::compileAllocateNewArrayWithSize): |
| (JSC::DFG::SpeculativeJIT::compileHasIndexedProperty): |
| (JSC::DFG::SpeculativeJIT::compileGetDirectPname): |
| (JSC::DFG::SpeculativeJIT::compileExtractCatchLocal): |
| (JSC::DFG::SpeculativeJIT::cachedPutById): |
| (JSC::DFG::SpeculativeJIT::nonSpeculativeNonPeepholeCompare): |
| (JSC::DFG::SpeculativeJIT::nonSpeculativePeepholeBranch): |
| (JSC::DFG::SpeculativeJIT::nonSpeculativeCompare): Deleted. |
| * dfg/DFGSpeculativeJIT.h: |
| (JSC::DFG::SpeculativeJIT::selectScratchGPR): Deleted. |
| * dfg/DFGSpeculativeJIT32_64.cpp: |
| (JSC::DFG::SpeculativeJIT::compile): |
| (JSC::DFG::SpeculativeJIT::cachedPutById): Deleted. |
| (JSC::DFG::SpeculativeJIT::nonSpeculativePeepholeBranch): Deleted. |
| (JSC::DFG::CompareAndBoxBooleanSlowPathGenerator::CompareAndBoxBooleanSlowPathGenerator): Deleted. |
| (JSC::DFG::CompareAndBoxBooleanSlowPathGenerator::generateInternal): Deleted. |
| (JSC::DFG::SpeculativeJIT::nonSpeculativeNonPeepholeCompare): Deleted. |
| (JSC::DFG::SpeculativeJIT::compileMiscStrictEq): Deleted. |
| (JSC::DFG::SpeculativeJIT::emitInitializeButterfly): Deleted. |
| (JSC::DFG::SpeculativeJIT::compileAllocateNewArrayWithSize): Deleted. |
| * dfg/DFGSpeculativeJIT64.cpp: |
| (JSC::DFG::SpeculativeJIT::nonSpeculativeNonPeepholeStrictEq): |
| (JSC::DFG::SpeculativeJIT::compile): |
| (JSC::DFG::SpeculativeJIT::cachedPutById): Deleted. |
| (JSC::DFG::SpeculativeJIT::nonSpeculativePeepholeBranch): Deleted. |
| (JSC::DFG::CompareAndBoxBooleanSlowPathGenerator::CompareAndBoxBooleanSlowPathGenerator): Deleted. |
| (): Deleted. |
| (JSC::DFG::SpeculativeJIT::nonSpeculativeNonPeepholeCompare): Deleted. |
| (JSC::DFG::SpeculativeJIT::compileMiscStrictEq): Deleted. |
| (JSC::DFG::SpeculativeJIT::emitInitializeButterfly): Deleted. |
| (JSC::DFG::SpeculativeJIT::compileAllocateNewArrayWithSize): Deleted. |
| * ftl/FTLLowerDFGToB3.cpp: |
| (JSC::FTL::DFG::LowerDFGToB3::compileHasIndexedProperty): |
| operationHasIndexedPropertyByInt starts returning unblessed boolean with size_t. |
| |
| * jit/AssemblyHelpers.h: |
| (JSC::AssemblyHelpers::loadValue): |
| (JSC::AssemblyHelpers::selectScratchGPR): |
| (JSC::AssemblyHelpers::constructRegisterSet): |
| * jit/RegisterSet.h: |
| (JSC::RegisterSet::setAny): |
| Clean up selectScratchGPR code to pass JSValueRegs. |
| |
| 2018-04-10 Caio Lima <ticaiolima@gmail.com> |
| |
| [ESNext][BigInt] Add support for BigInt in SpeculatedType |
| https://bugs.webkit.org/show_bug.cgi?id=182470 |
| |
| Reviewed by Saam Barati. |
| |
| This patch introduces the SpecBigInt type to DFG to enable BigInt |
| speculation into DFG and FTL. |
| |
| With SpecBigInt introduction, we can then specialize "===" operations |
| to BigInts. As we are doing for some cells, we first check if operands |
| are pointing to the same JSCell, and if it is false, we |
| fallback to "operationCompareStrictEqCell". The idea in further |
| patches is to implement BigInt equality check directly in |
| assembly. |
| |
| We are also adding support for BigInt constant folding into |
| TypeOf operation. |
| |
| * bytecode/SpeculatedType.cpp: |
| (JSC::dumpSpeculation): |
| (JSC::speculationFromClassInfo): |
| (JSC::speculationFromStructure): |
| (JSC::speculationFromJSType): |
| (JSC::speculationFromString): |
| * bytecode/SpeculatedType.h: |
| (JSC::isBigIntSpeculation): |
| * dfg/DFGAbstractInterpreterInlines.h: |
| (JSC::DFG::AbstractInterpreter<AbstractStateType>::executeEffects): |
| * dfg/DFGAbstractValue.cpp: |
| (JSC::DFG::AbstractValue::set): |
| * dfg/DFGConstantFoldingPhase.cpp: |
| (JSC::DFG::ConstantFoldingPhase::foldConstants): |
| * dfg/DFGFixupPhase.cpp: |
| (JSC::DFG::FixupPhase::fixupNode): |
| (JSC::DFG::FixupPhase::fixupToThis): |
| (JSC::DFG::FixupPhase::observeUseKindOnNode): |
| * dfg/DFGInferredTypeCheck.cpp: |
| (JSC::DFG::insertInferredTypeCheck): |
| * dfg/DFGNode.h: |
| (JSC::DFG::Node::shouldSpeculateBigInt): |
| * dfg/DFGPredictionPropagationPhase.cpp: |
| * dfg/DFGSafeToExecute.h: |
| (JSC::DFG::SafeToExecuteEdge::operator()): |
| * dfg/DFGSpeculativeJIT.cpp: |
| (JSC::DFG::SpeculativeJIT::compileStrictEq): |
| (JSC::DFG::SpeculativeJIT::speculateBigInt): |
| (JSC::DFG::SpeculativeJIT::speculate): |
| * dfg/DFGSpeculativeJIT.h: |
| * dfg/DFGSpeculativeJIT32_64.cpp: |
| (JSC::DFG::SpeculativeJIT::compileBigIntEquality): |
| * dfg/DFGSpeculativeJIT64.cpp: |
| (JSC::DFG::SpeculativeJIT::compileBigIntEquality): |
| * dfg/DFGUseKind.cpp: |
| (WTF::printInternal): |
| * dfg/DFGUseKind.h: |
| (JSC::DFG::typeFilterFor): |
| (JSC::DFG::isCell): |
| * ftl/FTLCapabilities.cpp: |
| (JSC::FTL::canCompile): |
| * ftl/FTLLowerDFGToB3.cpp: |
| (JSC::FTL::DFG::LowerDFGToB3::compileCompareStrictEq): |
| (JSC::FTL::DFG::LowerDFGToB3::checkInferredType): |
| (JSC::FTL::DFG::LowerDFGToB3::speculate): |
| (JSC::FTL::DFG::LowerDFGToB3::isNotBigInt): |
| (JSC::FTL::DFG::LowerDFGToB3::speculateBigInt): |
| * jit/AssemblyHelpers.cpp: |
| (JSC::AssemblyHelpers::branchIfNotType): |
| * jit/AssemblyHelpers.h: |
| (JSC::AssemblyHelpers::branchIfBigInt): |
| (JSC::AssemblyHelpers::branchIfNotBigInt): |
| * runtime/InferredType.cpp: |
| (JSC::InferredType::Descriptor::forValue): |
| (JSC::InferredType::Descriptor::putByIdFlags const): |
| (JSC::InferredType::Descriptor::merge): |
| (WTF::printInternal): |
| * runtime/InferredType.h: |
| * runtime/JSBigInt.h: |
| |
| 2018-04-10 Filip Pizlo <fpizlo@apple.com> |
| |
| Unreviewed, fix cloop build. |
| |
| * dfg/DFGAbstractInterpreterClobberState.cpp: |
| |
| 2018-04-10 Mark Lam <mark.lam@apple.com> |
| |
| Make the ASSERT in MarkedSpace::sizeClassToIndex() a RELEASE_ASSERT. |
| https://bugs.webkit.org/show_bug.cgi?id=184464 |
| <rdar://problem/39323947> |
| |
| Reviewed by Saam Barati. |
| |
| * heap/MarkedSpace.h: |
| (JSC::MarkedSpace::sizeClassToIndex): |
| |
| 2018-04-09 Filip Pizlo <fpizlo@apple.com> |
| |
| DFG AI and clobberize should agree with each other |
| https://bugs.webkit.org/show_bug.cgi?id=184440 |
| |
| Reviewed by Saam Barati. |
| |
| One way to fix bugs involving underapproximation in AI or clobberize is to assert that they |
| agree with each other. That's what this patch does: it adds an assertion that AI's structure |
| state tracking must be equivalent to JSCell_structureID being clobbered. |
| |
| One subtlety is that AI sometimes folds away structure clobbering using information that |
| clobberize doesn't have. So, we track this wuth special kinds of AI states (FoldedClobber and |
| ObservedTransitions). |
| |
| This fixes a bunch of cases of AI missing clobberStructures/clobberWorld and one case of |
| clobberize missing a write(Heap). |
| |
| This also makes some cases more precise in order to appease the assertion. Making things more |
| precise might make things faster, but I didn't measure it because that wasn't the goal. |
| |
| * JavaScriptCore.xcodeproj/project.pbxproj: |
| * Sources.txt: |
| * dfg/DFGAbstractInterpreter.h: |
| * dfg/DFGAbstractInterpreterClobberState.cpp: Added. |
| (WTF::printInternal): |
| * dfg/DFGAbstractInterpreterClobberState.h: Added. |
| (JSC::DFG::mergeClobberStates): |
| * dfg/DFGAbstractInterpreterInlines.h: |
| (JSC::DFG::AbstractInterpreter<AbstractStateType>::startExecuting): |
| (JSC::DFG::AbstractInterpreter<AbstractStateType>::executeEffects): |
| (JSC::DFG::AbstractInterpreter<AbstractStateType>::didFoldClobberWorld): |
| (JSC::DFG::AbstractInterpreter<AbstractStateType>::clobberStructures): |
| (JSC::DFG::AbstractInterpreter<AbstractStateType>::didFoldClobberStructures): |
| (JSC::DFG::AbstractInterpreter<AbstractStateType>::observeTransition): |
| (JSC::DFG::AbstractInterpreter<AbstractStateType>::observeTransitions): |
| (JSC::DFG::AbstractInterpreter<AbstractStateType>::setDidClobber): Deleted. |
| * dfg/DFGAtTailAbstractState.h: |
| (JSC::DFG::AtTailAbstractState::setClobberState): |
| (JSC::DFG::AtTailAbstractState::mergeClobberState): |
| (JSC::DFG::AtTailAbstractState::setDidClobber): Deleted. |
| * dfg/DFGCFAPhase.cpp: |
| (JSC::DFG::CFAPhase::performBlockCFA): |
| * dfg/DFGClobberSet.cpp: |
| (JSC::DFG::writeSet): |
| * dfg/DFGClobberSet.h: |
| * dfg/DFGClobberize.h: |
| (JSC::DFG::clobberize): |
| * dfg/DFGConstantFoldingPhase.cpp: |
| (JSC::DFG::ConstantFoldingPhase::foldConstants): |
| * dfg/DFGInPlaceAbstractState.h: |
| (JSC::DFG::InPlaceAbstractState::clobberState const): |
| (JSC::DFG::InPlaceAbstractState::didClobberOrFolded const): |
| (JSC::DFG::InPlaceAbstractState::didClobber const): |
| (JSC::DFG::InPlaceAbstractState::setClobberState): |
| (JSC::DFG::InPlaceAbstractState::mergeClobberState): |
| (JSC::DFG::InPlaceAbstractState::setDidClobber): Deleted. |
| |
| 2018-04-10 Filip Pizlo <fpizlo@apple.com> |
| |
| ExecutableToCodeBlockEdge::visitChildren() should be cool with m_codeBlock being null since we clear it in finalizeUnconditionally() |
| https://bugs.webkit.org/show_bug.cgi?id=184460 |
| <rdar://problem/37610966> |
| |
| Reviewed by Mark Lam. |
| |
| * bytecode/ExecutableToCodeBlockEdge.cpp: |
| (JSC::ExecutableToCodeBlockEdge::visitChildren): |
| |
| 2018-04-10 Filip Pizlo <fpizlo@apple.com> |
| |
| REGRESSION(r227341 and r227742): AI and clobberize should be precise and consistent about the effectfulness of CompareEq |
| https://bugs.webkit.org/show_bug.cgi?id=184455 |
| |
| Reviewed by Michael Saboff. |
| |
| LICM is sort of an assertion that AI is as precise as clobberize about effects. If clobberize |
| says that something is not effectful, then LICM will try to hoist it. But LICM's AI hack |
| (AtTailAbstractState) cannot handle hoisting of things that have effects. So, if AI thinks that |
| the thing being hoisted does have effects, then we get a crash. |
| |
| In r227341, we incorrectly told AI that CompareEq(Untyped:, _) is effectful. In fact, only |
| ComapreEq(Untyped:, Untyped:) is effectful, and clobberize knew this already. As a result, LICM |
| would blow up if we hoisted CompareEq(Untyped:, Other:), which clobberize knew wasn't |
| effectful. |
| |
| Instead of fixing this by making AI precise, in r227742 we made matters worse by then breaking |
| clobberize to also think that CompareEq(Untyped:, _) is effectful. |
| |
| This fixes the whole situation by teaching both clobberize and AI that the only effectful form |
| of CompareEq is ComapreEq(Untyped:, Untyped:). |
| |
| * dfg/DFGAbstractInterpreterInlines.h: |
| (JSC::DFG::AbstractInterpreter<AbstractStateType>::executeEffects): |
| * dfg/DFGClobberize.h: |
| (JSC::DFG::clobberize): |
| |
| 2018-04-09 Filip Pizlo <fpizlo@apple.com> |
| |
| Executing known edge types may reveal a contradiction causing us to emit an exit at a node that is not allowed to exit |
| https://bugs.webkit.org/show_bug.cgi?id=184372 |
| |
| Reviewed by Saam Barati. |
| |
| We do a pretty good job of not emitting checks for KnownBlah edges, since those mean that we |
| have already proved, using techniques that are more precise than AI, that the edge has type |
| Blah. Unfortunately, we do not handle this case gracefully when AI state becomes bottom, |
| because we have a bad habit of treating terminate/terminateSpeculativeExecution as something |
| other than a check - so we think we can call those just because we should have already |
| bailed. It's better to think of them as the result of folding a check. Therefore, we should |
| only do it if there had been a check to begin with. |
| |
| * dfg/DFGSpeculativeJIT64.cpp: |
| (JSC::DFG::SpeculativeJIT::fillSpeculateInt32Internal): |
| (JSC::DFG::SpeculativeJIT::fillSpeculateInt52): |
| (JSC::DFG::SpeculativeJIT::fillSpeculateDouble): |
| (JSC::DFG::SpeculativeJIT::fillSpeculateCell): |
| (JSC::DFG::SpeculativeJIT::fillSpeculateBoolean): |
| * ftl/FTLLowerDFGToB3.cpp: |
| (JSC::FTL::DFG::LowerDFGToB3::lowInt32): |
| (JSC::FTL::DFG::LowerDFGToB3::lowInt52): |
| (JSC::FTL::DFG::LowerDFGToB3::lowCell): |
| (JSC::FTL::DFG::LowerDFGToB3::lowBoolean): |
| (JSC::FTL::DFG::LowerDFGToB3::lowDouble): |
| (JSC::FTL::DFG::LowerDFGToB3::speculate): |
| (JSC::FTL::DFG::LowerDFGToB3::speculateCellOrOther): |
| (JSC::FTL::DFG::LowerDFGToB3::speculateStringOrOther): |
| |
| 2018-04-08 Yusuke Suzuki <utatane.tea@gmail.com> |
| |
| [JSC] Introduce @putByIdDirectPrivate |
| https://bugs.webkit.org/show_bug.cgi?id=184400 |
| |
| Reviewed by Saam Barati. |
| |
| This patch adds @putByIdDirectPrivate() to use it for builtin JS. |
| @getByIdDirectPrivate and @putByIdDirectPrivate are pair of intrinsics |
| accessing to ECMAScript internal fields. |
| |
| This change removes accidental [[Put]] operation to an object whose [[Prototype]] |
| has internal fields (not direct properties). By using @getByIdDirectPrivate() and |
| @putByIdDirectPrivate(), we strongly keep the semantics of the ECMAScript internal |
| fields that accessing to the internal fields does not traverse prototype chains. |
| |
| * builtins/ArrayIteratorPrototype.js: |
| (globalPrivate.arrayIteratorValueNext): |
| (globalPrivate.arrayIteratorKeyNext): |
| (globalPrivate.arrayIteratorKeyValueNext): |
| * builtins/ArrayPrototype.js: |
| (globalPrivate.createArrayIterator): |
| * builtins/AsyncFromSyncIteratorPrototype.js: |
| (globalPrivate.AsyncFromSyncIteratorConstructor): |
| * builtins/AsyncFunctionPrototype.js: |
| (globalPrivate.asyncFunctionResume): |
| * builtins/AsyncGeneratorPrototype.js: |
| (globalPrivate.asyncGeneratorQueueEnqueue): |
| (globalPrivate.asyncGeneratorQueueDequeue): |
| (asyncGeneratorYieldAwaited): |
| (globalPrivate.asyncGeneratorYield): |
| (globalPrivate.doAsyncGeneratorBodyCall): |
| (globalPrivate.asyncGeneratorResumeNext): |
| * builtins/GeneratorPrototype.js: |
| (globalPrivate.generatorResume): |
| * builtins/MapIteratorPrototype.js: |
| (globalPrivate.mapIteratorNext): |
| * builtins/MapPrototype.js: |
| (globalPrivate.createMapIterator): |
| * builtins/ModuleLoaderPrototype.js: |
| (forceFulfillPromise): |
| * builtins/PromiseOperations.js: |
| (globalPrivate.newHandledRejectedPromise): |
| (globalPrivate.rejectPromise): |
| (globalPrivate.fulfillPromise): |
| (globalPrivate.initializePromise): |
| * builtins/PromisePrototype.js: |
| (then): |
| * builtins/SetIteratorPrototype.js: |
| (globalPrivate.setIteratorNext): |
| * builtins/SetPrototype.js: |
| (globalPrivate.createSetIterator): |
| * builtins/StringIteratorPrototype.js: |
| (next): |
| * bytecode/BytecodeIntrinsicRegistry.h: |
| * bytecompiler/NodesCodegen.cpp: |
| (JSC::BytecodeIntrinsicNode::emit_intrinsic_putByIdDirect): |
| (JSC::BytecodeIntrinsicNode::emit_intrinsic_putByIdDirectPrivate): |
| |
| 2018-04-09 Mark Lam <mark.lam@apple.com> |
| |
| Decorate method table entries to support pointer profiling. |
| https://bugs.webkit.org/show_bug.cgi?id=184430 |
| <rdar://problem/39296190> |
| |
| Reviewed by Saam Barati. |
| |
| * runtime/ClassInfo.h: |
| |
| 2018-04-09 Michael Catanzaro <mcatanzaro@igalia.com> |
| |
| [WPE] Don't install JSC C API headers |
| https://bugs.webkit.org/show_bug.cgi?id=184375 |
| |
| Reviewed by Žan Doberšek. |
| |
| None of the functions declared in these headers are exported in WPE. Use the new jsc API |
| instead. |
| |
| * PlatformWPE.cmake: |
| |
| 2018-04-08 Mark Lam <mark.lam@apple.com> |
| |
| Add pointer profiling to the FTL and supporting code. |
| https://bugs.webkit.org/show_bug.cgi?id=184395 |
| <rdar://problem/39264019> |
| |
| Reviewed by Michael Saboff and Filip Pizlo. |
| |
| * assembler/CodeLocation.h: |
| (JSC::CodeLocationLabel::retagged): |
| (JSC::CodeLocationJump::retagged): |
| * assembler/LinkBuffer.h: |
| (JSC::LinkBuffer::locationOf): |
| * dfg/DFGJITCompiler.cpp: |
| (JSC::DFG::JITCompiler::linkOSRExits): |
| (JSC::DFG::JITCompiler::link): |
| * ftl/FTLCompile.cpp: |
| (JSC::FTL::compile): |
| * ftl/FTLExceptionTarget.cpp: |
| (JSC::FTL::ExceptionTarget::label): |
| (JSC::FTL::ExceptionTarget::jumps): |
| * ftl/FTLExceptionTarget.h: |
| * ftl/FTLJITCode.cpp: |
| (JSC::FTL::JITCode::executableAddressAtOffset): |
| * ftl/FTLLazySlowPath.cpp: |
| (JSC::FTL::LazySlowPath::~LazySlowPath): |
| (JSC::FTL::LazySlowPath::initialize): |
| (JSC::FTL::LazySlowPath::generate): |
| (JSC::FTL::LazySlowPath::LazySlowPath): Deleted. |
| * ftl/FTLLazySlowPath.h: |
| * ftl/FTLLink.cpp: |
| (JSC::FTL::link): |
| * ftl/FTLLowerDFGToB3.cpp: |
| (JSC::FTL::DFG::LowerDFGToB3::lower): |
| (JSC::FTL::DFG::LowerDFGToB3::compileCallOrConstruct): |
| (JSC::FTL::DFG::LowerDFGToB3::compileDirectCallOrConstruct): |
| (JSC::FTL::DFG::LowerDFGToB3::compileTailCall): |
| (JSC::FTL::DFG::LowerDFGToB3::compileCallOrConstructVarargsSpread): |
| (JSC::FTL::DFG::LowerDFGToB3::compileCallOrConstructVarargs): |
| (JSC::FTL::DFG::LowerDFGToB3::compileCallEval): |
| (JSC::FTL::DFG::LowerDFGToB3::lazySlowPath): |
| * ftl/FTLOSRExitCompiler.cpp: |
| (JSC::FTL::compileStub): |
| (JSC::FTL::compileFTLOSRExit): |
| * ftl/FTLOSRExitHandle.cpp: |
| (JSC::FTL::OSRExitHandle::emitExitThunk): |
| * ftl/FTLOperations.cpp: |
| (JSC::FTL::compileFTLLazySlowPath): |
| * ftl/FTLOutput.h: |
| (JSC::FTL::Output::callWithoutSideEffects): |
| (JSC::FTL::Output::operation): |
| * ftl/FTLPatchpointExceptionHandle.cpp: |
| (JSC::FTL::PatchpointExceptionHandle::scheduleExitCreationForUnwind): |
| * ftl/FTLSlowPathCall.cpp: |
| (JSC::FTL::SlowPathCallContext::makeCall): |
| * ftl/FTLSlowPathCallKey.h: |
| (JSC::FTL::SlowPathCallKey::withCallTarget): |
| (JSC::FTL::SlowPathCallKey::callPtrTag const): |
| * ftl/FTLThunks.cpp: |
| (JSC::FTL::genericGenerationThunkGenerator): |
| (JSC::FTL::osrExitGenerationThunkGenerator): |
| (JSC::FTL::lazySlowPathGenerationThunkGenerator): |
| (JSC::FTL::slowPathCallThunkGenerator): |
| * jit/JITMathIC.h: |
| (JSC::isProfileEmpty): |
| * jit/Repatch.cpp: |
| (JSC::readPutICCallTarget): |
| (JSC::ftlThunkAwareRepatchCall): |
| (JSC::tryCacheGetByID): |
| (JSC::repatchGetByID): |
| (JSC::tryCachePutByID): |
| (JSC::repatchPutByID): |
| (JSC::repatchIn): |
| (JSC::resetGetByID): |
| (JSC::resetPutByID): |
| (JSC::readCallTarget): Deleted. |
| * jit/Repatch.h: |
| * runtime/PtrTag.h: |
| |
| 2018-04-08 Yusuke Suzuki <utatane.tea@gmail.com> |
| |
| Unreviewed, attempt to fix Windows build |
| https://bugs.webkit.org/show_bug.cgi?id=183508 |
| |
| * jit/JIT.h: |
| |
| 2018-04-08 Yusuke Suzuki <utatane.tea@gmail.com> |
| |
| Unreviewed, build fix for Windows by suppressing padding warning for JIT |
| https://bugs.webkit.org/show_bug.cgi?id=183508 |
| |
| * jit/JIT.h: |
| |
| 2018-04-08 Yusuke Suzuki <utatane.tea@gmail.com> |
| |
| Use alignas instead of compiler-specific attributes |
| https://bugs.webkit.org/show_bug.cgi?id=183508 |
| |
| Reviewed by Mark Lam. |
| |
| Use C++11 alignas specifier. It is portable compared to compiler-specific aligned attributes. |
| |
| * heap/RegisterState.h: |
| * jit/JIT.h: |
| (JSC::JIT::compile): Deleted. |
| (JSC::JIT::compileGetByVal): Deleted. |
| (JSC::JIT::compileGetByValWithCachedId): Deleted. |
| (JSC::JIT::compilePutByVal): Deleted. |
| (JSC::JIT::compileDirectPutByVal): Deleted. |
| (JSC::JIT::compilePutByValWithCachedId): Deleted. |
| (JSC::JIT::compileHasIndexedProperty): Deleted. |
| (JSC::JIT::appendCall): Deleted. |
| (JSC::JIT::appendCallWithSlowPathReturnType): Deleted. |
| (JSC::JIT::exceptionCheck): Deleted. |
| (JSC::JIT::exceptionCheckWithCallFrameRollback): Deleted. |
| (JSC::JIT::emitInt32Load): Deleted. |
| (JSC::JIT::emitInt32GetByVal): Deleted. |
| (JSC::JIT::emitInt32PutByVal): Deleted. |
| (JSC::JIT::emitDoublePutByVal): Deleted. |
| (JSC::JIT::emitContiguousPutByVal): Deleted. |
| (JSC::JIT::emitStoreCell): Deleted. |
| (JSC::JIT::getSlowCase): Deleted. |
| (JSC::JIT::linkSlowCase): Deleted. |
| (JSC::JIT::linkDummySlowCase): Deleted. |
| (JSC::JIT::linkAllSlowCases): Deleted. |
| (JSC::JIT::callOperation): Deleted. |
| (JSC::JIT::callOperationWithProfile): Deleted. |
| (JSC::JIT::callOperationWithResult): Deleted. |
| (JSC::JIT::callOperationNoExceptionCheck): Deleted. |
| (JSC::JIT::callOperationWithCallFrameRollbackOnException): Deleted. |
| (JSC::JIT::emitEnterOptimizationCheck): Deleted. |
| (JSC::JIT::sampleCodeBlock): Deleted. |
| (JSC::JIT::canBeOptimized): Deleted. |
| (JSC::JIT::canBeOptimizedOrInlined): Deleted. |
| (JSC::JIT::shouldEmitProfiling): Deleted. |
| * runtime/VM.h: |
| |
| 2018-04-08 Yusuke Suzuki <utatane.tea@gmail.com> |
| |
| Unreviewed, follow-up patch for DFG 32bit |
| https://bugs.webkit.org/show_bug.cgi?id=183970 |
| |
| * dfg/DFGSpeculativeJIT32_64.cpp: |
| (JSC::DFG::SpeculativeJIT::cachedGetById): |
| |
| 2018-04-08 Yusuke Suzuki <utatane.tea@gmail.com> |
| |
| [JSC] Fix incorrect assertion for VM's regexp buffer lock |
| https://bugs.webkit.org/show_bug.cgi?id=184398 |
| |
| Reviewed by Mark Lam. |
| |
| isLocked check before taking a lock is incorrect. |
| |
| * runtime/VM.cpp: |
| (JSC::VM::acquireRegExpPatternContexBuffer): |
| |
| 2018-04-08 Yusuke Suzuki <utatane.tea@gmail.com> |
| |
| [JSC] Introduce op_get_by_id_direct |
| https://bugs.webkit.org/show_bug.cgi?id=183970 |
| |
| Reviewed by Filip Pizlo. |
| |
| This patch introduces op_get_by_id_direct bytecode. This is super similar to op_get_by_id. |
| But it just performs [[GetOwnProperty]] operation instead of [[Get]]. We support this |
| in all the tiers, so using this opcode does not lead to inefficiency. |
| |
| Main purpose of this op_get_by_id_direct is using it for private properties. We are using |
| properties indexed with private symbols to implement ECMAScript internal fields. Before this |
| patch, we just use get and put operations. However, it is not the correct semantics: accessing |
| to the internal fields should not traverse prototype chain, which is specified in the spec. |
| We use op_get_by_id_direct to access to properties which are used internal fields, so that |
| prototype chains are not traversed. |
| |
| To emit op_get_by_id_direct, we introduce a new bytecode intrinsic @getByIdDirectPrivate(). |
| When you write `@getByIdDirectPrivate(object, "name")`, the bytecode generator emits the |
| bytecode `op_get_by_id_direct, object, @name`. |
| |
| * builtins/ArrayIteratorPrototype.js: |
| (next): |
| (globalPrivate.arrayIteratorValueNext): |
| (globalPrivate.arrayIteratorKeyNext): |
| (globalPrivate.arrayIteratorKeyValueNext): |
| * builtins/AsyncFromSyncIteratorPrototype.js: |
| * builtins/AsyncFunctionPrototype.js: |
| (globalPrivate.asyncFunctionResume): |
| * builtins/AsyncGeneratorPrototype.js: |
| (globalPrivate.asyncGeneratorQueueIsEmpty): |
| (globalPrivate.asyncGeneratorQueueEnqueue): |
| (globalPrivate.asyncGeneratorQueueDequeue): |
| (globalPrivate.asyncGeneratorDequeue): |
| (globalPrivate.isExecutionState): |
| (globalPrivate.isSuspendYieldState): |
| (globalPrivate.asyncGeneratorReject): |
| (globalPrivate.asyncGeneratorResolve): |
| (globalPrivate.doAsyncGeneratorBodyCall): |
| (globalPrivate.asyncGeneratorEnqueue): |
| * builtins/GeneratorPrototype.js: |
| (globalPrivate.generatorResume): |
| (next): |
| (return): |
| (throw): |
| * builtins/MapIteratorPrototype.js: |
| (next): |
| * builtins/PromiseOperations.js: |
| (globalPrivate.isPromise): |
| (globalPrivate.rejectPromise): |
| (globalPrivate.fulfillPromise): |
| * builtins/PromisePrototype.js: |
| (then): |
| * builtins/SetIteratorPrototype.js: |
| (next): |
| * builtins/StringIteratorPrototype.js: |
| (next): |
| * builtins/TypedArrayConstructor.js: |
| (of): |
| (from): |
| * bytecode/BytecodeDumper.cpp: |
| (JSC::BytecodeDumper<Block>::dumpBytecode): |
| * bytecode/BytecodeIntrinsicRegistry.h: |
| * bytecode/BytecodeList.json: |
| * bytecode/BytecodeUseDef.h: |
| (JSC::computeUsesForBytecodeOffset): |
| (JSC::computeDefsForBytecodeOffset): |
| * bytecode/CodeBlock.cpp: |
| (JSC::CodeBlock::finishCreation): |
| (JSC::CodeBlock::finalizeLLIntInlineCaches): |
| * bytecode/GetByIdStatus.cpp: |
| (JSC::GetByIdStatus::computeFromLLInt): |
| (JSC::GetByIdStatus::computeFor): |
| * bytecode/StructureStubInfo.cpp: |
| (JSC::StructureStubInfo::reset): |
| * bytecode/StructureStubInfo.h: |
| (JSC::appropriateOptimizingGetByIdFunction): |
| (JSC::appropriateGenericGetByIdFunction): |
| * bytecompiler/BytecodeGenerator.cpp: |
| (JSC::BytecodeGenerator::emitDirectGetById): |
| * bytecompiler/BytecodeGenerator.h: |
| * bytecompiler/NodesCodegen.cpp: |
| (JSC::BytecodeIntrinsicNode::emit_intrinsic_getByIdDirect): |
| (JSC::BytecodeIntrinsicNode::emit_intrinsic_getByIdDirectPrivate): |
| * dfg/DFGAbstractInterpreterInlines.h: |
| (JSC::DFG::AbstractInterpreter<AbstractStateType>::executeEffects): |
| * dfg/DFGByteCodeParser.cpp: |
| (JSC::DFG::ByteCodeParser::handleGetById): |
| (JSC::DFG::ByteCodeParser::parseBlock): |
| * dfg/DFGCapabilities.cpp: |
| (JSC::DFG::capabilityLevel): |
| * dfg/DFGClobberize.h: |
| (JSC::DFG::clobberize): |
| * dfg/DFGConstantFoldingPhase.cpp: |
| (JSC::DFG::ConstantFoldingPhase::foldConstants): |
| * dfg/DFGDoesGC.cpp: |
| (JSC::DFG::doesGC): |
| * dfg/DFGFixupPhase.cpp: |
| (JSC::DFG::FixupPhase::fixupNode): |
| * dfg/DFGNode.h: |
| (JSC::DFG::Node::convertToGetByOffset): |
| (JSC::DFG::Node::convertToMultiGetByOffset): |
| (JSC::DFG::Node::hasIdentifier): |
| (JSC::DFG::Node::hasHeapPrediction): |
| * dfg/DFGNodeType.h: |
| * dfg/DFGOperations.cpp: |
| * dfg/DFGOperations.h: |
| * dfg/DFGPredictionPropagationPhase.cpp: |
| * dfg/DFGSafeToExecute.h: |
| (JSC::DFG::safeToExecute): |
| * dfg/DFGSpeculativeJIT.cpp: |
| (JSC::DFG::SpeculativeJIT::compileGetById): |
| (JSC::DFG::SpeculativeJIT::compileGetByIdFlush): |
| (JSC::DFG::SpeculativeJIT::compileTryGetById): Deleted. |
| * dfg/DFGSpeculativeJIT.h: |
| * dfg/DFGSpeculativeJIT32_64.cpp: |
| (JSC::DFG::SpeculativeJIT::cachedGetById): |
| (JSC::DFG::SpeculativeJIT::compile): |
| * dfg/DFGSpeculativeJIT64.cpp: |
| (JSC::DFG::SpeculativeJIT::cachedGetById): |
| (JSC::DFG::SpeculativeJIT::compile): |
| * ftl/FTLCapabilities.cpp: |
| (JSC::FTL::canCompile): |
| * ftl/FTLLowerDFGToB3.cpp: |
| (JSC::FTL::DFG::LowerDFGToB3::compileNode): |
| (JSC::FTL::DFG::LowerDFGToB3::compileGetById): |
| (JSC::FTL::DFG::LowerDFGToB3::compileGetByIdWithThis): |
| (JSC::FTL::DFG::LowerDFGToB3::getById): |
| * jit/JIT.cpp: |
| (JSC::JIT::privateCompileMainPass): |
| (JSC::JIT::privateCompileSlowCases): |
| * jit/JIT.h: |
| * jit/JITOperations.cpp: |
| * jit/JITOperations.h: |
| * jit/JITPropertyAccess.cpp: |
| (JSC::JIT::emit_op_get_by_id_direct): |
| (JSC::JIT::emitSlow_op_get_by_id_direct): |
| * jit/JITPropertyAccess32_64.cpp: |
| (JSC::JIT::emit_op_get_by_id_direct): |
| (JSC::JIT::emitSlow_op_get_by_id_direct): |
| * jit/Repatch.cpp: |
| (JSC::appropriateOptimizingGetByIdFunction): |
| (JSC::appropriateGetByIdFunction): |
| (JSC::tryCacheGetByID): |
| (JSC::repatchGetByID): |
| (JSC::appropriateGenericGetByIdFunction): Deleted. |
| * jit/Repatch.h: |
| * llint/LLIntSlowPaths.cpp: |
| (JSC::LLInt::LLINT_SLOW_PATH_DECL): |
| * llint/LLIntSlowPaths.h: |
| * llint/LowLevelInterpreter32_64.asm: |
| * llint/LowLevelInterpreter64.asm: |
| * runtime/JSCJSValue.h: |
| * runtime/JSCJSValueInlines.h: |
| (JSC::JSValue::getOwnPropertySlot const): |
| * runtime/JSObject.h: |
| * runtime/JSObjectInlines.h: |
| (JSC::JSObject::getOwnPropertySlotInline): |
| |
| 2018-04-07 Yusuke Suzuki <utatane.tea@gmail.com> |
| |
| [JSC] Remove several asXXX functions |
| https://bugs.webkit.org/show_bug.cgi?id=184355 |
| |
| Reviewed by JF Bastien. |
| |
| Remove asActivation, asInternalFunction, and asGetterSetter. |
| Use jsCast<> / jsDynamicCast<> consistently. |
| |
| * runtime/ArrayConstructor.cpp: |
| (JSC::constructArrayWithSizeQuirk): |
| * runtime/AsyncFunctionConstructor.cpp: |
| (JSC::callAsyncFunctionConstructor): |
| (JSC::constructAsyncFunctionConstructor): |
| * runtime/AsyncGeneratorFunctionConstructor.cpp: |
| (JSC::callAsyncGeneratorFunctionConstructor): |
| (JSC::constructAsyncGeneratorFunctionConstructor): |
| * runtime/BooleanConstructor.cpp: |
| (JSC::constructWithBooleanConstructor): |
| * runtime/DateConstructor.cpp: |
| (JSC::constructWithDateConstructor): |
| * runtime/ErrorConstructor.cpp: |
| (JSC::Interpreter::constructWithErrorConstructor): |
| (JSC::Interpreter::callErrorConstructor): |
| * runtime/FunctionConstructor.cpp: |
| (JSC::constructWithFunctionConstructor): |
| (JSC::callFunctionConstructor): |
| * runtime/FunctionPrototype.cpp: |
| (JSC::functionProtoFuncToString): |
| * runtime/GeneratorFunctionConstructor.cpp: |
| (JSC::callGeneratorFunctionConstructor): |
| (JSC::constructGeneratorFunctionConstructor): |
| * runtime/GetterSetter.h: |
| (JSC::asGetterSetter): Deleted. |
| * runtime/InternalFunction.h: |
| (JSC::asInternalFunction): Deleted. |
| * runtime/JSGenericTypedArrayViewConstructorInlines.h: |
| (JSC::constructGenericTypedArrayView): |
| * runtime/JSLexicalEnvironment.h: |
| (JSC::asActivation): Deleted. |
| * runtime/JSObject.cpp: |
| (JSC::validateAndApplyPropertyDescriptor): |
| * runtime/MapConstructor.cpp: |
| (JSC::constructMap): |
| * runtime/PropertyDescriptor.cpp: |
| (JSC::PropertyDescriptor::setDescriptor): |
| * runtime/RegExpConstructor.cpp: |
| (JSC::constructWithRegExpConstructor): |
| (JSC::callRegExpConstructor): |
| * runtime/SetConstructor.cpp: |
| (JSC::constructSet): |
| * runtime/StringConstructor.cpp: |
| (JSC::constructWithStringConstructor): |
| * runtime/WeakMapConstructor.cpp: |
| (JSC::constructWeakMap): |
| * runtime/WeakSetConstructor.cpp: |
| (JSC::constructWeakSet): |
| * wasm/js/WebAssemblyCompileErrorConstructor.cpp: |
| (JSC::constructJSWebAssemblyCompileError): |
| (JSC::callJSWebAssemblyCompileError): |
| * wasm/js/WebAssemblyLinkErrorConstructor.cpp: |
| (JSC::constructJSWebAssemblyLinkError): |
| (JSC::callJSWebAssemblyLinkError): |
| * wasm/js/WebAssemblyRuntimeErrorConstructor.cpp: |
| (JSC::constructJSWebAssemblyRuntimeError): |
| (JSC::callJSWebAssemblyRuntimeError): |
| |
| 2018-04-05 Mark Lam <mark.lam@apple.com> |
| |
| MacroAssemblerCodePtr::retagged() should not re-decorate the pointer on ARMv7. |
| https://bugs.webkit.org/show_bug.cgi?id=184347 |
| <rdar://problem/39183165> |
| |
| Reviewed by Michael Saboff. |
| |
| * assembler/MacroAssemblerCodeRef.h: |
| (JSC::MacroAssemblerCodePtr::MacroAssemblerCodePtr): |
| (JSC::MacroAssemblerCodePtr::retagged const): |
| |
| 2018-04-05 Stanislav Ocovaj <stanislav.ocovaj@rt-rk.com> |
| |
| [MIPS] Optimize generated JIT code for branches |
| https://bugs.webkit.org/show_bug.cgi?id=183130 |
| |
| Reviewed by Yusuke Suzuki. |
| |
| The patch https://bugs.webkit.org/show_bug.cgi?id=101328 added two nop instructions to |
| branchEqual() and branchNotEqual() in order to allow the code generated by branchPtrWithPatch() |
| to be reverted back to branchPtrWithPatch after replacing it with a 4-instruction jump. |
| However, this adds a significant overhead for all other types of branches. Since these nop's |
| protect the code that is generated by branchPtrWithPatch, this function seems like a better |
| place to add them. |
| |
| * assembler/MIPSAssembler.h: |
| (JSC::MIPSAssembler::repatchInt32): |
| (JSC::MIPSAssembler::revertJumpToMove): |
| * assembler/MacroAssemblerMIPS.h: |
| (JSC::MacroAssemblerMIPS::branchAdd32): |
| (JSC::MacroAssemblerMIPS::branchMul32): |
| (JSC::MacroAssemblerMIPS::branchSub32): |
| (JSC::MacroAssemblerMIPS::branchNeg32): |
| (JSC::MacroAssemblerMIPS::branchPtrWithPatch): |
| (JSC::MacroAssemblerMIPS::branchEqual): |
| (JSC::MacroAssemblerMIPS::branchNotEqual): |
| |
| 2018-04-05 Yusuke Suzuki <utatane.tea@gmail.com> |
| |
| [WTF] Remove StaticLock |
| https://bugs.webkit.org/show_bug.cgi?id=184332 |
| |
| Reviewed by Mark Lam. |
| |
| * API/JSValue.mm: |
| (handerForStructTag): |
| * API/JSVirtualMachine.mm: |
| (+[JSVMWrapperCache addWrapper:forJSContextGroupRef:]): |
| (+[JSVMWrapperCache wrapperForJSContextGroupRef:]): |
| * API/glib/JSCVirtualMachine.cpp: |
| (addWrapper): |
| (removeWrapper): |
| * assembler/testmasm.cpp: |
| * b3/air/testair.cpp: |
| * b3/testb3.cpp: |
| * bytecode/SuperSampler.cpp: |
| * dfg/DFGCommon.cpp: |
| * dfg/DFGCommonData.cpp: |
| * dynbench.cpp: |
| * heap/MachineStackMarker.cpp: |
| (JSC::MachineThreads::tryCopyOtherThreadStacks): |
| * inspector/remote/cocoa/RemoteConnectionToTargetCocoa.mm: |
| (Inspector::RemoteTargetHandleRunSourceGlobal): |
| (Inspector::RemoteTargetQueueTaskOnGlobalQueue): |
| * interpreter/CLoopStack.cpp: |
| * parser/SourceProvider.cpp: |
| * profiler/ProfilerDatabase.cpp: |
| * profiler/ProfilerUID.cpp: |
| (JSC::Profiler::UID::create): |
| * runtime/IntlObject.cpp: |
| (JSC::numberingSystemsForLocale): |
| * runtime/JSLock.cpp: |
| * runtime/JSLock.h: |
| * runtime/SamplingProfiler.cpp: |
| (JSC::SamplingProfiler::registerForReportAtExit): |
| * runtime/VM.cpp: |
| * wasm/WasmFaultSignalHandler.cpp: |
| |
| 2018-04-04 Mark Lam <mark.lam@apple.com> |
| |
| Add pointer profiling support to the DFG and supporting files. |
| https://bugs.webkit.org/show_bug.cgi?id=184316 |
| <rdar://problem/39188524> |
| |
| Reviewed by Filip Pizlo. |
| |
| 1. Profile lots of pointers with PtrTags. |
| |
| 2. Remove PtrTag.cpp and make ptrTagName() into an inline function. It's only |
| used for debugging anyway, and not normally called in the code. Making it |
| an inline function prevents it from taking up code space in builds when not in |
| use. |
| |
| 3. Change the call to the the arityFixupThunk in DFG code to be a near call. |
| It doesn't need to be a far call. |
| |
| * CMakeLists.txt: |
| * JavaScriptCore.xcodeproj/project.pbxproj: |
| * Sources.txt: |
| * assembler/testmasm.cpp: |
| (JSC::testProbeModifiesProgramCounter): |
| * b3/B3LowerMacros.cpp: |
| * b3/air/AirCCallSpecial.cpp: |
| (JSC::B3::Air::CCallSpecial::generate): |
| * b3/air/AirCCallSpecial.h: |
| * b3/testb3.cpp: |
| (JSC::B3::testInterpreter): |
| * bytecode/AccessCase.cpp: |
| (JSC::AccessCase::generateImpl): |
| * bytecode/HandlerInfo.h: |
| (JSC::HandlerInfo::initialize): |
| * bytecode/PolymorphicAccess.cpp: |
| (JSC::PolymorphicAccess::regenerate): |
| * dfg/DFGJITCompiler.cpp: |
| (JSC::DFG::JITCompiler::compileExceptionHandlers): |
| (JSC::DFG::JITCompiler::link): |
| (JSC::DFG::JITCompiler::compileFunction): |
| (JSC::DFG::JITCompiler::noticeCatchEntrypoint): |
| * dfg/DFGJITCompiler.h: |
| (JSC::DFG::JITCompiler::appendCall): |
| * dfg/DFGOSREntry.cpp: |
| (JSC::DFG::prepareOSREntry): |
| * dfg/DFGOSRExit.cpp: |
| (JSC::DFG::reifyInlinedCallFrames): |
| (JSC::DFG::adjustAndJumpToTarget): |
| (JSC::DFG::OSRExit::emitRestoreArguments): |
| (JSC::DFG::OSRExit::compileOSRExit): |
| * dfg/DFGOSRExitCompilerCommon.cpp: |
| (JSC::DFG::handleExitCounts): |
| (JSC::DFG::reifyInlinedCallFrames): |
| (JSC::DFG::osrWriteBarrier): |
| (JSC::DFG::adjustAndJumpToTarget): |
| * dfg/DFGOperations.cpp: |
| * dfg/DFGSlowPathGenerator.h: |
| (JSC::DFG::CallResultAndArgumentsSlowPathGenerator::CallResultAndArgumentsSlowPathGenerator): |
| (JSC::DFG::CallResultAndArgumentsSlowPathGenerator::unpackAndGenerate): |
| (JSC::DFG::slowPathCall): |
| * dfg/DFGSpeculativeJIT.cpp: |
| (JSC::DFG::SpeculativeJIT::compileMathIC): |
| * dfg/DFGSpeculativeJIT.h: |
| (JSC::DFG::SpeculativeJIT::callOperation): |
| (JSC::DFG::SpeculativeJIT::appendCall): |
| (JSC::DFG::SpeculativeJIT::appendCallSetResult): |
| * dfg/DFGSpeculativeJIT64.cpp: |
| (JSC::DFG::SpeculativeJIT::cachedGetById): |
| (JSC::DFG::SpeculativeJIT::cachedGetByIdWithThis): |
| (JSC::DFG::SpeculativeJIT::cachedPutById): |
| (JSC::DFG::SpeculativeJIT::compile): |
| * dfg/DFGThunks.cpp: |
| (JSC::DFG::osrExitThunkGenerator): |
| (JSC::DFG::osrExitGenerationThunkGenerator): |
| (JSC::DFG::osrEntryThunkGenerator): |
| * jit/AssemblyHelpers.cpp: |
| (JSC::AssemblyHelpers::emitDumbVirtualCall): |
| * jit/JIT.cpp: |
| (JSC::JIT::emitEnterOptimizationCheck): |
| (JSC::JIT::compileWithoutLinking): |
| * jit/JITCall.cpp: |
| (JSC::JIT::compileOpCallSlowCase): |
| * jit/JITMathIC.h: |
| (JSC::isProfileEmpty): |
| * jit/JITOpcodes.cpp: |
| (JSC::JIT::emit_op_catch): |
| (JSC::JIT::emitSlow_op_loop_hint): |
| * jit/JITOperations.cpp: |
| * jit/Repatch.cpp: |
| (JSC::linkSlowFor): |
| (JSC::linkFor): |
| (JSC::revertCall): |
| (JSC::unlinkFor): |
| (JSC::linkVirtualFor): |
| (JSC::linkPolymorphicCall): |
| * jit/ThunkGenerators.cpp: |
| (JSC::throwExceptionFromCallSlowPathGenerator): |
| (JSC::linkCallThunkGenerator): |
| (JSC::linkPolymorphicCallThunkGenerator): |
| (JSC::virtualThunkFor): |
| (JSC::arityFixupGenerator): |
| (JSC::unreachableGenerator): |
| * runtime/PtrTag.cpp: Removed. |
| * runtime/PtrTag.h: |
| (JSC::ptrTagName): |
| * runtime/VMEntryScope.cpp: |
| * wasm/js/WasmToJS.cpp: |
| (JSC::Wasm::wasmToJS): |
| |
| 2018-04-04 Filip Pizlo <fpizlo@apple.com> |
| |
| REGRESSION(r222563): removed DoubleReal type check causes tons of crashes because CSE has never known how to handle SaneChain |
| https://bugs.webkit.org/show_bug.cgi?id=184319 |
| |
| Reviewed by Saam Barati. |
| |
| In r222581, we replaced type checks about DoubleReal in ArrayPush in the DFG/FTL backends with |
| assertions. That's correct because FixupPhase was emitting those checks as Check(DoubleRealRep:) before |
| the ArrayPush. |
| |
| But this revealed a longstanding CSE bug: CSE will happily match a SaneChain GetByVal with a InBounds |
| GetByVal. SaneChain can return NaN while InBounds cannot. This means that if we first use AI to |
| eliminate the Check(DoubleRealRep:) based on the input being a GetByVal(InBounds) but then replace that |
| with a GetByVal(SaneChain), then we will hit the assertion. |
| |
| This teaches CSE to not replace GetByVal(InBounds) with GetByVal(SaneChain) and vice versa. That gets |
| tricky because PutByVal can match either. So, we use the fact that it's legal for a store to def() more |
| than once: PutByVal now defs() a HeapLocation for InBounds and a HeapLocation for SaneChain. |
| |
| * dfg/DFGCSEPhase.cpp: |
| * dfg/DFGClobberize.h: |
| (JSC::DFG::clobberize): |
| * dfg/DFGHeapLocation.cpp: |
| (WTF::printInternal): |
| * dfg/DFGHeapLocation.h: |
| * dfg/DFGSpeculativeJIT.cpp: |
| (JSC::DFG::SpeculativeJIT::compileArrayPush): |
| |
| 2018-04-04 Filip Pizlo <fpizlo@apple.com> |
| |
| Remove poisoning of typed array vector |
| https://bugs.webkit.org/show_bug.cgi?id=184313 |
| |
| Reviewed by Saam Barati. |
| |
| * dfg/DFGFixupPhase.cpp: |
| (JSC::DFG::FixupPhase::checkArray): |
| * dfg/DFGSpeculativeJIT.cpp: |
| (JSC::DFG::SpeculativeJIT::jumpForTypedArrayIsNeuteredIfOutOfBounds): |
| (JSC::DFG::SpeculativeJIT::compileGetIndexedPropertyStorage): |
| (JSC::DFG::SpeculativeJIT::compileGetTypedArrayByteOffset): |
| (JSC::DFG::SpeculativeJIT::compileNewTypedArrayWithSize): |
| * ftl/FTLAbstractHeapRepository.h: |
| * ftl/FTLLowerDFGToB3.cpp: |
| (JSC::FTL::DFG::LowerDFGToB3::compileGetIndexedPropertyStorage): |
| (JSC::FTL::DFG::LowerDFGToB3::compileGetTypedArrayByteOffset): |
| (JSC::FTL::DFG::LowerDFGToB3::compileNewTypedArray): |
| (JSC::FTL::DFG::LowerDFGToB3::speculateTypedArrayIsNotNeutered): |
| * jit/IntrinsicEmitter.cpp: |
| (JSC::IntrinsicGetterAccessCase::emitIntrinsicGetter): |
| * jit/JITPropertyAccess.cpp: |
| (JSC::JIT::emitIntTypedArrayGetByVal): |
| (JSC::JIT::emitFloatTypedArrayGetByVal): |
| (JSC::JIT::emitIntTypedArrayPutByVal): |
| (JSC::JIT::emitFloatTypedArrayPutByVal): |
| * llint/LowLevelInterpreter.asm: |
| * llint/LowLevelInterpreter64.asm: |
| * offlineasm/arm64.rb: |
| * offlineasm/x86.rb: |
| * runtime/CagedBarrierPtr.h: |
| * runtime/JSArrayBufferView.cpp: |
| (JSC::JSArrayBufferView::JSArrayBufferView): |
| (JSC::JSArrayBufferView::finalize): |
| (JSC::JSArrayBufferView::neuter): |
| * runtime/JSArrayBufferView.h: |
| (JSC::JSArrayBufferView::vector const): |
| (JSC::JSArrayBufferView::offsetOfVector): |
| (JSC::JSArrayBufferView::offsetOfPoisonedVector): Deleted. |
| (JSC::JSArrayBufferView::poisonFor): Deleted. |
| (JSC::JSArrayBufferView::Poison::key): Deleted. |
| * runtime/JSCPoison.cpp: |
| (JSC::initializePoison): |
| * runtime/JSCPoison.h: |
| * runtime/JSGenericTypedArrayViewInlines.h: |
| (JSC::JSGenericTypedArrayView<Adaptor>::estimatedSize): |
| (JSC::JSGenericTypedArrayView<Adaptor>::visitChildren): |
| (JSC::JSGenericTypedArrayView<Adaptor>::slowDownAndWasteMemory): |
| * runtime/JSObject.h: |
| |
| 2018-04-03 Filip Pizlo <fpizlo@apple.com> |
| |
| Don't do index masking or poisoning for DirectArguments |
| https://bugs.webkit.org/show_bug.cgi?id=184280 |
| |
| Reviewed by Saam Barati. |
| |
| * JavaScriptCore.xcodeproj/project.pbxproj: |
| * bytecode/AccessCase.cpp: |
| (JSC::AccessCase::generateWithGuard): |
| * dfg/DFGCallCreateDirectArgumentsSlowPathGenerator.h: |
| (JSC::DFG::CallCreateDirectArgumentsSlowPathGenerator::CallCreateDirectArgumentsSlowPathGenerator): |
| * dfg/DFGCallCreateDirectArgumentsWithKnownLengthSlowPathGenerator.h: Removed. |
| * dfg/DFGSpeculativeJIT.cpp: |
| (JSC::DFG::SpeculativeJIT::compileGetByValOnDirectArguments): |
| (JSC::DFG::SpeculativeJIT::compileGetArrayLength): |
| (JSC::DFG::SpeculativeJIT::compileCreateDirectArguments): |
| (JSC::DFG::SpeculativeJIT::compileGetFromArguments): |
| (JSC::DFG::SpeculativeJIT::compilePutToArguments): |
| * ftl/FTLAbstractHeapRepository.h: |
| * ftl/FTLLowerDFGToB3.cpp: |
| (JSC::FTL::DFG::LowerDFGToB3::compileGetArrayLength): |
| (JSC::FTL::DFG::LowerDFGToB3::compileGetByVal): |
| (JSC::FTL::DFG::LowerDFGToB3::compileCreateDirectArguments): |
| (JSC::FTL::DFG::LowerDFGToB3::compileGetFromArguments): |
| (JSC::FTL::DFG::LowerDFGToB3::compilePutToArguments): |
| (JSC::FTL::DFG::LowerDFGToB3::compileCheckSubClass): |
| (JSC::FTL::DFG::LowerDFGToB3::dynamicPoison): |
| (JSC::FTL::DFG::LowerDFGToB3::dynamicPoisonOnLoadedType): |
| (JSC::FTL::DFG::LowerDFGToB3::dynamicPoisonOnType): |
| (JSC::FTL::DFG::LowerDFGToB3::allocateVariableSizedHeapCell): Deleted. |
| * heap/SecurityKind.h: |
| * jit/JITPropertyAccess.cpp: |
| (JSC::JIT::emit_op_get_from_arguments): |
| (JSC::JIT::emit_op_put_to_arguments): |
| (JSC::JIT::emitDirectArgumentsGetByVal): |
| * jit/JITPropertyAccess32_64.cpp: |
| (JSC::JIT::emit_op_get_from_arguments): |
| (JSC::JIT::emit_op_put_to_arguments): |
| * llint/LowLevelInterpreter.asm: |
| * llint/LowLevelInterpreter32_64.asm: |
| * llint/LowLevelInterpreter64.asm: |
| * runtime/DirectArguments.cpp: |
| (JSC::DirectArguments::DirectArguments): |
| (JSC::DirectArguments::createUninitialized): |
| (JSC::DirectArguments::create): |
| (JSC::DirectArguments::createByCopying): |
| (JSC::DirectArguments::estimatedSize): |
| (JSC::DirectArguments::visitChildren): |
| (JSC::DirectArguments::overrideThings): |
| (JSC::DirectArguments::copyToArguments): |
| (JSC::DirectArguments::mappedArgumentsSize): |
| * runtime/DirectArguments.h: |
| * runtime/JSCPoison.h: |
| * runtime/JSLexicalEnvironment.h: |
| * runtime/JSSymbolTableObject.h: |
| |
| 2018-04-03 Filip Pizlo <fpizlo@apple.com> |
| |
| JSArray::appendMemcpy seems to be missing a barrier |
| https://bugs.webkit.org/show_bug.cgi?id=184290 |
| |
| Reviewed by Mark Lam. |
| |
| If you write to an array that may contain pointers and you didn't just allocate it, then you need to |
| barrier right after. |
| |
| I don't know if this is really a bug - it's possible that all callers of appendMemcpy do things that |
| obviate the need for this barrier. But these barriers are cheap, so we should do them if in doubt. |
| |
| * runtime/JSArray.cpp: |
| (JSC::JSArray::appendMemcpy): |
| |
| 2018-04-03 Filip Pizlo <fpizlo@apple.com> |
| |
| GC shouldn't do object distancing |
| https://bugs.webkit.org/show_bug.cgi?id=184195 |
| |
| Reviewed by Saam Barati. |
| |
| This rolls out SecurityKind/SecurityOriginToken, but keeps the TLC infrastructure. It seems |
| to be a small speed-up. |
| |
| * CMakeLists.txt: |
| * JavaScriptCore.xcodeproj/project.pbxproj: |
| * Sources.txt: |
| * heap/BlockDirectory.cpp: |
| (JSC::BlockDirectory::findBlockForAllocation): |
| (JSC::BlockDirectory::addBlock): |
| * heap/BlockDirectory.h: |
| * heap/CellAttributes.cpp: |
| (JSC::CellAttributes::dump const): |
| * heap/CellAttributes.h: |
| (JSC::CellAttributes::CellAttributes): |
| * heap/LocalAllocator.cpp: |
| (JSC::LocalAllocator::allocateSlowCase): |
| (JSC::LocalAllocator::tryAllocateWithoutCollecting): |
| * heap/MarkedBlock.cpp: |
| (JSC::MarkedBlock::Handle::didAddToDirectory): |
| * heap/MarkedBlock.h: |
| (JSC::MarkedBlock::Handle::securityOriginToken const): Deleted. |
| * heap/SecurityKind.cpp: Removed. |
| * heap/SecurityKind.h: Removed. |
| * heap/SecurityOriginToken.cpp: Removed. |
| * heap/SecurityOriginToken.h: Removed. |
| * heap/ThreadLocalCache.cpp: |
| (JSC::ThreadLocalCache::create): |
| (JSC::ThreadLocalCache::ThreadLocalCache): |
| * heap/ThreadLocalCache.h: |
| (JSC::ThreadLocalCache::securityOriginToken const): Deleted. |
| * runtime/JSDestructibleObjectHeapCellType.cpp: |
| (JSC::JSDestructibleObjectHeapCellType::JSDestructibleObjectHeapCellType): |
| * runtime/JSGlobalObject.cpp: |
| (JSC::JSGlobalObject::JSGlobalObject): |
| * runtime/JSGlobalObject.h: |
| (JSC::JSGlobalObject::threadLocalCache const): Deleted. |
| * runtime/JSSegmentedVariableObjectHeapCellType.cpp: |
| (JSC::JSSegmentedVariableObjectHeapCellType::JSSegmentedVariableObjectHeapCellType): |
| * runtime/JSStringHeapCellType.cpp: |
| (JSC::JSStringHeapCellType::JSStringHeapCellType): |
| * runtime/VM.cpp: |
| (JSC::VM::VM): |
| * runtime/VM.h: |
| * runtime/VMEntryScope.cpp: |
| (JSC::VMEntryScope::VMEntryScope): |
| * wasm/js/JSWebAssemblyCodeBlockHeapCellType.cpp: |
| (JSC::JSWebAssemblyCodeBlockHeapCellType::JSWebAssemblyCodeBlockHeapCellType): |
| |
| 2018-04-02 Saam Barati <sbarati@apple.com> |
| |
| bmalloc should compute its own estimate of its footprint |
| https://bugs.webkit.org/show_bug.cgi?id=184121 |
| |
| Reviewed by Filip Pizlo. |
| |
| * heap/IsoAlignedMemoryAllocator.cpp: |
| (JSC::IsoAlignedMemoryAllocator::~IsoAlignedMemoryAllocator): |
| (JSC::IsoAlignedMemoryAllocator::tryAllocateAlignedMemory): |
| (JSC::IsoAlignedMemoryAllocator::freeAlignedMemory): |
| |
| 2018-04-02 Mark Lam <mark.lam@apple.com> |
| |
| We should not trash the stack pointer on OSR entry. |
| https://bugs.webkit.org/show_bug.cgi?id=184243 |
| <rdar://problem/39114319> |
| |
| Reviewed by Filip Pizlo. |
| |
| In the DFG OSR entry path, we momentarily over-write the stack pointer with |
| returnValueGPR2. returnValueGPR2 contains a pointer to a side buffer we malloc'ed. |
| Hence, this assignment is wrong, and it turns out to be unnecessary as well. |
| The stack pointer does get corrected later in the thunk (generated by |
| osrEntryThunkGenerator()) that we jump to. This is why we don't see ill-effects |
| so far. |
| |
| This bug only poses an issue if interrupts use the user stack for their stack |
| frame (e.g. linux), and when we do stack alignment tests during debugging. |
| |
| The fix is simply to remove the assignment. |
| |
| * dfg/DFGThunks.cpp: |
| (JSC::DFG::osrEntryThunkGenerator): |
| * jit/JIT.cpp: |
| (JSC::JIT::emitEnterOptimizationCheck): |
| |
| 2018-04-02 Stanislav Ocovaj <stanislav.ocovaj@rt-rk.com> |
| |
| [MIPS] Optimize JIT code generated by methods with TrustedImm32 operand |
| https://bugs.webkit.org/show_bug.cgi?id=183740 |
| |
| Reviewed by Yusuke Suzuki. |
| |
| In many macro assembler methods with TrustedImm32 operand a move imm, immTemp (pseudo)instruction is |
| first generated and a register operand variant of the same method is called to generate the rest |
| of the code. If the immediate value can fit in 16 bits then we can skip the move instruction and |
| generate more efficient code using MIPS instructions with immediate operand. |
| |
| * assembler/MIPSAssembler.h: |
| (JSC::MIPSAssembler::slti): |
| * assembler/MacroAssemblerMIPS.h: |
| (JSC::MacroAssemblerMIPS::lshift32): |
| (JSC::MacroAssemblerMIPS::xor32): |
| (JSC::MacroAssemblerMIPS::branch8): |
| (JSC::MacroAssemblerMIPS::compare8): |
| (JSC::MacroAssemblerMIPS::branch32): |
| (JSC::MacroAssemblerMIPS::branch32WithUnalignedHalfWords): |
| (JSC::MacroAssemblerMIPS::branchTest32): |
| (JSC::MacroAssemblerMIPS::mask8OnTest): |
| (JSC::MacroAssemblerMIPS::branchTest8): |
| (JSC::MacroAssemblerMIPS::branchAdd32): |
| (JSC::MacroAssemblerMIPS::branchNeg32): |
| (JSC::MacroAssemblerMIPS::compare32): |
| (JSC::MacroAssemblerMIPS::test8): |
| |
| 2018-04-02 Yusuke Suzuki <utatane.tea@gmail.com> |
| |
| [DFG] More aggressive removal of duplicate 32bit DFG code |
| https://bugs.webkit.org/show_bug.cgi?id=184089 |
| |
| Reviewed by Saam Barati. |
| |
| This patch more aggressively removes duplicate 32bit DFG code |
| by leveraging JSValueRegs and meta-programmed callOperation. |
| |
| * dfg/DFGSpeculativeJIT.cpp: |
| (JSC::DFG::SpeculativeJIT::compileGetByValWithThis): |
| (JSC::DFG::SpeculativeJIT::compileArithMinMax): |
| (JSC::DFG::SpeculativeJIT::compileNewArray): |
| (JSC::DFG::SpeculativeJIT::compileCheckCell): |
| (JSC::DFG::SpeculativeJIT::compileGetGlobalVariable): |
| (JSC::DFG::SpeculativeJIT::compilePutGlobalVariable): |
| (JSC::DFG::SpeculativeJIT::compileGetClosureVar): |
| (JSC::DFG::SpeculativeJIT::compilePutClosureVar): |
| (JSC::DFG::SpeculativeJIT::compileGetByOffset): |
| (JSC::DFG::SpeculativeJIT::compilePutByOffset): |
| (JSC::DFG::SpeculativeJIT::compileGetExecutable): |
| (JSC::DFG::SpeculativeJIT::compileNewArrayBuffer): |
| (JSC::DFG::SpeculativeJIT::compileToThis): |
| (JSC::DFG::SpeculativeJIT::compileIdentity): |
| * dfg/DFGSpeculativeJIT.h: |
| * dfg/DFGSpeculativeJIT32_64.cpp: |
| (JSC::DFG::SpeculativeJIT::compile): |
| * dfg/DFGSpeculativeJIT64.cpp: |
| (JSC::DFG::SpeculativeJIT::compile): |
| |
| 2018-04-01 Filip Pizlo <fpizlo@apple.com> |
| |
| Raise the for-call inlining threshold to 190 to fix JetStream/richards regression |
| https://bugs.webkit.org/show_bug.cgi?id=184228 |
| |
| Reviewed by Yusuke Suzuki. |
| |
| * runtime/Options.h: |
| |
| 2018-03-31 Filip Pizlo <fpizlo@apple.com> |
| |
| JSObject shouldn't do index masking |
| https://bugs.webkit.org/show_bug.cgi?id=184194 |
| |
| Reviewed by Yusuke Suzuki. |
| |
| Remove index masking, because it's not the way we'll mitigate Spectre. |
| |
| * API/tests/JSObjectGetProxyTargetTest.cpp: |
| (testJSObjectGetProxyTarget): |
| * b3/B3LowerToAir.cpp: |
| * b3/B3Validate.cpp: |
| * b3/B3WasmBoundsCheckValue.cpp: |
| (JSC::B3::WasmBoundsCheckValue::WasmBoundsCheckValue): |
| (JSC::B3::WasmBoundsCheckValue::dumpMeta const): |
| * b3/B3WasmBoundsCheckValue.h: |
| (JSC::B3::WasmBoundsCheckValue::bounds const): |
| (JSC::B3::WasmBoundsCheckValue::pinnedIndexingMask const): Deleted. |
| * b3/testb3.cpp: |
| (JSC::B3::testWasmBoundsCheck): |
| (JSC::B3::run): |
| * dfg/DFGAbstractInterpreterInlines.h: |
| (JSC::DFG::AbstractInterpreter<AbstractStateType>::executeEffects): |
| * dfg/DFGArgumentsEliminationPhase.cpp: |
| * dfg/DFGByteCodeParser.cpp: |
| (JSC::DFG::ByteCodeParser::parseBlock): |
| * dfg/DFGClobberize.h: |
| (JSC::DFG::clobberize): |
| * dfg/DFGDoesGC.cpp: |
| (JSC::DFG::doesGC): |
| * dfg/DFGFixupPhase.cpp: |
| (JSC::DFG::FixupPhase::fixupNode): |
| * dfg/DFGNodeType.h: |
| * dfg/DFGPredictionPropagationPhase.cpp: |
| * dfg/DFGSSALoweringPhase.cpp: |
| (JSC::DFG::SSALoweringPhase::handleNode): |
| * dfg/DFGSafeToExecute.h: |
| (JSC::DFG::safeToExecute): |
| * dfg/DFGSpeculativeJIT.cpp: |
| (JSC::DFG::SpeculativeJIT::SpeculativeJIT): |
| (JSC::DFG::SpeculativeJIT::emitAllocateRawObject): |
| (JSC::DFG::SpeculativeJIT::loadFromIntTypedArray): |
| (JSC::DFG::SpeculativeJIT::compileGetByValOnIntTypedArray): |
| (JSC::DFG::SpeculativeJIT::compileGetByValOnFloatTypedArray): |
| (JSC::DFG::SpeculativeJIT::compileNewFunctionCommon): |
| (JSC::DFG::SpeculativeJIT::compileCreateActivation): |
| (JSC::DFG::SpeculativeJIT::compileCreateDirectArguments): |
| (JSC::DFG::SpeculativeJIT::compileArraySlice): |
| (JSC::DFG::SpeculativeJIT::compileNewStringObject): |
| (JSC::DFG::SpeculativeJIT::compileNewTypedArrayWithSize): |
| (JSC::DFG::SpeculativeJIT::compileNewRegexp): |
| (JSC::DFG::SpeculativeJIT::compileCreateThis): |
| (JSC::DFG::SpeculativeJIT::compileNewObject): |
| * dfg/DFGSpeculativeJIT.h: |
| (JSC::DFG::SpeculativeJIT::emitAllocateJSObject): |
| (JSC::DFG::SpeculativeJIT::emitAllocateJSObjectWithKnownSize): |
| * dfg/DFGSpeculativeJIT32_64.cpp: |
| (JSC::DFG::SpeculativeJIT::compile): |
| (JSC::DFG::SpeculativeJIT::compileAllocateNewArrayWithSize): |
| * dfg/DFGSpeculativeJIT64.cpp: |
| (JSC::DFG::SpeculativeJIT::compile): |
| (JSC::DFG::SpeculativeJIT::compileAllocateNewArrayWithSize): |
| * 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::compileGetByVal): |
| (JSC::FTL::DFG::LowerDFGToB3::compileCreateActivation): |
| (JSC::FTL::DFG::LowerDFGToB3::compileNewFunction): |
| (JSC::FTL::DFG::LowerDFGToB3::compileCreateDirectArguments): |
| (JSC::FTL::DFG::LowerDFGToB3::compileNewStringObject): |
| (JSC::FTL::DFG::LowerDFGToB3::compileNewTypedArray): |
| (JSC::FTL::DFG::LowerDFGToB3::compileMaterializeNewObject): |
| (JSC::FTL::DFG::LowerDFGToB3::compileMaterializeCreateActivation): |
| (JSC::FTL::DFG::LowerDFGToB3::compileNewRegexp): |
| (JSC::FTL::DFG::LowerDFGToB3::allocateObject): |
| (JSC::FTL::DFG::LowerDFGToB3::allocateVariableSizedObject): |
| (JSC::FTL::DFG::LowerDFGToB3::allocateJSArray): |
| (JSC::FTL::DFG::LowerDFGToB3::pointerIntoTypedArray): |
| (JSC::FTL::DFG::LowerDFGToB3::compileGetArrayMask): Deleted. |
| (JSC::FTL::DFG::LowerDFGToB3::maskedIndex): Deleted. |
| (JSC::FTL::DFG::LowerDFGToB3::computeButterflyIndexingMask): Deleted. |
| * jit/AssemblyHelpers.h: |
| (JSC::AssemblyHelpers::emitAllocateJSObject): |
| (JSC::AssemblyHelpers::emitAllocateJSObjectWithKnownSize): |
| (JSC::AssemblyHelpers::emitAllocateVariableSizedJSObject): |
| (JSC::AssemblyHelpers::emitAllocateDestructibleObject): |
| * jit/JITOpcodes.cpp: |
| (JSC::JIT::emit_op_new_object): |
| (JSC::JIT::emit_op_create_this): |
| * jit/JITOperations.cpp: |
| * jit/JITPropertyAccess.cpp: |
| (JSC::JIT::emitDoubleLoad): |
| (JSC::JIT::emitContiguousLoad): |
| (JSC::JIT::emitArrayStorageLoad): |
| * llint/LowLevelInterpreter32_64.asm: |
| * llint/LowLevelInterpreter64.asm: |
| * runtime/Butterfly.h: |
| (JSC::ContiguousData::at const): |
| (JSC::ContiguousData::at): |
| (JSC::Butterfly::computeIndexingMask const): Deleted. |
| * runtime/ButterflyInlines.h: |
| (JSC::ContiguousData<T>::at const): Deleted. |
| (JSC::ContiguousData<T>::at): Deleted. |
| * runtime/ClonedArguments.cpp: |
| (JSC::ClonedArguments::createEmpty): |
| * runtime/JSArray.cpp: |
| (JSC::JSArray::tryCreateUninitializedRestricted): |
| (JSC::JSArray::appendMemcpy): |
| (JSC::JSArray::setLength): |
| (JSC::JSArray::pop): |
| (JSC::JSArray::shiftCountWithAnyIndexingType): |
| (JSC::JSArray::unshiftCountWithAnyIndexingType): |
| (JSC::JSArray::fillArgList): |
| (JSC::JSArray::copyToArguments): |
| * runtime/JSArrayBufferView.cpp: |
| (JSC::JSArrayBufferView::JSArrayBufferView): |
| * runtime/JSArrayInlines.h: |
| (JSC::JSArray::pushInline): |
| * runtime/JSFixedArray.h: |
| * runtime/JSGenericTypedArrayViewInlines.h: |
| (JSC::JSGenericTypedArrayView<Adaptor>::slowDownAndWasteMemory): |
| * runtime/JSObject.cpp: |
| (JSC::JSObject::getOwnPropertySlotByIndex): |
| (JSC::JSObject::putByIndex): |
| (JSC::JSObject::createInitialUndecided): |
| (JSC::JSObject::createInitialInt32): |
| (JSC::JSObject::createInitialDouble): |
| (JSC::JSObject::createInitialContiguous): |
| (JSC::JSObject::createArrayStorage): |
| (JSC::JSObject::convertUndecidedToInt32): |
| (JSC::JSObject::convertUndecidedToDouble): |
| (JSC::JSObject::convertUndecidedToContiguous): |
| (JSC::JSObject::convertUndecidedToArrayStorage): |
| (JSC::JSObject::convertInt32ToDouble): |
| (JSC::JSObject::convertInt32ToArrayStorage): |
| (JSC::JSObject::convertDoubleToContiguous): |
| (JSC::JSObject::convertDoubleToArrayStorage): |
| (JSC::JSObject::convertContiguousToArrayStorage): |
| (JSC::JSObject::createInitialForValueAndSet): |
| (JSC::JSObject::deletePropertyByIndex): |
| (JSC::JSObject::getOwnPropertyNames): |
| (JSC::JSObject::putByIndexBeyondVectorLengthWithoutAttributes): |
| (JSC::JSObject::countElements): |
| (JSC::JSObject::increaseVectorLength): |
| (JSC::JSObject::ensureLengthSlow): |
| (JSC::JSObject::reallocateAndShrinkButterfly): |
| (JSC::JSObject::getEnumerableLength): |
| * runtime/JSObject.h: |
| (JSC::JSObject::canGetIndexQuickly): |
| (JSC::JSObject::getIndexQuickly): |
| (JSC::JSObject::tryGetIndexQuickly const): |
| (JSC::JSObject::setIndexQuickly): |
| (JSC::JSObject::initializeIndex): |
| (JSC::JSObject::initializeIndexWithoutBarrier): |
| (JSC::JSObject::butterflyOffset): |
| (JSC::JSObject::setButterfly): |
| (JSC::JSObject::nukeStructureAndSetButterfly): |
| (JSC::JSObject::JSObject): |
| (JSC::JSObject::butterflyIndexingMaskOffset): Deleted. |
| (JSC::JSObject::butterflyIndexingMask const): Deleted. |
| (JSC::JSObject::setButterflyWithIndexingMask): Deleted. |
| * runtime/JSObjectInlines.h: |
| (JSC::JSObject::prepareToPutDirectWithoutTransition): |
| (JSC::JSObject::putDirectInternal): |
| * runtime/RegExpMatchesArray.h: |
| (JSC::tryCreateUninitializedRegExpMatchesArray): |
| * runtime/Structure.cpp: |
| (JSC::Structure::flattenDictionaryStructure): |
| * wasm/WasmB3IRGenerator.cpp: |
| (JSC::Wasm::B3IRGenerator::B3IRGenerator): |
| (JSC::Wasm::B3IRGenerator::restoreWebAssemblyGlobalState): |
| (JSC::Wasm::B3IRGenerator::emitCheckAndPreparePointer): |
| (JSC::Wasm::B3IRGenerator::load): |
| (JSC::Wasm::B3IRGenerator::store): |
| (JSC::Wasm::B3IRGenerator::addCallIndirect): |
| * wasm/WasmBinding.cpp: |
| (JSC::Wasm::wasmToWasm): |
| * wasm/WasmInstance.h: |
| (JSC::Wasm::Instance::updateCachedMemory): |
| (JSC::Wasm::Instance::offsetOfCachedMemorySize): |
| (JSC::Wasm::Instance::offsetOfCachedIndexingMask): Deleted. |
| * wasm/WasmMemory.cpp: |
| (JSC::Wasm::Memory::Memory): |
| (JSC::Wasm::Memory::grow): |
| * wasm/WasmMemory.h: |
| (JSC::Wasm::Memory::size const): |
| (JSC::Wasm::Memory::offsetOfSize): |
| (JSC::Wasm::Memory::indexingMask): Deleted. |
| (JSC::Wasm::Memory::offsetOfIndexingMask): Deleted. |
| * wasm/WasmMemoryInformation.cpp: |
| (JSC::Wasm::PinnedRegisterInfo::get): |
| (JSC::Wasm::PinnedRegisterInfo::PinnedRegisterInfo): |
| * wasm/WasmMemoryInformation.h: |
| (JSC::Wasm::PinnedRegisterInfo::toSave const): |
| * wasm/js/JSToWasm.cpp: |
| (JSC::Wasm::createJSToWasmWrapper): |
| |
| 2018-03-31 Filip Pizlo <fpizlo@apple.com> |
| |
| JSC crash in JIT code with for-of loop and Array/Set iterators |
| https://bugs.webkit.org/show_bug.cgi?id=183174 |
| |
| Reviewed by Saam Barati. |
| |
| * dfg/DFGSafeToExecute.h: |
| (JSC::DFG::safeToExecute): Fix the bug by making GetByOffset and friends verify that they are getting the type proof they want at the desired hoisting site. |
| |
| 2018-03-30 Filip Pizlo <fpizlo@apple.com> |
| |
| Strings and Vectors shouldn't do index masking |
| https://bugs.webkit.org/show_bug.cgi?id=184193 |
| |
| Reviewed by Mark Lam. |
| |
| * dfg/DFGSpeculativeJIT.cpp: |
| (JSC::DFG::SpeculativeJIT::compileGetCharCodeAt): |
| (JSC::DFG::SpeculativeJIT::compileGetByValOnString): |
| * ftl/FTLAbstractHeapRepository.h: |
| * ftl/FTLLowerDFGToB3.cpp: |
| (JSC::FTL::DFG::LowerDFGToB3::compileStringCharAt): |
| (JSC::FTL::DFG::LowerDFGToB3::compileStringCharCodeAt): |
| * jit/ThunkGenerators.cpp: |
| (JSC::stringCharLoad): |
| |
| 2018-03-30 Mark Lam <mark.lam@apple.com> |
| |
| Add pointer profiling support in baseline JIT and supporting files. |
| https://bugs.webkit.org/show_bug.cgi?id=184200 |
| <rdar://problem/39057300> |
| |
| Reviewed by Filip Pizlo. |
| |
| 1. To simplify pointer profiling support, vmEntryToJavaScript() now always enters |
| the code via the arity check entry. |
| 2. To accommodate (1), all JITCode must now populate their arity check entry code |
| pointers as well. For native code, programs, evals, and modules that don't |
| do arity check, we set the normal entry as the arity check entry (though with |
| the CodeEntryWithArityCheckPtrTag profile instead). |
| |
| * assembler/AbstractMacroAssembler.h: |
| * assembler/LinkBuffer.h: |
| (JSC::LinkBuffer::locationOfNearCall): |
| * assembler/MacroAssemblerARM64.h: |
| (JSC::MacroAssemblerARM64::readCallTarget): |
| (JSC::MacroAssemblerARM64::linkCall): |
| * bytecode/AccessCase.cpp: |
| (JSC::AccessCase::generateImpl): |
| * bytecode/AccessCaseSnippetParams.cpp: |
| (JSC::SlowPathCallGeneratorWithArguments::generateImpl): |
| * bytecode/CodeBlock.cpp: |
| (JSC::CodeBlock::addJITAddIC): |
| (JSC::CodeBlock::addJITMulIC): |
| (JSC::CodeBlock::addJITSubIC): |
| (JSC::CodeBlock::addJITNegIC): |
| * bytecode/CodeBlock.h: |
| (JSC::CodeBlock::addMathIC): |
| * bytecode/InlineAccess.cpp: |
| (JSC::InlineAccess::rewireStubAsJump): |
| * bytecode/LLIntCallLinkInfo.h: |
| (JSC::LLIntCallLinkInfo::unlink): |
| (): Deleted. |
| * bytecode/PolymorphicAccess.cpp: |
| (JSC::AccessGenerationState::emitExplicitExceptionHandler): |
| (JSC::PolymorphicAccess::regenerate): |
| * dfg/DFGJITFinalizer.cpp: |
| (JSC::DFG::JITFinalizer::finalize): |
| (JSC::DFG::JITFinalizer::finalizeFunction): |
| * dfg/DFGSpeculativeJIT.cpp: |
| (JSC::DFG::SpeculativeJIT::compileValueAdd): |
| (JSC::DFG::SpeculativeJIT::compileArithSub): |
| (JSC::DFG::SpeculativeJIT::compileArithNegate): |
| (JSC::DFG::SpeculativeJIT::compileArithMul): |
| (JSC::DFG::SpeculativeJIT::emitSwitchIntJump): |
| (JSC::DFG::SpeculativeJIT::emitSwitchImm): |
| (JSC::DFG::SpeculativeJIT::emitSwitchStringOnString): |
| * disassembler/ARM64Disassembler.cpp: |
| (JSC::tryToDisassemble): |
| * ftl/FTLJITFinalizer.cpp: |
| (JSC::FTL::JITFinalizer::finalizeCommon): |
| * ftl/FTLLowerDFGToB3.cpp: |
| (JSC::FTL::DFG::LowerDFGToB3::compileValueAdd): |
| (JSC::FTL::DFG::LowerDFGToB3::compileUnaryMathIC): |
| (JSC::FTL::DFG::LowerDFGToB3::compileBinaryMathIC): |
| (JSC::FTL::DFG::LowerDFGToB3::compileArithAddOrSub): |
| (JSC::FTL::DFG::LowerDFGToB3::compileArithMul): |
| (JSC::FTL::DFG::LowerDFGToB3::compileArithNegate): |
| * heap/JITStubRoutineSet.h: |
| (JSC::JITStubRoutineSet::mark): |
| * jit/AssemblyHelpers.cpp: |
| (JSC::AssemblyHelpers::callExceptionFuzz): |
| (JSC::AssemblyHelpers::debugCall): |
| * jit/AssemblyHelpers.h: |
| (JSC::AssemblyHelpers::emitFunctionPrologue): |
| * jit/CCallHelpers.cpp: |
| (JSC::CCallHelpers::ensureShadowChickenPacket): |
| * jit/CCallHelpers.h: |
| (JSC::CCallHelpers::prepareForTailCallSlow): |
| * jit/CallFrameShuffler.cpp: |
| (JSC::CallFrameShuffler::prepareForTailCall): |
| * jit/ExecutableAllocator.cpp: |
| (JSC::FixedVMPoolExecutableAllocator::jitWriteThunkGenerator): |
| * jit/ExecutableAllocator.h: |
| (JSC::performJITMemcpy): |
| * jit/JIT.cpp: |
| (JSC::JIT::compileWithoutLinking): |
| (JSC::JIT::link): |
| * jit/JITArithmetic.cpp: |
| (JSC::JIT::emit_op_negate): |
| (JSC::JIT::emit_op_add): |
| (JSC::JIT::emitMathICFast): |
| (JSC::JIT::emitMathICSlow): |
| (JSC::JIT::emit_op_mul): |
| (JSC::JIT::emit_op_sub): |
| * jit/JITCode.cpp: |
| (JSC::JITCode::execute): |
| (JSC::JITCodeWithCodeRef::executableAddressAtOffset): |
| (JSC::DirectJITCode::DirectJITCode): |
| (JSC::DirectJITCode::initializeCodeRef): |
| (JSC::NativeJITCode::addressForCall): |
| * jit/JITExceptions.cpp: |
| (JSC::genericUnwind): |
| * jit/JITMathIC.h: |
| (JSC::isProfileEmpty): |
| (JSC::JITBinaryMathIC::JITBinaryMathIC): |
| (JSC::JITUnaryMathIC::JITUnaryMathIC): |
| * jit/JITOpcodes.cpp: |
| (JSC::JIT::emit_op_switch_imm): |
| (JSC::JIT::emit_op_switch_char): |
| (JSC::JIT::emit_op_switch_string): |
| (JSC::JIT::privateCompileHasIndexedProperty): |
| (JSC::JIT::emitSlow_op_has_indexed_property): |
| * jit/JITOpcodes32_64.cpp: |
| (JSC::JIT::privateCompileHasIndexedProperty): |
| * jit/JITOperations.cpp: |
| (JSC::getByVal): |
| (JSC::tryGetByValOptimize): |
| * jit/JITPropertyAccess.cpp: |
| (JSC::JIT::stringGetByValStubGenerator): |
| (JSC::JIT::emitGetByValWithCachedId): |
| (JSC::JIT::emitSlow_op_get_by_val): |
| (JSC::JIT::emitPutByValWithCachedId): |
| (JSC::JIT::emitSlow_op_put_by_val): |
| (JSC::JIT::emitSlow_op_try_get_by_id): |
| (JSC::JIT::emitSlow_op_get_by_id): |
| (JSC::JIT::emitSlow_op_get_by_id_with_this): |
| (JSC::JIT::emitSlow_op_put_by_id): |
| (JSC::JIT::privateCompileGetByVal): |
| (JSC::JIT::privateCompileGetByValWithCachedId): |
| (JSC::JIT::privateCompilePutByVal): |
| (JSC::JIT::privateCompilePutByValWithCachedId): |
| * jit/JITThunks.cpp: |
| (JSC::JITThunks::hostFunctionStub): |
| * jit/Repatch.cpp: |
| (JSC::tryCacheGetByID): |
| (JSC::repatchGetByID): |
| (JSC::appropriateOptimizingPutByIdFunction): |
| (JSC::tryCachePutByID): |
| (JSC::repatchPutByID): |
| (JSC::linkFor): |
| (JSC::revertCall): |
| (JSC::linkPolymorphicCall): |
| (JSC::resetGetByID): |
| (JSC::resetPutByID): |
| * jit/Repatch.h: |
| * jit/SpecializedThunkJIT.h: |
| (JSC::SpecializedThunkJIT::finalize): |
| (JSC::SpecializedThunkJIT::callDoubleToDouble): |
| * jit/ThunkGenerators.cpp: |
| (JSC::emitPointerValidation): |
| (JSC::throwExceptionFromCallSlowPathGenerator): |
| (JSC::slowPathFor): |
| (JSC::linkCallThunkGenerator): Deleted. |
| (JSC::linkPolymorphicCallThunkGenerator): Deleted. |
| (JSC::virtualThunkFor): Deleted. |
| (JSC::nativeForGenerator): Deleted. |
| (JSC::nativeCallGenerator): Deleted. |
| (JSC::nativeTailCallGenerator): Deleted. |
| (JSC::nativeTailCallWithoutSavedTagsGenerator): Deleted. |
| (JSC::nativeConstructGenerator): Deleted. |
| (JSC::internalFunctionCallGenerator): Deleted. |
| (JSC::internalFunctionConstructGenerator): Deleted. |
| (JSC::arityFixupGenerator): Deleted. |
| (JSC::unreachableGenerator): Deleted. |
| (JSC::stringCharLoad): Deleted. |
| (JSC::charToString): Deleted. |
| (JSC::charCodeAtThunkGenerator): Deleted. |
| (JSC::charAtThunkGenerator): Deleted. |
| (JSC::fromCharCodeThunkGenerator): Deleted. |
| (JSC::clz32ThunkGenerator): Deleted. |
| (JSC::sqrtThunkGenerator): Deleted. |
| (JSC::floorThunkGenerator): Deleted. |
| (JSC::ceilThunkGenerator): Deleted. |
| (JSC::truncThunkGenerator): Deleted. |
| (JSC::roundThunkGenerator): Deleted. |
| (JSC::expThunkGenerator): Deleted. |
| (JSC::logThunkGenerator): Deleted. |
| (JSC::absThunkGenerator): Deleted. |
| (JSC::imulThunkGenerator): Deleted. |
| (JSC::randomThunkGenerator): Deleted. |
| (JSC::boundThisNoArgsFunctionCallGenerator): Deleted. |
| * llint/LLIntData.cpp: |
| (JSC::LLInt::initialize): |
| * llint/LLIntData.h: |
| (JSC::LLInt::getCodePtr): |
| * llint/LLIntEntrypoint.cpp: |
| (JSC::LLInt::setEvalEntrypoint): |
| (JSC::LLInt::setProgramEntrypoint): |
| (JSC::LLInt::setModuleProgramEntrypoint): |
| * llint/LLIntSlowPaths.cpp: |
| (JSC::LLInt::setUpCall): |
| * llint/LLIntThunks.cpp: |
| (JSC::LLInt::generateThunkWithJumpTo): |
| * llint/LowLevelInterpreter.asm: |
| * llint/LowLevelInterpreter32_64.asm: |
| * llint/LowLevelInterpreter64.asm: |
| * runtime/ExecutableBase.h: |
| * runtime/NativeExecutable.cpp: |
| (JSC::NativeExecutable::finishCreation): |
| * runtime/NativeFunction.h: |
| (JSC::TaggedNativeFunction::TaggedNativeFunction): |
| (JSC::TaggedNativeFunction::operator NativeFunction): |
| * runtime/PropertySlot.h: |
| (JSC::PropertySlot::setCustom): |
| (JSC::PropertySlot::setCacheableCustom): |
| * runtime/PtrTag.h: |
| * runtime/PutPropertySlot.h: |
| (JSC::PutPropertySlot::setCustomValue): |
| (JSC::PutPropertySlot::setCustomAccessor): |
| * runtime/SamplingProfiler.cpp: |
| (JSC::SamplingProfiler::takeSample): |
| * runtime/VMTraps.cpp: |
| (JSC::SignalContext::SignalContext): |
| (JSC::VMTraps::tryInstallTrapBreakpoints): |
| * tools/SigillCrashAnalyzer.cpp: |
| (JSC::installCrashHandler): |
| * yarr/YarrJIT.cpp: |
| (JSC::Yarr::YarrGenerator::generateTryReadUnicodeCharacterHelper): |
| (JSC::Yarr::YarrGenerator::generateEnter): |
| |
| 2018-03-30 Devin Rousso <webkit@devinrousso.com> |
| |
| Web Inspector: tint all pixels drawn by shader program when hovering ShaderProgramTreeElement |
| https://bugs.webkit.org/show_bug.cgi?id=175223 |
| |
| Reviewed by Matt Baker. |
| |
| * inspector/protocol/Canvas.json: |
| Add `setShaderProgramHighlighted` command that will cause a blend to be applied to the |
| canvas if the given shader program is active immediately before `drawArrays` or `drawElements` |
| is called. The blend is removed and the previous value is applied once the draw is complete. |
| |
| 2018-03-30 JF Bastien <jfbastien@apple.com> |
| |
| WebAssembly: support DataView compilation |
| https://bugs.webkit.org/show_bug.cgi?id=183342 |
| |
| Reviewed by Mark Lam. |
| |
| Compiling a module from a DataView was incorrectly dealing with |
| DataView's offset. |
| |
| * wasm/WasmModuleParser.cpp: |
| (JSC::Wasm::ModuleParser::parse): |
| * wasm/js/JSWebAssemblyHelpers.h: |
| (JSC::getWasmBufferFromValue): |
| (JSC::createSourceBufferFromValue): |
| * wasm/js/WebAssemblyPrototype.cpp: |
| (JSC::webAssemblyValidateFunc): |
| |
| 2018-03-30 Filip Pizlo <fpizlo@apple.com> |
| |
| Bytecode generator should not get_from_scope something that may be a hole into a variable that is already live |
| https://bugs.webkit.org/show_bug.cgi?id=184189 |
| |
| Reviewed by JF Bastien. |
| |
| * bytecompiler/NodesCodegen.cpp: |
| (JSC::ResolveNode::emitBytecode): |
| |
| 2018-03-30 Mark Lam <mark.lam@apple.com> |
| |
| Add pointer profiling support to Wasm. |
| https://bugs.webkit.org/show_bug.cgi?id=184175 |
| <rdar://problem/39027923> |
| |
| Reviewed by JF Bastien. |
| |
| * runtime/PtrTag.h: |
| * wasm/WasmB3IRGenerator.cpp: |
| (JSC::Wasm::B3IRGenerator::addGrowMemory): |
| (JSC::Wasm::B3IRGenerator::addCall): |
| (JSC::Wasm::B3IRGenerator::addCallIndirect): |
| (JSC::Wasm::B3IRGenerator::addOp<OpType::I32Popcnt>): |
| (JSC::Wasm::B3IRGenerator::addOp<OpType::I64Popcnt>): |
| * wasm/WasmBBQPlan.cpp: |
| (JSC::Wasm::BBQPlan::prepare): |
| (JSC::Wasm::BBQPlan::complete): |
| * wasm/WasmBinding.cpp: |
| (JSC::Wasm::wasmToWasm): |
| * wasm/WasmBinding.h: |
| * wasm/WasmFaultSignalHandler.cpp: |
| (JSC::Wasm::trapHandler): |
| * wasm/WasmOMGPlan.cpp: |
| (JSC::Wasm::OMGPlan::work): |
| * wasm/WasmThunks.cpp: |
| (JSC::Wasm::throwExceptionFromWasmThunkGenerator): |
| (JSC::Wasm::throwStackOverflowFromWasmThunkGenerator): |
| (JSC::Wasm::triggerOMGTierUpThunkGenerator): |
| * wasm/js/WasmToJS.cpp: |
| (JSC::Wasm::handleBadI64Use): |
| (JSC::Wasm::wasmToJS): |
| * wasm/js/WebAssemblyFunction.cpp: |
| (JSC::callWebAssemblyFunction): |
| * wasm/js/WebAssemblyFunction.h: |
| |
| 2018-03-30 Ryan Haddad <ryanhaddad@apple.com> |
| |
| Unreviewed, rolling out r230102. |
| |
| Caused assertion failures on JSC bots. |
| |
| Reverted changeset: |
| |
| "A stack overflow in the parsing of a builtin (called by |
| createExecutable) cause a crash instead of a catchable js |
| exception" |
| https://bugs.webkit.org/show_bug.cgi?id=184074 |
| https://trac.webkit.org/changeset/230102 |
| |
| 2018-03-30 Robin Morisset <rmorisset@apple.com> |
| |
| Inlining of a function that ends in op_unreachable in a non-tail position triggers an ASSERT |
| https://bugs.webkit.org/show_bug.cgi?id=183812 |
| |
| Reviewed by Keith Miller. |
| |
| The fix I landed for https://bugs.webkit.org/show_bug.cgi?id=181027 was flawed: I tried setting the bytecodeIndex for the new block on line 1679 (at the end of inlineCall), but it is going to be reset on line 6612 (in parseCodeBlock). |
| The fix is simply to make the block untargetable by default, and let parseCodeBlock make it targetable afterwards if it is a jump target. |
| |
| * dfg/DFGByteCodeParser.cpp: |
| (JSC::DFG::ByteCodeParser::allocateTargetableBlock): |
| (JSC::DFG::ByteCodeParser::inlineCall): |
| |
| 2018-03-30 Robin Morisset <rmorisset@apple.com> |
| |
| A stack overflow in the parsing of a builtin (called by createExecutable) cause a crash instead of a catchable js exception |
| https://bugs.webkit.org/show_bug.cgi?id=184074 |
| <rdar://problem/37165897> |
| |
| Reviewed by Keith Miller. |
| |
| Fixing this requires getting the ParserError (with information about the failure) and an ExecState* (to throw an exception) in the same place. |
| It is surprisingly painful, with quite a long call stack between the last function with an access to an ExecState* and the first function with the ParserError. |
| Even worse, many of these functions are generated by macros, themselves generated by a maze of python scripts. |
| As a result, this patch is grotesquely large, while all it does is adding enough plumbing to throw a proper exception in this specific case. |
| |
| There are now bare calls to '.value()' on several paths that may crash. It is not a problem in my opinion, since we previously crashed in every case regardless of the path that took us to createExecutable when encountering a stack overflow. |
| If we ever find an example that can cause these calls to fail, it should be doable to throw a proper exception there too. |
| |
| Two other minor changes: |
| - I removed BuiltinExecutableCreator.{cpp, h} as it was nearly empty, and only used in one place. That place now includes BuiltinExecutables.h directly instead. |
| - I moved code from ParserError.h into a newly created ParserError.cpp, as I see no need to inline functions that are only used when encountering a parser error, and ParserError.h is now included in quite a few places. |
| |
| * JavaScriptCore.xcodeproj/project.pbxproj: |
| * Scripts/builtins/builtins_generate_combined_header.py: |
| (BuiltinsCombinedHeaderGenerator.generate_forward_declarations): |
| (ParserError): |
| (generate_section_for_object): Deleted. |
| (generate_externs_for_object): Deleted. |
| (generate_macros_for_object): Deleted. |
| (generate_section_for_code_table_macro): Deleted. |
| (generate_section_for_code_name_macro): Deleted. |
| (generate_section_for_global_private_code_name_macro): Deleted. |
| * Scripts/builtins/builtins_generate_separate_header.py: |
| (generate_secondary_header_includes): |
| * Scripts/builtins/builtins_templates.py: |
| * Sources.txt: |
| * builtins/BuiltinExecutableCreator.cpp: Removed. |
| * builtins/BuiltinExecutableCreator.h: Removed. |
| * builtins/BuiltinExecutables.cpp: |
| (JSC::BuiltinExecutables::createDefaultConstructor): |
| (JSC::BuiltinExecutables::createBuiltinExecutable): |
| (JSC::createBuiltinExecutable): |
| (JSC::BuiltinExecutables::createExecutableOrCrash): |
| (JSC::BuiltinExecutables::createExecutable): |
| * builtins/BuiltinExecutables.h: |
| * bytecompiler/BytecodeGenerator.h: |
| * parser/ParserError.cpp: Added. |
| (JSC::ParserError::toErrorObject): |
| (JSC::ParserError::throwStackOverflowOrOutOfMemory): |
| (WTF::printInternal): |
| * parser/ParserError.h: |
| (JSC::ParserError::toErrorObject): Deleted. |
| (WTF::printInternal): Deleted. |
| * runtime/AsyncIteratorPrototype.cpp: |
| (JSC::AsyncIteratorPrototype::finishCreation): |
| * runtime/FunctionPrototype.cpp: |
| (JSC::FunctionPrototype::addFunctionProperties): |
| * runtime/JSGlobalObject.cpp: |
| (JSC::JSGlobalObject::init): |
| * runtime/JSObject.cpp: |
| (JSC::JSObject::getOwnStaticPropertySlot): |
| (JSC::JSObject::reifyAllStaticProperties): |
| * runtime/JSObject.h: |
| (JSC::JSObject::getOwnNonIndexPropertySlot): |
| (JSC::JSObject::getOwnPropertySlot): |
| (JSC::JSObject::getPropertySlot): |
| * runtime/JSObjectInlines.h: |
| (JSC::JSObject::getNonIndexPropertySlot): |
| * runtime/JSTypedArrayViewPrototype.cpp: |
| (JSC::JSTypedArrayViewPrototype::finishCreation): |
| * runtime/Lookup.cpp: |
| (JSC::reifyStaticAccessor): |
| (JSC::setUpStaticFunctionSlot): |
| * runtime/Lookup.h: |
| (JSC::getStaticPropertySlotFromTable): |
| (JSC::reifyStaticProperty): |
| * runtime/MapPrototype.cpp: |
| (JSC::MapPrototype::finishCreation): |
| * runtime/SetPrototype.cpp: |
| (JSC::SetPrototype::finishCreation): |
| * tools/JSDollarVM.cpp: |
| (JSC::functionCreateBuiltin): |
| |
| 2018-03-30 Robin Morisset <rmorisset@apple.com> |
| |
| Out-of-bounds accesses due to a missing check for MAX_STORAGE_VECTOR_LENGTH in unshiftCountForAnyIndexingType |
| https://bugs.webkit.org/show_bug.cgi?id=183657 |
| <rdar://problem/38464399> |
| |
| Reviewed by Keith Miller. |
| |
| There was just a missing check in unshiftCountForIndexingType. |
| I've also replaced 'return false' by 'return true' in the case of an 'out-of-memory' exception, because 'return false' means 'please continue to the slow path', |
| and the slow path has an assert that there is no unhandled exception (line 360 of ArrayPrototype.cpp). |
| Finally, I made the assert in ensureLength a release assert as it would have caught this bug and prevented it from being a security risk. |
| |
| * runtime/ArrayPrototype.cpp: |
| (JSC::unshift): |
| * runtime/JSArray.cpp: |
| (JSC::JSArray::unshiftCountWithAnyIndexingType): |
| * runtime/JSObject.h: |
| (JSC::JSObject::ensureLength): |
| |
| 2018-03-29 Mark Lam <mark.lam@apple.com> |
| |
| Add some pointer profiling support to B3 and Air. |
| https://bugs.webkit.org/show_bug.cgi?id=184165 |
| <rdar://problem/39022125> |
| |
| Reviewed by JF Bastien. |
| |
| * b3/B3LowerMacros.cpp: |
| * b3/B3LowerMacrosAfterOptimizations.cpp: |
| * b3/B3MathExtras.cpp: |
| * b3/B3ReduceStrength.cpp: |
| * b3/air/AirCCallSpecial.cpp: |
| (JSC::B3::Air::CCallSpecial::generate): |
| * b3/air/AirCCallSpecial.h: |
| * b3/testb3.cpp: |
| (JSC::B3::testCallSimple): |
| (JSC::B3::testCallRare): |
| (JSC::B3::testCallRareLive): |
| (JSC::B3::testCallSimplePure): |
| (JSC::B3::testCallFunctionWithHellaArguments): |
| (JSC::B3::testCallFunctionWithHellaArguments2): |
| (JSC::B3::testCallFunctionWithHellaArguments3): |
| (JSC::B3::testCallSimpleDouble): |
| (JSC::B3::testCallSimpleFloat): |
| (JSC::B3::testCallFunctionWithHellaDoubleArguments): |
| (JSC::B3::testCallFunctionWithHellaFloatArguments): |
| (JSC::B3::testLinearScanWithCalleeOnStack): |
| (JSC::B3::testInterpreter): |
| (JSC::B3::testLICMPure): |
| (JSC::B3::testLICMPureSideExits): |
| (JSC::B3::testLICMPureWritesPinned): |
| (JSC::B3::testLICMPureWrites): |
| (JSC::B3::testLICMReadsLocalState): |
| (JSC::B3::testLICMReadsPinned): |
| (JSC::B3::testLICMReads): |
| (JSC::B3::testLICMPureNotBackwardsDominant): |
| (JSC::B3::testLICMPureFoiledByChild): |
| (JSC::B3::testLICMPureNotBackwardsDominantFoiledByChild): |
| (JSC::B3::testLICMExitsSideways): |
| (JSC::B3::testLICMWritesLocalState): |
| (JSC::B3::testLICMWrites): |
| (JSC::B3::testLICMFence): |
| (JSC::B3::testLICMWritesPinned): |
| (JSC::B3::testLICMControlDependent): |
| (JSC::B3::testLICMControlDependentNotBackwardsDominant): |
| (JSC::B3::testLICMControlDependentSideExits): |
| (JSC::B3::testLICMReadsPinnedWritesPinned): |
| (JSC::B3::testLICMReadsWritesDifferentHeaps): |
| (JSC::B3::testLICMReadsWritesOverlappingHeaps): |
| (JSC::B3::testLICMDefaultCall): |
| (JSC::B3::testShuffleDoesntTrashCalleeSaves): |
| * ftl/FTLLowerDFGToB3.cpp: |
| (JSC::FTL::DFG::LowerDFGToB3::compileCallOrConstructVarargsSpread): |
| (JSC::FTL::DFG::LowerDFGToB3::compileCallOrConstructVarargs): |
| (JSC::FTL::DFG::LowerDFGToB3::compileCallEval): |
| * jit/GPRInfo.h: |
| * runtime/PtrTag.h: |
| * wasm/WasmBinding.cpp: |
| (JSC::Wasm::wasmToWasm): |
| |
| 2018-03-29 JF Bastien <jfbastien@apple.com> |
| |
| Use Forward.h instead of forward-declaring WTF::String |
| https://bugs.webkit.org/show_bug.cgi?id=184172 |
| <rdar://problem/39026146> |
| |
| Reviewed by Yusuke Suzuki. |
| |
| As part of #184164 I'm changing WTF::String, and the forward |
| declarations are just wrong because I'm making it templated. We |
| should use Forward.h anyways, so do that instead. |
| |
| * runtime/DateConversion.h: |
| |
| 2018-03-29 Mark Lam <mark.lam@apple.com> |
| |
| Use MacroAssemblerCodePtr in Wasm code for code pointers instead of void*. |
| https://bugs.webkit.org/show_bug.cgi?id=184163 |
| <rdar://problem/39020397> |
| |
| Reviewed by JF Bastien. |
| |
| With the use of MacroAssemblerCodePtr, we now get poisoning for Wasm code pointers. |
| |
| Also renamed some structs, methods, and variable names to be more accurate. |
| Previously, there is some confusion between a code pointer and the address of a |
| code pointer (sometimes referred to in the code as a "LoadLocation"). We now name |
| the LoadLocation variables appropriately to distinguish them from code pointers. |
| |
| * wasm/WasmB3IRGenerator.cpp: |
| (JSC::Wasm::B3IRGenerator::addCall): |
| (JSC::Wasm::B3IRGenerator::addCallIndirect): |
| * wasm/WasmBinding.cpp: |
| (JSC::Wasm::wasmToWasm): |
| * wasm/WasmCodeBlock.cpp: |
| (JSC::Wasm::CodeBlock::CodeBlock): |
| * wasm/WasmCodeBlock.h: |
| (JSC::Wasm::CodeBlock::entrypointLoadLocationFromFunctionIndexSpace): |
| (JSC::Wasm::CodeBlock::wasmEntrypointLoadLocationFromFunctionIndexSpace): Deleted. |
| * wasm/WasmFormat.h: |
| (JSC::Wasm::WasmToWasmImportableFunction::WasmToWasmImportableFunction): |
| (JSC::Wasm::WasmToWasmImportableFunction::offsetOfEntrypointLoadLocation): |
| (JSC::Wasm::CallableFunction::CallableFunction): Deleted. |
| (JSC::Wasm::CallableFunction::offsetOfWasmEntrypointLoadLocation): Deleted. |
| * wasm/WasmInstance.h: |
| (JSC::Wasm::Instance::offsetOfWasmEntrypointLoadLocation): |
| (JSC::Wasm::Instance::offsetOfWasmToEmbedderStub): |
| (JSC::Wasm::Instance::offsetOfWasmEntrypoint): Deleted. |
| (JSC::Wasm::Instance::offsetOfWasmToEmbedderStubExecutableAddress): Deleted. |
| * wasm/WasmOMGPlan.cpp: |
| (JSC::Wasm::OMGPlan::work): |
| * wasm/WasmTable.cpp: |
| (JSC::Wasm::Table::Table): |
| (JSC::Wasm::Table::grow): |
| (JSC::Wasm::Table::clearFunction): |
| (JSC::Wasm::Table::setFunction): |
| * wasm/WasmTable.h: |
| (JSC::Wasm::Table::offsetOfFunctions): |
| * wasm/js/JSWebAssemblyCodeBlock.h: |
| * wasm/js/JSWebAssemblyInstance.cpp: |
| (JSC::JSWebAssemblyInstance::finalizeCreation): |
| (JSC::JSWebAssemblyInstance::create): |
| * wasm/js/JSWebAssemblyTable.cpp: |
| (JSC::JSWebAssemblyTable::setFunction): |
| * wasm/js/WebAssemblyFunction.cpp: |
| (JSC::WebAssemblyFunction::create): |
| (JSC::WebAssemblyFunction::WebAssemblyFunction): |
| * wasm/js/WebAssemblyFunction.h: |
| * wasm/js/WebAssemblyModuleRecord.cpp: |
| (JSC::WebAssemblyModuleRecord::link): |
| (JSC::WebAssemblyModuleRecord::evaluate): |
| * wasm/js/WebAssemblyWrapperFunction.cpp: |
| (JSC::WebAssemblyWrapperFunction::WebAssemblyWrapperFunction): |
| (JSC::WebAssemblyWrapperFunction::create): |
| * wasm/js/WebAssemblyWrapperFunction.h: |
| |
| 2018-03-29 Yusuke Suzuki <utatane.tea@gmail.com> |
| |
| Remove WTF_EXPORTDATA and JS_EXPORTDATA |
| https://bugs.webkit.org/show_bug.cgi?id=184170 |
| |
| Reviewed by JF Bastien. |
| |
| Replace WTF_EXPORTDATA and JS_EXPORTDATA with |
| WTF_EXPORT_PRIVATE and JS_EXPORT_PRIVATE respectively. |
| |
| * heap/WriteBarrierSupport.h: |
| * jit/ExecutableAllocator.cpp: |
| * jit/ExecutableAllocator.h: |
| * runtime/JSCPoison.h: |
| * runtime/JSCell.h: |
| * runtime/JSExportMacros.h: |
| * runtime/JSGlobalObject.h: |
| * runtime/JSObject.h: |
| * runtime/Options.h: |
| * runtime/PropertyDescriptor.h: |
| * runtime/PropertyMapHashTable.h: |
| * runtime/SamplingCounter.h: |
| |
| 2018-03-29 Ross Kirsling <ross.kirsling@sony.com> |
| |
| MSVC __forceinline slows down JSC release build fivefold after r229391 |
| https://bugs.webkit.org/show_bug.cgi?id=184062 |
| |
| Reviewed by Alex Christensen. |
| |
| * jit/CCallHelpers.h: |
| (JSC::CCallHelpers::marshallArgumentRegister): |
| Exempt MSVC from a single forced inline used within recursive templates. |
| |
| 2018-03-29 Keith Miller <keith_miller@apple.com> |
| |
| ArrayMode should not try to get the DFG to think it can convert TypedArrays |
| https://bugs.webkit.org/show_bug.cgi?id=184137 |
| |
| Reviewed by Saam Barati. |
| |
| * dfg/DFGArrayMode.cpp: |
| (JSC::DFG::ArrayMode::fromObserved): |
| |
| 2018-03-29 Commit Queue <commit-queue@webkit.org> |
| |
| Unreviewed, rolling out r230062. |
| https://bugs.webkit.org/show_bug.cgi?id=184128 |
| |
| Broke mac port. web content process crashes while loading any |
| web page (Requested by rniwa on #webkit). |
| |
| Reverted changeset: |
| |
| "MSVC __forceinline slows down JSC release build fivefold |
| after r229391" |
| https://bugs.webkit.org/show_bug.cgi?id=184062 |
| https://trac.webkit.org/changeset/230062 |
| |
| 2018-03-28 Ross Kirsling <ross.kirsling@sony.com> |
| |
| MSVC __forceinline slows down JSC release build fivefold after r229391 |
| https://bugs.webkit.org/show_bug.cgi?id=184062 |
| |
| Reviewed by Alex Christensen. |
| |
| * jit/CCallHelpers.h: |
| (JSC::CCallHelpers::marshallArgumentRegister): |
| Exempt MSVC from a single forced inline used within recursive templates. |
| |
| 2018-03-28 Mark Lam <mark.lam@apple.com> |
| |
| Enhance ARM64 probe to support pointer profiling. |
| https://bugs.webkit.org/show_bug.cgi?id=184069 |
| <rdar://problem/38939879> |
| |
| Reviewed by JF Bastien. |
| |
| * assembler/MacroAssemblerARM64.cpp: |
| (JSC::MacroAssembler::probe): |
| * assembler/MacroAssemblerX86Common.h: |
| (JSC::MacroAssemblerX86Common::popPair): |
| (JSC::MacroAssemblerX86Common::pushPair): |
| * assembler/testmasm.cpp: |
| (JSC::testProbeReadsArgumentRegisters): |
| (JSC::testProbeWritesArgumentRegisters): |
| * runtime/PtrTag.h: |
| (JSC::tagForPtr): |
| |
| 2018-03-28 Robin Morisset <rmorisset@apple.com> |
| |
| appendQuotedJSONString stops on arithmetic overflow instead of propagating it upwards |
| https://bugs.webkit.org/show_bug.cgi?id=183894 |
| |
| Reviewed by Saam Barati. |
| |
| Use the return value of appendQuotedJSONString to fail more gracefully when given a string that is too large to handle. |
| |
| * runtime/JSONObject.cpp: |
| (JSC::Stringifier::appendStringifiedValue): |
| |
| 2018-03-28 Carlos Garcia Campos <cgarcia@igalia.com> |
| |
| [JSC] Move WeakValueRef class to its own file and use it from Objc and GLib |
| https://bugs.webkit.org/show_bug.cgi?id=184073 |
| |
| Reviewed by Yusuke Suzuki. |
| |
| We currently have duplicated code in Obj and GLib implementations. |
| |
| * API/JSManagedValue.mm: |
| (managedValueHandleOwner): |
| (-[JSManagedValue initWithValue:]): |
| * API/JSWeakValue.cpp: Added. |
| (JSC::JSWeakValue::~JSWeakValue): |
| (JSC::JSWeakValue::clear): |
| (JSC::JSWeakValue::isClear const): |
| (JSC::JSWeakValue::setPrimitive): |
| (JSC::JSWeakValue::setObject): |
| (JSC::JSWeakValue::setString): |
| * API/JSWeakValue.h: Added. |
| (JSC::JSWeakValue::isSet const): |
| (JSC::JSWeakValue::isPrimitive const): |
| (JSC::JSWeakValue::isObject const): |
| (JSC::JSWeakValue::isString const): |
| (JSC::JSWeakValue::object const): |
| (JSC::JSWeakValue::primitive const): |
| (JSC::JSWeakValue::string const): |
| * API/glib/JSCWeakValue.cpp: |
| * JavaScriptCore.xcodeproj/project.pbxproj: |
| * Sources.txt: |
| |
| 2018-03-27 Carlos Garcia Campos <cgarcia@igalia.com> |
| |
| [GLIB] Add JSCWeakValue to JavaScriptCore GLib API |
| https://bugs.webkit.org/show_bug.cgi?id=184041 |
| |
| Reviewed by Michael Catanzaro. |
| |
| This allows to keep a reference to a JavaSCript value without protecting it, and without having a strong |
| reference of the context. When the value is cleared the JSCWeakValue::cleared signal is emitted and |
| jsc_weak_value_get_value() will always return nullptr. |
| |
| * API/glib/JSCWeakValue.cpp: Added. |
| (WeakValueRef::~WeakValueRef): |
| (WeakValueRef::clear): |
| (WeakValueRef::isClear const): |
| (WeakValueRef::isSet const): |
| (WeakValueRef::isPrimitive const): |
| (WeakValueRef::isObject const): |
| (WeakValueRef::isString const): |
| (WeakValueRef::setPrimitive): |
| (WeakValueRef::setObject): |
| (WeakValueRef::setString): |
| (WeakValueRef::object const): |
| (WeakValueRef::primitive const): |
| (WeakValueRef::string const): |
| (weakValueHandleOwner): |
| (jscWeakValueInitialize): |
| (jscWeakValueSetProperty): |
| (jscWeakValueDispose): |
| (jsc_weak_value_class_init): |
| (jsc_weak_value_new): |
| (jsc_weak_value_get_value): |
| * API/glib/JSCWeakValue.h: Added. |
| * API/glib/docs/jsc-glib-4.0-sections.txt: |
| * API/glib/docs/jsc-glib-docs.sgml: |
| * API/glib/jsc.h: |
| * GLib.cmake: |
| |
| 2018-03-27 Yusuke Suzuki <utatane.tea@gmail.com> |
| |
| [DFG] Remove unnecessary USE(JSVALUE32_64) / USE(JSVALUE64) |
| https://bugs.webkit.org/show_bug.cgi?id=181292 |
| |
| Reviewed by Saam Barati. |
| |
| By using JSValueRegs abstraction, we can simplify DFGSpeculativeJIT.cpp code. |
| |
| * dfg/DFGSpeculativeJIT.cpp: |
| (JSC::DFG::SpeculativeJIT::compileGetByValOnDirectArguments): |
| (JSC::DFG::SpeculativeJIT::compileGetByValOnScopedArguments): |
| (JSC::DFG::SpeculativeJIT::compileCreateRest): |
| (JSC::DFG::SpeculativeJIT::compileArraySlice): |
| (JSC::DFG::SpeculativeJIT::emitSwitchImm): |
| (JSC::DFG::SpeculativeJIT::compilePutDynamicVar): |
| (JSC::DFG::SpeculativeJIT::compilePutAccessorByVal): |
| |
| 2018-03-27 Yusuke Suzuki <utatane.tea@gmail.com> |
| |
| Add Load16Z for B3 and use it in WebAssembly |
| https://bugs.webkit.org/show_bug.cgi?id=165884 |
| |
| Reviewed by JF Bastien. |
| |
| We already support Load16Z in B3. Use it for i32.load16_u / i64.load16_u in WebAssembly. |
| spec-tests/memory.wast.js already covered this change. |
| |
| * wasm/WasmB3IRGenerator.cpp: |
| (JSC::Wasm::B3IRGenerator::emitLoadOp): |
| |
| 2018-03-24 Yusuke Suzuki <utatane.tea@gmail.com> |
| |
| [JSC] Remove repeated iteration of ElementNode |
| https://bugs.webkit.org/show_bug.cgi?id=183987 |
| |
| Reviewed by Keith Miller. |
| |
| BytecodeGenerator repeatedly iterates ElementNode to emit the efficient code. |
| While it is OK for small arrays, this repeated iteration takes much time |
| if the array is very large. For example, Kraken's initialization code includes |
| very large array with numeric literals. This makes bytecode compiling so long. |
| |
| This patch carefully removes unnecessary iteration when emitting arrays. |
| This reduces one of Kraken/imaging-darkroom's bytecode compiling from 13.169856 ms |
| to 9.988050 ms. |
| |
| * bytecompiler/BytecodeGenerator.cpp: |
| (JSC::BytecodeGenerator::emitNewArrayBuffer): |
| (JSC::BytecodeGenerator::emitNewArray): |
| * bytecompiler/BytecodeGenerator.h: |
| * bytecompiler/NodesCodegen.cpp: |
| (JSC::ArrayNode::emitBytecode): |
| (JSC::ArrayPatternNode::bindValue const): |
| (JSC::ArrayPatternNode::emitDirectBinding): |
| |
| 2018-03-26 Ross Kirsling <ross.kirsling@sony.com> |
| |
| JIT callOperation() needs to support operations that return SlowPathReturnType differently on Windows. |
| https://bugs.webkit.org/show_bug.cgi?id=183655 |
| |
| Reviewed by Keith Miller. |
| |
| * jit/CCallHelpers.h: |
| (JSC::CCallHelpers::ArgCollection::argCount): |
| (JSC::CCallHelpers::marshallArgumentRegister): |
| (JSC::CCallHelpers::setupArgumentsImpl): |
| On Win64, ensure that argCount always includes GPRs and FPRs and that counting starts from 1 for SlowPathReturnType. |
| |
| * jit/JIT.h: |
| (JSC::JIT::callOperation): |
| (JSC::JIT::is64BitType): |
| (JSC::JIT::is64BitType<void>): |
| On Win64, ensure special call is used for SlowPathReturnType. |
| |
| * jit/JITOperations.h: |
| Update changed type. |
| |
| 2018-03-26 Yusuke Suzuki <utatane.tea@gmail.com> |
| |
| We should have SSE4 detection in the X86 MacroAssembler. |
| https://bugs.webkit.org/show_bug.cgi?id=165363 |
| |
| Reviewed by JF Bastien. |
| |
| This patch adds popcnt support to WASM in x86_64 environment. |
| To use it, we refactor our CPUID feature detection in MacroAssemblerX86Common. |
| Our spec-tests already cover popcnt. |
| |
| * assembler/MacroAssemblerARM64.h: |
| (JSC::MacroAssemblerARM64::supportsCountPopulation): |
| * assembler/MacroAssemblerX86Common.cpp: |
| (JSC::MacroAssemblerX86Common::getCPUID): |
| (JSC::MacroAssemblerX86Common::getCPUIDEx): |
| (JSC::MacroAssemblerX86Common::collectCPUFeatures): |
| * assembler/MacroAssemblerX86Common.h: |
| (JSC::MacroAssemblerX86Common::countPopulation32): |
| (JSC::MacroAssemblerX86Common::supportsFloatingPointRounding): |
| (JSC::MacroAssemblerX86Common::supportsCountPopulation): |
| (JSC::MacroAssemblerX86Common::supportsAVX): |
| (JSC::MacroAssemblerX86Common::supportsLZCNT): |
| (JSC::MacroAssemblerX86Common::supportsBMI1): |
| (JSC::MacroAssemblerX86Common::isSSE2Present): |
| (JSC::MacroAssemblerX86Common::updateEax1EcxFlags): Deleted. |
| * assembler/MacroAssemblerX86_64.h: |
| (JSC::MacroAssemblerX86_64::countPopulation64): |
| * assembler/X86Assembler.h: |
| (JSC::X86Assembler::popcnt_rr): |
| (JSC::X86Assembler::popcnt_mr): |
| (JSC::X86Assembler::popcntq_rr): |
| (JSC::X86Assembler::popcntq_mr): |
| * wasm/WasmB3IRGenerator.cpp: |
| (JSC::Wasm::B3IRGenerator::addOp<OpType::I32Popcnt>): |
| (JSC::Wasm::B3IRGenerator::addOp<OpType::I64Popcnt>): |
| |
| 2018-03-26 Filip Pizlo <fpizlo@apple.com> |
| |
| DFG should know that CreateThis can be effectful |
| https://bugs.webkit.org/show_bug.cgi?id=184013 |
| |
| Reviewed by Saam Barati. |
| |
| As shown in the tests added in JSTests, CreateThis can be effectful if the constructor this |
| is a proxy. |
| |
| * dfg/DFGAbstractInterpreterInlines.h: |
| (JSC::DFG::AbstractInterpreter<AbstractStateType>::executeEffects): |
| * dfg/DFGClobberize.h: |
| (JSC::DFG::clobberize): |
| |
| 2018-03-25 Saam Barati <sbarati@apple.com> |
| |
| Fix typo in JSC option name |
| https://bugs.webkit.org/show_bug.cgi?id=184001 |
| |
| Reviewed by Mark Lam. |
| |
| enableJITDebugAssetions => enableJITDebugAssertions. |
| |
| * assembler/MacroAssembler.cpp: |
| (JSC::MacroAssembler::jitAssert): |
| * runtime/Options.h: |
| |
| 2018-03-25 Saam Barati <sbarati@apple.com> |
| |
| r228149 accidentally removed code that resets m_emptyCursor at the end of a GC |
| https://bugs.webkit.org/show_bug.cgi?id=183995 |
| |
| Reviewed by Filip Pizlo. |
| |
| The removal of this line of code was unintended and happened during some |
| refactoring Fil was doing. The consequence of removing this line of code |
| is that the m_emptyCursor became a monotonically increasing integer, leading |
| the cursor to usually being out of bounds of the block range (depending on |
| what the program is doing). This made the functionality of finding an empty |
| block to steal almost always fail. |
| |
| * heap/BlockDirectory.cpp: |
| (JSC::BlockDirectory::prepareForAllocation): |
| |
| 2018-03-22 Yusuke Suzuki <utatane.tea@gmail.com> |
| |
| [DFG] Introduces fused compare and jump |
| https://bugs.webkit.org/show_bug.cgi?id=177100 |
| |
| Reviewed by Mark Lam. |
| |
| This patch introduces op_jeq, op_jneq, op_jstricteq, and op_jnstricteq. |
| It offers 3 benefit. |
| |
| 1. They are introduced due to the similar purpose to op_jless etc. It aligns |
| op_eq families to op_jless families. |
| |
| 2. It reduces the size of bytecode to represent the typical code sequence. |
| |
| 3. It offers the way to fuse check and jump in DFG code generation. Since |
| we have MovHint between Branch and CompareEq/CompareStrictEq previously, |
| we cannot do this optimization. It reduces the machine code size in DFG too. |
| |
| It slightly improves Octane/boyer. |
| |
| boyer 6.18038+-0.05002 ^ 6.06990+-0.04176 ^ definitely 1.0182x faster |
| |
| * bytecode/BytecodeDumper.cpp: |
| (JSC::BytecodeDumper<Block>::dumpBytecode): |
| * bytecode/BytecodeList.json: |
| * bytecode/BytecodeUseDef.h: |
| (JSC::computeUsesForBytecodeOffset): |
| (JSC::computeDefsForBytecodeOffset): |
| * bytecode/Opcode.h: |
| (JSC::isBranch): |
| * bytecode/PreciseJumpTargetsInlines.h: |
| (JSC::extractStoredJumpTargetsForBytecodeOffset): |
| * bytecompiler/BytecodeGenerator.cpp: |
| (JSC::BytecodeGenerator::emitJumpIfTrue): |
| (JSC::BytecodeGenerator::emitJumpIfFalse): |
| * dfg/DFGByteCodeParser.cpp: |
| (JSC::DFG::ByteCodeParser::parseBlock): |
| * dfg/DFGCapabilities.cpp: |
| (JSC::DFG::capabilityLevel): |
| * dfg/DFGOperations.cpp: |
| * dfg/DFGOperations.h: |
| * dfg/DFGSpeculativeJIT.cpp: |
| (JSC::DFG::SpeculativeJIT::compileStrictEq): |
| * jit/JIT.cpp: |
| (JSC::JIT::privateCompileMainPass): |
| (JSC::JIT::privateCompileSlowCases): |
| * jit/JIT.h: |
| * jit/JITOpcodes.cpp: |
| (JSC::JIT::emit_op_jeq): |
| (JSC::JIT::emit_op_neq): |
| (JSC::JIT::emit_op_jneq): |
| (JSC::JIT::compileOpStrictEq): |
| (JSC::JIT::emit_op_stricteq): |
| (JSC::JIT::emit_op_nstricteq): |
| (JSC::JIT::compileOpStrictEqJump): |
| (JSC::JIT::emit_op_jstricteq): |
| (JSC::JIT::emit_op_jnstricteq): |
| (JSC::JIT::emitSlow_op_jstricteq): |
| (JSC::JIT::emitSlow_op_jnstricteq): |
| (JSC::JIT::emitSlow_op_jeq): |
| (JSC::JIT::emitSlow_op_jneq): |
| * jit/JITOpcodes32_64.cpp: |
| (JSC::JIT::emitSlow_op_eq): |
| (JSC::JIT::emit_op_jeq): |
| (JSC::JIT::compileOpEqJumpSlow): |
| (JSC::JIT::emitSlow_op_jeq): |
| (JSC::JIT::emit_op_jneq): |
| (JSC::JIT::emitSlow_op_jneq): |
| (JSC::JIT::compileOpStrictEq): |
| (JSC::JIT::emit_op_stricteq): |
| (JSC::JIT::emit_op_nstricteq): |
| (JSC::JIT::compileOpStrictEqJump): |
| (JSC::JIT::emit_op_jstricteq): |
| (JSC::JIT::emit_op_jnstricteq): |
| (JSC::JIT::emitSlow_op_jstricteq): |
| (JSC::JIT::emitSlow_op_jnstricteq): |
| * jit/JITOperations.cpp: |
| * jit/JITOperations.h: |
| * llint/LLIntSlowPaths.cpp: |
| (JSC::LLInt::LLINT_SLOW_PATH_DECL): |
| * llint/LLIntSlowPaths.h: |
| * llint/LowLevelInterpreter.asm: |
| * llint/LowLevelInterpreter32_64.asm: |
| * llint/LowLevelInterpreter64.asm: |
| |
| 2018-03-24 Yusuke Suzuki <utatane.tea@gmail.com> |
| |
| [JSC] Improve constants and add comments for CodeBlockHash |
| https://bugs.webkit.org/show_bug.cgi?id=183982 |
| |
| Rubber-stamped by Mark Lam. |
| |
| * bytecode/CodeBlockHash.cpp: |
| (JSC::CodeBlockHash::CodeBlockHash): |
| * bytecode/ParseHash.cpp: |
| (JSC::ParseHash::ParseHash): |
| |
| 2018-03-24 Yusuke Suzuki <utatane.tea@gmail.com> |
| |
| [JSC] Add options to report parsing and bytecode compiling times |
| https://bugs.webkit.org/show_bug.cgi?id=183982 |
| |
| Reviewed by Mark Lam. |
| |
| This patch adds reportParseTimes and reportBytecodeCompileTimes options. |
| When they are enabled, JSC reports times consumed for parsing and bytecode |
| compiling. |
| |
| * JavaScriptCore.xcodeproj/project.pbxproj: |
| * Sources.txt: |
| * bytecode/ParseHash.cpp: Added. |
| (JSC::ParseHash::ParseHash): |
| * bytecode/ParseHash.h: Added. |
| (JSC::ParseHash::hashForCall const): |
| (JSC::ParseHash::hashForConstruct const): |
| * bytecode/UnlinkedFunctionExecutable.cpp: |
| (JSC::generateUnlinkedFunctionCodeBlock): |
| * bytecompiler/BytecodeGenerator.h: |
| (JSC::BytecodeGenerator::generate): |
| * parser/Parser.h: |
| (JSC::parse): |
| * runtime/CodeCache.h: |
| (JSC::generateUnlinkedCodeBlock): |
| * runtime/Options.h: |
| |
| 2018-03-24 Yusuke Suzuki <utatane.tea@gmail.com> |
| |
| [JIT] Drop ENABLE_JIT_VERBOSE flag |
| https://bugs.webkit.org/show_bug.cgi?id=183983 |
| |
| Reviewed by Mark Lam. |
| |
| Just use JITInternal::verbose value. |
| |
| * jit/JIT.cpp: |
| (JSC::JIT::privateCompileMainPass): |
| (JSC::JIT::privateCompileSlowCases): |
| (JSC::JIT::link): |
| |
| 2018-03-23 Tim Horton <timothy_horton@apple.com> |
| |
| Fix the build with no pasteboard |
| https://bugs.webkit.org/show_bug.cgi?id=183973 |
| |
| Reviewed by Dan Bernstein. |
| |
| * Configurations/FeatureDefines.xcconfig: |
| |
| 2018-03-23 Mark Lam <mark.lam@apple.com> |
| |
| LLInt TypeArray pointer poisoning should not pick its poison dynamically. |
| https://bugs.webkit.org/show_bug.cgi?id=183942 |
| <rdar://problem/38798018> |
| |
| Reviewed by JF Bastien. |
| |
| 1. Move the LLInt TypedArray unpoisoning to just before the array access after |
| all the branches. |
| 2. Renamed FirstArrayType to FirstTypedArrayType to match the symbol in C++ code. |
| 3. Remove a useless instruction in the implementation of emitX86Lea for a global |
| label. |
| |
| * llint/LowLevelInterpreter.asm: |
| * llint/LowLevelInterpreter64.asm: |
| * offlineasm/x86.rb: |
| |
| 2018-03-23 Mark Lam <mark.lam@apple.com> |
| |
| Add more support for pointer profiling. |
| https://bugs.webkit.org/show_bug.cgi?id=183943 |
| <rdar://problem/38799068> |
| |
| Reviewed by JF Bastien. |
| |
| * assembler/ARM64Assembler.h: |
| (JSC::ARM64Assembler::linkJumpOrCall): |
| * assembler/AbstractMacroAssembler.h: |
| (JSC::AbstractMacroAssembler::repatchNearCall): |
| (JSC::AbstractMacroAssembler::tagReturnAddress): |
| (JSC::AbstractMacroAssembler::untagReturnAddress): |
| |
| 2018-03-23 Yusuke Suzuki <utatane.tea@gmail.com> |
| |
| [WTF] Add standard containers with FastAllocator specialization |
| https://bugs.webkit.org/show_bug.cgi?id=183789 |
| |
| Reviewed by Darin Adler. |
| |
| * b3/air/testair.cpp: |
| * b3/testb3.cpp: |
| (JSC::B3::testDoubleLiteralComparison): |
| (JSC::B3::testFloatEqualOrUnorderedFoldingNaN): |
| * dfg/DFGGraph.h: |
| * dfg/DFGIntegerCheckCombiningPhase.cpp: |
| * dfg/DFGObjectAllocationSinkingPhase.cpp: |
| * ftl/FTLLowerDFGToB3.cpp: |
| (JSC::FTL::DFG::LowerDFGToB3::switchStringSlow): |
| * runtime/FunctionHasExecutedCache.h: |
| * runtime/TypeLocationCache.h: |
| |
| 2018-03-23 Yusuke Suzuki <utatane.tea@gmail.com> |
| |
| [FTL] Fix ArrayPush(ArrayStorage)'s abstract heap |
| https://bugs.webkit.org/show_bug.cgi?id=182960 |
| |
| Reviewed by Saam Barati. |
| |
| This patch fixes ArrayPush(ArrayStorage)'s abstract heap. |
| It should always touch ArrayStorage_vector. To unify |
| vector setting code for the real ArrayStorage_vector and |
| ScratchBuffer, we use ArrayStorage_vector.atAnyIndex() to |
| annotate this. |
| |
| * ftl/FTLLowerDFGToB3.cpp: |
| (JSC::FTL::DFG::LowerDFGToB3::compileArrayPush): |
| |
| 2018-03-23 Zan Dobersek <zdobersek@igalia.com> |
| |
| Unreviewed build fix for GCC 4.9 builds. |
| |
| * assembler/MacroAssemblerCodeRef.h: std::is_trivially_copyable<> isn't |
| supported in 4.9 libstdc++, so wrap the static assert using it in a |
| COMPILER_SUPPORTS() macro, and use __is_trivially_copyable() builtin, |
| as is done in bitwise_cast() in StdLibExtras.h. |
| |
| 2018-03-22 Tim Horton <timothy_horton@apple.com> |
| |
| Adopt WK_ALTERNATE_FRAMEWORKS_DIR in WebCore |
| https://bugs.webkit.org/show_bug.cgi?id=183930 |
| <rdar://problem/38782249> |
| |
| Reviewed by Dan Bernstein. |
| |
| * JavaScriptCore.xcodeproj/project.pbxproj: |
| |
| 2018-03-22 Mark Lam <mark.lam@apple.com> |
| |
| Add placeholder call and jump MacroAssembler emitters that take PtrTag in a register. |
| https://bugs.webkit.org/show_bug.cgi?id=183914 |
| <rdar://problem/38763536> |
| |
| Reviewed by Saam Barati and JF Bastien. |
| |
| This is in preparation for supporting pointer profiling work. |
| |
| * assembler/MacroAssemblerARM.h: |
| (JSC::MacroAssemblerARM::jump): |
| (JSC::MacroAssemblerARM::call): |
| * assembler/MacroAssemblerARM64.h: |
| (JSC::MacroAssemblerARM64::call): |
| (JSC::MacroAssemblerARM64::jump): |
| * assembler/MacroAssemblerARMv7.h: |
| (JSC::MacroAssemblerARMv7::jump): |
| (JSC::MacroAssemblerARMv7::call): |
| * assembler/MacroAssemblerMIPS.h: |
| (JSC::MacroAssemblerMIPS::jump): |
| (JSC::MacroAssemblerMIPS::call): |
| * assembler/MacroAssemblerX86.h: |
| (JSC::MacroAssemblerX86::call): |
| (JSC::MacroAssemblerX86::jump): |
| * assembler/MacroAssemblerX86Common.h: |
| (JSC::MacroAssemblerX86Common::jump): |
| (JSC::MacroAssemblerX86Common::call): |
| * assembler/MacroAssemblerX86_64.h: |
| (JSC::MacroAssemblerX86_64::call): |
| (JSC::MacroAssemblerX86_64::jump): |
| |
| 2018-03-22 Tim Horton <timothy_horton@apple.com> |
| |
| Improve readability of WebCore's OTHER_LDFLAGS |
| https://bugs.webkit.org/show_bug.cgi?id=183909 |
| <rdar://problem/38760992> |
| |
| Reviewed by Dan Bernstein. |
| |
| * Configurations/Base.xcconfig: |
| * Configurations/FeatureDefines.xcconfig: |
| |
| 2018-03-22 Dominik Infuehr <dinfuehr@igalia.com> |
| |
| [ARM] Thumb: Do not decorate bottom bit twice |
| https://bugs.webkit.org/show_bug.cgi?id=183906 |
| |
| Reviewed by Mark Lam. |
| |
| Use MacroAssemblerCodePtr::createFromExecutableAddress instead of |
| MacroAssemblerCodePtr(void*) to avoid decorating the pointer twice as |
| a thumb pointer. |
| |
| * jit/Repatch.cpp: |
| (JSC::linkPolymorphicCall): |
| |
| 2018-03-22 Yusuke Suzuki <utatane.tea@gmail.com> |
| |
| [JSC] Clear MustGenerate for ToString(Number) converted from NumberToStringWithRadix |
| https://bugs.webkit.org/show_bug.cgi?id=183559 |
| |
| Reviewed by Mark Lam. |
| |
| When converting NumberToStringWithRadix to ToString(Int52/Int32/Double), we forget |
| to clear NodeMustGenerate for this ToString. It should be since it does not have |
| any user-observable side effect. This patch clears NodeMustGenerate. |
| |
| * dfg/DFGConstantFoldingPhase.cpp: |
| (JSC::DFG::ConstantFoldingPhase::foldConstants): |
| |
| 2018-03-22 Yusuke Suzuki <utatane.tea@gmail.com> |
| |
| [JSC] List up all candidates in DFGCapabilities and FTLCapabilities |
| https://bugs.webkit.org/show_bug.cgi?id=183897 |
| |
| Reviewed by Mark Lam. |
| |
| We should not use `default:` clause here since it accidentally catches |
| the opcode and DFG nodes which should be optimized. For example, |
| op_super_sampler_begin and op_super_sampler_end are not listed while |
| they have DFG and FTL backend. |
| |
| This patch lists up all candiates in DFGCapabilities and FTLCapabilities. |
| And we also clean up unnecessary checks in FTLCapabilities. Since we |
| already handles all the possible array types for these nodes (which can |
| be checked in DFG's code), we do not need to check array types. |
| |
| We also fix FTLLowerDFGToB3' PutByVal code to use modeForPut. |
| |
| * dfg/DFGCapabilities.cpp: |
| (JSC::DFG::capabilityLevel): |
| * ftl/FTLCapabilities.cpp: |
| (JSC::FTL::canCompile): |
| * ftl/FTLLowerDFGToB3.cpp: |
| (JSC::FTL::DFG::LowerDFGToB3::compilePutByVal): |
| |
| 2018-03-22 Yusuke Suzuki <utatane.tea@gmail.com> |
| |
| [JSC] Drop op_put_by_index |
| https://bugs.webkit.org/show_bug.cgi?id=183899 |
| |
| Reviewed by Mark Lam. |
| |
| This patch drops op_put_by_index. |
| |
| 1. This functionality can be just covered by direct put_by_val. |
| 2. put_by_index is not well optimized. It is just calling a C |
| function. And it does not have DFG handling. |
| |
| * bytecode/BytecodeDumper.cpp: |
| (JSC::BytecodeDumper<Block>::dumpBytecode): |
| * bytecode/BytecodeList.json: |
| * bytecode/BytecodeUseDef.h: |
| (JSC::computeUsesForBytecodeOffset): |
| (JSC::computeDefsForBytecodeOffset): |
| * bytecompiler/BytecodeGenerator.cpp: |
| (JSC::BytecodeGenerator::emitPutByIndex): Deleted. |
| * bytecompiler/BytecodeGenerator.h: |
| * bytecompiler/NodesCodegen.cpp: |
| (JSC::ArrayNode::emitBytecode): |
| (JSC::ArrayPatternNode::emitDirectBinding): |
| * jit/JIT.cpp: |
| (JSC::JIT::privateCompileMainPass): |
| * jit/JIT.h: |
| * jit/JITPropertyAccess.cpp: |
| (JSC::JIT::emit_op_put_by_index): Deleted. |
| * jit/JITPropertyAccess32_64.cpp: |
| (JSC::JIT::emit_op_put_by_index): Deleted. |
| * llint/LLIntSlowPaths.cpp: |
| * llint/LLIntSlowPaths.h: |
| * llint/LowLevelInterpreter.asm: |
| |
| 2018-03-22 Michael Saboff <msaboff@apple.com> |
| |
| Race Condition in arrayProtoFuncReverse() causes wrong results or crash |
| https://bugs.webkit.org/show_bug.cgi?id=183901 |
| |
| Reviewed by Keith Miller. |
| |
| Added write barriers to ensure the reversed contents are properly marked. |
| |
| * runtime/ArrayPrototype.cpp: |
| (JSC::arrayProtoFuncReverse): |
| |
| 2018-03-21 Filip Pizlo <fpizlo@apple.com> |
| |
| ScopedArguments should do poisoning and index masking |
| https://bugs.webkit.org/show_bug.cgi?id=183863 |
| |
| Reviewed by Mark Lam. |
| |
| This outlines the ScopedArguments overflow storage and adds poisoning. |
| |
| * bytecode/AccessCase.cpp: |
| (JSC::AccessCase::generateWithGuard): |
| * dfg/DFGSpeculativeJIT.cpp: |
| (JSC::DFG::SpeculativeJIT::compileGetByValOnScopedArguments): |
| (JSC::DFG::SpeculativeJIT::compileGetArrayLength): |
| * ftl/FTLAbstractHeapRepository.h: |
| * ftl/FTLLowerDFGToB3.cpp: |
| (JSC::FTL::DFG::LowerDFGToB3::compileGetArrayLength): |
| (JSC::FTL::DFG::LowerDFGToB3::compileGetByVal): |
| * jit/JITPropertyAccess.cpp: |
| (JSC::JIT::emitScopedArgumentsGetByVal): |
| * runtime/JSCPoison.h: |
| * runtime/ScopedArguments.cpp: |
| (JSC::ScopedArguments::ScopedArguments): |
| (JSC::ScopedArguments::createUninitialized): |
| (JSC::ScopedArguments::visitChildren): |
| * runtime/ScopedArguments.h: |
| |
| 2018-03-21 Mark Lam <mark.lam@apple.com> |
| |
| Refactor the PtrTag list as a macro so that we can auto-generate code that enumerates each PtrTag. |
| https://bugs.webkit.org/show_bug.cgi?id=183861 |
| <rdar://problem/38716822> |
| |
| Reviewed by Filip Pizlo. |
| |
| Also added ptrTagName() to aid debugging. ptrTagName() is implemented using this |
| new PtrTag macro list. |
| |
| * CMakeLists.txt: |
| * JavaScriptCore.xcodeproj/project.pbxproj: |
| * Sources.txt: |
| * runtime/PtrTag.cpp: Added. |
| (JSC::ptrTagName): |
| * runtime/PtrTag.h: |
| |
| 2018-03-21 Mark Lam <mark.lam@apple.com> |
| |
| Use CodeBlock::instructions()[] and CodeBlock::bytecodeOffset() instead of doing own pointer math. |
| https://bugs.webkit.org/show_bug.cgi?id=183857 |
| <rdar://problem/38712184> |
| |
| Reviewed by JF Bastien. |
| |
| We should avoid doing pointer math with CodeBlock::instructions().begin(). |
| Instead, we should use the operator[] that comes with CodeBlock::instructions() |
| for computing an Instruction*, and use CodeBlock::bytecodeOffset() for computing |
| the bytecode offset of a given Instruction*. These methods will do assertions |
| which helps catch bugs sooner, plus they are more descriptive of the operation |
| we're trying to do. |
| |
| * bytecode/BytecodeKills.h: |
| (JSC::BytecodeKills::operandIsKilled const): |
| (JSC::BytecodeKills::forEachOperandKilledAt const): |
| * bytecode/CallLinkStatus.cpp: |
| (JSC::CallLinkStatus::computeFromLLInt): |
| * bytecode/CodeBlock.cpp: |
| (JSC::CodeBlock::dumpBytecode): |
| (JSC::CodeBlock::arithProfileForBytecodeOffset): |
| (JSC::CodeBlock::bytecodeOffsetFromCallSiteIndex): |
| * bytecode/GetByIdStatus.cpp: |
| (JSC::GetByIdStatus::computeFromLLInt): |
| * bytecode/PutByIdStatus.cpp: |
| (JSC::PutByIdStatus::computeFromLLInt): |
| * dfg/DFGByteCodeParser.cpp: |
| (JSC::DFG::ByteCodeParser::getPredictionWithoutOSRExit): |
| * dfg/DFGOSRExit.cpp: |
| (JSC::DFG::reifyInlinedCallFrames): |
| * dfg/DFGOSRExitCompilerCommon.cpp: |
| (JSC::DFG::reifyInlinedCallFrames): |
| * interpreter/CallFrame.cpp: |
| (JSC::CallFrame::callSiteBitsAsBytecodeOffset const): |
| (JSC::CallFrame::currentVPC const): |
| (JSC::CallFrame::setCurrentVPC): |
| * jit/JITCall.cpp: |
| (JSC::JIT::compileOpCall): |
| * jit/JITInlines.h: |
| (JSC::JIT::updateTopCallFrame): |
| (JSC::JIT::copiedInstruction): |
| * jit/JITOpcodes.cpp: |
| (JSC::JIT::privateCompileHasIndexedProperty): |
| * jit/JITOpcodes32_64.cpp: |
| (JSC::JIT::privateCompileHasIndexedProperty): |
| * jit/JITPropertyAccess.cpp: |
| (JSC::JIT::privateCompileGetByVal): |
| (JSC::JIT::privateCompileGetByValWithCachedId): |
| (JSC::JIT::privateCompilePutByVal): |
| (JSC::JIT::privateCompilePutByValWithCachedId): |
| * jit/SlowPathCall.h: |
| (JSC::JITSlowPathCall::call): |
| * llint/LLIntSlowPaths.cpp: |
| (JSC::LLInt::llint_trace_operand): |
| (JSC::LLInt::llint_trace_value): |
| (JSC::LLInt::LLINT_SLOW_PATH_DECL): |
| (JSC::LLInt::setupGetByIdPrototypeCache): Deleted. |
| (JSC::LLInt::getByVal): Deleted. |
| (JSC::LLInt::handleHostCall): Deleted. |
| (JSC::LLInt::setUpCall): Deleted. |
| (JSC::LLInt::genericCall): Deleted. |
| (JSC::LLInt::varargsSetup): Deleted. |
| (JSC::LLInt::llint_throw_stack_overflow_error): Deleted. |
| (JSC::LLInt::llint_stack_check_at_vm_entry): Deleted. |
| (JSC::LLInt::llint_write_barrier_slow): Deleted. |
| (JSC::LLInt::llint_crash): Deleted. |
| * runtime/SamplingProfiler.cpp: |
| (JSC::tryGetBytecodeIndex): |
| |
| 2018-03-21 Keith Miller <keith_miller@apple.com> |
| |
| btjs should print the bytecode offset in the stack trace for JS frames |
| https://bugs.webkit.org/show_bug.cgi?id=183856 |
| |
| Reviewed by Filip Pizlo. |
| |
| * interpreter/CallFrame.cpp: |
| (JSC::CallFrame::bytecodeOffset): |
| (JSC::CallFrame::dump): |
| |
| 2018-03-21 Carlos Garcia Campos <cgarcia@igalia.com> |
| |
| Unreviewed. Fix GTK and WPE debug build after r229798. |
| |
| Fix a typo in an ASSERT. Also convert several RELEASE_ASSERT to ASSERT that I forgot to do before landing. |
| |
| * API/glib/JSCCallbackFunction.cpp: |
| (JSC::JSCCallbackFunction::JSCCallbackFunction): |
| * API/glib/JSCContext.cpp: |
| (jscContextSetVirtualMachine): |
| (jscContextGetJSContext): |
| (wrapperMap): |
| (jscContextHandleExceptionIfNeeded): |
| * API/glib/JSCValue.cpp: |
| (jscValueCallFunction): |
| * API/glib/JSCVirtualMachine.cpp: |
| (addWrapper): |
| (removeWrapper): |
| (jscVirtualMachineSetContextGroup): |
| (jscVirtualMachineAddContext): |
| (jscVirtualMachineRemoveContext): |
| * API/glib/JSCWrapperMap.cpp: |
| (JSC::WrapperMap::gobjectWrapper): |
| (JSC::WrapperMap::unwrap): |
| (JSC::WrapperMap::registerClass): |
| (JSC::WrapperMap::createJSWrappper): |
| (JSC::WrapperMap::wrappedObject const): |
| |
| 2018-03-21 Carlos Garcia Campos <cgarcia@igalia.com> |
| |
| [GTK][WPE] JSC bindings not introspectable |
| https://bugs.webkit.org/show_bug.cgi?id=136989 |
| |
| Reviewed by Michael Catanzaro. |
| |
| Make it possible to include individual headers when building WebKit layer. |
| |
| * API/glib/JSCAutocleanups.h: |
| * API/glib/JSCClass.h: |
| * API/glib/JSCContext.h: |
| * API/glib/JSCException.h: |
| * API/glib/JSCValue.h: |
| * API/glib/JSCVersion.h.in: |
| * API/glib/JSCVirtualMachine.h: |
| |
| 2018-03-21 Carlos Garcia Campos <cgarcia@igalia.com> |
| |
| [GTK][WPE] Initial implementation of JavaScriptCore glib bindings |
| https://bugs.webkit.org/show_bug.cgi?id=164061 |
| |
| Reviewed by Michael Catanzaro. |
| |
| Add initial GLib API for JavaScriptCore. |
| |
| * API/JSAPIWrapperObject.h: |
| * API/glib/JSAPIWrapperObjectGLib.cpp: Added. |
| (jsAPIWrapperObjectHandleOwner): |
| (JSAPIWrapperObjectHandleOwner::finalize): |
| (JSAPIWrapperObjectHandleOwner::isReachableFromOpaqueRoots): |
| (JSC::JSCallbackObject<JSAPIWrapperObject>::createStructure): |
| (JSC::JSAPIWrapperObject::JSAPIWrapperObject): |
| (JSC::JSAPIWrapperObject::finishCreation): |
| (JSC::JSAPIWrapperObject::setWrappedObject): |
| (JSC::JSAPIWrapperObject::visitChildren): |
| * API/glib/JSCAutocleanups.h: Added. |
| * API/glib/JSCCallbackFunction.cpp: Added. |
| (JSC::callAsFunction): |
| (JSC::callAsConstructor): |
| (JSC::JSCCallbackFunction::create): |
| (JSC::JSCCallbackFunction::JSCCallbackFunction): |
| (JSC::JSCCallbackFunction::call): |
| (JSC::JSCCallbackFunction::construct): |
| (JSC::JSCCallbackFunction::destroy): |
| * API/glib/JSCCallbackFunction.h: Added. |
| (JSC::JSCCallbackFunction::createStructure): |
| (JSC::JSCCallbackFunction::functionCallback): |
| (JSC::JSCCallbackFunction::constructCallback): |
| * API/glib/JSCClass.cpp: Added. |
| (jscClassGetProperty): |
| (jscClassSetProperty): |
| (jscClassDispose): |
| (jscClassConstructed): |
| (jsc_class_class_init): |
| (jscClassCreate): |
| (jscClassGetJSClass): |
| (jscClassGetOrCreateJSWrapper): |
| (jscClassInvalidate): |
| (jsc_class_get_name): |
| (jsc_class_get_parent): |
| (jsc_class_add_constructor): |
| (jsc_class_add_method): |
| (jsc_class_add_property): |
| * API/glib/JSCClass.h: Added. |
| * API/glib/JSCClassPrivate.h: Added. |
| * API/glib/JSCContext.cpp: Added. |
| (ExceptionHandler::ExceptionHandler): |
| (ExceptionHandler::~ExceptionHandler): |
| (jscContextSetVirtualMachine): |
| (jscContextGetProperty): |
| (jscContextSetProperty): |
| (jscContextConstructed): |
| (jscContextDispose): |
| (jsc_context_class_init): |
| (jscContextGetOrCreate): |
| (jscContextGetJSContext): |
| (wrapperMap): |
| (jscContextGetOrCreateValue): |
| (jscContextValueDestroyed): |
| (jscContextGetJSWrapper): |
| (jscContextGetOrCreateJSWrapper): |
| (jscContextWrappedObject): |
| (jscContextPushCallback): |
| (jscContextPopCallback): |
| (jscContextGArrayToJSArray): |
| (jscContextJSArrayToGArray): |
| (jscContextGValueToJSValue): |
| (jscContextJSValueToGValue): |
| (jsc_context_new): |
| (jsc_context_new_with_virtual_machine): |
| (jsc_context_get_virtual_machine): |
| (jsc_context_get_exception): |
| (jsc_context_throw): |
| (jsc_context_throw_exception): |
| (jsc_context_push_exception_handler): |
| (jsc_context_pop_exception_handler): |
| (jscContextHandleExceptionIfNeeded): |
| (jsc_context_get_current): |
| (jsc_context_evaluate): |
| (jsc_context_evaluate_with_source_uri): |
| (jsc_context_set_value): |
| (jsc_context_get_value): |
| (jsc_context_register_class): |
| * API/glib/JSCContext.h: Added. |
| * API/glib/JSCContextPrivate.h: Added. |
| * API/glib/JSCDefines.h: Copied from Source/JavaScriptCore/API/JSAPIWrapperObject.h. |
| * API/glib/JSCException.cpp: Added. |
| (jscExceptionDispose): |
| (jsc_exception_class_init): |
| (jscExceptionCreate): |
| (jscExceptionGetJSValue): |
| (jscExceptionEnsureProperties): |
| (jsc_exception_new): |
| (jsc_exception_get_message): |
| (jsc_exception_get_line_number): |
| (jsc_exception_get_source_uri): |
| * API/glib/JSCException.h: Added. |
| * API/glib/JSCExceptionPrivate.h: Added. |
| * API/glib/JSCGLibWrapperObject.h: Added. |
| (JSC::JSCGLibWrapperObject::JSCGLibWrapperObject): |
| (JSC::JSCGLibWrapperObject::~JSCGLibWrapperObject): |
| (JSC::JSCGLibWrapperObject::object const): |
| * API/glib/JSCValue.cpp: Added. |
| (jscValueGetProperty): |
| (jscValueSetProperty): |
| (jscValueDispose): |
| (jsc_value_class_init): |
| (jscValueGetJSValue): |
| (jscValueCreate): |
| (jsc_value_get_context): |
| (jsc_value_new_undefined): |
| (jsc_value_is_undefined): |
| (jsc_value_new_null): |
| (jsc_value_is_null): |
| (jsc_value_new_number): |
| (jsc_value_is_number): |
| (jsc_value_to_double): |
| (jsc_value_to_int32): |
| (jsc_value_new_boolean): |
| (jsc_value_is_boolean): |
| (jsc_value_to_boolean): |
| (jsc_value_new_string): |
| (jsc_value_is_string): |
| (jsc_value_to_string): |
| (jsc_value_new_array): |
| (jsc_value_new_array_from_garray): |
| (jsc_value_is_array): |
| (jsc_value_new_object): |
| (jsc_value_is_object): |
| (jsc_value_object_is_instance_of): |
| (jsc_value_object_set_property): |
| (jsc_value_object_get_property): |
| (jsc_value_object_set_property_at_index): |
| (jsc_value_object_get_property_at_index): |
| (jscValueCallFunction): |
| (jsc_value_object_invoke_method): |
| (jsc_value_object_define_property_data): |
| (jsc_value_object_define_property_accessor): |
| (jsc_value_new_function): |
| (jsc_value_is_function): |
| (jsc_value_function_call): |
| (jsc_value_is_constructor): |
| (jsc_value_constructor_call): |
| * API/glib/JSCValue.h: Added. |
| * API/glib/JSCValuePrivate.h: Added. |
| * API/glib/JSCVersion.cpp: Added. |
| (jsc_get_major_version): |
| (jsc_get_minor_version): |
| (jsc_get_micro_version): |
| * API/glib/JSCVersion.h.in: Added. |
| * API/glib/JSCVirtualMachine.cpp: Added. |
| (addWrapper): |
| (removeWrapper): |
| (jscVirtualMachineSetContextGroup): |
| (jscVirtualMachineEnsureContextGroup): |
| (jscVirtualMachineDispose): |
| (jsc_virtual_machine_class_init): |
| (jscVirtualMachineGetOrCreate): |
| (jscVirtualMachineGetContextGroup): |
| (jscVirtualMachineAddContext): |
| (jscVirtualMachineRemoveContext): |
| (jscVirtualMachineGetContext): |
| (jsc_virtual_machine_new): |
| * API/glib/JSCVirtualMachine.h: Added. |
| * API/glib/JSCVirtualMachinePrivate.h: Added. |
| * API/glib/JSCWrapperMap.cpp: Added. |
| (JSC::WrapperMap::WrapperMap): |
| (JSC::WrapperMap::~WrapperMap): |
| (JSC::WrapperMap::gobjectWrapper): |
| (JSC::WrapperMap::unwrap): |
| (JSC::WrapperMap::registerClass): |
| (JSC::WrapperMap::createJSWrappper): |
| (JSC::WrapperMap::jsWrapper const): |
| (JSC::WrapperMap::wrappedObject const): |
| * API/glib/JSCWrapperMap.h: Added. |
| * API/glib/docs/jsc-glib-4.0-sections.txt: Added. |
| * API/glib/docs/jsc-glib-4.0.types: Added. |
| * API/glib/docs/jsc-glib-docs.sgml: Added. |
| * API/glib/jsc.h: Added. |
| * CMakeLists.txt: |
| * GLib.cmake: Added. |
| * JavaScriptCore.gir.in: Removed. |
| * PlatformGTK.cmake: |
| * PlatformWPE.cmake: |
| * heap/Heap.cpp: |
| (JSC::Heap::releaseDelayedReleasedObjects): |
| * heap/Heap.h: |
| * heap/HeapInlines.h: |
| (JSC::Heap::releaseSoon): |
| * javascriptcoregtk.pc.in: |
| * runtime/JSGlobalObject.cpp: |
| (JSC::JSGlobalObject::init): |
| (JSC::JSGlobalObject::visitChildren): |
| (JSC::JSGlobalObject::setWrapperMap): |
| * runtime/JSGlobalObject.h: |
| (JSC::JSGlobalObject::glibCallbackFunctionStructure const): |
| (JSC::JSGlobalObject::glibWrapperObjectStructure const): |
| (JSC::JSGlobalObject::wrapperMap const): |
| |
| 2018-03-21 Christopher Reid <chris.reid@sony.com> |
| |
| Windows 64-bit build fix after r229767 |
| https://bugs.webkit.org/show_bug.cgi?id=183810 |
| |
| Reviewed by Mark Lam. |
| |
| Removing an extra parameter in the call to m_assember::call. |
| |
| * assembler/MacroAssemblerX86_64.h: |
| |
| 2018-03-20 Dan Bernstein <mitz@apple.com> |
| |
| [Xcode] JSVALUE_MODEL is unused |
| https://bugs.webkit.org/show_bug.cgi?id=183809 |
| |
| Reviewed by Tim Horton. |
| |
| * Configurations/JavaScriptCore.xcconfig: Removed the unused definition. |
| |
| 2018-03-20 Tim Horton <timothy_horton@apple.com> |
| |
| Update the install name for JavaScriptCore when built with WK_ALTERNATE_FRAMEWORKS_DIR |
| https://bugs.webkit.org/show_bug.cgi?id=183808 |
| <rdar://problem/38692079> |
| |
| Reviewed by Dan Bernstein. |
| |
| * Configurations/JavaScriptCore.xcconfig: |
| |
| 2018-03-20 Tim Horton <timothy_horton@apple.com> |
| |
| Enable the minimal simulator feature flag when appropriate |
| https://bugs.webkit.org/show_bug.cgi?id=183807 |
| |
| Reviewed by Dan Bernstein. |
| |
| * Configurations/FeatureDefines.xcconfig: |
| |
| 2018-03-20 Saam Barati <sbarati@apple.com> |
| |
| We need to do proper bookkeeping of exitOK when inserting constants when sinking NewArrayBuffer |
| https://bugs.webkit.org/show_bug.cgi?id=183795 |
| <rdar://problem/38298694> |
| |
| Reviewed by JF Bastien. |
| |
| We were just assuming that the constants we were inserting were |
| always exitOK=true. However, this breaks validation. The exitOK |
| we emit for the constants in the NewArrayBuffer should respect |
| the current exit state of the IR we've emitted. This is just IR |
| bookkeeping since JSConstant is a non-exiting node. |
| |
| * dfg/DFGArgumentsEliminationPhase.cpp: |
| |
| 2018-03-20 Guillaume Emont <guijemont@igalia.com> |
| |
| MIPS+Armv7 builds are broken since r229391 |
| https://bugs.webkit.org/show_bug.cgi?id=183474 |
| |
| Reviewed by Yusuke Suzuki. |
| |
| Add missing armv7 and mips operations and fix arguments to a call to |
| operationGetByValCell. This should fix compilation on MIPS and Armv7 |
| (though it does not implement the missing setupArguments stuff in |
| CCallHelpers). |
| |
| * assembler/MacroAssembler.h: |
| * assembler/MacroAssemblerARMv7.h: |
| (JSC::MacroAssemblerARMv7::swap): |
| * assembler/MacroAssemblerMIPS.h: |
| (JSC::MacroAssemblerMIPS::swap): |
| * dfg/DFGSpeculativeJIT32_64.cpp: |
| (JSC::DFG::SpeculativeJIT::compile): |
| * jit/FPRInfo.h: |
| |
| 2018-03-20 Tim Horton <timothy_horton@apple.com> |
| |
| Add and adopt WK_PLATFORM_NAME and adjust default feature defines |
| https://bugs.webkit.org/show_bug.cgi?id=183758 |
| <rdar://problem/38017644> |
| |
| Reviewed by Dan Bernstein. |
| |
| * Configurations/FeatureDefines.xcconfig: |
| |
| 2018-03-20 Mark Lam <mark.lam@apple.com> |
| |
| Improve FunctionPtr and use it in the JIT CallRecord. |
| https://bugs.webkit.org/show_bug.cgi?id=183756 |
| <rdar://problem/38641335> |
| |
| Reviewed by JF Bastien. |
| |
| 1. FunctionPtr hold a C/C++ function pointer by default. Change its default |
| PtrTag to reflect that. |
| |
| 2. Delete the FunctionPtr::value() method. It is effectively a duplicate of |
| executableAddress(). |
| |
| 3. Fix the FunctionPtr constructor that takes arbitrary pointers to be able to |
| take "any" pointer. "any" in this case means that the pointer may not be typed |
| as a C/C++ function to the C++ compiler (due to upstream casting or usage of |
| void* as a storage type), but it is still expected to be pointing to a C/C++ |
| function. |
| |
| 4. Added a FunctionPtr constructor that takes another FunctionPtr. This is a |
| convenience constructor that lets us retag the underlying pointer. The other |
| FunctionPtr is still expected to point to a C/C++ function. |
| |
| 5. Added PtrTag assertion placeholder functions to be implemented later. |
| |
| 6. Change the JIT CallRecord to embed a FunctionPtr callee instead of a void* to |
| pointer. This improves type safety, and assists in getting pointer tagging |
| right later. |
| |
| 7. Added versions of JIT callOperations methods that will take a PtrTag. |
| This is preparation for more more pointer tagging work later. |
| |
| * assembler/MacroAssemblerARM.h: |
| (JSC::MacroAssemblerARM::linkCall): |
| * assembler/MacroAssemblerARMv7.h: |
| (JSC::MacroAssemblerARMv7::linkCall): |
| * assembler/MacroAssemblerCodeRef.h: |
| (JSC::FunctionPtr::FunctionPtr): |
| (JSC::FunctionPtr::operator bool const): |
| (JSC::FunctionPtr::operator! const): |
| (JSC::ReturnAddressPtr::ReturnAddressPtr): |
| (JSC::MacroAssemblerCodePtr::retagged const): |
| (JSC::MacroAssemblerCodeRef::retaggedCode const): |
| (JSC::FunctionPtr::value const): Deleted. |
| * assembler/MacroAssemblerMIPS.h: |
| (JSC::MacroAssemblerMIPS::linkCall): |
| * assembler/MacroAssemblerX86.h: |
| (JSC::MacroAssemblerX86::linkCall): |
| * assembler/MacroAssemblerX86_64.h: |
| (JSC::MacroAssemblerX86_64::callWithSlowPathReturnType): |
| (JSC::MacroAssemblerX86_64::linkCall): |
| * bytecode/AccessCase.cpp: |
| (JSC::AccessCase::generateImpl): |
| * ftl/FTLSlowPathCall.cpp: |
| (JSC::FTL::SlowPathCallContext::makeCall): |
| * ftl/FTLSlowPathCall.h: |
| (JSC::FTL::callOperation): |
| * ftl/FTLThunks.cpp: |
| (JSC::FTL::osrExitGenerationThunkGenerator): |
| (JSC::FTL::lazySlowPathGenerationThunkGenerator): |
| (JSC::FTL::slowPathCallThunkGenerator): |
| * jit/JIT.cpp: |
| (JSC::JIT::link): |
| (JSC::JIT::privateCompileExceptionHandlers): |
| * jit/JIT.h: |
| (JSC::CallRecord::CallRecord): |
| (JSC::JIT::appendCall): |
| (JSC::JIT::appendCallWithSlowPathReturnType): |
| (JSC::JIT::callOperation): |
| (JSC::JIT::callOperationWithProfile): |
| (JSC::JIT::callOperationWithResult): |
| (JSC::JIT::callOperationNoExceptionCheck): |
| (JSC::JIT::callOperationWithCallFrameRollbackOnException): |
| * jit/JITArithmetic.cpp: |
| (JSC::JIT::emitMathICFast): |
| (JSC::JIT::emitMathICSlow): |
| * jit/JITInlines.h: |
| (JSC::JIT::emitNakedCall): |
| (JSC::JIT::emitNakedTailCall): |
| (JSC::JIT::appendCallWithExceptionCheck): |
| (JSC::JIT::appendCallWithExceptionCheckAndSlowPathReturnType): |
| (JSC::JIT::appendCallWithCallFrameRollbackOnException): |
| (JSC::JIT::appendCallWithExceptionCheckSetJSValueResult): |
| (JSC::JIT::appendCallWithExceptionCheckSetJSValueResultWithProfile): |
| * jit/JITPropertyAccess.cpp: |
| (JSC::JIT::emitSlow_op_get_by_val): |
| (JSC::JIT::emitSlow_op_put_by_val): |
| (JSC::JIT::privateCompileGetByValWithCachedId): |
| (JSC::JIT::privateCompilePutByVal): |
| (JSC::JIT::privateCompilePutByValWithCachedId): |
| * jit/JITPropertyAccess32_64.cpp: |
| (JSC::JIT::emitSlow_op_put_by_val): |
| * jit/Repatch.cpp: |
| (JSC::linkPolymorphicCall): |
| * jit/SlowPathCall.h: |
| (JSC::JITSlowPathCall::JITSlowPathCall): |
| (JSC::JITSlowPathCall::call): |
| * jit/ThunkGenerators.cpp: |
| (JSC::nativeForGenerator): |
| * runtime/PtrTag.h: |
| (JSC::nextPtrTagID): |
| (JSC::assertIsCFunctionPtr): |
| (JSC::assertIsNullOrCFunctionPtr): |
| (JSC::assertIsNotTagged): |
| (JSC::assertIsTagged): |
| (JSC::assertIsNullOrTagged): |
| (JSC::assertIsTaggedWith): |
| (JSC::assertIsNullOrTaggedWith): |
| (JSC::uniquePtrTagID): Deleted. |
| |
| 2018-03-20 Stanislav Ocovaj <stanislav.ocovaj@rt-rk.com> |
| |
| [MIPS] Optimize generated JIT code for loads/stores |
| https://bugs.webkit.org/show_bug.cgi?id=183243 |
| |
| Reviewed by Yusuke Suzuki. |
| |
| JIT generates three MIPS instructions for a load/store from/to an absolute address: |
| |
| lui adrTmpReg, address >> 16 |
| ori adrTmpReg, address & 0xffff |
| lw dataReg, 0(adrTmpReg) |
| |
| Since load/store instructions on MIPS have a 16-bit offset, lower 16 bits of the address can |
| be encoded into the load/store and ori instruction can be removed: |
| |
| lui adrTmpReg, (address + 0x8000) >> 16 |
| lw dataReg, (address & 0xffff)(adrTmpReg) |
| |
| Also, in loads/stores with BaseIndex address, the left shift can be omitted if address.scale is 0. |
| |
| * assembler/MacroAssemblerMIPS.h: |
| (JSC::MacroAssemblerMIPS::add32): |
| (JSC::MacroAssemblerMIPS::add64): |
| (JSC::MacroAssemblerMIPS::or32): |
| (JSC::MacroAssemblerMIPS::sub32): |
| (JSC::MacroAssemblerMIPS::convertibleLoadPtr): |
| (JSC::MacroAssemblerMIPS::load8): |
| (JSC::MacroAssemblerMIPS::load8SignedExtendTo32): |
| (JSC::MacroAssemblerMIPS::load32): |
| (JSC::MacroAssemblerMIPS::store8): |
| (JSC::MacroAssemblerMIPS::store32): |
| (JSC::MacroAssemblerMIPS::branchTest8): |
| (JSC::MacroAssemblerMIPS::branchAdd32): |
| (JSC::MacroAssemblerMIPS::loadDouble): |
| (JSC::MacroAssemblerMIPS::storeDouble): |
| |
| 2018-03-16 Yusuke Suzuki <utatane.tea@gmail.com> |
| |
| [DFG][FTL] Add vectorLengthHint for NewArray |
| https://bugs.webkit.org/show_bug.cgi?id=183694 |
| |
| Reviewed by Saam Barati. |
| |
| While the following code is a common, it is not so efficient. |
| |
| var array = []; |
| for (...) { |
| ... |
| array.push(...); |
| } |
| |
| The array is always allocated with 0 vector length. And it is eventually grown. |
| |
| We have ArrayAllocationProfile, and it tells us that the vector length hint for |
| the allocated arrays. This hint is already used for NewArrayBuffer. This patch |
| extends this support for NewArray DFG node. |
| |
| This patch improves Kraken/stanford-crypto-aes 4%. |
| |
| baseline patched |
| |
| stanford-crypto-aes 64.069+-1.352 61.589+-1.274 might be 1.0403x faster |
| |
| NewArray can be optimized. |
| |
| baseline patched |
| |
| vector-length-hint-new-array 21.8157+-0.0882 ^ 13.1764+-0.0942 ^ definitely 1.6557x faster |
| vector-length-hint-array-constructor 21.9076+-0.0987 ? 22.1168+-0.4814 ? |
| |
| * dfg/DFGByteCodeParser.cpp: |
| (JSC::DFG::ByteCodeParser::handleConstantInternalFunction): |
| (JSC::DFG::ByteCodeParser::parseBlock): |
| * dfg/DFGNode.h: |
| (JSC::DFG::Node::hasVectorLengthHint): |
| (JSC::DFG::Node::vectorLengthHint): |
| * dfg/DFGSpeculativeJIT64.cpp: |
| (JSC::DFG::SpeculativeJIT::compile): |
| * ftl/FTLLowerDFGToB3.cpp: |
| (JSC::FTL::DFG::LowerDFGToB3::compileNewArray): |
| |
| 2018-03-13 Yusuke Suzuki <utatane.tea@gmail.com> |
| |
| [DFG][FTL] Make ArraySlice(0) code tight |
| https://bugs.webkit.org/show_bug.cgi?id=183590 |
| |
| Reviewed by Saam Barati. |
| |
| This patch tightens ArraySlice code, in particular, startIndex = 0 case. |
| |
| 1. We support array.slice() call. This is a well-used way to clone array. |
| For example, underscore.js uses this technique. |
| |
| 2. We remove several checks if the given index value is a proven constant. |
| |
| * dfg/DFGBackwardsPropagationPhase.cpp: |
| (JSC::DFG::BackwardsPropagationPhase::propagate): |
| * dfg/DFGByteCodeParser.cpp: |
| (JSC::DFG::ByteCodeParser::handleIntrinsicCall): |
| * dfg/DFGFixupPhase.cpp: |
| (JSC::DFG::FixupPhase::fixupNode): |
| * dfg/DFGSpeculativeJIT.cpp: |
| (JSC::DFG::SpeculativeJIT::emitPopulateSliceIndex): |
| (JSC::DFG::SpeculativeJIT::compileArraySlice): |
| We can skip some of checks if the given value is a proven constant. |
| |
| * ftl/FTLLowerDFGToB3.cpp: |
| (JSC::FTL::DFG::LowerDFGToB3::compileArraySlice): |
| Change below to belowOrEqual. It does not change meaning in the code. But it allows us |
| to fold BelowEqual(0, x) to true. |
| |
| 2018-03-19 Yusuke Suzuki <utatane.tea@gmail.com> |
| |
| Drop s_exceptionInstructions static initializer |
| https://bugs.webkit.org/show_bug.cgi?id=183732 |
| |
| Reviewed by Darin Adler. |
| |
| Make Instruction constructor constexpr to drop the static constructor |
| of LLInt::Data::s_exceptionInstructions. |
| |
| * bytecode/Instruction.h: |
| (JSC::Instruction::Instruction): |
| |
| 2018-03-19 Dan Bernstein <mitz@apple.com> |
| |
| Investigate why __cpu_indicator_init is used |
| https://bugs.webkit.org/show_bug.cgi?id=183736 |
| |
| Reviewed by Tim Horton. |
| |
| __cpu_indicator_init, which is a global initializer, was included in JavaScriptCore because |
| we were passing the -all_load option to the linker, causing it to bring in all members of |
| every static library being linked in, including the compiler runtime library. We only need |
| to load all members of WTF. The linker option for doing that is -force_load, and it requires |
| a path to the library. To support building against libWTF.a built locally as well as against |
| the copy that is in the SDK, we add a script build phase that palces a symbolic link to the |
| appropriate libWTF.a under the DerivedSources directory, and pass the path to that symlink |
| to the linker. Also, while cleaning up linker flags, make OTHER_LDFLAGS_HIDE_SYMBOLS less |
| verbose by eliminating every other -Wl, remove redundant -lobjc (libobjc is already listed |
| in the Link Binary With Libraries build phase), remove long-unsupported -Y,3, and stop |
| reexporting libobjc. |
| |
| * Configurations/JavaScriptCore.xcconfig: |
| * JavaScriptCore.xcodeproj/project.pbxproj: |
| |
| 2018-03-19 Jiewen Tan <jiewen_tan@apple.com> |
| |
| Unreviewed, another quick fix for r229699 |
| |
| Restricts ENABLE_WEB_AUTHN to only macOS and iOS. |
| |
| * Configurations/FeatureDefines.xcconfig: |
| |
| 2018-03-19 Mark Lam <mark.lam@apple.com> |
| |
| FunctionPtr should be passed by value. |
| https://bugs.webkit.org/show_bug.cgi?id=183746 |
| <rdar://problem/38625311> |
| |
| Reviewed by JF Bastien. |
| |
| It's meant to be an encapsulation of a C/C++ function pointer. There are cases |
| where we use it to pass JIT compiled code (e.g. the VM thunks/stubs), but they are |
| treated as if they are C/C++ functions. |
| |
| Regardless, there's no need to pass it by reference. |
| |
| * assembler/MacroAssemblerCodeRef.h: |
| * dfg/DFGJITCompiler.h: |
| (JSC::DFG::JITCompiler::appendCall): |
| * dfg/DFGSpeculativeJIT.h: |
| (JSC::DFG::SpeculativeJIT::appendCall): |
| (JSC::DFG::SpeculativeJIT::appendCallWithCallFrameRollbackOnException): |
| (JSC::DFG::SpeculativeJIT::appendCallWithCallFrameRollbackOnExceptionSetResult): |
| (JSC::DFG::SpeculativeJIT::appendCallSetResult): |
| * jit/JIT.h: |
| (JSC::JIT::appendCall): |
| (JSC::JIT::appendCallWithSlowPathReturnType): |
| * jit/JITInlines.h: |
| (JSC::JIT::appendCallWithExceptionCheck): |
| (JSC::JIT::appendCallWithExceptionCheckAndSlowPathReturnType): |
| (JSC::JIT::appendCallWithCallFrameRollbackOnException): |
| (JSC::JIT::appendCallWithExceptionCheckSetJSValueResult): |
| (JSC::JIT::appendCallWithExceptionCheckSetJSValueResultWithProfile): |
| |
| 2018-03-15 Ross Kirsling <ross.kirsling@sony.com> |
| |
| Fix MSVC run-time check after r229391. |
| https://bugs.webkit.org/show_bug.cgi?id=183673 |
| |
| Reviewed by Keith Miller. |
| |
| Replaces attempted fix from r229424/r229432. |
| Apparently MSVC doesn't like it when a zero-length std::array is defined without explicit braces. |
| |
| * jit/CCallHelpers.h: |
| (JSC::CCallHelpers::clampArrayToSize): |
| |
| 2018-03-15 Tim Horton <timothy_horton@apple.com> |
| |
| Add and adopt WK_ALTERNATE_FRAMEWORKS_DIR in ANGLE |
| https://bugs.webkit.org/show_bug.cgi?id=183675 |
| <rdar://problem/38515281> |
| |
| Reviewed by Dan Bernstein. |
| |
| * JavaScriptCore.xcodeproj/project.pbxproj: |
| Don't install the JSC alias if we're installing to an alternate location. |
| This should have been a part of r229637. |
| |
| 2018-03-15 Tim Horton <timothy_horton@apple.com> |
| |
| Add and adopt WK_ALTERNATE_FRAMEWORKS_DIR in JavaScriptCore |
| https://bugs.webkit.org/show_bug.cgi?id=183649 |
| <rdar://problem/38480526> |
| |
| Reviewed by Dan Bernstein. |
| |
| * Configurations/Base.xcconfig: |
| * JavaScriptCore.xcodeproj/project.pbxproj: |
| |
| 2018-03-14 Mark Lam <mark.lam@apple.com> |
| |
| Enhance the MacroAssembler and LinkBuffer to support pointer profiling. |
| https://bugs.webkit.org/show_bug.cgi?id=183623 |
| <rdar://problem/38443314> |
| |
| Reviewed by Michael Saboff. |
| |
| 1. Added a PtrTag argument to indirect call() and indirect jump() MacroAssembler |
| emitters to support pointer profiling. |
| |
| 2. Also added tagPtr(), untagPtr(), and removePtrTag() placeholder methods. |
| |
| 3. Added a PtrTag to LinkBuffer finalizeCodeWithoutDisassembly() and clients. |
| |
| 4. Updated clients to pass a PtrTag. For the most part, I just apply NoPtrTag as |
| a placeholder until we have time to analyze what pointer profile each client |
| site has later. |
| |
| 5. Apply PtrTags to the YarrJIT. |
| |
| * assembler/ARM64Assembler.h: |
| (JSC::ARM64Assembler::linkJumpOrCall): |
| * assembler/AbstractMacroAssembler.h: |
| (JSC::AbstractMacroAssembler::getLinkerAddress): |
| (JSC::AbstractMacroAssembler::tagPtr): |
| (JSC::AbstractMacroAssembler::untagPtr): |
| (JSC::AbstractMacroAssembler::removePtrTag): |
| * assembler/LinkBuffer.cpp: |
| (JSC::LinkBuffer::finalizeCodeWithoutDisassembly): |
| (JSC::LinkBuffer::finalizeCodeWithDisassembly): |
| * assembler/LinkBuffer.h: |
| (JSC::LinkBuffer::link): |
| (JSC::LinkBuffer::locationOfNearCall): |
| (JSC::LinkBuffer::locationOf): |
| * assembler/MacroAssemblerARM.h: |
| (JSC::MacroAssemblerARM::jump): |
| (JSC::MacroAssemblerARM::call): |
| (JSC::MacroAssemblerARM::readCallTarget): |
| * assembler/MacroAssemblerARM64.h: |
| (JSC::MacroAssemblerARM64::call): |
| (JSC::MacroAssemblerARM64::jump): |
| (JSC::MacroAssemblerARM64::readCallTarget): |
| (JSC::MacroAssemblerARM64::linkCall): |
| * assembler/MacroAssemblerARMv7.h: |
| (JSC::MacroAssemblerARMv7::jump): |
| (JSC::MacroAssemblerARMv7::relativeTableJump): |
| (JSC::MacroAssemblerARMv7::call): |
| (JSC::MacroAssemblerARMv7::readCallTarget): |
| * assembler/MacroAssemblerCodeRef.cpp: |
| (JSC::MacroAssemblerCodePtr::createLLIntCodePtr): |
| (JSC::MacroAssemblerCodeRef::createLLIntCodeRef): |
| * assembler/MacroAssemblerCodeRef.h: |
| (JSC::FunctionPtr::FunctionPtr): |
| (JSC::FunctionPtr::value const): |
| (JSC::MacroAssemblerCodePtr:: const): |
| (JSC::MacroAssemblerCodeRef::MacroAssemblerCodeRef): |
| (JSC::MacroAssemblerCodeRef::retaggedCode const): |
| * assembler/MacroAssemblerMIPS.h: |
| (JSC::MacroAssemblerMIPS::jump): |
| (JSC::MacroAssemblerMIPS::call): |
| (JSC::MacroAssemblerMIPS::readCallTarget): |
| * assembler/MacroAssemblerX86.h: |
| (JSC::MacroAssemblerX86::call): |
| (JSC::MacroAssemblerX86::jump): |
| (JSC::MacroAssemblerX86::readCallTarget): |
| * assembler/MacroAssemblerX86Common.cpp: |
| (JSC::MacroAssembler::probe): |
| * assembler/MacroAssemblerX86Common.h: |
| (JSC::MacroAssemblerX86Common::jump): |
| (JSC::MacroAssemblerX86Common::call): |
| * assembler/MacroAssemblerX86_64.h: |
| (JSC::MacroAssemblerX86_64::call): |
| (JSC::MacroAssemblerX86_64::jump): |
| (JSC::MacroAssemblerX86_64::readCallTarget): |
| * assembler/testmasm.cpp: |
| (JSC::compile): |
| (JSC::invoke): |
| * b3/B3Compile.cpp: |
| (JSC::B3::compile): |
| * b3/B3LowerMacros.cpp: |
| * b3/air/AirCCallSpecial.cpp: |
| (JSC::B3::Air::CCallSpecial::generate): |
| * b3/air/testair.cpp: |
| * b3/testb3.cpp: |
| (JSC::B3::invoke): |
| (JSC::B3::testInterpreter): |
| (JSC::B3::testEntrySwitchSimple): |
| (JSC::B3::testEntrySwitchNoEntrySwitch): |
| (JSC::B3::testEntrySwitchWithCommonPaths): |
| (JSC::B3::testEntrySwitchWithCommonPathsAndNonTrivialEntrypoint): |
| (JSC::B3::testEntrySwitchLoop): |
| * bytecode/AccessCase.cpp: |
| (JSC::AccessCase::generateImpl): |
| * bytecode/AccessCaseSnippetParams.cpp: |
| (JSC::SlowPathCallGeneratorWithArguments::generateImpl): |
| * bytecode/InlineAccess.cpp: |
| (JSC::linkCodeInline): |
| (JSC::InlineAccess::rewireStubAsJump): |
| * bytecode/PolymorphicAccess.cpp: |
| (JSC::AccessGenerationState::emitExplicitExceptionHandler): |
| (JSC::PolymorphicAccess::regenerate): |
| * dfg/DFGJITCompiler.cpp: |
| (JSC::DFG::JITCompiler::compileExceptionHandlers): |
| (JSC::DFG::JITCompiler::link): |
| (JSC::DFG::JITCompiler::compileFunction): |
| (JSC::DFG::JITCompiler::noticeCatchEntrypoint): |
| * dfg/DFGJITCompiler.h: |
| (JSC::DFG::JITCompiler::appendCall): |
| * dfg/DFGJITFinalizer.cpp: |
| (JSC::DFG::JITFinalizer::finalize): |
| (JSC::DFG::JITFinalizer::finalizeFunction): |
| * dfg/DFGOSRExit.cpp: |
| (JSC::DFG::OSRExit::emitRestoreArguments): |
| (JSC::DFG::OSRExit::compileOSRExit): |
| * dfg/DFGOSRExitCompilerCommon.cpp: |
| (JSC::DFG::handleExitCounts): |
| (JSC::DFG::osrWriteBarrier): |
| (JSC::DFG::adjustAndJumpToTarget): |
| * dfg/DFGSpeculativeJIT.cpp: |
| (JSC::DFG::SpeculativeJIT::emitSwitchIntJump): |
| (JSC::DFG::SpeculativeJIT::emitSwitchImm): |
| (JSC::DFG::SpeculativeJIT::emitSwitchStringOnString): |
| * dfg/DFGSpeculativeJIT64.cpp: |
| (JSC::DFG::SpeculativeJIT::compile): |
| * dfg/DFGThunks.cpp: |
| (JSC::DFG::osrExitThunkGenerator): |
| (JSC::DFG::osrExitGenerationThunkGenerator): |
| (JSC::DFG::osrEntryThunkGenerator): |
| * ftl/FTLCompile.cpp: |
| (JSC::FTL::compile): |
| * ftl/FTLJITFinalizer.cpp: |
| (JSC::FTL::JITFinalizer::finalizeCommon): |
| * ftl/FTLLazySlowPath.cpp: |
| (JSC::FTL::LazySlowPath::generate): |
| * ftl/FTLLink.cpp: |
| (JSC::FTL::link): |
| * ftl/FTLLowerDFGToB3.cpp: |
| (JSC::FTL::DFG::LowerDFGToB3::lower): |
| (JSC::FTL::DFG::LowerDFGToB3::compileCallOrConstructVarargsSpread): |
| (JSC::FTL::DFG::LowerDFGToB3::compileCallOrConstructVarargs): |
| (JSC::FTL::DFG::LowerDFGToB3::compileCallEval): |
| * ftl/FTLOSRExitCompiler.cpp: |
| (JSC::FTL::compileStub): |
| (JSC::FTL::compileFTLOSRExit): |
| * ftl/FTLSlowPathCall.cpp: |
| (JSC::FTL::SlowPathCallContext::makeCall): |
| * ftl/FTLThunks.cpp: |
| (JSC::FTL::genericGenerationThunkGenerator): |
| (JSC::FTL::osrExitGenerationThunkGenerator): |
| (JSC::FTL::lazySlowPathGenerationThunkGenerator): |
| (JSC::FTL::slowPathCallThunkGenerator): |
| * jit/AssemblyHelpers.cpp: |
| (JSC::AssemblyHelpers::callExceptionFuzz): |
| (JSC::AssemblyHelpers::debugCall): |
| * jit/CCallHelpers.cpp: |
| (JSC::CCallHelpers::ensureShadowChickenPacket): |
| * jit/CCallHelpers.h: |
| (JSC::CCallHelpers::jumpToExceptionHandler): |
| * jit/ExecutableAllocator.cpp: |
| (JSC::FixedVMPoolExecutableAllocator::jitWriteThunkGenerator): |
| * jit/JIT.cpp: |
| (JSC::JIT::emitEnterOptimizationCheck): |
| (JSC::JIT::link): |
| (JSC::JIT::privateCompileExceptionHandlers): |
| * jit/JIT.h: |
| (JSC::JIT::appendCall): |
| * jit/JITMathIC.h: |
| (JSC::isProfileEmpty): |
| * jit/JITOpcodes.cpp: |
| (JSC::JIT::emit_op_catch): |
| (JSC::JIT::emit_op_switch_imm): |
| (JSC::JIT::emit_op_switch_char): |
| (JSC::JIT::emit_op_switch_string): |
| (JSC::JIT::emitSlow_op_loop_hint): |
| (JSC::JIT::privateCompileHasIndexedProperty): |
| * jit/JITOpcodes32_64.cpp: |
| (JSC::JIT::emit_op_catch): |
| (JSC::JIT::emit_op_switch_imm): |
| (JSC::JIT::emit_op_switch_char): |
| (JSC::JIT::emit_op_switch_string): |
| (JSC::JIT::privateCompileHasIndexedProperty): |
| * 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::readCallTarget): |
| (JSC::appropriateOptimizingPutByIdFunction): |
| (JSC::linkPolymorphicCall): |
| (JSC::resetPutByID): |
| * jit/SlowPathCall.h: |
| (JSC::JITSlowPathCall::call): |
| * jit/SpecializedThunkJIT.h: |
| (JSC::SpecializedThunkJIT::finalize): |
| (JSC::SpecializedThunkJIT::callDoubleToDouble): |
| * jit/ThunkGenerators.cpp: |
| (JSC::throwExceptionFromCallSlowPathGenerator): |
| (JSC::slowPathFor): |
| (JSC::linkCallThunkGenerator): |
| (JSC::linkPolymorphicCallThunkGenerator): |
| (JSC::virtualThunkFor): |
| (JSC::nativeForGenerator): |
| (JSC::arityFixupGenerator): |
| (JSC::unreachableGenerator): |
| (JSC::boundThisNoArgsFunctionCallGenerator): |
| * llint/LLIntThunks.cpp: |
| (JSC::LLInt::generateThunkWithJumpTo): |
| (JSC::LLInt::functionForCallEntryThunkGenerator): |
| (JSC::LLInt::functionForConstructEntryThunkGenerator): |
| (JSC::LLInt::functionForCallArityCheckThunkGenerator): |
| (JSC::LLInt::functionForConstructArityCheckThunkGenerator): |
| (JSC::LLInt::evalEntryThunkGenerator): |
| (JSC::LLInt::programEntryThunkGenerator): |
| (JSC::LLInt::moduleProgramEntryThunkGenerator): |
| * runtime/PtrTag.h: |
| * wasm/WasmB3IRGenerator.cpp: |
| (JSC::Wasm::B3IRGenerator::addCall): |
| (JSC::Wasm::B3IRGenerator::addCallIndirect): |
| * wasm/WasmBBQPlan.cpp: |
| (JSC::Wasm::BBQPlan::complete): |
| * wasm/WasmBinding.cpp: |
| (JSC::Wasm::wasmToWasm): |
| * wasm/WasmOMGPlan.cpp: |
| (JSC::Wasm::OMGPlan::work): |
| * wasm/WasmThunks.cpp: |
| (JSC::Wasm::throwExceptionFromWasmThunkGenerator): |
| (JSC::Wasm::throwStackOverflowFromWasmThunkGenerator): |
| (JSC::Wasm::triggerOMGTierUpThunkGenerator): |
| * wasm/js/WasmToJS.cpp: |
| (JSC::Wasm::handleBadI64Use): |
| (JSC::Wasm::wasmToJS): |
| * yarr/YarrJIT.cpp: |
| (JSC::Yarr::YarrGenerator::loadFromFrameAndJump): |
| (JSC::Yarr::YarrGenerator::BacktrackingState::linkDataLabels): |
| (JSC::Yarr::YarrGenerator::generateTryReadUnicodeCharacterHelper): |
| (JSC::Yarr::YarrGenerator::generateEnter): |
| (JSC::Yarr::YarrGenerator::YarrGenerator): |
| (JSC::Yarr::YarrGenerator::compile): |
| (JSC::Yarr::jitCompile): |
| * yarr/YarrJIT.h: |
| (JSC::Yarr::YarrCodeBlock::execute): |
| |
| 2018-03-14 Caitlin Potter <caitp@igalia.com> |
| |
| [JSC] fix order of evaluation for ClassDefinitionEvaluation |
| https://bugs.webkit.org/show_bug.cgi?id=183523 |
| |
| Reviewed by Keith Miller. |
| |
| Computed property names need to be evaluated in source order during class |
| definition evaluation, as it's observable (and specified to work this way). |
| |
| This change improves compatibility with Chromium. |
| |
| * bytecompiler/BytecodeGenerator.h: |
| (JSC::BytecodeGenerator::emitDefineClassElements): |
| * bytecompiler/NodesCodegen.cpp: |
| (JSC::PropertyListNode::emitBytecode): |
| (JSC::ClassExprNode::emitBytecode): |
| * parser/ASTBuilder.h: |
| (JSC::ASTBuilder::createClassExpr): |
| (JSC::ASTBuilder::createGetterOrSetterProperty): |
| (JSC::ASTBuilder::createProperty): |
| * parser/NodeConstructors.h: |
| (JSC::PropertyNode::PropertyNode): |
| (JSC::ClassExprNode::ClassExprNode): |
| * parser/Nodes.cpp: |
| (JSC::PropertyListNode::hasStaticallyNamedProperty): |
| * parser/Nodes.h: |
| (JSC::PropertyNode::isClassProperty const): |
| (JSC::PropertyNode::isStaticClassProperty const): |
| (JSC::PropertyNode::isInstanceClassProperty const): |
| * parser/Parser.cpp: |
| (JSC::Parser<LexerType>::parseClass): |
| (JSC::Parser<LexerType>::parseProperty): |
| (JSC::Parser<LexerType>::parseGetterSetter): |
| * parser/Parser.h: |
| * parser/SyntaxChecker.h: |
| (JSC::SyntaxChecker::createClassExpr): |
| (JSC::SyntaxChecker::createProperty): |
| (JSC::SyntaxChecker::createGetterOrSetterProperty): |
| |
| 2018-03-14 Keith Miller <keith_miller@apple.com> |
| |
| Move jsc CLI breakpoint function to $vm |
| https://bugs.webkit.org/show_bug.cgi?id=183512 |
| |
| Reviewed by Yusuke Suzuki. |
| |
| * jsc.cpp: |
| (GlobalObject::finishCreation): |
| (functionBreakpoint): Deleted. |
| * tools/JSDollarVM.cpp: |
| (JSC::functionBreakpoint): |
| (JSC::JSDollarVM::finishCreation): |
| |
| 2018-03-14 Tim Horton <timothy_horton@apple.com> |
| |
| Fix the build after r229567 |
| |
| * Configurations/FeatureDefines.xcconfig: |
| |
| 2018-03-12 Mark Lam <mark.lam@apple.com> |
| |
| Gardening: speculative build fix for WinCairo. |
| https://bugs.webkit.org/show_bug.cgi?id=183573 |
| |
| Not reviewed. |
| |
| * runtime/NativeFunction.h: |
| (JSC::TaggedNativeFunction::TaggedNativeFunction): |
| |
| 2018-03-12 Yusuke Suzuki <utatane.tea@gmail.com> |
| |
| Unreviewed, fix obsolete ASSERT |
| https://bugs.webkit.org/show_bug.cgi?id=183310 |
| |
| Now NewObject can be conereted from CallObjectConstructor and CreateThis. |
| |
| * dfg/DFGNode.h: |
| (JSC::DFG::Node::convertToNewObject): |
| |
| 2018-03-12 Tim Horton <timothy_horton@apple.com> |
| |
| Stop using SDK conditionals to control feature definitions |
| https://bugs.webkit.org/show_bug.cgi?id=183430 |
| <rdar://problem/38251619> |
| |
| Reviewed by Dan Bernstein. |
| |
| * Configurations/FeatureDefines.xcconfig: |
| * Configurations/WebKitTargetConditionals.xcconfig: Renamed. |
| |
| 2018-03-12 Yoav Weiss <yoav@yoav.ws> |
| |
| Runtime flag for link prefetch and remove link subresource. |
| https://bugs.webkit.org/show_bug.cgi?id=183540 |
| |
| Reviewed by Chris Dumez. |
| |
| Remove the LINK_PREFETCH build time flag. |
| |
| * Configurations/FeatureDefines.xcconfig: |
| |
| 2018-03-12 Mark Lam <mark.lam@apple.com> |
| |
| Gardening: speculative build fix for Windows. |
| https://bugs.webkit.org/show_bug.cgi?id=183573 |
| |
| Not reviewed. |
| |
| * runtime/NativeFunction.h: |
| (JSC::TaggedNativeFunction::TaggedNativeFunction): |
| |
| 2018-03-12 Mark Lam <mark.lam@apple.com> |
| |
| Add another PtrTag. |
| https://bugs.webkit.org/show_bug.cgi?id=183580 |
| <rdar://problem/38390584> |
| |
| Reviewed by Keith Miller. |
| |
| * runtime/PtrTag.h: |
| |
| 2018-03-12 Mark Lam <mark.lam@apple.com> |
| |
| Make a NativeFunction into a class to support pointer profiling. |
| https://bugs.webkit.org/show_bug.cgi?id=183573 |
| <rdar://problem/38384697> |
| |
| Reviewed by Filip Pizlo. |
| |
| 1. NativeFunction is now a class, and introducing RawNativeFunction and |
| TaggedNativeFunction. |
| |
| RawNativeFunction is the raw pointer type (equivalent |
| to the old definition of NativeFunction). This is mainly used for underlying |
| storage inside the NativeFunction class, and also for global data tables that |
| cannot embed non-trivially constructed objects. |
| |
| NativeFunction's role is mainly to encapsulate a pointer to a C function that |
| we pass into the VM. |
| |
| TaggedNativeFunction encapsulates the tagged version of a pointer to a C |
| function that we track in the VM. |
| |
| 2. Added a convenience constructor for TrustedImmPtr so that we don't have to |
| cast function pointers to void* anymore when constructing a TrustedImmPtr. |
| |
| 3. Removed the unused CALL_RETURN macro in CommonSlowPaths.cpp. |
| |
| 4. Added more PtrTag utility functions. |
| |
| * CMakeLists.txt: |
| * JavaScriptCore.xcodeproj/project.pbxproj: |
| * assembler/AbstractMacroAssembler.h: |
| (JSC::AbstractMacroAssembler::TrustedImmPtr::TrustedImmPtr): |
| * create_hash_table: |
| * interpreter/Interpreter.cpp: |
| (JSC::Interpreter::executeCall): |
| (JSC::Interpreter::executeConstruct): |
| * interpreter/InterpreterInlines.h: |
| (JSC::Interpreter::getOpcodeID): |
| * jit/JITThunks.cpp: |
| (JSC::JITThunks::hostFunctionStub): |
| * jit/JITThunks.h: |
| * llint/LLIntData.cpp: |
| (JSC::LLInt::initialize): |
| * llint/LLIntSlowPaths.cpp: |
| (JSC::LLInt::setUpCall): |
| * llint/LowLevelInterpreter.asm: |
| * llint/LowLevelInterpreter.cpp: |
| (JSC::CLoop::execute): |
| * llint/LowLevelInterpreter64.asm: |
| * offlineasm/ast.rb: |
| * runtime/CallData.h: |
| * runtime/CommonSlowPaths.cpp: |
| * runtime/ConstructData.h: |
| * runtime/InternalFunction.h: |
| (JSC::InternalFunction::nativeFunctionFor): |
| * runtime/JSCell.cpp: |
| (JSC::JSCell::getCallData): |
| (JSC::JSCell::getConstructData): |
| * runtime/JSFunction.h: |
| * runtime/JSFunctionInlines.h: |
| (JSC::JSFunction::nativeFunction): |
| (JSC::JSFunction::nativeConstructor): |
| (JSC::isHostFunction): |
| * runtime/Lookup.h: |
| (JSC::HashTableValue::function const): |
| (JSC::HashTableValue::accessorGetter const): |
| (JSC::HashTableValue::accessorSetter const): |
| (JSC::nonCachingStaticFunctionGetter): |
| * runtime/NativeExecutable.cpp: |
| (JSC::NativeExecutable::create): |
| (JSC::NativeExecutable::NativeExecutable): |
| * runtime/NativeExecutable.h: |
| * runtime/NativeFunction.h: Added. |
| (JSC::NativeFunction::NativeFunction): |
| (JSC::NativeFunction::operator intptr_t const): |
| (JSC::NativeFunction::operator bool const): |
| (JSC::NativeFunction::operator! const): |
| (JSC::NativeFunction::operator== const): |
| (JSC::NativeFunction::operator!= const): |
| (JSC::NativeFunction::operator()): |
| (JSC::NativeFunction::rawPointer const): |
| (JSC::NativeFunctionHash::hash): |
| (JSC::NativeFunctionHash::equal): |
| (JSC::TaggedNativeFunction::TaggedNativeFunction): |
| (JSC::TaggedNativeFunction::operator bool const): |
| (JSC::TaggedNativeFunction::operator! const): |
| (JSC::TaggedNativeFunction::operator== const): |
| (JSC::TaggedNativeFunction::operator!= const): |
| (JSC::TaggedNativeFunction::operator()): |
| (JSC::TaggedNativeFunction::operator NativeFunction): |
| (JSC::TaggedNativeFunction::rawPointer const): |
| (JSC::TaggedNativeFunctionHash::hash): |
| (JSC::TaggedNativeFunctionHash::equal): |
| * runtime/PtrTag.h: |
| (JSC::tagCFunctionPtr): |
| (JSC::untagCFunctionPtr): |
| * runtime/VM.h: |
| (JSC::VM::targetMachinePCForThrowOffset): Deleted. |
| |
| 2018-03-12 Filip Pizlo <fpizlo@apple.com> |
| |
| Unreviewed, fix simple goof that was causing 32-bit DFG crashes. |
| |
| * dfg/DFGSpeculativeJIT.cpp: |
| (JSC::DFG::SpeculativeJIT::compileCreateDirectArguments): |
| |
| 2018-03-11 Yusuke Suzuki <utatane.tea@gmail.com> |
| |
| [DFG] AI should convert CreateThis to NewObject if the prototype object is proved |
| https://bugs.webkit.org/show_bug.cgi?id=183310 |
| |
| Reviewed by Filip Pizlo. |
| |
| This patch implements CreateThis -> NewObject conversion in AI if the given function is constant. |
| This contributes to 6% win in Octane/raytrace. |
| |
| baseline patched |
| |
| raytrace x2 1.19915+-0.01862 ^ 1.13156+-0.01589 ^ definitely 1.0597x faster |
| |
| * dfg/DFGAbstractInterpreterInlines.h: |
| (JSC::DFG::AbstractInterpreter<AbstractStateType>::executeEffects): |
| * dfg/DFGConstantFoldingPhase.cpp: |
| (JSC::DFG::ConstantFoldingPhase::foldConstants): |
| |
| 2018-03-11 Wenson Hsieh <wenson_hsieh@apple.com> |
| |
| Disable Sigill crash analyzer on watchOS |
| https://bugs.webkit.org/show_bug.cgi?id=183548 |
| <rdar://problem/38338032> |
| |
| Reviewed by Mark Lam. |
| |
| Sigill is not supported on watchOS. |
| |
| * runtime/Options.cpp: |
| (JSC::overrideDefaults): |
| |
| 2018-03-09 Filip Pizlo <fpizlo@apple.com> |
| |
| Split DirectArguments into JSValueOOB and JSValueStrict parts |
| https://bugs.webkit.org/show_bug.cgi?id=183458 |
| |
| Reviewed by Yusuke Suzuki. |
| |
| Our Spectre plan for JSValue objects is to allow inline JSValue stores and loads guarded by |
| unmitigated structure checks. This works because objects reachable from JSValues (i.e. JSValue |
| objects, like String, Symbol, and any descendant of JSObject) will only contain fields that it's OK |
| to read and write within a Spectre mitigation window. Writes are important, because within the |
| window, a write could appear to be made speculatively and rolled out later. This means that: |
| |
| - JSValue objects cannot have lengths, masks, or anything else inline. |
| |
| - JSValue objects cannot have an inline type that is used as part of a Spectre mitigation for a type |
| check, unless that type is in the form of a poison key. |
| |
| This means that the dynamic poisoning that I previously landed for DirectArguments is wrong. It also |
| means that it's wrong for DirectArguments to have an inline length. |
| |
| This changes DirectArguments to use poisoning according to the universal formula: |
| |
| - The random accessed portions are out-of-line, pointed to by a poisoned pointer. |
| |
| - No inline length. |
| |
| Surprisingly, this is perf-neutral. It's probably perf-neutral because our compiler optimizations |
| amortize whatever cost there was. |
| |
| * bytecode/AccessCase.cpp: |
| (JSC::AccessCase::generateWithGuard): |
| * dfg/DFGCallCreateDirectArgumentsSlowPathGenerator.h: |
| (JSC::DFG::CallCreateDirectArgumentsSlowPathGenerator::CallCreateDirectArgumentsSlowPathGenerator): |
| * dfg/DFGCallCreateDirectArgumentsWithKnownLengthSlowPathGenerator.h: Added. |
| (JSC::DFG::CallCreateDirectArgumentsWithKnownLengthSlowPathGenerator::CallCreateDirectArgumentsWithKnownLengthSlowPathGenerator): |
| * dfg/DFGSpeculativeJIT.cpp: |
| (JSC::DFG::SpeculativeJIT::compileGetByValOnDirectArguments): |
| (JSC::DFG::SpeculativeJIT::compileGetArrayLength): |
| (JSC::DFG::SpeculativeJIT::compileCreateDirectArguments): |
| (JSC::DFG::SpeculativeJIT::compileGetFromArguments): |
| (JSC::DFG::SpeculativeJIT::compilePutToArguments): |
| * ftl/FTLAbstractHeapRepository.h: |
| * ftl/FTLLowerDFGToB3.cpp: |
| (JSC::FTL::DFG::LowerDFGToB3::compileGetArrayLength): |
| (JSC::FTL::DFG::LowerDFGToB3::compileGetByVal): |
| (JSC::FTL::DFG::LowerDFGToB3::compileCreateDirectArguments): |
| (JSC::FTL::DFG::LowerDFGToB3::compileGetFromArguments): |
| (JSC::FTL::DFG::LowerDFGToB3::compilePutToArguments): |
| (JSC::FTL::DFG::LowerDFGToB3::compileCheckSubClass): |
| (JSC::FTL::DFG::LowerDFGToB3::allocateVariableSizedHeapCell): |
| (JSC::FTL::DFG::LowerDFGToB3::dynamicPoison): Deleted. |
| (JSC::FTL::DFG::LowerDFGToB3::dynamicPoisonOnLoadedType): Deleted. |
| (JSC::FTL::DFG::LowerDFGToB3::dynamicPoisonOnType): Deleted. |
| * heap/SecurityKind.h: |
| * jit/JITPropertyAccess.cpp: |
| (JSC::JIT::emit_op_get_from_arguments): |
| (JSC::JIT::emit_op_put_to_arguments): |
| (JSC::JIT::emitDirectArgumentsGetByVal): |
| * jit/JITPropertyAccess32_64.cpp: |
| (JSC::JIT::emit_op_get_from_arguments): |
| (JSC::JIT::emit_op_put_to_arguments): |
| * llint/LowLevelInterpreter.asm: |
| * llint/LowLevelInterpreter32_64.asm: |
| * llint/LowLevelInterpreter64.asm: |
| * runtime/DirectArguments.cpp: |
| (JSC::DirectArguments::DirectArguments): |
| (JSC::DirectArguments::createUninitialized): |
| (JSC::DirectArguments::create): |
| (JSC::DirectArguments::createByCopying): |
| (JSC::DirectArguments::estimatedSize): |
| (JSC::DirectArguments::visitChildren): |
| (JSC::DirectArguments::overrideThings): |
| (JSC::DirectArguments::copyToArguments): |
| (JSC::DirectArguments::mappedArgumentsSize): |
| * runtime/DirectArguments.h: |
| * runtime/JSCPoison.h: |
| * runtime/JSLexicalEnvironment.h: |
| * runtime/JSSymbolTableObject.h: |
| * runtime/VM.cpp: |
| (JSC::VM::VM): |
| * runtime/VM.h: |
| |
| 2018-03-11 Yusuke Suzuki <utatane.tea@gmail.com> |
| |
| [B3] Above/Below should be strength-reduced for comparison with 0 |
| https://bugs.webkit.org/show_bug.cgi?id=183543 |
| |
| Reviewed by Filip Pizlo. |
| |
| Above(0, x) and BelowEqual(0, x) can be converted to constants false and true respectively. |
| This can be seen in ArraySlice(0) case: `Select(Above(0, length), length, 0)` this should |
| be converted to `0`. This patch adds such a folding to comparisons. |
| |
| We also fix B3ReduceStrength issue creating an orphan value. If a flipped value is folded to |
| a constant, we do not insert flipped value and make it an orphan. This issue causes JSC test |
| failure with this B3Const32/64Value change. With this patch, we create a flipped value only |
| when we fail to fold it to a constant. |
| |
| * b3/B3Const32Value.cpp: |
| (JSC::B3::Const32Value::lessThanConstant const): |
| (JSC::B3::Const32Value::greaterThanConstant const): |
| (JSC::B3::Const32Value::lessEqualConstant const): |
| (JSC::B3::Const32Value::greaterEqualConstant const): |
| (JSC::B3::Const32Value::aboveConstant const): |
| (JSC::B3::Const32Value::belowConstant const): |
| (JSC::B3::Const32Value::aboveEqualConstant const): |
| (JSC::B3::Const32Value::belowEqualConstant const): |
| * b3/B3Const64Value.cpp: |
| (JSC::B3::Const64Value::lessThanConstant const): |
| (JSC::B3::Const64Value::greaterThanConstant const): |
| (JSC::B3::Const64Value::lessEqualConstant const): |
| (JSC::B3::Const64Value::greaterEqualConstant const): |
| (JSC::B3::Const64Value::aboveConstant const): |
| (JSC::B3::Const64Value::belowConstant const): |
| (JSC::B3::Const64Value::aboveEqualConstant const): |
| (JSC::B3::Const64Value::belowEqualConstant const): |
| * b3/B3ReduceStrength.cpp: |
| * b3/testb3.cpp: |
| (JSC::B3::int64Operands): |
| (JSC::B3::int32Operands): |
| |
| 2018-03-10 Yusuke Suzuki <utatane.tea@gmail.com> |
| |
| [FTL] Drop NewRegexp for String.prototype.match with RegExp + global flag |
| https://bugs.webkit.org/show_bug.cgi?id=181848 |
| |
| Reviewed by Sam Weinig. |
| |
| In r181535, we support `string.match(/nonglobal/)` code. However, `string.match(/global/g)` is not |
| optimized since it sets `lastIndex` value before performing RegExp operation. |
| |
| This patch optimizes the above "with a global flag" case by emitting `SetRegExpObjectLastIndex` properly. |
| RegExpMatchFast is converted to SetRegExpObjectLastIndex and RegExpMatchFastGlobal. The latter node |
| just holds RegExp (not RegExpObject) cell so that it can offer a chance to make NewRegexp PhantomNewRegexp |
| in object allocation sinking phase. |
| |
| Added microbenchmarks shows that this patch makes NewRegexp PhantomNewRegexp even if the given RegExp |
| has a global flag. And it improves the performance. |
| |
| baseline patched |
| |
| regexp-u-global-es5 44.1298+-4.6128 ^ 33.7920+-2.0110 ^ definitely 1.3059x faster |
| regexp-u-global-es6 182.3272+-2.2861 ^ 154.3414+-7.6769 ^ definitely 1.1813x faster |
| |
| * dfg/DFGAbstractInterpreterInlines.h: |
| (JSC::DFG::AbstractInterpreter<AbstractStateType>::executeEffects): |
| * dfg/DFGClobberize.h: |
| (JSC::DFG::clobberize): |
| * dfg/DFGDoesGC.cpp: |
| (JSC::DFG::doesGC): |
| * dfg/DFGFixupPhase.cpp: |
| (JSC::DFG::FixupPhase::fixupNode): |
| * dfg/DFGMayExit.cpp: |
| * dfg/DFGNode.cpp: |
| (JSC::DFG::Node::convertToRegExpMatchFastGlobal): |
| * dfg/DFGNode.h: |
| (JSC::DFG::Node::hasHeapPrediction): |
| (JSC::DFG::Node::hasCellOperand): |
| * dfg/DFGNodeType.h: |
| * dfg/DFGOperations.cpp: |
| * dfg/DFGOperations.h: |
| * dfg/DFGPredictionPropagationPhase.cpp: |
| * dfg/DFGSafeToExecute.h: |
| (JSC::DFG::safeToExecute): |
| * dfg/DFGSpeculativeJIT.cpp: |
| (JSC::DFG::SpeculativeJIT::compileRegExpMatchFastGlobal): |
| * dfg/DFGSpeculativeJIT.h: |
| * dfg/DFGSpeculativeJIT32_64.cpp: |
| (JSC::DFG::SpeculativeJIT::compile): |
| * dfg/DFGSpeculativeJIT64.cpp: |
| (JSC::DFG::SpeculativeJIT::compile): |
| * dfg/DFGStrengthReductionPhase.cpp: |
| (JSC::DFG::StrengthReductionPhase::handleNode): |
| * ftl/FTLCapabilities.cpp: |
| (JSC::FTL::canCompile): |
| * ftl/FTLLowerDFGToB3.cpp: |
| (JSC::FTL::DFG::LowerDFGToB3::compileNode): |
| (JSC::FTL::DFG::LowerDFGToB3::compileRegExpMatchFastGlobal): |
| * runtime/RegExpObject.cpp: |
| (JSC::collectMatches): Deleted. |
| * runtime/RegExpObject.h: |
| * runtime/RegExpObjectInlines.h: |
| (JSC::RegExpObject::execInline): |
| (JSC::RegExpObject::matchInline): |
| (JSC::advanceStringUnicode): |
| (JSC::collectMatches): |
| (JSC::RegExpObject::advanceStringUnicode): Deleted. |
| * runtime/RegExpPrototype.cpp: |
| (JSC::advanceStringIndex): |
| |
| 2018-03-10 Yusuke Suzuki <utatane.tea@gmail.com> |
| |
| B3::reduceStrength should canonicalize integer comparisons |
| https://bugs.webkit.org/show_bug.cgi?id=150958 |
| |
| Reviewed by Filip Pizlo. |
| |
| This patch sorts operands of comparisons by flipping opcode. For example, `Above(0, @2)` is |
| converted to `Below(@2, 0)`. This sorting is the same to handleCommutativity rule. Since we |
| canonicalize comparisons to have constant value at least on the right hand side, we can |
| remove pattern matchings checking leftImm in B3LowerToAir. |
| |
| Since this flipping changes the opcode of the value, to achieve safely, we just create a |
| new value which has flipped opcode and swapped operands. If we can fold it to a constant, |
| we replace m_value with this constant. If we fail to fold it to constant, we replace |
| m_value with the flipped one. |
| |
| These comparisons are already handled in testb3. |
| |
| * b3/B3LowerToAir.cpp: |
| * b3/B3ReduceStrength.cpp: |
| |
| 2018-03-09 Mark Lam <mark.lam@apple.com> |
| |
| offlineasm should reset the Assembler's working state before doing another pass for a new target. |
| https://bugs.webkit.org/show_bug.cgi?id=183538 |
| <rdar://problem/38325955> |
| |
| Reviewed by Michael Saboff. |
| |
| * llint/LowLevelInterpreter.cpp: |
| * offlineasm/asm.rb: |
| * offlineasm/cloop.rb: |
| |
| 2018-03-09 Brian Burg <bburg@apple.com> |
| |
| Web Inspector: there should only be one way for async backend commands to send failure |
| https://bugs.webkit.org/show_bug.cgi?id=183524 |
| |
| Reviewed by Timothy Hatcher. |
| |
| If this is an async command, errors should be reported with BackendDispatcher::CallbackBase::sendFailure. |
| To avoid mixups, don't include the ErrorString out-parameter in generated async command signatures. |
| This change only affects interfaces generated for C++ backend dispatchers. |
| |
| * inspector/scripts/codegen/generate_cpp_backend_dispatcher_header.py: |
| (CppBackendDispatcherHeaderGenerator._generate_async_handler_declaration_for_command): |
| * inspector/scripts/codegen/generate_cpp_backend_dispatcher_implementation.py: |
| (CppBackendDispatcherImplementationGenerator._generate_dispatcher_implementation_for_command): |
| * inspector/scripts/tests/generic/expected/commands-with-async-attribute.json-result: |
| |
| 2018-03-09 Mark Lam <mark.lam@apple.com> |
| |
| Build fix after r229476. |
| https://bugs.webkit.org/show_bug.cgi?id=183488 |
| |
| Not reviewed. |
| |
| * runtime/StackAlignment.h: |
| |
| 2018-03-09 Mark Lam <mark.lam@apple.com> |
| |
| [Re-landing] Add support for ARM64E. |
| https://bugs.webkit.org/show_bug.cgi?id=183398 |
| <rdar://problem/38212621> |
| |
| Reviewed by Michael Saboff. |
| |
| * assembler/MacroAssembler.h: |
| * llint/LLIntOfflineAsmConfig.h: |
| * llint/LowLevelInterpreter.asm: |
| * llint/LowLevelInterpreter64.asm: |
| * offlineasm/backends.rb: |
| |
| 2018-03-09 Mark Lam <mark.lam@apple.com> |
| |
| [Re-landing] Prepare LLInt code to support pointer profiling. |
| https://bugs.webkit.org/show_bug.cgi?id=183387 |
| <rdar://problem/38199678> |
| |
| Reviewed by JF Bastien. |
| |
| 1. Introduced PtrTag enums for supporting pointer profiling later. |
| |
| 2. Also introduced tagging, untagging, retagging, and tag removal placeholder |
| template functions for the same purpose. |
| |
| 3. Prepare the offlineasm for supporting pointer profiling later. |
| |
| 4. Tagged some pointers in LLInt asm code. Currently, these should have no |
| effect on behavior. |
| |
| 5. Removed returnToThrowForThrownException() because it is not used anywhere. |
| |
| 6. Added the offlineasm folder to JavaScriptCore Xcode project so that it's |
| easier to view and edit these files in Xcode. |
| |
| * CMakeLists.txt: |
| * JavaScriptCore.xcodeproj/project.pbxproj: |
| * bytecode/LLIntCallLinkInfo.h: |
| (JSC::LLIntCallLinkInfo::unlink): |
| * llint/LLIntData.cpp: |
| (JSC::LLInt::initialize): |
| * llint/LLIntData.h: |
| * llint/LLIntExceptions.cpp: |
| (JSC::LLInt::returnToThrowForThrownException): Deleted. |
| * llint/LLIntExceptions.h: |
| * llint/LLIntOfflineAsmConfig.h: |
| * llint/LLIntOffsetsExtractor.cpp: |
| * llint/LLIntPCRanges.h: |
| (JSC::LLInt::isLLIntPC): |
| * llint/LLIntSlowPaths.cpp: |
| (JSC::LLInt::LLINT_SLOW_PATH_DECL): |
| (JSC::LLInt::handleHostCall): |
| (JSC::LLInt::setUpCall): |
| * llint/LowLevelInterpreter.asm: |
| * llint/LowLevelInterpreter32_64.asm: |
| * llint/LowLevelInterpreter64.asm: |
| * offlineasm/ast.rb: |
| * offlineasm/instructions.rb: |
| * offlineasm/risc.rb: |
| * runtime/PtrTag.h: Added. |
| (JSC::uniquePtrTagID): |
| (JSC::ptrTag): |
| (JSC::tagCodePtr): |
| (JSC::untagCodePtr): |
| (JSC::retagCodePtr): |
| (JSC::removeCodePtrTag): |
| |
| 2018-03-09 Mark Lam <mark.lam@apple.com> |
| |
| Remove unused LLINT_STATS feature. |
| https://bugs.webkit.org/show_bug.cgi?id=183522 |
| <rdar://problem/38313139> |
| |
| Rubber-stamped by Keith Miller. |
| |
| We haven't used this in a while, and it is one more option that makes offlineasm |
| build slower. We can always re-introduce this later if we need it. |
| |
| * jsc.cpp: |
| * llint/LLIntCommon.h: |
| * llint/LLIntData.cpp: |
| (JSC::LLInt::initialize): |
| (JSC::LLInt::Data::finalizeStats): Deleted. |
| (JSC::LLInt::compareStats): Deleted. |
| (JSC::LLInt::Data::dumpStats): Deleted. |
| (JSC::LLInt::Data::ensureStats): Deleted. |
| (JSC::LLInt::Data::loadStats): Deleted. |
| (JSC::LLInt::Data::resetStats): Deleted. |
| (JSC::LLInt::Data::saveStats): Deleted. |
| * llint/LLIntData.h: |
| (): Deleted. |
| (JSC::LLInt::Data::opcodeStats): Deleted. |
| * llint/LLIntOfflineAsmConfig.h: |
| * llint/LLIntSlowPaths.cpp: |
| * llint/LLIntSlowPaths.h: |
| * llint/LowLevelInterpreter.asm: |
| * llint/LowLevelInterpreter32_64.asm: |
| * llint/LowLevelInterpreter64.asm: |
| * runtime/Options.cpp: |
| (JSC::Options::isAvailable): |
| (JSC::recomputeDependentOptions): |
| * runtime/Options.h: |
| * runtime/TestRunnerUtils.cpp: |
| (JSC::finalizeStatsAtEndOfTesting): |
| |
| 2018-03-09 Michael Saboff <msaboff@apple.com> |
| |
| Relanding "testmasm crashes in testBranchTruncateDoubleToInt32() on ARM64" |
| https://bugs.webkit.org/show_bug.cgi?id=183488 |
| |
| It applied and built just fine locally. |
| |
| * assembler/testmasm.cpp: |
| (JSC::testBranchTruncateDoubleToInt32): |
| |
| 2018-03-09 Yusuke Suzuki <utatane.tea@gmail.com> |
| |
| Unreviewed, remove WebAssemblyFunctionType |
| https://bugs.webkit.org/show_bug.cgi?id=183429 |
| |
| Drop WebAssemblyFunctionType since it is no longer used. This breaks |
| JSCast assumption that all the derived classes of JSFunction use |
| JSFunctionType. We also add ASSERT for JSFunction::finishCreation. |
| |
| * runtime/JSFunction.cpp: |
| (JSC::JSFunction::finishCreation): |
| * runtime/JSType.h: |
| * wasm/js/WebAssemblyFunction.cpp: |
| (JSC::WebAssemblyFunction::createStructure): |
| * wasm/js/WebAssemblyFunction.h: |
| |
| 2018-03-09 Ryan Haddad <ryanhaddad@apple.com> |
| |
| Unreviewed, rolling out r229446. |
| |
| This change relies on changes that have been rolled out. |
| |
| Reverted changeset: |
| |
| "testmasm crashes in testBranchTruncateDoubleToInt32() on |
| ARM64" |
| https://bugs.webkit.org/show_bug.cgi?id=183488 |
| https://trac.webkit.org/changeset/229446 |
| |
| 2018-03-08 Chris Dumez <cdumez@apple.com> |
| |
| Safari not handling undefined global variables with same name as element Id correctly. |
| https://bugs.webkit.org/show_bug.cgi?id=183087 |
| <rdar://problem/37927596> |
| |
| Reviewed by Ryosuke Niwa. |
| |
| global variables (var foo;) should not be hidden by: |
| - Named properties |
| - Properties on the prototype chain |
| |
| Therefore, we now have JSGlobalObject::addVar() call JSGlobalObject::addGlobalVar() |
| if !hasOwnProperty() instead of !hasProperty. |
| |
| This aligns our behavior with Chrome and Firefox. |
| |
| * runtime/JSGlobalObject.h: |
| (JSC::JSGlobalObject::addVar): |
| |
| 2018-03-08 Commit Queue <commit-queue@webkit.org> |
| |
| Unreviewed, rolling out r229354 and r229364. |
| https://bugs.webkit.org/show_bug.cgi?id=183492 |
| |
| Breaks internal builds (Requested by ryanhaddad on #webkit). |
| |
| Reverted changesets: |
| |
| "Prepare LLInt code to support pointer profiling." |
| https://bugs.webkit.org/show_bug.cgi?id=183387 |
| https://trac.webkit.org/changeset/229354 |
| |
| "Add support for ARM64E." |
| https://bugs.webkit.org/show_bug.cgi?id=183398 |
| https://trac.webkit.org/changeset/229364 |
| |
| 2018-03-08 Michael Saboff <msaboff@apple.com> |
| |
| testmasm crashes in testBranchTruncateDoubleToInt32() on ARM64 |
| https://bugs.webkit.org/show_bug.cgi?id=183488 |
| |
| Reviewed by Mark Lam. |
| |
| Using stackAlignmentBytes() will keep the stack properly aligned. |
| |
| * assembler/testmasm.cpp: |
| (JSC::testBranchTruncateDoubleToInt32): |
| |
| 2018-03-08 Michael Saboff <msaboff@apple.com> |
| |
| Emit code to zero the stack frame on function entry |
| Nhttps://bugs.webkit.org/show_bug.cgi?id=183391 |
| |
| Reviewed by Mark Lam. |
| |
| Added code to zero incoming stack frame behind a new JSC option, zeroStackFrame. |
| The default setting of the option is off. |
| |
| Did some minor refactoring of the YarrJIT stack alignment code. |
| |
| * b3/air/AirCode.cpp: |
| (JSC::B3::Air::defaultPrologueGenerator): |
| * dfg/DFGJITCompiler.cpp: |
| (JSC::DFG::JITCompiler::compile): |
| (JSC::DFG::JITCompiler::compileFunction): |
| * dfg/DFGSpeculativeJIT.cpp: |
| (JSC::DFG::SpeculativeJIT::compileCurrentBlock): |
| * dfg/DFGThunks.cpp: |
| (JSC::DFG::osrEntryThunkGenerator): |
| * ftl/FTLLowerDFGToB3.cpp: |
| (JSC::FTL::DFG::LowerDFGToB3::lower): |
| * jit/AssemblyHelpers.h: |
| (JSC::AssemblyHelpers::clearStackFrame): |
| * jit/JIT.cpp: |
| (JSC::JIT::compileWithoutLinking): |
| * llint/LowLevelInterpreter.asm: |
| * runtime/Options.h: |
| * yarr/YarrJIT.cpp: |
| (JSC::Yarr::YarrGenerator::ialignCallFrameSizeInBytesnitCallFrame): |
| (JSC::Yarr::YarrGenerator::initCallFrame): |
| (JSC::Yarr::YarrGenerator::removeCallFrame): |
| |
| 2018-03-08 Keith Miller <keith_miller@apple.com> |
| |
| Unreviewed, another attempt at fixing the Windows build. |
| I guess the pragma must be outside the function... |
| |
| * jit/CCallHelpers.h: |
| (JSC::CCallHelpers::clampArrayToSize): |
| |
| 2018-03-08 Keith Miller <keith_miller@apple.com> |
| |
| Unreviewed, one last try at fixing the windows build before rollout. |
| |
| * jit/CCallHelpers.h: |
| (JSC::CCallHelpers::clampArrayToSize): |
| |
| 2018-03-08 Yusuke Suzuki <utatane.tea@gmail.com> |
| |
| [JSC] Optimize inherits<T> if T is final type |
| https://bugs.webkit.org/show_bug.cgi?id=183435 |
| |
| Reviewed by Mark Lam. |
| |
| If the type T is a final type (`std::is_final<T>::value == true`), there is no |
| classes which is derived from T. It means that `jsDynamicCast<T>` only needs |
| to check the given cell's `classInfo(vm)` is `T::info()`. |
| |
| This patch adds a new specialization for jsDynamicCast<T> / inherits<T> for a |
| final type. And we also add `final` annotations to JS cell types in JSC. This |
| offers, |
| |
| 1. Readability. If the given class is annotated with `final`, we do not need to |
| consider about the derived classes of T. |
| |
| 2. Static Checking. If your class is not intended to be used as a base class, attaching |
| `final` can ensure this invariant. |
| |
| 3. Performance. jsDynamicCast<T> and inherits<T> can be optimized and the code size should |
| be smaller. |
| |
| * API/JSCallbackConstructor.h: |
| (JSC::JSCallbackConstructor::create): Deleted. |
| (JSC::JSCallbackConstructor::classRef const): Deleted. |
| (JSC::JSCallbackConstructor::callback const): Deleted. |
| (JSC::JSCallbackConstructor::createStructure): Deleted. |
| (JSC::JSCallbackConstructor::constructCallback): Deleted. |
| * API/JSCallbackFunction.h: |
| (JSC::JSCallbackFunction::createStructure): Deleted. |
| (JSC::JSCallbackFunction::functionCallback): Deleted. |
| * API/JSCallbackObject.h: |
| (JSC::JSCallbackObject::create): Deleted. |
| (JSC::JSCallbackObject::destroy): Deleted. |
| (JSC::JSCallbackObject::classRef const): Deleted. |
| (JSC::JSCallbackObject::getPrivateProperty const): Deleted. |
| (JSC::JSCallbackObject::setPrivateProperty): Deleted. |
| (JSC::JSCallbackObject::deletePrivateProperty): Deleted. |
| (JSC::JSCallbackObject::visitChildren): Deleted. |
| * bytecode/CodeBlock.cpp: |
| (JSC::CodeBlock::setConstantRegisters): |
| * bytecode/ExecutableToCodeBlockEdge.h: |
| (JSC::ExecutableToCodeBlockEdge::subspaceFor): Deleted. |
| (JSC::ExecutableToCodeBlockEdge::codeBlock const): Deleted. |
| (JSC::ExecutableToCodeBlockEdge::unwrap): Deleted. |
| * bytecode/FunctionCodeBlock.h: |
| (JSC::FunctionCodeBlock::subspaceFor): Deleted. |
| (JSC::FunctionCodeBlock::create): Deleted. |
| (JSC::FunctionCodeBlock::createStructure): Deleted. |
| (JSC::FunctionCodeBlock::FunctionCodeBlock): Deleted. |
| * debugger/DebuggerScope.h: |
| (JSC::DebuggerScope::createStructure): Deleted. |
| (JSC::DebuggerScope::iterator::iterator): Deleted. |
| (JSC::DebuggerScope::iterator::get): Deleted. |
| (JSC::DebuggerScope::iterator::operator++): Deleted. |
| (JSC::DebuggerScope::iterator::operator== const): Deleted. |
| (JSC::DebuggerScope::iterator::operator!= const): Deleted. |
| (JSC::DebuggerScope::isValid const): Deleted. |
| (JSC::DebuggerScope::jsScope const): Deleted. |
| * inspector/JSInjectedScriptHost.h: |
| (Inspector::JSInjectedScriptHost::createStructure): Deleted. |
| (Inspector::JSInjectedScriptHost::create): Deleted. |
| (Inspector::JSInjectedScriptHost::impl const): Deleted. |
| * inspector/JSInjectedScriptHostPrototype.h: |
| (Inspector::JSInjectedScriptHostPrototype::create): Deleted. |
| (Inspector::JSInjectedScriptHostPrototype::createStructure): Deleted. |
| (Inspector::JSInjectedScriptHostPrototype::JSInjectedScriptHostPrototype): Deleted. |
| * inspector/JSJavaScriptCallFrame.h: |
| (Inspector::JSJavaScriptCallFrame::createStructure): Deleted. |
| (Inspector::JSJavaScriptCallFrame::create): Deleted. |
| (Inspector::JSJavaScriptCallFrame::impl const): Deleted. |
| * inspector/JSJavaScriptCallFramePrototype.h: |
| (Inspector::JSJavaScriptCallFramePrototype::create): Deleted. |
| (Inspector::JSJavaScriptCallFramePrototype::createStructure): Deleted. |
| (Inspector::JSJavaScriptCallFramePrototype::JSJavaScriptCallFramePrototype): Deleted. |
| * jit/Repatch.cpp: |
| (JSC::tryCacheGetByID): |
| * runtime/ArrayConstructor.h: |
| (JSC::ArrayConstructor::create): Deleted. |
| (JSC::ArrayConstructor::createStructure): Deleted. |
| * runtime/ArrayIteratorPrototype.h: |
| (JSC::ArrayIteratorPrototype::create): Deleted. |
| (JSC::ArrayIteratorPrototype::createStructure): Deleted. |
| (JSC::ArrayIteratorPrototype::ArrayIteratorPrototype): Deleted. |
| * runtime/ArrayPrototype.h: |
| (JSC::ArrayPrototype::createStructure): Deleted. |
| * runtime/AsyncFromSyncIteratorPrototype.h: |
| (JSC::AsyncFromSyncIteratorPrototype::createStructure): Deleted. |
| * runtime/AsyncFunctionConstructor.h: |
| (JSC::AsyncFunctionConstructor::create): Deleted. |
| (JSC::AsyncFunctionConstructor::createStructure): Deleted. |
| * runtime/AsyncFunctionPrototype.h: |
| (JSC::AsyncFunctionPrototype::create): Deleted. |
| (JSC::AsyncFunctionPrototype::createStructure): Deleted. |
| * runtime/AsyncGeneratorFunctionConstructor.h: |
| (JSC::AsyncGeneratorFunctionConstructor::create): Deleted. |
| (JSC::AsyncGeneratorFunctionConstructor::createStructure): Deleted. |
| * runtime/AsyncGeneratorFunctionPrototype.h: |
| (JSC::AsyncGeneratorFunctionPrototype::create): Deleted. |
| (JSC::AsyncGeneratorFunctionPrototype::createStructure): Deleted. |
| * runtime/AsyncGeneratorPrototype.h: |
| (JSC::AsyncGeneratorPrototype::create): Deleted. |
| (JSC::AsyncGeneratorPrototype::createStructure): Deleted. |
| (JSC::AsyncGeneratorPrototype::AsyncGeneratorPrototype): Deleted. |
| * runtime/AsyncIteratorPrototype.h: |
| (JSC::AsyncIteratorPrototype::create): Deleted. |
| (JSC::AsyncIteratorPrototype::createStructure): Deleted. |
| (JSC::AsyncIteratorPrototype::AsyncIteratorPrototype): Deleted. |
| * runtime/AtomicsObject.h: |
| * runtime/BigIntConstructor.h: |
| (JSC::BigIntConstructor::create): Deleted. |
| (JSC::BigIntConstructor::createStructure): Deleted. |
| * runtime/BigIntObject.h: |
| (JSC::BigIntObject::create): Deleted. |
| (JSC::BigIntObject::internalValue const): Deleted. |
| (JSC::BigIntObject::createStructure): Deleted. |
| * runtime/BigIntPrototype.h: |
| (JSC::BigIntPrototype::create): Deleted. |
| (JSC::BigIntPrototype::createStructure): Deleted. |
| * runtime/BooleanConstructor.h: |
| (JSC::BooleanConstructor::create): Deleted. |
| (JSC::BooleanConstructor::createStructure): Deleted. |
| * runtime/BooleanPrototype.h: |
| (JSC::BooleanPrototype::create): Deleted. |
| (JSC::BooleanPrototype::createStructure): Deleted. |
| * runtime/ConsoleObject.h: |
| (JSC::ConsoleObject::create): Deleted. |
| (JSC::ConsoleObject::createStructure): Deleted. |
| * runtime/DOMAttributeGetterSetter.h: |
| (JSC::isDOMAttributeGetterSetter): Deleted. |
| * runtime/DateConstructor.h: |
| (JSC::DateConstructor::create): Deleted. |
| (JSC::DateConstructor::createStructure): Deleted. |
| * runtime/DateInstance.h: |
| (JSC::DateInstance::create): Deleted. |
| (JSC::DateInstance::internalNumber const): Deleted. |
| (JSC::DateInstance::gregorianDateTime const): Deleted. |
| (JSC::DateInstance::gregorianDateTimeUTC const): Deleted. |
| (JSC::DateInstance::createStructure): Deleted. |
| * runtime/DatePrototype.h: |
| (JSC::DatePrototype::create): Deleted. |
| (JSC::DatePrototype::createStructure): Deleted. |
| * runtime/Error.h: |
| (JSC::StrictModeTypeErrorFunction::StrictModeTypeErrorFunction): Deleted. |
| (JSC::StrictModeTypeErrorFunction::create): Deleted. |
| (JSC::StrictModeTypeErrorFunction::constructThrowTypeError): Deleted. |
| (JSC::StrictModeTypeErrorFunction::callThrowTypeError): Deleted. |
| (JSC::StrictModeTypeErrorFunction::createStructure): Deleted. |
| * runtime/ErrorConstructor.h: |
| (JSC::ErrorConstructor::create): Deleted. |
| (JSC::ErrorConstructor::createStructure): Deleted. |
| (JSC::ErrorConstructor::stackTraceLimit const): Deleted. |
| * runtime/Exception.h: |
| (JSC::Exception::valueOffset): Deleted. |
| (JSC::Exception::value const): Deleted. |
| (JSC::Exception::stack const): Deleted. |
| (JSC::Exception::didNotifyInspectorOfThrow const): Deleted. |
| (JSC::Exception::setDidNotifyInspectorOfThrow): Deleted. |
| * runtime/FunctionConstructor.h: |
| (JSC::FunctionConstructor::create): Deleted. |
| (JSC::FunctionConstructor::createStructure): Deleted. |
| * runtime/FunctionPrototype.h: |
| (JSC::FunctionPrototype::create): Deleted. |
| (JSC::FunctionPrototype::createStructure): Deleted. |
| * runtime/FunctionRareData.h: |
| (JSC::FunctionRareData::offsetOfObjectAllocationProfile): Deleted. |
| (JSC::FunctionRareData::objectAllocationProfile): Deleted. |
| (JSC::FunctionRareData::objectAllocationStructure): Deleted. |
| (JSC::FunctionRareData::allocationProfileWatchpointSet): Deleted. |
| (JSC::FunctionRareData::isObjectAllocationProfileInitialized): Deleted. |
| (JSC::FunctionRareData::internalFunctionAllocationStructure): Deleted. |
| (JSC::FunctionRareData::createInternalFunctionAllocationStructureFromBase): Deleted. |
| (JSC::FunctionRareData::clearInternalFunctionAllocationProfile): Deleted. |
| (JSC::FunctionRareData::getBoundFunctionStructure): Deleted. |
| (JSC::FunctionRareData::setBoundFunctionStructure): Deleted. |
| (JSC::FunctionRareData::hasReifiedLength const): Deleted. |
| (JSC::FunctionRareData::setHasReifiedLength): Deleted. |
| (JSC::FunctionRareData::hasReifiedName const): Deleted. |
| (JSC::FunctionRareData::setHasReifiedName): Deleted. |
| (JSC::FunctionRareData::hasAllocationProfileClearingWatchpoint const): Deleted. |
| (JSC::FunctionRareData::createAllocationProfileClearingWatchpoint): Deleted. |
| (JSC::FunctionRareData::AllocationProfileClearingWatchpoint::AllocationProfileClearingWatchpoint): Deleted. |
| * runtime/GeneratorFunctionConstructor.h: |
| (JSC::GeneratorFunctionConstructor::create): Deleted. |
| (JSC::GeneratorFunctionConstructor::createStructure): Deleted. |
| * runtime/GeneratorFunctionPrototype.h: |
| (JSC::GeneratorFunctionPrototype::create): Deleted. |
| (JSC::GeneratorFunctionPrototype::createStructure): Deleted. |
| * runtime/GeneratorPrototype.h: |
| (JSC::GeneratorPrototype::create): Deleted. |
| (JSC::GeneratorPrototype::createStructure): Deleted. |
| (JSC::GeneratorPrototype::GeneratorPrototype): Deleted. |
| * runtime/InferredValue.h: |
| (JSC::InferredValue::subspaceFor): Deleted. |
| (JSC::InferredValue::inferredValue): Deleted. |
| (JSC::InferredValue::state const): Deleted. |
| (JSC::InferredValue::isStillValid const): Deleted. |
| (JSC::InferredValue::hasBeenInvalidated const): Deleted. |
| (JSC::InferredValue::add): Deleted. |
| (JSC::InferredValue::notifyWrite): Deleted. |
| (JSC::InferredValue::invalidate): Deleted. |
| * runtime/InspectorInstrumentationObject.h: |
| (JSC::InspectorInstrumentationObject::create): Deleted. |
| (JSC::InspectorInstrumentationObject::createStructure): Deleted. |
| * runtime/IntlCollator.h: |
| (JSC::IntlCollator::boundCompare const): Deleted. |
| * runtime/IntlCollatorConstructor.h: |
| (JSC::IntlCollatorConstructor::collatorStructure const): Deleted. |
| * runtime/IntlCollatorPrototype.h: |
| * runtime/IntlDateTimeFormat.h: |
| (JSC::IntlDateTimeFormat::boundFormat const): Deleted. |
| * runtime/IntlDateTimeFormatConstructor.h: |
| (JSC::IntlDateTimeFormatConstructor::dateTimeFormatStructure const): Deleted. |
| * runtime/IntlDateTimeFormatPrototype.h: |
| * runtime/IntlNumberFormat.h: |
| (JSC::IntlNumberFormat::boundFormat const): Deleted. |
| * runtime/IntlNumberFormatConstructor.h: |
| (JSC::IntlNumberFormatConstructor::numberFormatStructure const): Deleted. |
| * runtime/IntlNumberFormatPrototype.h: |
| * runtime/IntlObject.h: |
| * runtime/IteratorPrototype.h: |
| (JSC::IteratorPrototype::create): Deleted. |
| (JSC::IteratorPrototype::createStructure): Deleted. |
| (JSC::IteratorPrototype::IteratorPrototype): Deleted. |
| * runtime/JSAPIValueWrapper.h: |
| (JSC::JSAPIValueWrapper::value const): Deleted. |
| (JSC::JSAPIValueWrapper::createStructure): Deleted. |
| (JSC::JSAPIValueWrapper::create): Deleted. |
| (JSC::JSAPIValueWrapper::finishCreation): Deleted. |
| (JSC::JSAPIValueWrapper::JSAPIValueWrapper): Deleted. |
| * runtime/JSArrayBufferConstructor.h: |
| (JSC::JSArrayBufferConstructor::sharingMode const): Deleted. |
| * runtime/JSArrayBufferPrototype.h: |
| * runtime/JSAsyncFunction.h: |
| (JSC::JSAsyncFunction::subspaceFor): Deleted. |
| (JSC::JSAsyncFunction::allocationSize): Deleted. |
| (JSC::JSAsyncFunction::createStructure): Deleted. |
| * runtime/JSAsyncGeneratorFunction.h: |
| (JSC::JSAsyncGeneratorFunction::subspaceFor): Deleted. |
| (JSC::JSAsyncGeneratorFunction::allocationSize): Deleted. |
| (JSC::JSAsyncGeneratorFunction::createStructure): Deleted. |
| * runtime/JSBigInt.h: |
| (JSC::JSBigInt::setSign): Deleted. |
| (JSC::JSBigInt::sign const): Deleted. |
| (JSC::JSBigInt::setLength): Deleted. |
| (JSC::JSBigInt::length const): Deleted. |
| * runtime/JSBoundFunction.h: |
| (JSC::JSBoundFunction::subspaceFor): Deleted. |
| (JSC::JSBoundFunction::targetFunction): Deleted. |
| (JSC::JSBoundFunction::boundThis): Deleted. |
| (JSC::JSBoundFunction::boundArgs): Deleted. |
| (JSC::JSBoundFunction::createStructure): Deleted. |
| (JSC::JSBoundFunction::offsetOfTargetFunction): Deleted. |
| (JSC::JSBoundFunction::offsetOfBoundThis): Deleted. |
| * runtime/JSCast.h: |
| (JSC::JSCastingHelpers::FinalTypeDispatcher::inheritsGeneric): |
| (JSC::JSCastingHelpers::inheritsJSTypeImpl): |
| (JSC::JSCastingHelpers::InheritsTraits::inherits): |
| (JSC::JSCastingHelpers::inheritsGenericImpl): Deleted. |
| * runtime/JSCustomGetterSetterFunction.cpp: |
| (JSC::JSCustomGetterSetterFunction::customGetterSetterFunctionCall): |
| * runtime/JSCustomGetterSetterFunction.h: |
| (JSC::JSCustomGetterSetterFunction::subspaceFor): Deleted. |
| (JSC::JSCustomGetterSetterFunction::createStructure): Deleted. |
| (JSC::JSCustomGetterSetterFunction::customGetterSetter const): Deleted. |
| (JSC::JSCustomGetterSetterFunction::isSetter const): Deleted. |
| (JSC::JSCustomGetterSetterFunction::propertyName const): Deleted. |
| * runtime/JSDataView.h: |
| (JSC::JSDataView::possiblySharedBuffer const): Deleted. |
| (JSC::JSDataView::unsharedBuffer const): Deleted. |
| * runtime/JSDataViewPrototype.h: |
| * runtime/JSFixedArray.h: |
| (JSC::JSFixedArray::createStructure): Deleted. |
| (JSC::JSFixedArray::tryCreate): Deleted. |
| (JSC::JSFixedArray::create): Deleted. |
| (JSC::JSFixedArray::createFromArray): Deleted. |
| (JSC::JSFixedArray::get const): Deleted. |
| (JSC::JSFixedArray::set): Deleted. |
| (JSC::JSFixedArray::buffer): Deleted. |
| (JSC::JSFixedArray::buffer const): Deleted. |
| (JSC::JSFixedArray::values const): Deleted. |
| (JSC::JSFixedArray::size const): Deleted. |
| (JSC::JSFixedArray::length const): Deleted. |
| (JSC::JSFixedArray::offsetOfSize): Deleted. |
| (JSC::JSFixedArray::offsetOfData): Deleted. |
| (JSC::JSFixedArray::JSFixedArray): Deleted. |
| (JSC::JSFixedArray::allocationSize): Deleted. |
| * runtime/JSGeneratorFunction.h: |
| (JSC::JSGeneratorFunction::subspaceFor): Deleted. |
| (JSC::JSGeneratorFunction::allocationSize): Deleted. |
| (JSC::JSGeneratorFunction::createStructure): Deleted. |
| * runtime/JSGenericTypedArrayView.h: |
| (JSC::JSGenericTypedArrayView::byteLength const): Deleted. |
| (JSC::JSGenericTypedArrayView::byteSize const): Deleted. |
| (JSC::JSGenericTypedArrayView::typedVector const): Deleted. |
| (JSC::JSGenericTypedArrayView::typedVector): Deleted. |
| (JSC::JSGenericTypedArrayView::canGetIndexQuickly): Deleted. |
| (JSC::JSGenericTypedArrayView::canSetIndexQuickly): Deleted. |
| (JSC::JSGenericTypedArrayView::getIndexQuicklyAsNativeValue): Deleted. |
| (JSC::JSGenericTypedArrayView::getIndexQuicklyAsDouble): Deleted. |
| (JSC::JSGenericTypedArrayView::getIndexQuickly): Deleted. |
| (JSC::JSGenericTypedArrayView::setIndexQuicklyToNativeValue): Deleted. |
| (JSC::JSGenericTypedArrayView::setIndexQuicklyToDouble): Deleted. |
| (JSC::JSGenericTypedArrayView::setIndexQuickly): Deleted. |
| (JSC::JSGenericTypedArrayView::setIndex): Deleted. |
| (JSC::JSGenericTypedArrayView::toAdaptorNativeFromValue): Deleted. |
| (JSC::JSGenericTypedArrayView::toAdaptorNativeFromValueWithoutCoercion): Deleted. |
| (JSC::JSGenericTypedArrayView::sort): Deleted. |
| (JSC::JSGenericTypedArrayView::canAccessRangeQuickly): Deleted. |
| (JSC::JSGenericTypedArrayView::createStructure): Deleted. |
| (JSC::JSGenericTypedArrayView::info): Deleted. |
| (JSC::JSGenericTypedArrayView::purifyArray): Deleted. |
| (JSC::JSGenericTypedArrayView::sortComparison): Deleted. |
| (JSC::JSGenericTypedArrayView::sortFloat): Deleted. |
| * runtime/JSGenericTypedArrayViewConstructor.h: |
| * runtime/JSGenericTypedArrayViewPrototype.h: |
| * runtime/JSInternalPromise.h: |
| * runtime/JSInternalPromiseConstructor.h: |
| * runtime/JSInternalPromisePrototype.h: |
| * runtime/JSMapIterator.h: |
| (JSC::JSMapIterator::createStructure): Deleted. |
| (JSC::JSMapIterator::create): Deleted. |
| (JSC::JSMapIterator::advanceIter): Deleted. |
| (JSC::JSMapIterator::next): Deleted. |
| (JSC::JSMapIterator::nextKeyValue): Deleted. |
| (JSC::JSMapIterator::kind const): Deleted. |
| (JSC::JSMapIterator::iteratedValue const): Deleted. |
| (JSC::JSMapIterator::JSMapIterator): Deleted. |
| (JSC::JSMapIterator::setIterator): Deleted. |
| * runtime/JSModuleLoader.h: |
| (JSC::JSModuleLoader::create): Deleted. |
| (JSC::JSModuleLoader::createStructure): Deleted. |
| * runtime/JSModuleNamespaceObject.h: |
| (JSC::isJSModuleNamespaceObject): Deleted. |
| * runtime/JSModuleRecord.h: |
| (JSC::JSModuleRecord::sourceCode const): Deleted. |
| (JSC::JSModuleRecord::declaredVariables const): Deleted. |
| (JSC::JSModuleRecord::lexicalVariables const): Deleted. |
| * runtime/JSNativeStdFunction.h: |
| (JSC::JSNativeStdFunction::subspaceFor): Deleted. |
| (JSC::JSNativeStdFunction::createStructure): Deleted. |
| (JSC::JSNativeStdFunction::nativeStdFunctionCell): Deleted. |
| * runtime/JSONObject.h: |
| (JSC::JSONObject::create): Deleted. |
| (JSC::JSONObject::createStructure): Deleted. |
| * runtime/JSObject.h: |
| (JSC::JSObject::fillCustomGetterPropertySlot): |
| * runtime/JSScriptFetchParameters.h: |
| (JSC::JSScriptFetchParameters::createStructure): Deleted. |
| (JSC::JSScriptFetchParameters::create): Deleted. |
| (JSC::JSScriptFetchParameters::parameters const): Deleted. |
| (JSC::JSScriptFetchParameters::JSScriptFetchParameters): Deleted. |
| * runtime/JSScriptFetcher.h: |
| (JSC::JSScriptFetcher::createStructure): Deleted. |
| (JSC::JSScriptFetcher::create): Deleted. |
| (JSC::JSScriptFetcher::fetcher const): Deleted. |
| (JSC::JSScriptFetcher::JSScriptFetcher): Deleted. |
| * runtime/JSSetIterator.h: |
| (JSC::JSSetIterator::createStructure): Deleted. |
| (JSC::JSSetIterator::create): Deleted. |
| (JSC::JSSetIterator::advanceIter): Deleted. |
| (JSC::JSSetIterator::next): Deleted. |
| (JSC::JSSetIterator::kind const): Deleted. |
| (JSC::JSSetIterator::iteratedValue const): Deleted. |
| (JSC::JSSetIterator::JSSetIterator): Deleted. |
| (JSC::JSSetIterator::setIterator): Deleted. |
| * runtime/JSSourceCode.h: |
| (JSC::JSSourceCode::createStructure): Deleted. |
| (JSC::JSSourceCode::create): Deleted. |
| (JSC::JSSourceCode::sourceCode const): Deleted. |
| (JSC::JSSourceCode::JSSourceCode): Deleted. |
| * runtime/JSStringIterator.h: |
| (JSC::JSStringIterator::createStructure): Deleted. |
| (JSC::JSStringIterator::create): Deleted. |
| (JSC::JSStringIterator::JSStringIterator): Deleted. |
| * runtime/JSTemplateObjectDescriptor.h: |
| (JSC::isTemplateObjectDescriptor): Deleted. |
| * runtime/JSTypedArrayViewConstructor.h: |
| (JSC::JSTypedArrayViewConstructor::create): Deleted. |
| * runtime/JSTypedArrayViewPrototype.h: |
| * runtime/MapConstructor.h: |
| (JSC::MapConstructor::create): Deleted. |
| (JSC::MapConstructor::createStructure): Deleted. |
| * runtime/MapIteratorPrototype.h: |
| (JSC::MapIteratorPrototype::create): Deleted. |
| (JSC::MapIteratorPrototype::createStructure): Deleted. |
| (JSC::MapIteratorPrototype::MapIteratorPrototype): Deleted. |
| * runtime/MapPrototype.h: |
| (JSC::MapPrototype::create): Deleted. |
| (JSC::MapPrototype::createStructure): Deleted. |
| (JSC::MapPrototype::MapPrototype): Deleted. |
| * runtime/MathObject.h: |
| (JSC::MathObject::create): Deleted. |
| (JSC::MathObject::createStructure): Deleted. |
| * runtime/ModuleLoaderPrototype.h: |
| (JSC::ModuleLoaderPrototype::create): Deleted. |
| (JSC::ModuleLoaderPrototype::createStructure): Deleted. |
| * runtime/NativeErrorConstructor.h: |
| (JSC::NativeErrorConstructor::create): Deleted. |
| (JSC::NativeErrorConstructor::createStructure): Deleted. |
| (JSC::NativeErrorConstructor::errorStructure): Deleted. |
| * runtime/NativeErrorPrototype.h: |
| (JSC::NativeErrorPrototype::create): Deleted. |
| * runtime/NativeStdFunctionCell.h: |
| (JSC::NativeStdFunctionCell::createStructure): Deleted. |
| (JSC::NativeStdFunctionCell::function const): Deleted. |
| * runtime/NullGetterFunction.h: |
| (JSC::NullGetterFunction::create): Deleted. |
| (JSC::NullGetterFunction::createStructure): Deleted. |
| * runtime/NullSetterFunction.h: |
| (JSC::NullSetterFunction::create): Deleted. |
| (JSC::NullSetterFunction::createStructure): Deleted. |
| * runtime/NumberConstructor.h: |
| (JSC::NumberConstructor::create): Deleted. |
| (JSC::NumberConstructor::createStructure): Deleted. |
| (JSC::NumberConstructor::isIntegerImpl): Deleted. |
| * runtime/NumberPrototype.h: |
| (JSC::NumberPrototype::create): Deleted. |
| (JSC::NumberPrototype::createStructure): Deleted. |
| * runtime/ObjectConstructor.h: |
| (JSC::ObjectConstructor::create): Deleted. |
| (JSC::ObjectConstructor::createStructure): Deleted. |
| * runtime/ObjectPrototype.h: |
| (JSC::ObjectPrototype::createStructure): Deleted. |
| * runtime/ProxyConstructor.h: |
| (JSC::ProxyConstructor::createStructure): Deleted. |
| * runtime/ProxyRevoke.h: |
| (JSC::ProxyRevoke::createStructure): Deleted. |
| (JSC::ProxyRevoke::proxy): Deleted. |
| (JSC::ProxyRevoke::setProxyToNull): Deleted. |
| * runtime/ReflectObject.h: |
| (JSC::ReflectObject::create): Deleted. |
| (JSC::ReflectObject::createStructure): Deleted. |
| * runtime/RegExpConstructor.cpp: |
| (JSC::regExpConstructorDollar): |
| (JSC::regExpConstructorInput): |
| (JSC::regExpConstructorMultiline): |
| (JSC::regExpConstructorLastMatch): |
| (JSC::regExpConstructorLastParen): |
| (JSC::regExpConstructorLeftContext): |
| (JSC::regExpConstructorRightContext): |
| * runtime/RegExpConstructor.h: |
| (JSC::RegExpConstructor::create): Deleted. |
| (JSC::RegExpConstructor::createStructure): Deleted. |
| (JSC::RegExpConstructor::setMultiline): Deleted. |
| (JSC::RegExpConstructor::multiline const): Deleted. |
| (JSC::RegExpConstructor::setInput): Deleted. |
| (JSC::RegExpConstructor::input): Deleted. |
| (JSC::RegExpConstructor::offsetOfCachedResult): Deleted. |
| (JSC::asRegExpConstructor): Deleted. |
| * runtime/RegExpPrototype.h: |
| (JSC::RegExpPrototype::create): Deleted. |
| (JSC::RegExpPrototype::createStructure): Deleted. |
| (JSC::RegExpPrototype::emptyRegExp const): Deleted. |
| * runtime/SetConstructor.h: |
| (JSC::SetConstructor::create): Deleted. |
| (JSC::SetConstructor::createStructure): Deleted. |
| * runtime/SetIteratorPrototype.h: |
| (JSC::SetIteratorPrototype::create): Deleted. |
| (JSC::SetIteratorPrototype::createStructure): Deleted. |
| (JSC::SetIteratorPrototype::SetIteratorPrototype): Deleted. |
| * runtime/SetPrototype.h: |
| (JSC::SetPrototype::create): Deleted. |
| (JSC::SetPrototype::createStructure): Deleted. |
| (JSC::SetPrototype::SetPrototype): Deleted. |
| * runtime/StringConstructor.h: |
| (JSC::StringConstructor::create): Deleted. |
| (JSC::StringConstructor::createStructure): Deleted. |
| * runtime/StringIteratorPrototype.h: |
| (JSC::StringIteratorPrototype::create): Deleted. |
| (JSC::StringIteratorPrototype::createStructure): Deleted. |
| (JSC::StringIteratorPrototype::StringIteratorPrototype): Deleted. |
| * runtime/StringPrototype.h: |
| (JSC::StringPrototype::createStructure): Deleted. |
| * runtime/SymbolConstructor.h: |
| (JSC::SymbolConstructor::create): Deleted. |
| (JSC::SymbolConstructor::createStructure): Deleted. |
| * runtime/SymbolObject.h: |
| (JSC::SymbolObject::create): Deleted. |
| (JSC::SymbolObject::internalValue const): Deleted. |
| (JSC::SymbolObject::createStructure): Deleted. |
| * runtime/SymbolPrototype.h: |
| (JSC::SymbolPrototype::create): Deleted. |
| (JSC::SymbolPrototype::createStructure): Deleted. |
| * runtime/WeakMapConstructor.h: |
| (JSC::WeakMapConstructor::create): Deleted. |
| (JSC::WeakMapConstructor::createStructure): Deleted. |
| * runtime/WeakMapPrototype.h: |
| (JSC::WeakMapPrototype::create): Deleted. |
| (JSC::WeakMapPrototype::createStructure): Deleted. |
| (JSC::WeakMapPrototype::WeakMapPrototype): Deleted. |
| * runtime/WeakSetConstructor.h: |
| (JSC::WeakSetConstructor::create): Deleted. |
| (JSC::WeakSetConstructor::createStructure): Deleted. |
| * runtime/WeakSetPrototype.h: |
| (JSC::WeakSetPrototype::create): Deleted. |
| (JSC::WeakSetPrototype::createStructure): Deleted. |
| (JSC::WeakSetPrototype::WeakSetPrototype): Deleted. |
| * tools/JSDollarVM.h: |
| (JSC::JSDollarVM::createStructure): Deleted. |
| (JSC::JSDollarVM::create): Deleted. |
| (JSC::JSDollarVM::JSDollarVM): Deleted. |
| * wasm/js/JSWebAssembly.h: |
| * wasm/js/JSWebAssemblyCompileError.h: |
| (JSC::JSWebAssemblyCompileError::create): Deleted. |
| * wasm/js/JSWebAssemblyInstance.h: |
| (JSC::JSWebAssemblyInstance::instance): Deleted. |
| (JSC::JSWebAssemblyInstance::moduleNamespaceObject): Deleted. |
| (JSC::JSWebAssemblyInstance::webAssemblyToJSCallee): Deleted. |
| (JSC::JSWebAssemblyInstance::memory): Deleted. |
| (JSC::JSWebAssemblyInstance::setMemory): Deleted. |
| (JSC::JSWebAssemblyInstance::memoryMode): Deleted. |
| (JSC::JSWebAssemblyInstance::table): Deleted. |
| (JSC::JSWebAssemblyInstance::setTable): Deleted. |
| (JSC::JSWebAssemblyInstance::offsetOfPoisonedInstance): Deleted. |
| (JSC::JSWebAssemblyInstance::offsetOfPoisonedCallee): Deleted. |
| (JSC::JSWebAssemblyInstance::module const): Deleted. |
| * wasm/js/JSWebAssemblyLinkError.h: |
| (JSC::JSWebAssemblyLinkError::create): Deleted. |
| * wasm/js/JSWebAssemblyMemory.h: |
| (JSC::JSWebAssemblyMemory::subspaceFor): Deleted. |
| (JSC::JSWebAssemblyMemory::memory): Deleted. |
| * wasm/js/JSWebAssemblyModule.h: |
| * wasm/js/JSWebAssemblyRuntimeError.h: |
| (JSC::JSWebAssemblyRuntimeError::create): Deleted. |
| * wasm/js/JSWebAssemblyTable.h: |
| (JSC::JSWebAssemblyTable::isValidLength): Deleted. |
| (JSC::JSWebAssemblyTable::maximum const): Deleted. |
| (JSC::JSWebAssemblyTable::length const): Deleted. |
| (JSC::JSWebAssemblyTable::allocatedLength const): Deleted. |
| (JSC::JSWebAssemblyTable::table): Deleted. |
| * wasm/js/WebAssemblyCompileErrorConstructor.h: |
| * wasm/js/WebAssemblyCompileErrorPrototype.h: |
| * wasm/js/WebAssemblyInstanceConstructor.h: |
| * wasm/js/WebAssemblyInstancePrototype.h: |
| * wasm/js/WebAssemblyLinkErrorConstructor.h: |
| * wasm/js/WebAssemblyLinkErrorPrototype.h: |
| * wasm/js/WebAssemblyMemoryConstructor.h: |
| * wasm/js/WebAssemblyMemoryPrototype.h: |
| * wasm/js/WebAssemblyModuleConstructor.h: |
| * wasm/js/WebAssemblyModulePrototype.h: |
| * wasm/js/WebAssemblyModuleRecord.h: |
| * wasm/js/WebAssemblyPrototype.h: |
| * wasm/js/WebAssemblyRuntimeErrorConstructor.h: |
| * wasm/js/WebAssemblyRuntimeErrorPrototype.h: |
| * wasm/js/WebAssemblyTableConstructor.h: |
| * wasm/js/WebAssemblyTablePrototype.h: |
| |
| 2018-03-07 Filip Pizlo <fpizlo@apple.com> |
| |
| Make it possible to randomize register allocation |
| https://bugs.webkit.org/show_bug.cgi?id=183416 |
| |
| Reviewed by Keith Miller. |
| |
| This is disabled by default for now, because it reveals a regalloc bug in wasm. |
| |
| * b3/air/AirCode.cpp: |
| (JSC::B3::Air::Code::Code): |
| * b3/air/AirCode.h: |
| (JSC::B3::Air::Code::weakRandom): |
| * runtime/Options.h: |
| |
| 2018-03-08 Yusuke Suzuki <utatane.tea@gmail.com> |
| |
| [JSC] Add inherits<T>(VM&) leveraging JSCast fast path |
| https://bugs.webkit.org/show_bug.cgi?id=183429 |
| |
| Reviewed by Mark Lam. |
| |
| Add new member function, JSCell::inherits<T>(VM&) and JSValue::inherits<T>(VM&). |
| They depends on jsDynamicCast<T> implementation and leverage JSType-based fast |
| paths defined in JSCast.h. We extract checking part as `JSCastingHelpers::inherit` |
| and construct jsDynamicCast and JSCell::inherits based on this. |
| |
| And we remove several unnecessary casting functions (asRegExpObject, asDateInstance etc.). |
| In addition, we add jsDynamicCast fast path for RegExpObject by using existing RegExpObjectType. |
| |
| We also fix the implementation of jsDynamicCast for JSObject since it uses LastJSCObjectType. |
| The embedder can add their extended object types after that. |
| |
| * API/JSObjectRef.cpp: |
| (JSObjectGetPrivateProperty): |
| (JSObjectSetPrivateProperty): |
| (JSObjectDeletePrivateProperty): |
| * API/JSValue.mm: |
| (isDate): |
| (isArray): |
| * API/JSValueRef.cpp: |
| (JSValueIsArray): |
| (JSValueIsDate): |
| (JSValueIsObjectOfClass): |
| * API/JSWeakObjectMapRefPrivate.cpp: |
| * API/JSWrapperMap.mm: |
| (tryUnwrapObjcObject): |
| * API/ObjCCallbackFunction.mm: |
| (tryUnwrapConstructor): |
| * dfg/DFGByteCodeParser.cpp: |
| (JSC::DFG::ByteCodeParser::parseBlock): |
| * dfg/DFGOperations.cpp: |
| * ftl/FTLLowerDFGToB3.cpp: |
| (JSC::FTL::DFG::LowerDFGToB3::compileOverridesHasInstance): |
| (JSC::FTL::DFG::LowerDFGToB3::compileNewRegexp): |
| * ftl/FTLOperations.cpp: |
| (JSC::FTL::operationMaterializeObjectInOSR): |
| * inspector/JSInjectedScriptHost.cpp: |
| (Inspector::JSInjectedScriptHost::subtype): |
| (Inspector::JSInjectedScriptHost::functionDetails): |
| * inspector/agents/InspectorHeapAgent.cpp: |
| (Inspector::InspectorHeapAgent::getPreview): |
| * interpreter/Interpreter.cpp: |
| (JSC::notifyDebuggerOfUnwinding): |
| * interpreter/ShadowChicken.cpp: |
| (JSC::ShadowChicken::update): |
| * jit/JIT.cpp: |
| (JSC::JIT::privateCompileMainPass): |
| * jit/JITOperations.cpp: |
| (JSC::operationNewFunctionCommon): |
| * jsc.cpp: |
| (checkException): |
| * runtime/BooleanObject.h: |
| (JSC::asBooleanObject): Deleted. |
| * runtime/BooleanPrototype.cpp: |
| (JSC::booleanProtoFuncToString): |
| (JSC::booleanProtoFuncValueOf): |
| * runtime/DateConstructor.cpp: |
| (JSC::constructDate): |
| * runtime/DateInstance.h: |
| (JSC::asDateInstance): Deleted. |
| * runtime/DatePrototype.cpp: |
| (JSC::formateDateInstance): |
| (JSC::dateProtoFuncToISOString): |
| (JSC::dateProtoFuncToLocaleString): |
| (JSC::dateProtoFuncToLocaleDateString): |
| (JSC::dateProtoFuncToLocaleTimeString): |
| (JSC::dateProtoFuncGetTime): |
| (JSC::dateProtoFuncGetFullYear): |
| (JSC::dateProtoFuncGetUTCFullYear): |
| (JSC::dateProtoFuncGetMonth): |
| (JSC::dateProtoFuncGetUTCMonth): |
| (JSC::dateProtoFuncGetDate): |
| (JSC::dateProtoFuncGetUTCDate): |
| (JSC::dateProtoFuncGetDay): |
| (JSC::dateProtoFuncGetUTCDay): |
| (JSC::dateProtoFuncGetHours): |
| (JSC::dateProtoFuncGetUTCHours): |
| (JSC::dateProtoFuncGetMinutes): |
| (JSC::dateProtoFuncGetUTCMinutes): |
| (JSC::dateProtoFuncGetSeconds): |
| (JSC::dateProtoFuncGetUTCSeconds): |
| (JSC::dateProtoFuncGetMilliSeconds): |
| (JSC::dateProtoFuncGetUTCMilliseconds): |
| (JSC::dateProtoFuncGetTimezoneOffset): |
| (JSC::dateProtoFuncSetTime): |
| (JSC::setNewValueFromTimeArgs): |
| (JSC::setNewValueFromDateArgs): |
| (JSC::dateProtoFuncSetYear): |
| (JSC::dateProtoFuncGetYear): |
| * runtime/ExceptionHelpers.cpp: |
| (JSC::isTerminatedExecutionException): |
| * runtime/FunctionPrototype.cpp: |
| (JSC::functionProtoFuncToString): |
| * runtime/InternalFunction.h: |
| (JSC::asInternalFunction): |
| * runtime/JSArray.h: |
| (JSC::asArray): |
| * runtime/JSCJSValue.cpp: |
| (JSC::JSValue::dumpForBacktrace const): |
| * runtime/JSCJSValue.h: |
| * runtime/JSCJSValueInlines.h: |
| (JSC::JSValue::inherits const): |
| * runtime/JSCast.h: |
| (JSC::JSCastingHelpers::inheritsGenericImpl): |
| (JSC::JSCastingHelpers::inheritsJSTypeImpl): |
| (JSC::JSCastingHelpers::InheritsTraits::inherits): |
| (JSC::JSCastingHelpers::inherits): |
| (JSC::jsDynamicCast): |
| (JSC::JSCastingHelpers::jsDynamicCastGenericImpl): Deleted. |
| (JSC::JSCastingHelpers::jsDynamicCastJSTypeImpl): Deleted. |
| (JSC::JSCastingHelpers::JSDynamicCastTraits::cast): Deleted. |
| * runtime/JSCell.h: |
| * runtime/JSCellInlines.h: |
| (JSC::JSCell::inherits const): |
| * runtime/JSFunction.cpp: |
| (JSC::RetrieveCallerFunctionFunctor::operator() const): |
| (JSC::JSFunction::callerGetter): |
| (JSC::JSFunction::getOwnNonIndexPropertyNames): |
| (JSC::JSFunction::reifyLazyBoundNameIfNeeded): |
| * runtime/JSGlobalObject.cpp: |
| (JSC::enqueueJob): |
| * runtime/JSGlobalObject.h: |
| (JSC::asGlobalObject): Deleted. |
| * runtime/JSInternalPromiseDeferred.cpp: |
| (JSC::JSInternalPromiseDeferred::create): |
| * runtime/JSLexicalEnvironment.h: |
| (JSC::asActivation): |
| * runtime/JSONObject.cpp: |
| (JSC::unwrapBoxedPrimitive): |
| (JSC::Stringifier::Stringifier): |
| (JSC::Walker::walk): |
| * runtime/JSPromise.cpp: |
| (JSC::JSPromise::resolve): |
| * runtime/JSPromiseDeferred.cpp: |
| (JSC::JSPromiseDeferred::create): |
| * runtime/JSType.h: |
| * runtime/ProxyObject.h: |
| (JSC::ProxyObject::create): Deleted. |
| (JSC::ProxyObject::createStructure): Deleted. |
| (JSC::ProxyObject::target const): Deleted. |
| (JSC::ProxyObject::handler const): Deleted. |
| * runtime/RegExpConstructor.cpp: |
| (JSC::constructRegExp): |
| * runtime/RegExpConstructor.h: |
| (JSC::asRegExpConstructor): |
| (JSC::isRegExp): |
| * runtime/RegExpObject.cpp: |
| (JSC::RegExpObject::finishCreation): |
| (JSC::RegExpObject::getOwnPropertySlot): |
| (JSC::RegExpObject::defineOwnProperty): |
| (JSC::regExpObjectSetLastIndexStrict): |
| (JSC::regExpObjectSetLastIndexNonStrict): |
| (JSC::RegExpObject::put): |
| * runtime/RegExpObject.h: |
| (JSC::RegExpObject::create): Deleted. |
| (JSC::RegExpObject::setRegExp): Deleted. |
| (JSC::RegExpObject::regExp const): Deleted. |
| (JSC::RegExpObject::setLastIndex): Deleted. |
| (JSC::RegExpObject::getLastIndex const): Deleted. |
| (JSC::RegExpObject::test): Deleted. |
| (JSC::RegExpObject::testInline): Deleted. |
| (JSC::RegExpObject::createStructure): Deleted. |
| (JSC::RegExpObject::offsetOfRegExp): Deleted. |
| (JSC::RegExpObject::offsetOfLastIndex): Deleted. |
| (JSC::RegExpObject::offsetOfLastIndexIsWritable): Deleted. |
| (JSC::RegExpObject::allocationSize): Deleted. |
| (JSC::asRegExpObject): Deleted. |
| * runtime/RegExpPrototype.cpp: |
| (JSC::regExpProtoFuncTestFast): |
| (JSC::regExpProtoFuncExec): |
| (JSC::regExpProtoFuncMatchFast): |
| (JSC::regExpProtoFuncCompile): |
| (JSC::regExpProtoGetterGlobal): |
| (JSC::regExpProtoGetterIgnoreCase): |
| (JSC::regExpProtoGetterMultiline): |
| (JSC::regExpProtoGetterDotAll): |
| (JSC::regExpProtoGetterSticky): |
| (JSC::regExpProtoGetterUnicode): |
| (JSC::regExpProtoGetterSource): |
| (JSC::regExpProtoFuncSearchFast): |
| (JSC::regExpProtoFuncSplitFast): |
| * runtime/StringObject.h: |
| (JSC::asStringObject): Deleted. |
| * runtime/StringPrototype.cpp: |
| (JSC::replaceUsingRegExpSearch): |
| (JSC::replace): |
| (JSC::stringProtoFuncReplaceUsingRegExp): |
| (JSC::stringProtoFuncToString): |
| * runtime/SymbolPrototype.cpp: |
| (JSC::symbolProtoFuncToString): |
| (JSC::symbolProtoFuncValueOf): |
| * tools/JSDollarVM.cpp: |
| (WTF::customGetValue): |
| (WTF::customSetValue): |
| * wasm/js/JSWebAssemblyHelpers.h: |
| (JSC::isWebAssemblyHostFunction): |
| * wasm/js/WebAssemblyWrapperFunction.cpp: |
| (JSC::WebAssemblyWrapperFunction::create): |
| |
| 2018-03-07 Tim Horton <timothy_horton@apple.com> |
| |
| Sort and separate FeatureDefines.xcconfig |
| https://bugs.webkit.org/show_bug.cgi?id=183427 |
| |
| Reviewed by Dan Bernstein. |
| |
| * Configurations/FeatureDefines.xcconfig: |
| Sort and split FeatureDefines into paragraphs |
| (to make it easier to sort later). |
| |
| 2018-03-07 Keith Miller <keith_miller@apple.com> |
| |
| Unreviewed, fix 32-bit build. |
| |
| * dfg/DFGSpeculativeJIT.cpp: |
| (JSC::DFG::SpeculativeJIT::compileCallDOMGetter): |
| |
| 2018-03-07 Keith Miller <keith_miller@apple.com> |
| |
| Meta-program setupArguments and callOperation |
| https://bugs.webkit.org/show_bug.cgi?id=183263 |
| |
| Rubber-stamped by Filip Pizlo. |
| |
| This patch removes all the custom overrides of callOperation and setupArguments |
| throughout the JITs. In their place there is a new setupArguments that marshalls |
| the arguments into place based on the type of the operation's function pointer. |
| There were a couple of design choices in the implementation of setupArguments: |
| |
| 1) We assume that no TrustedImm floating point values are passed. |
| 2) If ExecState* is the first argument the callFrameRegister should be marshalled implicitly. |
| 3) Types should not be implicitly converted (with the exception of DFG::RegisteredStructure -> Structure*) |
| |
| The new callOperation/setupArguments do their best to make sure |
| it's hard to call a function with the wrong parameters. They will |
| only try to pattern match if the types match up with the next |
| passed argument. Additionally, the base case should static_assert |
| of the number of inferred arguments does not match the arity of |
| the operation's function pointer. |
| |
| * assembler/AbstractMacroAssembler.h: |
| (JSC::AbstractMacroAssembler::TrustedImmPtr::TrustedImmPtr): |
| (JSC::AbstractMacroAssembler::TrustedImmPtr::asPtr): |
| * assembler/MacroAssembler.h: |
| (JSC::MacroAssembler::poke): |
| (JSC::MacroAssembler::move): |
| * assembler/MacroAssemblerARM64.h: |
| (JSC::MacroAssemblerARM64::swap): |
| * assembler/MacroAssemblerX86.h: |
| (JSC::MacroAssemblerX86::storeDouble): |
| * assembler/MacroAssemblerX86Common.h: |
| (JSC::MacroAssemblerX86Common::loadDouble): |
| (JSC::MacroAssemblerX86Common::swap): |
| (JSC::MacroAssemblerX86Common::move): |
| * bytecode/AccessCase.cpp: |
| (JSC::AccessCase::generateImpl): |
| * bytecode/AccessCaseSnippetParams.cpp: |
| (JSC::SlowPathCallGeneratorWithArguments::generateImpl): |
| * bytecode/PolymorphicAccess.cpp: |
| (JSC::AccessGenerationState::emitExplicitExceptionHandler): |
| * dfg/DFGCallArrayAllocatorSlowPathGenerator.h: |
| * dfg/DFGNode.h: |
| * dfg/DFGOSRExit.cpp: |
| (JSC::DFG::OSRExit::emitRestoreArguments): |
| * dfg/DFGOSRExitCompilerCommon.cpp: |
| (JSC::DFG::osrWriteBarrier): |
| * dfg/DFGOperations.cpp: |
| * dfg/DFGOperations.h: |
| * dfg/DFGSlowPathGenerator.h: |
| * dfg/DFGSpeculativeJIT.cpp: |
| (JSC::DFG::SpeculativeJIT::compileArithDoubleUnaryOp): |
| (JSC::DFG::SpeculativeJIT::compileArithMod): |
| (JSC::DFG::SpeculativeJIT::compileArithRounding): |
| (JSC::DFG::SpeculativeJIT::compileArithSqrt): |
| (JSC::DFG::SpeculativeJIT::compileCreateActivation): |
| (JSC::DFG::SpeculativeJIT::compileCallDOMGetter): |
| (JSC::DFG::SpeculativeJIT::emitSwitchStringOnString): |
| * dfg/DFGSpeculativeJIT.h: |
| (JSC::DFG::SpeculativeJIT::TrustedImmPtr::TrustedImmPtr): |
| (JSC::DFG::SpeculativeJIT::TrustedImmPtr::operator MacroAssembler::TrustedImm const): |
| (JSC::DFG::SpeculativeJIT::initConstantInfo): |
| (JSC::DFG::SpeculativeJIT::callOperation): |
| (JSC::DFG::SpeculativeJIT::callOperationWithCallFrameRollbackOnException): |
| (JSC::DFG::SpeculativeJIT::callCustomGetter): Deleted. |
| * dfg/DFGSpeculativeJIT32_64.cpp: |
| (JSC::DFG::SpeculativeJIT::cachedGetById): |
| (JSC::DFG::SpeculativeJIT::cachedGetByIdWithThis): |
| (JSC::DFG::SpeculativeJIT::cachedPutById): |
| (JSC::DFG::SpeculativeJIT::emitCall): |
| (JSC::DFG::SpeculativeJIT::compileContiguousPutByVal): |
| (JSC::DFG::SpeculativeJIT::compile): |
| * dfg/DFGSpeculativeJIT64.cpp: |
| (JSC::DFG::SpeculativeJIT::emitCall): |
| (JSC::DFG::SpeculativeJIT::compile): |
| * ftl/FTLLowerDFGToB3.cpp: |
| (JSC::FTL::DFG::LowerDFGToB3::compileCallOrConstructVarargsSpread): |
| (JSC::FTL::DFG::LowerDFGToB3::compileCallOrConstructVarargs): |
| (JSC::FTL::DFG::LowerDFGToB3::compileCallEval): |
| * ftl/FTLOSRExitCompiler.cpp: |
| (JSC::FTL::compileStub): |
| * ftl/FTLSlowPathCall.h: |
| (JSC::FTL::callOperation): |
| * jit/AssemblyHelpers.cpp: |
| (JSC::AssemblyHelpers::emitStoreStructureWithTypeInfo): |
| * jit/CCallHelpers.cpp: |
| (JSC::CCallHelpers::ensureShadowChickenPacket): |
| * jit/CCallHelpers.h: |
| (JSC::CCallHelpers::setupArgument): |
| (JSC::CCallHelpers::setupStubArgs): |
| (JSC::CCallHelpers::ArgCollection::ArgCollection): |
| (JSC::CCallHelpers::ArgCollection::pushRegArg): |
| (JSC::CCallHelpers::ArgCollection::addGPRArg): |
| (JSC::CCallHelpers::ArgCollection::addStackArg): |
| (JSC::CCallHelpers::ArgCollection::addPoke): |
| (JSC::CCallHelpers::ArgCollection::argCount): |
| (JSC::CCallHelpers::clampArrayToSize): |
| (JSC::CCallHelpers::pokeForArgument): |
| (JSC::CCallHelpers::marshallArgumentRegister): |
| (JSC::CCallHelpers::setupArgumentsImpl): |
| (JSC::CCallHelpers::std::is_integral<CURRENT_ARGUMENT_TYPE>::value): |
| (JSC::CCallHelpers::std::is_pointer<CURRENT_ARGUMENT_TYPE>::value): |
| (JSC::CCallHelpers::setupArguments): |
| (JSC::CCallHelpers::prepareForTailCallSlow): |
| (JSC::CCallHelpers::setupArgumentsWithExecState): Deleted. |
| (JSC::CCallHelpers::resetCallArguments): Deleted. |
| (JSC::CCallHelpers::addCallArgument): Deleted. |
| (JSC::CCallHelpers::setupArgumentsExecState): Deleted. |
| (JSC::CCallHelpers::setupTwoStubArgsGPR): Deleted. |
| (JSC::CCallHelpers::setupThreeStubArgsGPR): Deleted. |
| (JSC::CCallHelpers::setupFourStubArgsGPR): Deleted. |
| (JSC::CCallHelpers::setupFiveStubArgsGPR): Deleted. |
| (JSC::CCallHelpers::setupTwoStubArgsFPR): Deleted. |
| (JSC::CCallHelpers::setupStubArguments): Deleted. |
| (JSC::CCallHelpers::setupArgumentsWithExecStateForCallWithSlowPathReturnType): Deleted. |
| (JSC::CCallHelpers::setupStubArguments134): Deleted. |
| (JSC::CCallHelpers::setupStubArgsGPR): Deleted. |
| * jit/FPRInfo.h: |
| (JSC::toInfoFromReg): |
| * jit/GPRInfo.h: |
| (JSC::JSValueRegs::JSValueRegs): |
| (JSC::toInfoFromReg): |
| * jit/JIT.h: |
| (JSC::JIT::callOperation): |
| (JSC::JIT::callOperationWithProfile): |
| (JSC::JIT::callOperationWithResult): |
| (JSC::JIT::callOperationNoExceptionCheck): |
| (JSC::JIT::callOperationWithCallFrameRollbackOnException): |
| * jit/JITArithmetic.cpp: |
| (JSC::JIT::emitMathICFast): |
| (JSC::JIT::emitMathICSlow): |
| * jit/JITArithmetic32_64.cpp: |
| (JSC::JIT::emit_compareAndJumpSlow): |
| * jit/JITCall32_64.cpp: |
| (JSC::JIT::compileSetupVarargsFrame): |
| * jit/JITInlines.h: |
| (JSC::JIT::callOperation): Deleted. |
| (JSC::JIT::callOperationNoExceptionCheck): Deleted. |
| (JSC::JIT::callOperationWithCallFrameRollbackOnException): Deleted. |
| * jit/JITOpcodes.cpp: |
| (JSC::JIT::emit_op_new_array_with_size): |
| * jit/JITOpcodes32_64.cpp: |
| (JSC::JIT::emitSlow_op_instanceof): |
| (JSC::JIT::emitSlow_op_instanceof_custom): |
| (JSC::JIT::emit_op_set_function_name): |
| (JSC::JIT::emitSlow_op_eq): |
| (JSC::JIT::emitSlow_op_neq): |
| (JSC::JIT::emit_op_throw): |
| (JSC::JIT::emit_op_switch_imm): |
| (JSC::JIT::emit_op_switch_char): |
| (JSC::JIT::emit_op_switch_string): |
| (JSC::JIT::emitSlow_op_has_indexed_property): |
| * jit/JITOperations.cpp: |
| * jit/JITOperations.h: |
| * jit/JITPropertyAccess.cpp: |
| (JSC::JIT::emitGetByValWithCachedId): |
| (JSC::JIT::emitSlow_op_get_by_id): |
| (JSC::JIT::emitSlow_op_get_by_id_with_this): |
| (JSC::JIT::emitSlow_op_get_from_scope): |
| * jit/JITPropertyAccess32_64.cpp: |
| (JSC::JIT::emit_op_put_by_index): |
| (JSC::JIT::emit_op_put_setter_by_id): |
| (JSC::JIT::emit_op_put_getter_setter_by_id): |
| (JSC::JIT::emit_op_put_getter_by_val): |
| (JSC::JIT::emit_op_put_setter_by_val): |
| (JSC::JIT::emit_op_del_by_id): |
| (JSC::JIT::emit_op_del_by_val): |
| (JSC::JIT::emitGetByValWithCachedId): |
| (JSC::JIT::emitSlow_op_get_by_val): |
| (JSC::JIT::emitPutByValWithCachedId): |
| (JSC::JIT::emitSlow_op_put_by_val): |
| (JSC::JIT::emitSlow_op_try_get_by_id): |
| (JSC::JIT::emitSlow_op_get_by_id): |
| (JSC::JIT::emitSlow_op_get_by_id_with_this): |
| (JSC::JIT::emitSlow_op_put_by_id): |
| (JSC::JIT::emitSlow_op_get_from_scope): |
| * jit/RegisterSet.h: |
| (JSC::RegisterSet::RegisterSet): |
| * jit/ThunkGenerators.cpp: |
| (JSC::throwExceptionFromCallSlowPathGenerator): |
| (JSC::slowPathFor): |
| * jsc.cpp: |
| (GlobalObject::finishCreation): |
| (functionBreakpoint): |
| * runtime/JSCJSValue.h: |
| * wasm/js/WasmToJS.cpp: |
| (JSC::Wasm::wasmToJS): |
| |
| 2018-03-07 Mark Lam <mark.lam@apple.com> |
| |
| Rename ProtoCallFrame::arityMissMatch to hasArityMismatch. |
| https://bugs.webkit.org/show_bug.cgi?id=183414 |
| <rdar://problem/38231678> |
| |
| Reviewed by Michael Saboff. |
| |
| * interpreter/ProtoCallFrame.cpp: |
| (JSC::ProtoCallFrame::init): |
| * interpreter/ProtoCallFrame.h: |
| |
| 2018-03-07 Mark Lam <mark.lam@apple.com> |
| |
| Simplify the variants of FunctionPtr constructors. |
| https://bugs.webkit.org/show_bug.cgi?id=183399 |
| <rdar://problem/38212980> |
| |
| Reviewed by Yusuke Suzuki. |
| |
| * assembler/MacroAssemblerCodeRef.h: |
| (JSC::FunctionPtr::FunctionPtr): |
| |
| 2018-03-06 Filip Pizlo <fpizlo@apple.com> |
| |
| MarkedArgumentsBuffer should allocate from the JSValue Gigacage |
| https://bugs.webkit.org/show_bug.cgi?id=183377 |
| |
| Reviewed by Michael Saboff. |
| |
| That prevents it from being used to pivot UAF on malloc memory into corruption in the JS heap. |
| |
| * runtime/ArgList.cpp: |
| (JSC::MarkedArgumentBuffer::expandCapacity): |
| |
| 2018-03-07 Mark Lam <mark.lam@apple.com> |
| |
| Add support for ARM64E. |
| https://bugs.webkit.org/show_bug.cgi?id=183398 |
| <rdar://problem/38212621> |
| |
| Reviewed by Michael Saboff. |
| |
| * assembler/MacroAssembler.h: |
| * llint/LLIntOfflineAsmConfig.h: |
| * llint/LowLevelInterpreter.asm: |
| * llint/LowLevelInterpreter64.asm: |
| * offlineasm/backends.rb: |
| |
| 2018-03-07 Yusuke Suzuki <utatane.tea@gmail.com> |
| |
| HTML `pattern` attribute should set `u` flag for regular expressions |
| https://bugs.webkit.org/show_bug.cgi?id=151598 |
| |
| Reviewed by Chris Dumez. |
| |
| Add UnicodeMode for JSC::Yarr::RegularExpression. |
| |
| * yarr/RegularExpression.cpp: |
| (JSC::Yarr::RegularExpression::Private::create): |
| (JSC::Yarr::RegularExpression::Private::Private): |
| (JSC::Yarr::RegularExpression::Private::compile): |
| (JSC::Yarr::RegularExpression::RegularExpression): |
| * yarr/RegularExpression.h: |
| |
| 2018-03-07 Yusuke Suzuki <utatane.tea@gmail.com> |
| |
| [JSC] Add more JSType based fast path for jsDynamicCast |
| https://bugs.webkit.org/show_bug.cgi?id=183403 |
| |
| Reviewed by Mark Lam. |
| |
| We add more JSType based fast path for jsDynamicCast. Basically, we add miscellaneous JSTypes which |
| are used for jsDynamicCast in JSC, arguments types, and scope types. |
| |
| We also add ClassInfo to JSScope and JSSegmentedVariableObject since they are used with jsDynamicCast. |
| |
| * jit/JITOperations.cpp: |
| * llint/LLIntSlowPaths.cpp: |
| (JSC::LLInt::setUpCall): |
| * runtime/ClonedArguments.h: |
| (JSC::ClonedArguments::specialsMaterialized const): Deleted. |
| * runtime/DirectArguments.h: |
| (JSC::DirectArguments::subspaceFor): Deleted. |
| (JSC::DirectArguments::internalLength const): Deleted. |
| (JSC::DirectArguments::length const): Deleted. |
| (JSC::DirectArguments::isMappedArgument const): Deleted. |
| (JSC::DirectArguments::isMappedArgumentInDFG const): Deleted. |
| (JSC::DirectArguments::getIndexQuickly const): Deleted. |
| (JSC::DirectArguments::setIndexQuickly): Deleted. |
| (JSC::DirectArguments::callee): Deleted. |
| (JSC::DirectArguments::argument): Deleted. |
| (JSC::DirectArguments::overrodeThings const): Deleted. |
| (JSC::DirectArguments::initModifiedArgumentsDescriptorIfNecessary): Deleted. |
| (JSC::DirectArguments::setModifiedArgumentDescriptor): Deleted. |
| (JSC::DirectArguments::isModifiedArgumentDescriptor): Deleted. |
| (JSC::DirectArguments::offsetOfCallee): Deleted. |
| (JSC::DirectArguments::offsetOfLength): Deleted. |
| (JSC::DirectArguments::offsetOfMinCapacity): Deleted. |
| (JSC::DirectArguments::offsetOfMappedArguments): Deleted. |
| (JSC::DirectArguments::offsetOfModifiedArgumentsDescriptor): Deleted. |
| (JSC::DirectArguments::storageOffset): Deleted. |
| (JSC::DirectArguments::offsetOfSlot): Deleted. |
| (JSC::DirectArguments::allocationSize): Deleted. |
| (JSC::DirectArguments::storage): Deleted. |
| * runtime/JSCast.h: |
| * runtime/JSGlobalLexicalEnvironment.h: |
| (JSC::JSGlobalLexicalEnvironment::create): Deleted. |
| (JSC::JSGlobalLexicalEnvironment::isEmpty const): Deleted. |
| (JSC::JSGlobalLexicalEnvironment::createStructure): Deleted. |
| (JSC::JSGlobalLexicalEnvironment::JSGlobalLexicalEnvironment): Deleted. |
| * runtime/JSGlobalObject.cpp: |
| (JSC::JSGlobalObject::finishCreation): |
| * runtime/JSMap.h: |
| (JSC::isJSMap): Deleted. |
| * runtime/JSModuleEnvironment.h: |
| (JSC::JSModuleEnvironment::create): Deleted. |
| (JSC::JSModuleEnvironment::createStructure): Deleted. |
| (JSC::JSModuleEnvironment::offsetOfModuleRecord): Deleted. |
| (JSC::JSModuleEnvironment::allocationSize): Deleted. |
| (JSC::JSModuleEnvironment::moduleRecord): Deleted. |
| (JSC::JSModuleEnvironment::moduleRecordSlot): Deleted. |
| * runtime/JSObject.cpp: |
| (JSC::canDoFastPutDirectIndex): |
| (JSC::JSObject::defineOwnIndexedProperty): |
| (JSC::JSObject::putDirectIndexSlowOrBeyondVectorLength): |
| * runtime/JSObject.h: |
| (JSC::JSFinalObject::allocationSize): Deleted. |
| (JSC::JSFinalObject::typeInfo): Deleted. |
| (JSC::JSFinalObject::defaultInlineCapacity): Deleted. |
| (JSC::JSFinalObject::maxInlineCapacity): Deleted. |
| (JSC::JSFinalObject::createStructure): Deleted. |
| (JSC::JSFinalObject::finishCreation): Deleted. |
| (JSC::JSFinalObject::JSFinalObject): Deleted. |
| (JSC::isJSFinalObject): Deleted. |
| * runtime/JSScope.cpp: |
| * runtime/JSScope.h: |
| * runtime/JSSegmentedVariableObject.cpp: |
| * runtime/JSSegmentedVariableObject.h: |
| * runtime/JSSet.h: |
| (JSC::isJSSet): Deleted. |
| * runtime/JSType.h: |
| * runtime/JSWeakMap.h: |
| (JSC::isJSWeakMap): Deleted. |
| * runtime/JSWeakSet.h: |
| (JSC::isJSWeakSet): Deleted. |
| * runtime/JSWithScope.h: |
| (JSC::JSWithScope::object): Deleted. |
| * runtime/MapConstructor.cpp: |
| (JSC::constructMap): |
| (JSC::mapPrivateFuncMapBucketHead): |
| * runtime/MapPrototype.cpp: |
| (JSC::getMap): |
| * runtime/NumberObject.cpp: |
| (JSC::NumberObject::finishCreation): |
| * runtime/NumberPrototype.cpp: |
| (JSC::toThisNumber): |
| (JSC::numberProtoFuncToExponential): |
| (JSC::numberProtoFuncToFixed): |
| (JSC::numberProtoFuncToPrecision): |
| (JSC::numberProtoFuncToString): |
| (JSC::numberProtoFuncToLocaleString): |
| (JSC::numberProtoFuncValueOf): |
| * runtime/ObjectConstructor.cpp: |
| (JSC::objectConstructorSeal): |
| (JSC::objectConstructorFreeze): |
| (JSC::objectConstructorIsSealed): |
| (JSC::objectConstructorIsFrozen): |
| * runtime/ProxyObject.cpp: |
| (JSC::ProxyObject::finishCreation): |
| * runtime/ScopedArguments.h: |
| (JSC::ScopedArguments::subspaceFor): Deleted. |
| (JSC::ScopedArguments::internalLength const): Deleted. |
| (JSC::ScopedArguments::length const): Deleted. |
| (JSC::ScopedArguments::isMappedArgument const): Deleted. |
| (JSC::ScopedArguments::isMappedArgumentInDFG const): Deleted. |
| (JSC::ScopedArguments::getIndexQuickly const): Deleted. |
| (JSC::ScopedArguments::setIndexQuickly): Deleted. |
| (JSC::ScopedArguments::callee): Deleted. |
| (JSC::ScopedArguments::overrodeThings const): Deleted. |
| (JSC::ScopedArguments::initModifiedArgumentsDescriptorIfNecessary): Deleted. |
| (JSC::ScopedArguments::setModifiedArgumentDescriptor): Deleted. |
| (JSC::ScopedArguments::isModifiedArgumentDescriptor): Deleted. |
| (JSC::ScopedArguments::offsetOfOverrodeThings): Deleted. |
| (JSC::ScopedArguments::offsetOfTotalLength): Deleted. |
| (JSC::ScopedArguments::offsetOfTable): Deleted. |
| (JSC::ScopedArguments::offsetOfScope): Deleted. |
| (JSC::ScopedArguments::overflowStorageOffset): Deleted. |
| (JSC::ScopedArguments::allocationSize): Deleted. |
| (JSC::ScopedArguments::overflowStorage const): Deleted. |
| * runtime/SetConstructor.cpp: |
| (JSC::constructSet): |
| (JSC::setPrivateFuncSetBucketHead): |
| * runtime/SetPrototype.cpp: |
| (JSC::getSet): |
| * runtime/StrictEvalActivation.h: |
| (JSC::StrictEvalActivation::create): Deleted. |
| (JSC::StrictEvalActivation::createStructure): Deleted. |
| * runtime/WeakMapPrototype.cpp: |
| (JSC::getWeakMap): |
| * runtime/WeakSetPrototype.cpp: |
| (JSC::getWeakSet): |
| |
| 2018-03-07 Dominik Infuehr <dinfuehr@igalia.com> |
| |
| [ARM] offlineasm: fix indentation in armOpcodeReversedOperands |
| https://bugs.webkit.org/show_bug.cgi?id=183400 |
| |
| Reviewed by Mark Lam. |
| |
| * offlineasm/arm.rb: |
| |
| 2018-03-06 Mark Lam <mark.lam@apple.com> |
| |
| Prepare LLInt code to support pointer profiling. |
| https://bugs.webkit.org/show_bug.cgi?id=183387 |
| <rdar://problem/38199678> |
| |
| Reviewed by JF Bastien. |
| |
| 1. Introduced PtrTag enums for supporting pointer profiling later. |
| |
| 2. Also introduced tagging, untagging, retagging, and tag removal placeholder |
| template functions for the same purpose. |
| |
| 3. Prepare the offlineasm for supporting pointer profiling later. |
| |
| 4. Tagged some pointers in LLInt asm code. Currently, these should have no |
| effect on behavior. |
| |
| 5. Removed returnToThrowForThrownException() because it is not used anywhere. |
| |
| 6. Added the offlineasm folder to JavaScriptCore Xcode project so that it's |
| easier to view and edit these files in Xcode. |
| |
| * CMakeLists.txt: |
| * JavaScriptCore.xcodeproj/project.pbxproj: |
| * bytecode/LLIntCallLinkInfo.h: |
| (JSC::LLIntCallLinkInfo::unlink): |
| * llint/LLIntData.cpp: |
| (JSC::LLInt::initialize): |
| * llint/LLIntData.h: |
| * llint/LLIntExceptions.cpp: |
| (JSC::LLInt::returnToThrowForThrownException): Deleted. |
| * llint/LLIntExceptions.h: |
| * llint/LLIntOfflineAsmConfig.h: |
| * llint/LLIntOffsetsExtractor.cpp: |
| * llint/LLIntPCRanges.h: |
| (JSC::LLInt::isLLIntPC): |
| * llint/LLIntSlowPaths.cpp: |
| (JSC::LLInt::LLINT_SLOW_PATH_DECL): |
| (JSC::LLInt::handleHostCall): |
| (JSC::LLInt::setUpCall): |
| * llint/LowLevelInterpreter.asm: |
| * llint/LowLevelInterpreter32_64.asm: |
| * llint/LowLevelInterpreter64.asm: |
| * offlineasm/ast.rb: |
| * offlineasm/instructions.rb: |
| * offlineasm/risc.rb: |
| * runtime/PtrTag.h: Added. |
| (JSC::uniquePtrTagID): |
| (JSC::ptrTag): |
| (JSC::tagCodePtr): |
| (JSC::untagCodePtr): |
| (JSC::retagCodePtr): |
| (JSC::removeCodePtrTag): |
| |
| 2018-03-06 Dominik Infuehr <dinfuehr@igalia.com> |
| |
| [ARM] Assembler warnings: "use of r13 is deprecated" |
| https://bugs.webkit.org/show_bug.cgi?id=183286 |
| |
| Reviewed by Mark Lam. |
| |
| Usage of sp/r13 as operand Rm is deprecated on ARM. offlineasm |
| sometimes generates assembly code that triggers this warning. Prevent |
| this by simply switching operands. |
| |
| * offlineasm/arm.rb: |
| |
| 2018-03-06 Yusuke Suzuki <utatane.tea@gmail.com> |
| |
| Unreviewed, fix incorrect assertion after r229309 |
| https://bugs.webkit.org/show_bug.cgi?id=182975 |
| |
| * runtime/TypeProfilerLog.cpp: |
| (JSC::TypeProfilerLog::TypeProfilerLog): |
| |
| 2018-03-05 Yusuke Suzuki <utatane.tea@gmail.com> |
| |
| Fix std::make_unique / new[] using system malloc |
| https://bugs.webkit.org/show_bug.cgi?id=182975 |
| |
| Reviewed by JF Bastien. |
| |
| Use Vector, FAST_ALLOCATED, or UniqueArray instead. |
| |
| * API/JSStringRefCF.cpp: |
| (JSStringCreateWithCFString): |
| * bytecode/BytecodeKills.h: |
| * bytecode/BytecodeLivenessAnalysis.cpp: |
| (JSC::BytecodeLivenessAnalysis::computeKills): |
| * dfg/DFGDisassembler.cpp: |
| (JSC::DFG::Disassembler::dumpDisassembly): |
| * jit/PolymorphicCallStubRoutine.cpp: |
| (JSC::PolymorphicCallStubRoutine::PolymorphicCallStubRoutine): |
| * jit/PolymorphicCallStubRoutine.h: |
| * jit/Repatch.cpp: |
| (JSC::linkPolymorphicCall): |
| * jsc.cpp: |
| (currentWorkingDirectory): |
| * llint/LLIntData.cpp: |
| (JSC::LLInt::initialize): |
| * llint/LLIntData.h: |
| * runtime/ArgList.h: |
| * runtime/StructureChain.h: |
| * runtime/StructureIDTable.cpp: |
| (JSC::StructureIDTable::StructureIDTable): |
| (JSC::StructureIDTable::resize): |
| * runtime/StructureIDTable.h: |
| * runtime/TypeProfilerLog.cpp: |
| (JSC::TypeProfilerLog::TypeProfilerLog): |
| (JSC::TypeProfilerLog::initializeLog): Deleted. |
| * runtime/TypeProfilerLog.h: |
| (JSC::TypeProfilerLog::TypeProfilerLog): Deleted. |
| * runtime/VM.cpp: |
| (JSC::VM::~VM): |
| (JSC::VM::acquireRegExpPatternContexBuffer): |
| * runtime/VM.h: |
| * testRegExp.cpp: |
| (runFromFiles): |
| * tools/HeapVerifier.cpp: |
| (JSC::HeapVerifier::HeapVerifier): |
| * tools/HeapVerifier.h: |
| |
| 2018-03-05 Mark Lam <mark.lam@apple.com> |
| |
| JITThunk functions should only be called when the JIT is enabled. |
| https://bugs.webkit.org/show_bug.cgi?id=183351 |
| <rdar://problem/38160091> |
| |
| Reviewed by Keith Miller. |
| |
| * jit/JITThunks.cpp: |
| (JSC::JITThunks::ctiNativeCall): |
| (JSC::JITThunks::ctiNativeConstruct): |
| (JSC::JITThunks::ctiInternalFunctionCall): |
| (JSC::JITThunks::ctiInternalFunctionConstruct): |
| * runtime/VM.cpp: |
| (JSC::VM::VM): |
| (JSC::VM::getCTIInternalFunctionTrampolineFor): |
| |
| 2018-03-05 Mark Lam <mark.lam@apple.com> |
| |
| Gardening: build fix. |
| |
| Not reviewed. |
| |
| * interpreter/AbstractPC.h: |
| (JSC::AbstractPC::AbstractPC): |
| |
| 2018-03-05 Yusuke Suzuki <utatane.tea@gmail.com> |
| |
| [JSC] Use WTF::ArithmeticOperations for CLoop overflow operations |
| https://bugs.webkit.org/show_bug.cgi?id=183324 |
| |
| Reviewed by JF Bastien. |
| |
| We have WTF::ArithmeticOperations which has operations with overflow checking. |
| This is suitable for CLoop's overflow checking operations. This patch emits |
| WTF::ArithmeticOperations for CLoop's overflow checking operations. And it is |
| lowered to optimized code using CPU's overflow flag. |
| |
| * offlineasm/cloop.rb: |
| |
| 2018-03-05 Don Olmstead <don.olmstead@sony.com> |
| |
| [CMake] Split JSC header copying into public and private targets |
| https://bugs.webkit.org/show_bug.cgi?id=183251 |
| |
| Reviewed by Konstantin Tokarev. |
| |
| * CMakeLists.txt: |
| |
| 2018-03-04 Yusuke Suzuki <utatane.tea@gmail.com> |
| |
| [WTF] Move currentCPUTime and sleep(Seconds) to CPUTime.h and Seconds.h respectively |
| https://bugs.webkit.org/show_bug.cgi?id=183312 |
| |
| Reviewed by Mark Lam. |
| |
| Remove wtf/CurrentTime.h include pragma. |
| |
| * API/tests/ExecutionTimeLimitTest.cpp: |
| (currentCPUTimeAsJSFunctionCallback): |
| (testExecutionTimeLimit): |
| * bytecode/SuperSampler.cpp: |
| * dfg/DFGPlan.cpp: |
| * heap/BlockDirectory.cpp: |
| * heap/Heap.cpp: |
| * heap/IncrementalSweeper.cpp: |
| * inspector/agents/InspectorConsoleAgent.cpp: |
| * inspector/agents/InspectorRuntimeAgent.cpp: |
| * profiler/ProfilerDatabase.cpp: |
| * runtime/CodeCache.h: |
| * runtime/JSDateMath.cpp: |
| * runtime/TypeProfilerLog.cpp: |
| * runtime/VM.cpp: |
| * runtime/Watchdog.cpp: |
| (JSC::Watchdog::shouldTerminate): |
| (JSC::Watchdog::startTimer): |
| * testRegExp.cpp: |
| * wasm/js/JSWebAssemblyCodeBlock.cpp: |
| |
| 2018-03-04 Tim Horton <timothy_horton@apple.com> |
| |
| Make !ENABLE(DATA_DETECTION) iOS build actually succeed |
| https://bugs.webkit.org/show_bug.cgi?id=183283 |
| <rdar://problem/38062148> |
| |
| Reviewed by Sam Weinig. |
| |
| * Configurations/FeatureDefines.xcconfig: |
| |
| 2018-03-02 Mark Lam <mark.lam@apple.com> |
| |
| Make the LLInt probe work for ARM64. |
| https://bugs.webkit.org/show_bug.cgi?id=183298 |
| <rdar://problem/38077413> |
| |
| Reviewed by Filip Pizlo. |
| |
| * llint/LowLevelInterpreter.asm: |
| |
| 2018-03-02 Yusuke Suzuki <utatane.tea@gmail.com> |
| |
| [JSC] Annotate more classes with WTF_MAKE_FAST_ALLOCATED |
| https://bugs.webkit.org/show_bug.cgi?id=183279 |
| |
| Reviewed by JF Bastien. |
| |
| * bytecode/BytecodeIntrinsicRegistry.h: |
| * ftl/FTLThunks.h: |
| * heap/CodeBlockSet.h: |
| * heap/GCSegmentedArray.h: |
| * heap/MachineStackMarker.h: |
| * heap/MarkingConstraintSet.h: |
| |
| 2018-03-01 Yusuke Suzuki <utatane.tea@gmail.com> |
| |
| Remove monotonicallyIncreasingTime |
| https://bugs.webkit.org/show_bug.cgi?id=182911 |
| |
| Reviewed by Michael Catanzaro. |
| |
| * debugger/Debugger.cpp: |
| (JSC::Debugger::willEvaluateScript): |
| (JSC::Debugger::didEvaluateScript): |
| * debugger/Debugger.h: |
| * debugger/ScriptProfilingScope.h: |
| * inspector/agents/InspectorDebuggerAgent.cpp: |
| (Inspector::InspectorDebuggerAgent::breakpointActionProbe): |
| * inspector/agents/InspectorHeapAgent.cpp: |
| (Inspector::InspectorHeapAgent::snapshot): |
| (Inspector::InspectorHeapAgent::didGarbageCollect): |
| (Inspector::InspectorHeapAgent::dispatchGarbageCollectedEvent): |
| * inspector/agents/InspectorHeapAgent.h: |
| * inspector/agents/InspectorScriptProfilerAgent.cpp: |
| (Inspector::InspectorScriptProfilerAgent::startTracking): |
| (Inspector::InspectorScriptProfilerAgent::willEvaluateScript): |
| (Inspector::InspectorScriptProfilerAgent::didEvaluateScript): |
| (Inspector::InspectorScriptProfilerAgent::addEvent): |
| (Inspector::buildSamples): |
| * inspector/agents/InspectorScriptProfilerAgent.h: |
| * runtime/SamplingProfiler.cpp: |
| (JSC::SamplingProfiler::takeSample): |
| * runtime/SamplingProfiler.h: |
| |
| 2018-03-01 Yusuke Suzuki <utatane.tea@gmail.com> |
| |
| ASSERTION FAILED: matchContextualKeyword(m_vm->propertyNames->async) |
| https://bugs.webkit.org/show_bug.cgi?id=183173 |
| |
| Reviewed by Saam Barati. |
| |
| Classifier could propagate an error which does not occur at the first token |
| of the given expression. We should check whether the given token is "async" |
| instead of assertion. |
| |
| * parser/Parser.cpp: |
| (JSC::Parser<LexerType>::parseAssignmentExpression): |
| |
| 2018-03-01 Saam Barati <sbarati@apple.com> |
| |
| We need to clear cached structures when having a bad time |
| https://bugs.webkit.org/show_bug.cgi?id=183256 |
| <rdar://problem/36245022> |
| |
| Reviewed by Mark Lam. |
| |
| This patch makes both InternalFunctionAllocationProfile and the VM's |
| structure cache having-a-bad-time aware. For InternalFunctionAllocationProfile, |
| we clear them when they'd produce an object with a bad indexing type. |
| For the VM's Structure cache, we conservatively clear the entire cache |
| since it may be housing Structures with bad indexing types. |
| |
| * runtime/FunctionRareData.h: |
| (JSC::FunctionRareData::clearInternalFunctionAllocationProfile): |
| * runtime/JSGlobalObject.cpp: |
| (JSC::JSGlobalObject::haveABadTime): |
| * runtime/StructureCache.h: |
| (JSC::StructureCache::clear): |
| |
| 2018-03-01 Yusuke Suzuki <utatane.tea@gmail.com> |
| |
| Unreviewed, fix exception check for ExceptionScope |
| https://bugs.webkit.org/show_bug.cgi?id=183175 |
| |
| * jsc.cpp: |
| (GlobalObject::moduleLoaderFetch): |
| |
| 2018-02-28 Dominik Infuehr <dinfuehr@igalia.com> |
| |
| [ARM] Fix compile error in debug builds by invoking unpoisoned(). |
| |
| Reviewed by Mark Lam. |
| |
| * assembler/MacroAssemblerCodeRef.h: |
| (JSC::MacroAssemblerCodePtr::MacroAssemblerCodePtr): Fix compile error. |
| (JSC::MacroAssemblerCodePtr::createFromExecutableAddress()): Ditto. |
| (JSC::MacroAssemblerCodePtr::dataLocation()): Ditto. |
| * yarr/YarrInterpreter.cpp: |
| (JSC::Yarr::ByteCompiler::dumpDisjunction): use %zu for printf'ing size_t. |
| |
| 2018-02-28 JF Bastien <jfbastien@apple.com> |
| |
| GC should sweep code block before deleting |
| https://bugs.webkit.org/show_bug.cgi?id=183229 |
| <rdar://problem/32767615> |
| |
| Reviewed by Saam Barati, Fil Pizlo. |
| |
| Stub routines shouldn't get deleted before codeblocks have been |
| swept, otherwise there's a small race window where the codeblock |
| thinks it's still reachable. |
| |
| * heap/Heap.cpp: |
| (JSC::Heap::deleteUnmarkedCompiledCode): |
| (JSC::Heap::sweepInFinalize): |
| |
| 2018-02-28 Yusuke Suzuki <utatane.tea@gmail.com> |
| |
| JSC crash with `import("")` |
| https://bugs.webkit.org/show_bug.cgi?id=183175 |
| |
| Reviewed by Saam Barati. |
| |
| Add file existence and file type check for module loader implementation in jsc.cpp. |
| This is not safe for TOCTOU, but it is OK since this functionality is used for the |
| JSC shell (jsc.cpp): testing purpose. |
| |
| * jsc.cpp: |
| (fillBufferWithContentsOfFile): |
| (fetchModuleFromLocalFileSystem): |
| |
| 2018-02-27 Keith Miller <keith_miller@apple.com> |
| |
| Replace TrustedImmPtr(0) with TrustedImmPtr(nullptr) |
| https://bugs.webkit.org/show_bug.cgi?id=183195 |
| |
| Reviewed by Mark Lam. |
| |
| * assembler/AbstractMacroAssembler.h: |
| (JSC::AbstractMacroAssembler::TrustedImmPtr::TrustedImmPtr): |
| * assembler/MacroAssembler.h: |
| (JSC::MacroAssembler::patchableBranchPtr): |
| (JSC::MacroAssembler::patchableBranchPtrWithPatch): |
| * assembler/MacroAssemblerARM.h: |
| (JSC::MacroAssemblerARM::branchPtrWithPatch): |
| (JSC::MacroAssemblerARM::storePtrWithPatch): |
| * assembler/MacroAssemblerARM64.h: |
| (JSC::MacroAssemblerARM64::call): |
| (JSC::MacroAssemblerARM64::tailRecursiveCall): |
| (JSC::MacroAssemblerARM64::branchPtrWithPatch): |
| (JSC::MacroAssemblerARM64::patchableBranchPtrWithPatch): |
| (JSC::MacroAssemblerARM64::storePtrWithPatch): |
| * assembler/MacroAssemblerARMv7.h: |
| (JSC::MacroAssemblerARMv7::branchPtrWithPatch): |
| (JSC::MacroAssemblerARMv7::patchableBranchPtr): |
| (JSC::MacroAssemblerARMv7::patchableBranchPtrWithPatch): |
| (JSC::MacroAssemblerARMv7::storePtrWithPatch): |
| * assembler/MacroAssemblerMIPS.h: |
| (JSC::MacroAssemblerMIPS::branchPtrWithPatch): |
| (JSC::MacroAssemblerMIPS::storePtrWithPatch): |
| * assembler/MacroAssemblerX86.h: |
| (JSC::MacroAssemblerX86::branchPtrWithPatch): |
| * assembler/MacroAssemblerX86_64.h: |
| (JSC::MacroAssemblerX86_64::callWithSlowPathReturnType): |
| (JSC::MacroAssemblerX86_64::call): |
| (JSC::MacroAssemblerX86_64::tailRecursiveCall): |
| (JSC::MacroAssemblerX86_64::makeTailRecursiveCall): |
| (JSC::MacroAssemblerX86_64::branchPtrWithPatch): |
| * bytecode/AccessCase.cpp: |
| (JSC::AccessCase::generateImpl): |
| * dfg/DFGSpeculativeJIT.cpp: |
| (JSC::DFG::SpeculativeJIT::emitAllocateRawObject): |
| (JSC::DFG::SpeculativeJIT::compileToLowerCase): |
| (JSC::DFG::SpeculativeJIT::compileMakeRope): |
| (JSC::DFG::SpeculativeJIT::compileGetTypedArrayByteOffset): |
| (JSC::DFG::SpeculativeJIT::compileNewFunctionCommon): |
| (JSC::DFG::SpeculativeJIT::compileCreateDirectArguments): |
| (JSC::DFG::SpeculativeJIT::compileNewArrayWithSpread): |
| (JSC::DFG::SpeculativeJIT::compileArraySlice): |
| (JSC::DFG::SpeculativeJIT::compileAllocatePropertyStorage): |
| (JSC::DFG::SpeculativeJIT::compileReallocatePropertyStorage): |
| (JSC::DFG::SpeculativeJIT::compileNewTypedArrayWithSize): |
| * dfg/DFGSpeculativeJIT.h: |
| (JSC::DFG::SpeculativeJIT::TrustedImmPtr::TrustedImmPtr): |
| * dfg/DFGSpeculativeJIT32_64.cpp: |
| (JSC::DFG::SpeculativeJIT::compile): |
| (JSC::DFG::SpeculativeJIT::compileAllocateNewArrayWithSize): |
| * dfg/DFGSpeculativeJIT64.cpp: |
| (JSC::DFG::SpeculativeJIT::emitCall): |
| (JSC::DFG::SpeculativeJIT::compile): |
| (JSC::DFG::SpeculativeJIT::compileAllocateNewArrayWithSize): |
| * dfg/DFGThunks.cpp: |
| (JSC::DFG::osrExitGenerationThunkGenerator): |
| * ftl/FTLLowerDFGToB3.cpp: |
| (JSC::FTL::DFG::LowerDFGToB3::compileCallOrConstruct): |
| (JSC::FTL::DFG::LowerDFGToB3::compileTailCall): |
| (JSC::FTL::DFG::LowerDFGToB3::compileCallOrConstructVarargs): |
| * ftl/FTLThunks.cpp: |
| (JSC::FTL::genericGenerationThunkGenerator): |
| * jit/AssemblyHelpers.cpp: |
| (JSC::AssemblyHelpers::debugCall): |
| (JSC::AssemblyHelpers::sanitizeStackInline): |
| * jit/IntrinsicEmitter.cpp: |
| (JSC::IntrinsicGetterAccessCase::emitIntrinsicGetter): |
| * jit/JITCall.cpp: |
| (JSC::JIT::compileOpCall): |
| * jit/JITCall32_64.cpp: |
| (JSC::JIT::compileOpCall): |
| * jit/ScratchRegisterAllocator.cpp: |
| (JSC::ScratchRegisterAllocator::restoreUsedRegistersFromScratchBufferForCall): |
| * wasm/js/WasmToJS.cpp: |
| (JSC::Wasm::wasmToJS): |
| * yarr/YarrJIT.cpp: |
| (JSC::Yarr::YarrGenerator::initParenContextFreeList): |
| (JSC::Yarr::YarrGenerator::storeToFrameWithPatch): |
| (JSC::Yarr::YarrGenerator::generate): |
| |
| 2018-02-26 Mark Lam <mark.lam@apple.com> |
| |
| Modernize FINALIZE_CODE and peer macros to use __VA_ARGS__ arguments. |
| https://bugs.webkit.org/show_bug.cgi?id=183159 |
| <rdar://problem/37930837> |
| |
| Reviewed by Keith Miller. |
| |
| * assembler/LinkBuffer.h: |
| * assembler/testmasm.cpp: |
| (JSC::compile): |
| * 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/InlineAccess.cpp: |
| (JSC::linkCodeInline): |
| (JSC::InlineAccess::rewireStubAsJump): |
| * bytecode/PolymorphicAccess.cpp: |
| (JSC::PolymorphicAccess::regenerate): |
| * dfg/DFGJITFinalizer.cpp: |
| (JSC::DFG::JITFinalizer::finalize): |
| (JSC::DFG::JITFinalizer::finalizeFunction): |
| * dfg/DFGOSRExit.cpp: |
| (JSC::DFG::OSRExit::compileOSRExit): |
| * dfg/DFGThunks.cpp: |
| (JSC::DFG::osrExitThunkGenerator): |
| (JSC::DFG::osrExitGenerationThunkGenerator): |
| (JSC::DFG::osrEntryThunkGenerator): |
| * ftl/FTLJITFinalizer.cpp: |
| (JSC::FTL::JITFinalizer::finalizeCommon): |
| * ftl/FTLLazySlowPath.cpp: |
| (JSC::FTL::LazySlowPath::generate): |
| * ftl/FTLOSRExitCompiler.cpp: |
| (JSC::FTL::compileStub): |
| * ftl/FTLThunks.cpp: |
| (JSC::FTL::genericGenerationThunkGenerator): |
| (JSC::FTL::slowPathCallThunkGenerator): |
| * jit/ExecutableAllocator.cpp: |
| * jit/JIT.cpp: |
| (JSC::JIT::link): |
| * jit/JITMathIC.h: |
| (JSC::isProfileEmpty): |
| * jit/JITOpcodes.cpp: |
| (JSC::JIT::privateCompileHasIndexedProperty): |
| * jit/JITOpcodes32_64.cpp: |
| (JSC::JIT::privateCompileHasIndexedProperty): |
| * 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::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): |
| * llint/LLIntThunks.cpp: |
| (JSC::LLInt::generateThunkWithJumpTo): |
| * wasm/WasmBBQPlan.cpp: |
| (JSC::Wasm::BBQPlan::complete): |
| * wasm/WasmBinding.cpp: |
| (JSC::Wasm::wasmToWasm): |
| * wasm/WasmOMGPlan.cpp: |
| (JSC::Wasm::OMGPlan::work): |
| * wasm/WasmThunks.cpp: |
| (JSC::Wasm::throwExceptionFromWasmThunkGenerator): |
| (JSC::Wasm::throwStackOverflowFromWasmThunkGenerator): |
| (JSC::Wasm::triggerOMGTierUpThunkGenerator): |
| * wasm/js/WasmToJS.cpp: |
| (JSC::Wasm::handleBadI64Use): |
| (JSC::Wasm::wasmToJS): |
| * yarr/YarrJIT.cpp: |
| (JSC::Yarr::YarrGenerator::compile): |
| |
| 2018-02-25 Yusuke Suzuki <utatane.tea@gmail.com> |
| |
| [FTL] Support PutByVal(ArrayStorage/SlowPutArrayStorage) |
| https://bugs.webkit.org/show_bug.cgi?id=182965 |
| |
| Reviewed by Saam Barati. |
| |
| This patch extends FTL coverage for PutByVal by adding ArrayStorage and SlwoPutArrayStorage support. |
| Basically large part of the patch is porting from DFG code. Since PutByVal already emits CheckInBounds |
| for InBounds case, we do not have OutOfBounds check for that case. |
| This is the last change for FTL to support all the types of DFG nodes except for CreateThis. |
| |
| * dfg/DFGOperations.cpp: |
| * dfg/DFGOperations.h: |
| * dfg/DFGSpeculativeJIT.cpp: |
| (JSC::DFG::SpeculativeJIT::compileDoublePutByVal): |
| * dfg/DFGSpeculativeJIT64.cpp: |
| (JSC::DFG::SpeculativeJIT::compile): |
| * ftl/FTLCapabilities.cpp: |
| (JSC::FTL::canCompile): |
| * ftl/FTLLowerDFGToB3.cpp: |
| (JSC::FTL::DFG::LowerDFGToB3::compilePutByVal): |
| (JSC::FTL::DFG::LowerDFGToB3::contiguousPutByValOutOfBounds): |
| For consistency, we use operationPutByValXXX and operationPutByValDirectXXX. |
| But except for SlowPutArrayStorage case, basically it is meaningless since |
| we do not have indexed accessors. |
| |
| 2018-02-26 Saam Barati <sbarati@apple.com> |
| |
| validateStackAccess should not validate if the offset is within the stack bounds |
| https://bugs.webkit.org/show_bug.cgi?id=183067 |
| <rdar://problem/37749988> |
| |
| Reviewed by Mark Lam. |
| |
| The validation rule was saying that any load from the stack must be |
| within the stack bounds of the frame. However, it's natural for a user |
| of B3 to emit code that may be outside of B3's stack bounds, but guard |
| such a load with a branch. The FTL does exactly this with GetMyArgumentByVal. |
| B3 is wrong to assert that this is a static property about all stack loads. |
| |
| * b3/B3Validate.cpp: |
| |
| 2018-02-23 Saam Barati <sbarati@apple.com> |
| |
| Make Number.isInteger an intrinsic |
| https://bugs.webkit.org/show_bug.cgi?id=183088 |
| |
| Reviewed by JF Bastien. |
| |
| When profiling the ML subtest in ARES, I noticed it was spending some |
| time in Number.isInteger. This patch makes that operation an intrinsic |
| in the DFG/FTL. It might be a speedup by 1% or so on that subtest, but |
| it's likely not an aggregate speedup on ARES. However, it is definitely |
| faster than calling into a builtin function, so we might as well have |
| it as an intrinsic. |
| |
| * dfg/DFGAbstractInterpreterInlines.h: |
| (JSC::DFG::AbstractInterpreter<AbstractStateType>::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/DFGNodeType.h: |
| * dfg/DFGOperations.cpp: |
| * dfg/DFGOperations.h: |
| * dfg/DFGPredictionPropagationPhase.cpp: |
| * dfg/DFGSafeToExecute.h: |
| (JSC::DFG::safeToExecute): |
| * 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::compileNumberIsInteger): |
| (JSC::FTL::DFG::LowerDFGToB3::unboxDouble): |
| * runtime/Intrinsic.cpp: |
| (JSC::intrinsicName): |
| * runtime/Intrinsic.h: |
| * runtime/NumberConstructor.cpp: |
| (JSC::NumberConstructor::finishCreation): |
| (JSC::numberConstructorFuncIsInteger): |
| * runtime/NumberConstructor.h: |
| (JSC::NumberConstructor::isIntegerImpl): |
| |
| 2018-02-23 Oleksandr Skachkov <gskachkov@gmail.com> |
| |
| WebAssembly: cache memory address / size on instance |
| https://bugs.webkit.org/show_bug.cgi?id=177305 |
| |
| Reviewed by JF Bastien. |
| |
| Cache memory address/size in wasm:Instance to avoid load wasm:Memory |
| object during access to memory and memory size property in JiT |
| |
| * wasm/WasmB3IRGenerator.cpp: |
| (JSC::Wasm::B3IRGenerator::restoreWebAssemblyGlobalState): |
| (JSC::Wasm::B3IRGenerator::addCurrentMemory): |
| (JSC::Wasm::B3IRGenerator::addCallIndirect): |
| * wasm/WasmBinding.cpp: |
| (JSC::Wasm::wasmToWasm): |
| * wasm/WasmInstance.h: |
| (JSC::Wasm::Instance::cachedMemory const): |
| (JSC::Wasm::Instance::cachedMemorySize const): |
| (JSC::Wasm::Instance::createWeakPtr): |
| (JSC::Wasm::Instance::setMemory): |
| (JSC::Wasm::Instance::updateCachedMemory): |
| (JSC::Wasm::Instance::offsetOfCachedMemory): |
| (JSC::Wasm::Instance::offsetOfCachedMemorySize): |
| (JSC::Wasm::Instance::offsetOfCachedIndexingMask): |
| (JSC::Wasm::Instance::allocationSize): |
| * wasm/WasmMemory.cpp: |
| (JSC::Wasm::Memory::grow): |
| (JSC::Wasm::Memory::registerInstance): |
| * wasm/WasmMemory.h: |
| (JSC::Wasm::Memory::indexingMask): |
| * wasm/js/JSToWasm.cpp: |
| (JSC::Wasm::createJSToWasmWrapper): |
| * wasm/js/WebAssemblyModuleRecord.cpp: |
| (JSC::WebAssemblyModuleRecord::evaluate): |
| |
| 2018-02-23 Saam Barati <sbarati@apple.com> |
| |
| ArgumentsEliminationPhase has a branch on GetByOffset that should be an assert |
| https://bugs.webkit.org/show_bug.cgi?id=182982 |
| |
| Reviewed by Yusuke Suzuki. |
| |
| I don't know why this check was not always an assert. When we see |
| a GetByOffset on an eliminated allocation, that allocation *must* |
| be a PhantomClonedArguments. If it weren't, the GetByOffset would |
| have escaped it. Because this transformation happens by visiting |
| blocks in pre-order, and by visiting nodes in a block starting from |
| index zero to index block->size() - 1, we're guaranteed that eliminated |
| allocations get transformed before users of it, since we visit nodes |
| in dominator order. |
| |
| * dfg/DFGArgumentsEliminationPhase.cpp: |
| |
| 2018-02-23 Yusuke Suzuki <utatane.tea@gmail.com> |
| |
| [JSC] Implement $vm.ftlTrue function for FTL testing |
| https://bugs.webkit.org/show_bug.cgi?id=183071 |
| |
| Reviewed by Mark Lam. |
| |
| Add $vm.ftlTrue, which becomes true if the caller is compiled in FTL. |
| This is useful for testing whether the caller function is compiled in FTL. |
| |
| We also remove duplicate DFGTrue function in jsc.cpp. We have $vm.dfgTrue. |
| |
| * dfg/DFGByteCodeParser.cpp: |
| (JSC::DFG::ByteCodeParser::handleIntrinsicCall): |
| * jsc.cpp: |
| (GlobalObject::finishCreation): |
| (functionFalse1): |
| (functionFalse2): Deleted. |
| * runtime/Intrinsic.cpp: |
| (JSC::intrinsicName): |
| * runtime/Intrinsic.h: |
| * tools/JSDollarVM.cpp: |
| (JSC::functionFTLTrue): |
| (JSC::JSDollarVM::finishCreation): |
| |
| 2018-02-22 Yusuke Suzuki <utatane.tea@gmail.com> |
| |
| [FTL] Support HasIndexedProperty for ArrayStorage and SlowPutArrayStorage |
| https://bugs.webkit.org/show_bug.cgi?id=182792 |
| |
| Reviewed by Mark Lam. |
| |
| This patch adds HasIndexedProperty for ArrayStorage and SlowPutArrayStorage in FTL. |
| HasIndexedProperty with ArrayStorage frequently causes FTL compilation failures |
| in web-tooling-benchmarks. |
| |
| * ftl/FTLCapabilities.cpp: |
| (JSC::FTL::canCompile): |
| * ftl/FTLLowerDFGToB3.cpp: |
| (JSC::FTL::DFG::LowerDFGToB3::compileHasIndexedProperty): |
| |
| 2018-02-22 Mark Lam <mark.lam@apple.com> |
| |
| Refactor MacroAssembler code to improve reuse and extensibility. |
| https://bugs.webkit.org/show_bug.cgi?id=183054 |
| <rdar://problem/37797337> |
| |
| Reviewed by Saam Barati. |
| |
| * assembler/ARM64Assembler.h: |
| * assembler/MacroAssembler.cpp: |
| * assembler/MacroAssembler.h: |
| * assembler/MacroAssemblerARM.h: |
| * assembler/MacroAssemblerARM64.h: |
| (JSC::MacroAssemblerARM64::canCompact): |
| (JSC::MacroAssemblerARM64::computeJumpType): |
| (JSC::MacroAssemblerARM64::jumpSizeDelta): |
| (JSC::MacroAssemblerARM64::link): |
| (JSC::MacroAssemblerARM64::load64): |
| (JSC::MacroAssemblerARM64::load64WithAddressOffsetPatch): |
| (JSC::MacroAssemblerARM64::load32): |
| (JSC::MacroAssemblerARM64::load32WithAddressOffsetPatch): |
| (JSC::MacroAssemblerARM64::load16): |
| (JSC::MacroAssemblerARM64::load16SignedExtendTo32): |
| (JSC::MacroAssemblerARM64::load8): |
| (JSC::MacroAssemblerARM64::load8SignedExtendTo32): |
| (JSC::MacroAssemblerARM64::store64): |
| (JSC::MacroAssemblerARM64::store64WithAddressOffsetPatch): |
| (JSC::MacroAssemblerARM64::store32): |
| (JSC::MacroAssemblerARM64::store32WithAddressOffsetPatch): |
| (JSC::MacroAssemblerARM64::store16): |
| (JSC::MacroAssemblerARM64::store8): |
| (JSC::MacroAssemblerARM64::getEffectiveAddress): |
| (JSC::MacroAssemblerARM64::branchDoubleNonZero): |
| (JSC::MacroAssemblerARM64::branchDoubleZeroOrNaN): |
| (JSC::MacroAssemblerARM64::branchTruncateDoubleToInt32): |
| (JSC::MacroAssemblerARM64::loadDouble): |
| (JSC::MacroAssemblerARM64::loadFloat): |
| (JSC::MacroAssemblerARM64::moveConditionallyAfterFloatingPointCompare): |
| (JSC::MacroAssemblerARM64::moveDoubleConditionallyAfterFloatingPointCompare): |
| (JSC::MacroAssemblerARM64::storeDouble): |
| (JSC::MacroAssemblerARM64::storeFloat): |
| (JSC::MacroAssemblerARM64::call): |
| (JSC::MacroAssemblerARM64::jump): |
| (JSC::MacroAssemblerARM64::tailRecursiveCall): |
| (JSC::MacroAssemblerARM64::setCarry): |
| (JSC::MacroAssemblerARM64::reemitInitialMoveWithPatch): |
| (JSC::MacroAssemblerARM64::isBreakpoint): |
| (JSC::MacroAssemblerARM64::invert): |
| (JSC::MacroAssemblerARM64::readCallTarget): |
| (JSC::MacroAssemblerARM64::replaceWithVMHalt): |
| (JSC::MacroAssemblerARM64::replaceWithJump): |
| (JSC::MacroAssemblerARM64::maxJumpReplacementSize): |
| (JSC::MacroAssemblerARM64::patchableJumpSize): |
| (JSC::MacroAssemblerARM64::repatchCall): |
| (JSC::MacroAssemblerARM64::makeBranch): |
| (JSC::MacroAssemblerARM64::makeCompareAndBranch): |
| (JSC::MacroAssemblerARM64::makeTestBitAndBranch): |
| (JSC::MacroAssemblerARM64::ARM64Condition): |
| (JSC::MacroAssemblerARM64::moveWithFixedWidth): |
| (JSC::MacroAssemblerARM64::load): |
| (JSC::MacroAssemblerARM64::store): |
| (JSC::MacroAssemblerARM64::tryLoadWithOffset): |
| (JSC::MacroAssemblerARM64::tryLoadSignedWithOffset): |
| (JSC::MacroAssemblerARM64::tryStoreWithOffset): |
| (JSC::MacroAssemblerARM64::jumpAfterFloatingPointCompare): |
| (JSC::MacroAssemblerARM64::linkCall): |
| * assembler/MacroAssemblerARMv7.h: |
| * assembler/MacroAssemblerMIPS.h: |
| * assembler/MacroAssemblerX86Common.h: |
| * assembler/ProbeStack.h: |
| - Removed a forward declaration of an obsolete class. |
| |
| 2018-02-22 Yusuke Suzuki <utatane.tea@gmail.com> |
| |
| Remove sleep(double) and sleepMS(double) interfaces |
| https://bugs.webkit.org/show_bug.cgi?id=183038 |
| |
| Reviewed by Mark Lam. |
| |
| * bytecode/SuperSampler.cpp: |
| (JSC::initializeSuperSampler): |
| |
| 2018-02-21 Don Olmstead <don.olmstead@sony.com> |
| |
| [CMake] Split declaration of JSC headers into public and private |
| https://bugs.webkit.org/show_bug.cgi?id=182980 |
| |
| Reviewed by Michael Catanzaro. |
| |
| * CMakeLists.txt: |
| * PlatformGTK.cmake: |
| * PlatformMac.cmake: |
| * PlatformWPE.cmake: |
| * PlatformWin.cmake: |
| |
| 2018-02-20 Saam Barati <sbarati@apple.com> |
| |
| DFG::VarargsForwardingPhase should eliminate getting argument length |
| https://bugs.webkit.org/show_bug.cgi?id=182959 |
| |
| Reviewed by Keith Miller. |
| |
| This patch teaches the DFG VarargsForwardingPhase to not treat |
| length accesses on Cloned/Direct Arguments objects as escapes. |
| It teaches this phase to materialize the length in the same |
| way the ArgumentsEliminationPhase does. |
| |
| This is around a 0.5-1% speedup on ARES6 on my iMac. It speeds |
| up the ML subtest by 2-4%. |
| |
| This patch also extends compileGetArgumentCountIncludingThis to take |
| a parameter that is the inline call frame to load from (in the case |
| where the inline call frame is a varargs frame). This allows the |
| the emitCodeToGetArgumentsArrayLength helper function to just emit |
| a GetArgumentCountIncludingThis node instead of a GetLocal. If we |
| emitted a GetLocal, we'd need to rerun CPS rethreading. |
| |
| * dfg/DFGArgumentsEliminationPhase.cpp: |
| * dfg/DFGArgumentsUtilities.cpp: |
| (JSC::DFG::emitCodeToGetArgumentsArrayLength): |
| * dfg/DFGByteCodeParser.cpp: |
| (JSC::DFG::ByteCodeParser::getArgumentCount): |
| * dfg/DFGClobberize.h: |
| (JSC::DFG::clobberize): |
| * dfg/DFGNode.h: |
| (JSC::DFG::Node::argumentsInlineCallFrame): |
| * dfg/DFGSpeculativeJIT.cpp: |
| (JSC::DFG::SpeculativeJIT::compileGetArgumentCountIncludingThis): |
| * dfg/DFGVarargsForwardingPhase.cpp: |
| * ftl/FTLLowerDFGToB3.cpp: |
| (JSC::FTL::DFG::LowerDFGToB3::compileGetArgumentCountIncludingThis): |
| |
| 2018-02-14 Yusuke Suzuki <utatane.tea@gmail.com> |
| |
| [FTL] Support ArrayPush for ArrayStorage |
| https://bugs.webkit.org/show_bug.cgi?id=182782 |
| |
| Reviewed by Saam Barati. |
| |
| This patch adds support for ArrayPush(ArrayStorage). We just port ArrayPush(ArrayStorage) in DFG to FTL. |
| |
| * ftl/FTLAbstractHeapRepository.h: |
| * ftl/FTLCapabilities.cpp: |
| (JSC::FTL::canCompile): |
| * ftl/FTLLowerDFGToB3.cpp: |
| (JSC::FTL::DFG::LowerDFGToB3::compileArrayPush): |
| |
| 2018-02-14 Yusuke Suzuki <utatane.tea@gmail.com> |
| |
| [FTL] Support ArrayPop for ArrayStorage |
| https://bugs.webkit.org/show_bug.cgi?id=182783 |
| |
| Reviewed by Saam Barati. |
| |
| This patch adds ArrayPop(ArrayStorage) support to FTL. We port the implementation in DFG to FTL. |
| |
| * ftl/FTLAbstractHeapRepository.h: |
| * ftl/FTLCapabilities.cpp: |
| (JSC::FTL::canCompile): |
| * ftl/FTLLowerDFGToB3.cpp: |
| (JSC::FTL::DFG::LowerDFGToB3::compileArrayPop): |
| |
| 2018-02-14 Yusuke Suzuki <utatane.tea@gmail.com> |
| |
| [FTL] Add Arrayify for ArrayStorage and SlowPutArrayStorage |
| https://bugs.webkit.org/show_bug.cgi?id=182731 |
| |
| Reviewed by Saam Barati. |
| |
| This patch adds support for Arrayify(ArrayStorage/SlowPutArrayStorage) to FTL. |
| Due to ArrayifyToStructure and CheckArray changes, necessary changes for |
| supporting Arrayify in FTL are already done. Just allowing it in FTLCapabilities.cpp |
| is enough. |
| |
| We fix FTL's CheckArray logic. Previously, CheckArray(SlowPutArrayStorage) does not pass |
| ArrayStorage in FTL. But now it passes this as DFG does. Moreover, we fix DFG's CheckArray |
| where CheckArray(ArrayStorage+NonArray) can pass ArrayStorage+Array. |
| |
| * dfg/DFGSpeculativeJIT.cpp: |
| (JSC::DFG::SpeculativeJIT::silentFill): |
| (JSC::DFG::SpeculativeJIT::jumpSlowForUnwantedArrayMode): |
| * dfg/DFGSpeculativeJIT.h: |
| * ftl/FTLCapabilities.cpp: |
| (JSC::FTL::canCompile): |
| * ftl/FTLLowerDFGToB3.cpp: |
| (JSC::FTL::DFG::LowerDFGToB3::isArrayTypeForArrayify): |
| |
| 2018-02-19 Saam Barati <sbarati@apple.com> |
| |
| Don't use JSFunction's allocation profile when getting the prototype can be effectful |
| https://bugs.webkit.org/show_bug.cgi?id=182942 |
| <rdar://problem/37584764> |
| |
| Reviewed by Mark Lam. |
| |
| Prior to this patch, the create_this implementation assumed that anything |
| that is a JSFunction can use the object allocation profile and go down the |
| fast path to allocate the |this| object. Implied by this approach is that |
| accessing the 'prototype' property of the incoming function is not an |
| effectful operation. This is inherent to the ObjectAllocationProfile |
| data structure: it caches the prototype field. However, getting the |
| 'prototype' property might be an effectful operation, e.g, it could |
| be a getter. Many variants of functions in JS have the 'prototype' property |
| as non-configurable. However, some functions, like bound functions, do not |
| have the 'prototype' field with these attributes. |
| |
| This patch adds the notion of 'canUseAllocationProfile' to JSFunction |
| and threads it through so that we only go down the fast path and use |
| the allocation profile when the prototype property is non-configurable. |
| |
| * bytecompiler/NodesCodegen.cpp: |
| (JSC::ClassExprNode::emitBytecode): |
| * dfg/DFGOperations.cpp: |
| * runtime/CommonSlowPaths.cpp: |
| (JSC::SLOW_PATH_DECL): |
| * runtime/JSFunction.cpp: |
| (JSC::JSFunction::prototypeForConstruction): |
| (JSC::JSFunction::allocateAndInitializeRareData): |
| (JSC::JSFunction::initializeRareData): |
| (JSC::JSFunction::getOwnPropertySlot): |
| (JSC::JSFunction::canUseAllocationProfileNonInline): |
| * runtime/JSFunction.h: |
| (JSC::JSFunction::ensureRareDataAndAllocationProfile): |
| * runtime/JSFunctionInlines.h: |
| (JSC::JSFunction::canUseAllocationProfile): |
| |
| 2018-02-19 Saam Barati <sbarati@apple.com> |
| |
| Don't mark an array profile out of bounds for the cases where the DFG will convert the access to SaneChain |
| https://bugs.webkit.org/show_bug.cgi?id=182912 |
| <rdar://problem/37685083> |
| |
| Reviewed by Keith Miller. |
| |
| In the baseline JIT and LLInt, when we loading a hole from an original array, |
| with the array prototype chain being normal, we end up marking the ArrayProfile |
| for that GetByVal as out of bounds. However, the DFG knows exactly how to |
| optimize this case by returning undefined when loading from a hole. Currently, |
| it only does this for Contiguous arrays (and sometimes Double arrays). |
| This patch just makes sure to not mark the ArrayProfile as out of bounds |
| in this scenario for Contiguous arrays, since the DFG will always optimize |
| this case. |
| |
| However, we should extend this by profiling when a GetByVal loads a hole. By |
| doing so, we can optimize this for Int32, ArrayStorage, and maybe even Double |
| arrays. That work will happen in: |
| https://bugs.webkit.org/show_bug.cgi?id=182940 |
| |
| This patch is a 30-50% speedup on JetStream's hash-map test. This patch |
| speeds up JetStream by 1% when testing on my iMac. |
| |
| * dfg/DFGArrayMode.cpp: |
| (JSC::DFG::ArrayMode::refine const): |
| * dfg/DFGFixupPhase.cpp: |
| (JSC::DFG::FixupPhase::fixupNode): |
| * jit/JITOperations.cpp: |
| (JSC::getByVal): |
| (JSC::canAccessArgumentIndexQuickly): Deleted. |
| * llint/LLIntSlowPaths.cpp: |
| (JSC::LLInt::getByVal): |
| (JSC::LLInt::LLINT_SLOW_PATH_DECL): |
| * llint/LowLevelInterpreter32_64.asm: |
| * llint/LowLevelInterpreter64.asm: |
| * runtime/CommonSlowPaths.h: |
| (JSC::CommonSlowPaths::canAccessArgumentIndexQuickly): |
| |
| 2018-02-17 Filip Pizlo <fpizlo@apple.com> |
| |
| GetArrayMask should support constant folding |
| https://bugs.webkit.org/show_bug.cgi?id=182907 |
| |
| Reviewed by Saam Barati. |
| |
| Implement constant folding for GetArrayMask. This revealed a bug in tryGetFoldableView, where it was |
| ignoring the result of a jsDynamicCast<>(). This wasn't a bug before because it would have been |
| impossible for that function to get called with a non-null value if the value was not an array view, |
| due to type filtering in CheckArray, the fact that CheckArray had to dominate GetArrayLength, and |
| the fact that the other tryGetFoldableView overload made sure that the array mode was some typed |
| array. |
| |
| This isn't a measurable progression, but it does save a register in the codegen for typed array |
| accesses. Hopefully these improvements add up. |
| |
| * assembler/AssemblerBuffer.h: |
| * dfg/DFGAbstractInterpreterInlines.h: |
| (JSC::DFG::AbstractInterpreter<AbstractStateType>::executeEffects): |
| * dfg/DFGGraph.cpp: |
| (JSC::DFG::Graph::tryGetFoldableView): |
| |
| 2018-02-18 Dominik Inführ <dominik.infuehr@gmail.com> |
| |
| Offlineasm/MIPS: immediates need to be within 16-bit signed values |
| https://bugs.webkit.org/show_bug.cgi?id=182890 |
| |
| Reviewed by Michael Catanzaro. |
| |
| In Sequence.getModifiedListMIPS(), we allow immediate values within |
| the range -0xffff..0xffff for immediates (addresses and other |
| immediates), but then in Immediate.mipsOperand() and |
| Address.mipsOperand() we raise if immediate values are not within |
| -0x7fff..0x7fff. This is inconsistent, and broke compilation on mips |
| since r228552 made the VM structure bigger meaning we address values |
| with bigger offsets in llint. This change restricts the allowed range, |
| so that a separate load of the value is done for values outside of |
| that range. |
| |
| * offlineasm/mips.rb: |
| |
| 2018-02-17 Darin Adler <darin@apple.com> |
| |
| Web Inspector: get rid of remaining uses of OptOutput<T> |
| https://bugs.webkit.org/show_bug.cgi?id=180607 |
| |
| Reviewed by Brian Burg. |
| |
| * inspector/AsyncStackTrace.cpp: Removed explicit Inspector prefix from code that |
| is inside the Inspector namespace already. Also use auto a bit. |
| * inspector/AsyncStackTrace.h: Ditto. |
| * inspector/ConsoleMessage.cpp: Ditto. |
| |
| * inspector/ContentSearchUtilities.cpp: More Inspector namespace removal and ... |
| (Inspector::ContentSearchUtilities::getRegularExpressionMatchesByLines): Use a |
| Vector instead of a unique_ptr<Vector>. |
| (Inspector::ContentSearchUtilities::lineEndings): Ditto. |
| (Inspector::ContentSearchUtilities::stylesheetCommentPattern): Deleted. |
| (Inspector::ContentSearchUtilities::findMagicComment): Use std::array instead of |
| a Vector for a fixed size array; also got rid of reinterpret_cast. |
| (Inspector::ContentSearchUtilities::findStylesheetSourceMapURL): Moved the regular |
| expression here since it's the only place it was used. |
| |
| * inspector/ContentSearchUtilities.h: Cut down on unneeded includes. |
| |
| * inspector/InjectedScript.cpp: Removed explicit Inspector prefix from code that |
| is inside the Inspector namespace already. Also use auto a bit. |
| |
| * inspector/InspectorProtocolTypes.h: Removed OptOutput. Simplified assertions. |
| Removed base template for BindingTraits; we only need the specializations. |
| |
| * inspector/ScriptCallFrame.cpp: Removed explicit Inspector prefix from code that |
| is inside the Inspector namespace already. Also use auto a bit. |
| * inspector/ScriptCallFrame.h: Ditto. |
| * inspector/ScriptCallStack.cpp: Ditto. |
| * inspector/ScriptCallStack.h: Ditto. |
| * inspector/agents/InspectorConsoleAgent.cpp: Ditto. |
| * inspector/agents/InspectorConsoleAgent.h: Ditto. |
| |
| * inspector/agents/InspectorDebuggerAgent.cpp: More Inspector namespace removal and ... |
| (Inspector::InspectorDebuggerAgent::evaluateOnCallFrame): Use std::optional& intead of |
| OptOutput* for out arguments. |
| * inspector/agents/InspectorDebuggerAgent.h: Ditto. |
| |
| * inspector/agents/InspectorHeapAgent.cpp: More Inspector namespace removal and ... |
| (Inspector::InspectorHeapAgent::getPreview): Use std::optional& intead of OptOutput* |
| for out arguments. |
| * inspector/agents/InspectorHeapAgent.h: Ditto. |
| |
| * inspector/agents/InspectorRuntimeAgent.cpp: More Inspector namespace removal and ... |
| (Inspector::InspectorRuntimeAgent::parse): Use std::optional& intead of OptOutput* |
| for out arguments. |
| (Inspector::InspectorRuntimeAgent::evaluate): Ditto. |
| (Inspector::InspectorRuntimeAgent::callFunctionOn): Ditto. |
| (Inspector::InspectorRuntimeAgent::saveResult): Ditto. |
| * inspector/agents/InspectorRuntimeAgent.h: Ditto. |
| |
| * inspector/agents/InspectorScriptProfilerAgent.cpp: More Inspector namespace removal |
| and removed some bogus const. |
| * inspector/agents/InspectorScriptProfilerAgent.h: Ditto. |
| |
| * inspector/scripts/codegen/cpp_generator.py: |
| (CppGenerator.cpp_type_for_unchecked_formal_in_parameter): Removed some bogus const. |
| (CppGenerator.cpp_type_for_type_with_name): Ditto. |
| (CppGenerator.cpp_type_for_formal_out_parameter): Use std::optional& instead of |
| Inspector::Protocol::OptOutput*. |
| (CppGenerator.cpp_type_for_formal_async_parameter): Ditto. |
| (CppGenerator.cpp_type_for_stack_in_parameter): Ditto. |
| (CppGenerator.cpp_type_for_stack_out_parameter): Ditto. |
| |
| * inspector/scripts/codegen/cpp_generator_templates.py: Removed ASSERT_DISABLED |
| conditional around assertion code which will now compile to nothing if ASSERT is disabled. |
| Build strings more simply in a few cases. |
| |
| * inspector/scripts/codegen/generate_cpp_backend_dispatcher_implementation.py: |
| (CppBackendDispatcherImplementationGenerator._generate_async_dispatcher_class_for_domain): |
| Use has_value instead of isAssigned and * operator instead of getValue() since std::optional |
| replace OptOutput here. |
| (CppBackendDispatcherImplementationGenerator._generate_dispatcher_implementation_for_command): |
| Pass by reference instead of pointer now. |
| |
| * inspector/scripts/codegen/generate_cpp_protocol_types_header.py: |
| Removed ASSERT_DISABLED conditional around assertion code which will now compile to nothing |
| if ASSERT is disabled. |
| |
| * inspector/scripts/codegen/generate_cpp_protocol_types_implementation.py: |
| (CppProtocolTypesImplementationGenerator._generate_assertion_for_object_declaration): Generate |
| the assertion function unconditionally, but leave out the assertions if ASSERT_DISABLED is true. |
| (CppProtocolTypesImplementationGenerator): Use auto instead of writing out JSON::Object::iterator. |
| |
| * inspector/scripts/codegen/generate_objc_backend_dispatcher_implementation.py: |
| (ObjCBackendDispatcherImplementationGenerator._generate_conversions_for_command): Build strings |
| more simply. |
| |
| * inspector/scripts/tests/generic/expected/commands-with-async-attribute.json-result: |
| * inspector/scripts/tests/generic/expected/commands-with-optional-call-return-parameters.json-result: |
| * inspector/scripts/tests/generic/expected/events-with-optional-parameters.json-result: |
| * inspector/scripts/tests/generic/expected/type-requiring-runtime-casts.json-result: |
| Rebaselined. |
| |
| 2018-02-16 Matt Lewis <jlewis3@apple.com> |
| |
| Unreviewed, rolling out r228318. |
| |
| The patch that this attempted to fix was rolled out already. |
| |
| Reverted changeset: |
| |
| "Fix build on ARMv7 traditional JSCOnly bot after r228306" |
| https://bugs.webkit.org/show_bug.cgi?id=182563 |
| https://trac.webkit.org/changeset/228318 |
| |
| 2018-02-16 Filip Pizlo <fpizlo@apple.com> |
| |
| Unreviewed, roll out r228306 (custom memcpy/memset) because the bots say that it was not a |
| progression. |
| |
| * assembler/AssemblerBuffer.h: |
| (JSC::AssemblerBuffer::append): |
| * heap/LargeAllocation.cpp: |
| (JSC::LargeAllocation::tryCreate): |
| * heap/MarkedBlock.cpp: |
| (JSC::MarkedBlock::Handle::didAddToDirectory): |
| * runtime/ArrayBuffer.cpp: |
| (JSC::ArrayBufferContents::tryAllocate): |
| (JSC::ArrayBufferContents::copyTo): |
| (JSC::ArrayBuffer::createInternal): |
| * runtime/ArrayBufferView.h: |
| (JSC::ArrayBufferView::zeroRangeImpl): |
| * runtime/ArrayConventions.cpp: |
| (JSC::clearArrayMemset): |
| * runtime/ArrayConventions.h: |
| (JSC::clearArray): |
| * runtime/ArrayPrototype.cpp: |
| (JSC::arrayProtoPrivateFuncConcatMemcpy): |
| * runtime/ButterflyInlines.h: |
| (JSC::Butterfly::tryCreate): |
| (JSC::Butterfly::createOrGrowPropertyStorage): |
| (JSC::Butterfly::growArrayRight): |
| (JSC::Butterfly::resizeArray): |
| * runtime/GenericTypedArrayViewInlines.h: |
| (JSC::GenericTypedArrayView<Adaptor>::create): |
| * runtime/JSArray.cpp: |
| (JSC::JSArray::appendMemcpy): |
| (JSC::JSArray::fastSlice): |
| * runtime/JSArrayBufferView.cpp: |
| (JSC::JSArrayBufferView::ConstructionContext::ConstructionContext): |
| * runtime/JSGenericTypedArrayViewInlines.h: |
| (JSC::JSGenericTypedArrayView<Adaptor>::set): |
| * runtime/JSObject.cpp: |
| (JSC::JSObject::constructConvertedArrayStorageWithoutCopyingElements): |
| (JSC::JSObject::shiftButterflyAfterFlattening): |
| * runtime/PropertyTable.cpp: |
| (JSC::PropertyTable::PropertyTable): |
| |
| 2018-02-16 Saam Barati <sbarati@apple.com> |
| |
| Fix bugs from r228411 |
| https://bugs.webkit.org/show_bug.cgi?id=182851 |
| <rdar://problem/37577732> |
| |
| Reviewed by JF Bastien. |
| |
| There was a bug from r228411 where inside the constant folding phase, |
| we used an insertCheck method that didn't handle varargs. This would |
| lead to a crash. When thinking about the fix for that function, I realized |
| a made a couple of mistakes in r228411. One is probably a security bug, and |
| the other is a performance bug because it'll prevent CSE for certain flavors |
| of GetByVal nodes. Both blunders are similar in nature. |
| |
| In r228411, I added code in LICM that inserted a CheckVarargs node with children |
| of another varargs node. However, to construct this new node's children, |
| I just copied the AdjacencyList. This does a shallow copy. What we needed |
| was a deep copy. We needed to create a new vararg AdjacencyList that points |
| to edges that are deep copies of the original varargs children. This patch |
| fixes this goof in LICM. |
| |
| r228411 made it so that PureValue over a varargs node would just compare actual |
| AdjacencyLists structs. So, if you had two GetByVals that had equal santized |
| children, their actual AdjacencyList structs are *not* bitwise equal, since they'll |
| have different firstChild values. Instead, we need to do a deep compare of their |
| adjacency lists. This patch teaches PureValue how to do that. |
| |
| * dfg/DFGClobberize.h: |
| (JSC::DFG::clobberize): |
| * dfg/DFGConstantFoldingPhase.cpp: |
| (JSC::DFG::ConstantFoldingPhase::foldConstants): |
| * dfg/DFGGraph.h: |
| (JSC::DFG::Graph::copyVarargChildren): |
| * dfg/DFGInsertionSet.h: |
| (JSC::DFG::InsertionSet::insertCheck): |
| * dfg/DFGLICMPhase.cpp: |
| (JSC::DFG::LICMPhase::attemptHoist): |
| * dfg/DFGPureValue.cpp: |
| (JSC::DFG::PureValue::dump const): |
| * dfg/DFGPureValue.h: |
| (JSC::DFG::PureValue::PureValue): |
| (JSC::DFG::PureValue::op const): |
| (JSC::DFG::PureValue::hash const): |
| (JSC::DFG::PureValue::operator== const): |
| (JSC::DFG::PureValue::isVarargs const): |
| (JSC::DFG::PureValue::children const): Deleted. |
| * dfg/DFGStrengthReductionPhase.cpp: |
| (JSC::DFG::StrengthReductionPhase::handleNode): |
| (JSC::DFG::StrengthReductionPhase::convertToIdentityOverChild): |
| |
| 2018-02-16 Matt Lewis <jlewis3@apple.com> |
| |
| Unreviewed, rolling out r228546. |
| |
| This caused a consistent crash on all macOS WK2 platforms. |
| |
| Reverted changeset: |
| |
| "Web Inspector: get rid of remaining uses of OptOutput<T>" |
| https://bugs.webkit.org/show_bug.cgi?id=180607 |
| https://trac.webkit.org/changeset/228546 |
| |
| 2018-02-16 Fujii Hironori <Hironori.Fujii@sony.com> |
| |
| fast/frames/sandboxed-iframe-navigation-top-denied.html is crashing in Inspector::createScriptCallStackForConsole::Exec for GTK |
| https://bugs.webkit.org/show_bug.cgi?id=172952 |
| |
| Reviewed by Michael Catanzaro. |
| |
| Null dereference of VM::topCallFrame happens in |
| Inspector::createScriptCallStackForConsole if the ExecState has no |
| call frames. |
| |
| * inspector/ScriptCallStackFactory.cpp: |
| (Inspector::createScriptCallStack): Do null check of topCallFrame. |
| (Inspector::createScriptCallStackForConsole): Ditto. |
| |
| 2018-02-15 Filip Pizlo <fpizlo@apple.com> |
| |
| Objects that contain dangerous things should be allocated far away from objects that can do OOB |
| https://bugs.webkit.org/show_bug.cgi?id=182843 |
| |
| Reviewed by Saam Barati. |
| |
| To complete our object distancing plan, we need to put objects that can contain unpoisoned data |
| far away from objects that cannot. Objects referenceable from JSValues cannot contain |
| unpoisoned data, but auxiliary data can. This further divides auxiliary data that is meant for |
| storing mostly JSValues from data that is meant for storing anything. |
| |
| This is achieved by having three SecurityKinds that are used for MarkedBlock selection and |
| zeroing sort of the same way SecurityOriginToken already was. |
| |
| This change shouldn't make anything slower. If anything, it will be a small speed-up because it |
| removes some cases of MarkedBlock zeroing since we don't need to zero blocks used for two of |
| the SecurityKinds. |
| |
| * Sources.txt: |
| * bytecode/ObjectAllocationProfileInlines.h: |
| (JSC::ObjectAllocationProfile::initializeProfile): |
| * heap/BlockDirectory.cpp: |
| (JSC::BlockDirectory::addBlock): |
| * heap/BlockDirectory.h: |
| * heap/CellAttributes.cpp: |
| (JSC::CellAttributes::dump const): |
| * heap/CellAttributes.h: |
| (JSC::CellAttributes::CellAttributes): |
| * heap/LocalAllocator.cpp: |
| (JSC::LocalAllocator::allocateSlowCase): |
| (JSC::LocalAllocator::tryAllocateWithoutCollecting): |
| * heap/MarkedBlock.cpp: |
| (JSC::MarkedBlock::Handle::didAddToDirectory): |
| (JSC::MarkedBlock::Handle::associateWithOrigin): Deleted. |
| * heap/MarkedBlock.h: |
| * heap/SecurityKind.cpp: Added. |
| (WTF::printInternal): |
| * heap/SecurityKind.h: Added. |
| * runtime/JSCellInlines.h: |
| (JSC::JSCell::subspaceFor): |
| * runtime/JSDestructibleObjectHeapCellType.cpp: |
| (JSC::JSDestructibleObjectHeapCellType::JSDestructibleObjectHeapCellType): |
| * runtime/JSObject.h: |
| (JSC::JSObject::subspaceFor): |
| * runtime/JSSegmentedVariableObjectHeapCellType.cpp: |
| (JSC::JSSegmentedVariableObjectHeapCellType::JSSegmentedVariableObjectHeapCellType): |
| * runtime/JSStringHeapCellType.cpp: |
| (JSC::JSStringHeapCellType::JSStringHeapCellType): |
| * runtime/Symbol.h: |
| (JSC::Symbol::subspaceFor): |
| * runtime/VM.cpp: |
| (JSC::VM::VM): |
| * runtime/VM.h: |
| * wasm/js/JSWebAssemblyCodeBlockHeapCellType.cpp: |
| (JSC::JSWebAssemblyCodeBlockHeapCellType::JSWebAssemblyCodeBlockHeapCellType): |
| |
| 2018-02-15 Darin Adler <darin@apple.com> |
| |
| Web Inspector: get rid of remaining uses of OptOutput<T> |
| https://bugs.webkit.org/show_bug.cgi?id=180607 |
| |
| Reviewed by Brian Burg. |
| |
| * inspector/AsyncStackTrace.cpp: Removed explicit Inspector prefix from code that |
| is inside the Inspector namespace already. Also use auto a bit. |
| * inspector/AsyncStackTrace.h: Ditto. |
| * inspector/ConsoleMessage.cpp: Ditto. |
| |
| * inspector/ContentSearchUtilities.cpp: More Inspector namespace removal and ... |
| (Inspector::ContentSearchUtilities::getRegularExpressionMatchesByLines): Use a |
| Vector instead of a unique_ptr<Vector>. |
| (Inspector::ContentSearchUtilities::lineEndings): Ditto. |
| (Inspector::ContentSearchUtilities::stylesheetCommentPattern): Deleted. |
| (Inspector::ContentSearchUtilities::findMagicComment): Use std::array instead of |
| a Vector for a fixed size array; also got rid of reinterpret_cast. |
| (Inspector::ContentSearchUtilities::findStylesheetSourceMapURL): Moved the regular |
| expression here since it's the only place it was used. |
| |
| * inspector/ContentSearchUtilities.h: Cut down on unneeded includes. |
| |
| * inspector/InjectedScript.cpp: Removed explicit Inspector prefix from code that |
| is inside the Inspector namespace already. Also use auto a bit. |
| |
| * inspector/InspectorProtocolTypes.h: Removed OptOutput. Simplified assertions. |
| Removed base template for BindingTraits; we only need the specializations. |
| |
| * inspector/ScriptCallFrame.cpp: Removed explicit Inspector prefix from code that |
| is inside the Inspector namespace already. Also use auto a bit. |
| * inspector/ScriptCallFrame.h: Ditto. |
| * inspector/ScriptCallStack.cpp: Ditto. |
| * inspector/ScriptCallStack.h: Ditto. |
| * inspector/agents/InspectorConsoleAgent.cpp: Ditto. |
| * inspector/agents/InspectorConsoleAgent.h: Ditto. |
| |
| * inspector/agents/InspectorDebuggerAgent.cpp: More Inspector namespace removal and ... |
| (Inspector::InspectorDebuggerAgent::evaluateOnCallFrame): Use std::optional& intead of |
| OptOutput* for out arguments. |
| * inspector/agents/InspectorDebuggerAgent.h: Ditto. |
| |
| * inspector/agents/InspectorHeapAgent.cpp: More Inspector namespace removal and ... |
| (Inspector::InspectorHeapAgent::getPreview): Use std::optional& intead of OptOutput* |
| for out arguments. |
| * inspector/agents/InspectorHeapAgent.h: Ditto. |
| |
| * inspector/agents/InspectorRuntimeAgent.cpp: More Inspector namespace removal and ... |
| (Inspector::InspectorRuntimeAgent::parse): Use std::optional& intead of OptOutput* |
| for out arguments. |
| (Inspector::InspectorRuntimeAgent::evaluate): Ditto. |
| (Inspector::InspectorRuntimeAgent::callFunctionOn): Ditto. |
| (Inspector::InspectorRuntimeAgent::saveResult): Ditto. |
| * inspector/agents/InspectorRuntimeAgent.h: Ditto. |
| |
| * inspector/agents/InspectorScriptProfilerAgent.cpp: More Inspector namespace removal |
| and removed some bogus const. |
| * inspector/agents/InspectorScriptProfilerAgent.h: Ditto. |
| |
| * inspector/scripts/codegen/cpp_generator.py: |
| (CppGenerator.cpp_type_for_unchecked_formal_in_parameter): Removed some bogus const. |
| (CppGenerator.cpp_type_for_type_with_name): Ditto. |
| (CppGenerator.cpp_type_for_formal_out_parameter): Use std::optional& instead of |
| Inspector::Protocol::OptOutput*. |
| (CppGenerator.cpp_type_for_formal_async_parameter): Ditto. |
| (CppGenerator.cpp_type_for_stack_in_parameter): Ditto. |
| (CppGenerator.cpp_type_for_stack_out_parameter): Ditto. |
| |
| * inspector/scripts/codegen/cpp_generator_templates.py: Removed ASSERT_DISABLED |
| conditional around assertion code which will now compile to nothing if ASSERT is disabled. |
| Build strings more simply in a few cases. |
| |
| * inspector/scripts/codegen/generate_cpp_backend_dispatcher_implementation.py: |
| (CppBackendDispatcherImplementationGenerator._generate_async_dispatcher_class_for_domain): |
| Use has_value instead of isAssigned and * operator instead of getValue() since std::optional |
| replace OptOutput here. |
| (CppBackendDispatcherImplementationGenerator._generate_dispatcher_implementation_for_command): |
| Pass by reference instead of pointer now. |
| |
| * inspector/scripts/codegen/generate_cpp_protocol_types_header.py: |
| Removed ASSERT_DISABLED conditional around assertion code which will now compile to nothing |
| if ASSERT is disabled. |
| |
| * inspector/scripts/codegen/generate_cpp_protocol_types_implementation.py: |
| (CppProtocolTypesImplementationGenerator._generate_assertion_for_object_declaration): Generate |
| the assertion function unconditionally, but leave out the assertions if ASSERT_DISABLED is true. |
| (CppProtocolTypesImplementationGenerator): Use auto instead of writing out JSON::Object::iterator. |
| |
| * inspector/scripts/codegen/generate_objc_backend_dispatcher_implementation.py: |
| (ObjCBackendDispatcherImplementationGenerator._generate_conversions_for_command): Build strings |
| more simply. |
| |
| * inspector/scripts/tests/generic/expected/commands-with-async-attribute.json-result: |
| * inspector/scripts/tests/generic/expected/commands-with-optional-call-return-parameters.json-result: |
| * inspector/scripts/tests/generic/expected/events-with-optional-parameters.json-result: |
| * inspector/scripts/tests/generic/expected/type-requiring-runtime-casts.json-result: |
| Rebaselined. |
| |
| 2018-02-15 Filip Pizlo <fpizlo@apple.com> |
| |
| Unreviewed, roll out r228366 since it did not progress anything. |
| |
| * heap/Heap.cpp: |
| (JSC::Heap::finalizeUnconditionalFinalizers): |
| * runtime/ErrorInstance.cpp: |
| (JSC::ErrorInstance::visitChildren): |
| (JSC::ErrorInstance::finalizeUnconditionally): Deleted. |
| * runtime/ErrorInstance.h: |
| (JSC::ErrorInstance::stackTrace): |
| (JSC::ErrorInstance::subspaceFor): Deleted. |
| * runtime/Exception.cpp: |
| (JSC::Exception::visitChildren): |
| (JSC::Exception::finalizeUnconditionally): Deleted. |
| * runtime/Exception.h: |
| * runtime/StackFrame.cpp: |
| (JSC::StackFrame::visitChildren): |
| (JSC::StackFrame::isFinalizationCandidate): Deleted. |
| (JSC::StackFrame::finalizeUnconditionally): Deleted. |
| * runtime/StackFrame.h: |
| * runtime/VM.cpp: |
| (JSC::VM::VM): |
| * runtime/VM.h: |
| |
| 2018-02-15 Yusuke Suzuki <utatane.tea@gmail.com> |
| |
| [JSC] Remove monotonicallyIncreasingTime and currentTime |
| https://bugs.webkit.org/show_bug.cgi?id=182793 |
| |
| Reviewed by Saam Barati. |
| |
| We would like to drop monotonicallyIncreasingTime and currentTime from our tree by |
| replacing them with MonotonicTime and WallTime, which are well-typed alternatives, |
| compared to double. |
| This patch removes monotonicallyIncreasingTime and currentTime in JSC. |
| |
| * b3/testb3.cpp: |
| (JSC::B3::testComplex): |
| * dfg/DFGPhase.h: |
| (JSC::DFG::runAndLog): |
| * dfg/DFGPlan.cpp: |
| (JSC::DFG::Plan::compileInThread): |
| (JSC::DFG::Plan::compileInThreadImpl): |
| * dfg/DFGPlan.h: |
| * dynbench.cpp: |
| (JSC::benchmarkImpl): |
| * heap/BlockDirectory.cpp: |
| (JSC::BlockDirectory::isPagedOut): |
| * heap/BlockDirectory.h: |
| * heap/FullGCActivityCallback.cpp: |
| (JSC::FullGCActivityCallback::doCollection): |
| * heap/Heap.cpp: |
| (JSC::Heap::isPagedOut): |
| (JSC::Heap::sweepSynchronously): |
| * heap/Heap.h: |
| * heap/MarkedSpace.cpp: |
| (JSC::MarkedSpace::isPagedOut): |
| * heap/MarkedSpace.h: |
| * inspector/agents/InspectorConsoleAgent.cpp: |
| (Inspector::InspectorConsoleAgent::startTiming): |
| (Inspector::InspectorConsoleAgent::stopTiming): |
| * inspector/agents/InspectorConsoleAgent.h: |
| * inspector/agents/InspectorRuntimeAgent.cpp: |
| (Inspector::InspectorRuntimeAgent::getRuntimeTypesForVariablesAtOffsets): |
| * jit/JIT.cpp: |
| (JSC::JIT::compileWithoutLinking): |
| (JSC::JIT::compileTimeStats): |
| * jit/JIT.h: |
| * jsc.cpp: |
| (StopWatch::start): |
| (StopWatch::stop): |
| (StopWatch::getElapsedMS): |
| (functionPreciseTime): |
| (runJSC): |
| * profiler/ProfilerDatabase.cpp: |
| (JSC::Profiler::Database::logEvent): |
| * profiler/ProfilerEvent.cpp: |
| (JSC::Profiler::Event::toJS const): |
| * profiler/ProfilerEvent.h: |
| (JSC::Profiler::Event::Event): |
| (JSC::Profiler::Event::time const): |
| * runtime/CodeCache.cpp: |
| (JSC::CodeCacheMap::pruneSlowCase): |
| * runtime/CodeCache.h: |
| (JSC::CodeCacheMap::CodeCacheMap): |
| (JSC::CodeCacheMap::prune): |
| * runtime/DateConstructor.cpp: |
| (JSC::callDate): |
| * runtime/TypeProfilerLog.cpp: |
| (JSC::TypeProfilerLog::processLogEntries): |
| * testRegExp.cpp: |
| (StopWatch::start): |
| (StopWatch::stop): |
| (StopWatch::getElapsedMS): |
| |
| 2018-02-14 Keith Miller <keith_miller@apple.com> |
| |
| We should be able to jsDynamicCast from JSType when possible |
| https://bugs.webkit.org/show_bug.cgi?id=182804 |
| |
| Reviewed by Filip Pizlo and Mark Lam. |
| |
| This patch beefs up jsDynamicCast in some of the cases where we |
| can use the JSType to quickly determine if a cell is a subclass of |
| the desired type. Since all JSCells have a range of JSTypes they support, |
| if there is a range exclusive to a class and all subclasses we can use |
| that range to quickly determine if the cast should be successful. |
| |
| Additionally, the JSValue versions of jsCast and jsDynamicCast now |
| call the JSCell version after checking the value is a cell. |
| |
| Finally, the casting functions have been moved to a new header, |
| JSCast.h |
| |
| * JavaScriptCore.xcodeproj/project.pbxproj: |
| * bytecode/CallVariant.h: |
| * bytecode/CodeBlock.h: |
| * bytecode/ExecutableToCodeBlockEdge.h: |
| * bytecode/TrackedReferences.h: |
| * bytecode/UnlinkedCodeBlock.h: |
| * bytecode/UnlinkedFunctionExecutable.h: |
| * dfg/DFGAbstractValue.h: |
| * dfg/DFGCommonData.h: |
| * dfg/DFGFrozenValue.h: |
| * dfg/DFGStructureAbstractValue.h: |
| * heap/CellContainerInlines.h: |
| * heap/ConservativeRoots.cpp: |
| * heap/GCLogging.cpp: |
| * heap/HeapInlines.h: |
| * heap/HeapSnapshotBuilder.cpp: |
| * heap/MarkedBlock.cpp: |
| * heap/MarkedBlockInlines.h: |
| * heap/SubspaceInlines.h: |
| * heap/WeakInlines.h: |
| * jit/JITOpcodes.cpp: |
| * jit/JITOpcodes32_64.cpp: |
| * llint/LLIntOffsetsExtractor.cpp: |
| * runtime/ArrayBufferNeuteringWatchpoint.h: |
| * runtime/BigIntPrototype.cpp: |
| * runtime/ClassInfo.h: |
| * runtime/CustomGetterSetter.h: |
| * runtime/FunctionRareData.h: |
| * runtime/GetterSetter.h: |
| * runtime/InferredType.h: |
| * runtime/InferredTypeTable.h: |
| * runtime/InferredValue.h: |
| * runtime/InternalFunction.cpp: |
| (JSC::InternalFunction::finishCreation): |
| * runtime/JSAPIValueWrapper.h: |
| * runtime/JSArray.h: |
| (JSC::JSArray::finishCreation): |
| * runtime/JSArrayBufferView.cpp: |
| (JSC::JSArrayBufferView::finishCreation): |
| * runtime/JSCast.h: Added. |
| (JSC::jsCast): |
| (JSC::JSCastingHelpers::jsDynamicCastGenericImpl): |
| (JSC::JSCastingHelpers::jsDynamicCastJSTypeImpl): |
| (JSC::JSCastingHelpers::JSDynamicCastTraits::cast): |
| (JSC::jsDynamicCast): |
| * runtime/JSCell.cpp: |
| * runtime/JSCell.h: |
| (JSC::jsCast): Deleted. |
| (JSC::jsDynamicCast): Deleted. |
| * runtime/JSCellInlines.h: |
| * runtime/JSFunction.cpp: |
| (JSC::JSFunction::finishCreation): |
| * runtime/JSJob.h: |
| * runtime/JSObject.h: |
| (JSC::JSObject::finishCreation): |
| * runtime/JSPromiseDeferred.h: |
| * runtime/JSPropertyNameEnumerator.h: |
| * runtime/NativeStdFunctionCell.h: |
| * runtime/ScopedArgumentsTable.h: |
| * runtime/SparseArrayValueMap.h: |
| * runtime/Structure.h: |
| * runtime/StructureChain.h: |
| * runtime/StructureRareData.h: |
| * tools/CellProfile.h: |
| * wasm/js/JSWebAssemblyCodeBlock.h: |
| |
| 2018-02-14 Michael Saboff <msaboff@apple.com> |
| |
| Crash: triggerOMGTierUpThunkGenerator() doesn't align the stack pointer before calling C++ code |
| https://bugs.webkit.org/show_bug.cgi?id=182808 |
| |
| Reviewed by Keith Miller. |
| |
| Set up a proper frame with a prologue and epilogue to align the stack pointer for the rest of the |
| thunk. |
| |
| * wasm/WasmThunks.cpp: |
| (JSC::Wasm::triggerOMGTierUpThunkGenerator): |
| |
| 2018-02-14 Saam Barati <sbarati@apple.com> |
| |
| Setting a VMTrap shouldn't look at topCallFrame since that may imply we're in C code and holding the malloc lock |
| https://bugs.webkit.org/show_bug.cgi?id=182801 |
| |
| Reviewed by Keith Miller. |
| |
| VMTraps would sometimes install traps when it paused the JS thread when it |
| was in C code. This is wrong, as installing traps mallocs, and the JS thread |
| may have been holding the malloc lock while in C code. This could lead to a |
| deadlock when C code was holding the malloc lock. |
| |
| This patch makes it so that we only install traps when we've proven the PC |
| is in JIT or LLInt code. If we're in JIT/LLInt code, we are guaranteed that |
| we're not holding the malloc lock. |
| |
| * jsc.cpp: |
| (GlobalObject::finishCreation): |
| (functionMallocInALoop): |
| * runtime/VMTraps.cpp: |
| (JSC::VMTraps::tryInstallTrapBreakpoints): |
| |
| 2018-02-14 Michael Saboff <msaboff@apple.com> |
| |
| REGRESSION(225695) : com.apple.WebKit.WebContent at com.apple.JavaScriptCore: JSC::RegExp::match + 630 :: stack overflow |
| https://bugs.webkit.org/show_bug.cgi?id=182705 |
| |
| Reviewed by Mark Lam. |
| |
| Moved the pattern context buffer used by YARR JIT'ed code from a stack local to a lazily allocated |
| buffer on the VM. Exposed when the buffer is needed to reduce likelihood that we'd allocated it. |
| Guarded use of the buffer with a lock since the DFG compiler may call into YARR JIT'ed code on a |
| compilation thread. |
| |
| * runtime/RegExpInlines.h: |
| (JSC::RegExp::matchInline): |
| * runtime/VM.cpp: |
| (JSC::VM::~VM): |
| (JSC::VM::acquireRegExpPatternContexBuffer): |
| (JSC::VM::releaseRegExpPatternContexBuffer): |
| * runtime/VM.h: |
| * yarr/YarrJIT.cpp: |
| (JSC::Yarr::YarrGenerator::generate): |
| (JSC::Yarr::YarrGenerator::backtrack): |
| (JSC::Yarr::YarrGenerator::opCompileParenthesesSubpattern): |
| (JSC::Yarr::YarrGenerator::generateEnter): |
| (JSC::Yarr::YarrGenerator::generateReturn): |
| (JSC::Yarr::YarrGenerator::YarrGenerator): |
| (JSC::Yarr::YarrGenerator::compile): |
| * yarr/YarrJIT.h: |
| (JSC::Yarr::YarrCodeBlock::usesPatternContextBuffer): |
| (JSC::Yarr::YarrCodeBlock::setUsesPaternContextBuffer): |
| |
| 2018-02-13 Saam Barati <sbarati@apple.com> |
| |
| putDirectIndexSlowOrBeyondVectorLength needs to convert to dictionary indexing mode always if attributes are present |
| https://bugs.webkit.org/show_bug.cgi?id=182755 |
| <rdar://problem/37080864> |
| |
| Reviewed by Keith Miller. |
| |
| putDirectIndexSlowOrBeyondVectorLength with non-zero attributes only converted |
| the object in question to a dictionary indexing mode when the index is less than |
| the vector length. This makes no sense. If we're defining a getter, setter, or read |
| only property, we must always enter the dictionary indexing mode irrespective |
| of the index in relation to the vector length. |
| |
| * runtime/JSObject.cpp: |
| (JSC::JSObject::putDirectIndexSlowOrBeyondVectorLength): |
| |
| 2018-02-13 Saam Barati <sbarati@apple.com> |
| |
| Follup fix to r228411 for 32-bit builds. I missed a place where we used non vararg getter for child2(). |
| |
| * dfg/DFGSpeculativeJIT32_64.cpp: |
| (JSC::DFG::SpeculativeJIT::compile): |
| |
| 2018-02-13 Guillaume Emont <guijemont@igalia.com> |
| |
| [YarrJIT][ARM] We need to save r8 as it is the initial start register |
| https://bugs.webkit.org/show_bug.cgi?id=182157 |
| |
| Reviewed by Saam Barati. |
| |
| Register r8 is the initial start register since r224172, so we need to |
| save it. We still need to save r6 as well even though it is not the |
| initial start register any more, since it is used by the |
| MacroAssembler which we use (we get crashes in some situations if we |
| don't save r6). This issue was discovered because |
| stress/regress-174044.js crashes on a raspberry pi 2 when compiled in |
| -O2. |
| |
| * yarr/YarrJIT.cpp: |
| (JSC::Yarr::YarrGenerator::generateEnter): |
| (JSC::Yarr::YarrGenerator::generateReturn): |
| |
| 2018-02-13 Caitlin Potter <caitp@igalia.com> |
| |
| [JSC] cache TaggedTemplate arrays by callsite rather than by contents |
| https://bugs.webkit.org/show_bug.cgi?id=182717 |
| |
| Reviewed by Yusuke Suzuki. |
| |
| https://github.com/tc39/ecma262/pull/890 imposes a change to template |
| literals, to allow template callsite arrays to be collected when the |
| code containing the tagged template call is collected. This spec change |
| has received concensus and been ratified. |
| |
| This change eliminates the eternal map associating template contents |
| with arrays. |
| |
| * CMakeLists.txt: |
| * JavaScriptCore.xcodeproj/project.pbxproj: |
| * Sources.txt: |
| * bytecode/CodeBlock.cpp: |
| (JSC::CodeBlock::setConstantRegisters): |
| * bytecode/DirectEvalCodeCache.cpp: |
| (JSC::DirectEvalCodeCache::setSlow): |
| * bytecode/UnlinkedCodeBlock.cpp: |
| (JSC::UnlinkedCodeBlock::UnlinkedCodeBlock): |
| * bytecode/UnlinkedCodeBlock.h: |
| (JSC::UnlinkedCodeBlock::allowDirectEvalCache const): |
| * bytecompiler/BytecodeGenerator.cpp: |
| (JSC::BytecodeGenerator::addTemplateObjectConstant): |
| (JSC::BytecodeGenerator::emitGetTemplateObject): |
| (JSC::BytecodeGenerator::addTemplateRegistryKeyConstant): Deleted. |
| * bytecompiler/BytecodeGenerator.h: |
| * parser/Parser.cpp: |
| (JSC::Parser<LexerType>::parseInner): |
| (JSC::Parser<LexerType>::parseMemberExpression): |
| * parser/Parser.h: |
| * parser/ParserModes.h: |
| * runtime/EvalExecutable.h: |
| (JSC::EvalExecutable::allowDirectEvalCache const): |
| * runtime/JSGlobalObject.cpp: |
| (JSC::JSGlobalObject::JSGlobalObject): |
| * runtime/JSGlobalObject.h: |
| (JSC::JSGlobalObject::templateRegistry): Deleted. |
| * runtime/JSTemplateObjectDescriptor.cpp: Renamed from Source/JavaScriptCore/runtime/TemplateRegistry.cpp. |
| (JSC::JSTemplateObjectDescriptor::JSTemplateObjectDescriptor): |
| (JSC::JSTemplateObjectDescriptor::create): |
| (JSC::JSTemplateObjectDescriptor::destroy): |
| (JSC::JSTemplateObjectDescriptor::createTemplateObject): |
| * runtime/JSTemplateObjectDescriptor.h: Renamed from Source/JavaScriptCore/runtime/JSTemplateRegistryKey.h. |
| (JSC::isTemplateObjectDescriptor): |
| * runtime/JSTemplateRegistryKey.cpp: Removed. |
| * runtime/TemplateObjectDescriptor.cpp: Renamed from Source/JavaScriptCore/runtime/TemplateRegistryKey.cpp. |
| (JSC::TemplateObjectDescriptor::~TemplateObjectDescriptor): |
| * runtime/TemplateObjectDescriptor.h: Renamed from Source/JavaScriptCore/runtime/TemplateRegistryKey.h. |
| (JSC::TemplateObjectDescriptor::operator== const): |
| (JSC::TemplateObjectDescriptor::operator!= const): |
| (JSC::TemplateObjectDescriptor::Hasher::hash): |
| (JSC::TemplateObjectDescriptor::Hasher::equal): |
| (JSC::TemplateObjectDescriptor::create): |
| (JSC::TemplateObjectDescriptor::TemplateObjectDescriptor): |
| (JSC::TemplateObjectDescriptor::calculateHash): |
| * runtime/TemplateRegistry.h: Removed. |
| * runtime/TemplateRegistryKeyTable.cpp: Removed. |
| * runtime/TemplateRegistryKeyTable.h: Removed. |
| * runtime/VM.cpp: |
| (JSC::VM::VM): |
| * runtime/VM.h: |
| (JSC::VM::templateRegistryKeyTable): Deleted. |
| * runtime/VMEntryScope.cpp: |
| |
| * CMakeLists.txt: |
| * JavaScriptCore.xcodeproj/project.pbxproj: |
| * Sources.txt: |
| * bytecode/CodeBlock.cpp: |
| (JSC::CodeBlock::setConstantRegisters): |
| * bytecode/DirectEvalCodeCache.cpp: |
| (JSC::DirectEvalCodeCache::setSlow): |
| * bytecode/UnlinkedCodeBlock.h: |
| (JSC::UnlinkedCodeBlock::allowDirectEvalCache const): |
| * bytecompiler/BytecodeGenerator.cpp: |
| (JSC::BytecodeGenerator::addTemplateObjectConstant): |
| (JSC::BytecodeGenerator::emitGetTemplateObject): |
| (JSC::BytecodeGenerator::addTemplateRegistryKeyConstant): Deleted. |
| * bytecompiler/BytecodeGenerator.h: |
| * parser/Parser.cpp: |
| (JSC::Parser<LexerType>::parseInner): |
| (JSC::Parser<LexerType>::parseMemberExpression): |
| * parser/Parser.h: |
| * parser/ParserModes.h: |
| * runtime/EvalExecutable.h: |
| (JSC::EvalExecutable::allowDirectEvalCache const): |
| * runtime/JSGlobalObject.cpp: |
| (JSC::JSGlobalObject::JSGlobalObject): |
| * runtime/JSGlobalObject.h: |
| (JSC::JSGlobalObject::templateRegistry): Deleted. |
| * runtime/JSTemplateObjectDescriptor.cpp: Renamed from Source/JavaScriptCore/runtime/TemplateRegistry.cpp. |
| (JSC::JSTemplateObjectDescriptor::JSTemplateObjectDescriptor): |
| (JSC::JSTemplateObjectDescriptor::create): |
| (JSC::JSTemplateObjectDescriptor::destroy): |
| (JSC::JSTemplateObjectDescriptor::createTemplateObject): |
| * runtime/JSTemplateObjectDescriptor.h: Renamed from Source/JavaScriptCore/runtime/JSTemplateRegistryKey.h. |
| (JSC::isTemplateObjectDescriptor): |
| * runtime/JSTemplateRegistryKey.cpp: Removed. |
| * runtime/TemplateObjectDescriptor.cpp: Renamed from Source/JavaScriptCore/runtime/TemplateRegistryKey.cpp. |
| (JSC::TemplateObjectDescriptor::~TemplateObjectDescriptor): |
| * runtime/TemplateObjectDescriptor.h: Renamed from Source/JavaScriptCore/runtime/TemplateRegistryKey.h. |
| (JSC::TemplateObjectDescriptor::operator== const): |
| (JSC::TemplateObjectDescriptor::operator!= const): |
| (JSC::TemplateObjectDescriptor::Hasher::hash): |
| (JSC::TemplateObjectDescriptor::Hasher::equal): |
| (JSC::TemplateObjectDescriptor::create): |
| (JSC::TemplateObjectDescriptor::TemplateObjectDescriptor): |
| (JSC::TemplateObjectDescriptor::calculateHash): |
| * runtime/TemplateRegistry.h: Removed. |
| * runtime/TemplateRegistryKeyTable.cpp: Removed. |
| * runtime/TemplateRegistryKeyTable.h: Removed. |
| * runtime/VM.cpp: |
| (JSC::VM::VM): |
| * runtime/VM.h: |
| (JSC::VM::templateRegistryKeyTable): Deleted. |
| * runtime/VMEntryScope.cpp: |
| |
| * CMakeLists.txt: |
| * JavaScriptCore.xcodeproj/project.pbxproj: |
| * Sources.txt: |
| * bytecode/CodeBlock.cpp: |
| (JSC::CodeBlock::setConstantRegisters): |
| * bytecode/DirectEvalCodeCache.cpp: |
| (JSC::DirectEvalCodeCache::setSlow): |
| * bytecode/UnlinkedCodeBlock.h: |
| (JSC::UnlinkedCodeBlock::allowDirectEvalCache const): |
| * bytecompiler/BytecodeGenerator.cpp: |
| (JSC::BytecodeGenerator::addTemplateObjectConstant): |
| (JSC::BytecodeGenerator::emitGetTemplateObject): |
| (JSC::BytecodeGenerator::addTemplateRegistryKeyConstant): Deleted. |
| * bytecompiler/BytecodeGenerator.h: |
| * parser/Parser.cpp: |
| (JSC::Parser<LexerType>::parseInner): |
| (JSC::Parser<LexerType>::parseMemberExpression): |
| * parser/Parser.h: |
| * parser/ParserModes.h: |
| * runtime/EvalExecutable.h: |
| (JSC::EvalExecutable::allowDirectEvalCache const): |
| * runtime/JSGlobalObject.cpp: |
| (JSC::JSGlobalObject::JSGlobalObject): |
| * runtime/JSGlobalObject.h: |
| (JSC::JSGlobalObject::templateRegistry): Deleted. |
| * runtime/JSTemplateObjectDescriptor.cpp: Renamed from Source/JavaScriptCore/runtime/TemplateRegistry.cpp. |
| (JSC::JSTemplateObjectDescriptor::JSTemplateObjectDescriptor): |
| (JSC::JSTemplateObjectDescriptor::create): |
| (JSC::JSTemplateObjectDescriptor::destroy): |
| (JSC::JSTemplateObjectDescriptor::createTemplateObject): |
| * runtime/JSTemplateObjectDescriptor.h: Renamed from Source/JavaScriptCore/runtime/JSTemplateRegistryKey.h. |
| (JSC::isTemplateObjectDescriptor): |
| * runtime/JSTemplateRegistryKey.cpp: Removed. |
| * runtime/TemplateObjectDescriptor.cpp: Renamed from Source/JavaScriptCore/runtime/TemplateRegistryKey.cpp. |
| (JSC::TemplateObjectDescriptor::~TemplateObjectDescriptor): |
| * runtime/TemplateObjectDescriptor.h: Renamed from Source/JavaScriptCore/runtime/TemplateRegistryKey.h. |
| (JSC::TemplateObjectDescriptor::operator== const): |
| (JSC::TemplateObjectDescriptor::operator!= const): |
| (JSC::TemplateObjectDescriptor::Hasher::hash): |
| (JSC::TemplateObjectDescriptor::Hasher::equal): |
| (JSC::TemplateObjectDescriptor::create): |
| (JSC::TemplateObjectDescriptor::TemplateObjectDescriptor): |
| (JSC::TemplateObjectDescriptor::calculateHash): |
| * runtime/TemplateRegistry.h: Removed. |
| * runtime/TemplateRegistryKeyTable.cpp: Removed. |
| * runtime/TemplateRegistryKeyTable.h: Removed. |
| * runtime/VM.cpp: |
| (JSC::VM::VM): |
| * runtime/VM.h: |
| (JSC::VM::templateRegistryKeyTable): Deleted. |
| * runtime/VMEntryScope.cpp: |
| |
| 2018-02-13 Yusuke Suzuki <utatane.tea@gmail.com> |
| |
| Support GetArrayLength on ArrayStorage in the FTL |
| https://bugs.webkit.org/show_bug.cgi?id=182625 |
| |
| Reviewed by Saam Barati. |
| |
| This patch adds GetArrayLength and CheckArray + ArrayStorage & SlowPutArrayStorage support for FTL. |
| The implementation is trivial; just porting one in DFG to FTL. |
| |
| This fixes several FTL compilation failures in web-tooling-benchmarks while we still need to support |
| ArrayPush, ArrayPop, Arrayify, and PutByVal. |
| |
| * dfg/DFGSpeculativeJIT.cpp: |
| (JSC::DFG::SpeculativeJIT::checkArray): |
| * ftl/FTLCapabilities.cpp: |
| (JSC::FTL::canCompile): |
| * ftl/FTLLowerDFGToB3.cpp: |
| (JSC::FTL::DFG::LowerDFGToB3::compileGetArrayLength): |
| (JSC::FTL::DFG::LowerDFGToB3::isArrayTypeForArrayify): |
| (JSC::FTL::DFG::LowerDFGToB3::isArrayTypeForCheckArray): |
| |
| 2018-02-10 Filip Pizlo <fpizlo@apple.com> |
| |
| Lock down JSFunction |
| https://bugs.webkit.org/show_bug.cgi?id=182652 |
| |
| Reviewed by Saam Barati. |
| |
| This poisons pointers in JSFunction and puts all of the types in the JSFunction hierarchy in |
| isospaces. |
| |
| This is so neutral on JetStream: 0.01% slower with p = 0.969211. |
| |
| * dfg/DFGSpeculativeJIT.cpp: |
| (JSC::DFG::SpeculativeJIT::compileNewFunctionCommon): |
| (JSC::DFG::SpeculativeJIT::compileNewFunction): |
| (JSC::DFG::SpeculativeJIT::compileCreateThis): |
| * dfg/DFGSpeculativeJIT.h: |
| (JSC::DFG::SpeculativeJIT::TrustedImmPtr::TrustedImmPtr): |
| (JSC::DFG::SpeculativeJIT::TrustedImmPtr::weakPointer): |
| (JSC::DFG::SpeculativeJIT::TrustedImmPtr::weakPoisonedPointer): |
| * dfg/DFGSpeculativeJIT64.cpp: |
| (JSC::DFG::SpeculativeJIT::compile): |
| * ftl/FTLLowerDFGToB3.cpp: |
| (JSC::FTL::DFG::LowerDFGToB3::compileGetExecutable): |
| (JSC::FTL::DFG::LowerDFGToB3::compileNewFunction): |
| (JSC::FTL::DFG::LowerDFGToB3::weakPointer): |
| (JSC::FTL::DFG::LowerDFGToB3::weakPoisonedPointer): |
| * ftl/FTLOutput.h: |
| (JSC::FTL::Output::weakPointer): |
| (JSC::FTL::Output::weakPoisonedPointer): |
| * heap/MarkedSpace.cpp: |
| * jit/JITOpcodes.cpp: |
| (JSC::JIT::emit_op_create_this): |
| * jit/ThunkGenerators.cpp: |
| (JSC::virtualThunkFor): |
| (JSC::nativeForGenerator): |
| (JSC::boundThisNoArgsFunctionCallGenerator): |
| * llint/LowLevelInterpreter.asm: |
| * llint/LowLevelInterpreter64.asm: |
| * runtime/JSAsyncFunction.h: |
| (JSC::JSAsyncFunction::subspaceFor): |
| * runtime/JSAsyncGeneratorFunction.h: |
| (JSC::JSAsyncGeneratorFunction::subspaceFor): |
| * runtime/JSBoundFunction.h: |
| (JSC::JSBoundFunction::subspaceFor): |
| * runtime/JSCPoison.h: |
| * runtime/JSCustomGetterSetterFunction.h: |
| (JSC::JSCustomGetterSetterFunction::subspaceFor): |
| * runtime/JSFunction.h: |
| (JSC::JSFunction::subspaceFor): |
| * runtime/JSGeneratorFunction.h: |
| (JSC::JSGeneratorFunction::subspaceFor): |
| * runtime/JSNativeStdFunction.h: |
| (JSC::JSNativeStdFunction::subspaceFor): |
| * runtime/VM.cpp: |
| (JSC::VM::VM): |
| * runtime/VM.h: |
| * wasm/js/WebAssemblyFunction.h: |
| * wasm/js/WebAssemblyWrapperFunction.h: |
| |
| 2018-02-12 Saam Barati <sbarati@apple.com> |
| |
| Add a GetIndexMask node and make it an input to GetByVal for array and typed array accesses in DFG SSA |
| https://bugs.webkit.org/show_bug.cgi?id=182633 |
| <rdar://problem/37441037> |
| |
| Reviewed by Keith Miller. |
| |
| This patch introduces a GetIndexMask node to DFG SSA. This is an input to |
| GetByVal for the GetByVal variants that do conservative index masking. |
| The reason I'm adding this node is I realized there were loads of |
| the butterfly index mask inside loops that B3 couldn't reason about |
| because B3 can't arbitrarily hoist loads out of loops if those loops |
| have side exits (because the side exit might be protecting the safety of the |
| load). However, for these loops I analyzed, the DFG would be able to hoist |
| these loads out of loops because it knows about JS semantics to correctly |
| reason about the safety of hoisting the load. |
| |
| This is a 1% speedup on JetStream on Mac and iOS in my testing. |
| |
| This patch also adds some infrastructure for eliminating and doing CSE on |
| varargs nodes. Because this patch makes GetByVal a varargs node, I ran into |
| issues we never had before. We never had a varargs node that could be CSEd or be |
| hoisted out of a loop until I made GetByVal varargs. To make it all work, |
| I added a CheckVarargs node. This is just like Check, but it's varargs. |
| |
| * dfg/DFGAbstractInterpreterInlines.h: |
| (JSC::DFG::AbstractInterpreter<AbstractStateType>::executeEffects): |
| * dfg/DFGAdjacencyList.h: |
| (JSC::DFG::AdjacencyList::AdjacencyList): |
| * dfg/DFGArgumentsEliminationPhase.cpp: |
| * dfg/DFGBackwardsPropagationPhase.cpp: |
| (JSC::DFG::BackwardsPropagationPhase::propagate): |
| * dfg/DFGBasicBlock.cpp: |
| (JSC::DFG::BasicBlock::replaceTerminal): |
| * dfg/DFGBasicBlock.h: |
| (JSC::DFG::BasicBlock::findTerminal const): |
| * dfg/DFGBasicBlockInlines.h: |
| (JSC::DFG::BasicBlock::replaceTerminal): |
| * dfg/DFGByteCodeParser.cpp: |
| (JSC::DFG::ByteCodeParser::parseBlock): |
| * dfg/DFGCFGSimplificationPhase.cpp: |
| (JSC::DFG::CFGSimplificationPhase::mergeBlocks): |
| * dfg/DFGCPSRethreadingPhase.cpp: |
| (JSC::DFG::CPSRethreadingPhase::canonicalizeGetLocalFor): |
| (JSC::DFG::CPSRethreadingPhase::canonicalizeFlushOrPhantomLocalFor): |
| * dfg/DFGCSEPhase.cpp: |
| * dfg/DFGCleanUpPhase.cpp: |
| (JSC::DFG::CleanUpPhase::run): |
| * dfg/DFGClobberize.h: |
| (JSC::DFG::clobberize): |
| * dfg/DFGConstantFoldingPhase.cpp: |
| (JSC::DFG::ConstantFoldingPhase::foldConstants): |
| (JSC::DFG::ConstantFoldingPhase::fixUpsilons): |
| * dfg/DFGDCEPhase.cpp: |
| (JSC::DFG::DCEPhase::run): |
| (JSC::DFG::DCEPhase::fixupBlock): |
| * dfg/DFGDoesGC.cpp: |
| (JSC::DFG::doesGC): |
| * dfg/DFGFixupPhase.cpp: |
| (JSC::DFG::FixupPhase::fixupNode): |
| (JSC::DFG::FixupPhase::fixupChecksInBlock): |
| * dfg/DFGHeapLocation.cpp: |
| (WTF::printInternal): |
| * dfg/DFGHeapLocation.h: |
| * dfg/DFGIntegerCheckCombiningPhase.cpp: |
| (JSC::DFG::IntegerCheckCombiningPhase::handleBlock): |
| * dfg/DFGIntegerRangeOptimizationPhase.cpp: |
| * dfg/DFGLICMPhase.cpp: |
| (JSC::DFG::LICMPhase::attemptHoist): |
| * dfg/DFGMayExit.cpp: |
| * dfg/DFGNode.cpp: |
| (JSC::DFG::Node::remove): |
| (JSC::DFG::Node::convertToIdentityOn): |
| * dfg/DFGNode.h: |
| (JSC::DFG::Node::replaceWith): |
| * dfg/DFGNodeType.h: |
| * dfg/DFGObjectAllocationSinkingPhase.cpp: |
| * dfg/DFGPredictionPropagationPhase.cpp: |
| * dfg/DFGPureValue.cpp: |
| (JSC::DFG::PureValue::dump const): |
| * dfg/DFGPureValue.h: |
| (JSC::DFG::PureValue::PureValue): |
| * dfg/DFGPutStackSinkingPhase.cpp: |
| * dfg/DFGSSAConversionPhase.cpp: |
| (JSC::DFG::SSAConversionPhase::run): |
| * dfg/DFGSSALoweringPhase.cpp: |
| (JSC::DFG::SSALoweringPhase::handleNode): |
| * dfg/DFGSafeToExecute.h: |
| (JSC::DFG::safeToExecute): |
| * dfg/DFGSpeculativeJIT.cpp: |
| (JSC::DFG::SpeculativeJIT::SpeculativeJIT): |
| (JSC::DFG::SpeculativeJIT::compileGetByValOnString): |
| (JSC::DFG::SpeculativeJIT::compileGetByValOnIntTypedArray): |
| (JSC::DFG::SpeculativeJIT::compileGetByValOnFloatTypedArray): |
| (JSC::DFG::SpeculativeJIT::compileGetByValForObjectWithString): |
| (JSC::DFG::SpeculativeJIT::compileGetByValForObjectWithSymbol): |
| (JSC::DFG::SpeculativeJIT::compileGetByValOnDirectArguments): |
| (JSC::DFG::SpeculativeJIT::compileGetByValOnScopedArguments): |
| * dfg/DFGSpeculativeJIT.h: |
| * dfg/DFGSpeculativeJIT32_64.cpp: |
| (JSC::DFG::SpeculativeJIT::compile): |
| * dfg/DFGSpeculativeJIT64.cpp: |
| (JSC::DFG::SpeculativeJIT::compile): |
| * dfg/DFGStoreBarrierClusteringPhase.cpp: |
| * dfg/DFGValidate.cpp: |
| * dfg/DFGVarargsForwardingPhase.cpp: |
| * ftl/FTLCapabilities.cpp: |
| (JSC::FTL::canCompile): |
| * ftl/FTLLowerDFGToB3.cpp: |
| (JSC::FTL::DFG::LowerDFGToB3::compileNode): |
| (JSC::FTL::DFG::LowerDFGToB3::compileGetArrayMask): |
| (JSC::FTL::DFG::LowerDFGToB3::compileGetByVal): |
| (JSC::FTL::DFG::LowerDFGToB3::compileStringCharAt): |
| (JSC::FTL::DFG::LowerDFGToB3::maskedIndex): |
| (JSC::FTL::DFG::LowerDFGToB3::pointerIntoTypedArray): |
| |
| 2018-02-12 Mark Lam <mark.lam@apple.com> |
| |
| Miscellaneous refactoring of offlineasm. |
| https://bugs.webkit.org/show_bug.cgi?id=182702 |
| <rdar://problem/37467887> |
| |
| Reviewed by Filip Pizlo. |
| |
| 1. Refactor out the emission of $asm.comment, $asm.codeOrigin, $asm.annotation, |
| and $asm.debugAnnotation into a recordMetaData method. This standardizes how |
| we emit this metadata and makes all backends do it the same way. |
| |
| 2. Add the ability to include custom offlineasm scripts from WebKitAdditions in |
| the future. |
| |
| * offlineasm/arm.rb: |
| * offlineasm/arm64.rb: |
| * offlineasm/ast.rb: |
| * offlineasm/backends.rb: |
| * offlineasm/cloop.rb: |
| * offlineasm/config.rb: |
| * offlineasm/mips.rb: |
| * offlineasm/risc.rb: |
| * offlineasm/x86.rb: |
| |
| 2018-02-12 Saam Barati <sbarati@apple.com> |
| |
| DFG::emitCodeToGetArgumentsArrayLength needs to handle NewArrayBuffer/PhantomNewArrayBuffer |
| https://bugs.webkit.org/show_bug.cgi?id=182706 |
| <rdar://problem/36833681> |
| |
| Reviewed by Filip Pizlo. |
| |
| When we added support for PhantomNewArrayBuffer, we forgot to update |
| the emitCodeToGetArgumentsArrayLength function to handle PhantomNewArrayBuffer. |
| This patch adds that support. It's trivial to generate the length for |
| a PhantomNewArrayBuffer node since it's a constant buffer, with a constant |
| length. |
| |
| * dfg/DFGArgumentsUtilities.cpp: |
| (JSC::DFG::emitCodeToGetArgumentsArrayLength): |
| |
| 2018-02-12 Mark Lam <mark.lam@apple.com> |
| |
| Add more support for pointer preparations. |
| https://bugs.webkit.org/show_bug.cgi?id=182703 |
| <rdar://problem/37469451> |
| |
| Reviewed by Saam Barati. |
| |
| * llint/LLIntData.h: |
| (JSC::LLInt::getCodePtr): |
| * llint/LLIntPCRanges.h: |
| (JSC::LLInt::isLLIntPC): |
| * runtime/Options.cpp: |
| (JSC::recomputeDependentOptions): |
| |
| 2018-02-12 Mark Lam <mark.lam@apple.com> |
| |
| Fix missing exception check in RegExpObject::matchGlobal(). |
| https://bugs.webkit.org/show_bug.cgi?id=182701 |
| <rdar://problem/37465865> |
| |
| Reviewed by Michael Saboff. |
| |
| This issue was discovered when running JSC tests on an asm LLInt build with |
| JSC_useJIT=false. |
| |
| * runtime/RegExpObject.cpp: |
| (JSC::RegExpObject::matchGlobal): |
| |
| 2018-02-11 Guillaume Emont <guijemont@igalia.com> |
| |
| [MIPS] JSC needs to be built with -latomic |
| https://bugs.webkit.org/show_bug.cgi?id=182610 |
| |
| Reviewed by Žan Doberšek. |
| |
| Since r228149, on MIPS we need to link with -latomic, because |
| __atomic_fetch_add_8 is not available as a compiler intrinsic. |
| |
| * CMakeLists.txt: |
| |
| 2018-02-09 Filip Pizlo <fpizlo@apple.com> |
| |
| Don't waste memory for error.stack |
| https://bugs.webkit.org/show_bug.cgi?id=182656 |
| |
| Reviewed by Saam Barati. |
| |
| This makes the StackFrames in ErrorInstance and Exception weak. We simply forget their |
| contents if we GC. |
| |
| This isn't going to happen under normal operation since your callees and code blocks will |
| still be alive when you ask for .stack. |
| |
| Bug 182650 tracks improving this so that it's not lossy. For now, I think it's worth it, |
| since it is likely to recover 3-5 MB on membuster. |
| |
| * heap/Heap.cpp: |
| (JSC::Heap::finalizeUnconditionalFinalizers): |
| * runtime/ErrorInstance.cpp: |
| (JSC::ErrorInstance::visitChildren): |
| (JSC::ErrorInstance::finalizeUnconditionally): |
| * runtime/ErrorInstance.h: |
| (JSC::ErrorInstance::subspaceFor): |
| * runtime/Exception.cpp: |
| (JSC::Exception::visitChildren): |
| (JSC::Exception::finalizeUnconditionally): |
| * runtime/Exception.h: |
| (JSC::Exception::valueOffset): Deleted. |
| (JSC::Exception::value const): Deleted. |
| (JSC::Exception::stack const): Deleted. |
| (JSC::Exception::didNotifyInspectorOfThrow const): Deleted. |
| (JSC::Exception::setDidNotifyInspectorOfThrow): Deleted. |
| * runtime/StackFrame.cpp: |
| (JSC::StackFrame::isFinalizationCandidate): |
| (JSC::StackFrame::finalizeUnconditionally): |
| (JSC::StackFrame::visitChildren): Deleted. |
| * runtime/StackFrame.h: |
| * runtime/VM.cpp: |
| (JSC::VM::VM): |
| * runtime/VM.h: |
| |
| 2018-02-09 Carlos Alberto Lopez Perez <clopez@igalia.com> |
| |
| Fix build on ARMv7 traditional JSCOnly bot after r228306 |
| https://bugs.webkit.org/show_bug.cgi?id=182563 |
| |
| Unreviewed build fix. |
| |
| * assembler/AssemblerBuffer.h: |
| |
| 2018-02-08 Filip Pizlo <fpizlo@apple.com> |
| |
| Experiment with alternative implementation of memcpy/memset |
| https://bugs.webkit.org/show_bug.cgi?id=182563 |
| |
| Reviewed by Michael Saboff and Mark Lam. |
| |
| This adopts new fastCopy/fastZeroFill calls for calls to memcpy/memset that do not take a |
| constant size argument. |
| |
| * assembler/AssemblerBuffer.h: |
| (JSC::AssemblerBuffer::append): |
| * runtime/ArrayBuffer.cpp: |
| (JSC::ArrayBufferContents::tryAllocate): |
| (JSC::ArrayBufferContents::copyTo): |
| (JSC::ArrayBuffer::createInternal): |
| * runtime/ArrayBufferView.h: |
| (JSC::ArrayBufferView::zeroRangeImpl): |
| * runtime/ArrayConventions.cpp: |
| * runtime/ArrayConventions.h: |
| (JSC::clearArray): |
| * runtime/ArrayPrototype.cpp: |
| (JSC::arrayProtoPrivateFuncConcatMemcpy): |
| * runtime/ButterflyInlines.h: |
| (JSC::Butterfly::tryCreate): |
| (JSC::Butterfly::createOrGrowPropertyStorage): |
| (JSC::Butterfly::growArrayRight): |
| (JSC::Butterfly::resizeArray): |
| * runtime/GenericTypedArrayViewInlines.h: |
| (JSC::GenericTypedArrayView<Adaptor>::create): |
| * runtime/JSArray.cpp: |
| (JSC::JSArray::appendMemcpy): |
| (JSC::JSArray::fastSlice): |
| * runtime/JSArrayBufferView.cpp: |
| (JSC::JSArrayBufferView::ConstructionContext::ConstructionContext): |
| * runtime/JSGenericTypedArrayViewInlines.h: |
| (JSC::JSGenericTypedArrayView<Adaptor>::set): |
| * runtime/JSObject.cpp: |
| (JSC::JSObject::constructConvertedArrayStorageWithoutCopyingElements): |
| (JSC::JSObject::shiftButterflyAfterFlattening): |
| * runtime/PropertyTable.cpp: |
| (JSC::PropertyTable::PropertyTable): |
| |
| 2018-02-08 Don Olmstead <don.olmstead@sony.com> |
| |
| Remove JavaScriptCore/ForwardingHeaders directory |
| https://bugs.webkit.org/show_bug.cgi?id=182594 |
| |
| Reviewed by Mark Lam. |
| |
| * CMakeLists.txt: |
| * ForwardingHeaders/JavaScriptCore/APICast.h: Removed. |
| * ForwardingHeaders/JavaScriptCore/JSBase.h: Removed. |
| * ForwardingHeaders/JavaScriptCore/JSCTestRunnerUtils.h: Removed. |
| * ForwardingHeaders/JavaScriptCore/JSContextRef.h: Removed. |
| * ForwardingHeaders/JavaScriptCore/JSObjectRef.h: Removed. |
| * ForwardingHeaders/JavaScriptCore/JSObjectRefPrivate.h: Removed. |
| * ForwardingHeaders/JavaScriptCore/JSRetainPtr.h: Removed. |
| * ForwardingHeaders/JavaScriptCore/JSStringRef.h: Removed. |
| * ForwardingHeaders/JavaScriptCore/JSStringRefCF.h: Removed. |
| * ForwardingHeaders/JavaScriptCore/JSTypedArray.h: Removed. |
| * ForwardingHeaders/JavaScriptCore/JSValueRef.h: Removed. |
| * ForwardingHeaders/JavaScriptCore/JavaScript.h: Removed. |
| * ForwardingHeaders/JavaScriptCore/JavaScriptCore.h: Removed. |
| * ForwardingHeaders/JavaScriptCore/OpaqueJSString.h: Removed. |
| * ForwardingHeaders/JavaScriptCore/WebKitAvailability.h: Removed. |
| |
| 2018-02-06 Yusuke Suzuki <utatane.tea@gmail.com> |
| |
| [JSC] Implement Array.prototype.flatMap and Array.prototype.flatten |
| https://bugs.webkit.org/show_bug.cgi?id=182440 |
| |
| Reviewed by Darin Adler. |
| |
| This patch implements Array.prototype.flatMap and Array.prototype.flatten |
| since they are now stage 3 [1]. |
| |
| [1]: https://tc39.github.io/proposal-flatMap/#sec-FlattenIntoArray |
| |
| * builtins/ArrayPrototype.js: |
| (filter): |
| (map): |
| (globalPrivate.concatSlowPath): |
| (globalPrivate.arraySpeciesCreate): |
| (globalPrivate.flattenIntoArray): |
| (flatten): |
| (globalPrivate.flattenIntoArrayWithCallback): |
| We separate flattenIntoArray from flattenIntoArrayWithCallback due to performance reason. |
| We carefully keep both functions small to encourage inlining. |
| |
| (flatMap): |
| * runtime/ArrayPrototype.cpp: |
| (JSC::ArrayPrototype::finishCreation): |
| |
| 2018-01-13 Darin Adler <darin@apple.com> |
| |
| Event improvements |
| https://bugs.webkit.org/show_bug.cgi?id=179591 |
| |
| Reviewed by Chris Dumez. |
| |
| Remove all uses of ScriptValue other than in the implementation of ScriptObject. |
| |
| * bindings/ScriptFunctionCall.cpp: Removed include of ScriptValue.h. |
| |
| * bindings/ScriptObject.cpp: Removed unused overload of ScriptObject constructor. |
| * bindings/ScriptObject.h: Ditto. |
| |
| * bindings/ScriptValue.cpp: |
| (Deprecated::ScriptValue::~ScriptValue): Deleted. |
| (Deprecated::ScriptValue::getString const): Deleted. |
| (Deprecated::ScriptValue::toString const): Deleted. |
| (Deprecated::ScriptValue::isEqual const): Deleted. |
| (Deprecated::ScriptValue::isNull const): Deleted. |
| (Deprecated::ScriptValue::isUndefined const): Deleted. |
| (Deprecated::ScriptValue::isObject const): Deleted. |
| (Deprecated::ScriptValue::isFunction const): Deleted. |
| (Deprecated::ScriptValue::toInspectorValue const): Deleted. |
| * bindings/ScriptValue.h: Removed many unused functions. Made the rest |
| protected since this is now used only in ScriptObject. |
| |
| * inspector/ConsoleMessage.cpp: |
| (Inspector::ConsoleMessage::addToFrontend): Stop using ScriptValue. |
| (Inspector::ConsoleMessage::isEqual const): Updated for change to ScriptArguments::isEqual. |
| |
| * inspector/ScriptArguments.cpp: |
| (Inspector::ScriptArguments::create): Take a Vector of JSC::Strong, not ScriptValue, |
| use rvalue reference with move instead of lvalue reference with swap, and take execution |
| state by reference instead of pointer. |
| (Inspector::ScriptArguments::createEmpty): Deleted. Can now use create instead. |
| (Inspector::ScriptArguments::ScriptArguments): Ditto. |
| (Inspector::ScriptArguments::~ScriptArguments): Deleted. |
| (Inspector::ScriptArguments::argumentAt const): Updated to use JSC::Strong. |
| (Inspector::ScriptArguments::getFirstArgumentAsString): Ditto. |
| (Inspector::ScriptArguments::isEqual const): Ditto. Also changed to use JS internals |
| instead of calling through the C API. |
| * inspector/ScriptArguments.h: Updated for the above. |
| |
| * inspector/ScriptCallStackFactory.cpp: |
| (Inspector::createScriptArguments): Updated for changes to ScriptArguments. |
| |
| * inspector/ScriptDebugServer.cpp: Removed include of ScriptValue.h. |
| * inspector/agents/InspectorAgent.cpp: Ditto. |
| * inspector/agents/InspectorDebuggerAgent.cpp: Ditto. |
| (Inspector::InspectorDebuggerAgent::evaluateOnCallFrame): Use JSC::Strong instead |
| of ScriptValue. |
| (Inspector::InspectorDebuggerAgent::currentCallFrames): Ditto. |
| * inspector/agents/InspectorDebuggerAgent.h: Ditto. |
| * runtime/ConsoleClient.cpp: |
| (JSC::ConsoleClient::printConsoleMessageWithArguments): Ditto. |
| (JSC::ConsoleClient::clear): Use ScriptArguments::create and pass an empty vector |
| instead of calling a separate createEmpty function. |
| |
| * runtime/VM.cpp: |
| (JSC::VM::createLeaked): Deleted. |
| * runtime/VM.h: Deleted createLeaked. |
| |
| 2018-02-06 Brian Burg <bburg@apple.com> |
| |
| Web Inspector: protocol generator should automatically deduce the correct include style to use |
| https://bugs.webkit.org/show_bug.cgi?id=182505 |
| |
| Reviewed by Timothy Hatcher. |
| |
| Currently the generated imports use a mix of system header imports (powered by forwarding headers) |
| and framework-style includes. Since forwarding headers are going away, this patch stops |
| using system header includes for headers that are JavaScriptCore private headers. Instead, |
| use either a relative include or a framework include. |
| |
| * inspector/scripts/codegen/generate_cpp_alternate_backend_dispatcher_header.py: |
| (CppAlternateBackendDispatcherHeaderGenerator.generate_output): |
| (CppAlternateBackendDispatcherHeaderGenerator): |
| (CppAlternateBackendDispatcherHeaderGenerator._generate_secondary_header_includes): |
| * inspector/scripts/codegen/generate_cpp_backend_dispatcher_header.py: |
| (CppBackendDispatcherHeaderGenerator.generate_output): |
| (CppBackendDispatcherHeaderGenerator._generate_secondary_header_includes): |
| * inspector/scripts/codegen/generate_cpp_backend_dispatcher_implementation.py: |
| (CppBackendDispatcherImplementationGenerator.generate_output): |
| (CppBackendDispatcherImplementationGenerator._generate_secondary_header_includes): |
| * inspector/scripts/codegen/generate_cpp_frontend_dispatcher_header.py: |
| (CppFrontendDispatcherHeaderGenerator.generate_output): |
| (CppFrontendDispatcherHeaderGenerator._generate_secondary_header_includes): |
| * inspector/scripts/codegen/generate_cpp_frontend_dispatcher_implementation.py: |
| (CppFrontendDispatcherImplementationGenerator.generate_output): |
| (CppFrontendDispatcherImplementationGenerator._generate_secondary_header_includes): |
| * inspector/scripts/codegen/generate_cpp_protocol_types_header.py: |
| (CppProtocolTypesHeaderGenerator.generate_output): |
| (CppProtocolTypesHeaderGenerator._generate_secondary_header_includes): |
| * inspector/scripts/codegen/generate_cpp_protocol_types_implementation.py: |
| (CppProtocolTypesImplementationGenerator.generate_output): |
| (CppProtocolTypesImplementationGenerator._generate_secondary_header_includes): |
| * inspector/scripts/codegen/generate_objc_backend_dispatcher_header.py: |
| (ObjCBackendDispatcherHeaderGenerator): |
| Convert existing header lists to the new entries format, which includes the |
| allowable target frameworks and the relative path to the header. |
| |
| * inspector/scripts/codegen/generator.py: |
| (Generator.generate_includes_from_entries): |
| Copied from the same in the builtins code generator. It still works great. |
| |
| * inspector/scripts/tests/all/expected/definitions-with-mac-platform.json-result: |
| * inspector/scripts/tests/generic/expected/commands-with-async-attribute.json-result: |
| * inspector/scripts/tests/generic/expected/commands-with-optional-call-return-parameters.json-result: |
| * inspector/scripts/tests/generic/expected/definitions-with-mac-platform.json-result: |
| * inspector/scripts/tests/generic/expected/domain-availability.json-result: |
| * inspector/scripts/tests/generic/expected/domains-with-varying-command-sizes.json-result: |
| * inspector/scripts/tests/generic/expected/enum-values.json-result: |
| * inspector/scripts/tests/generic/expected/events-with-optional-parameters.json-result: |
| * inspector/scripts/tests/generic/expected/generate-domains-with-feature-guards.json-result: |
| * inspector/scripts/tests/generic/expected/same-type-id-different-domain.json-result: |
| * inspector/scripts/tests/generic/expected/shadowed-optional-type-setters.json-result: |
| * inspector/scripts/tests/generic/expected/type-declaration-aliased-primitive-type.json-result: |
| * inspector/scripts/tests/generic/expected/type-declaration-array-type.json-result: |
| * inspector/scripts/tests/generic/expected/type-declaration-enum-type.json-result: |
| * inspector/scripts/tests/generic/expected/type-declaration-object-type.json-result: |
| * inspector/scripts/tests/generic/expected/type-requiring-runtime-casts.json-result: |
| * inspector/scripts/tests/generic/expected/type-with-open-parameters.json-result: |
| * inspector/scripts/tests/generic/expected/worker-supported-domains.json-result: |
| * inspector/scripts/tests/ios/expected/definitions-with-mac-platform.json-result: |
| * inspector/scripts/tests/mac/expected/definitions-with-mac-platform.json-result: |
| Rebaseline. |
| |
| 2018-02-06 Keith Miller <keith_miller@apple.com> |
| |
| put_to_scope/get_from_scope should not cache lexical scopes when expecting a global object |
| https://bugs.webkit.org/show_bug.cgi?id=182549 |
| <rdar://problem/36189995> |
| |
| Reviewed by Saam Barati. |
| |
| Previously, the llint/baseline caching for put_to_scope and |
| get_from_scope would cache lexical environments when the |
| varInjectionWatchpoint had been fired for global properties. Code |
| in the DFG does not follow this same assumption so we could |
| potentially return the wrong result. Additionally, the baseline |
| would write barrier the global object rather than the lexical |
| enviroment object. This patch makes it so that we do not cache |
| anything other than the global object for when the resolve type is |
| GlobalPropertyWithVarInjectionChecks or GlobalProperty. |
| |
| * assembler/MacroAssembler.cpp: |
| (JSC::MacroAssembler::jitAssert): |
| * assembler/MacroAssembler.h: |
| * jit/JITPropertyAccess.cpp: |
| (JSC::JIT::emit_op_get_from_scope): |
| (JSC::JIT::emit_op_put_to_scope): |
| * runtime/CommonSlowPaths.h: |
| (JSC::CommonSlowPaths::tryCachePutToScopeGlobal): |
| (JSC::CommonSlowPaths::tryCacheGetFromScopeGlobal): |
| * runtime/Options.h: |
| |
| 2018-01-28 Filip Pizlo <fpizlo@apple.com> |
| |
| Global objects should be able to use TLCs to allocate from different blocks from each other |
| https://bugs.webkit.org/show_bug.cgi?id=182227 |
| |
| Reviewed by JF Bastien. |
| |
| This uses TLCs to create at least `minimumDistanceBetweenCellsFromDifferenOrigins` bytes of |
| distance between objects from different origins, using the following combination of things. For |
| short lets refer to that constant as K. |
| |
| - Since r227721, LargeAllocation puts K bytes padding at the end of each allocation. |
| |
| - Since r227718, MarkedBlock puts at least K bytes in its footer. |
| |
| - Since r227617, global objects can have their own TLCs, which make them allocate from a |
| different set of blocks than other global objects. The TLC of a global object comes into |
| effect when you enter the VM via that global object. |
| |
| - With this change, TLCs and blocks both have security origins. A TLC will only use blocks that |
| share the same security origin or empty blocks (in which case we zero the block and change |
| its security origin). |
| |
| WebCore determines the TLC-GlobalObject mapping. By default, global objects would simply use |
| the VM's default TLC. WebCore makes it so that DOM windows (but not worker global objects) get |
| a TLC based on their document's SecurityOrigin. |
| |
| * JavaScriptCore.xcodeproj/project.pbxproj: |
| * Sources.txt: |
| * heap/BlockDirectory.cpp: |
| (JSC::BlockDirectory::findBlockForAllocation): |
| (JSC::BlockDirectory::prepareForAllocation): |
| * heap/BlockDirectory.h: |
| * heap/LocalAllocator.cpp: |
| (JSC::LocalAllocator::LocalAllocator): |
| (JSC::LocalAllocator::reset): |
| (JSC::LocalAllocator::~LocalAllocator): |
| (JSC::LocalAllocator::allocateSlowCase): |
| (JSC::LocalAllocator::tryAllocateWithoutCollecting): |
| * heap/LocalAllocator.h: |
| (JSC::LocalAllocator::tlc const): |
| * heap/MarkStackMergingConstraint.cpp: |
| * heap/MarkStackMergingConstraint.h: |
| * heap/MarkedBlock.cpp: |
| (JSC::MarkedBlock::Handle::associateWithOrigin): |
| * heap/MarkedBlock.h: |
| (JSC::MarkedBlock::Handle::securityOriginToken const): |
| * heap/SecurityOriginToken.cpp: Added. |
| (JSC::uniqueSecurityOriginToken): |
| * heap/SecurityOriginToken.h: Added. |
| * heap/ThreadLocalCache.cpp: |
| (JSC::ThreadLocalCache::create): |
| (JSC::ThreadLocalCache::ThreadLocalCache): |
| (JSC::ThreadLocalCache::allocateData): |
| (JSC::ThreadLocalCache::installSlow): |
| * heap/ThreadLocalCache.h: |
| (JSC::ThreadLocalCache::securityOriginToken const): |
| * heap/ThreadLocalCacheInlines.h: |
| (JSC::ThreadLocalCache::install): |
| * runtime/JSGlobalObject.cpp: |
| (JSC::JSGlobalObject::JSGlobalObject): |
| (JSC::JSGlobalObject::createThreadLocalCache): |
| * runtime/JSGlobalObject.h: |
| (JSC::JSGlobalObject::threadLocalCache): |
| (JSC::JSGlobalObject::threadLocalCache const): Deleted. |
| * runtime/VMEntryScope.cpp: |
| (JSC::VMEntryScope::VMEntryScope): |
| (JSC::VMEntryScope::~VMEntryScope): |
| * runtime/VMEntryScope.h: |
| |
| 2018-02-05 Don Olmstead <don.olmstead@sony.com> |
| |
| JavaScriptCore files should not be included relatively |
| https://bugs.webkit.org/show_bug.cgi?id=182452 |
| |
| Reviewed by Keith Miller. |
| |
| * API/JSCallbackConstructor.h: |
| * CMakeLists.txt: |
| * disassembler/ARM64Disassembler.cpp: |
| * disassembler/ARMv7Disassembler.cpp: |
| * heap/LockDuringMarking.h: |
| * inspector/InjectedScriptBase.h: |
| * inspector/InjectedScriptHost.h: |
| * inspector/JavaScriptCallFrame.h: |
| * inspector/ScriptArguments.h: |
| * inspector/ScriptDebugListener.h: |
| * inspector/ScriptDebugServer.h: |
| * inspector/agents/InspectorAgent.h: |
| * inspector/agents/InspectorConsoleAgent.h: |
| * inspector/agents/InspectorDebuggerAgent.h: |
| * inspector/agents/InspectorHeapAgent.h: |
| * inspector/agents/InspectorRuntimeAgent.h: |
| * inspector/agents/InspectorScriptProfilerAgent.h: |
| * runtime/RegExp.h: |
| |
| 2018-02-05 Commit Queue <commit-queue@webkit.org> |
| |
| Unreviewed, rolling out r228012. |
| https://bugs.webkit.org/show_bug.cgi?id=182493 |
| |
| "It regressed ARES-6 by 2-4%" (Requested by saamyjoon on |
| #webkit). |
| |
| Reverted changeset: |
| |
| "[JSC] Clean up ArraySpeciesCreate" |
| https://bugs.webkit.org/show_bug.cgi?id=182434 |
| https://trac.webkit.org/changeset/228012 |
| |
| 2018-02-02 Ryan Haddad <ryanhaddad@apple.com> |
| |
| Rebaseline bindings generator tests after r228032. |
| https://bugs.webkit.org/show_bug.cgi?id=182445 |
| |
| Unreviewed test gardening. |
| |
| * Scripts/tests/builtins/expected/WebCoreJSBuiltins.h-result: |
| |
| 2018-02-02 Saam Barati <sbarati@apple.com> |
| |
| Make various DFG_ASSERTs provide more data to WTFCrashWithInfo |
| https://bugs.webkit.org/show_bug.cgi?id=182453 |
| <rdar://problem/37174236> |
| |
| Reviewed by JF Bastien and Mark Lam. |
| |
| * dfg/DFGAbstractInterpreterInlines.h: |
| (JSC::DFG::AbstractInterpreter<AbstractStateType>::executeEffects): |
| * dfg/DFGArgumentsEliminationPhase.cpp: |
| * dfg/DFGArgumentsUtilities.cpp: |
| (JSC::DFG::emitCodeToGetArgumentsArrayLength): |
| * dfg/DFGFixupPhase.cpp: |
| (JSC::DFG::FixupPhase::fixupChecksInBlock): |
| * dfg/DFGFlowIndexing.h: |
| (JSC::DFG::FlowIndexing::shadowIndex const): |
| * dfg/DFGLICMPhase.cpp: |
| (JSC::DFG::LICMPhase::run): |
| (JSC::DFG::LICMPhase::attemptHoist): |
| * dfg/DFGLoopPreHeaderCreationPhase.cpp: |
| (JSC::DFG::LoopPreHeaderCreationPhase::run): |
| * dfg/DFGPutStackSinkingPhase.cpp: |
| * dfg/DFGSpeculativeJIT.cpp: |
| (JSC::DFG::SpeculativeJIT::compileArithAbs): |
| (JSC::DFG::SpeculativeJIT::compileArithRounding): |
| (JSC::DFG::SpeculativeJIT::compileToPrimitive): |
| * dfg/DFGSpeculativeJIT64.cpp: |
| (JSC::DFG::SpeculativeJIT::fillJSValue): |
| (JSC::DFG::SpeculativeJIT::fillSpeculateInt32Internal): |
| (JSC::DFG::SpeculativeJIT::fillSpeculateInt32Strict): |
| (JSC::DFG::SpeculativeJIT::fillSpeculateInt52): |
| (JSC::DFG::SpeculativeJIT::fillSpeculateDouble): |
| (JSC::DFG::SpeculativeJIT::fillSpeculateBoolean): |
| (JSC::DFG::SpeculativeJIT::compile): |
| * dfg/DFGStoreBarrierClusteringPhase.cpp: |
| * dfg/DFGStoreBarrierInsertionPhase.cpp: |
| * ftl/FTLLowerDFGToB3.cpp: |
| (JSC::FTL::DFG::LowerDFGToB3::compileGetStack): |
| (JSC::FTL::DFG::LowerDFGToB3::compileArithClz32): |
| (JSC::FTL::DFG::LowerDFGToB3::compileArithAbs): |
| (JSC::FTL::DFG::LowerDFGToB3::compileArithRound): |
| (JSC::FTL::DFG::LowerDFGToB3::compileArithFloor): |
| (JSC::FTL::DFG::LowerDFGToB3::compileArithCeil): |
| (JSC::FTL::DFG::LowerDFGToB3::compileArithTrunc): |
| (JSC::FTL::DFG::LowerDFGToB3::compileArithNegate): |
| (JSC::FTL::DFG::LowerDFGToB3::compilePutById): |
| (JSC::FTL::DFG::LowerDFGToB3::compileGetIndexedPropertyStorage): |
| (JSC::FTL::DFG::LowerDFGToB3::compileGetByVal): |
| (JSC::FTL::DFG::LowerDFGToB3::compileStringFromCharCode): |
| (JSC::FTL::DFG::LowerDFGToB3::compileMultiPutByOffset): |
| (JSC::FTL::DFG::LowerDFGToB3::compileCompareEq): |
| (JSC::FTL::DFG::LowerDFGToB3::compileCompareStrictEq): |
| (JSC::FTL::DFG::LowerDFGToB3::compileIn): |
| (JSC::FTL::DFG::LowerDFGToB3::compare): |
| (JSC::FTL::DFG::LowerDFGToB3::switchStringRecurse): |
| (JSC::FTL::DFG::LowerDFGToB3::lowInt32): |
| (JSC::FTL::DFG::LowerDFGToB3::lowInt52): |
| (JSC::FTL::DFG::LowerDFGToB3::lowCell): |
| (JSC::FTL::DFG::LowerDFGToB3::lowBoolean): |
| (JSC::FTL::DFG::LowerDFGToB3::lowDouble): |
| (JSC::FTL::DFG::LowerDFGToB3::lowJSValue): |
| |
| 2018-02-02 Don Olmstead <don.olmstead@sony.com> |
| |
| JS Builtins should include JavaScriptCore headers directly |
| https://bugs.webkit.org/show_bug.cgi?id=182445 |
| |
| Reviewed by Yusuke Suzuki. |
| |
| * Scripts/builtins/builtins_generator.py: |
| * Scripts/tests/builtins/expected/WebCore-AnotherGuardedInternalBuiltin-Separate.js-result: |
| * Scripts/tests/builtins/expected/WebCore-ArbitraryConditionalGuard-Separate.js-result: |
| * Scripts/tests/builtins/expected/WebCore-GuardedBuiltin-Separate.js-result: |
| * Scripts/tests/builtins/expected/WebCore-GuardedInternalBuiltin-Separate.js-result: |
| * Scripts/tests/builtins/expected/WebCore-UnguardedBuiltin-Separate.js-result: |
| * Scripts/tests/builtins/expected/WebCore-xmlCasingTest-Separate.js-result: |
| |
| 2018-02-02 Saam Barati <sbarati@apple.com> |
| |
| When BytecodeParser inserts Unreachable after ForceOSRExit it needs to update ArgumentPositions for Flushes it inserts |
| https://bugs.webkit.org/show_bug.cgi?id=182368 |
| <rdar://problem/36932466> |
| |
| Reviewed by Mark Lam. |
| |
| When preserving liveness when inserting Unreachable nodes after ForceOSRExit, |
| we must add the VariableAccessData to the given argument position. Otherwise, |
| we may end up with a VariableAccessData that doesn't respect the shouldNeverUnbox bit. |
| If we end up with such a situation, it can lead to invalid IR after the |
| arguments elimination phase optimizes a GetByVal to a GetStack. |
| |
| * dfg/DFGByteCodeParser.cpp: |
| (JSC::DFG::ByteCodeParser::flushImpl): |
| (JSC::DFG::ByteCodeParser::flushForTerminalImpl): |
| (JSC::DFG::ByteCodeParser::flush): |
| (JSC::DFG::ByteCodeParser::flushForTerminal): |
| (JSC::DFG::ByteCodeParser::InlineStackEntry::InlineStackEntry): |
| (JSC::DFG::ByteCodeParser::parse): |
| |
| 2018-02-02 Mark Lam <mark.lam@apple.com> |
| |
| More ARM64_32 fixes. |
| https://bugs.webkit.org/show_bug.cgi?id=182441 |
| <rdar://problem/37162310> |
| |
| Reviewed by Dan Bernstein. |
| |
| I also disabled more dynamicPoisoning code in ARM64_32. This code assumes a |
| 64-bit pointer which is not applicable here. |
| |
| * jit/AssemblyHelpers.cpp: |
| (JSC::AssemblyHelpers::emitDynamicPoison): |
| (JSC::AssemblyHelpers::emitDynamicPoisonOnLoadedType): |
| (JSC::AssemblyHelpers::emitDynamicPoisonOnType): |
| |
| 2018-02-02 Saam Barati <sbarati@apple.com> |
| |
| MapHash should return true to doesGC in the DFG depending on useKind because it might resolve a rope |
| https://bugs.webkit.org/show_bug.cgi?id=182402 |
| |
| Reviewed by Yusuke Suzuki. |
| |
| * dfg/DFGDoesGC.cpp: |
| (JSC::DFG::doesGC): |
| |
| 2018-02-02 Yusuke Suzuki <utatane.tea@gmail.com> |
| |
| [JSC] Clean up ArraySpeciesCreate |
| https://bugs.webkit.org/show_bug.cgi?id=182434 |
| |
| Reviewed by Saam Barati. |
| |
| We have duplicate code in filter, map, concatSlowPath. |
| This patch creates a new global private function @arraySpeciesCreate, |
| and use it. |
| |
| * builtins/ArrayPrototype.js: |
| (globalPrivate.arraySpeciesCreate): |
| (filter): |
| (map): |
| (globalPrivate.concatSlowPath): |
| |
| 2018-02-01 Mark Lam <mark.lam@apple.com> |
| |
| Fix broken bounds check in FTL's compileGetMyArgumentByVal(). |
| https://bugs.webkit.org/show_bug.cgi?id=182419 |
| <rdar://problem/37044945> |
| |
| Reviewed by Saam Barati. |
| |
| In compileGetMyArgumentByVal(), it computes: |
| limit = m_out.sub(limit, m_out.constInt32(m_node->numberOfArgumentsToSkip())); |
| ... |
| LValue isOutOfBounds = m_out.aboveOrEqual(originalIndex, limit); |
| |
| where the original "limit" is the number of arguments passed in by the caller. |
| If the original limit is less than numberOfArgumentsToSkip, the resultant limit |
| will be a large unsigned number. As a result, this will defeat the bounds check |
| that follows it. |
| |
| Note: later on in compileGetMyArgumentByVal(), we have to adjust adjust the index |
| value by adding numberOfArgumentsToSkip to it, in order to determine the actual |
| entry in the arguments array to get. |
| |
| The fix is to just add numberOfArgumentsToSkip to index upfront (instead of |
| subtracting it from limit), and doing an overflow speculation check on that |
| addition before doing the bounds check. |
| |
| * ftl/FTLLowerDFGToB3.cpp: |
| (JSC::FTL::DFG::LowerDFGToB3::compileGetMyArgumentByVal): |
| |
| 2018-02-01 Keith Miller <keith_miller@apple.com> |
| |
| Fix crashes due to mishandling custom sections. |
| https://bugs.webkit.org/show_bug.cgi?id=182404 |
| <rdar://problem/36935863> |
| |
| Reviewed by Saam Barati. |
| |
| This also cleans up some of our validation code. We also |
| mistakenly, allowed unknown (different from custom sections with |
| id: 0) section ids. |
| |
| * wasm/WasmModuleParser.cpp: |
| (JSC::Wasm::ModuleParser::parse): |
| * wasm/WasmModuleParser.h: |
| * wasm/WasmSections.h: |
| (JSC::Wasm::isKnownSection): |
| (JSC::Wasm::decodeSection): |
| (JSC::Wasm::validateOrder): |
| (JSC::Wasm::makeString): |
| (JSC::Wasm::isValidSection): Deleted. |
| |
| 2018-02-01 Michael Catanzaro <mcatanzaro@igalia.com> |
| |
| -Wreturn-type warning in DFGObjectAllocationSinkingPhase.cpp |
| https://bugs.webkit.org/show_bug.cgi?id=182389 |
| |
| Reviewed by Yusuke Suzuki. |
| |
| Fix the warning. |
| |
| As a bonus, remove a couple unreachable breaks for good measure. |
| |
| * dfg/DFGObjectAllocationSinkingPhase.cpp: |
| |
| 2018-02-01 Chris Dumez <cdumez@apple.com> |
| |
| Queue a microtask when a waitUntil() promise is settled |
| https://bugs.webkit.org/show_bug.cgi?id=182372 |
| <rdar://problem/37101019> |
| |
| Reviewed by Mark Lam. |
| |
| Export a symbol so it can be used in WebCore. |
| |
| * runtime/JSGlobalObject.h: |
| |
| 2018-01-31 Don Olmstead <don.olmstead@sony.com> |
| |
| [CMake] Make JavaScriptCore headers copies |
| https://bugs.webkit.org/show_bug.cgi?id=182303 |
| |
| Reviewed by Alex Christensen. |
| |
| * CMakeLists.txt: |
| * PlatformGTK.cmake: |
| * PlatformJSCOnly.cmake: |
| * PlatformMac.cmake: |
| * PlatformWPE.cmake: |
| * PlatformWin.cmake: |
| * shell/CMakeLists.txt: |
| * shell/PlatformWin.cmake: |
| |
| 2018-01-31 Saam Barati <sbarati@apple.com> |
| |
| Replace tryLargeMemalignVirtual with tryLargeZeroedMemalignVirtual and use it to allocate large zeroed memory in Wasm |
| https://bugs.webkit.org/show_bug.cgi?id=182064 |
| <rdar://problem/36840132> |
| |
| Reviewed by Geoffrey Garen. |
| |
| This patch switches WebAssembly Memory to always use bmalloc's |
| zeroed virtual allocation API. This makes it so that we don't |
| dirty the memory to zero it. It's a huge compile time speedup |
| on WasmBench on iOS. |
| |
| * wasm/WasmMemory.cpp: |
| (JSC::Wasm::Memory::create): |
| (JSC::Wasm::Memory::~Memory): |
| (JSC::Wasm::Memory::addressIsInActiveFastMemory): |
| (JSC::Wasm::Memory::grow): |
| (JSC::Wasm::commitZeroPages): Deleted. |
| |
| 2018-01-31 Mark Lam <mark.lam@apple.com> |
| |
| Build fix for CLoop after r227874. |
| https://bugs.webkit.org/show_bug.cgi?id=182155 |
| <rdar://problem/36286266> |
| |
| Not reviewed. |
| |
| Just needed support for lea of a LabelReference in cloop.rb (just like those |
| added for arm64.rb and x86.rb). |
| |
| * offlineasm/cloop.rb: |
| |
| 2018-01-31 Keith Miller <keith_miller@apple.com> |
| |
| Canonicalize aquiring the JSCell lock. |
| https://bugs.webkit.org/show_bug.cgi?id=182320 |
| |
| Reviewed by Michael Saboff. |
| |
| It's currently kinda annoying to figure out where |
| we aquire the a JSCell's lock. This patch adds a |
| helper to make it easier to grep... |
| |
| * bytecode/UnlinkedCodeBlock.cpp: |
| (JSC::UnlinkedCodeBlock::visitChildren): |
| (JSC::UnlinkedCodeBlock::setInstructions): |
| (JSC::UnlinkedCodeBlock::shrinkToFit): |
| * runtime/ErrorInstance.cpp: |
| (JSC::ErrorInstance::finishCreation): |
| (JSC::ErrorInstance::materializeErrorInfoIfNeeded): |
| (JSC::ErrorInstance::visitChildren): |
| * runtime/JSArray.cpp: |
| (JSC::JSArray::shiftCountWithArrayStorage): |
| (JSC::JSArray::unshiftCountWithArrayStorage): |
| * runtime/JSCell.h: |
| (JSC::JSCell::cellLock): |
| * runtime/JSObject.cpp: |
| (JSC::JSObject::visitButterflyImpl): |
| (JSC::JSObject::convertContiguousToArrayStorage): |
| * runtime/JSPropertyNameEnumerator.cpp: |
| (JSC::JSPropertyNameEnumerator::visitChildren): |
| * runtime/SparseArrayValueMap.cpp: |
| (JSC::SparseArrayValueMap::add): |
| (JSC::SparseArrayValueMap::remove): |
| (JSC::SparseArrayValueMap::visitChildren): |
| |
| 2018-01-31 Saam Barati <sbarati@apple.com> |
| |
| JSC incorrectly interpreting script, sets Global Property instead of Global Lexical variable (LiteralParser / JSONP path) |
| https://bugs.webkit.org/show_bug.cgi?id=182074 |
| <rdar://problem/36846261> |
| |
| Reviewed by Mark Lam. |
| |
| This patch teaches the JSONP evaluator about the global lexical environment. |
| Before, it was using the global object as the global scope, but that's wrong. |
| The global lexical environment is the first node in the global scope chain. |
| |
| * interpreter/Interpreter.cpp: |
| (JSC::Interpreter::executeProgram): |
| * jsc.cpp: |
| (GlobalObject::finishCreation): |
| (shellSupportsRichSourceInfo): |
| (functionDisableRichSourceInfo): |
| * runtime/LiteralParser.cpp: |
| (JSC::LiteralParser<CharType>::tryJSONPParse): |
| * runtime/LiteralParser.h: |
| |
| 2018-01-31 Saam Barati <sbarati@apple.com> |
| |
| clean up pushToSaveImmediateWithoutTouchingRegisters a bit |
| https://bugs.webkit.org/show_bug.cgi?id=181774 |
| |
| Reviewed by JF Bastien. |
| |
| This function on ARM64 was considering what to do with the scratch |
| register. And conditionally invalidated what was in it. This is not |
| relevant though, since the function always recovers what was in that |
| register. This patch just switches it to using dataTempRegister |
| directly and updates the comment to describe why it can do so safely. |
| |
| * assembler/MacroAssemblerARM64.h: |
| (JSC::MacroAssemblerARM64::pushToSaveImmediateWithoutTouchingRegisters): |
| |
| 2018-01-30 Mark Lam <mark.lam@apple.com> |
| |
| Apply poisoning to TypedArray vector pointers. |
| https://bugs.webkit.org/show_bug.cgi?id=182155 |
| <rdar://problem/36286266> |
| |
| Reviewed by JF Bastien. |
| |
| The TypeArray's vector pointer is now poisoned. The poison value is chosen based |
| on a TypeArray's jsType. The JSType must be between FirstTypedArrayType and |
| LastTypedArrayType. At runtime, we enforce that the index is well-behaved by |
| masking it against TypedArrayPoisonIndexMask. TypedArrayPoisonIndexMask (16) is |
| the number of TypedArray types (10) rounded up to the next power of 2. |
| Accordingly, we reserve an array of TypedArrayPoisonIndexMask poisons so that we |
| can use index masking on the index, and be guaranteed that the masked index will |
| be within bounds of the poisons array. |
| |
| 1. Fixed both DFG and FTL versions of compileGetTypedArrayByteOffset() to not |
| do any unnecessary work if the TypedArray vector is null. |
| |
| FTL's cagedMayBeNull() is no longer needed because it is only used by |
| compileGetTypedArrayByteOffset(), and we need to enhance it to handle unpoisoning |
| in a TypedArray specific way. So, might as well do the work inline in |
| compileGetTypedArrayByteOffset() instead. |
| |
| 2. Removed an unnecessary null-check in DFGSpeculativeJIT's compileNewTypedArrayWithSize() |
| because there's already a null check above it that ensures that sizeGPR is |
| never null. |
| |
| 3. In LLInt's _llint_op_get_by_val, move the TypedArray length check before the |
| loading of the vector for unpoisoning and uncaging. We don't need the vector |
| if the length is 0. |
| |
| Implementation notes on the need to null check the TypeArray vector: |
| |
| 1. DFG::SpeculativeJIT::jumpForTypedArrayIsNeuteredIfOutOfBounds() does not need a |
| m_poisonedVector null check because the function is a null check. |
| |
| 2. DFG::SpeculativeJIT::compileGetIndexedPropertyStorage() does not need a |
| m_poisonedVector null check because it is followed by a call to |
| cageTypedArrayStorage() which assumes that storageReg cannot be null. |
| |
| 3. DFG::SpeculativeJIT::compileGetTypedArrayByteOffset() already has a |
| m_poisonedVector null check. |
| |
| 4. DFG::SpeculativeJIT::compileNewTypedArrayWithSize() does not need a vector null |
| check because the poisoning code is preceded by a sizeGPR null check, which |
| ensures that the storageGPR (vector to be poisoned) is not null. |
| |
| 5. FTL's compileGetIndexedPropertyStorage() does not need a m_poisonedVector null |
| check because it is followed by a call to caged() which assumes that the |
| vector cannot be null. |
| |
| 6. FTL's compileGetTypedArrayByteOffset() already has a m_poisonedVector null check. |
| |
| 7. FTL's compileNewTypedArray() does not need a vector null check because the |
| poisoning code is preceded by a size null check, which ensures that the |
| storage (vector to be poisoned) is not null. |
| |
| 8. FTL's speculateTypedArrayIsNotNeutered() does not need a |
| m_poisonedVector null check because the function is a null check. |
| |
| 9. IntrinsicGetterAccessCase::emitIntrinsicGetter()'s TypedArrayByteOffsetIntrinsic |
| case needs a null check so that it does not try to unpoison a null vector. |
| |
| 10. JIT::emitIntTypedArrayGetByVal() does not need a vector null check because |
| we already do a length check even before loading the vector. |
| |
| 11. JIT::emitFloatTypedArrayGetByVal() does not need a vector null check because |
| we already do a length check even before loading the vector. |
| |
| 12. JIT::emitIntTypedArrayPutByVal() does not need a vector null check because |
| we already do a length check even before loading the vector. |
| |
| 13. JIT::emitFloatTypedArrayPutByVal() does not need a vector null check because |
| we already do a length check even before loading the vector. |
| |
| 14. LLInt's loadTypedArrayCaged() does not need a vector null check because its |
| client will do a TypedArray length check before calling it. |
| |
| * dfg/DFGFixupPhase.cpp: |
| (JSC::DFG::FixupPhase::checkArray): |
| * dfg/DFGNode.h: |
| (JSC::DFG::Node::hasArrayMode): |
| * dfg/DFGSpeculativeJIT.cpp: |
| (JSC::DFG::SpeculativeJIT::jumpForTypedArrayIsNeuteredIfOutOfBounds): |
| (JSC::DFG::SpeculativeJIT::compileGetIndexedPropertyStorage): |
| (JSC::DFG::SpeculativeJIT::compileGetTypedArrayByteOffset): |
| (JSC::DFG::SpeculativeJIT::compileNewTypedArrayWithSize): |
| * ftl/FTLAbstractHeapRepository.h: |
| * ftl/FTLLowerDFGToB3.cpp: |
| (JSC::FTL::DFG::LowerDFGToB3::compileGetIndexedPropertyStorage): |
| (JSC::FTL::DFG::LowerDFGToB3::compileGetTypedArrayByteOffset): |
| (JSC::FTL::DFG::LowerDFGToB3::compileNewTypedArray): |
| (JSC::FTL::DFG::LowerDFGToB3::speculateTypedArrayIsNotNeutered): |
| (JSC::FTL::DFG::LowerDFGToB3::cagedMayBeNull): Deleted. |
| * jit/IntrinsicEmitter.cpp: |
| (JSC::IntrinsicGetterAccessCase::emitIntrinsicGetter): |
| * jit/JITPropertyAccess.cpp: |
| (JSC::JIT::emitIntTypedArrayGetByVal): |
| (JSC::JIT::emitFloatTypedArrayGetByVal): |
| (JSC::JIT::emitIntTypedArrayPutByVal): |
| (JSC::JIT::emitFloatTypedArrayPutByVal): |
| * llint/LowLevelInterpreter.asm: |
| * llint/LowLevelInterpreter64.asm: |
| * offlineasm/arm64.rb: |
| * offlineasm/x86.rb: |
| * runtime/CagedBarrierPtr.h: |
| * runtime/JSArrayBufferView.cpp: |
| (JSC::JSArrayBufferView::JSArrayBufferView): |
| (JSC::JSArrayBufferView::finalize): |
| (JSC::JSArrayBufferView::neuter): |
| * runtime/JSArrayBufferView.h: |
| (JSC::JSArrayBufferView::vector const): |
| (JSC::JSArrayBufferView::offsetOfPoisonedVector): |
| (JSC::JSArrayBufferView::poisonFor): |
| (JSC::JSArrayBufferView::Poison::key): |
| (JSC::JSArrayBufferView::offsetOfVector): Deleted. |
| * runtime/JSCPoison.cpp: |
| (JSC::initializePoison): |
| * runtime/JSCPoison.h: |
| * runtime/JSGenericTypedArrayViewInlines.h: |
| (JSC::JSGenericTypedArrayView<Adaptor>::estimatedSize): |
| (JSC::JSGenericTypedArrayView<Adaptor>::visitChildren): |
| (JSC::JSGenericTypedArrayView<Adaptor>::slowDownAndWasteMemory): |
| * runtime/JSObject.h: |
| |
| 2018-01-30 Fujii Hironori <Hironori.Fujii@sony.com> |
| |
| [Win] Warning fix. |
| https://bugs.webkit.org/show_bug.cgi?id=177007 |
| |
| Reviewed by Yusuke Suzuki. |
| |
| * interpreter/StackVisitor.cpp: |
| (JSC::StackVisitor::Frame::dump const): |
| Changed the type of locationRawBits from unsigned to uintptr_t. |
| * runtime/IntlNumberFormat.cpp: |
| (JSC::IntlNumberFormat::createNumberFormat): |
| Initialize 'style' to avoid potentially uninitialized local variable warning. |
| |
| 2018-01-29 Yusuke Suzuki <utatane.tea@gmail.com> |
| |
| [JSC] Implement trimStart and trimEnd |
| https://bugs.webkit.org/show_bug.cgi?id=182233 |
| |
| Reviewed by Mark Lam. |
| |
| String.prototype.{trimStart,trimEnd} are now stage 3[1]. |
| String.prototype.{trimLeft,trimRight} are alias to these functions. |
| |
| We rename these functions to trimStart and trimEnd, and put them as |
| trimLeft and trimRight too. |
| |
| [1]: https://tc39.github.io/proposal-string-left-right-trim/ |
| |
| * runtime/StringPrototype.cpp: |
| (JSC::StringPrototype::finishCreation): |
| (JSC::trimString): |
| (JSC::stringProtoFuncTrim): |
| (JSC::stringProtoFuncTrimStart): |
| (JSC::stringProtoFuncTrimEnd): |
| (JSC::stringProtoFuncTrimLeft): Deleted. |
| (JSC::stringProtoFuncTrimRight): Deleted. |
| |
| 2018-01-29 Yusuke Suzuki <utatane.tea@gmail.com> |
| |
| [JSC] Relax line terminators in String to make JSON subset of JS |
| https://bugs.webkit.org/show_bug.cgi?id=182232 |
| |
| Reviewed by Keith Miller. |
| |
| "Subsume JSON" spec is now stage 3[1]. Before this spec change, |
| JSON can accept \u2028 / \u2029 in string while JS cannot do that. |
| It accidentally made JSON non subset of JS. |
| |
| Now we extend our JS string to accept \u2028 / \u2029 to make JSON |
| subset of JS in this spec change. |
| |
| [1]: https://github.com/tc39/proposal-json-superset |
| |
| * parser/Lexer.cpp: |
| (JSC::Lexer<T>::parseStringSlowCase): |
| |
| 2018-01-29 Jiewen Tan <jiewen_tan@apple.com> |
| |
| [WebAuthN] Add a compile-time feature flag |
| https://bugs.webkit.org/show_bug.cgi?id=182211 |
| <rdar://problem/36936365> |
| |
| Reviewed by Brent Fulgham. |
| |
| * Configurations/FeatureDefines.xcconfig: |
| |
| 2018-01-29 Michael Saboff <msaboff@apple.com> |
| |
| REGRESSION (r227341): DFG_ASSERT failure at JSC::DFG::AtTailAbstractState::forNode() |
| https://bugs.webkit.org/show_bug.cgi?id=182249 |
| |
| Reviewed by Keith Miller. |
| |
| Changed clobberize() handling of CompareEq, et al to properly handle comparisons between |
| Untyped and Object values when compared against built in types. Such comparisons can |
| invoke toNumber() or other methods. |
| |
| * dfg/DFGClobberize.h: |
| (JSC::DFG::clobberize): |
| |
| 2018-01-29 Matt Lewis <jlewis3@apple.com> |
| |
| Unreviewed, rolling out r227725. |
| |
| This caused internal failures. |
| |
| Reverted changeset: |
| |
| "JSC Sampling Profiler: Detect tester and testee when sampling |
| in RegExp JIT" |
| https://bugs.webkit.org/show_bug.cgi?id=152729 |
| https://trac.webkit.org/changeset/227725 |
| |
| 2018-01-29 Yusuke Suzuki <utatane.tea@gmail.com> |
| |
| JSC Sampling Profiler: Detect tester and testee when sampling in RegExp JIT |
| https://bugs.webkit.org/show_bug.cgi?id=152729 |
| |
| Reviewed by Saam Barati. |
| |
| This patch extends SamplingProfiler to recognize JIT RegExp execution. We record |
| executing RegExp in VM so that SamplingProfiler can detect it. This is better |
| than the previous VM::isExecutingInRegExpJIT flag approach since |
| |
| 1. isExecutingInRegExpJIT is set after starting executing JIT RegExp code. Thus, |
| if we suspend the thread just before executing this flag, or just after clearing |
| this flag, SamplingProfiler gets invalid frame, and frame validation fails. We |
| should set such a flag before and after executing JIT RegExp code. |
| |
| 2. This removes VM dependency from YarrJIT which is not essential one. |
| |
| We add ExecutionContext enum to RegExp::matchInline not to mark execution if it |
| is done in non JS thread. |
| |
| * bytecode/BytecodeDumper.cpp: |
| (JSC::regexpName): |
| (JSC::BytecodeDumper<Block>::dumpRegExps): |
| (JSC::regexpToSourceString): Deleted. |
| * heap/Heap.cpp: |
| (JSC::Heap::addCoreConstraints): |
| * runtime/RegExp.cpp: |
| (JSC::RegExp::compile): |
| (JSC::RegExp::match): |
| (JSC::RegExp::matchConcurrently): |
| (JSC::RegExp::compileMatchOnly): |
| (JSC::RegExp::toSourceString const): |
| * runtime/RegExp.h: |
| * runtime/RegExpInlines.h: |
| (JSC::RegExp::matchInline): |
| * runtime/RegExpMatchesArray.h: |
| (JSC::createRegExpMatchesArray): |
| * runtime/SamplingProfiler.cpp: |
| (JSC::SamplingProfiler::SamplingProfiler): |
| (JSC::SamplingProfiler::timerLoop): |
| (JSC::SamplingProfiler::takeSample): |
| (JSC::SamplingProfiler::processUnverifiedStackTraces): |
| (JSC::SamplingProfiler::StackFrame::nameFromCallee): |
| (JSC::SamplingProfiler::StackFrame::displayName): |
| (JSC::SamplingProfiler::StackFrame::displayNameForJSONTests): |
| (JSC::SamplingProfiler::StackFrame::functionStartLine): |
| (JSC::SamplingProfiler::StackFrame::functionStartColumn): |
| (JSC::SamplingProfiler::StackFrame::sourceID): |
| (JSC::SamplingProfiler::StackFrame::url): |
| (WTF::printInternal): |
| (JSC::SamplingProfiler::~SamplingProfiler): Deleted. |
| * runtime/SamplingProfiler.h: |
| * runtime/VM.h: |
| * yarr/YarrJIT.cpp: |
| (JSC::Yarr::YarrGenerator::generateEnter): |
| (JSC::Yarr::YarrGenerator::generateReturn): |
| (JSC::Yarr::YarrGenerator::YarrGenerator): |
| (JSC::Yarr::jitCompile): |
| * yarr/YarrJIT.h: |
| |
| 2018-01-29 Yusuke Suzuki <utatane.tea@gmail.com> |
| |
| [DFG][FTL] WeakMap#set should have DFG node |
| https://bugs.webkit.org/show_bug.cgi?id=180015 |
| |
| Reviewed by Saam Barati. |
| |
| This patch adds WeakMapSet and WeakSetAdd DFG nodes to handle them efficiently in DFG and FTL. |
| We also define CSE rules for them. Now, WeakMapSet and WeakSetAdd can offer the results of |
| the subsequent WeakMapGet if CSE allows. |
| |
| * dfg/DFGAbstractInterpreterInlines.h: |
| (JSC::DFG::AbstractInterpreter<AbstractStateType>::executeEffects): |
| * dfg/DFGByteCodeParser.cpp: |
| (JSC::DFG::ByteCodeParser::addVarArgChild): |
| (JSC::DFG::ByteCodeParser::handleIntrinsicCall): |
| * dfg/DFGClobberize.h: |
| (JSC::DFG::clobberize): |
| * dfg/DFGDoesGC.cpp: |
| (JSC::DFG::doesGC): |
| WeakMap operations do not cause GC. |
| |
| * dfg/DFGFixupPhase.cpp: |
| (JSC::DFG::FixupPhase::fixupNode): |
| * dfg/DFGNodeType.h: |
| * dfg/DFGOperations.cpp: |
| * dfg/DFGOperations.h: |
| * dfg/DFGPredictionPropagationPhase.cpp: |
| * dfg/DFGSafeToExecute.h: |
| (JSC::DFG::safeToExecute): |
| * dfg/DFGSpeculativeJIT.cpp: |
| (JSC::DFG::SpeculativeJIT::compileWeakSetAdd): |
| (JSC::DFG::SpeculativeJIT::compileWeakMapSet): |
| * 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::compileWeakSetAdd): |
| (JSC::FTL::DFG::LowerDFGToB3::compileWeakMapSet): |
| * jit/JITOperations.h: |
| * runtime/Intrinsic.cpp: |
| (JSC::intrinsicName): |
| * runtime/Intrinsic.h: |
| * runtime/WeakMapPrototype.cpp: |
| (JSC::WeakMapPrototype::finishCreation): |
| * runtime/WeakSetPrototype.cpp: |
| (JSC::WeakSetPrototype::finishCreation): |
| |
| 2018-01-28 Filip Pizlo <fpizlo@apple.com> |
| |
| LargeAllocation should do the same distancing as MarkedBlock |
| https://bugs.webkit.org/show_bug.cgi?id=182226 |
| |
| Reviewed by Saam Barati. |
| |
| This makes LargeAllocation do the same exact distancing that MarkedBlock promises to do. |
| |
| To make that possible, this patch first makes MarkedBlock know exactly how much distancing it |
| is doing: |
| |
| - I've rationalized the payloadSize calculation. In particular, I made MarkedSpace use the |
| calculation done in MarkedBlock. MarkedSpace used to do the math a different way. This |
| keeps the old way just for a static_assert. |
| |
| - The promised amount of distancing is now codified in HeapCell.h as |
| minimumDistanceBetweenCellsFromDifferentOrigins. We assert that the footer size is at least |
| as big as this. I didn't want to just use footer size for this constant because then, if |
| you increased the size of the footer, you'd also add padding to every large allocation. |
| |
| Then this patch just adds minimumDistanceBetweenCellsFromDifferentOrigins to each large |
| allocation. It also zeroes that slice of memory to prevent any information leaks that way. |
| |
| This is perf neutral. Large allocations start out at ~8000 bytes. The amount of padding is |
| ~300 bytes. That's 3.75% space overhead for objects that are ~8000 bytes, zero overhead for |
| smaller objects, and diminishing overhead for larger objects. We allocate very few large |
| objects, so we shouldn't have any real space overhead from this. |
| |
| * heap/HeapCell.h: |
| * heap/LargeAllocation.cpp: |
| (JSC::LargeAllocation::tryCreate): |
| * heap/MarkedBlock.h: |
| * heap/MarkedSpace.h: |
| |
| 2018-01-27 Filip Pizlo <fpizlo@apple.com> |
| |
| Make MarkedBlock::Footer bigger |
| https://bugs.webkit.org/show_bug.cgi?id=182220 |
| |
| Reviewed by JF Bastien. |
| |
| This makes the block footer larger by moving the newlyAllocated bits from the handle into |
| the footer. |
| |
| It used to be profitable to put anything we could into the handle because that would free up |
| payload space inside the block. But now that we want to use the footer for padding, it's |
| profitable to put GC state information - especially data that is used by the GC itself and so |
| is not useful for a Spectre attack - into the footer to increase object distancing. |
| |
| * heap/CellContainer.cpp: |
| (JSC::CellContainer::isNewlyAllocated const): |
| * heap/IsoCellSet.cpp: |
| (JSC::IsoCellSet::sweepToFreeList): |
| * heap/MarkedBlock.cpp: |
| (JSC::MarkedBlock::Handle::Handle): |
| (JSC::MarkedBlock::Footer::Footer): |
| (JSC::MarkedBlock::Handle::stopAllocating): |
| (JSC::MarkedBlock::Handle::lastChanceToFinalize): |
| (JSC::MarkedBlock::Handle::resumeAllocating): |
| (JSC::MarkedBlock::aboutToMarkSlow): |
| (JSC::MarkedBlock::resetAllocated): |
| (JSC::MarkedBlock::Handle::resetAllocated): Deleted. |
| * heap/MarkedBlock.h: |
| (JSC::MarkedBlock::newlyAllocatedVersion const): |
| (JSC::MarkedBlock::isNewlyAllocated): |
| (JSC::MarkedBlock::setNewlyAllocated): |
| (JSC::MarkedBlock::clearNewlyAllocated): |
| (JSC::MarkedBlock::newlyAllocated const): |
| (JSC::MarkedBlock::Handle::newlyAllocatedVersion const): Deleted. |
| (JSC::MarkedBlock::Handle::isNewlyAllocated): Deleted. |
| (JSC::MarkedBlock::Handle::setNewlyAllocated): Deleted. |
| (JSC::MarkedBlock::Handle::clearNewlyAllocated): Deleted. |
| (JSC::MarkedBlock::Handle::newlyAllocated const): Deleted. |
| * heap/MarkedBlockInlines.h: |
| (JSC::MarkedBlock::isNewlyAllocatedStale const): |
| (JSC::MarkedBlock::hasAnyNewlyAllocated): |
| (JSC::MarkedBlock::Handle::isLive): |
| (JSC::MarkedBlock::Handle::specializedSweep): |
| (JSC::MarkedBlock::Handle::newlyAllocatedMode): |
| (JSC::MarkedBlock::Handle::isNewlyAllocatedStale const): Deleted. |
| (JSC::MarkedBlock::Handle::hasAnyNewlyAllocated): Deleted. |
| * heap/MarkedSpace.cpp: |
| (JSC::MarkedSpace::endMarking): |
| * heap/SlotVisitor.cpp: |
| (JSC::SlotVisitor::appendJSCellOrAuxiliary): |
| |
| 2018-01-27 Filip Pizlo <fpizlo@apple.com> |
| |
| MarkedBlock should have a footer instead of a header |
| https://bugs.webkit.org/show_bug.cgi?id=182217 |
| |
| Reviewed by JF Bastien. |
| |
| This moves the MarkedBlock's meta-data from the header to the footer. This doesn't really |
| change anything except for some compile-time constants, so it should not affect performance. |
| |
| This change is to help protect against Spectre attacks on structure checks, which allow for |
| small-offset out-of-bounds access. By putting the meta-data at the end of the block, small |
| OOBs will only get to other objects in the same block or the block footer. The block footer |
| is not super interesting. So, if we combine this with the TLC change (r227617), this means we |
| can use blocks as the mechanism of achieving distance between objects from different origins. |
| We just need to avoid ever putting objects from different origins in the same block. That's |
| what bug 181636 is about. |
| |
| * heap/BlockDirectory.cpp: |
| (JSC::blockHeaderSize): Deleted. |
| (JSC::BlockDirectory::blockSizeForBytes): Deleted. |
| * heap/BlockDirectory.h: |
| * heap/HeapUtil.h: |
| (JSC::HeapUtil::findGCObjectPointersForMarking): |
| * heap/MarkedBlock.cpp: |
| (JSC::MarkedBlock::MarkedBlock): |
| (JSC::MarkedBlock::~MarkedBlock): |
| (JSC::MarkedBlock::Footer::Footer): |
| (JSC::MarkedBlock::Footer::~Footer): |
| (JSC::MarkedBlock::Handle::stopAllocating): |
| (JSC::MarkedBlock::Handle::lastChanceToFinalize): |
| (JSC::MarkedBlock::Handle::resumeAllocating): |
| (JSC::MarkedBlock::aboutToMarkSlow): |
| (JSC::MarkedBlock::resetMarks): |
| (JSC::MarkedBlock::assertMarksNotStale): |
| (JSC::MarkedBlock::Handle::didConsumeFreeList): |
| (JSC::MarkedBlock::markCount): |
| (JSC::MarkedBlock::clearHasAnyMarked): |
| (JSC::MarkedBlock::Handle::didAddToDirectory): |
| (JSC::MarkedBlock::Handle::didRemoveFromDirectory): |
| (JSC::MarkedBlock::Handle::sweep): |
| * heap/MarkedBlock.h: |
| (JSC::MarkedBlock::markingVersion const): |
| (JSC::MarkedBlock::lock): |
| (JSC::MarkedBlock::subspace const): |
| (JSC::MarkedBlock::footer): |
| (JSC::MarkedBlock::footer const): |
| (JSC::MarkedBlock::handle): |
| (JSC::MarkedBlock::handle const): |
| (JSC::MarkedBlock::Handle::blockFooter): |
| (JSC::MarkedBlock::isAtomAligned): |
| (JSC::MarkedBlock::Handle::cellAlign): |
| (JSC::MarkedBlock::blockFor): |
| (JSC::MarkedBlock::vm const): |
| (JSC::MarkedBlock::weakSet): |
| (JSC::MarkedBlock::cellSize): |
| (JSC::MarkedBlock::attributes const): |
| (JSC::MarkedBlock::atomNumber): |
| (JSC::MarkedBlock::areMarksStale): |
| (JSC::MarkedBlock::aboutToMark): |
| (JSC::MarkedBlock::isMarkedRaw): |
| (JSC::MarkedBlock::isMarked): |
| (JSC::MarkedBlock::testAndSetMarked): |
| (JSC::MarkedBlock::marks const): |
| (JSC::MarkedBlock::isAtom): |
| (JSC::MarkedBlock::Handle::forEachCell): |
| (JSC::MarkedBlock::hasAnyMarked const): |
| (JSC::MarkedBlock::noteMarked): |
| (WTF::MarkedBlockHash::hash): |
| (JSC::MarkedBlock::firstAtom): Deleted. |
| * heap/MarkedBlockInlines.h: |
| (JSC::MarkedBlock::marksConveyLivenessDuringMarking): |
| (JSC::MarkedBlock::Handle::isLive): |
| (JSC::MarkedBlock::Handle::specializedSweep): |
| (JSC::MarkedBlock::Handle::forEachLiveCell): |
| (JSC::MarkedBlock::Handle::forEachDeadCell): |
| (JSC::MarkedBlock::Handle::forEachMarkedCell): |
| * heap/MarkedSpace.cpp: |
| * heap/MarkedSpace.h: |
| * llint/LowLevelInterpreter.asm: |
| * llint/LowLevelInterpreter32_64.asm: |
| * llint/LowLevelInterpreter64.asm: |
| |
| 2018-01-27 Yusuke Suzuki <utatane.tea@gmail.com> |
| |
| DFG strength reduction fails to convert NumberToStringWithValidRadixConstant for 0 to constant '0' |
| https://bugs.webkit.org/show_bug.cgi?id=182213 |
| |
| Reviewed by Mark Lam. |
| |
| toStringWithRadixInternal is originally used for the slow path if the given value is larger than radix or negative. |
| As a result, it does not accept 0 correctly, and produces an empty string. Since DFGStrengthReductionPhase uses |
| this function, it accidentally converts NumberToStringWithValidRadixConstant(0, radix) to an empty string. |
| This patch fixes toStringWithRadixInternal to accept 0. This change fixes twitch.tv's issue. |
| |
| We also add a careful cast to avoid `-INT32_MIN`. It does not produce incorrect value in x86 in practice, |
| but it is UB, and a compiler may assume that the given value is never INT32_MIN and could do an incorrect optimization. |
| |
| * runtime/NumberPrototype.cpp: |
| (JSC::toStringWithRadixInternal): |
| |
| 2018-01-26 Saam Barati <sbarati@apple.com> |
| |
| Fix emitAllocateWithNonNullAllocator to work on arm |
| https://bugs.webkit.org/show_bug.cgi?id=182187 |
| <rdar://problem/36906550> |
| |
| Reviewed by Filip Pizlo. |
| |
| This patch unifies the x86 and ARM paths in emitAllocateWithNonNullAllocator |
| and makes it so that emitAllocateWithNonNullAllocator uses the macro scratch |
| register on ARM. |
| |
| * ftl/FTLLowerDFGToB3.cpp: |
| (JSC::FTL::DFG::LowerDFGToB3::allocateHeapCell): |
| * jit/AssemblyHelpers.cpp: |
| (JSC::AssemblyHelpers::emitAllocateWithNonNullAllocator): |
| |
| 2018-01-26 Joseph Pecoraro <pecoraro@apple.com> |
| |
| Rebaselining builtin generator tests after r227685. |
| |
| Unreviewed. |
| |
| * Scripts/tests/builtins/expected/JavaScriptCore-Builtin.Promise-Combined.js-result: |
| * Scripts/tests/builtins/expected/JavaScriptCore-Builtin.Promise-Separate.js-result: |
| * Scripts/tests/builtins/expected/JavaScriptCore-Builtin.prototype-Combined.js-result: |
| * Scripts/tests/builtins/expected/JavaScriptCore-Builtin.prototype-Separate.js-result: |
| * Scripts/tests/builtins/expected/JavaScriptCore-BuiltinConstructor-Combined.js-result: |
| * Scripts/tests/builtins/expected/JavaScriptCore-BuiltinConstructor-Separate.js-result: |
| * Scripts/tests/builtins/expected/JavaScriptCore-InternalClashingNames-Combined.js-result: |
| * Scripts/tests/builtins/expected/WebCore-AnotherGuardedInternalBuiltin-Separate.js-result: |
| * Scripts/tests/builtins/expected/WebCore-ArbitraryConditionalGuard-Separate.js-result: |
| * Scripts/tests/builtins/expected/WebCore-GuardedBuiltin-Separate.js-result: |
| * Scripts/tests/builtins/expected/WebCore-GuardedInternalBuiltin-Separate.js-result: |
| * Scripts/tests/builtins/expected/WebCore-UnguardedBuiltin-Separate.js-result: |
| * Scripts/tests/builtins/expected/WebCore-xmlCasingTest-Separate.js-result: |
| It used to be that the builtins generator was minifying by default. That was an accident |
| and we now only minify on Release builds. The generator tests are now getting the |
| default unminified output behavior so they need to update their expectations |
| for some extra whitespace. |
| |
| 2018-01-26 Mark Lam <mark.lam@apple.com> |
| |
| We should only append ParserArenaDeletable pointers to ParserArena::m_deletableObjects. |
| https://bugs.webkit.org/show_bug.cgi?id=182180 |
| <rdar://problem/36460697> |
| |
| Reviewed by Michael Saboff. |
| |
| Some parser Node subclasses extend ParserArenaDeletable via multiple inheritance, |
| but not as the Node's first base class. ParserArena::m_deletableObjects is |
| expecting pointers to objects of the shape of ParserArenaDeletable. We ensure |
| this by allocating the Node subclass, and casting it to ParserArenaDeletable to |
| get the correct pointer to append to ParserArena::m_deletableObjects. |
| |
| To simplify things, we introduce a JSC_MAKE_PARSER_ARENA_DELETABLE_ALLOCATED |
| (analogous to WTF_MAKE_FAST_ALLOCATED) for use in Node subclasses that extends |
| ParserArenaDeletable. |
| |
| * parser/NodeConstructors.h: |
| (JSC::ParserArenaDeletable::operator new): |
| * parser/Nodes.h: |
| * parser/ParserArena.h: |
| (JSC::ParserArena::allocateDeletable): |
| |
| 2018-01-26 Joseph Pecoraro <pecoraro@apple.com> |
| |
| JavaScriptCore builtins should be partially minified in Release builds not Debug builds |
| https://bugs.webkit.org/show_bug.cgi?id=182165 |
| |
| Reviewed by Keith Miller. |
| |
| * Scripts/builtins/builtins_model.py: |
| (BuiltinFunction.fromString): |
| Apply minifications on Release builds instead of Debug builds. |
| Also eliminate leading whitespace. |
| |
| 2018-01-26 Filip Pizlo <fpizlo@apple.com> |
| |
| Disable TLS-based TLCs |
| https://bugs.webkit.org/show_bug.cgi?id=182175 |
| |
| Reviewed by Saam Barati. |
| |
| Check for the new USE(FAST_TLS_FOR_TLC) flag instead of just ENABLE(FAST_TLS_JIT). |
| |
| * heap/BlockDirectory.cpp: |
| (JSC::BlockDirectory::~BlockDirectory): |
| * heap/BlockDirectory.h: |
| * heap/ThreadLocalCache.cpp: |
| (JSC::ThreadLocalCache::installSlow): |
| (JSC::ThreadLocalCache::installData): |
| * heap/ThreadLocalCache.h: |
| * heap/ThreadLocalCacheInlines.h: |
| (JSC::ThreadLocalCache::getImpl): |
| * jit/AssemblyHelpers.cpp: |
| (JSC::AssemblyHelpers::emitAllocateWithNonNullAllocator): |
| * runtime/VM.cpp: |
| (JSC::VM::~VM): |
| * runtime/VM.h: |
| |
| 2018-01-25 Yusuke Suzuki <utatane.tea@gmail.com> |
| |
| imported/w3c/web-platform-tests/html/semantics/scripting-1/the-script-element/module/errorhandling.html crashes |
| https://bugs.webkit.org/show_bug.cgi?id=181980 |
| |
| Reviewed by Ryosuke Niwa. |
| |
| We accidentally failed to propagate errored promise in instantiate and satify phase if entry.{instantiate,satisfy} |
| promises are set. Since we just returned `entry`, it becomes succeeded promise even if the dependent fetch, instantiate, |
| and satisfy promises are failed. This patch fixes error propagation by returning `entry.instantiate` and `entry.satisfy` |
| correctly. |
| |
| * builtins/ModuleLoaderPrototype.js: |
| (requestInstantiate): |
| (requestSatisfy): |
| |
| 2018-01-25 Mark Lam <mark.lam@apple.com> |
| |
| Gardening: fix 32-bit build after r227643. |
| https://bugs.webkit.org/show_bug.cgi?id=182086 |
| |
| Not reviewed. |
| |
| * jit/AssemblyHelpers.cpp: |
| (JSC::AssemblyHelpers::emitDynamicPoisonOnLoadedType): |
| |
| 2018-01-24 Filip Pizlo <fpizlo@apple.com> |
| |
| DirectArguments should protect itself using dynamic poisoning and precise index masking |
| https://bugs.webkit.org/show_bug.cgi?id=182086 |
| |
| Reviewed by Saam Barati. |
| |
| This implements dynamic poisoning and precise index masking in DirectArguments, using the |
| helpers from <wtf/MathExtras.h> and helpers in AssemblyHelpers and FTL::LowerDFGToB3. |
| |
| We use dynamic poisoning for DirectArguments since this object did not have any additional |
| indirection inside it that could have been poisoned. So, we use the xor of the expected type |
| and the actual type as an additional input into the pointer. |
| |
| We use precise index masking for bounds checks, because it's not worth doing index masking |
| unless we know that precise index masking is too slow. |
| |
| * assembler/MacroAssembler.h: |
| (JSC::MacroAssembler::lshiftPtr): |
| (JSC::MacroAssembler::rshiftPtr): |
| * dfg/DFGSpeculativeJIT.cpp: |
| (JSC::DFG::SpeculativeJIT::compileGetByValOnDirectArguments): |
| * ftl/FTLLowerDFGToB3.cpp: |
| (JSC::FTL::DFG::LowerDFGToB3::compileGetByVal): |
| (JSC::FTL::DFG::LowerDFGToB3::compileGetMyArgumentByVal): |
| (JSC::FTL::DFG::LowerDFGToB3::preciseIndexMask64): |
| (JSC::FTL::DFG::LowerDFGToB3::preciseIndexMask32): |
| (JSC::FTL::DFG::LowerDFGToB3::dynamicPoison): |
| (JSC::FTL::DFG::LowerDFGToB3::dynamicPoisonOnLoadedType): |
| (JSC::FTL::DFG::LowerDFGToB3::dynamicPoisonOnType): |
| * jit/AssemblyHelpers.cpp: |
| (JSC::AssemblyHelpers::emitPreciseIndexMask32): |
| (JSC::AssemblyHelpers::emitDynamicPoison): |
| (JSC::AssemblyHelpers::emitDynamicPoisonOnLoadedType): |
| (JSC::AssemblyHelpers::emitDynamicPoisonOnType): |
| * jit/AssemblyHelpers.h: |
| * jit/JITPropertyAccess.cpp: |
| (JSC::JIT::emitDirectArgumentsGetByVal): |
| * runtime/DirectArguments.h: |
| (JSC::DirectArguments::getIndexQuickly const): |
| (JSC::DirectArguments::setIndexQuickly): |
| (JSC::DirectArguments::argument): |
| * runtime/GenericArgumentsInlines.h: |
| |
| 2018-01-25 Mark Lam <mark.lam@apple.com> |
| |
| Rename some local vars from type to typedArrayType for greater clarity. |
| https://bugs.webkit.org/show_bug.cgi?id=182148 |
| <rdar://problem/36882310> |
| |
| Reviewed by Saam Barati. |
| |
| * dfg/DFGSpeculativeJIT.cpp: |
| (JSC::DFG::SpeculativeJIT::compileNewTypedArrayWithSize): |
| * ftl/FTLLowerDFGToB3.cpp: |
| (JSC::FTL::DFG::LowerDFGToB3::compileNewTypedArray): |
| |
| 2018-01-25 Filip Pizlo <fpizlo@apple.com> |
| |
| JSC GC should support TLCs (thread local caches) |
| https://bugs.webkit.org/show_bug.cgi?id=181559 |
| |
| Reviewed by Mark Lam and Saam Barati. |
| |
| This is a big step towards object distancing by site origin. This patch implements TLCs, or |
| thread-local caches, which allow each thread to allocate from its own free lists. It also |
| means that any given thread can context-switch TLCs. This will allow us to do separate |
| allocation for separate site origins. Eventually, once we reshape how MarkedBlock looks, this |
| will allow us to have a hard distancing constraint between objects from different origins. |
| |
| In this new design, every "size class" is represented as a BlockDirectory (formerly known as |
| MarkedAllocator, prior to r226822). This contains a bag of blocks allocated using some |
| aligned memory allocator (which roughly represents which cage you came out of), and anyone |
| using the same allocator can share those blocks - but so long as they are in that |
| BlockDirectory, they will have the size and type of that directory. Previously, each |
| BlockDirectory had exactly one FreeList. Now, each BlockDirectory has a double-linked-list of |
| LocalAllocators, each of which has a FreeList. |
| |
| To decide which LocalAllocator to allocate out of, we need a ThreadLocalCache and a |
| BlockDirectory. The directory gives us an offset-within-the-ThreadLocalCache, which we simply |
| call the Allocator (which is just a POD type that contains a 32-bit offset). Each allocation |
| starts by figuring out what Allocator it wants (often we have this information at JIT time). |
| Then the allocation loads its ThreadLocalCache::Data from a fast TLS slot. Then we add the |
| Allocator offset to the ThreadLocalCache::Data to get the LocalAllocator. Note that we use |
| offsets as opposed to indices to make it easy to do the math on each allocation (if |
| LocalAllocator had a weird size then every allocation would have to do an imul). |
| |
| This is a definite slow-down on GC-heavy benchmarks, but by a small margin, and only on |
| unusually heavy tests. For example, boyer and splay are both 3% regressed, but the Octane |
| geomean is just fine. The JetStream score regressed by 0.5% with p = 0.08 (so maybe there is |
| something there, but it's not significant according to our threshold). |
| |
| Relanding after fixing ARM64 bug in AssemblyHelpers::emitAllocateWithNonNullAllocator(). That |
| function needs to be careful to avoid using the scratch register because the FTL will call it |
| in disallow-scratch-register mode. |
| |
| * JavaScriptCore.xcodeproj/project.pbxproj: |
| * Sources.txt: |
| * b3/B3LowerToAir.cpp: |
| * b3/B3PatchpointSpecial.cpp: |
| (JSC::B3::PatchpointSpecial::admitsStack): |
| * b3/B3StackmapSpecial.cpp: |
| (JSC::B3::StackmapSpecial::forEachArgImpl): |
| (JSC::B3::StackmapSpecial::isArgValidForRep): |
| * b3/B3StackmapValue.cpp: |
| (JSC::B3::StackmapValue::appendSomeRegisterWithClobber): |
| * b3/B3StackmapValue.h: |
| * b3/B3Validate.cpp: |
| * b3/B3ValueRep.cpp: |
| (JSC::B3::ValueRep::addUsedRegistersTo const): |
| (JSC::B3::ValueRep::dump const): |
| (WTF::printInternal): |
| * b3/B3ValueRep.h: |
| (JSC::B3::ValueRep::ValueRep): |
| * bytecode/AccessCase.cpp: |
| (JSC::AccessCase::generateImpl): |
| * bytecode/ObjectAllocationProfile.h: |
| (JSC::ObjectAllocationProfile::ObjectAllocationProfile): |
| (JSC::ObjectAllocationProfile::clear): |
| * bytecode/ObjectAllocationProfileInlines.h: |
| (JSC::ObjectAllocationProfile::initializeProfile): |
| * dfg/DFGSpeculativeJIT.cpp: |
| (JSC::DFG::SpeculativeJIT::emitAllocateRawObject): |
| (JSC::DFG::SpeculativeJIT::compileMakeRope): |
| (JSC::DFG::SpeculativeJIT::compileAllocatePropertyStorage): |
| (JSC::DFG::SpeculativeJIT::compileReallocatePropertyStorage): |
| (JSC::DFG::SpeculativeJIT::compileCreateThis): |
| (JSC::DFG::SpeculativeJIT::compileNewObject): |
| * dfg/DFGSpeculativeJIT.h: |
| (JSC::DFG::SpeculativeJIT::emitAllocateJSCell): |
| (JSC::DFG::SpeculativeJIT::emitAllocateJSObject): |
| * ftl/FTLAbstractHeapRepository.h: |
| * ftl/FTLLowerDFGToB3.cpp: |
| (JSC::FTL::DFG::LowerDFGToB3::compileMakeRope): |
| (JSC::FTL::DFG::LowerDFGToB3::compileMaterializeNewObject): |
| (JSC::FTL::DFG::LowerDFGToB3::allocatePropertyStorageWithSizeImpl): |
| (JSC::FTL::DFG::LowerDFGToB3::allocateHeapCell): |
| (JSC::FTL::DFG::LowerDFGToB3::allocateObject): |
| (JSC::FTL::DFG::LowerDFGToB3::allocatorForSize): |
| (JSC::FTL::DFG::LowerDFGToB3::allocateVariableSizedObject): |
| (JSC::FTL::DFG::LowerDFGToB3::allocateVariableSizedCell): |
| * heap/Allocator.cpp: Added. |
| (JSC::Allocator::cellSize const): |
| * heap/Allocator.h: Added. |
| (JSC::Allocator::Allocator): |
| (JSC::Allocator::offset const): |
| (JSC::Allocator::operator== const): |
| (JSC::Allocator::operator!= const): |
| (JSC::Allocator::operator bool const): |
| * heap/AllocatorInlines.h: Added. |
| (JSC::Allocator::allocate const): |
| (JSC::Allocator::tryAllocate const): |
| * heap/BlockDirectory.cpp: |
| (JSC::BlockDirectory::BlockDirectory): |
| (JSC::BlockDirectory::findBlockForAllocation): |
| (JSC::BlockDirectory::stopAllocating): |
| (JSC::BlockDirectory::prepareForAllocation): |
| (JSC::BlockDirectory::stopAllocatingForGood): |
| (JSC::BlockDirectory::resumeAllocating): |
| (JSC::BlockDirectory::endMarking): |
| (JSC::BlockDirectory::isFreeListedCell): |
| (JSC::BlockDirectory::didConsumeFreeList): Deleted. |
| (JSC::BlockDirectory::tryAllocateWithoutCollecting): Deleted. |
| (JSC::BlockDirectory::allocateIn): Deleted. |
| (JSC::BlockDirectory::tryAllocateIn): Deleted. |
| (JSC::BlockDirectory::doTestCollectionsIfNeeded): Deleted. |
| (JSC::BlockDirectory::allocateSlowCase): Deleted. |
| * heap/BlockDirectory.h: |
| (JSC::BlockDirectory::cellKind const): |
| (JSC::BlockDirectory::allocator const): |
| (JSC::BlockDirectory::freeList const): Deleted. |
| (JSC::BlockDirectory::offsetOfFreeList): Deleted. |
| (JSC::BlockDirectory::offsetOfCellSize): Deleted. |
| * heap/BlockDirectoryInlines.h: |
| (JSC::BlockDirectory::isFreeListedCell const): Deleted. |
| (JSC::BlockDirectory::allocate): Deleted. |
| * heap/CompleteSubspace.cpp: |
| (JSC::CompleteSubspace::CompleteSubspace): |
| (JSC::CompleteSubspace::allocatorFor): |
| (JSC::CompleteSubspace::allocate): |
| (JSC::CompleteSubspace::allocateNonVirtual): |
| (JSC::CompleteSubspace::allocatorForSlow): |
| (JSC::CompleteSubspace::allocateSlow): |
| (JSC::CompleteSubspace::tryAllocateSlow): |
| * heap/CompleteSubspace.h: |
| (JSC::CompleteSubspace::allocatorForSizeStep): |
| (JSC::CompleteSubspace::allocatorForNonVirtual): |
| * heap/FreeList.h: |
| * heap/GCDeferralContext.h: |
| * heap/Heap.cpp: |
| (JSC::Heap::Heap): |
| (JSC::Heap::lastChanceToFinalize): |
| * heap/Heap.h: |
| (JSC::Heap::threadLocalCacheLayout): |
| * heap/IsoCellSet.h: |
| * heap/IsoSubspace.cpp: |
| (JSC::IsoSubspace::IsoSubspace): |
| (JSC::IsoSubspace::allocatorFor): |
| (JSC::IsoSubspace::allocate): |
| (JSC::IsoSubspace::allocateNonVirtual): |
| * heap/IsoSubspace.h: |
| (JSC::IsoSubspace::allocatorForNonVirtual): |
| * heap/LocalAllocator.cpp: Added. |
| (JSC::LocalAllocator::LocalAllocator): |
| (JSC::LocalAllocator::reset): |
| (JSC::LocalAllocator::~LocalAllocator): |
| (JSC::LocalAllocator::stopAllocating): |
| (JSC::LocalAllocator::resumeAllocating): |
| (JSC::LocalAllocator::prepareForAllocation): |
| (JSC::LocalAllocator::stopAllocatingForGood): |
| (JSC::LocalAllocator::allocateSlowCase): |
| (JSC::LocalAllocator::didConsumeFreeList): |
| (JSC::LocalAllocator::tryAllocateWithoutCollecting): |
| (JSC::LocalAllocator::allocateIn): |
| (JSC::LocalAllocator::tryAllocateIn): |
| (JSC::LocalAllocator::doTestCollectionsIfNeeded): |
| (JSC::LocalAllocator::isFreeListedCell const): |
| * heap/LocalAllocator.h: Added. |
| (JSC::LocalAllocator::offsetOfFreeList): |
| (JSC::LocalAllocator::offsetOfCellSize): |
| * heap/LocalAllocatorInlines.h: Added. |
| (JSC::LocalAllocator::allocate): |
| * heap/MarkedSpace.cpp: |
| (JSC::MarkedSpace::stopAllocatingForGood): |
| * heap/MarkedSpace.h: |
| * heap/SlotVisitor.cpp: |
| * heap/SlotVisitor.h: |
| * heap/Subspace.h: |
| * heap/ThreadLocalCache.cpp: Added. |
| (JSC::ThreadLocalCache::create): |
| (JSC::ThreadLocalCache::ThreadLocalCache): |
| (JSC::ThreadLocalCache::~ThreadLocalCache): |
| (JSC::ThreadLocalCache::allocateData): |
| (JSC::ThreadLocalCache::destroyData): |
| (JSC::ThreadLocalCache::installSlow): |
| (JSC::ThreadLocalCache::installData): |
| (JSC::ThreadLocalCache::allocatorSlow): |
| (JSC::ThreadLocalCache::destructor): |
| * heap/ThreadLocalCache.h: Added. |
| (JSC::ThreadLocalCache::offsetOfSize): |
| (JSC::ThreadLocalCache::offsetOfFirstAllocator): |
| * heap/ThreadLocalCacheInlines.h: Added. |
| (JSC::ThreadLocalCache::getImpl): |
| (JSC::ThreadLocalCache::get): |
| (JSC::ThreadLocalCache::install): |
| (JSC::ThreadLocalCache::allocator): |
| (JSC::ThreadLocalCache::tryGetAllocator): |
| * heap/ThreadLocalCacheLayout.cpp: Added. |
| (JSC::ThreadLocalCacheLayout::ThreadLocalCacheLayout): |
| (JSC::ThreadLocalCacheLayout::~ThreadLocalCacheLayout): |
| (JSC::ThreadLocalCacheLayout::allocateOffset): |
| (JSC::ThreadLocalCacheLayout::snapshot): |
| (JSC::ThreadLocalCacheLayout::directory): |
| * heap/ThreadLocalCacheLayout.h: Added. |
| * jit/AssemblyHelpers.cpp: |
| (JSC::AssemblyHelpers::emitAllocateWithNonNullAllocator): |
| (JSC::AssemblyHelpers::emitAllocate): |
| (JSC::AssemblyHelpers::emitAllocateVariableSized): |
| * jit/AssemblyHelpers.h: |
| (JSC::AssemblyHelpers::vm): |
| (JSC::AssemblyHelpers::emitAllocateJSCell): |
| (JSC::AssemblyHelpers::emitAllocateJSObject): |
| (JSC::AssemblyHelpers::emitAllocateJSObjectWithKnownSize): |
| (JSC::AssemblyHelpers::emitAllocateWithNonNullAllocator): Deleted. |
| (JSC::AssemblyHelpers::emitAllocate): Deleted. |
| (JSC::AssemblyHelpers::emitAllocateVariableSized): Deleted. |
| * jit/JITOpcodes.cpp: |
| (JSC::JIT::emit_op_new_object): |
| (JSC::JIT::emit_op_create_this): |
| * jit/JITOpcodes32_64.cpp: |
| (JSC::JIT::emit_op_new_object): |
| (JSC::JIT::emit_op_create_this): |
| * runtime/ButterflyInlines.h: |
| (JSC::Butterfly::createUninitialized): |
| (JSC::Butterfly::tryCreate): |
| (JSC::Butterfly::growArrayRight): |
| * runtime/DirectArguments.cpp: |
| (JSC::DirectArguments::overrideThings): |
| * runtime/GenericArgumentsInlines.h: |
| (JSC::GenericArguments<Type>::initModifiedArgumentsDescriptor): |
| * runtime/HashMapImpl.h: |
| (JSC::HashMapBuffer::create): |
| * runtime/JSArray.cpp: |
| (JSC::JSArray::tryCreateUninitializedRestricted): |
| (JSC::JSArray::unshiftCountSlowCase): |
| * runtime/JSArray.h: |
| (JSC::JSArray::tryCreate): |
| * runtime/JSArrayBufferView.cpp: |
| (JSC::JSArrayBufferView::ConstructionContext::ConstructionContext): |
| * runtime/JSCellInlines.h: |
| (JSC::tryAllocateCellHelper): |
| * runtime/JSGlobalObject.cpp: |
| (JSC::JSGlobalObject::JSGlobalObject): |
| * runtime/JSGlobalObject.h: |
| (JSC::JSGlobalObject::threadLocalCache const): |
| * runtime/JSLock.cpp: |
| (JSC::JSLock::didAcquireLock): |
| * runtime/Options.h: |
| * runtime/RegExpMatchesArray.h: |
| (JSC::tryCreateUninitializedRegExpMatchesArray): |
| * runtime/VM.cpp: |
| (JSC::VM::VM): |
| * runtime/VM.h: |
| * runtime/VMEntryScope.cpp: |
| (JSC::VMEntryScope::VMEntryScope): |
| |
| 2018-01-25 Commit Queue <commit-queue@webkit.org> |
| |
| Unreviewed, rolling out r227592. |
| https://bugs.webkit.org/show_bug.cgi?id=182110 |
| |
| it made ARM64 (Linux and iOS) crash (Requested by pizlo-mbp on |
| #webkit). |
| |
| Reverted changeset: |
| |
| "JSC GC should support TLCs (thread local caches)" |
| https://bugs.webkit.org/show_bug.cgi?id=181559 |
| https://trac.webkit.org/changeset/227592 |
| |
| 2018-01-25 Alejandro G. Castro <alex@igalia.com> |
| |
| undefined reference to 'JSC::B3::BasicBlock::fallThrough() const |
| https://bugs.webkit.org/show_bug.cgi?id=180637 |
| |
| Reviewed by Michael Catanzaro. |
| |
| We need to make sure the implementation of the inline functions is |
| compiled when we compile the code using the function, now that the |
| compilation is divided, or we could end up with undefined symbols |
| when the declaration is not inlined, at least with some compilers |
| and optimizations enabled -O2. |
| |
| * b3/B3SwitchValue.cpp: replace the include. |
| |
| 2018-01-20 Filip Pizlo <fpizlo@apple.com> |
| |
| JSC GC should support TLCs (thread local caches) |
| https://bugs.webkit.org/show_bug.cgi?id=181559 |
| |
| Reviewed by Mark Lam and Saam Barati. |
| |
| This is a big step towards object distancing by site origin. This patch implements TLCs, or |
| thread-local caches, which allow each thread to allocate from its own free lists. It also |
| means that any given thread can context-switch TLCs. This will allow us to do separate |
| allocation for separate site origins. Eventually, once we reshape how MarkedBlock looks, this |
| will allow us to have a hard distancing constraint between objects from different origins. |
| |
| In this new design, every "size class" is represented as a BlockDirectory (formerly known as |
| MarkedAllocator, prior to r226822). This contains a bag of blocks allocated using some |
| aligned memory allocator (which roughly represents which cage you came out of), and anyone |
| using the same allocator can share those blocks - but so long as they are in that |
| BlockDirectory, they will have the size and type of that directory. Previously, each |
| BlockDirectory had exactly one FreeList. Now, each BlockDirectory has a double-linked-list of |
| LocalAllocators, each of which has a FreeList. |
| |
| To decide which LocalAllocator to allocate out of, we need a ThreadLocalCache and a |
| BlockDirectory. The directory gives us an offset-within-the-ThreadLocalCache, which we simply |
| call the Allocator (which is just a POD type that contains a 32-bit offset). Each allocation |
| starts by figuring out what Allocator it wants (often we have this information at JIT time). |
| Then the allocation loads its ThreadLocalCache::Data from a fast TLS slot. Then we add the |
| Allocator offset to the ThreadLocalCache::Data to get the LocalAllocator. Note that we use |
| offsets as opposed to indices to make it easy to do the math on each allocation (if |
| LocalAllocator had a weird size then every allocation would have to do an imul). |
| |
| This is a definite slow-down on GC-heavy benchmarks, but by a small margin, and only on |
| unusually heavy tests. For example, boyer and splay are both 3% regressed, but the Octane |
| geomean is just fine. The JetStream score regressed by 0.5% with p = 0.08 (so maybe there is |
| something there, but it's not significant according to our threshold). |
| |
| * JavaScriptCore.xcodeproj/project.pbxproj: |
| * Sources.txt: |
| * b3/B3LowerToAir.cpp: |
| * b3/B3PatchpointSpecial.cpp: |
| (JSC::B3::PatchpointSpecial::admitsStack): |
| * b3/B3StackmapSpecial.cpp: |
| (JSC::B3::StackmapSpecial::forEachArgImpl): |
| (JSC::B3::StackmapSpecial::isArgValidForRep): |
| * b3/B3StackmapValue.cpp: |
| (JSC::B3::StackmapValue::appendSomeRegisterWithClobber): |
| * b3/B3StackmapValue.h: |
| * b3/B3Validate.cpp: |
| * b3/B3ValueRep.cpp: |
| (JSC::B3::ValueRep::addUsedRegistersTo const): |
| (JSC::B3::ValueRep::dump const): |
| (WTF::printInternal): |
| * b3/B3ValueRep.h: |
| (JSC::B3::ValueRep::ValueRep): |
| * bytecode/AccessCase.cpp: |
| (JSC::AccessCase::generateImpl): |
| * bytecode/ObjectAllocationProfile.h: |
| (JSC::ObjectAllocationProfile::ObjectAllocationProfile): |
| (JSC::ObjectAllocationProfile::clear): |
| * bytecode/ObjectAllocationProfileInlines.h: |
| (JSC::ObjectAllocationProfile::initializeProfile): |
| * dfg/DFGSpeculativeJIT.cpp: |
| (JSC::DFG::SpeculativeJIT::emitAllocateRawObject): |
| (JSC::DFG::SpeculativeJIT::compileMakeRope): |
| (JSC::DFG::SpeculativeJIT::compileAllocatePropertyStorage): |
| (JSC::DFG::SpeculativeJIT::compileReallocatePropertyStorage): |
| (JSC::DFG::SpeculativeJIT::compileCreateThis): |
| (JSC::DFG::SpeculativeJIT::compileNewObject): |
| * dfg/DFGSpeculativeJIT.h: |
| (JSC::DFG::SpeculativeJIT::emitAllocateJSCell): |
| (JSC::DFG::SpeculativeJIT::emitAllocateJSObject): |
| * ftl/FTLAbstractHeapRepository.h: |
| * ftl/FTLLowerDFGToB3.cpp: |
| (JSC::FTL::DFG::LowerDFGToB3::compileMakeRope): |
| (JSC::FTL::DFG::LowerDFGToB3::compileMaterializeNewObject): |
| (JSC::FTL::DFG::LowerDFGToB3::allocatePropertyStorageWithSizeImpl): |
| (JSC::FTL::DFG::LowerDFGToB3::allocateHeapCell): |
| (JSC::FTL::DFG::LowerDFGToB3::allocateObject): |
| (JSC::FTL::DFG::LowerDFGToB3::allocatorForSize): |
| (JSC::FTL::DFG::LowerDFGToB3::allocateVariableSizedObject): |
| (JSC::FTL::DFG::LowerDFGToB3::allocateVariableSizedCell): |
| * heap/Allocator.cpp: Added. |
| (JSC::Allocator::cellSize const): |
| * heap/Allocator.h: Added. |
| (JSC::Allocator::Allocator): |
| (JSC::Allocator::offset const): |
| (JSC::Allocator::operator== const): |
| (JSC::Allocator::operator!= const): |
| (JSC::Allocator::operator bool const): |
| * heap/AllocatorInlines.h: Added. |
| (JSC::Allocator::allocate const): |
| (JSC::Allocator::tryAllocate const): |
| * heap/BlockDirectory.cpp: |
| (JSC::BlockDirectory::BlockDirectory): |
| (JSC::BlockDirectory::findBlockForAllocation): |
| (JSC::BlockDirectory::stopAllocating): |
| (JSC::BlockDirectory::prepareForAllocation): |
| (JSC::BlockDirectory::stopAllocatingForGood): |
| (JSC::BlockDirectory::resumeAllocating): |
| (JSC::BlockDirectory::endMarking): |
| (JSC::BlockDirectory::isFreeListedCell): |
| (JSC::BlockDirectory::didConsumeFreeList): Deleted. |
| (JSC::BlockDirectory::tryAllocateWithoutCollecting): Deleted. |
| (JSC::BlockDirectory::allocateIn): Deleted. |
| (JSC::BlockDirectory::tryAllocateIn): Deleted. |
| (JSC::BlockDirectory::doTestCollectionsIfNeeded): Deleted. |
| (JSC::BlockDirectory::allocateSlowCase): Deleted. |
| * heap/BlockDirectory.h: |
| (JSC::BlockDirectory::cellKind const): |
| (JSC::BlockDirectory::allocator const): |
| (JSC::BlockDirectory::freeList const): Deleted. |
| (JSC::BlockDirectory::offsetOfFreeList): Deleted. |
| (JSC::BlockDirectory::offsetOfCellSize): Deleted. |
| * heap/BlockDirectoryInlines.h: |
| (JSC::BlockDirectory::isFreeListedCell const): Deleted. |
| (JSC::BlockDirectory::allocate): Deleted. |
| * heap/CompleteSubspace.cpp: |
| (JSC::CompleteSubspace::CompleteSubspace): |
| (JSC::CompleteSubspace::allocatorFor): |
| (JSC::CompleteSubspace::allocate): |
| (JSC::CompleteSubspace::allocateNonVirtual): |
| (JSC::CompleteSubspace::allocatorForSlow): |
| (JSC::CompleteSubspace::allocateSlow): |
| (JSC::CompleteSubspace::tryAllocateSlow): |
| * heap/CompleteSubspace.h: |
| (JSC::CompleteSubspace::allocatorForSizeStep): |
| (JSC::CompleteSubspace::allocatorForNonVirtual): |
| * heap/FreeList.h: |
| * heap/GCDeferralContext.h: |
| * heap/Heap.cpp: |
| (JSC::Heap::Heap): |
| (JSC::Heap::lastChanceToFinalize): |
| * heap/Heap.h: |
| (JSC::Heap::threadLocalCacheLayout): |
| * heap/IsoCellSet.h: |
| * heap/IsoSubspace.cpp: |
| (JSC::IsoSubspace::IsoSubspace): |
| (JSC::IsoSubspace::allocatorFor): |
| (JSC::IsoSubspace::allocate): |
| (JSC::IsoSubspace::allocateNonVirtual): |
| * heap/IsoSubspace.h: |
| (JSC::IsoSubspace::allocatorForNonVirtual): |
| * heap/LocalAllocator.cpp: Added. |
| (JSC::LocalAllocator::LocalAllocator): |
| (JSC::LocalAllocator::reset): |
| (JSC::LocalAllocator::~LocalAllocator): |
| (JSC::LocalAllocator::stopAllocating): |
| (JSC::LocalAllocator::resumeAllocating): |
| (JSC::LocalAllocator::prepareForAllocation): |
| (JSC::LocalAllocator::stopAllocatingForGood): |
| (JSC::LocalAllocator::allocateSlowCase): |
| (JSC::LocalAllocator::didConsumeFreeList): |
| (JSC::LocalAllocator::tryAllocateWithoutCollecting): |
| (JSC::LocalAllocator::allocateIn): |
| (JSC::LocalAllocator::tryAllocateIn): |
| (JSC::LocalAllocator::doTestCollectionsIfNeeded): |
| (JSC::LocalAllocator::isFreeListedCell const): |
| * heap/LocalAllocator.h: Added. |
| (JSC::LocalAllocator::offsetOfFreeList): |
| (JSC::LocalAllocator::offsetOfCellSize): |
| * heap/LocalAllocatorInlines.h: Added. |
| (JSC::LocalAllocator::allocate): |
| * heap/MarkedSpace.cpp: |
| (JSC::MarkedSpace::stopAllocatingForGood): |
| * heap/MarkedSpace.h: |
| * heap/SlotVisitor.cpp: |
| * heap/SlotVisitor.h: |
| * heap/Subspace.h: |
| * heap/ThreadLocalCache.cpp: Added. |
| (JSC::ThreadLocalCache::create): |
| (JSC::ThreadLocalCache::ThreadLocalCache): |
| (JSC::ThreadLocalCache::~ThreadLocalCache): |
| (JSC::ThreadLocalCache::allocateData): |
| (JSC::ThreadLocalCache::destroyData): |
| (JSC::ThreadLocalCache::installSlow): |
| (JSC::ThreadLocalCache::installData): |
| (JSC::ThreadLocalCache::allocatorSlow): |
| (JSC::ThreadLocalCache::destructor): |
| * heap/ThreadLocalCache.h: Added. |
| (JSC::ThreadLocalCache::offsetOfSize): |
| (JSC::ThreadLocalCache::offsetOfFirstAllocator): |
| * heap/ThreadLocalCacheInlines.h: Added. |
| (JSC::ThreadLocalCache::getImpl): |
| (JSC::ThreadLocalCache::get): |
| (JSC::ThreadLocalCache::install): |
| (JSC::ThreadLocalCache::allocator): |
| (JSC::ThreadLocalCache::tryGetAllocator): |
| * heap/ThreadLocalCacheLayout.cpp: Added. |
| (JSC::ThreadLocalCacheLayout::ThreadLocalCacheLayout): |
| (JSC::ThreadLocalCacheLayout::~ThreadLocalCacheLayout): |
| (JSC::ThreadLocalCacheLayout::allocateOffset): |
| (JSC::ThreadLocalCacheLayout::snapshot): |
| (JSC::ThreadLocalCacheLayout::directory): |
| * heap/ThreadLocalCacheLayout.h: Added. |
| * jit/AssemblyHelpers.cpp: |
| (JSC::AssemblyHelpers::emitAllocateWithNonNullAllocator): |
| (JSC::AssemblyHelpers::emitAllocate): |
| (JSC::AssemblyHelpers::emitAllocateVariableSized): |
| * jit/AssemblyHelpers.h: |
| (JSC::AssemblyHelpers::vm): |
| (JSC::AssemblyHelpers::emitAllocateJSCell): |
| (JSC::AssemblyHelpers::emitAllocateJSObject): |
| (JSC::AssemblyHelpers::emitAllocateJSObjectWithKnownSize): |
| (JSC::AssemblyHelpers::emitAllocateWithNonNullAllocator): Deleted. |
| (JSC::AssemblyHelpers::emitAllocate): Deleted. |
| (JSC::AssemblyHelpers::emitAllocateVariableSized): Deleted. |
| * jit/JITOpcodes.cpp: |
| (JSC::JIT::emit_op_new_object): |
| (JSC::JIT::emit_op_create_this): |
| * jit/JITOpcodes32_64.cpp: |
| (JSC::JIT::emit_op_new_object): |
| (JSC::JIT::emit_op_create_this): |
| * runtime/ButterflyInlines.h: |
| (JSC::Butterfly::createUninitialized): |
| (JSC::Butterfly::tryCreate): |
| (JSC::Butterfly::growArrayRight): |
| * runtime/DirectArguments.cpp: |
| (JSC::DirectArguments::overrideThings): |
| * runtime/GenericArgumentsInlines.h: |
| (JSC::GenericArguments<Type>::initModifiedArgumentsDescriptor): |
| * runtime/HashMapImpl.h: |
| (JSC::HashMapBuffer::create): |
| * runtime/JSArray.cpp: |
| (JSC::JSArray::tryCreateUninitializedRestricted): |
| (JSC::JSArray::unshiftCountSlowCase): |
| * runtime/JSArray.h: |
| (JSC::JSArray::tryCreate): |
| * runtime/JSArrayBufferView.cpp: |
| (JSC::JSArrayBufferView::ConstructionContext::ConstructionContext): |
| * runtime/JSCellInlines.h: |
| (JSC::tryAllocateCellHelper): |
| * runtime/JSGlobalObject.cpp: |
| (JSC::JSGlobalObject::JSGlobalObject): |
| * runtime/JSGlobalObject.h: |
| (JSC::JSGlobalObject::threadLocalCache const): |
| * runtime/JSLock.cpp: |
| (JSC::JSLock::didAcquireLock): |
| * runtime/Options.h: |
| * runtime/RegExpMatchesArray.h: |
| (JSC::tryCreateUninitializedRegExpMatchesArray): |
| * runtime/VM.cpp: |
| (JSC::VM::VM): |
| * runtime/VM.h: |
| * runtime/VMEntryScope.cpp: |
| (JSC::VMEntryScope::VMEntryScope): |
| |
| 2018-01-24 Joseph Pecoraro <pecoraro@apple.com> |
| |
| Web Inspector: Simplify update-LegacyInspectorBackendCommands.rb |
| https://bugs.webkit.org/show_bug.cgi?id=182067 |
| |
| Reviewed by Brian Burg. |
| |
| * inspector/scripts/codegen/models.py: |
| (Framework.fromString): |
| (Frameworks): |
| * inspector/scripts/generate-inspector-protocol-bindings.py: |
| (generate_from_specification): |
| Allow framework WebInspectorUI to generate just the backend commands files. |
| |
| 2018-01-23 Mark Lam <mark.lam@apple.com> |
| |
| Update Poisoned pointers to take a Poison class instead of a uintptr_t&. |
| https://bugs.webkit.org/show_bug.cgi?id=182017 |
| <rdar://problem/36795513> |
| |
| Reviewed by Filip Pizlo and JF Bastien. |
| |
| Removed the POISON() macro. Now that we have Poison types, we can just use the |
| the Poison type instead and make the code a bit nicer to read. |
| |
| * API/JSAPIWrapperObject.h: |
| * API/JSCallbackFunction.h: |
| * API/JSCallbackObject.h: |
| * b3/B3LowerMacros.cpp: |
| * b3/testb3.cpp: |
| (JSC::B3::testInterpreter): |
| * bytecode/CodeBlock.h: |
| (JSC::CodeBlock::instructions): |
| (JSC::CodeBlock::instructions const): |
| * dfg/DFGOSRExitCompilerCommon.h: |
| (JSC::DFG::adjustFrameAndStackInOSRExitCompilerThunk): |
| * dfg/DFGSpeculativeJIT.cpp: |
| (JSC::DFG::SpeculativeJIT::compileCheckSubClass): |
| (JSC::DFG::SpeculativeJIT::emitSwitchIntJump): |
| * ftl/FTLLowerDFGToB3.cpp: |
| (JSC::FTL::DFG::LowerDFGToB3::compileCheckSubClass): |
| * jit/JIT.h: |
| * jit/ThunkGenerators.cpp: |
| (JSC::virtualThunkFor): |
| (JSC::nativeForGenerator): |
| (JSC::boundThisNoArgsFunctionCallGenerator): |
| * parser/UnlinkedSourceCode.h: |
| * runtime/ArrayPrototype.h: |
| * runtime/CustomGetterSetter.h: |
| * runtime/DateInstance.h: |
| * runtime/InternalFunction.h: |
| * runtime/JSArrayBuffer.h: |
| * runtime/JSCPoison.cpp: |
| (JSC::initializePoison): |
| * runtime/JSCPoison.h: |
| * runtime/JSGlobalObject.h: |
| * runtime/JSScriptFetchParameters.h: |
| * runtime/JSScriptFetcher.h: |
| * runtime/NativeExecutable.h: |
| * runtime/StructureTransitionTable.h: |
| * runtime/WriteBarrier.h: |
| (JSC::WriteBarrier::poison): Deleted. |
| * wasm/js/JSToWasm.cpp: |
| (JSC::Wasm::createJSToWasmWrapper): |
| * wasm/js/JSWebAssemblyCodeBlock.cpp: |
| (JSC::JSWebAssemblyCodeBlock::JSWebAssemblyCodeBlock): |
| * wasm/js/JSWebAssemblyCodeBlock.h: |
| * wasm/js/JSWebAssemblyInstance.h: |
| (JSC::JSWebAssemblyInstance::poison): |
| * wasm/js/JSWebAssemblyMemory.h: |
| * wasm/js/JSWebAssemblyModule.h: |
| * wasm/js/JSWebAssemblyTable.h: |
| * wasm/js/WasmToJS.cpp: |
| (JSC::Wasm::handleBadI64Use): |
| (JSC::Wasm::wasmToJS): |
| * wasm/js/WebAssemblyFunctionBase.h: |
| * wasm/js/WebAssemblyModuleRecord.h: |
| * wasm/js/WebAssemblyToJSCallee.h: |
| * wasm/js/WebAssemblyWrapperFunction.h: |
| |
| 2018-01-23 Yusuke Suzuki <utatane.tea@gmail.com> |
| |
| Unreviewed, suppress GCC warnings |
| https://bugs.webkit.org/show_bug.cgi?id=181976 |
| |
| * runtime/TypedArrayType.h: |
| |
| 2018-01-23 Yusuke Suzuki <utatane.tea@gmail.com> |
| |
| [YARR] Add diagnosis for YarrJIT failures |
| https://bugs.webkit.org/show_bug.cgi?id=181927 |
| |
| Reviewed by Sam Weinig. |
| |
| It is nice if we can see the reason why YarrJIT fails to compile a given pattern. |
| This patch introduces Yarr::JITFailureReason and dumps messages if Options::dumpCompiledRegExpPatterns is specified. |
| |
| * runtime/RegExp.cpp: |
| (JSC::RegExp::compile): |
| (JSC::RegExp::compileMatchOnly): |
| * yarr/YarrJIT.cpp: |
| (JSC::Yarr::YarrGenerator::generateTerm): |
| (JSC::Yarr::YarrGenerator::backtrackTerm): |
| (JSC::Yarr::YarrGenerator::opCompileParenthesesSubpattern): |
| (JSC::Yarr::YarrGenerator::YarrGenerator): |
| (JSC::Yarr::YarrGenerator::compile): |
| (JSC::Yarr::dumpCompileFailure): |
| (JSC::Yarr::jitCompile): |
| * yarr/YarrJIT.h: |
| (JSC::Yarr::YarrCodeBlock::setFallBack): |
| (JSC::Yarr::YarrCodeBlock::fallBack): |
| (JSC::Yarr::YarrCodeBlock::clear): |
| (JSC::Yarr::YarrCodeBlock::YarrCodeBlock): Deleted. |
| (JSC::Yarr::YarrCodeBlock::~YarrCodeBlock): Deleted. |
| (JSC::Yarr::YarrCodeBlock::isFallBack): Deleted. |
| |
| 2018-01-23 Alex Christensen <achristensen@webkit.org> |
| |
| Remove pre-Sierra-OS-specific code in WTF and JavaScriptCore |
| https://bugs.webkit.org/show_bug.cgi?id=182028 |
| |
| Reviewed by Keith Miller. |
| |
| * inspector/remote/cocoa/RemoteInspectorXPCConnection.h: |
| * inspector/remote/cocoa/RemoteInspectorXPCConnection.mm: |
| (Inspector::RemoteInspectorXPCConnection::handleEvent): |
| |
| 2018-01-23 Filip Pizlo <fpizlo@apple.com> |
| |
| Use precise index masking for FTL GetByArgumentByVal |
| https://bugs.webkit.org/show_bug.cgi?id=182006 |
| |
| Reviewed by Keith Miller. |
| |
| This protects speculative out-of-bounds on arguments[index]. |
| |
| Making this work right involved fixing a possible overflow situation with |
| numberOfArgumentsToSkip. |
| |
| * dfg/DFGByteCodeParser.cpp: |
| (JSC::DFG::ByteCodeParser::findArgumentPositionForLocal): |
| * dfg/DFGGraph.cpp: |
| (JSC::DFG::Graph::dump): |
| * dfg/DFGNode.h: |
| (JSC::DFG::Node::hasNumberOfArgumentsToSkip): |
| (JSC::DFG::Node::numberOfArgumentsToSkip): |
| * dfg/DFGStackLayoutPhase.cpp: |
| (JSC::DFG::StackLayoutPhase::run): |
| * ftl/FTLLowerDFGToB3.cpp: |
| (JSC::FTL::DFG::LowerDFGToB3::compileGetMyArgumentByVal): |
| |
| 2018-01-23 David Kilzer <ddkilzer@apple.com> |
| |
| Follow-up for: oss-fuzz jsc build is broken: StringImpl.h:27:10: fatal error: 'unicode/ustring.h' file not found |
| <https://webkit.org/b/181871> |
| <rdar://problem/36669691> |
| |
| Address feedback for this change. |
| |
| * CMakeLists.txt: Change "SYSTEM PUBLIC" to "SYSTEM PRIVATE" per |
| feedback from Konstantin Tokarev. |
| |
| 2018-01-23 Robin Morisset <rmorisset@apple.com> |
| |
| Rollout r219636 |
| https://bugs.webkit.org/show_bug.cgi?id=181997 |
| <rdar://problem/35883022> |
| |
| Unreviewed, as it is a rollout. |
| |
| * dfg/DFGSpeculativeJIT.cpp: |
| (JSC::DFG::SpeculativeJIT::emitAllocateRawObject): |
| * runtime/JSArray.cpp: |
| (JSC::JSArray::tryCreateUninitializedRestricted): |
| * runtime/JSArray.h: |
| (JSC::JSArray::tryCreate): |
| * runtime/JSObject.cpp: |
| (JSC::JSObject::ensureLengthSlow): |
| |
| 2018-01-23 Mark Lam <mark.lam@apple.com> |
| |
| Re-arrange TypedArray JSTypes to match the order of the TypedArrayType enum list. |
| https://bugs.webkit.org/show_bug.cgi?id=181976 |
| <rdar://problem/36766936> |
| |
| Reviewed by Filip Pizlo. |
| |
| 1. The order of TypedArray JSTypes now matches the order the TypedArrayType enum |
| list. I also added static asserts in TypedArrayType.h to enforce this. |
| |
| Also redefined FOR_EACH_TYPED_ARRAY_TYPE() in terms of |
| |
| 2. Define 4 new values: |
| a. FirstTypedArrayType |
| b. LastTypedArrayType |
| c. NumberOfTypedArrayTypesExcludingDataView |
| d. NumberOfTypedArrayTypes |
| |
| Use these everywhere where we iterate or bisect the TypedArray JSTypes. |
| |
| 3. Removed NUMBER_OF_TYPED_ARRAY_TYPES, and use NumberOfTypedArrayTypes instead. |
| |
| 4. Simplify the code that converts between TypedArrayType and JSType. |
| |
| Changed typedArrayTypeForType() to be the mirror image of typeForTypedArrayType(). |
| Previously, typedArrayTypeForType() converts DataViewType to NotTypedArray |
| instead of TypeDataView. Now, it converts to TypeDataView. |
| |
| This does not result in any change of behavior because typedArrayTypeForType() |
| is only called in Structure::hasIndexingHeader(), and its result is passed to |
| isTypedView(), which handles TypeDataView correctly. |
| |
| 5. Also fixed a bug in SpeculativeJIT::compileGetTypedArrayByteOffset(). |
| If the vector is null, we can skip the rest of the checks. While the current |
| code does not result in incorrect behavior, it is inefficient, and communicates |
| wrong information to the reader i.e. implying that there's something in the |
| dataGPR when there's not. The dataGPR should also be null in this case. |
| |
| * dfg/DFGByteCodeParser.cpp: |
| (JSC::DFG::ByteCodeParser::handleConstantInternalFunction): |
| * dfg/DFGSpeculativeJIT.cpp: |
| (JSC::DFG::SpeculativeJIT::compileIsTypedArrayView): |
| (JSC::DFG::SpeculativeJIT::compileGetTypedArrayByteOffset): |
| * ftl/FTLLowerDFGToB3.cpp: |
| (JSC::FTL::DFG::LowerDFGToB3::isTypedArrayView): |
| * ftl/FTLOSRExit.cpp: |
| * llint/LowLevelInterpreter.asm: |
| * llint/LowLevelInterpreter64.asm: |
| * runtime/JSGlobalObject.cpp: |
| (JSC::JSGlobalObject::visitChildren): |
| * runtime/JSType.h: |
| * runtime/TypedArrayType.cpp: |
| (JSC::typeForTypedArrayType): Deleted. |
| * runtime/TypedArrayType.h: |
| (JSC::typedArrayTypeForType): |
| (JSC::typeForTypedArrayType): |
| |
| 2018-01-23 Filip Pizlo <fpizlo@apple.com> |
| |
| DFG should always flush `this` |
| https://bugs.webkit.org/show_bug.cgi?id=181999 |
| |
| Reviewed by Saam Barati and Mark Lam. |
| |
| This is going to make it possible to use precise index masking for arguments-on-the-stack |
| accesses with an index adjusted so that 0 is this. Without this change, we would have no way |
| of masking when the argument count is 0, unless we padded the argument area so that there was |
| always an argument slot after `this` and it was always initialized. |
| |
| This is neutral on all benchmarks. |
| |
| * dfg/DFGByteCodeParser.cpp: |
| (JSC::DFG::ByteCodeParser::flushImpl): |
| (JSC::DFG::ByteCodeParser::flushForTerminalImpl): |
| (JSC::DFG::ByteCodeParser::flush): |
| (JSC::DFG::ByteCodeParser::flushForTerminal): |
| (JSC::DFG::ByteCodeParser::parse): |
| (JSC::DFG::flushImpl): Deleted. |
| (JSC::DFG::flushForTerminalImpl): Deleted. |
| * dfg/DFGPreciseLocalClobberize.h: |
| (JSC::DFG::PreciseLocalClobberizeAdaptor::readTop): |
| |
| 2018-01-23 Filip Pizlo <fpizlo@apple.com> |
| |
| JSC should use a speculation fence on VM entry/exit |
| https://bugs.webkit.org/show_bug.cgi?id=181991 |
| |
| Reviewed by JF Bastien and Mark Lam. |
| |
| This adds a WTF::speculationFence on VM entry and exit. |
| |
| For a microbenchmark that just calls a native function (supplied via an Objective-C block) in a |
| tight loop from JS is a 0% regression on x86 and a 11% regression on ARM64. |
| |
| * runtime/JSLock.cpp: |
| (JSC::JSLock::didAcquireLock): |
| (JSC::JSLock::willReleaseLock): |
| |
| 2018-01-23 Yusuke Suzuki <utatane.tea@gmail.com> |
| |
| [JSC] JIT requires sizeof(bool) == 1 |
| https://bugs.webkit.org/show_bug.cgi?id=181150 |
| |
| Reviewed by Saam Barati. |
| |
| LLInt and JIT assumes that sizeof(bool) == 1. But it is implementation-dependent in C++ spec. |
| Since this is a mandatory requirement in JSC, we add a static_assert to ensure this. |
| |
| * runtime/InitializeThreading.cpp: |
| |
| 2018-01-23 Robin Morisset <rmorisset@apple.com> |
| |
| Update the argument count in DFGByteCodeParser::handleRecursiveCall |
| https://bugs.webkit.org/show_bug.cgi?id=181739 |
| <rdar://problem/36627662> |
| |
| Reviewed by Saam Barati. |
| |
| When calling a function, its number of arguments is set on the stack. When we turn a recursive tail call |
| into a jump, we should update that stack slot as there is no guarantee that the function was originally |
| called with the same number of arguments. Forgetting to do this is observable through 'arguments.length'. |
| |
| It required adding a new DFG node: 'SetArgumentCountIncludingThis', that takes an unsigned int |
| as its first OpInfo field, and stores it to the stack at the right place. |
| |
| We must be a bit careful in where we put this new node, as it ClobbersExit. |
| We must also fix DFGArgumentsEliminationPhase and DFGPutStackSinkingPhase as they assumed that any node that writes to the stack must write to either an argument or a local. |
| |
| * dfg/DFGAbstractInterpreterInlines.h: |
| (JSC::DFG::AbstractInterpreter<AbstractStateType>::executeEffects): |
| * dfg/DFGArgumentsEliminationPhase.cpp: |
| * dfg/DFGByteCodeParser.cpp: |
| (JSC::DFG::ByteCodeParser::handleRecursiveTailCall): |
| * dfg/DFGClobberize.h: |
| (JSC::DFG::clobberize): |
| * dfg/DFGDoesGC.cpp: |
| (JSC::DFG::doesGC): |
| * dfg/DFGFixupPhase.cpp: |
| (JSC::DFG::FixupPhase::fixupNode): |
| * dfg/DFGMayExit.cpp: |
| * dfg/DFGNode.h: |
| (JSC::DFG::Node::argumentCountIncludingThis): |
| * dfg/DFGNodeType.h: |
| * dfg/DFGPredictionPropagationPhase.cpp: |
| * dfg/DFGPutStackSinkingPhase.cpp: |
| * dfg/DFGSafeToExecute.h: |
| (JSC::DFG::safeToExecute): |
| * dfg/DFGSpeculativeJIT.cpp: |
| (JSC::DFG::SpeculativeJIT::compileSetArgumentCountIncludingThis): |
| * 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::compileSetArgumentCountIncludingThis): |
| |
| 2018-01-22 Michael Saboff <msaboff@apple.com> |
| |
| DFG abstract interpreter needs to properly model effects of some Math ops |
| https://bugs.webkit.org/show_bug.cgi?id=181886 |
| |
| Reviewed by Saam Barati. |
| |
| Reviewed the processing of the various ArithXXX and CompareXXX and found that |
| several nodes don't handle UntypedUse. Added clobberWorld() for those cases. |
| |
| * dfg/DFGAbstractInterpreter.h: |
| * dfg/DFGAbstractInterpreterInlines.h: |
| (JSC::DFG::AbstractInterpreter<AbstractStateType>::executeEffects): |
| (JSC::DFG::AbstractInterpreter<AbstractStateType>::executeDoubleUnaryOpEffects): |
| |
| 2018-01-21 Wenson Hsieh <wenson_hsieh@apple.com> |
| |
| Add a new feature flag for EXTRA_ZOOM_MODE and reintroduce AdditionalFeatureDefines.h |
| https://bugs.webkit.org/show_bug.cgi?id=181918 |
| |
| Reviewed by Tim Horton. |
| |
| Add EXTRA_ZOOM_MODE to FeatureDefines.xconfig (off by default). |
| |
| * Configurations/FeatureDefines.xcconfig: |
| |
| 2018-01-20 Caio Lima <ticaiolima@gmail.com> |
| |
| [JSC] NumberPrototype::extractRadixFromArgs incorrectly cast double to int32_t |
| https://bugs.webkit.org/show_bug.cgi?id=181182 |
| |
| Reviewed by Darin Adler. |
| |
| Casting double to integer is undefined behavior when the truncation |
| results into a value that doesn't fit into integer size, |
| according C++ spec[1]. Thus, we are changing bigIntProtoFuncToString and |
| numberProtoFuncToString to remove these source of undefined |
| behavior. |
| |
| [1] - http://en.cppreference.com/w/cpp/language/implicit_conversion |
| |
| * runtime/BigIntPrototype.cpp: |
| (JSC::bigIntProtoFuncToString): |
| * runtime/NumberPrototype.cpp: |
| (JSC::numberProtoFuncToString): |
| (JSC::extractToStringRadixArgument): |
| (JSC::extractRadixFromArgs): Deleted. |
| * runtime/NumberPrototype.h: |
| |
| 2018-01-19 Saam Barati <sbarati@apple.com> |
| |
| Kill ArithNegate's ArithProfile assert inside BytecodeParser |
| https://bugs.webkit.org/show_bug.cgi?id=181877 |
| <rdar://problem/36630552> |
| |
| Reviewed by Mark Lam. |
| |
| Before this patch, we used to assert that op_negate's result ArithProfile |
| only produces number. It's logically true that negate only produces a number. |
| However, the DFG may incorrectly pick this ArithProfile when doing OSR exit |
| profiling. So we'll end up profiling something that's likely the input to |
| negate. This patch removes the assert. We cede to the fact that Graph::methodOfGettingAValueProfileFor |
| is entirely heuristic based, potentially leading to profiling results being imprecise. |
| |
| * dfg/DFGByteCodeParser.cpp: |
| (JSC::DFG::ByteCodeParser::makeSafe): |
| |
| 2018-01-19 David Kilzer <ddkilzer@apple.com> |
| |
| oss-fuzz jsc build is broken: StringImpl.h:27:10: fatal error: 'unicode/ustring.h' file not found |
| <https://webkit.org/b/181871> |
| |
| Rubber-stamped by JF Bastien. |
| |
| * CMakeLists.txt: Add ICU header search path to |
| LLIntOffsetsExtractor target by reusing |
| JavaScriptCore_SYSTEM_INCLUDE_DIRECTORIES. |
| |
| 2018-01-19 Saam Barati <sbarati@apple.com> |
| |
| Spread's effects are modeled incorrectly both in AI and in Clobberize |
| https://bugs.webkit.org/show_bug.cgi?id=181867 |
| <rdar://problem/36290415> |
| |
| Reviewed by Michael Saboff. |
| |
| * dfg/DFGAbstractInterpreterInlines.h: |
| (JSC::DFG::AbstractInterpreter<AbstractStateType>::executeEffects): |
| * dfg/DFGClobberize.h: |
| (JSC::DFG::clobberize): |
| |
| 2018-01-19 Keith Miller <keith_miller@apple.com> |
| |
| HaveInternalSDK includes should be "#include?" |
| https://bugs.webkit.org/show_bug.cgi?id=179670 |
| |
| Reviewed by Dan Bernstein. |
| |
| * Configurations/Base.xcconfig: |
| |
| 2018-01-18 JF Bastien <jfbastien@apple.com> |
| |
| Set the minimum executable allocator size properly |
| https://bugs.webkit.org/show_bug.cgi?id=181816 |
| <rdar://problem/36635533> |
| |
| Reviewed by Saam Barati. |
| |
| Executable allocator expects at least two page size's worth of |
| allocation in certain conditions, and that causes some tests to |
| now fail because they ask for less. Set that minimum correctly. We |
| were already rounding up to a page size, so having a minimum of 2 |
| page sizes is fine. |
| |
| * jit/ExecutableAllocator.cpp: |
| (JSC::FixedVMPoolExecutableAllocator::FixedVMPoolExecutableAllocator): |
| |
| 2018-01-18 Michael Saboff <msaboff@apple.com> |
| |
| Unreviewed build fix for Windows |
| |
| * interpreter/FrameTracers.h: |
| (JSC::assertStackPointerIsAligned): Can't use gcc style inlined assembly |
| on Windows. |
| |
| 2018-01-18 Mark Lam <mark.lam@apple.com> |
| |
| Poisons should be initialized after Options are initialized. |
| https://bugs.webkit.org/show_bug.cgi?id=181807 |
| <rdar://problem/36629138> |
| |
| Reviewed by Keith Miller. |
| |
| This is because poison initialization may depend on options. |
| |
| * runtime/InitializeThreading.cpp: |
| (JSC::initializeThreading): |
| |
| 2018-01-18 Dan Bernstein <mitz@apple.com> |
| |
| [Xcode] Streamline and future-proof target-macOS-version-dependent build setting definitions |
| https://bugs.webkit.org/show_bug.cgi?id=181803 |
| |
| Reviewed by Tim Horton. |
| |
| * Configurations/Base.xcconfig: Updated. |
| * Configurations/DebugRelease.xcconfig: Ditto. |
| * Configurations/FeatureDefines.xcconfig: Adopted macOSTargetConditionals helpers. |
| * Configurations/Version.xcconfig: Updated. |
| * Configurations/macOSTargetConditionals.xcconfig: Added. Defines helper build settings |
| useful for defining settings that depend on the target macOS version. |
| |
| 2018-01-18 Michael Saboff <msaboff@apple.com> |
| |
| REGRESSION (r226068): [X86] Crash in JavaScriptCore ShadowChicken when handling exceptions |
| https://bugs.webkit.org/show_bug.cgi?id=181802 |
| |
| Reviewed by Filip Pizlo. |
| |
| There where a few places where the stack isn't properly aligned for X86 when we call into C++ code. |
| Two places are where we call into exception handling code, the LLInt and from nativeForGenerator. |
| The other place was when we call into the operationOSRWriteBarrier(). |
| |
| Added an assert check that the stack is aligned on X86 platforms in the native call tracing code. |
| This helped find the other cases beyond the original problem. |
| |
| * dfg/DFGOSRExitCompilerCommon.cpp: |
| (JSC::DFG::osrWriteBarrier): |
| * interpreter/FrameTracers.h: |
| (JSC::assertStackPointerIsAligned): |
| (JSC::NativeCallFrameTracer::NativeCallFrameTracer): |
| (JSC::NativeCallFrameTracerWithRestore::NativeCallFrameTracerWithRestore): |
| * jit/ThunkGenerators.cpp: |
| (JSC::nativeForGenerator): |
| * llint/LowLevelInterpreter32_64.asm: |
| |
| 2018-01-18 Commit Queue <commit-queue@webkit.org> |
| |
| Unreviewed, rolling out r227096. |
| https://bugs.webkit.org/show_bug.cgi?id=181788 |
| |
| "it caused a 15% octane regression" (Requested by saamyjoon on |
| #webkit). |
| |
| Reverted changeset: |
| |
| "Support MultiGetByOffset in the DFG" |
| https://bugs.webkit.org/show_bug.cgi?id=181466 |
| https://trac.webkit.org/changeset/227096 |
| |
| 2018-01-17 Yusuke Suzuki <utatane.tea@gmail.com> |
| |
| [DFG][FTL] Introduce PhantomNewRegexp and RegExpExecNonGlobalOrSticky |
| https://bugs.webkit.org/show_bug.cgi?id=181535 |
| |
| Reviewed by Saam Barati. |
| |
| When executing the code like `string.match(/regexp/)`, `/regexp/` object is created every time we execute this code. |
| However, user rarely cares about this `/regexp/` object. Typically, it is soon discarded even if it has `lastIndex` |
| information. So we should not create RegExpObject for this typical case. |
| |
| This patch introduces PhantomNewRegexp. We convert NewRegexp node to PhantomNewRegexp in Object Allocation Sinking (OAS) |
| phase. We should do this analysis in OAS phase since we track modifications to `lastIndex` in the OAS phase. Even if |
| `lastIndex` is modified, it may not be read by users. So we have a chance to drop this NewRegexp beacause we carefully model |
| SetRegExpObjectLastIndex and GetRegExpObjectLastIndex in OAS phase. |
| |
| This patch is a first attempt to drop NewRegexp. So we start optimizing it with the simple step: we first drop RegExp with |
| non-global and non-sticky one. We can later extend this optimization for RegExp with global flag. But this is not included |
| in this patch. |
| |
| We convert RegExpExec to RegExpExecNonGlobalOrSticky if we find that the given RegExpObject's RegExp is not global/sticky |
| flagged. Since we do not need to touch `lastIndex` property in this case, RegExpExecNonGlobalOrSticky just takes RegExp |
| instead of RegExpObject. This offers the chance to make NewRegExp unused. |
| |
| We also convert RegExpMatchFast to RegExpExecNonGlobalOrSticky if its RegExpObject's RegExp is non-global and non-sticky, |
| since they are the same behavior. |
| |
| The above optimization completely removes NewRegexp in SixSpeed's regexp-u.{es5,es6}. The resulted execution time is |
| somewhat pure execution time of our Yarr implementation. |
| |
| baseline patched |
| |
| regex-u.es5 34.8557+-0.5963 ^ 6.1507+-0.5526 ^ definitely 5.6670x faster |
| regex-u.es6 89.1919+-3.3851 ^ 32.0917+-0.4260 ^ definitely 2.7793x faster |
| |
| This patch does not change Octane/RegExp so much since it heavily uses String.prototype.replace, which is not handled in |
| this patch right now. We should support StringReplace node in subsequent patches. |
| |
| * dfg/DFGAbstractInterpreterInlines.h: |
| (JSC::DFG::AbstractInterpreter<AbstractStateType>::executeEffects): |
| * dfg/DFGByteCodeParser.cpp: |
| (JSC::DFG::ByteCodeParser::parseBlock): |
| * dfg/DFGClobberize.h: |
| (JSC::DFG::clobberize): |
| * dfg/DFGClobbersExitState.cpp: |
| (JSC::DFG::clobbersExitState): |
| * dfg/DFGDoesGC.cpp: |
| (JSC::DFG::doesGC): |
| * dfg/DFGFixupPhase.cpp: |
| (JSC::DFG::FixupPhase::fixupNode): |
| * dfg/DFGGraph.cpp: |
| (JSC::DFG::Graph::dump): |
| * dfg/DFGMayExit.cpp: |
| * dfg/DFGNode.cpp: |
| (JSC::DFG::Node::convertToRegExpExecNonGlobalOrSticky): |
| * dfg/DFGNode.h: |
| (JSC::DFG::Node::convertToPhantomNewRegexp): |
| (JSC::DFG::Node::convertToSetRegExpObjectLastIndex): |
| (JSC::DFG::Node::hasHeapPrediction): |
| (JSC::DFG::Node::hasCellOperand): |
| (JSC::DFG::Node::isPhantomAllocation): |
| (JSC::DFG::Node::hasIgnoreLastIndexIsWritable): |
| (JSC::DFG::Node::ignoreLastIndexIsWritable): |
| * dfg/DFGNodeType.h: |
| * dfg/DFGObjectAllocationSinkingPhase.cpp: |
| * dfg/DFGOperations.cpp: |
| * dfg/DFGOperations.h: |
| * dfg/DFGPredictionPropagationPhase.cpp: |
| * dfg/DFGPromotedHeapLocation.cpp: |
| (WTF::printInternal): |
| * dfg/DFGPromotedHeapLocation.h: |
| (JSC::DFG::PromotedLocationDescriptor::neededForMaterialization const): |
| * dfg/DFGSafeToExecute.h: |
| (JSC::DFG::safeToExecute): |
| * dfg/DFGSpeculativeJIT.cpp: |
| (JSC::DFG::SpeculativeJIT::compileNewRegexp): |
| (JSC::DFG::SpeculativeJIT::compileSetRegExpObjectLastIndex): |
| (JSC::DFG::SpeculativeJIT::compileRegExpExecNonGlobalOrSticky): |
| * dfg/DFGSpeculativeJIT.h: |
| (JSC::DFG::SpeculativeJIT::callOperation): |
| * dfg/DFGSpeculativeJIT32_64.cpp: |
| (JSC::DFG::SpeculativeJIT::compile): |
| * dfg/DFGSpeculativeJIT64.cpp: |
| (JSC::DFG::SpeculativeJIT::compile): |
| * dfg/DFGStrengthReductionPhase.cpp: |
| (JSC::DFG::StrengthReductionPhase::handleNode): |
| * dfg/DFGValidate.cpp: |
| * ftl/FTLCapabilities.cpp: |
| (JSC::FTL::canCompile): |
| * ftl/FTLLowerDFGToB3.cpp: |
| (JSC::FTL::DFG::LowerDFGToB3::compileNode): |
| (JSC::FTL::DFG::LowerDFGToB3::compileRegExpExecNonGlobalOrSticky): |
| (JSC::FTL::DFG::LowerDFGToB3::compileNewRegexp): |
| (JSC::FTL::DFG::LowerDFGToB3::compileSetRegExpObjectLastIndex): |
| * ftl/FTLOperations.cpp: |
| (JSC::FTL::operationPopulateObjectInOSR): |
| (JSC::FTL::operationMaterializeObjectInOSR): |
| * jit/JITOperations.h: |
| * runtime/RegExpObject.h: |
| (JSC::RegExpObject::create): |
| |
| 2018-01-17 Yusuke Suzuki <utatane.tea@gmail.com> |
| |
| [FTL] Remove unused helper functions to convert node to PutHint |
| https://bugs.webkit.org/show_bug.cgi?id=181775 |
| |
| Reviewed by Saam Barati. |
| |
| We are using PromotedHeapLocation::createHint. So they are not necessary. |
| |
| * dfg/DFGNode.cpp: |
| (JSC::DFG::Node::convertToPutHint): Deleted. |
| (JSC::DFG::Node::convertToPutStructureHint): Deleted. |
| (JSC::DFG::Node::convertToPutByOffsetHint): Deleted. |
| (JSC::DFG::Node::convertToPutClosureVarHint): Deleted. |
| * dfg/DFGNode.h: |
| |
| 2018-01-17 Yusuke Suzuki <utatane.tea@gmail.com> |
| |
| Unreviewed, suppress warnings on GCC |
| |
| Since `length` and `p` are always positive or zero, |
| static_cast<unsigned>() does what we want. |
| |
| * runtime/JSBigInt.cpp: |
| (JSC::JSBigInt::parseInt): |
| |
| 2018-01-17 Saam Barati <sbarati@apple.com> |
| |
| Disable Atomics when SharedArrayBuffer isn’t enabled |
| https://bugs.webkit.org/show_bug.cgi?id=181572 |
| <rdar://problem/36553206> |
| |
| Reviewed by Michael Saboff. |
| |
| * runtime/JSGlobalObject.cpp: |
| (JSC::JSGlobalObject::init): |
| (JSC::createAtomicsProperty): Deleted. |
| |
| 2018-01-17 Saam Barati <sbarati@apple.com> |
| |
| Support MultiGetByOffset in the DFG |
| https://bugs.webkit.org/show_bug.cgi?id=181466 |
| |
| Reviewed by Keith Miller. |
| |
| This seems to benefit Speedometer in my local testing. It seems like this |
| might be around a 0.5% improvement. |
| |
| * dfg/DFGAbstractInterpreterInlines.h: |
| (JSC::DFG::AbstractInterpreter<AbstractStateType>::executeEffects): |
| * dfg/DFGByteCodeParser.cpp: |
| (JSC::DFG::ByteCodeParser::handleGetById): |
| * dfg/DFGConstantFoldingPhase.cpp: |
| (JSC::DFG::ConstantFoldingPhase::foldConstants): |
| * dfg/DFGGraph.h: |
| (JSC::DFG::Graph::supportsMultiGetByOffset): |
| * dfg/DFGSpeculativeJIT64.cpp: |
| (JSC::DFG::SpeculativeJIT::compile): |
| |
| 2018-01-17 Saam Barati <sbarati@apple.com> |
| |
| DFG::Node::convertToConstant needs to clear the varargs flags |
| https://bugs.webkit.org/show_bug.cgi?id=181697 |
| <rdar://problem/36497332> |
| |
| Reviewed by Yusuke Suzuki. |
| |
| * dfg/DFGNode.h: |
| (JSC::DFG::Node::convertToConstant): |
| |
| 2018-01-16 JF Bastien <jfbastien@apple.com> |
| |
| Allow dangerous disabling of poison |
| https://bugs.webkit.org/show_bug.cgi?id=181685 |
| <rdar://problem/36546265> |
| |
| Reviewed by Keith Miller. |
| |
| Some tools such as leak detectors and such like to look at real |
| pointers, and poisoned ones confuse them. Add a JSC option to |
| disable poisoning, but log to the console when this is done. |
| |
| * runtime/JSCPoison.cpp: |
| (JSC::initializePoison): |
| * runtime/Options.h: |
| |
| 2018-01-16 Ryan Haddad <ryanhaddad@apple.com> |
| |
| Unreviewed, rolling out r226937. |
| |
| Tests added with this change are failing due to a missing |
| exception check. |
| |
| Reverted changeset: |
| |
| "[JSC] NumberPrototype::extractRadixFromArgs incorrectly cast |
| double to int32_t" |
| https://bugs.webkit.org/show_bug.cgi?id=181182 |
| https://trac.webkit.org/changeset/226937 |
| |
| 2018-01-16 Michael Catanzaro <mcatanzaro@igalia.com> |
| |
| Test programs should only be built in developer mode |
| https://bugs.webkit.org/show_bug.cgi?id=181653 |
| |
| Reviewed by Carlos Garcia Campos. |
| |
| Build test programs only in developer mode, and fix code style. |
| |
| * shell/CMakeLists.txt: |
| |
| 2018-01-15 Michael Catanzaro <mcatanzaro@igalia.com> |
| |
| Improve use of ExportMacros |
| https://bugs.webkit.org/show_bug.cgi?id=181652 |
| |
| Reviewed by Konstantin Tokarev. |
| |
| * API/JSBase.h: Update a comment. |
| * inspector/InspectorBackendDispatcher.h: Use a better, yet equivalent, WTF macro. |
| * runtime/JSExportMacros.h: Simplify the #defines in this file. |
| |
| 2018-01-15 JF Bastien <jfbastien@apple.com> |
| |
| Remove makePoisonedUnique |
| https://bugs.webkit.org/show_bug.cgi?id=181630 |
| <rdar://problem/36498623> |
| |
| Reviewed by Mark Lam. |
| |
| I added a conversion from std::unique_ptr, so we can just use |
| std::make_unique and it'll auto-poison when converted. |
| |
| * bytecode/CodeBlock.h: |
| (JSC::CodeBlock::makePoisonedUnique): Deleted. |
| * runtime/JSGlobalObject.cpp: |
| (JSC::JSGlobalObject::init): |
| * runtime/JSGlobalObject.h: |
| (JSC::JSGlobalObject::makePoisonedUnique): Deleted. |
| |
| 2018-01-15 Michael Catanzaro <mcatanzaro@igalia.com> |
| |
| REGRESSION(r226266): [GTK] RELEASE_ASSERT(reservedZoneSize >= minimumReservedZoneSize) in JSC::VM::updateStackLimits |
| https://bugs.webkit.org/show_bug.cgi?id=181438 |
| <rdar://problem/36376724> |
| |
| Reviewed by Carlos Garcia Campos. |
| |
| Roll out the functional changes of r226266. We'll keep the minor CMake library type setting |
| cleanup, but we have to switch back to building JSC only as a shared library, and we have to |
| get rid of the version script. |
| |
| * PlatformGTK.cmake: |
| * javascriptcoregtk-symbols.map: Removed. |
| |
| 2018-01-14 Saam Barati <sbarati@apple.com> |
| |
| Unreviewed. r226928 broke the CLOOP build. This patch fixes the CLOOP build. |
| |
| * bytecode/CallLinkStatus.cpp: |
| (JSC::CallLinkStatus::computeFromLLInt): |
| (JSC::CallLinkStatus::computeExitSiteData): |
| |
| 2018-01-13 Mark Lam <mark.lam@apple.com> |
| |
| Replace all use of ConstExprPoisoned with Poisoned. |
| https://bugs.webkit.org/show_bug.cgi?id=181542 |
| <rdar://problem/36442138> |
| |
| Reviewed by JF Bastien. |
| |
| 1. All JSC poisons are now defined in JSCPoison.h. |
| |
| 2. Change all clients to use the new poison values via the POISON() macro. |
| |
| 3. The LLInt code has been updated to handle CodeBlock poison. Some of this code |
| uses the t5 temp register, which is not available on the Windows port. |
| Fortunately, we don't currently do poisoning on the Windows port yet. So, |
| it will just work for now. |
| |
| When poisoning is enabled for the Windows port, this LLInt code will need a |
| Windows specific implementation to workaround its lack of a t5 register. |
| |
| * API/JSAPIWrapperObject.h: |
| * API/JSCallbackFunction.h: |
| * API/JSCallbackObject.h: |
| * JavaScriptCore.xcodeproj/project.pbxproj: |
| * Sources.txt: |
| * assembler/MacroAssemblerCodeRef.h: |
| (JSC::MacroAssemblerCodePtr::emptyValue): |
| (JSC::MacroAssemblerCodePtr::deletedValue): |
| * b3/B3LowerMacros.cpp: |
| * b3/testb3.cpp: |
| (JSC::B3::testInterpreter): |
| * bytecode/CodeBlock.h: |
| (JSC::CodeBlock::instructions): |
| (JSC::CodeBlock::instructions const): |
| (JSC::CodeBlock::makePoisonedUnique): |
| * dfg/DFGOSRExitCompilerCommon.h: |
| (JSC::DFG::adjustFrameAndStackInOSRExitCompilerThunk): |
| * dfg/DFGSpeculativeJIT.cpp: |
| (JSC::DFG::SpeculativeJIT::compileCheckSubClass): |
| (JSC::DFG::SpeculativeJIT::emitSwitchIntJump): |
| * ftl/FTLLowerDFGToB3.cpp: |
| (JSC::FTL::DFG::LowerDFGToB3::compileCheckSubClass): |
| * jit/JIT.h: |
| * jit/ThunkGenerators.cpp: |
| (JSC::virtualThunkFor): |
| (JSC::nativeForGenerator): |
| (JSC::boundThisNoArgsFunctionCallGenerator): |
| * llint/LowLevelInterpreter.asm: |
| * llint/LowLevelInterpreter32_64.asm: |
| * llint/LowLevelInterpreter64.asm: |
| * parser/UnlinkedSourceCode.h: |
| * runtime/ArrayPrototype.h: |
| * runtime/CustomGetterSetter.h: |
| * runtime/DateInstance.h: |
| * runtime/InternalFunction.h: |
| * runtime/JSArrayBuffer.h: |
| * runtime/JSCPoison.cpp: Copied from Source/JavaScriptCore/runtime/JSCPoisonedPtr.cpp. |
| (JSC::initializePoison): |
| * runtime/JSCPoison.h: |
| (): Deleted. |
| * runtime/JSCPoisonedPtr.cpp: Removed. |
| * runtime/JSCPoisonedPtr.h: Removed. |
| * runtime/JSGlobalObject.h: |
| (JSC::JSGlobalObject::makePoisonedUnique): |
| * runtime/JSScriptFetchParameters.h: |
| * runtime/JSScriptFetcher.h: |
| * runtime/NativeExecutable.h: |
| * runtime/StructureTransitionTable.h: |
| (JSC::StructureTransitionTable::map const): |
| (JSC::StructureTransitionTable::weakImpl const): |
| * runtime/WriteBarrier.h: |
| (JSC::WriteBarrier::poison): |
| * wasm/js/JSToWasm.cpp: |
| (JSC::Wasm::createJSToWasmWrapper): |
| * wasm/js/JSWebAssemblyCodeBlock.cpp: |
| (JSC::JSWebAssemblyCodeBlock::JSWebAssemblyCodeBlock): |
| * wasm/js/JSWebAssemblyCodeBlock.h: |
| * wasm/js/JSWebAssemblyInstance.h: |
| * wasm/js/JSWebAssemblyMemory.h: |
| * wasm/js/JSWebAssemblyModule.h: |
| * wasm/js/JSWebAssemblyTable.h: |
| * wasm/js/WasmToJS.cpp: |
| (JSC::Wasm::handleBadI64Use): |
| (JSC::Wasm::wasmToJS): |
| * wasm/js/WebAssemblyFunctionBase.h: |
| * wasm/js/WebAssemblyModuleRecord.h: |
| * wasm/js/WebAssemblyToJSCallee.h: |
| * wasm/js/WebAssemblyWrapperFunction.h: |
| |
| 2018-01-13 Caio Lima <ticaiolima@gmail.com> |
| |
| [JSC] NumberPrototype::extractRadixFromArgs incorrectly cast double to int32_t |
| https://bugs.webkit.org/show_bug.cgi?id=181182 |
| |
| Reviewed by Darin Adler. |
| |
| Casting double to integer is undefined behavior when the truncation |
| results into a value that doesn't fit into integer size, according C++ |
| spec[1]. Thus, we are changing bigIntProtoFuncToString and |
| numberProtoFuncToString to remove these source of undefined behavior. |
| |
| [1] - http://en.cppreference.com/w/cpp/language/implicit_conversion |
| |
| * runtime/BigIntPrototype.cpp: |
| (JSC::bigIntProtoFuncToString): |
| * runtime/NumberPrototype.cpp: |
| (JSC::numberProtoFuncToString): |
| (JSC::extractRadixFromArgs): Deleted. |
| (JSC::extractToStringRadixArgument): Added. |
| |
| 2018-01-12 Saam Barati <sbarati@apple.com> |
| |
| Move ExitProfile to UnlinkedCodeBlock so it can be shared amongst CodeBlocks backed by the same UnlinkedCodeBlock |
| https://bugs.webkit.org/show_bug.cgi?id=181545 |
| |
| Reviewed by Michael Saboff. |
| |
| This patch follows the theme of putting optimization profiling information on |
| UnlinkedCodeBlock. This allows the unlinked code cache to remember OSR exit data. |
| This often leads to the first compile of a CodeBlock, backed by an UnlinkedCodeBlock |
| pulled from the code cache, making better compilation decisions, usually |
| resulting in fewer exits, and fewer recompilations. |
| |
| This is a 1% Speedometer progression in my testing. |
| |
| * bytecode/BytecodeDumper.cpp: |
| (JSC::BytecodeDumper<CodeBlock>::dumpProfilesForBytecodeOffset): |
| * bytecode/CallLinkStatus.cpp: |
| (JSC::CallLinkStatus::computeFromLLInt): |
| (JSC::CallLinkStatus::computeFor): |
| (JSC::CallLinkStatus::computeExitSiteData): |
| (JSC::CallLinkStatus::computeDFGStatuses): |
| * bytecode/CallLinkStatus.h: |
| * bytecode/CodeBlock.h: |
| (JSC::CodeBlock::addFrequentExitSite): Deleted. |
| (JSC::CodeBlock::hasExitSite const): Deleted. |
| (JSC::CodeBlock::exitProfile): Deleted. |
| * bytecode/DFGExitProfile.cpp: |
| (JSC::DFG::ExitProfile::add): |
| (JSC::DFG::QueryableExitProfile::initialize): |
| * bytecode/DFGExitProfile.h: |
| (JSC::DFG::ExitProfile::hasExitSite const): |
| * bytecode/GetByIdStatus.cpp: |
| (JSC::GetByIdStatus::hasExitSite): |
| (JSC::GetByIdStatus::computeFor): |
| (JSC::GetByIdStatus::computeForStubInfo): |
| * bytecode/GetByIdStatus.h: |
| * bytecode/PutByIdStatus.cpp: |
| (JSC::PutByIdStatus::hasExitSite): |
| (JSC::PutByIdStatus::computeFor): |
| (JSC::PutByIdStatus::computeForStubInfo): |
| * bytecode/PutByIdStatus.h: |
| * bytecode/UnlinkedCodeBlock.cpp: |
| (JSC::UnlinkedCodeBlock::livenessAnalysisSlow): |
| * bytecode/UnlinkedCodeBlock.h: |
| (JSC::UnlinkedCodeBlock::hasExitSite const): |
| (JSC::UnlinkedCodeBlock::hasExitSite): |
| (JSC::UnlinkedCodeBlock::exitProfile): |
| * dfg/DFGByteCodeParser.cpp: |
| (JSC::DFG::ByteCodeParser::InlineStackEntry::InlineStackEntry): |
| * dfg/DFGGraph.h: |
| (JSC::DFG::Graph::hasGlobalExitSite): |
| (JSC::DFG::Graph::hasExitSite): |
| * dfg/DFGLICMPhase.cpp: |
| (JSC::DFG::LICMPhase::attemptHoist): |
| * dfg/DFGOSRExitBase.cpp: |
| (JSC::DFG::OSRExitBase::considerAddingAsFrequentExitSiteSlow): |
| |
| 2018-01-12 JF Bastien <jfbastien@apple.com> |
| |
| PoisonedWriteBarrier |
| https://bugs.webkit.org/show_bug.cgi?id=181599 |
| <rdar://problem/36474351> |
| |
| Reviewed by Mark Lam. |
| |
| Allow poisoning of WriteBarrier objects, and use this for |
| WebAssembly because it is perf-neutral, at least on WasmBench on |
| my MBP. If it indeed is perf-neutral according to the bots, start |
| using it in more performance-sensitive places. |
| |
| * heap/HandleTypes.h: |
| * heap/SlotVisitor.h: |
| * heap/SlotVisitorInlines.h: |
| (JSC::SlotVisitor::append): |
| (JSC::SlotVisitor::appendHidden): |
| * runtime/JSCJSValue.h: |
| * runtime/JSCPoison.h: |
| * runtime/Structure.h: |
| * runtime/StructureInlines.h: |
| (JSC::Structure::setPrototypeWithoutTransition): |
| (JSC::Structure::setGlobalObject): |
| (JSC::Structure::setPreviousID): |
| * runtime/WriteBarrier.h: |
| (JSC::WriteBarrierBase::copyFrom): |
| (JSC::WriteBarrierBase::get const): |
| (JSC::WriteBarrierBase::operator* const): |
| (JSC::WriteBarrierBase::operator-> const): |
| (JSC::WriteBarrierBase::clear): |
| (JSC::WriteBarrierBase::slot): |
| (JSC::WriteBarrierBase::operator bool const): |
| (JSC::WriteBarrierBase::setWithoutWriteBarrier): |
| (JSC::WriteBarrierBase::unvalidatedGet const): |
| (JSC::operator==): |
| * runtime/WriteBarrierInlines.h: |
| (JSC::Traits>::set): |
| (JSC::Traits>::setMayBeNull): |
| (JSC::Traits>::setEarlyValue): |
| (JSC::DumbValueTraits<Unknown>>::set): |
| * wasm/WasmInstance.h: |
| * wasm/js/JSWebAssemblyInstance.cpp: |
| (JSC::JSWebAssemblyInstance::JSWebAssemblyInstance): |
| (JSC::JSWebAssemblyInstance::finishCreation): |
| (JSC::JSWebAssemblyInstance::visitChildren): |
| (JSC::JSWebAssemblyInstance::create): |
| * wasm/js/JSWebAssemblyInstance.h: |
| (JSC::JSWebAssemblyInstance::offsetOfPoisonedCallee): |
| * wasm/js/JSWebAssemblyMemory.h: |
| * wasm/js/JSWebAssemblyModule.h: |
| * wasm/js/JSWebAssemblyTable.cpp: |
| (JSC::JSWebAssemblyTable::JSWebAssemblyTable): |
| (JSC::JSWebAssemblyTable::grow): |
| (JSC::JSWebAssemblyTable::clearFunction): |
| * wasm/js/JSWebAssemblyTable.h: |
| * wasm/js/WasmToJS.cpp: |
| (JSC::Wasm::materializeImportJSCell): |
| (JSC::Wasm::handleBadI64Use): |
| (JSC::Wasm::wasmToJS): |
| * wasm/js/WebAssemblyFunctionBase.h: |
| * wasm/js/WebAssemblyModuleRecord.cpp: |
| (JSC::WebAssemblyModuleRecord::link): |
| (JSC::WebAssemblyModuleRecord::evaluate): |
| * wasm/js/WebAssemblyModuleRecord.h: |
| * wasm/js/WebAssemblyToJSCallee.h: |
| * wasm/js/WebAssemblyWrapperFunction.h: |
| |
| 2018-01-12 Saam Barati <sbarati@apple.com> |
| |
| CheckStructure can be incorrectly subsumed by CheckStructureOrEmpty |
| https://bugs.webkit.org/show_bug.cgi?id=181177 |
| <rdar://problem/36205704> |
| |
| Reviewed by Yusuke Suzuki. |
| |
| The semantics of CheckStructure are such that it does not allow the empty value to flow through it. |
| However, we may eliminate a CheckStructure if it's preceded by a CheckStructureOrEmpty. This doesn't |
| have semantic consequences when validation is turned off. However, with validation on, this trips up |
| our OSR exit machinery that says when an exit is allowed to happen. |
| |
| Consider the following IR: |
| |
| a: GetClosureVar // Or any other node that produces BytecodeTop |
| ... |
| c: CheckStructure(Cell:@a, {s2}) |
| d: PutByOffset(KnownCell:@a, KnownCell:@a, @value) |
| |
| In the TypeCheckHoistingPhase, we may insert CheckStructureOrEmptys like this: |
| a: GetClosureVar |
| e: CheckStructureOrEmpty(@a, {s1}) |
| ... |
| f: CheckStructureOrEmpty(@a, {s2}) |
| c: CheckStructure(Cell:@a, {s2}) |
| d: PutByOffset(KnownCell:@a, KnownCell:@a, @value) |
| |
| This will cause constant folding to change the IR to: |
| a: GetClosureVar |
| e: CheckStructureOrEmpty(@a, {s1}) |
| ... |
| f: CheckStructureOrEmpty(@a, {s2}) |
| d: PutByOffset(KnownCell:@a, KnownCell:@a, @value) |
| |
| Our mayExit analysis determines that the PutByOffset should not exit. Note |
| that AI will determine the only value the PutByOffset can see in @a is |
| the empty value. Because KnownCell filters SpecCell and not SpecCellCheck, |
| when lowering the PutByOffset, we reach a contradiction in AI and emit |
| an OSR exit. However, because mayExit said we couldn't exit, we assert. |
| |
| Note that if we did not run the TypeCheckHoistingPhase on this IR, AI |
| would have determined we would OSR exit at the second CheckStructure. |
| |
| This patch makes it so constant folding produces the following IR: |
| a: GetClosureVar |
| e: CheckStructureOrEmpty(@a, {s1}) |
| g: AssertNotEmpty(@a) |
| ... |
| f: CheckStructureOrEmpty(@a, {s2}) |
| h: AssertNotEmpty(@a) |
| d: PutByOffset(KnownCell:@a, KnownCell:@a, @value) |
| |
| This modification will cause AI to know we will OSR exit before even reaching |
| the PutByOffset. Note that in the original IR, the GetClosureVar won't |
| actually produce the TDZ value. If it did, bytecode would have caused us |
| to emit a CheckNotEmpty before the CheckStructure/PutByOffset combo. That's |
| why this bug is about IR bookkeeping and not an actual error in IR analysis. |
| This patch introduces AssertNotEmpty instead of using CheckNotEmpty to be |
| more congruous with CheckStructure's semantics of crashing on the empty value |
| as input (on 64 bit platforms). |
| |
| * dfg/DFGAbstractInterpreterInlines.h: |
| (JSC::DFG::AbstractInterpreter<AbstractStateType>::executeEffects): |
| * dfg/DFGClobberize.h: |
| (JSC::DFG::clobberize): |
| * dfg/DFGConstantFoldingPhase.cpp: |
| (JSC::DFG::ConstantFoldingPhase::foldConstants): |
| * dfg/DFGDoesGC.cpp: |
| (JSC::DFG::doesGC): |
| * dfg/DFGFixupPhase.cpp: |
| (JSC::DFG::FixupPhase::fixupNode): |
| * dfg/DFGNodeType.h: |
| * dfg/DFGPredictionPropagationPhase.cpp: |
| * dfg/DFGSafeToExecute.h: |
| (JSC::DFG::safeToExecute): |
| * 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::compileAssertNotEmpty): |
| |
| 2018-01-12 Joseph Pecoraro <pecoraro@apple.com> |
| |
| Web Inspector: Remove unnecessary raw pointer in InspectorConsoleAgent |
| https://bugs.webkit.org/show_bug.cgi?id=181579 |
| <rdar://problem/36193759> |
| |
| Reviewed by Brian Burg. |
| |
| * inspector/agents/InspectorConsoleAgent.h: |
| * inspector/agents/InspectorConsoleAgent.cpp: |
| (Inspector::InspectorConsoleAgent::clearMessages): |
| (Inspector::InspectorConsoleAgent::addConsoleMessage): |
| Switch from a raw pointer to m_consoleMessages.last(). |
| Also move the expiration check into the if block since it can only |
| happen inside here when the number of console messages changes. |
| |
| (Inspector::InspectorConsoleAgent::discardValues): |
| Also clear the expired message count when messages are cleared. |
| |
| 2018-01-12 Yusuke Suzuki <utatane.tea@gmail.com> |
| |
| [JSC] Create parallel SlotVisitors apriori |
| https://bugs.webkit.org/show_bug.cgi?id=180907 |
| |
| Reviewed by Saam Barati. |
| |
| The number of SlotVisitors are capped with the number of HeapHelperPool's threads + 2. |
| If we create these SlotVisitors apropri, we do not need to create SlotVisitors dynamically. |
| Then we do not need to grab locks while iterating all the SlotVisitors. |
| |
| In addition, we do not need to consider the case that the number of SlotVisitors increases |
| after setting up VisitCounters in MarkingConstraintSolver since the number of SlotVisitors |
| does not increase any more. |
| |
| * heap/Heap.cpp: |
| (JSC::Heap::Heap): |
| (JSC::Heap::runBeginPhase): |
| * heap/Heap.h: |
| * heap/HeapInlines.h: |
| (JSC::Heap::forEachSlotVisitor): |
| (JSC::Heap::numberOfSlotVisitors): Deleted. |
| * heap/MarkingConstraintSolver.cpp: |
| (JSC::MarkingConstraintSolver::didVisitSomething const): |
| |
| 2018-01-12 Saam Barati <sbarati@apple.com> |
| |
| Each variant of a polymorphic inlined call should be exitOK at the top of the block |
| https://bugs.webkit.org/show_bug.cgi?id=181562 |
| <rdar://problem/36445624> |
| |
| Reviewed by Yusuke Suzuki. |
| |
| Before this patch, the very first block in the switch for polymorphic call |
| inlining will have exitOK at the top. The others are not guaranteed to. |
| That was just a bug. They're all exitOK at the top. This will lead to crashes |
| in FixupPhase because we won't have a node in a block that has ExitOK, so |
| when we fixup various type checks, we assert out. |
| |
| * dfg/DFGByteCodeParser.cpp: |
| (JSC::DFG::ByteCodeParser::handleInlining): |
| |
| 2018-01-11 Keith Miller <keith_miller@apple.com> |
| |
| Rename ENABLE_ASYNC_ITERATION to ENABLE_JS_ASYNC_ITERATION |
| https://bugs.webkit.org/show_bug.cgi?id=181573 |
| |
| Reviewed by Simon Fraser. |
| |
| * Configurations/FeatureDefines.xcconfig: |
| * runtime/Options.h: |
| |
| 2018-01-11 Michael Saboff <msaboff@apple.com> |
| |
| REGRESSION(226788): AppStore Crashed @ JavaScriptCore: JSC::MacroAssemblerARM64::pushToSaveImmediateWithoutTouchingRegisters |
| https://bugs.webkit.org/show_bug.cgi?id=181570 |
| |
| Reviewed by Keith Miller. |
| |
| * assembler/MacroAssemblerARM64.h: |
| (JSC::MacroAssemblerARM64::abortWithReason): |
| Reverting these functions to use dataTempRegister and memoryTempRegister as they are |
| JIT release asserts that will crash the program. |
| |
| (JSC::MacroAssemblerARM64::pushToSaveImmediateWithoutTouchingRegisters): |
| Changed this so that it invalidates any cached dataTmpRegister contents if temp register |
| caching is enabled. |
| |
| 2018-01-11 Filip Pizlo <fpizlo@apple.com> |
| |
| Rename MarkedAllocator to BlockDirectory and AllocatorAttributes to CellAttributes |
| https://bugs.webkit.org/show_bug.cgi?id=181543 |
| |
| Rubber stamped by Michael Saboff. |
| |
| In a world that has thread-local caches, the thing we now call the "MarkedAllocator" doesn't |
| really have anything to do with allocation anymore. The allocation will be done by something |
| in the TLC. When you move the allocation logic out of MarkedAllocator, it becomes just a |
| place to find blocks (a "block directory"). |
| |
| Once we do that renaming, the term "allocator attributes" becomes weird. Those are really the |
| attributes of the HeapCellType. So let's call them CellAttributes. |
| |
| * JavaScriptCore.xcodeproj/project.pbxproj: |
| * Sources.txt: |
| * bytecode/AccessCase.cpp: |
| (JSC::AccessCase::generateImpl): |
| * bytecode/ObjectAllocationProfile.h: |
| * bytecode/ObjectAllocationProfileInlines.h: |
| (JSC::ObjectAllocationProfile::initializeProfile): |
| * dfg/DFGSpeculativeJIT.cpp: |
| (JSC::DFG::SpeculativeJIT::emitAllocateRawObject): |
| (JSC::DFG::SpeculativeJIT::compileMakeRope): |
| (JSC::DFG::SpeculativeJIT::compileAllocatePropertyStorage): |
| (JSC::DFG::SpeculativeJIT::compileReallocatePropertyStorage): |
| (JSC::DFG::SpeculativeJIT::compileNewObject): |
| * dfg/DFGSpeculativeJIT.h: |
| (JSC::DFG::SpeculativeJIT::emitAllocateJSCell): |
| (JSC::DFG::SpeculativeJIT::emitAllocateJSObject): |
| * ftl/FTLAbstractHeapRepository.h: |
| * ftl/FTLLowerDFGToB3.cpp: |
| (JSC::FTL::DFG::LowerDFGToB3::compileMakeRope): |
| (JSC::FTL::DFG::LowerDFGToB3::compileMaterializeNewObject): |
| (JSC::FTL::DFG::LowerDFGToB3::allocatePropertyStorageWithSizeImpl): |
| (JSC::FTL::DFG::LowerDFGToB3::allocateHeapCell): |
| (JSC::FTL::DFG::LowerDFGToB3::allocateObject): |
| (JSC::FTL::DFG::LowerDFGToB3::allocatorForSize): |
| * heap/AlignedMemoryAllocator.cpp: |
| (JSC::AlignedMemoryAllocator::registerDirectory): |
| (JSC::AlignedMemoryAllocator::registerAllocator): Deleted. |
| * heap/AlignedMemoryAllocator.h: |
| (JSC::AlignedMemoryAllocator::firstDirectory const): |
| (JSC::AlignedMemoryAllocator::firstAllocator const): Deleted. |
| * heap/AllocatorAttributes.cpp: Removed. |
| * heap/AllocatorAttributes.h: Removed. |
| * heap/BlockDirectory.cpp: Copied from Source/JavaScriptCore/heap/MarkedAllocator.cpp. |
| (JSC::BlockDirectory::BlockDirectory): |
| (JSC::BlockDirectory::setSubspace): |
| (JSC::BlockDirectory::isPagedOut): |
| (JSC::BlockDirectory::findEmptyBlockToSteal): |
| (JSC::BlockDirectory::didConsumeFreeList): |
| (JSC::BlockDirectory::tryAllocateWithoutCollecting): |
| (JSC::BlockDirectory::allocateIn): |
| (JSC::BlockDirectory::tryAllocateIn): |
| (JSC::BlockDirectory::doTestCollectionsIfNeeded): |
| (JSC::BlockDirectory::allocateSlowCase): |
| (JSC::BlockDirectory::blockSizeForBytes): |
| (JSC::BlockDirectory::tryAllocateBlock): |
| (JSC::BlockDirectory::addBlock): |
| (JSC::BlockDirectory::removeBlock): |
| (JSC::BlockDirectory::stopAllocating): |
| (JSC::BlockDirectory::prepareForAllocation): |
| (JSC::BlockDirectory::lastChanceToFinalize): |
| (JSC::BlockDirectory::resumeAllocating): |
| (JSC::BlockDirectory::beginMarkingForFullCollection): |
| (JSC::BlockDirectory::endMarking): |
| (JSC::BlockDirectory::snapshotUnsweptForEdenCollection): |
| (JSC::BlockDirectory::snapshotUnsweptForFullCollection): |
| (JSC::BlockDirectory::findBlockToSweep): |
| (JSC::BlockDirectory::sweep): |
| (JSC::BlockDirectory::shrink): |
| (JSC::BlockDirectory::assertNoUnswept): |
| (JSC::BlockDirectory::parallelNotEmptyBlockSource): |
| (JSC::BlockDirectory::dump const): |
| (JSC::BlockDirectory::dumpBits): |
| (JSC::BlockDirectory::markedSpace const): |
| (JSC::MarkedAllocator::MarkedAllocator): Deleted. |
| (JSC::MarkedAllocator::setSubspace): Deleted. |
| (JSC::MarkedAllocator::isPagedOut): Deleted. |
| (JSC::MarkedAllocator::findEmptyBlockToSteal): Deleted. |
| (JSC::MarkedAllocator::didConsumeFreeList): Deleted. |
| (JSC::MarkedAllocator::tryAllocateWithoutCollecting): Deleted. |
| (JSC::MarkedAllocator::allocateIn): Deleted. |
| (JSC::MarkedAllocator::tryAllocateIn): Deleted. |
| (JSC::MarkedAllocator::doTestCollectionsIfNeeded): Deleted. |
| (JSC::MarkedAllocator::allocateSlowCase): Deleted. |
| (JSC::MarkedAllocator::blockSizeForBytes): Deleted. |
| (JSC::MarkedAllocator::tryAllocateBlock): Deleted. |
| (JSC::MarkedAllocator::addBlock): Deleted. |
| (JSC::MarkedAllocator::removeBlock): Deleted. |
| (JSC::MarkedAllocator::stopAllocating): Deleted. |
| (JSC::MarkedAllocator::prepareForAllocation): Deleted. |
| (JSC::MarkedAllocator::lastChanceToFinalize): Deleted. |
| (JSC::MarkedAllocator::resumeAllocating): Deleted. |
| (JSC::MarkedAllocator::beginMarkingForFullCollection): Deleted. |
| (JSC::MarkedAllocator::endMarking): Deleted. |
| (JSC::MarkedAllocator::snapshotUnsweptForEdenCollection): Deleted. |
| (JSC::MarkedAllocator::snapshotUnsweptForFullCollection): Deleted. |
| (JSC::MarkedAllocator::findBlockToSweep): Deleted. |
| (JSC::MarkedAllocator::sweep): Deleted. |
| (JSC::MarkedAllocator::shrink): Deleted. |
| (JSC::MarkedAllocator::assertNoUnswept): Deleted. |
| (JSC::MarkedAllocator::parallelNotEmptyBlockSource): Deleted. |
| (JSC::MarkedAllocator::dump const): Deleted. |
| (JSC::MarkedAllocator::dumpBits): Deleted. |
| (JSC::MarkedAllocator::markedSpace const): Deleted. |
| * heap/BlockDirectory.h: Copied from Source/JavaScriptCore/heap/MarkedAllocator.h. |
| (JSC::BlockDirectory::attributes const): |
| (JSC::BlockDirectory::forEachBitVector): |
| (JSC::BlockDirectory::forEachBitVectorWithName): |
| (JSC::BlockDirectory::nextDirectory const): |
| (JSC::BlockDirectory::nextDirectoryInSubspace const): |
| (JSC::BlockDirectory::nextDirectoryInAlignedMemoryAllocator const): |
| (JSC::BlockDirectory::setNextDirectory): |
| (JSC::BlockDirectory::setNextDirectoryInSubspace): |
| (JSC::BlockDirectory::setNextDirectoryInAlignedMemoryAllocator): |
| (JSC::BlockDirectory::offsetOfFreeList): |
| (JSC::BlockDirectory::offsetOfCellSize): |
| (JSC::MarkedAllocator::cellSize const): Deleted. |
| (JSC::MarkedAllocator::attributes const): Deleted. |
| (JSC::MarkedAllocator::needsDestruction const): Deleted. |
| (JSC::MarkedAllocator::destruction const): Deleted. |
| (JSC::MarkedAllocator::cellKind const): Deleted. |
| (JSC::MarkedAllocator::heap): Deleted. |
| (JSC::MarkedAllocator::bitvectorLock): Deleted. |
| (JSC::MarkedAllocator::forEachBitVector): Deleted. |
| (JSC::MarkedAllocator::forEachBitVectorWithName): Deleted. |
| (JSC::MarkedAllocator::nextAllocator const): Deleted. |
| (JSC::MarkedAllocator::nextAllocatorInSubspace const): Deleted. |
| (JSC::MarkedAllocator::nextAllocatorInAlignedMemoryAllocator const): Deleted. |
| (JSC::MarkedAllocator::setNextAllocator): Deleted. |
| (JSC::MarkedAllocator::setNextAllocatorInSubspace): Deleted. |
| (JSC::MarkedAllocator::setNextAllocatorInAlignedMemoryAllocator): Deleted. |
| (JSC::MarkedAllocator::subspace const): Deleted. |
| (JSC::MarkedAllocator::freeList const): Deleted. |
| (JSC::MarkedAllocator::offsetOfFreeList): Deleted. |
| (JSC::MarkedAllocator::offsetOfCellSize): Deleted. |
| * heap/BlockDirectoryInlines.h: Copied from Source/JavaScriptCore/heap/MarkedAllocatorInlines.h. |
| (JSC::BlockDirectory::isFreeListedCell const): |
| (JSC::BlockDirectory::allocate): |
| (JSC::BlockDirectory::forEachBlock): |
| (JSC::BlockDirectory::forEachNotEmptyBlock): |
| (JSC::MarkedAllocator::isFreeListedCell const): Deleted. |
| (JSC::MarkedAllocator::allocate): Deleted. |
| (JSC::MarkedAllocator::forEachBlock): Deleted. |
| (JSC::MarkedAllocator::forEachNotEmptyBlock): Deleted. |
| * heap/CellAttributes.cpp: Copied from Source/JavaScriptCore/heap/AllocatorAttributes.cpp. |
| (JSC::CellAttributes::dump const): |
| (JSC::AllocatorAttributes::dump const): Deleted. |
| * heap/CellAttributes.h: Copied from Source/JavaScriptCore/heap/AllocatorAttributes.h. |
| (JSC::CellAttributes::CellAttributes): |
| (JSC::AllocatorAttributes::AllocatorAttributes): Deleted. |
| * heap/CompleteSubspace.cpp: |
| (JSC::CompleteSubspace::allocatorFor): |
| (JSC::CompleteSubspace::allocateNonVirtual): |
| (JSC::CompleteSubspace::allocatorForSlow): |
| (JSC::CompleteSubspace::tryAllocateSlow): |
| * heap/CompleteSubspace.h: |
| (JSC::CompleteSubspace::allocatorForSizeStep): |
| (JSC::CompleteSubspace::allocatorForNonVirtual): |
| * heap/GCDeferralContext.h: |
| * heap/Heap.cpp: |
| (JSC::Heap::updateAllocationLimits): |
| * heap/Heap.h: |
| * heap/HeapCell.h: |
| * heap/HeapCellInlines.h: |
| (JSC::HeapCell::cellAttributes const): |
| (JSC::HeapCell::destructionMode const): |
| (JSC::HeapCell::cellKind const): |
| (JSC::HeapCell::allocatorAttributes const): Deleted. |
| * heap/HeapCellType.cpp: |
| (JSC::HeapCellType::HeapCellType): |
| * heap/HeapCellType.h: |
| (JSC::HeapCellType::attributes const): |
| * heap/IncrementalSweeper.cpp: |
| (JSC::IncrementalSweeper::IncrementalSweeper): |
| (JSC::IncrementalSweeper::sweepNextBlock): |
| (JSC::IncrementalSweeper::startSweeping): |
| (JSC::IncrementalSweeper::stopSweeping): |
| * heap/IncrementalSweeper.h: |
| * heap/IsoCellSet.cpp: |
| (JSC::IsoCellSet::IsoCellSet): |
| (JSC::IsoCellSet::parallelNotEmptyMarkedBlockSource): |
| (JSC::IsoCellSet::addSlow): |
| (JSC::IsoCellSet::didRemoveBlock): |
| (JSC::IsoCellSet::sweepToFreeList): |
| * heap/IsoCellSetInlines.h: |
| (JSC::IsoCellSet::forEachMarkedCell): |
| (JSC::IsoCellSet::forEachLiveCell): |
| * heap/IsoSubspace.cpp: |
| (JSC::IsoSubspace::IsoSubspace): |
| (JSC::IsoSubspace::allocatorFor): |
| (JSC::IsoSubspace::allocateNonVirtual): |
| * heap/IsoSubspace.h: |
| (JSC::IsoSubspace::allocatorForNonVirtual): |
| * heap/LargeAllocation.h: |
| (JSC::LargeAllocation::attributes const): |
| * heap/MarkedAllocator.cpp: Removed. |
| * heap/MarkedAllocator.h: Removed. |
| * heap/MarkedAllocatorInlines.h: Removed. |
| * heap/MarkedBlock.cpp: |
| (JSC::MarkedBlock::Handle::~Handle): |
| (JSC::MarkedBlock::Handle::setIsFreeListed): |
| (JSC::MarkedBlock::Handle::stopAllocating): |
| (JSC::MarkedBlock::Handle::lastChanceToFinalize): |
| (JSC::MarkedBlock::Handle::resumeAllocating): |
| (JSC::MarkedBlock::aboutToMarkSlow): |
| (JSC::MarkedBlock::Handle::didConsumeFreeList): |
| (JSC::MarkedBlock::noteMarkedSlow): |
| (JSC::MarkedBlock::Handle::removeFromDirectory): |
| (JSC::MarkedBlock::Handle::didAddToDirectory): |
| (JSC::MarkedBlock::Handle::didRemoveFromDirectory): |
| (JSC::MarkedBlock::Handle::dumpState): |
| (JSC::MarkedBlock::Handle::subspace const): |
| (JSC::MarkedBlock::Handle::sweep): |
| (JSC::MarkedBlock::Handle::isFreeListedCell const): |
| (JSC::MarkedBlock::Handle::removeFromAllocator): Deleted. |
| (JSC::MarkedBlock::Handle::didAddToAllocator): Deleted. |
| (JSC::MarkedBlock::Handle::didRemoveFromAllocator): Deleted. |
| * heap/MarkedBlock.h: |
| (JSC::MarkedBlock::Handle::directory const): |
| (JSC::MarkedBlock::Handle::attributes const): |
| (JSC::MarkedBlock::attributes const): |
| (JSC::MarkedBlock::Handle::allocator const): Deleted. |
| * heap/MarkedBlockInlines.h: |
| (JSC::MarkedBlock::Handle::isAllocated): |
| (JSC::MarkedBlock::Handle::isLive): |
| (JSC::MarkedBlock::Handle::specializedSweep): |
| (JSC::MarkedBlock::Handle::isEmpty): |
| * heap/MarkedSpace.cpp: |
| (JSC::MarkedSpace::lastChanceToFinalize): |
| (JSC::MarkedSpace::sweep): |
| (JSC::MarkedSpace::stopAllocating): |
| (JSC::MarkedSpace::resumeAllocating): |
| (JSC::MarkedSpace::isPagedOut): |
| (JSC::MarkedSpace::freeBlock): |
| (JSC::MarkedSpace::shrink): |
| (JSC::MarkedSpace::beginMarking): |
| (JSC::MarkedSpace::endMarking): |
| (JSC::MarkedSpace::snapshotUnswept): |
| (JSC::MarkedSpace::assertNoUnswept): |
| (JSC::MarkedSpace::dumpBits): |
| (JSC::MarkedSpace::addBlockDirectory): |
| (JSC::MarkedSpace::addMarkedAllocator): Deleted. |
| * heap/MarkedSpace.h: |
| (JSC::MarkedSpace::firstDirectory const): |
| (JSC::MarkedSpace::directoryLock): |
| (JSC::MarkedSpace::forEachBlock): |
| (JSC::MarkedSpace::forEachDirectory): |
| (JSC::MarkedSpace::firstAllocator const): Deleted. |
| (JSC::MarkedSpace::allocatorLock): Deleted. |
| (JSC::MarkedSpace::forEachAllocator): Deleted. |
| * heap/MarkedSpaceInlines.h: |
| * heap/Subspace.cpp: |
| (JSC::Subspace::initialize): |
| (JSC::Subspace::prepareForAllocation): |
| (JSC::Subspace::findEmptyBlockToSteal): |
| (JSC::Subspace::parallelDirectorySource): |
| (JSC::Subspace::parallelNotEmptyMarkedBlockSource): |
| (JSC::Subspace::sweep): |
| (JSC::Subspace::parallelAllocatorSource): Deleted. |
| * heap/Subspace.h: |
| (JSC::Subspace::attributes const): |
| (JSC::Subspace::didCreateFirstDirectory): |
| (JSC::Subspace::didCreateFirstAllocator): Deleted. |
| * heap/SubspaceInlines.h: |
| (JSC::Subspace::forEachDirectory): |
| (JSC::Subspace::forEachMarkedBlock): |
| (JSC::Subspace::forEachNotEmptyMarkedBlock): |
| (JSC::Subspace::forEachAllocator): Deleted. |
| * jit/AssemblyHelpers.h: |
| (JSC::AssemblyHelpers::emitAllocateWithNonNullAllocator): |
| (JSC::AssemblyHelpers::emitAllocate): |
| (JSC::AssemblyHelpers::emitAllocateJSCell): |
| (JSC::AssemblyHelpers::emitAllocateJSObject): |
| (JSC::AssemblyHelpers::emitAllocateJSObjectWithKnownSize): |
| * jit/JIT.h: |
| * jit/JITOpcodes.cpp: |
| (JSC::JIT::emit_op_new_object): |
| * jit/JITOpcodes32_64.cpp: |
| (JSC::JIT::emit_op_new_object): |
| * runtime/JSDestructibleObjectHeapCellType.cpp: |
| (JSC::JSDestructibleObjectHeapCellType::JSDestructibleObjectHeapCellType): |
| * runtime/JSSegmentedVariableObjectHeapCellType.cpp: |
| (JSC::JSSegmentedVariableObjectHeapCellType::JSSegmentedVariableObjectHeapCellType): |
| * runtime/JSStringHeapCellType.cpp: |
| (JSC::JSStringHeapCellType::JSStringHeapCellType): |
| * runtime/VM.cpp: |
| (JSC::VM::VM): |
| * wasm/js/JSWebAssemblyCodeBlockHeapCellType.cpp: |
| (JSC::JSWebAssemblyCodeBlockHeapCellType::JSWebAssemblyCodeBlockHeapCellType): |
| |
| 2018-01-11 Saam Barati <sbarati@apple.com> |
| |
| When inserting Unreachable in byte code parser we need to flush all the right things |
| https://bugs.webkit.org/show_bug.cgi?id=181509 |
| <rdar://problem/36423110> |
| |
| Reviewed by Mark Lam. |
| |
| I added code in r226655 that had its own mechanism for preserving liveness when |
| inserting Unreachable nodes after ForceOSRExit. There are two ways to preserve |
| liveness: PhantomLocal and Flush. Certain values *must* be flushed to the stack. |
| I got some of these values wrong, which was leading to a crash when recovering the |
| callee value from an inlined frame. Instead of making the same mistake and repeating |
| similar code again, this patch refactors this logic to be shared with the other |
| liveness preservation code in the DFG bytecode parser. This is what I should have |
| done in my initial patch. |
| |
| * bytecode/InlineCallFrame.h: |
| (JSC::remapOperand): |
| * dfg/DFGByteCodeParser.cpp: |
| (JSC::DFG::flushImpl): |
| (JSC::DFG::flushForTerminalImpl): |
| (JSC::DFG::ByteCodeParser::flush): |
| (JSC::DFG::ByteCodeParser::flushForTerminal): |
| (JSC::DFG::ByteCodeParser::parse): |
| |
| 2018-01-11 Saam Barati <sbarati@apple.com> |
| |
| JITMathIC code in the FTL is wrong when code gets duplicated |
| https://bugs.webkit.org/show_bug.cgi?id=181525 |
| <rdar://problem/36351993> |
| |
| Reviewed by Michael Saboff and Keith Miller. |
| |
| B3/Air may duplicate code for various reasons. Patchpoint generators inside |
| FTLLower must be aware that they can be called multiple times because of this. |
| The patchpoint for math ICs was not aware of this, and shared state amongst |
| all invocations of the patchpoint's generator. This patch fixes this bug so |
| that each invocation of the patchpoint's generator gets a unique math IC. |
| |
| * bytecode/CodeBlock.h: |
| (JSC::CodeBlock::addMathIC): |
| * ftl/FTLLowerDFGToB3.cpp: |
| (JSC::FTL::DFG::LowerDFGToB3::compileValueAdd): |
| (JSC::FTL::DFG::LowerDFGToB3::compileUnaryMathIC): |
| (JSC::FTL::DFG::LowerDFGToB3::compileBinaryMathIC): |
| (JSC::FTL::DFG::LowerDFGToB3::compileArithAddOrSub): |
| (JSC::FTL::DFG::LowerDFGToB3::compileArithMul): |
| (JSC::FTL::DFG::LowerDFGToB3::compileArithNegate): |
| (JSC::FTL::DFG::LowerDFGToB3::compileMathIC): Deleted. |
| * jit/JITMathIC.h: |
| (JSC::isProfileEmpty): |
| |
| 2018-01-11 Michael Saboff <msaboff@apple.com> |
| |
| Ensure there are no unsafe uses of MacroAssemblerARM64::dataTempRegister |
| https://bugs.webkit.org/show_bug.cgi?id=181512 |
| |
| Reviewed by Saam Barati. |
| |
| * assembler/MacroAssemblerARM64.h: |
| (JSC::MacroAssemblerARM64::abortWithReason): |
| (JSC::MacroAssemblerARM64::pushToSaveImmediateWithoutTouchingRegisters): |
| All current uses of dataTempRegister in these functions are safe, but it makes sense to |
| fix them in case they might be used elsewhere. |
| |
| 2018-01-04 Filip Pizlo <fpizlo@apple.com> |
| |
| CodeBlocks should be in IsoSubspaces |
| https://bugs.webkit.org/show_bug.cgi?id=180884 |
| |
| Reviewed by Saam Barati. |
| |
| This moves CodeBlocks into IsoSubspaces. Doing so means that we no longer need to have the |
| special CodeBlockSet HashSets of new and old CodeBlocks. We also no longer use |
| WeakReferenceHarvester or UnconditionalFinalizer. Instead: |
| |
| - Code block sweeping is now just eager sweeping. This means that it automatically takes |
| advantage of our unswept set, which roughly corresponds to what CodeBlockSet used to use |
| its eden set for. |
| |
| - Those idea of Executable "weakly visiting" the CodeBlock is replaced by Executable |
| marking a ExecutableToCodeBlockEdge object. That object being marked corresponds to what |
| we used to call CodeBlock "having been weakly visited". This means that CodeBlockSet no |
| longer has to clear the set of weakly visited code blocks. This also means that |
| determining CodeBlock liveness, propagating CodeBlock transitions, and jettisoning |
| CodeBlocks during GC are now the edge's job. The edge is also in an IsoSubspace and it |
| has IsoCellSets to tell us which edges have output constraints (what we used to call |
| CodeBlock's weak reference harvester) and which have unconditional finalizers. |
| |
| - CodeBlock now uses an IsoCellSet to tell if it has an unconditional finalizer. |
| |
| - CodeBlockSet still exists! It has one unified HashSet of CodeBlocks that we use to |
| handle requests from the sampler, debugger, and other facilities. They may want to ask |
| if some pointer corresponds to a CodeBlock during stages of execution during which the |
| GC is unable to answer isLive() queries. The trickiest is the sampling profiler thread. |
| There is no way that the GC's isLive could tell us of a CodeBlock that had already been |
| allocated has now been full constructed. |
| |
| Rolling this back in because it was rolled out by mistake. There was a flaky crash that was |
| happening before and after this change, but we misread the revision numbers at first and |
| thought that this was the cause. |
| |
| * JavaScriptCore.xcodeproj/project.pbxproj: |
| * Sources.txt: |
| * bytecode/CodeBlock.cpp: |
| (JSC::CodeBlock::CodeBlock): |
| (JSC::CodeBlock::finishCreation): |
| (JSC::CodeBlock::finishCreationCommon): |
| (JSC::CodeBlock::~CodeBlock): |
| (JSC::CodeBlock::visitChildren): |
| (JSC::CodeBlock::propagateTransitions): |
| (JSC::CodeBlock::determineLiveness): |
| (JSC::CodeBlock::finalizeUnconditionally): |
| (JSC::CodeBlock::stronglyVisitStrongReferences): |
| (JSC::CodeBlock::hasInstalledVMTrapBreakpoints const): |
| (JSC::CodeBlock::installVMTrapBreakpoints): |
| (JSC::CodeBlock::dumpMathICStats): |
| (JSC::CodeBlock::visitWeakly): Deleted. |
| (JSC::CodeBlock::WeakReferenceHarvester::visitWeakReferences): Deleted. |
| (JSC::CodeBlock::UnconditionalFinalizer::finalizeUnconditionally): Deleted. |
| * bytecode/CodeBlock.h: |
| (JSC::CodeBlock::subspaceFor): |
| (JSC::CodeBlock::ownerEdge const): |
| (JSC::CodeBlock::clearVisitWeaklyHasBeenCalled): Deleted. |
| * bytecode/EvalCodeBlock.h: |
| (JSC::EvalCodeBlock::create): Deleted. |
| (JSC::EvalCodeBlock::createStructure): Deleted. |
| (JSC::EvalCodeBlock::variable): Deleted. |
| (JSC::EvalCodeBlock::numVariables): Deleted. |
| (JSC::EvalCodeBlock::functionHoistingCandidate): Deleted. |
| (JSC::EvalCodeBlock::numFunctionHoistingCandidates): Deleted. |
| (JSC::EvalCodeBlock::EvalCodeBlock): Deleted. |
| (JSC::EvalCodeBlock::unlinkedEvalCodeBlock const): Deleted. |
| * bytecode/ExecutableToCodeBlockEdge.cpp: Added. |
| (JSC::ExecutableToCodeBlockEdge::createStructure): |
| (JSC::ExecutableToCodeBlockEdge::create): |
| (JSC::ExecutableToCodeBlockEdge::visitChildren): |
| (JSC::ExecutableToCodeBlockEdge::visitOutputConstraints): |
| (JSC::ExecutableToCodeBlockEdge::finalizeUnconditionally): |
| (JSC::ExecutableToCodeBlockEdge::activate): |
| (JSC::ExecutableToCodeBlockEdge::deactivate): |
| (JSC::ExecutableToCodeBlockEdge::deactivateAndUnwrap): |
| (JSC::ExecutableToCodeBlockEdge::wrap): |
| (JSC::ExecutableToCodeBlockEdge::wrapAndActivate): |
| (JSC::ExecutableToCodeBlockEdge::ExecutableToCodeBlockEdge): |
| (JSC::ExecutableToCodeBlockEdge::runConstraint): |
| * bytecode/ExecutableToCodeBlockEdge.h: Added. |
| (JSC::ExecutableToCodeBlockEdge::subspaceFor): |
| (JSC::ExecutableToCodeBlockEdge::codeBlock const): |
| (JSC::ExecutableToCodeBlockEdge::unwrap): |
| * bytecode/FunctionCodeBlock.h: |
| (JSC::FunctionCodeBlock::subspaceFor): |
| (JSC::FunctionCodeBlock::createStructure): |
| * bytecode/ModuleProgramCodeBlock.h: |
| (JSC::ModuleProgramCodeBlock::create): Deleted. |
| (JSC::ModuleProgramCodeBlock::createStructure): Deleted. |
| (JSC::ModuleProgramCodeBlock::ModuleProgramCodeBlock): Deleted. |
| * bytecode/ProgramCodeBlock.h: |
| (JSC::ProgramCodeBlock::create): Deleted. |
| (JSC::ProgramCodeBlock::createStructure): Deleted. |
| (JSC::ProgramCodeBlock::ProgramCodeBlock): Deleted. |
| * debugger/Debugger.cpp: |
| (JSC::Debugger::SetSteppingModeFunctor::operator() const): |
| (JSC::Debugger::ToggleBreakpointFunctor::operator() const): |
| (JSC::Debugger::ClearCodeBlockDebuggerRequestsFunctor::operator() const): |
| (JSC::Debugger::ClearDebuggerRequestsFunctor::operator() const): |
| * heap/CodeBlockSet.cpp: |
| (JSC::CodeBlockSet::contains): |
| (JSC::CodeBlockSet::dump const): |
| (JSC::CodeBlockSet::add): |
| (JSC::CodeBlockSet::remove): |
| (JSC::CodeBlockSet::promoteYoungCodeBlocks): Deleted. |
| (JSC::CodeBlockSet::clearMarksForFullCollection): Deleted. |
| (JSC::CodeBlockSet::lastChanceToFinalize): Deleted. |
| (JSC::CodeBlockSet::deleteUnmarkedAndUnreferenced): Deleted. |
| * heap/CodeBlockSet.h: |
| * heap/CodeBlockSetInlines.h: |
| (JSC::CodeBlockSet::iterate): |
| (JSC::CodeBlockSet::iterateViaSubspaces): |
| * heap/ConservativeRoots.cpp: |
| (JSC::ConservativeRoots::genericAddPointer): |
| (JSC::DummyMarkHook::markKnownJSCell): |
| (JSC::CompositeMarkHook::mark): |
| (JSC::CompositeMarkHook::markKnownJSCell): |
| * heap/ConservativeRoots.h: |
| * heap/Heap.cpp: |
| (JSC::Heap::lastChanceToFinalize): |
| (JSC::Heap::finalizeMarkedUnconditionalFinalizers): |
| (JSC::Heap::finalizeUnconditionalFinalizers): |
| (JSC::Heap::beginMarking): |
| (JSC::Heap::deleteUnmarkedCompiledCode): |
| (JSC::Heap::sweepInFinalize): |
| (JSC::Heap::forEachCodeBlockImpl): |
| (JSC::Heap::forEachCodeBlockIgnoringJITPlansImpl): |
| (JSC::Heap::addCoreConstraints): |
| (JSC::Heap::finalizeUnconditionalFinalizersInIsoSubspace): Deleted. |
| * heap/Heap.h: |
| * heap/HeapCell.h: |
| * heap/HeapCellInlines.h: |
| (JSC::HeapCell::subspace const): |
| * heap/HeapInlines.h: |
| (JSC::Heap::forEachCodeBlock): |
| (JSC::Heap::forEachCodeBlockIgnoringJITPlans): |
| * heap/HeapUtil.h: |
| (JSC::HeapUtil::findGCObjectPointersForMarking): |
| * heap/IsoCellSet.cpp: |
| (JSC::IsoCellSet::parallelNotEmptyMarkedBlockSource): |
| * heap/IsoCellSet.h: |
| * heap/IsoCellSetInlines.h: |
| (JSC::IsoCellSet::forEachMarkedCellInParallel): |
| (JSC::IsoCellSet::forEachLiveCell): |
| * heap/LargeAllocation.h: |
| (JSC::LargeAllocation::subspace const): |
| * heap/MarkStackMergingConstraint.cpp: |
| (JSC::MarkStackMergingConstraint::executeImpl): |
| * heap/MarkStackMergingConstraint.h: |
| * heap/MarkedAllocator.cpp: |
| (JSC::MarkedAllocator::parallelNotEmptyBlockSource): |
| * heap/MarkedBlock.cpp: |
| (JSC::MarkedBlock::Handle::didAddToAllocator): |
| (JSC::MarkedBlock::Handle::didRemoveFromAllocator): |
| * heap/MarkedBlock.h: |
| (JSC::MarkedBlock::subspace const): |
| * heap/MarkedBlockInlines.h: |
| (JSC::MarkedBlock::Handle::forEachLiveCell): |
| * heap/MarkedSpaceInlines.h: |
| (JSC::MarkedSpace::forEachLiveCell): |
| * heap/MarkingConstraint.cpp: |
| (JSC::MarkingConstraint::execute): |
| (JSC::MarkingConstraint::doParallelWork): |
| (JSC::MarkingConstraint::finishParallelWork): Deleted. |
| (JSC::MarkingConstraint::doParallelWorkImpl): Deleted. |
| (JSC::MarkingConstraint::finishParallelWorkImpl): Deleted. |
| * heap/MarkingConstraint.h: |
| * heap/MarkingConstraintSet.cpp: |
| (JSC::MarkingConstraintSet::add): |
| * heap/MarkingConstraintSet.h: |
| (JSC::MarkingConstraintSet::add): |
| * heap/MarkingConstraintSolver.cpp: |
| (JSC::MarkingConstraintSolver::execute): |
| (JSC::MarkingConstraintSolver::addParallelTask): |
| (JSC::MarkingConstraintSolver::runExecutionThread): |
| (JSC::MarkingConstraintSolver::didExecute): Deleted. |
| * heap/MarkingConstraintSolver.h: |
| (JSC::MarkingConstraintSolver::TaskWithConstraint::TaskWithConstraint): |
| (JSC::MarkingConstraintSolver::TaskWithConstraint::operator== const): |
| * heap/SimpleMarkingConstraint.cpp: |
| (JSC::SimpleMarkingConstraint::SimpleMarkingConstraint): |
| (JSC::SimpleMarkingConstraint::executeImpl): |
| * heap/SimpleMarkingConstraint.h: |
| (JSC::SimpleMarkingConstraint::SimpleMarkingConstraint): |
| * heap/SlotVisitor.cpp: |
| (JSC::SlotVisitor::addParallelConstraintTask): |
| * heap/SlotVisitor.h: |
| * heap/Subspace.cpp: |
| (JSC::Subspace::sweep): |
| * heap/Subspace.h: |
| * heap/SubspaceInlines.h: |
| (JSC::Subspace::forEachLiveCell): |
| * llint/LowLevelInterpreter.asm: |
| * runtime/EvalExecutable.cpp: |
| (JSC::EvalExecutable::visitChildren): |
| * runtime/EvalExecutable.h: |
| (JSC::EvalExecutable::codeBlock): |
| * runtime/FunctionExecutable.cpp: |
| (JSC::FunctionExecutable::baselineCodeBlockFor): |
| (JSC::FunctionExecutable::visitChildren): |
| * runtime/FunctionExecutable.h: |
| * runtime/JSType.h: |
| * runtime/ModuleProgramExecutable.cpp: |
| (JSC::ModuleProgramExecutable::visitChildren): |
| * runtime/ModuleProgramExecutable.h: |
| * runtime/ProgramExecutable.cpp: |
| (JSC::ProgramExecutable::visitChildren): |
| * runtime/ProgramExecutable.h: |
| * runtime/ScriptExecutable.cpp: |
| (JSC::ScriptExecutable::installCode): |
| (JSC::ScriptExecutable::newReplacementCodeBlockFor): |
| * runtime/VM.cpp: |
| (JSC::VM::VM): |
| * runtime/VM.h: |
| (JSC::VM::SpaceAndFinalizerSet::SpaceAndFinalizerSet): |
| (JSC::VM::SpaceAndFinalizerSet::finalizerSetFor): |
| (JSC::VM::forEachCodeBlockSpace): |
| * runtime/VMTraps.cpp: |
| (JSC::VMTraps::handleTraps): |
| * tools/VMInspector.cpp: |
| (JSC::VMInspector::codeBlockForMachinePC): |
| (JSC::VMInspector::isValidCodeBlock): |
| |
| 2018-01-11 Michael Saboff <msaboff@apple.com> |
| |
| Add a DOM gadget for Spectre testing |
| https://bugs.webkit.org/show_bug.cgi?id=181351 |
| |
| Reviewed by Ryosuke Niwa. |
| |
| * runtime/Options.h: |
| |
| 2018-01-11 Yusuke Suzuki <utatane.tea@gmail.com> |
| |
| [DFG][FTL] regExpMatchFast should be handled |
| https://bugs.webkit.org/show_bug.cgi?id=180988 |
| |
| Reviewed by Mark Lam. |
| |
| RegExp.prototype.@@match has a fast path, @regExpMatchFast. This patch annotates this function |
| with RegExpMatchFastIntrinsic, and introduces RegExpMatch DFG node. This paves the way to |
| make NewRegexp PhantomNewRegexp if it is not used except for setting/getting its lastIndex property. |
| |
| To improve RegExp.prototype.@@match's performance more, we make this builtin function small by moving |
| slow path part to `@matchSlow()` private function. |
| |
| It improves SixSpeed regex-u.{es5,es6} largely since they stress String.prototype.match, which calls |
| this regExpMatchFast function. |
| |
| baseline patched |
| |
| regex-u.es5 55.3835+-6.3002 ^ 36.2431+-2.0797 ^ definitely 1.5281x faster |
| regex-u.es6 110.4624+-6.2896 ^ 94.1012+-7.2433 ^ definitely 1.1739x faster |
| |
| * builtins/RegExpPrototype.js: |
| (globalPrivate.matchSlow): |
| (overriddenName.string_appeared_here.match): |
| * dfg/DFGAbstractInterpreterInlines.h: |
| (JSC::DFG::AbstractInterpreter<AbstractStateType>::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): |
| * dfg/DFGNodeType.h: |
| * dfg/DFGOperations.cpp: |
| * dfg/DFGOperations.h: |
| * dfg/DFGPredictionPropagationPhase.cpp: |
| * dfg/DFGSafeToExecute.h: |
| (JSC::DFG::safeToExecute): |
| * dfg/DFGSpeculativeJIT.cpp: |
| (JSC::DFG::SpeculativeJIT::compileRegExpMatch): |
| * 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::compileRegExpMatch): |
| * runtime/Intrinsic.cpp: |
| (JSC::intrinsicName): |
| * runtime/Intrinsic.h: |
| * runtime/JSGlobalObject.cpp: |
| (JSC::JSGlobalObject::init): |
| * runtime/RegExpPrototype.cpp: |
| (JSC::regExpProtoFuncMatchFast): |
| |
| 2018-01-11 Saam Barati <sbarati@apple.com> |
| |
| Our for-in caching is wrong when we add indexed properties on things in the prototype chain |
| https://bugs.webkit.org/show_bug.cgi?id=181508 |
| |
| Reviewed by Yusuke Suzuki. |
| |
| Our for-in caching would cache structure chains that had prototypes with |
| indexed properties. Clearly this is wrong. This caching breaks when a prototype |
| adds new indexed properties. We would continue to enumerate the old cached |
| state of properties, and not include the new indexed properties. |
| |
| The old code used to prevent caching only if the base structure had |
| indexed properties. This patch extends it to prevent caching if the |
| base, or any structure in the prototype chain, has indexed properties. |
| |
| * runtime/Structure.cpp: |
| (JSC::Structure::canCachePropertyNameEnumerator const): |
| |
| 2018-01-10 JF Bastien <jfbastien@apple.com> |
| |
| Poison small JSObject derivatives which only contain pointers |
| https://bugs.webkit.org/show_bug.cgi?id=181483 |
| <rdar://problem/36407127> |
| |
| Reviewed by Mark Lam. |
| |
| I wrote a script that finds interesting things to poison or |
| generally harden. These stood out because they derive from |
| JSObject and only contain a few pointer or pointer-like fields, |
| and could therefore just be poisoned. This also requires some |
| template "improvements" to our poisoning machinery. Worth noting |
| is that I'm making PoisonedUniquePtr move-assignable and |
| move-constructible from unique_ptr, which makes it a better |
| drop-in replacement because we don't need to use |
| makePoisonedUniquePtr. This means function-locals can be |
| unique_ptr and get the nice RAII pattern, and once the function is |
| done you can just move to the class' PoisonedUniquePtr without |
| worrying. |
| |
| * API/JSAPIWrapperObject.h: |
| (JSC::JSAPIWrapperObject::wrappedObject): |
| * API/JSAPIWrapperObject.mm: |
| (JSC::JSAPIWrapperObject::JSAPIWrapperObject): |
| * API/JSCallbackObject.h: |
| * runtime/ArrayPrototype.h: |
| * runtime/DateInstance.h: |
| * runtime/JSArrayBuffer.cpp: |
| (JSC::JSArrayBuffer::finishCreation): |
| (JSC::JSArrayBuffer::isShared const): |
| (JSC::JSArrayBuffer::sharingMode const): |
| * runtime/JSArrayBuffer.h: |
| * runtime/JSCPoison.h: |
| |
| 2018-01-10 Commit Queue <commit-queue@webkit.org> |
| |
| Unreviewed, rolling out r226667 and r226673. |
| https://bugs.webkit.org/show_bug.cgi?id=181488 |
| |
| This caused a flaky crash. (Requested by mlewis13 on #webkit). |
| |
| Reverted changesets: |
| |
| "CodeBlocks should be in IsoSubspaces" |
| https://bugs.webkit.org/show_bug.cgi?id=180884 |
| https://trac.webkit.org/changeset/226667 |
| |
| "REGRESSION (r226667): CodeBlocks should be in IsoSubspaces" |
| https://bugs.webkit.org/show_bug.cgi?id=180884 |
| https://trac.webkit.org/changeset/226673 |
| |
| 2018-01-09 David Kilzer <ddkilzer@apple.com> |
| |
| REGRESSION (r226667): CodeBlocks should be in IsoSubspaces |
| <https://bugs.webkit.org/show_bug.cgi?id=180884> |
| |
| Fixes the following build error: |
| |
| heap/Heap.cpp:2708:10: error: lambda capture 'this' is not used [-Werror,-Wunused-lambda-capture] |
| |
| * heap/Heap.cpp: |
| (JSC::Heap::addCoreConstraints): Remove 'this' from lambda to |
| fix the build. |
| |
| 2018-01-09 Keith Miller <keith_miller@apple.com> |
| |
| and32 with an Address source on ARM64 did not invalidate dataTempRegister |
| https://bugs.webkit.org/show_bug.cgi?id=181467 |
| |
| Reviewed by Michael Saboff. |
| |
| * assembler/MacroAssemblerARM64.h: |
| (JSC::MacroAssemblerARM64::and32): |
| |
| 2018-01-04 Filip Pizlo <fpizlo@apple.com> |
| |
| CodeBlocks should be in IsoSubspaces |
| https://bugs.webkit.org/show_bug.cgi?id=180884 |
| |
| Reviewed by Saam Barati. |
| |
| This moves CodeBlocks into IsoSubspaces. Doing so means that we no longer need to have the |
| special CodeBlockSet HashSets of new and old CodeBlocks. We also no longer use |
| WeakReferenceHarvester or UnconditionalFinalizer. Instead: |
| |
| - Code block sweeping is now just eager sweeping. This means that it automatically takes |
| advantage of our unswept set, which roughly corresponds to what CodeBlockSet used to use |
| its eden set for. |
| |
| - Those idea of Executable "weakly visiting" the CodeBlock is replaced by Executable |
| marking a ExecutableToCodeBlockEdge object. That object being marked corresponds to what |
| we used to call CodeBlock "having been weakly visited". This means that CodeBlockSet no |
| longer has to clear the set of weakly visited code blocks. This also means that |
| determining CodeBlock liveness, propagating CodeBlock transitions, and jettisoning |
| CodeBlocks during GC are now the edge's job. The edge is also in an IsoSubspace and it |
| has IsoCellSets to tell us which edges have output constraints (what we used to call |
| CodeBlock's weak reference harvester) and which have unconditional finalizers. |
| |
| - CodeBlock now uses an IsoCellSet to tell if it has an unconditional finalizer. |
| |
| - CodeBlockSet still exists! It has one unified HashSet of CodeBlocks that we use to |
| handle requests from the sampler, debugger, and other facilities. They may want to ask |
| if some pointer corresponds to a CodeBlock during stages of execution during which the |
| GC is unable to answer isLive() queries. The trickiest is the sampling profiler thread. |
| There is no way that the GC's isLive could tell us of a CodeBlock that had already been |
| allocated has now been full constructed. |
| |
| * JavaScriptCore.xcodeproj/project.pbxproj: |
| * Sources.txt: |
| * bytecode/CodeBlock.cpp: |
| (JSC::CodeBlock::CodeBlock): |
| (JSC::CodeBlock::finishCreation): |
| (JSC::CodeBlock::finishCreationCommon): |
| (JSC::CodeBlock::~CodeBlock): |
| (JSC::CodeBlock::visitChildren): |
| (JSC::CodeBlock::propagateTransitions): |
| (JSC::CodeBlock::determineLiveness): |
| (JSC::CodeBlock::finalizeUnconditionally): |
| (JSC::CodeBlock::stronglyVisitStrongReferences): |
| (JSC::CodeBlock::hasInstalledVMTrapBreakpoints const): |
| (JSC::CodeBlock::installVMTrapBreakpoints): |
| (JSC::CodeBlock::dumpMathICStats): |
| (JSC::CodeBlock::visitWeakly): Deleted. |
| (JSC::CodeBlock::WeakReferenceHarvester::visitWeakReferences): Deleted. |
| (JSC::CodeBlock::UnconditionalFinalizer::finalizeUnconditionally): Deleted. |
| * bytecode/CodeBlock.h: |
| (JSC::CodeBlock::subspaceFor): |
| (JSC::CodeBlock::ownerEdge const): |
| (JSC::CodeBlock::clearVisitWeaklyHasBeenCalled): Deleted. |
| * bytecode/EvalCodeBlock.h: |
| (JSC::EvalCodeBlock::create): Deleted. |
| (JSC::EvalCodeBlock::createStructure): Deleted. |
| (JSC::EvalCodeBlock::variable): Deleted. |
| (JSC::EvalCodeBlock::numVariables): Deleted. |
| (JSC::EvalCodeBlock::functionHoistingCandidate): Deleted. |
| (JSC::EvalCodeBlock::numFunctionHoistingCandidates): Deleted. |
| (JSC::EvalCodeBlock::EvalCodeBlock): Deleted. |
| (JSC::EvalCodeBlock::unlinkedEvalCodeBlock const): Deleted. |
| * bytecode/ExecutableToCodeBlockEdge.cpp: Added. |
| (JSC::ExecutableToCodeBlockEdge::createStructure): |
| (JSC::ExecutableToCodeBlockEdge::create): |
| (JSC::ExecutableToCodeBlockEdge::visitChildren): |
| (JSC::ExecutableToCodeBlockEdge::visitOutputConstraints): |
| (JSC::ExecutableToCodeBlockEdge::finalizeUnconditionally): |
| (JSC::ExecutableToCodeBlockEdge::activate): |
| (JSC::ExecutableToCodeBlockEdge::deactivate): |
| (JSC::ExecutableToCodeBlockEdge::deactivateAndUnwrap): |
| (JSC::ExecutableToCodeBlockEdge::wrap): |
| (JSC::ExecutableToCodeBlockEdge::wrapAndActivate): |
| (JSC::ExecutableToCodeBlockEdge::ExecutableToCodeBlockEdge): |
| (JSC::ExecutableToCodeBlockEdge::runConstraint): |
| * bytecode/ExecutableToCodeBlockEdge.h: Added. |
| (JSC::ExecutableToCodeBlockEdge::subspaceFor): |
| (JSC::ExecutableToCodeBlockEdge::codeBlock const): |
| (JSC::ExecutableToCodeBlockEdge::unwrap): |
| * bytecode/FunctionCodeBlock.h: |
| (JSC::FunctionCodeBlock::subspaceFor): |
| (JSC::FunctionCodeBlock::createStructure): |
| * bytecode/ModuleProgramCodeBlock.h: |
| (JSC::ModuleProgramCodeBlock::create): Deleted. |
| (JSC::ModuleProgramCodeBlock::createStructure): Deleted. |
| (JSC::ModuleProgramCodeBlock::ModuleProgramCodeBlock): Deleted. |
| * bytecode/ProgramCodeBlock.h: |
| (JSC::ProgramCodeBlock::create): Deleted. |
| (JSC::ProgramCodeBlock::createStructure): Deleted. |
| (JSC::ProgramCodeBlock::ProgramCodeBlock): Deleted. |
| * debugger/Debugger.cpp: |
| (JSC::Debugger::SetSteppingModeFunctor::operator() const): |
| (JSC::Debugger::ToggleBreakpointFunctor::operator() const): |
| (JSC::Debugger::ClearCodeBlockDebuggerRequestsFunctor::operator() const): |
| (JSC::Debugger::ClearDebuggerRequestsFunctor::operator() const): |
| * heap/CodeBlockSet.cpp: |
| (JSC::CodeBlockSet::contains): |
| (JSC::CodeBlockSet::dump const): |
| (JSC::CodeBlockSet::add): |
| (JSC::CodeBlockSet::remove): |
| (JSC::CodeBlockSet::promoteYoungCodeBlocks): Deleted. |
| (JSC::CodeBlockSet::clearMarksForFullCollection): Deleted. |
| (JSC::CodeBlockSet::lastChanceToFinalize): Deleted. |
| (JSC::CodeBlockSet::deleteUnmarkedAndUnreferenced): Deleted. |
| * heap/CodeBlockSet.h: |
| * heap/CodeBlockSetInlines.h: |
| (JSC::CodeBlockSet::iterate): |
| (JSC::CodeBlockSet::iterateViaSubspaces): |
| * heap/ConservativeRoots.cpp: |
| (JSC::ConservativeRoots::genericAddPointer): |
| (JSC::DummyMarkHook::markKnownJSCell): |
| (JSC::CompositeMarkHook::mark): |
| (JSC::CompositeMarkHook::markKnownJSCell): |
| * heap/ConservativeRoots.h: |
| * heap/Heap.cpp: |
| (JSC::Heap::lastChanceToFinalize): |
| (JSC::Heap::finalizeMarkedUnconditionalFinalizers): |
| (JSC::Heap::finalizeUnconditionalFinalizers): |
| (JSC::Heap::beginMarking): |
| (JSC::Heap::deleteUnmarkedCompiledCode): |
| (JSC::Heap::sweepInFinalize): |
| (JSC::Heap::forEachCodeBlockImpl): |
| (JSC::Heap::forEachCodeBlockIgnoringJITPlansImpl): |
| (JSC::Heap::addCoreConstraints): |
| (JSC::Heap::finalizeUnconditionalFinalizersInIsoSubspace): Deleted. |
| * heap/Heap.h: |
| * heap/HeapCell.h: |
| * heap/HeapCellInlines.h: |
| (JSC::HeapCell::subspace const): |
| * heap/HeapInlines.h: |
| (JSC::Heap::forEachCodeBlock): |
| (JSC::Heap::forEachCodeBlockIgnoringJITPlans): |
| * heap/HeapUtil.h: |
| (JSC::HeapUtil::findGCObjectPointersForMarking): |
| * heap/IsoCellSet.cpp: |
| (JSC::IsoCellSet::parallelNotEmptyMarkedBlockSource): |
| * heap/IsoCellSet.h: |
| * heap/IsoCellSetInlines.h: |
| (JSC::IsoCellSet::forEachMarkedCellInParallel): |
| (JSC::IsoCellSet::forEachLiveCell): |
| * heap/LargeAllocation.h: |
| (JSC::LargeAllocation::subspace const): |
| * heap/MarkStackMergingConstraint.cpp: |
| (JSC::MarkStackMergingConstraint::executeImpl): |
| * heap/MarkStackMergingConstraint.h: |
| * heap/MarkedAllocator.cpp: |
| (JSC::MarkedAllocator::parallelNotEmptyBlockSource): |
| * heap/MarkedBlock.cpp: |
| (JSC::MarkedBlock::Handle::didAddToAllocator): |
| (JSC::MarkedBlock::Handle::didRemoveFromAllocator): |
| * heap/MarkedBlock.h: |
| (JSC::MarkedBlock::subspace const): |
| * heap/MarkedBlockInlines.h: |
| (JSC::MarkedBlock::Handle::forEachLiveCell): |
| * heap/MarkedSpaceInlines.h: |
| (JSC::MarkedSpace::forEachLiveCell): |
| * heap/MarkingConstraint.cpp: |
| (JSC::MarkingConstraint::execute): |
| (JSC::MarkingConstraint::doParallelWork): |
| (JSC::MarkingConstraint::finishParallelWork): Deleted. |
| (JSC::MarkingConstraint::doParallelWorkImpl): Deleted. |
| (JSC::MarkingConstraint::finishParallelWorkImpl): Deleted. |
| * heap/MarkingConstraint.h: |
| * heap/MarkingConstraintSet.cpp: |
| (JSC::MarkingConstraintSet::add): |
| * heap/MarkingConstraintSet.h: |
| (JSC::MarkingConstraintSet::add): |
| * heap/MarkingConstraintSolver.cpp: |
| (JSC::MarkingConstraintSolver::execute): |
| (JSC::MarkingConstraintSolver::addParallelTask): |
| (JSC::MarkingConstraintSolver::runExecutionThread): |
| (JSC::MarkingConstraintSolver::didExecute): Deleted. |
| * heap/MarkingConstraintSolver.h: |
| (JSC::MarkingConstraintSolver::TaskWithConstraint::TaskWithConstraint): |
| (JSC::MarkingConstraintSolver::TaskWithConstraint::operator== const): |
| * heap/SimpleMarkingConstraint.cpp: |
| (JSC::SimpleMarkingConstraint::SimpleMarkingConstraint): |
| (JSC::SimpleMarkingConstraint::executeImpl): |
| * heap/SimpleMarkingConstraint.h: |
| (JSC::SimpleMarkingConstraint::SimpleMarkingConstraint): |
| * heap/SlotVisitor.cpp: |
| (JSC::SlotVisitor::addParallelConstraintTask): |
| * heap/SlotVisitor.h: |
| * heap/Subspace.cpp: |
| (JSC::Subspace::sweep): |
| * heap/Subspace.h: |
| * heap/SubspaceInlines.h: |
| (JSC::Subspace::forEachLiveCell): |
| * llint/LowLevelInterpreter.asm: |
| * runtime/EvalExecutable.cpp: |
| (JSC::EvalExecutable::visitChildren): |
| * runtime/EvalExecutable.h: |
| (JSC::EvalExecutable::codeBlock): |
| * runtime/FunctionExecutable.cpp: |
| (JSC::FunctionExecutable::baselineCodeBlockFor): |
| (JSC::FunctionExecutable::visitChildren): |
| * runtime/FunctionExecutable.h: |
| * runtime/JSType.h: |
| * runtime/ModuleProgramExecutable.cpp: |
| (JSC::ModuleProgramExecutable::visitChildren): |
| * runtime/ModuleProgramExecutable.h: |
| * runtime/ProgramExecutable.cpp: |
| (JSC::ProgramExecutable::visitChildren): |
| * runtime/ProgramExecutable.h: |
| * runtime/ScriptExecutable.cpp: |
| (JSC::ScriptExecutable::installCode): |
| (JSC::ScriptExecutable::newReplacementCodeBlockFor): |
| * runtime/VM.cpp: |
| (JSC::VM::VM): |
| * runtime/VM.h: |
| (JSC::VM::SpaceAndFinalizerSet::SpaceAndFinalizerSet): |
| (JSC::VM::SpaceAndFinalizerSet::finalizerSetFor): |
| (JSC::VM::forEachCodeBlockSpace): |
| * runtime/VMTraps.cpp: |
| (JSC::VMTraps::handleTraps): |
| * tools/VMInspector.cpp: |
| (JSC::VMInspector::codeBlockForMachinePC): |
| (JSC::VMInspector::isValidCodeBlock): |
| |
| 2018-01-09 Michael Saboff <msaboff@apple.com> |
| |
| Unreviewed, rolling out r226600 and r226603 |
| https://bugs.webkit.org/show_bug.cgi?id=181351 |
| |
| Add a DOM gadget for Spectre testing |
| |
| * runtime/Options.h: |
| |
| 2018-01-09 Saam Barati <sbarati@apple.com> |
| |
| Reduce graph size by replacing terminal nodes in blocks that have a ForceOSRExit with Unreachable |
| https://bugs.webkit.org/show_bug.cgi?id=181409 |
| |
| Reviewed by Keith Miller. |
| |
| When I was looking at profiler data for Speedometer, I noticed that one of |
| the hottest functions in Speedometer is around 1100 bytecode operations long. |
| Only about 100 of those bytecode ops ever execute. However, we ended up |
| spending a lot of time compiling basic blocks that never executed. We often |
| plant ForceOSRExit nodes when we parse bytecodes that have a null value profile. |
| This is the case when such a node never executes. |
| |
| This patch makes it so that anytime a block has a ForceOSRExit, we replace its |
| terminal node with an Unreachable node (and remove all nodes after the |
| ForceOSRExit). This will cut down on graph size when such a block dominates |
| other blocks in the CFG. This allows us to get rid of huge chunks of the CFG |
| in certain programs. When doing this transformation, we also insert |
| Flushes/PhantomLocals to ensure we can recover values that are bytecode |
| live-in to the ForceOSRExit. |
| |
| Using ForceOSRExit as the signal for this is a bit of a hack. It definitely |
| does not get rid of all the CFG that it could. If we decide it's worth |
| it, we could use additional inputs into this mechanism. For example, we could |
| profile if a basic block ever executes inside the LLInt/Baseline, and |
| remove parts of the CFG based on that. |
| |
| When running Speedometer with the concurrent JIT turned off, this patch |
| improves DFG/FTL compile times by around 5%. |
| |
| * dfg/DFGByteCodeParser.cpp: |
| (JSC::DFG::ByteCodeParser::addToGraph): |
| (JSC::DFG::ByteCodeParser::parse): |
| |
| 2018-01-09 Mark Lam <mark.lam@apple.com> |
| |
| ASSERTION FAILED: pair.second->m_type & PropertyNode::Getter |
| https://bugs.webkit.org/show_bug.cgi?id=181388 |
| <rdar://problem/36349351> |
| |
| Reviewed by Saam Barati. |
| |
| When there are duplicate setters or getters, we may end up overwriting a getter |
| with a setter, or vice versa. This patch adds tracking for getters/setters that |
| have been overwritten with duplicates and ignore them. |
| |
| * bytecompiler/NodesCodegen.cpp: |
| (JSC::PropertyListNode::emitBytecode): |
| * parser/NodeConstructors.h: |
| (JSC::PropertyNode::PropertyNode): |
| * parser/Nodes.h: |
| (JSC::PropertyNode::isOverriddenByDuplicate const): |
| (JSC::PropertyNode::setIsOverriddenByDuplicate): |
| |
| 2018-01-08 Zan Dobersek <zdobersek@igalia.com> |
| |
| REGRESSION(r225913): about 30 JSC test failures on ARMv7 |
| https://bugs.webkit.org/show_bug.cgi?id=181162 |
| <rdar://problem/36261349> |
| |
| Unreviewed follow-up to r226298. Enable the fast case in |
| DFG::SpeculativeJIT::compileArraySlice() for any 64-bit platform, |
| assuming in good faith that enough GP registers are available on any |
| such configuration. The accompanying comment is adjusted to describe |
| this assumption. |
| |
| * dfg/DFGSpeculativeJIT.cpp: |
| (JSC::DFG::SpeculativeJIT::compileArraySlice): |
| |
| 2018-01-08 JF Bastien <jfbastien@apple.com> |
| |
| WebAssembly: mask indexed accesses to Table |
| https://bugs.webkit.org/show_bug.cgi?id=181412 |
| <rdar://problem/36363236> |
| |
| Reviewed by Saam Barati. |
| |
| WebAssembly Table indexed accesses are user-controlled and |
| bounds-checked. Force allocations of Table data to be a |
| power-of-two, and explicitly mask accesses after bounds-check |
| branches. |
| |
| Rename misleading usage of "size" when "length" of a Table was |
| intended. |
| |
| Rename the Spectre option from "disable" to "enable". |
| |
| * dfg/DFGSpeculativeJIT.cpp: |
| (JSC::DFG::SpeculativeJIT::SpeculativeJIT): |
| * ftl/FTLLowerDFGToB3.cpp: |
| (JSC::FTL::DFG::LowerDFGToB3::LowerDFGToB3): |
| * jit/JIT.cpp: |
| (JSC::JIT::JIT): |
| * runtime/Options.h: |
| * wasm/WasmB3IRGenerator.cpp: |
| (JSC::Wasm::B3IRGenerator::emitCheckAndPreparePointer): |
| (JSC::Wasm::B3IRGenerator::addCallIndirect): |
| * wasm/WasmTable.cpp: |
| (JSC::Wasm::Table::allocatedLength): |
| (JSC::Wasm::Table::setLength): |
| (JSC::Wasm::Table::create): |
| (JSC::Wasm::Table::Table): |
| (JSC::Wasm::Table::grow): |
| (JSC::Wasm::Table::clearFunction): |
| (JSC::Wasm::Table::setFunction): |
| * wasm/WasmTable.h: |
| (JSC::Wasm::Table::length const): |
| (JSC::Wasm::Table::offsetOfLength): |
| (JSC::Wasm::Table::offsetOfMask): |
| (JSC::Wasm::Table::mask const): |
| (JSC::Wasm::Table::isValidLength): |
| * wasm/js/JSWebAssemblyInstance.cpp: |
| (JSC::JSWebAssemblyInstance::create): |
| * wasm/js/JSWebAssemblyTable.cpp: |
| (JSC::JSWebAssemblyTable::JSWebAssemblyTable): |
| (JSC::JSWebAssemblyTable::visitChildren): |
| (JSC::JSWebAssemblyTable::grow): |
| (JSC::JSWebAssemblyTable::getFunction): |
| (JSC::JSWebAssemblyTable::clearFunction): |
| (JSC::JSWebAssemblyTable::setFunction): |
| * wasm/js/JSWebAssemblyTable.h: |
| (JSC::JSWebAssemblyTable::isValidLength): |
| (JSC::JSWebAssemblyTable::length const): |
| (JSC::JSWebAssemblyTable::allocatedLength const): |
| * wasm/js/WebAssemblyModuleRecord.cpp: |
| (JSC::WebAssemblyModuleRecord::evaluate): |
| * wasm/js/WebAssemblyTablePrototype.cpp: |
| (JSC::webAssemblyTableProtoFuncLength): |
| (JSC::webAssemblyTableProtoFuncGrow): |
| (JSC::webAssemblyTableProtoFuncGet): |
| (JSC::webAssemblyTableProtoFuncSet): |
| |
| 2018-01-08 Michael Saboff <msaboff@apple.com> |
| |
| Add a DOM gadget for Spectre testing |
| https://bugs.webkit.org/show_bug.cgi?id=181351 |
| |
| Reviewed by Michael Saboff. |
| |
| Added a new JSC::Option named enableSpectreGadgets to enable any gadgets added to test |
| Spectre mitigations. |
| |
| * runtime/Options.h: |
| |
| 2018-01-08 Mark Lam <mark.lam@apple.com> |
| |
| Rename CodeBlock::m_vm to CodeBlock::m_poisonedVM. |
| https://bugs.webkit.org/show_bug.cgi?id=181403 |
| <rdar://problem/36359789> |
| |
| Rubber-stamped by JF Bastien. |
| |
| * bytecode/CodeBlock.cpp: |
| (JSC::CodeBlock::CodeBlock): |
| (JSC::CodeBlock::~CodeBlock): |
| (JSC::CodeBlock::setConstantRegisters): |
| (JSC::CodeBlock::propagateTransitions): |
| (JSC::CodeBlock::finalizeLLIntInlineCaches): |
| (JSC::CodeBlock::jettison): |
| (JSC::CodeBlock::predictedMachineCodeSize): |
| * bytecode/CodeBlock.h: |
| (JSC::CodeBlock::vm const): |
| (JSC::CodeBlock::addConstant): |
| (JSC::CodeBlock::heap const): |
| (JSC::CodeBlock::replaceConstant): |
| * llint/LowLevelInterpreter.asm: |
| * llint/LowLevelInterpreter32_64.asm: |
| * llint/LowLevelInterpreter64.asm: |
| |
| 2018-01-07 Mark Lam <mark.lam@apple.com> |
| |
| Apply poisoning to more pointers in JSC. |
| https://bugs.webkit.org/show_bug.cgi?id=181096 |
| <rdar://problem/36182970> |
| |
| Reviewed by JF Bastien. |
| |
| * assembler/MacroAssembler.h: |
| (JSC::MacroAssembler::xorPtr): |
| * assembler/MacroAssemblerARM64.h: |
| (JSC::MacroAssemblerARM64::xor64): |
| * assembler/MacroAssemblerX86_64.h: |
| (JSC::MacroAssemblerX86_64::xor64): |
| - Add xorPtr implementation. |
| |
| * bytecode/CodeBlock.cpp: |
| (JSC::CodeBlock::inferredName const): |
| (JSC::CodeBlock::CodeBlock): |
| (JSC::CodeBlock::finishCreation): |
| (JSC::CodeBlock::~CodeBlock): |
| (JSC::CodeBlock::setConstantRegisters): |
| (JSC::CodeBlock::visitWeakly): |
| (JSC::CodeBlock::visitChildren): |
| (JSC::CodeBlock::propagateTransitions): |
| (JSC::CodeBlock::WeakReferenceHarvester::visitWeakReferences): |
| (JSC::CodeBlock::finalizeLLIntInlineCaches): |
| (JSC::CodeBlock::finalizeBaselineJITInlineCaches): |
| (JSC::CodeBlock::UnconditionalFinalizer::finalizeUnconditionally): |
| (JSC::CodeBlock::jettison): |
| (JSC::CodeBlock::predictedMachineCodeSize): |
| (JSC::CodeBlock::findPC): |
| * bytecode/CodeBlock.h: |
| (JSC::CodeBlock::UnconditionalFinalizer::UnconditionalFinalizer): |
| (JSC::CodeBlock::WeakReferenceHarvester::WeakReferenceHarvester): |
| (JSC::CodeBlock::stubInfoBegin): |
| (JSC::CodeBlock::stubInfoEnd): |
| (JSC::CodeBlock::callLinkInfosBegin): |
| (JSC::CodeBlock::callLinkInfosEnd): |
| (JSC::CodeBlock::instructions): |
| (JSC::CodeBlock::instructions const): |
| (JSC::CodeBlock::vm const): |
| * dfg/DFGOSRExitCompilerCommon.h: |
| (JSC::DFG::adjustFrameAndStackInOSRExitCompilerThunk): |
| * jit/JIT.h: |
| * llint/LLIntOfflineAsmConfig.h: |
| * llint/LowLevelInterpreter.asm: |
| * llint/LowLevelInterpreter64.asm: |
| * parser/UnlinkedSourceCode.h: |
| * runtime/JSCPoison.h: |
| * runtime/JSGlobalObject.cpp: |
| (JSC::JSGlobalObject::init): |
| * runtime/JSGlobalObject.h: |
| * runtime/JSScriptFetchParameters.h: |
| * runtime/JSScriptFetcher.h: |
| * runtime/StructureTransitionTable.h: |
| * wasm/js/JSWebAssemblyCodeBlock.cpp: |
| (JSC::JSWebAssemblyCodeBlock::JSWebAssemblyCodeBlock): |
| (JSC::JSWebAssemblyCodeBlock::visitChildren): |
| (JSC::JSWebAssemblyCodeBlock::UnconditionalFinalizer::finalizeUnconditionally): |
| * wasm/js/JSWebAssemblyCodeBlock.h: |
| |
| 2018-01-06 Yusuke Suzuki <utatane.tea@gmail.com> |
| |
| Object.getOwnPropertyNames includes "arguments" and "caller" for bound functions |
| https://bugs.webkit.org/show_bug.cgi?id=181321 |
| |
| Reviewed by Saam Barati. |
| |
| According to ECMA262 16.2[1], functions created using the bind method must not have |
| "caller" and "arguments" own properties. |
| |
| [1]: https://tc39.github.io/ecma262/#sec-forbidden-extensions |
| |
| * runtime/JSBoundFunction.cpp: |
| (JSC::JSBoundFunction::finishCreation): |
| |
| 2018-01-05 JF Bastien <jfbastien@apple.com> |
| |
| WebAssembly: poison JS object's secrets |
| https://bugs.webkit.org/show_bug.cgi?id=181339 |
| <rdar://problem/36325001> |
| |
| Reviewed by Mark Lam. |
| |
| Separating WebAssembly's JS objects from their non-JS |
| implementation means that all interesting information lives |
| outside of the JS object itself. This patch poisons each JS |
| object's pointer to non-JS implementation using the poisoning |
| mechanism and a unique key per JS object type origin. |
| |
| * runtime/JSCPoison.h: |
| * wasm/js/JSToWasm.cpp: |
| (JSC::Wasm::createJSToWasmWrapper): JS -> wasm stores the JS |
| object in a stack slot when fast TLS is disabled. This requires |
| that we unpoison the Wasm::Instance. |
| * wasm/js/JSWebAssemblyCodeBlock.h: |
| * wasm/js/JSWebAssemblyInstance.h: |
| (JSC::JSWebAssemblyInstance::offsetOfPoisonedInstance): renamed to |
| be explicit that the pointer is poisoned. |
| * wasm/js/JSWebAssemblyMemory.h: |
| * wasm/js/JSWebAssemblyModule.h: |
| * wasm/js/JSWebAssemblyTable.h: |
| |
| 2018-01-05 Michael Saboff <msaboff@apple.com> |
| |
| Add ability to disable indexed property masking for testing |
| https://bugs.webkit.org/show_bug.cgi?id=181350 |
| |
| Reviewed by Keith Miller. |
| |
| Made the masking of indexed properties runtime controllable via a new JSC::Option |
| named disableSpectreMitigations. This is done to test the efficacy of that mitigation. |
| |
| The new option has a generic name as it will probably be used to disable future mitigations. |
| |
| * dfg/DFGSpeculativeJIT.cpp: |
| (JSC::DFG::SpeculativeJIT::SpeculativeJIT): |
| (JSC::DFG::SpeculativeJIT::loadFromIntTypedArray): |
| (JSC::DFG::SpeculativeJIT::compileGetByValOnFloatTypedArray): |
| * dfg/DFGSpeculativeJIT.h: |
| * dfg/DFGSpeculativeJIT64.cpp: |
| (JSC::DFG::SpeculativeJIT::compile): |
| * ftl/FTLLowerDFGToB3.cpp: |
| (JSC::FTL::DFG::LowerDFGToB3::LowerDFGToB3): |
| (JSC::FTL::DFG::LowerDFGToB3::maskedIndex): |
| (JSC::FTL::DFG::LowerDFGToB3::pointerIntoTypedArray): |
| * jit/JIT.cpp: |
| (JSC::JIT::JIT): |
| * jit/JIT.h: |
| * jit/JITPropertyAccess.cpp: |
| (JSC::JIT::emitDoubleLoad): |
| (JSC::JIT::emitContiguousLoad): |
| (JSC::JIT::emitArrayStorageLoad): |
| * runtime/Options.h: |
| * wasm/WasmB3IRGenerator.cpp: |
| (JSC::Wasm::B3IRGenerator::emitCheckAndPreparePointer): |
| |
| 2018-01-05 Michael Saboff <msaboff@apple.com> |
| |
| Allow JSC Config Files to set Restricted Options |
| https://bugs.webkit.org/show_bug.cgi?id=181352 |
| |
| Reviewed by Mark Lam. |
| |
| * runtime/ConfigFile.cpp: |
| (JSC::ConfigFile::parse): |
| |
| 2018-01-04 Keith Miller <keith_miller@apple.com> |
| |
| TypedArrays and Wasm should use index masking. |
| https://bugs.webkit.org/show_bug.cgi?id=181313 |
| |
| Reviewed by Michael Saboff. |
| |
| We should have index masking for our TypedArray code in the |
| DFG/FTL and for Wasm when doing bounds checking. Index masking for |
| Wasm is added to the WasmBoundsCheckValue. Since we don't CSE any |
| WasmBoundsCheckValues we don't need to worry about combining a |
| bounds check for a load and a store. I went with fusing the |
| pointer masking in the WasmBoundsCheckValue since it should reduce |
| additional compiler overhead. |
| |
| * b3/B3LowerToAir.cpp: |
| * b3/B3Validate.cpp: |
| * b3/B3WasmBoundsCheckValue.cpp: |
| (JSC::B3::WasmBoundsCheckValue::WasmBoundsCheckValue): |
| (JSC::B3::WasmBoundsCheckValue::dumpMeta const): |
| * b3/B3WasmBoundsCheckValue.h: |
| (JSC::B3::WasmBoundsCheckValue::pinnedIndexingMask const): |
| * b3/air/AirCustom.h: |
| (JSC::B3::Air::WasmBoundsCheckCustom::generate): |
| * b3/testb3.cpp: |
| (JSC::B3::testWasmBoundsCheck): |
| * dfg/DFGSpeculativeJIT.cpp: |
| (JSC::DFG::SpeculativeJIT::emitAllocateRawObject): |
| (JSC::DFG::SpeculativeJIT::loadFromIntTypedArray): |
| (JSC::DFG::SpeculativeJIT::compileGetByValOnIntTypedArray): |
| (JSC::DFG::SpeculativeJIT::compileGetByValOnFloatTypedArray): |
| (JSC::DFG::SpeculativeJIT::compileNewTypedArrayWithSize): |
| * dfg/DFGSpeculativeJIT.h: |
| * dfg/DFGSpeculativeJIT64.cpp: |
| (JSC::DFG::SpeculativeJIT::compile): |
| * ftl/FTLLowerDFGToB3.cpp: |
| (JSC::FTL::DFG::LowerDFGToB3::compileAtomicsReadModifyWrite): |
| (JSC::FTL::DFG::LowerDFGToB3::compileGetByVal): |
| (JSC::FTL::DFG::LowerDFGToB3::compileNewTypedArray): |
| (JSC::FTL::DFG::LowerDFGToB3::pointerIntoTypedArray): |
| * jit/JITPropertyAccess.cpp: |
| (JSC::JIT::emitIntTypedArrayGetByVal): |
| * runtime/Butterfly.h: |
| (JSC::Butterfly::computeIndexingMask const): |
| (JSC::Butterfly::computeIndexingMaskForVectorLength): Deleted. |
| * runtime/JSArrayBufferView.cpp: |
| (JSC::JSArrayBufferView::JSArrayBufferView): |
| * wasm/WasmB3IRGenerator.cpp: |
| (JSC::Wasm::B3IRGenerator::B3IRGenerator): |
| (JSC::Wasm::B3IRGenerator::restoreWebAssemblyGlobalState): |
| (JSC::Wasm::B3IRGenerator::emitCheckAndPreparePointer): |
| (JSC::Wasm::B3IRGenerator::load): |
| (JSC::Wasm::B3IRGenerator::store): |
| (JSC::Wasm::B3IRGenerator::addCallIndirect): |
| * wasm/WasmBinding.cpp: |
| (JSC::Wasm::wasmToWasm): |
| * wasm/WasmMemory.cpp: |
| (JSC::Wasm::Memory::Memory): |
| (JSC::Wasm::Memory::grow): |
| * wasm/WasmMemory.h: |
| (JSC::Wasm::Memory::offsetOfIndexingMask): |
| * wasm/WasmMemoryInformation.cpp: |
| (JSC::Wasm::PinnedRegisterInfo::get): |
| (JSC::Wasm::PinnedRegisterInfo::PinnedRegisterInfo): |
| * wasm/WasmMemoryInformation.h: |
| (JSC::Wasm::PinnedRegisterInfo::toSave const): |
| * wasm/js/JSToWasm.cpp: |
| (JSC::Wasm::createJSToWasmWrapper): |
| |
| 2018-01-05 Commit Queue <commit-queue@webkit.org> |
| |
| Unreviewed, rolling out r226434. |
| https://bugs.webkit.org/show_bug.cgi?id=181322 |
| |
| 32bit JSC failure in x86 (Requested by yusukesuzuki on |
| #webkit). |
| |
| Reverted changeset: |
| |
| "[DFG] Unify ToNumber implementation in 32bit and 64bit by |
| changing 32bit Int32Tag and LowestTag" |
| https://bugs.webkit.org/show_bug.cgi?id=181134 |
| https://trac.webkit.org/changeset/226434 |
| |
| 2018-01-04 Devin Rousso <webkit@devinrousso.com> |
| |
| Web Inspector: replace HTMLCanvasElement with CanvasRenderingContext for instrumentation logic |
| https://bugs.webkit.org/show_bug.cgi?id=180770 |
| |
| Reviewed by Joseph Pecoraro. |
| |
| * inspector/protocol/Canvas.json: |
| |
| 2018-01-04 Commit Queue <commit-queue@webkit.org> |
| |
| Unreviewed, rolling out r226405. |
| https://bugs.webkit.org/show_bug.cgi?id=181318 |
| |
| Speculative rollout due to Octane/SplayLatency,Octane/Splay |
| regressions (Requested by yusukesuzuki on #webkit). |
| |
| Reverted changeset: |
| |
| "[JSC] Create parallel SlotVisitors apriori" |
| https://bugs.webkit.org/show_bug.cgi?id=180907 |
| https://trac.webkit.org/changeset/226405 |
| |
| 2018-01-04 Saam Barati <sbarati@apple.com> |
| |
| Do value profiling in to_this |
| https://bugs.webkit.org/show_bug.cgi?id=181299 |
| |
| Reviewed by Filip Pizlo. |
| |
| This patch adds value profiling to to_this. We use the result of the value |
| profiling only for strict mode code when we don't predict that the input is |
| of a specific type. This helps when the input is SpecCellOther. Such cells |
| might implement a custom ToThis, which can produce an arbitrary result. Before |
| this patch, in prediction propagation, we were saying that a ToThis with a |
| SpecCellOther input also produced SpecCellOther. However, this is incorrect, |
| given that the input may implement ToThis that produces an arbitrary result. |
| This is seen inside Speedometer. This patch fixes an OSR exit loop in Speedometer. |
| |
| Interestingly, this patch only does value profiling on the slow path. The fast |
| path of to_this in the LLInt/baseline just perform a structure check. If it |
| passes, the result is the same as the input. Therefore, doing value profiling |
| from the fast path wouldn't actually produce new information for the ValueProfile. |
| |
| * bytecode/BytecodeDumper.cpp: |
| (JSC::BytecodeDumper<Block>::dumpBytecode): |
| * bytecode/BytecodeList.json: |
| * bytecode/CodeBlock.cpp: |
| (JSC::CodeBlock::finishCreation): |
| * bytecompiler/BytecodeGenerator.cpp: |
| (JSC::BytecodeGenerator::BytecodeGenerator): |
| (JSC::BytecodeGenerator::emitToThis): |
| * bytecompiler/BytecodeGenerator.h: |
| * dfg/DFGByteCodeParser.cpp: |
| (JSC::DFG::ByteCodeParser::parseBlock): |
| * dfg/DFGNode.h: |
| (JSC::DFG::Node::hasHeapPrediction): |
| * dfg/DFGPredictionPropagationPhase.cpp: |
| * runtime/CommonSlowPaths.cpp: |
| (JSC::SLOW_PATH_DECL): |
| |
| 2018-01-04 Yusuke Suzuki <utatane.tea@gmail.com> |
| |
| [DFG] Unify ToNumber implementation in 32bit and 64bit by changing 32bit Int32Tag and LowestTag |
| https://bugs.webkit.org/show_bug.cgi?id=181134 |
| |
| Reviewed by Mark Lam. |
| |
| We would like to unify DFG ToNumber implementation in 32bit and 64bit. One problem is that |
| branchIfNumber signature is different between 32bit and 64bit. 32bit implementation requires |
| an additional scratch register. We do not want to allocate an unnecessary register in 64bit |
| implementation. |
| |
| This patch removes the additional register in branchIfNumber/branchIfNotNumber in both 32bit |
| and 64bit implementation. To achieve this goal, we change Int32Tag and LowestTag order. By |
| setting Int32Tag as LowestTag, we can query whether the given tag is a number by checking |
| `<= LowestTag(Int32Tag)`. |
| |
| We also change the order of UndefinedTag, NullTag, and BooleanTag to keep `(UndefinedTag | 1) == NullTag`. |
| |
| We also clean up speculateMisc implementation by adding branchIfMisc/branchIfNotMisc. |
| |
| * dfg/DFGSpeculativeJIT.cpp: |
| (JSC::DFG::SpeculativeJIT::compileValueToInt32): |
| (JSC::DFG::SpeculativeJIT::compileDoubleRep): |
| (JSC::DFG::SpeculativeJIT::speculateNumber): |
| (JSC::DFG::SpeculativeJIT::speculateMisc): |
| (JSC::DFG::SpeculativeJIT::compileNormalizeMapKey): |
| (JSC::DFG::SpeculativeJIT::compileToNumber): |
| * dfg/DFGSpeculativeJIT.h: |
| * dfg/DFGSpeculativeJIT32_64.cpp: |
| (JSC::DFG::SpeculativeJIT::nonSpeculativeNonPeepholeCompareNullOrUndefined): |
| (JSC::DFG::SpeculativeJIT::nonSpeculativePeepholeBranchNullOrUndefined): |
| (JSC::DFG::SpeculativeJIT::compileObjectOrOtherLogicalNot): |
| (JSC::DFG::SpeculativeJIT::emitObjectOrOtherBranch): |
| (JSC::DFG::SpeculativeJIT::compile): |
| * dfg/DFGSpeculativeJIT64.cpp: |
| (JSC::DFG::SpeculativeJIT::compile): |
| * jit/AssemblyHelpers.cpp: |
| (JSC::AssemblyHelpers::branchIfNotType): |
| (JSC::AssemblyHelpers::jitAssertIsJSNumber): |
| (JSC::AssemblyHelpers::emitConvertValueToBoolean): |
| * jit/AssemblyHelpers.h: |
| (JSC::AssemblyHelpers::branchIfMisc): |
| (JSC::AssemblyHelpers::branchIfNotMisc): |
| (JSC::AssemblyHelpers::branchIfNumber): |
| (JSC::AssemblyHelpers::branchIfNotNumber): |
| (JSC::AssemblyHelpers::branchIfNotDoubleKnownNotInt32): |
| (JSC::AssemblyHelpers::emitTypeOf): |
| * jit/JITAddGenerator.cpp: |
| (JSC::JITAddGenerator::generateFastPath): |
| * jit/JITArithmetic32_64.cpp: |
| (JSC::JIT::emitBinaryDoubleOp): |
| * jit/JITDivGenerator.cpp: |
| (JSC::JITDivGenerator::loadOperand): |
| * jit/JITMulGenerator.cpp: |
| (JSC::JITMulGenerator::generateInline): |
| (JSC::JITMulGenerator::generateFastPath): |
| * jit/JITNegGenerator.cpp: |
| (JSC::JITNegGenerator::generateInline): |
| (JSC::JITNegGenerator::generateFastPath): |
| * jit/JITOpcodes32_64.cpp: |
| (JSC::JIT::emit_op_is_number): |
| (JSC::JIT::emit_op_jeq_null): |
| (JSC::JIT::emit_op_jneq_null): |
| (JSC::JIT::emit_op_to_number): |
| (JSC::JIT::emit_op_profile_type): |
| * jit/JITRightShiftGenerator.cpp: |
| (JSC::JITRightShiftGenerator::generateFastPath): |
| * jit/JITSubGenerator.cpp: |
| (JSC::JITSubGenerator::generateInline): |
| (JSC::JITSubGenerator::generateFastPath): |
| * llint/LLIntData.cpp: |
| (JSC::LLInt::Data::performAssertions): |
| * llint/LowLevelInterpreter.asm: |
| * llint/LowLevelInterpreter32_64.asm: |
| * runtime/JSCJSValue.h: |
| |
| 2018-01-04 JF Bastien <jfbastien@apple.com> |
| |
| Add assembler support for x86 lfence and sfence |
| https://bugs.webkit.org/show_bug.cgi?id=181311 |
| <rdar://problem/36301780> |
| |
| Reviewed by Michael Saboff. |
| |
| Useful for testing performance of serializing instructions (hint: |
| it's not good). |
| |
| * assembler/MacroAssemblerX86Common.h: |
| (JSC::MacroAssemblerX86Common::lfence): |
| (JSC::MacroAssemblerX86Common::sfence): |
| * assembler/X86Assembler.h: |
| (JSC::X86Assembler::lfence): |
| (JSC::X86Assembler::sfence): |
| |
| 2018-01-04 Saam Barati <sbarati@apple.com> |
| |
| Add a new pattern matching rule to Graph::methodOfGettingAValueProfileFor for SetLocal(@nodeWithHeapPrediction) |
| https://bugs.webkit.org/show_bug.cgi?id=181296 |
| |
| Reviewed by Filip Pizlo. |
| |
| Inside Speedometer's Ember test, there is a recompile loop like: |
| a: GetByVal(..., semanticOriginX) |
| b: SetLocal(Cell:@a, semanticOriginX) |
| |
| where the cell check always fails. For reasons I didn't investigate, the |
| baseline JIT's value profiling doesn't accurately capture the GetByVal's |
| result. |
| |
| However, when compiling this cell speculation check in the DFG, we get a null |
| MethodOfGettingAValueProfile inside Graph::methodOfGettingAValueProfileFor for |
| this IR pattern because both @a and @b have the same semantic origin. We |
| should not follow the same semantic origin heuristic when dealing with |
| SetLocal since SetLocal(@nodeWithHeapPrediction) is such a common IR pattern. |
| For patterns like this, we introduce a new heuristic: @NodeThatDoesNotProduceAValue(@nodeWithHeapPrediction). |
| For this IR pattern, we will update the value profile for the semantic origin |
| for @nodeWithHeapPrediction. So, for the Speedometer example above, we |
| will correctly update the GetByVal's value profile, which will prevent |
| an OSR exit loop. |
| |
| * dfg/DFGGraph.cpp: |
| (JSC::DFG::Graph::methodOfGettingAValueProfileFor): |
| |
| 2018-01-04 Keith Miller <keith_miller@apple.com> |
| |
| Array Storage operations sometimes did not update the indexing mask correctly. |
| https://bugs.webkit.org/show_bug.cgi?id=181301 |
| |
| Reviewed by Mark Lam. |
| |
| I will add tests in a follow up patch. See: https://bugs.webkit.org/show_bug.cgi?id=181303 |
| |
| * runtime/JSArray.cpp: |
| (JSC::JSArray::shiftCountWithArrayStorage): |
| * runtime/JSObject.cpp: |
| (JSC::JSObject::increaseVectorLength): |
| |
| 2018-01-04 Yusuke Suzuki <utatane.tea@gmail.com> |
| |
| [DFG] Define defs for MapSet/SetAdd to participate in CSE |
| https://bugs.webkit.org/show_bug.cgi?id=179911 |
| |
| Reviewed by Saam Barati. |
| |
| With this patch, our MapSet and SetAdd DFG nodes participate in CSE. |
| To handle a bit tricky DFG Map operation nodes, MapSet and SetAdd |
| produce added bucket as its result. Subsequent GetMapBucket will |
| be removed by CSE. |
| |
| * dfg/DFGAbstractInterpreterInlines.h: |
| (JSC::DFG::AbstractInterpreter<AbstractStateType>::executeEffects): |
| * dfg/DFGClobberize.h: |
| (JSC::DFG::clobberize): |
| * dfg/DFGNodeType.h: |
| * dfg/DFGOperations.cpp: |
| * dfg/DFGOperations.h: |
| * dfg/DFGPredictionPropagationPhase.cpp: |
| * dfg/DFGSpeculativeJIT.cpp: |
| (JSC::DFG::SpeculativeJIT::compileSetAdd): |
| (JSC::DFG::SpeculativeJIT::compileMapSet): |
| * dfg/DFGSpeculativeJIT.h: |
| (JSC::DFG::SpeculativeJIT::callOperation): |
| * ftl/FTLLowerDFGToB3.cpp: |
| (JSC::FTL::DFG::LowerDFGToB3::compileSetAdd): |
| (JSC::FTL::DFG::LowerDFGToB3::compileMapSet): |
| * jit/JITOperations.h: |
| * runtime/HashMapImpl.h: |
| (JSC::HashMapImpl::addNormalized): |
| (JSC::HashMapImpl::addNormalizedInternal): |
| |
| 2018-01-04 Yusuke Suzuki <utatane.tea@gmail.com> |
| |
| [JSC] Remove LocalScope |
| https://bugs.webkit.org/show_bug.cgi?id=181206 |
| |
| Reviewed by Geoffrey Garen. |
| |
| The last user of HandleStack and LocalScope is JSON. But MarkedArgumentBuffer is enough for their use. |
| This patch changes JSON parsing and stringifying to using MarkedArgumentBuffer. And remove HandleStack |
| and LocalScope. |
| |
| We make Stringifier and Walker WTF_FORBID_HEAP_ALLOCATION to place them on the stack. So they can hold |
| JSObject* directly in their fields. |
| |
| * JavaScriptCore.xcodeproj/project.pbxproj: |
| * Sources.txt: |
| * heap/HandleStack.cpp: Removed. |
| * heap/HandleStack.h: Removed. |
| * heap/Heap.cpp: |
| (JSC::Heap::addCoreConstraints): |
| * heap/Heap.h: |
| (JSC::Heap::handleSet): |
| (JSC::Heap::handleStack): Deleted. |
| * heap/Local.h: Removed. |
| * heap/LocalScope.h: Removed. |
| * runtime/JSONObject.cpp: |
| (JSC::Stringifier::Holder::object const): |
| (JSC::gap): |
| (JSC::Stringifier::Stringifier): |
| (JSC::Stringifier::stringify): |
| (JSC::Stringifier::appendStringifiedValue): |
| (JSC::Stringifier::Holder::Holder): |
| (JSC::Stringifier::Holder::appendNextProperty): |
| (JSC::Walker::Walker): |
| (JSC::Walker::callReviver): |
| (JSC::Walker::walk): |
| (JSC::JSONProtoFuncParse): |
| (JSC::JSONProtoFuncStringify): |
| (JSC::JSONParse): |
| (JSC::JSONStringify): |
| |
| 2018-01-04 Yusuke Suzuki <utatane.tea@gmail.com> |
| |
| [FTL] Optimize ObjectAllocationSinking mergePointerSets by using removeIf |
| https://bugs.webkit.org/show_bug.cgi?id=180238 |
| |
| Reviewed by Saam Barati. |
| |
| We can optimize ObjectAllocationSinking a bit by using removeIf. |
| |
| * dfg/DFGObjectAllocationSinkingPhase.cpp: |
| |
| 2018-01-04 Yusuke Suzuki <utatane.tea@gmail.com> |
| |
| [JSC] Create parallel SlotVisitors apriori |
| https://bugs.webkit.org/show_bug.cgi?id=180907 |
| |
| Reviewed by Saam Barati. |
| |
| The number of SlotVisitors are capped with the number of HeapHelperPool's threads + 2. |
| If we create these SlotVisitors apriori, we do not need to create SlotVisitors dynamically. |
| Then we do not need to grab locks while iterating all the SlotVisitors. |
| |
| In addition, we do not need to consider the case that the number of SlotVisitors increases |
| after setting up VisitCounters in MarkingConstraintSolver since the number of SlotVisitors |
| does not increase any more. |
| |
| * heap/Heap.cpp: |
| (JSC::Heap::Heap): |
| (JSC::Heap::runBeginPhase): |
| * heap/Heap.h: |
| * heap/HeapInlines.h: |
| (JSC::Heap::forEachSlotVisitor): |
| (JSC::Heap::numberOfSlotVisitors): Deleted. |
| * heap/MarkingConstraintSolver.cpp: |
| (JSC::MarkingConstraintSolver::didVisitSomething const): |
| |
| 2018-01-03 Ting-Wei Lan <lantw44@gmail.com> |
| |
| Replace hard-coded paths in shebangs with #!/usr/bin/env |
| https://bugs.webkit.org/show_bug.cgi?id=181040 |
| |
| Reviewed by Alex Christensen. |
| |
| * Scripts/UpdateContents.py: |
| * Scripts/cssmin.py: |
| * Scripts/generate-combined-inspector-json.py: |
| * Scripts/xxd.pl: |
| * create_hash_table: |
| * generate-bytecode-files: |
| * wasm/generateWasm.py: |
| * wasm/generateWasmOpsHeader.py: |
| * yarr/generateYarrCanonicalizeUnicode: |
| |
| 2018-01-03 Michael Saboff <msaboff@apple.com> |
| |
| Disable SharedArrayBuffers from Web API |
| https://bugs.webkit.org/show_bug.cgi?id=181266 |
| |
| Reviewed by Saam Barati. |
| |
| Removed SharedArrayBuffer prototype and structure from GlobalObject creation |
| to disable. |
| |
| * runtime/JSGlobalObject.cpp: |
| (JSC::JSGlobalObject::init): |
| (JSC::JSGlobalObject::visitChildren): |
| * runtime/JSGlobalObject.h: |
| (JSC::JSGlobalObject::arrayBufferPrototype const): |
| (JSC::JSGlobalObject::arrayBufferStructure const): |
| |
| 2018-01-03 Michael Saboff <msaboff@apple.com> |
| |
| Add "noInline" to $vm |
| https://bugs.webkit.org/show_bug.cgi?id=181265 |
| |
| Reviewed by Mark Lam. |
| |
| This would be useful for web based tests. |
| |
| * tools/JSDollarVM.cpp: |
| (JSC::getExecutableForFunction): |
| (JSC::functionNoInline): |
| (JSC::JSDollarVM::finishCreation): |
| |
| 2018-01-03 Michael Saboff <msaboff@apple.com> |
| |
| Remove unnecessary flushing of Butterfly pointer in functionCpuClflush() |
| https://bugs.webkit.org/show_bug.cgi?id=181263 |
| |
| Reviewed by Mark Lam. |
| |
| Flushing the butterfly pointer provides no benefit and slows this function. |
| |
| * tools/JSDollarVM.cpp: |
| (JSC::functionCpuClflush): |
| |
| 2018-01-03 Saam Barati <sbarati@apple.com> |
| |
| Fix BytecodeParser op_catch assert to work with useProfiler=1 |
| https://bugs.webkit.org/show_bug.cgi?id=181260 |
| |
| Reviewed by Keith Miller. |
| |
| op_catch was asserting that the current block was empty. This is only true |
| if the profiler isn't enabled. When the profiler is enabled, we will |
| insert a CountExecution node before each bytecode. This patch fixes the |
| assert to work with the profiler. |
| |
| * dfg/DFGByteCodeParser.cpp: |
| (JSC::DFG::ByteCodeParser::parseBlock): |
| |
| 2018-01-03 Per Arne Vollan <pvollan@apple.com> |
| |
| [Win][Debug] testapi link error. |
| https://bugs.webkit.org/show_bug.cgi?id=181247 |
| <rdar://problem/36166729> |
| |
| Reviewed by Brent Fulgham. |
| |
| Do not set the runtime library compile flag for C files, it is already set to the correct value. |
| |
| * shell/PlatformWin.cmake: |
| |
| 2018-01-03 Robin Morisset <rmorisset@apple.com> |
| |
| Inlining of a function that ends in op_unreachable crashes |
| https://bugs.webkit.org/show_bug.cgi?id=181027 |
| |
| Reviewed by Filip Pizlo. |
| |
| * dfg/DFGByteCodeParser.cpp: |
| (JSC::DFG::ByteCodeParser::allocateTargetableBlock): |
| (JSC::DFG::ByteCodeParser::inlineCall): |
| |
| 2018-01-02 Saam Barati <sbarati@apple.com> |
| |
| Incorrect assertion inside AccessCase |
| https://bugs.webkit.org/show_bug.cgi?id=181200 |
| <rdar://problem/35494754> |
| |
| Reviewed by Yusuke Suzuki. |
| |
| Consider a PutById compiled to a setter in a function like so: |
| |
| ``` |
| function foo(o) { o.f = o; } |
| ``` |
| |
| The DFG will often assign the same registers to the baseGPR (o in o.f) and the |
| valueRegsPayloadGPR (o in the RHS). The code totally works when these are assigned |
| to the same register. However, we're asserting that they're not the same register. |
| This patch just removes this invalid assertion. |
| |
| * bytecode/AccessCase.cpp: |
| (JSC::AccessCase::generateImpl): |
| |
| 2018-01-02 Caio Lima <ticaiolima@gmail.com> |
| |
| [ESNext][BigInt] Implement BigIntConstructor and BigIntPrototype |
| https://bugs.webkit.org/show_bug.cgi?id=175359 |
| |
| Reviewed by Yusuke Suzuki. |
| |
| This patch is implementing BigIntConstructor and BigIntPrototype |
| following spec[1, 2]. As addition, we are also implementing BigIntObject |
| warapper to handle ToObject(v) abstract operation when "v" is a BigInt |
| primitive. With these classes, now it's possible to syntetize |
| BigInt.prototype and then call "toString", "valueOf" and |
| "toLocaleString" when the primitive is a BigInt. |
| BigIntConstructor exposes an API to parse other primitives such as |
| Number, Boolean and String to BigInt. |
| We decided to skip parseInt implementation, since it was removed from |
| spec. |
| |
| [1] - https://tc39.github.io/proposal-bigint/#sec-bigint-constructor |
| [2] - https://tc39.github.io/proposal-bigint/#sec-properties-of-the-bigint-prototype-object |
| |
| * CMakeLists.txt: |
| * DerivedSources.make: |
| * JavaScriptCore.xcodeproj/project.pbxproj: |
| * Sources.txt: |
| * jsc.cpp: |
| * runtime/BigIntConstructor.cpp: Added. |
| (JSC::BigIntConstructor::BigIntConstructor): |
| (JSC::BigIntConstructor::finishCreation): |
| (JSC::isSafeInteger): |
| (JSC::toBigInt): |
| (JSC::callBigIntConstructor): |
| (JSC::bigIntConstructorFuncAsUintN): |
| (JSC::bigIntConstructorFuncAsIntN): |
| * runtime/BigIntConstructor.h: Added. |
| (JSC::BigIntConstructor::create): |
| (JSC::BigIntConstructor::createStructure): |
| * runtime/BigIntObject.cpp: Added. |
| (JSC::BigIntObject::BigIntObject): |
| (JSC::BigIntObject::finishCreation): |
| (JSC::BigIntObject::toStringName): |
| (JSC::BigIntObject::defaultValue): |
| * runtime/BigIntObject.h: Added. |
| (JSC::BigIntObject::create): |
| (JSC::BigIntObject::internalValue const): |
| (JSC::BigIntObject::createStructure): |
| * runtime/BigIntPrototype.cpp: Added. |
| (JSC::BigIntPrototype::BigIntPrototype): |
| (JSC::BigIntPrototype::finishCreation): |
| (JSC::toThisBigIntValue): |
| (JSC::bigIntProtoFuncToString): |
| (JSC::bigIntProtoFuncToLocaleString): |
| (JSC::bigIntProtoFuncValueOf): |
| * runtime/BigIntPrototype.h: Added. |
| (JSC::BigIntPrototype::create): |
| (JSC::BigIntPrototype::createStructure): |
| * runtime/IntlCollator.cpp: |
| (JSC::IntlCollator::initializeCollator): |
| * runtime/IntlNumberFormat.cpp: |
| (JSC::IntlNumberFormat::initializeNumberFormat): |
| * runtime/JSBigInt.cpp: |
| (JSC::JSBigInt::createFrom): |
| (JSC::JSBigInt::parseInt): |
| (JSC::JSBigInt::toObject const): |
| * runtime/JSBigInt.h: |
| * runtime/JSCJSValue.cpp: |
| (JSC::JSValue::synthesizePrototype const): |
| * runtime/JSCPoisonedPtr.cpp: |
| * runtime/JSCell.cpp: |
| (JSC::JSCell::toObjectSlow const): |
| * runtime/JSGlobalObject.cpp: |
| (JSC::JSGlobalObject::init): |
| (JSC::JSGlobalObject::visitChildren): |
| * runtime/JSGlobalObject.h: |
| (JSC::JSGlobalObject::bigIntPrototype const): |
| (JSC::JSGlobalObject::bigIntObjectStructure const): |
| * runtime/StructureCache.h: |
| * runtime/StructureInlines.h: |
| (JSC::prototypeForLookupPrimitiveImpl): |
| |
| 2018-01-02 Tim Horton <timothy_horton@apple.com> |
| |
| Fix the MathCommon build with a recent compiler |
| https://bugs.webkit.org/show_bug.cgi?id=181216 |
| |
| Reviewed by Sam Weinig. |
| |
| * runtime/MathCommon.cpp: |
| (JSC::fdlibmPow): |
| This cast drops the 'const' qualifier from the pointer to 'one', |
| but it doesn't have to, and it makes the compiler sad. |
| |
| == Rolled over to ChangeLog-2018-01-01 == |