New bytecode format for JSC
authortzagallo@apple.com <tzagallo@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 26 Oct 2018 19:54:24 +0000 (19:54 +0000)
committertzagallo@apple.com <tzagallo@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 26 Oct 2018 19:54:24 +0000 (19:54 +0000)
https://bugs.webkit.org/show_bug.cgi?id=187373
<rdar://problem/44186758>

Reviewed by Filip Pizlo.

.:

Disable JIT by default on 32-bit platforms

* Source/cmake/WebKitFeatures.cmake:

JSTests:

Add tests to ensure that the inferred inline capacity for a narrow op_new_object will be capped at 255.

* stress/maximum-inline-capacity.js: Added.
(test1):
(test3.Foo):
(test3):

Source/JavaScriptCore:

Replace unlinked and linked bytecode with a new immutable bytecode that does not embed
any addresses. Instructions can be encoded as narrow (1-byte operands) or wide (4-byte
operands) and might contain an extra operand, the metadataID. The metadataID is used to
access the instruction's mutable data in a side table in the CodeBlock (the MetadataTable).

Bytecodes now must be structs declared in the new BytecodeList.rb. All bytecodes give names
and types to all its operands. Additionally, reading a bytecode from the instruction stream
requires decoding the whole bytecode, i.e. it's no longer possible to access arbitrary
operands directly from the stream.

* CMakeLists.txt:
* DerivedSources.make:
* JavaScriptCore.xcodeproj/project.pbxproj:
* Sources.txt:
* assembler/MacroAssemblerCodeRef.h:
(JSC::ReturnAddressPtr::ReturnAddressPtr):
(JSC::ReturnAddressPtr::value const):
(JSC::MacroAssemblerCodePtr::MacroAssemblerCodePtr):
(JSC::MacroAssemblerCodePtr::createFromExecutableAddress):
* bytecode/ArithProfile.h:
(JSC::ArithProfile::ArithProfile):
* bytecode/ArrayAllocationProfile.h:
(JSC::ArrayAllocationProfile::ArrayAllocationProfile):
* bytecode/ArrayProfile.h:
* bytecode/BytecodeBasicBlock.cpp:
(JSC::isJumpTarget):
(JSC::BytecodeBasicBlock::computeImpl):
(JSC::BytecodeBasicBlock::compute):
* bytecode/BytecodeBasicBlock.h:
(JSC::BytecodeBasicBlock::leaderOffset const):
(JSC::BytecodeBasicBlock::totalLength const):
(JSC::BytecodeBasicBlock::offsets const):
(JSC::BytecodeBasicBlock::BytecodeBasicBlock):
(JSC::BytecodeBasicBlock::addLength):
* bytecode/BytecodeDumper.cpp:
(JSC::BytecodeDumper<Block>::printLocationAndOp):
(JSC::BytecodeDumper<Block>::dumpBytecode):
(JSC::BytecodeDumper<Block>::dumpIdentifiers):
(JSC::BytecodeDumper<Block>::dumpConstants):
(JSC::BytecodeDumper<Block>::dumpExceptionHandlers):
(JSC::BytecodeDumper<Block>::dumpSwitchJumpTables):
(JSC::BytecodeDumper<Block>::dumpStringSwitchJumpTables):
(JSC::BytecodeDumper<Block>::dumpBlock):
* bytecode/BytecodeDumper.h:
(JSC::BytecodeDumper::dumpOperand):
(JSC::BytecodeDumper::dumpValue):
(JSC::BytecodeDumper::BytecodeDumper):
(JSC::BytecodeDumper::block const):
* bytecode/BytecodeGeneratorification.cpp:
(JSC::BytecodeGeneratorification::BytecodeGeneratorification):
(JSC::BytecodeGeneratorification::enterPoint const):
(JSC::BytecodeGeneratorification::instructions const):
(JSC::GeneratorLivenessAnalysis::run):
(JSC::BytecodeGeneratorification::run):
(JSC::performGeneratorification):
* bytecode/BytecodeGeneratorification.h:
* bytecode/BytecodeGraph.h:
(JSC::BytecodeGraph::blockContainsBytecodeOffset):
(JSC::BytecodeGraph::findBasicBlockForBytecodeOffset):
(JSC::BytecodeGraph::findBasicBlockWithLeaderOffset):
(JSC::BytecodeGraph::BytecodeGraph):
* bytecode/BytecodeKills.h:
* bytecode/BytecodeList.json: Removed.
* bytecode/BytecodeList.rb: Added.
* bytecode/BytecodeLivenessAnalysis.cpp:
(JSC::BytecodeLivenessAnalysis::dumpResults):
* bytecode/BytecodeLivenessAnalysis.h:
* bytecode/BytecodeLivenessAnalysisInlines.h:
(JSC::isValidRegisterForLiveness):
(JSC::BytecodeLivenessPropagation::stepOverInstruction):
* bytecode/BytecodeRewriter.cpp:
(JSC::BytecodeRewriter::applyModification):
(JSC::BytecodeRewriter::execute):
(JSC::BytecodeRewriter::adjustJumpTargetsInFragment):
(JSC::BytecodeRewriter::insertImpl):
(JSC::BytecodeRewriter::adjustJumpTarget):
(JSC::BytecodeRewriter::adjustJumpTargets):
* bytecode/BytecodeRewriter.h:
(JSC::BytecodeRewriter::InsertionPoint::InsertionPoint):
(JSC::BytecodeRewriter::Fragment::Fragment):
(JSC::BytecodeRewriter::Fragment::appendInstruction):
(JSC::BytecodeRewriter::BytecodeRewriter):
(JSC::BytecodeRewriter::insertFragmentBefore):
(JSC::BytecodeRewriter::insertFragmentAfter):
(JSC::BytecodeRewriter::removeBytecode):
(JSC::BytecodeRewriter::adjustAbsoluteOffset):
(JSC::BytecodeRewriter::adjustJumpTarget):
* bytecode/BytecodeUseDef.h:
(JSC::computeUsesForBytecodeOffset):
(JSC::computeDefsForBytecodeOffset):
* bytecode/CallLinkStatus.cpp:
(JSC::CallLinkStatus::computeFromLLInt):
* bytecode/CodeBlock.cpp:
(JSC::CodeBlock::dumpBytecode):
(JSC::CodeBlock::CodeBlock):
(JSC::CodeBlock::finishCreation):
(JSC::CodeBlock::estimatedSize):
(JSC::CodeBlock::visitChildren):
(JSC::CodeBlock::propagateTransitions):
(JSC::CodeBlock::finalizeLLIntInlineCaches):
(JSC::CodeBlock::addJITAddIC):
(JSC::CodeBlock::addJITMulIC):
(JSC::CodeBlock::addJITSubIC):
(JSC::CodeBlock::addJITNegIC):
(JSC::CodeBlock::stronglyVisitStrongReferences):
(JSC::CodeBlock::ensureCatchLivenessIsComputedForBytecodeOffset):
(JSC::CodeBlock::ensureCatchLivenessIsComputedForBytecodeOffsetSlow):
(JSC::CodeBlock::hasOpDebugForLineAndColumn):
(JSC::CodeBlock::getArrayProfile):
(JSC::CodeBlock::updateAllArrayPredictions):
(JSC::CodeBlock::predictedMachineCodeSize):
(JSC::CodeBlock::tryGetValueProfileForBytecodeOffset):
(JSC::CodeBlock::valueProfilePredictionForBytecodeOffset):
(JSC::CodeBlock::valueProfileForBytecodeOffset):
(JSC::CodeBlock::validate):
(JSC::CodeBlock::outOfLineJumpOffset):
(JSC::CodeBlock::outOfLineJumpTarget):
(JSC::CodeBlock::arithProfileForBytecodeOffset):
(JSC::CodeBlock::arithProfileForPC):
(JSC::CodeBlock::couldTakeSpecialFastCase):
(JSC::CodeBlock::insertBasicBlockBoundariesForControlFlowProfiler):
* bytecode/CodeBlock.h:
(JSC::CodeBlock::addMathIC):
(JSC::CodeBlock::outOfLineJumpOffset):
(JSC::CodeBlock::bytecodeOffset):
(JSC::CodeBlock::instructions const):
(JSC::CodeBlock::instructionCount const):
(JSC::CodeBlock::llintBaselineCalleeSaveSpaceAsVirtualRegisters):
(JSC::CodeBlock::metadata):
(JSC::CodeBlock::metadataSizeInBytes):
(JSC::CodeBlock::numberOfNonArgumentValueProfiles):
(JSC::CodeBlock::totalNumberOfValueProfiles):
* bytecode/CodeBlockInlines.h: Added.
(JSC::CodeBlock::forEachValueProfile):
(JSC::CodeBlock::forEachArrayProfile):
(JSC::CodeBlock::forEachArrayAllocationProfile):
(JSC::CodeBlock::forEachObjectAllocationProfile):
(JSC::CodeBlock::forEachLLIntCallLinkInfo):
* bytecode/Fits.h: Added.
* bytecode/GetByIdMetadata.h: Copied from Source/JavaScriptCore/bytecode/LLIntPrototypeLoadAdaptiveStructureWatchpoint.h.
* bytecode/GetByIdStatus.cpp:
(JSC::GetByIdStatus::computeFromLLInt):
* bytecode/Instruction.h:
(JSC::Instruction::Instruction):
(JSC::Instruction::Impl::opcodeID const):
(JSC::Instruction::opcodeID const):
(JSC::Instruction::name const):
(JSC::Instruction::isWide const):
(JSC::Instruction::size const):
(JSC::Instruction::is const):
(JSC::Instruction::as const):
(JSC::Instruction::cast):
(JSC::Instruction::cast const):
(JSC::Instruction::narrow const):
(JSC::Instruction::wide const):
* bytecode/InstructionStream.cpp: Copied from Source/JavaScriptCore/bytecode/SpecialPointer.cpp.
(JSC::InstructionStream::InstructionStream):
(JSC::InstructionStream::sizeInBytes const):
* bytecode/InstructionStream.h: Added.
(JSC::InstructionStream::BaseRef::BaseRef):
(JSC::InstructionStream::BaseRef::operator=):
(JSC::InstructionStream::BaseRef::operator-> const):
(JSC::InstructionStream::BaseRef::ptr const):
(JSC::InstructionStream::BaseRef::operator!= const):
(JSC::InstructionStream::BaseRef::next const):
(JSC::InstructionStream::BaseRef::offset const):
(JSC::InstructionStream::BaseRef::isValid const):
(JSC::InstructionStream::BaseRef::unwrap const):
(JSC::InstructionStream::MutableRef::freeze const):
(JSC::InstructionStream::MutableRef::operator->):
(JSC::InstructionStream::MutableRef::ptr):
(JSC::InstructionStream::MutableRef::operator Ref):
(JSC::InstructionStream::MutableRef::unwrap):
(JSC::InstructionStream::iterator::operator*):
(JSC::InstructionStream::iterator::operator++):
(JSC::InstructionStream::begin const):
(JSC::InstructionStream::end const):
(JSC::InstructionStream::at const):
(JSC::InstructionStream::size const):
(JSC::InstructionStreamWriter::InstructionStreamWriter):
(JSC::InstructionStreamWriter::ref):
(JSC::InstructionStreamWriter::seek):
(JSC::InstructionStreamWriter::position):
(JSC::InstructionStreamWriter::write):
(JSC::InstructionStreamWriter::rewind):
(JSC::InstructionStreamWriter::finalize):
(JSC::InstructionStreamWriter::swap):
(JSC::InstructionStreamWriter::iterator::operator*):
(JSC::InstructionStreamWriter::iterator::operator++):
(JSC::InstructionStreamWriter::begin):
(JSC::InstructionStreamWriter::end):
* bytecode/LLIntPrototypeLoadAdaptiveStructureWatchpoint.cpp:
(JSC::LLIntPrototypeLoadAdaptiveStructureWatchpoint::LLIntPrototypeLoadAdaptiveStructureWatchpoint):
(JSC::LLIntPrototypeLoadAdaptiveStructureWatchpoint::fireInternal):
(JSC::LLIntPrototypeLoadAdaptiveStructureWatchpoint::clearLLIntGetByIdCache):
* bytecode/LLIntPrototypeLoadAdaptiveStructureWatchpoint.h:
* bytecode/MetadataTable.cpp: Copied from Source/JavaScriptCore/bytecode/SpecialPointer.cpp.
(JSC::MetadataTable::MetadataTable):
(JSC::DeallocTable::withOpcodeType):
(JSC::MetadataTable::~MetadataTable):
(JSC::MetadataTable::sizeInBytes):
* bytecode/MetadataTable.h: Copied from Source/JavaScriptCore/runtime/Watchdog.h.
(JSC::MetadataTable::get):
(JSC::MetadataTable::forEach):
(JSC::MetadataTable::getImpl):
* bytecode/Opcode.cpp:
(JSC::metadataSize):
* bytecode/Opcode.h:
(JSC::padOpcodeName):
* bytecode/OpcodeInlines.h:
(JSC::isOpcodeShape):
(JSC::getOpcodeType):
* bytecode/OpcodeSize.h: Copied from Source/JavaScriptCore/bytecode/SpecialPointer.cpp.
* bytecode/PreciseJumpTargets.cpp:
(JSC::getJumpTargetsForInstruction):
(JSC::computePreciseJumpTargetsInternal):
(JSC::computePreciseJumpTargets):
(JSC::recomputePreciseJumpTargets):
(JSC::findJumpTargetsForInstruction):
* bytecode/PreciseJumpTargets.h:
* bytecode/PreciseJumpTargetsInlines.h:
(JSC::jumpTargetForInstruction):
(JSC::extractStoredJumpTargetsForInstruction):
(JSC::updateStoredJumpTargetsForInstruction):
* bytecode/PutByIdStatus.cpp:
(JSC::PutByIdStatus::computeFromLLInt):
* bytecode/SpecialPointer.cpp:
(WTF::printInternal):
* bytecode/SpecialPointer.h:
* bytecode/UnlinkedCodeBlock.cpp:
(JSC::UnlinkedCodeBlock::UnlinkedCodeBlock):
(JSC::UnlinkedCodeBlock::visitChildren):
(JSC::UnlinkedCodeBlock::estimatedSize):
(JSC::UnlinkedCodeBlock::lineNumberForBytecodeOffset):
(JSC::dumpLineColumnEntry):
(JSC::UnlinkedCodeBlock::expressionRangeForBytecodeOffset const):
(JSC::UnlinkedCodeBlock::setInstructions):
(JSC::UnlinkedCodeBlock::instructions const):
(JSC::UnlinkedCodeBlock::applyModification):
(JSC::UnlinkedCodeBlock::addOutOfLineJumpTarget):
(JSC::UnlinkedCodeBlock::outOfLineJumpOffset):
* bytecode/UnlinkedCodeBlock.h:
(JSC::UnlinkedCodeBlock::addPropertyAccessInstruction):
(JSC::UnlinkedCodeBlock::propertyAccessInstructions const):
(JSC::UnlinkedCodeBlock::addOpProfileControlFlowBytecodeOffset):
(JSC::UnlinkedCodeBlock::opProfileControlFlowBytecodeOffsets const):
(JSC::UnlinkedCodeBlock::metadata):
(JSC::UnlinkedCodeBlock::metadataSizeInBytes):
(JSC::UnlinkedCodeBlock::outOfLineJumpOffset):
(JSC::UnlinkedCodeBlock::replaceOutOfLineJumpTargets):
* bytecode/UnlinkedInstructionStream.cpp: Removed.
* bytecode/UnlinkedInstructionStream.h: Removed.
* bytecode/UnlinkedMetadataTable.h: Copied from Source/JavaScriptCore/bytecode/LLIntPrototypeLoadAdaptiveStructureWatchpoint.h.
* bytecode/UnlinkedMetadataTableInlines.h: Added.
(JSC::UnlinkedMetadataTable::UnlinkedMetadataTable):
(JSC::UnlinkedMetadataTable::~UnlinkedMetadataTable):
(JSC::UnlinkedMetadataTable::addEntry):
(JSC::UnlinkedMetadataTable::sizeInBytes):
(JSC::UnlinkedMetadataTable::finalize):
(JSC::UnlinkedMetadataTable::link):
(JSC::UnlinkedMetadataTable::unlink):
* bytecode/VirtualRegister.cpp:
(JSC::VirtualRegister::VirtualRegister):
* bytecode/VirtualRegister.h:
* bytecompiler/BytecodeGenerator.cpp:
(JSC::Label::setLocation):
(JSC::Label::bind):
(JSC::BytecodeGenerator::generate):
(JSC::BytecodeGenerator::BytecodeGenerator):
(JSC::BytecodeGenerator::initializeVarLexicalEnvironment):
(JSC::BytecodeGenerator::emitEnter):
(JSC::BytecodeGenerator::emitLoopHint):
(JSC::BytecodeGenerator::emitJump):
(JSC::BytecodeGenerator::emitCheckTraps):
(JSC::BytecodeGenerator::rewind):
(JSC::BytecodeGenerator::fuseCompareAndJump):
(JSC::BytecodeGenerator::fuseTestAndJmp):
(JSC::BytecodeGenerator::emitJumpIfTrue):
(JSC::BytecodeGenerator::emitJumpIfFalse):
(JSC::BytecodeGenerator::emitJumpIfNotFunctionCall):
(JSC::BytecodeGenerator::emitJumpIfNotFunctionApply):
(JSC::BytecodeGenerator::moveLinkTimeConstant):
(JSC::BytecodeGenerator::moveEmptyValue):
(JSC::BytecodeGenerator::emitMove):
(JSC::BytecodeGenerator::emitUnaryOp):
(JSC::BytecodeGenerator::emitBinaryOp):
(JSC::BytecodeGenerator::emitToObject):
(JSC::BytecodeGenerator::emitToNumber):
(JSC::BytecodeGenerator::emitToString):
(JSC::BytecodeGenerator::emitTypeOf):
(JSC::BytecodeGenerator::emitInc):
(JSC::BytecodeGenerator::emitDec):
(JSC::BytecodeGenerator::emitEqualityOp):
(JSC::BytecodeGenerator::emitProfileType):
(JSC::BytecodeGenerator::emitProfileControlFlow):
(JSC::BytecodeGenerator::pushLexicalScopeInternal):
(JSC::BytecodeGenerator::emitResolveScopeForHoistingFuncDeclInEval):
(JSC::BytecodeGenerator::prepareLexicalScopeForNextForLoopIteration):
(JSC::BytecodeGenerator::emitOverridesHasInstance):
(JSC::BytecodeGenerator::emitResolveScope):
(JSC::BytecodeGenerator::emitGetFromScope):
(JSC::BytecodeGenerator::emitPutToScope):
(JSC::BytecodeGenerator::emitInstanceOf):
(JSC::BytecodeGenerator::emitInstanceOfCustom):
(JSC::BytecodeGenerator::emitInByVal):
(JSC::BytecodeGenerator::emitInById):
(JSC::BytecodeGenerator::emitTryGetById):
(JSC::BytecodeGenerator::emitGetById):
(JSC::BytecodeGenerator::emitDirectGetById):
(JSC::BytecodeGenerator::emitPutById):
(JSC::BytecodeGenerator::emitDirectPutById):
(JSC::BytecodeGenerator::emitPutGetterById):
(JSC::BytecodeGenerator::emitPutSetterById):
(JSC::BytecodeGenerator::emitPutGetterSetter):
(JSC::BytecodeGenerator::emitPutGetterByVal):
(JSC::BytecodeGenerator::emitPutSetterByVal):
(JSC::BytecodeGenerator::emitDeleteById):
(JSC::BytecodeGenerator::emitGetByVal):
(JSC::BytecodeGenerator::emitPutByVal):
(JSC::BytecodeGenerator::emitDirectPutByVal):
(JSC::BytecodeGenerator::emitDeleteByVal):
(JSC::BytecodeGenerator::emitSuperSamplerBegin):
(JSC::BytecodeGenerator::emitSuperSamplerEnd):
(JSC::BytecodeGenerator::emitIdWithProfile):
(JSC::BytecodeGenerator::emitUnreachable):
(JSC::BytecodeGenerator::emitGetArgument):
(JSC::BytecodeGenerator::emitCreateThis):
(JSC::BytecodeGenerator::emitTDZCheck):
(JSC::BytecodeGenerator::emitNewObject):
(JSC::BytecodeGenerator::emitNewArrayBuffer):
(JSC::BytecodeGenerator::emitNewArray):
(JSC::BytecodeGenerator::emitNewArrayWithSpread):
(JSC::BytecodeGenerator::emitNewArrayWithSize):
(JSC::BytecodeGenerator::emitNewRegExp):
(JSC::BytecodeGenerator::emitNewFunctionExpressionCommon):
(JSC::BytecodeGenerator::emitNewDefaultConstructor):
(JSC::BytecodeGenerator::emitNewFunction):
(JSC::BytecodeGenerator::emitSetFunctionNameIfNeeded):
(JSC::BytecodeGenerator::emitCall):
(JSC::BytecodeGenerator::emitCallInTailPosition):
(JSC::BytecodeGenerator::emitCallEval):
(JSC::BytecodeGenerator::emitExpectedFunctionSnippet):
(JSC::BytecodeGenerator::emitCallVarargs):
(JSC::BytecodeGenerator::emitCallVarargsInTailPosition):
(JSC::BytecodeGenerator::emitConstructVarargs):
(JSC::BytecodeGenerator::emitCallForwardArgumentsInTailPosition):
(JSC::BytecodeGenerator::emitLogShadowChickenPrologueIfNecessary):
(JSC::BytecodeGenerator::emitLogShadowChickenTailIfNecessary):
(JSC::BytecodeGenerator::emitCallDefineProperty):
(JSC::BytecodeGenerator::emitReturn):
(JSC::BytecodeGenerator::emitEnd):
(JSC::BytecodeGenerator::emitConstruct):
(JSC::BytecodeGenerator::emitStrcat):
(JSC::BytecodeGenerator::emitToPrimitive):
(JSC::BytecodeGenerator::emitGetScope):
(JSC::BytecodeGenerator::emitPushWithScope):
(JSC::BytecodeGenerator::emitGetParentScope):
(JSC::BytecodeGenerator::emitDebugHook):
(JSC::BytecodeGenerator::emitCatch):
(JSC::BytecodeGenerator::emitThrow):
(JSC::BytecodeGenerator::emitArgumentCount):
(JSC::BytecodeGenerator::emitThrowStaticError):
(JSC::BytecodeGenerator::beginSwitch):
(JSC::prepareJumpTableForSwitch):
(JSC::prepareJumpTableForStringSwitch):
(JSC::BytecodeGenerator::endSwitch):
(JSC::BytecodeGenerator::emitGetEnumerableLength):
(JSC::BytecodeGenerator::emitHasGenericProperty):
(JSC::BytecodeGenerator::emitHasIndexedProperty):
(JSC::BytecodeGenerator::emitHasStructureProperty):
(JSC::BytecodeGenerator::emitGetPropertyEnumerator):
(JSC::BytecodeGenerator::emitEnumeratorStructurePropertyName):
(JSC::BytecodeGenerator::emitEnumeratorGenericPropertyName):
(JSC::BytecodeGenerator::emitToIndexString):
(JSC::BytecodeGenerator::emitIsCellWithType):
(JSC::BytecodeGenerator::emitIsObject):
(JSC::BytecodeGenerator::emitIsNumber):
(JSC::BytecodeGenerator::emitIsUndefined):
(JSC::BytecodeGenerator::emitIsEmpty):
(JSC::BytecodeGenerator::emitRestParameter):
(JSC::BytecodeGenerator::emitRequireObjectCoercible):
(JSC::BytecodeGenerator::emitYieldPoint):
(JSC::BytecodeGenerator::emitYield):
(JSC::BytecodeGenerator::emitGetAsyncIterator):
(JSC::BytecodeGenerator::emitDelegateYield):
(JSC::BytecodeGenerator::emitFinallyCompletion):
(JSC::BytecodeGenerator::emitJumpIf):
(JSC::ForInContext::finalize):
(JSC::StructureForInContext::finalize):
(JSC::IndexedForInContext::finalize):
(JSC::StaticPropertyAnalysis::record):
(JSC::BytecodeGenerator::emitToThis):
* bytecompiler/BytecodeGenerator.h:
(JSC::StructureForInContext::addGetInst):
(JSC::BytecodeGenerator::recordOpcode):
(JSC::BytecodeGenerator::addMetadataFor):
(JSC::BytecodeGenerator::emitUnaryOp):
(JSC::BytecodeGenerator::kill):
(JSC::BytecodeGenerator::instructions const):
(JSC::BytecodeGenerator::write):
(JSC::BytecodeGenerator::withWriter):
* bytecompiler/Label.h:
(JSC::Label::Label):
(JSC::Label::bind):
* bytecompiler/NodesCodegen.cpp:
(JSC::ArrayNode::emitBytecode):
(JSC::BytecodeIntrinsicNode::emit_intrinsic_argumentCount):
(JSC::ApplyFunctionCallDotNode::emitBytecode):
(JSC::BitwiseNotNode::emitBytecode):
(JSC::BinaryOpNode::emitBytecode):
(JSC::EqualNode::emitBytecode):
(JSC::StrictEqualNode::emitBytecode):
(JSC::emitReadModifyAssignment):
(JSC::ForInNode::emitBytecode):
(JSC::CaseBlockNode::emitBytecodeForBlock):
(JSC::FunctionNode::emitBytecode):
(JSC::ClassExprNode::emitBytecode):
* bytecompiler/ProfileTypeBytecodeFlag.cpp: Copied from Source/JavaScriptCore/bytecode/VirtualRegister.cpp.
(WTF::printInternal):
* bytecompiler/ProfileTypeBytecodeFlag.h: Copied from Source/JavaScriptCore/bytecode/SpecialPointer.cpp.
* bytecompiler/RegisterID.h:
* bytecompiler/StaticPropertyAnalysis.h:
(JSC::StaticPropertyAnalysis::create):
(JSC::StaticPropertyAnalysis::StaticPropertyAnalysis):
* bytecompiler/StaticPropertyAnalyzer.h:
(JSC::StaticPropertyAnalyzer::createThis):
(JSC::StaticPropertyAnalyzer::newObject):
(JSC::StaticPropertyAnalyzer::putById):
(JSC::StaticPropertyAnalyzer::mov):
(JSC::StaticPropertyAnalyzer::kill):
* dfg/DFGByteCodeParser.cpp:
(JSC::DFG::ByteCodeParser::addCall):
(JSC::DFG::ByteCodeParser::getPredictionWithoutOSRExit):
(JSC::DFG::ByteCodeParser::getArrayMode):
(JSC::DFG::ByteCodeParser::handleCall):
(JSC::DFG::ByteCodeParser::handleVarargsCall):
(JSC::DFG::ByteCodeParser::handleRecursiveTailCall):
(JSC::DFG::ByteCodeParser::inlineCall):
(JSC::DFG::ByteCodeParser::handleCallVariant):
(JSC::DFG::ByteCodeParser::handleVarargsInlining):
(JSC::DFG::ByteCodeParser::handleInlining):
(JSC::DFG::ByteCodeParser::handleMinMax):
(JSC::DFG::ByteCodeParser::handleIntrinsicCall):
(JSC::DFG::ByteCodeParser::handleDOMJITCall):
(JSC::DFG::ByteCodeParser::handleIntrinsicGetter):
(JSC::DFG::ByteCodeParser::handleDOMJITGetter):
(JSC::DFG::ByteCodeParser::handleModuleNamespaceLoad):
(JSC::DFG::ByteCodeParser::handleTypedArrayConstructor):
(JSC::DFG::ByteCodeParser::handleConstantInternalFunction):
(JSC::DFG::ByteCodeParser::handleGetById):
(JSC::DFG::ByteCodeParser::handlePutById):
(JSC::DFG::ByteCodeParser::parseGetById):
(JSC::DFG::ByteCodeParser::parseBlock):
(JSC::DFG::ByteCodeParser::parseCodeBlock):
(JSC::DFG::ByteCodeParser::handlePutByVal):
(JSC::DFG::ByteCodeParser::handlePutAccessorById):
(JSC::DFG::ByteCodeParser::handlePutAccessorByVal):
(JSC::DFG::ByteCodeParser::handleNewFunc):
(JSC::DFG::ByteCodeParser::handleNewFuncExp):
(JSC::DFG::ByteCodeParser::parse):
* dfg/DFGCapabilities.cpp:
(JSC::DFG::capabilityLevel):
* dfg/DFGCapabilities.h:
(JSC::DFG::capabilityLevel):
* dfg/DFGOSREntry.cpp:
(JSC::DFG::prepareCatchOSREntry):
* dfg/DFGSpeculativeJIT.cpp:
(JSC::DFG::SpeculativeJIT::compileValueAdd):
(JSC::DFG::SpeculativeJIT::compileValueSub):
(JSC::DFG::SpeculativeJIT::compileValueNegate):
(JSC::DFG::SpeculativeJIT::compileArithMul):
* ftl/FTLLowerDFGToB3.cpp:
(JSC::FTL::DFG::LowerDFGToB3::compileValueAdd):
(JSC::FTL::DFG::LowerDFGToB3::compileValueSub):
(JSC::FTL::DFG::LowerDFGToB3::compileUnaryMathIC):
(JSC::FTL::DFG::LowerDFGToB3::compileBinaryMathIC):
(JSC::FTL::DFG::LowerDFGToB3::compileArithAddOrSub):
(JSC::FTL::DFG::LowerDFGToB3::compileArithMul):
(JSC::FTL::DFG::LowerDFGToB3::compileValueNegate):
* ftl/FTLOperations.cpp:
(JSC::FTL::operationMaterializeObjectInOSR):
* generate-bytecode-files: Removed.
* generator/Argument.rb: Added.
* generator/Assertion.rb: Added.
* generator/DSL.rb: Added.
* generator/Fits.rb: Added.
* generator/GeneratedFile.rb: Added.
* generator/Metadata.rb: Added.
* generator/Opcode.rb: Added.
* generator/OpcodeGroup.rb: Added.
* generator/Options.rb: Added.
* generator/Section.rb: Added.
* generator/Template.rb: Added.
* generator/Type.rb: Added.
* generator/main.rb: Added.
* interpreter/AbstractPC.h:
* interpreter/CallFrame.cpp:
(JSC::CallFrame::currentVPC const):
(JSC::CallFrame::setCurrentVPC):
* interpreter/CallFrame.h:
(JSC::CallSiteIndex::CallSiteIndex):
(JSC::ExecState::setReturnPC):
* interpreter/Interpreter.cpp:
(WTF::printInternal):
* interpreter/Interpreter.h:
* interpreter/InterpreterInlines.h:
* interpreter/StackVisitor.cpp:
(JSC::StackVisitor::Frame::dump const):
* interpreter/VMEntryRecord.h:
* jit/JIT.cpp:
(JSC::JIT::JIT):
(JSC::JIT::emitSlowCaseCall):
(JSC::JIT::privateCompileMainPass):
(JSC::JIT::privateCompileSlowCases):
(JSC::JIT::compileWithoutLinking):
(JSC::JIT::link):
* jit/JIT.h:
* jit/JITArithmetic.cpp:
(JSC::JIT::emit_op_jless):
(JSC::JIT::emit_op_jlesseq):
(JSC::JIT::emit_op_jgreater):
(JSC::JIT::emit_op_jgreatereq):
(JSC::JIT::emit_op_jnless):
(JSC::JIT::emit_op_jnlesseq):
(JSC::JIT::emit_op_jngreater):
(JSC::JIT::emit_op_jngreatereq):
(JSC::JIT::emitSlow_op_jless):
(JSC::JIT::emitSlow_op_jlesseq):
(JSC::JIT::emitSlow_op_jgreater):
(JSC::JIT::emitSlow_op_jgreatereq):
(JSC::JIT::emitSlow_op_jnless):
(JSC::JIT::emitSlow_op_jnlesseq):
(JSC::JIT::emitSlow_op_jngreater):
(JSC::JIT::emitSlow_op_jngreatereq):
(JSC::JIT::emit_op_below):
(JSC::JIT::emit_op_beloweq):
(JSC::JIT::emit_op_jbelow):
(JSC::JIT::emit_op_jbeloweq):
(JSC::JIT::emit_op_unsigned):
(JSC::JIT::emit_compareAndJump):
(JSC::JIT::emit_compareUnsignedAndJump):
(JSC::JIT::emit_compareUnsigned):
(JSC::JIT::emit_compareAndJumpSlow):
(JSC::JIT::emit_op_inc):
(JSC::JIT::emit_op_dec):
(JSC::JIT::emit_op_mod):
(JSC::JIT::emitSlow_op_mod):
(JSC::JIT::emit_op_negate):
(JSC::JIT::emitSlow_op_negate):
(JSC::JIT::emitBitBinaryOpFastPath):
(JSC::JIT::emit_op_bitand):
(JSC::JIT::emit_op_bitor):
(JSC::JIT::emit_op_bitxor):
(JSC::JIT::emit_op_lshift):
(JSC::JIT::emitRightShiftFastPath):
(JSC::JIT::emit_op_rshift):
(JSC::JIT::emit_op_urshift):
(JSC::getOperandTypes):
(JSC::JIT::emit_op_add):
(JSC::JIT::emitSlow_op_add):
(JSC::JIT::emitMathICFast):
(JSC::JIT::emitMathICSlow):
(JSC::JIT::emit_op_div):
(JSC::JIT::emit_op_mul):
(JSC::JIT::emitSlow_op_mul):
(JSC::JIT::emit_op_sub):
(JSC::JIT::emitSlow_op_sub):
* jit/JITCall.cpp:
(JSC::JIT::emitPutCallResult):
(JSC::JIT::compileSetupFrame):
(JSC::JIT::compileCallEval):
(JSC::JIT::compileCallEvalSlowCase):
(JSC::JIT::compileTailCall):
(JSC::JIT::compileOpCall):
(JSC::JIT::compileOpCallSlowCase):
(JSC::JIT::emit_op_call):
(JSC::JIT::emit_op_tail_call):
(JSC::JIT::emit_op_call_eval):
(JSC::JIT::emit_op_call_varargs):
(JSC::JIT::emit_op_tail_call_varargs):
(JSC::JIT::emit_op_tail_call_forward_arguments):
(JSC::JIT::emit_op_construct_varargs):
(JSC::JIT::emit_op_construct):
(JSC::JIT::emitSlow_op_call):
(JSC::JIT::emitSlow_op_tail_call):
(JSC::JIT::emitSlow_op_call_eval):
(JSC::JIT::emitSlow_op_call_varargs):
(JSC::JIT::emitSlow_op_tail_call_varargs):
(JSC::JIT::emitSlow_op_tail_call_forward_arguments):
(JSC::JIT::emitSlow_op_construct_varargs):
(JSC::JIT::emitSlow_op_construct):
* jit/JITDisassembler.cpp:
(JSC::JITDisassembler::JITDisassembler):
* jit/JITExceptions.cpp:
(JSC::genericUnwind):
* jit/JITInlines.h:
(JSC::JIT::emitDoubleGetByVal):
(JSC::JIT::emitLoadForArrayMode):
(JSC::JIT::emitContiguousGetByVal):
(JSC::JIT::emitArrayStorageGetByVal):
(JSC::JIT::appendCallWithExceptionCheckSetJSValueResultWithProfile):
(JSC::JIT::sampleInstruction):
(JSC::JIT::emitValueProfilingSiteIfProfiledOpcode):
(JSC::JIT::emitValueProfilingSite):
(JSC::JIT::jumpTarget):
(JSC::JIT::copiedGetPutInfo):
(JSC::JIT::copiedArithProfile):
* jit/JITMathIC.h:
(JSC::isProfileEmpty):
(JSC::JITBinaryMathIC::JITBinaryMathIC):
(JSC::JITUnaryMathIC::JITUnaryMathIC):
* jit/JITOpcodes.cpp:
(JSC::JIT::emit_op_mov):
(JSC::JIT::emit_op_end):
(JSC::JIT::emit_op_jmp):
(JSC::JIT::emit_op_new_object):
(JSC::JIT::emitSlow_op_new_object):
(JSC::JIT::emit_op_overrides_has_instance):
(JSC::JIT::emit_op_instanceof):
(JSC::JIT::emitSlow_op_instanceof):
(JSC::JIT::emit_op_instanceof_custom):
(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_ret):
(JSC::JIT::emit_op_to_primitive):
(JSC::JIT::emit_op_set_function_name):
(JSC::JIT::emit_op_not):
(JSC::JIT::emit_op_jfalse):
(JSC::JIT::emit_op_jeq_null):
(JSC::JIT::emit_op_jneq_null):
(JSC::JIT::emit_op_jneq_ptr):
(JSC::JIT::emit_op_eq):
(JSC::JIT::emit_op_jeq):
(JSC::JIT::emit_op_jtrue):
(JSC::JIT::emit_op_neq):
(JSC::JIT::emit_op_jneq):
(JSC::JIT::emit_op_throw):
(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::emit_op_to_number):
(JSC::JIT::emit_op_to_string):
(JSC::JIT::emit_op_to_object):
(JSC::JIT::emit_op_catch):
(JSC::JIT::emit_op_identity_with_profile):
(JSC::JIT::emit_op_get_parent_scope):
(JSC::JIT::emit_op_switch_imm):
(JSC::JIT::emit_op_switch_char):
(JSC::JIT::emit_op_switch_string):
(JSC::JIT::emit_op_debug):
(JSC::JIT::emit_op_eq_null):
(JSC::JIT::emit_op_neq_null):
(JSC::JIT::emit_op_enter):
(JSC::JIT::emit_op_get_scope):
(JSC::JIT::emit_op_to_this):
(JSC::JIT::emit_op_create_this):
(JSC::JIT::emit_op_check_tdz):
(JSC::JIT::emitSlow_op_eq):
(JSC::JIT::emitSlow_op_neq):
(JSC::JIT::emitSlow_op_jeq):
(JSC::JIT::emitSlow_op_jneq):
(JSC::JIT::emitSlow_op_instanceof_custom):
(JSC::JIT::emit_op_loop_hint):
(JSC::JIT::emitSlow_op_loop_hint):
(JSC::JIT::emit_op_check_traps):
(JSC::JIT::emit_op_nop):
(JSC::JIT::emit_op_super_sampler_begin):
(JSC::JIT::emit_op_super_sampler_end):
(JSC::JIT::emitSlow_op_check_traps):
(JSC::JIT::emit_op_new_regexp):
(JSC::JIT::emitNewFuncCommon):
(JSC::JIT::emit_op_new_func):
(JSC::JIT::emit_op_new_generator_func):
(JSC::JIT::emit_op_new_async_generator_func):
(JSC::JIT::emit_op_new_async_func):
(JSC::JIT::emitNewFuncExprCommon):
(JSC::JIT::emit_op_new_func_exp):
(JSC::JIT::emit_op_new_generator_func_exp):
(JSC::JIT::emit_op_new_async_func_exp):
(JSC::JIT::emit_op_new_async_generator_func_exp):
(JSC::JIT::emit_op_new_array):
(JSC::JIT::emit_op_new_array_with_size):
(JSC::JIT::emit_op_has_structure_property):
(JSC::JIT::privateCompileHasIndexedProperty):
(JSC::JIT::emit_op_has_indexed_property):
(JSC::JIT::emitSlow_op_has_indexed_property):
(JSC::JIT::emit_op_get_direct_pname):
(JSC::JIT::emit_op_enumerator_structure_pname):
(JSC::JIT::emit_op_enumerator_generic_pname):
(JSC::JIT::emit_op_profile_type):
(JSC::JIT::emit_op_log_shadow_chicken_prologue):
(JSC::JIT::emit_op_log_shadow_chicken_tail):
(JSC::JIT::emit_op_profile_control_flow):
(JSC::JIT::emit_op_argument_count):
(JSC::JIT::emit_op_get_rest_length):
(JSC::JIT::emit_op_get_argument):
* jit/JITOpcodes32_64.cpp:
(JSC::JIT::emit_op_to_this):
* jit/JITOperations.cpp:
* jit/JITOperations.h:
* jit/JITPropertyAccess.cpp:
(JSC::JIT::emit_op_get_by_val):
(JSC::JIT::emitGetByValWithCachedId):
(JSC::JIT::emitSlow_op_get_by_val):
(JSC::JIT::emit_op_put_by_val_direct):
(JSC::JIT::emit_op_put_by_val):
(JSC::JIT::emitGenericContiguousPutByVal):
(JSC::JIT::emitArrayStoragePutByVal):
(JSC::JIT::emitPutByValWithCachedId):
(JSC::JIT::emitSlow_op_put_by_val):
(JSC::JIT::emit_op_put_getter_by_id):
(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::emit_op_try_get_by_id):
(JSC::JIT::emitSlow_op_try_get_by_id):
(JSC::JIT::emit_op_get_by_id_direct):
(JSC::JIT::emitSlow_op_get_by_id_direct):
(JSC::JIT::emit_op_get_by_id):
(JSC::JIT::emit_op_get_by_id_with_this):
(JSC::JIT::emitSlow_op_get_by_id):
(JSC::JIT::emitSlow_op_get_by_id_with_this):
(JSC::JIT::emit_op_put_by_id):
(JSC::JIT::emitSlow_op_put_by_id):
(JSC::JIT::emit_op_in_by_id):
(JSC::JIT::emitSlow_op_in_by_id):
(JSC::JIT::emit_op_resolve_scope):
(JSC::JIT::emit_op_get_from_scope):
(JSC::JIT::emitSlow_op_get_from_scope):
(JSC::JIT::emit_op_put_to_scope):
(JSC::JIT::emitSlow_op_put_to_scope):
(JSC::JIT::emit_op_get_from_arguments):
(JSC::JIT::emit_op_put_to_arguments):
(JSC::JIT::privateCompileGetByVal):
(JSC::JIT::privateCompileGetByValWithCachedId):
(JSC::JIT::privateCompilePutByVal):
(JSC::JIT::privateCompilePutByValWithCachedId):
(JSC::JIT::emitDoubleLoad):
(JSC::JIT::emitContiguousLoad):
(JSC::JIT::emitArrayStorageLoad):
(JSC::JIT::emitDirectArgumentsGetByVal):
(JSC::JIT::emitScopedArgumentsGetByVal):
(JSC::JIT::emitIntTypedArrayGetByVal):
(JSC::JIT::emitFloatTypedArrayGetByVal):
(JSC::JIT::emitIntTypedArrayPutByVal):
(JSC::JIT::emitFloatTypedArrayPutByVal):
* jit/RegisterSet.cpp:
(JSC::RegisterSet::llintBaselineCalleeSaveRegisters):
* jit/SlowPathCall.h:
(JSC::JITSlowPathCall::JITSlowPathCall):
* llint/LLIntData.cpp:
(JSC::LLInt::initialize):
(JSC::LLInt::Data::performAssertions):
* llint/LLIntData.h:
(JSC::LLInt::exceptionInstructions):
(JSC::LLInt::opcodeMap):
(JSC::LLInt::opcodeMapWide):
(JSC::LLInt::getOpcode):
(JSC::LLInt::getOpcodeWide):
(JSC::LLInt::getWideCodePtr):
* llint/LLIntOffsetsExtractor.cpp:
* llint/LLIntSlowPaths.cpp:
(JSC::LLInt::llint_trace_operand):
(JSC::LLInt::llint_trace_value):
(JSC::LLInt::LLINT_SLOW_PATH_DECL):
(JSC::LLInt::entryOSR):
(JSC::LLInt::setupGetByIdPrototypeCache):
(JSC::LLInt::getByVal):
(JSC::LLInt::handleHostCall):
(JSC::LLInt::setUpCall):
(JSC::LLInt::genericCall):
(JSC::LLInt::varargsSetup):
(JSC::LLInt::commonCallEval):
* llint/LLIntSlowPaths.h:
* llint/LowLevelInterpreter.asm:
* llint/LowLevelInterpreter.cpp:
(JSC::CLoopRegister::operator const Instruction*):
(JSC::CLoop::execute):
* llint/LowLevelInterpreter32_64.asm:
* llint/LowLevelInterpreter64.asm:
* offlineasm/arm64.rb:
* offlineasm/asm.rb:
* offlineasm/ast.rb:
* offlineasm/cloop.rb:
* offlineasm/generate_offset_extractor.rb:
* offlineasm/instructions.rb:
* offlineasm/offsets.rb:
* offlineasm/parser.rb:
* offlineasm/transform.rb:
* offlineasm/x86.rb:
* parser/ResultType.h:
(JSC::ResultType::dump const):
(JSC::OperandTypes::first const):
(JSC::OperandTypes::second const):
(JSC::OperandTypes::dump const):
* profiler/ProfilerBytecodeSequence.cpp:
(JSC::Profiler::BytecodeSequence::BytecodeSequence):
* runtime/CommonSlowPaths.cpp:
(JSC::SLOW_PATH_DECL):
(JSC::updateArithProfileForUnaryArithOp):
(JSC::updateArithProfileForBinaryArithOp):
* runtime/CommonSlowPaths.h:
(JSC::CommonSlowPaths::tryCachePutToScopeGlobal):
(JSC::CommonSlowPaths::tryCacheGetFromScopeGlobal):
* runtime/ExceptionFuzz.cpp:
(JSC::doExceptionFuzzing):
* runtime/ExceptionFuzz.h:
(JSC::doExceptionFuzzingIfEnabled):
* runtime/GetPutInfo.cpp: Copied from Source/JavaScriptCore/bytecode/SpecialPointer.cpp.
(JSC::GetPutInfo::dump const):
(WTF::printInternal):
* runtime/GetPutInfo.h:
(JSC::GetPutInfo::operand const):
* runtime/JSCPoison.h:
* runtime/JSType.cpp: Added.
(WTF::printInternal):
* runtime/JSType.h:
* runtime/SamplingProfiler.cpp:
(JSC::SamplingProfiler::StackFrame::displayName):
* runtime/SamplingProfiler.h:
(JSC::SamplingProfiler::UnprocessedStackFrame::UnprocessedStackFrame):
* runtime/SlowPathReturnType.h:
(JSC::encodeResult):
(JSC::decodeResult):
* runtime/VM.h:
* runtime/Watchdog.h:
* tools/HeapVerifier.cpp:

Source/WTF:

* wtf/Forward.h: Fix WTF_LAZY_FOR_EACH_TERM on MSVC and add WTF_LAZY_HAS_REST to check whether
a macro was passed multiple arguments
* wtf/Platform.h: Force ENABLE_JIT=false on all 32-bit platforms
* wtf/Vector.h:
(WTF::minCapacity>::insertVector): Allow vectors with different overflow handlers to be passed to insertVector

Tools:

Do not force ENABLE_JIT=true when $forceCLoop is false.

* Scripts/build-jsc:

LayoutTests:

Don't use recursion on `equal` to avoid premature stack overflows when testing deep arrays.

* fast/dom/Window/resources/postmessage-test.js:

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@237479 268f45cc-cd09-0410-ab3c-d52691b4dbfc

157 files changed:
ChangeLog
JSTests/ChangeLog
JSTests/stress/maximum-inline-capacity.js [new file with mode: 0644]
LayoutTests/ChangeLog
LayoutTests/fast/dom/Window/resources/postmessage-test.js
Source/JavaScriptCore/CMakeLists.txt
Source/JavaScriptCore/ChangeLog
Source/JavaScriptCore/DerivedSources.make
Source/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj
Source/JavaScriptCore/Sources.txt
Source/JavaScriptCore/assembler/MacroAssemblerCodeRef.h
Source/JavaScriptCore/bytecode/ArithProfile.h
Source/JavaScriptCore/bytecode/ArrayAllocationProfile.h
Source/JavaScriptCore/bytecode/ArrayProfile.h
Source/JavaScriptCore/bytecode/BytecodeBasicBlock.cpp
Source/JavaScriptCore/bytecode/BytecodeBasicBlock.h
Source/JavaScriptCore/bytecode/BytecodeDumper.cpp
Source/JavaScriptCore/bytecode/BytecodeDumper.h
Source/JavaScriptCore/bytecode/BytecodeGeneratorification.cpp
Source/JavaScriptCore/bytecode/BytecodeGeneratorification.h
Source/JavaScriptCore/bytecode/BytecodeGraph.h
Source/JavaScriptCore/bytecode/BytecodeKills.h
Source/JavaScriptCore/bytecode/BytecodeList.json [deleted file]
Source/JavaScriptCore/bytecode/BytecodeList.rb [new file with mode: 0644]
Source/JavaScriptCore/bytecode/BytecodeLivenessAnalysis.cpp
Source/JavaScriptCore/bytecode/BytecodeLivenessAnalysis.h
Source/JavaScriptCore/bytecode/BytecodeLivenessAnalysisInlines.h
Source/JavaScriptCore/bytecode/BytecodeRewriter.cpp
Source/JavaScriptCore/bytecode/BytecodeRewriter.h
Source/JavaScriptCore/bytecode/BytecodeUseDef.h
Source/JavaScriptCore/bytecode/CallLinkStatus.cpp
Source/JavaScriptCore/bytecode/CodeBlock.cpp
Source/JavaScriptCore/bytecode/CodeBlock.h
Source/JavaScriptCore/bytecode/CodeBlockInlines.h [new file with mode: 0644]
Source/JavaScriptCore/bytecode/Fits.h [new file with mode: 0644]
Source/JavaScriptCore/bytecode/GetByIdMetadata.h [new file with mode: 0644]
Source/JavaScriptCore/bytecode/GetByIdStatus.cpp
Source/JavaScriptCore/bytecode/Instruction.h
Source/JavaScriptCore/bytecode/InstructionStream.cpp [new file with mode: 0644]
Source/JavaScriptCore/bytecode/InstructionStream.h [new file with mode: 0644]
Source/JavaScriptCore/bytecode/LLIntPrototypeLoadAdaptiveStructureWatchpoint.cpp
Source/JavaScriptCore/bytecode/LLIntPrototypeLoadAdaptiveStructureWatchpoint.h
Source/JavaScriptCore/bytecode/MetadataTable.cpp [new file with mode: 0644]
Source/JavaScriptCore/bytecode/MetadataTable.h [new file with mode: 0644]
Source/JavaScriptCore/bytecode/Opcode.cpp
Source/JavaScriptCore/bytecode/Opcode.h
Source/JavaScriptCore/bytecode/OpcodeInlines.h
Source/JavaScriptCore/bytecode/OpcodeSize.h [new file with mode: 0644]
Source/JavaScriptCore/bytecode/PreciseJumpTargets.cpp
Source/JavaScriptCore/bytecode/PreciseJumpTargets.h
Source/JavaScriptCore/bytecode/PreciseJumpTargetsInlines.h
Source/JavaScriptCore/bytecode/PutByIdStatus.cpp
Source/JavaScriptCore/bytecode/SpecialPointer.cpp
Source/JavaScriptCore/bytecode/SpecialPointer.h
Source/JavaScriptCore/bytecode/UnlinkedCodeBlock.cpp
Source/JavaScriptCore/bytecode/UnlinkedCodeBlock.h
Source/JavaScriptCore/bytecode/UnlinkedInstructionStream.cpp [deleted file]
Source/JavaScriptCore/bytecode/UnlinkedInstructionStream.h [deleted file]
Source/JavaScriptCore/bytecode/UnlinkedMetadataTable.h [new file with mode: 0644]
Source/JavaScriptCore/bytecode/UnlinkedMetadataTableInlines.h [new file with mode: 0644]
Source/JavaScriptCore/bytecode/VirtualRegister.cpp
Source/JavaScriptCore/bytecode/VirtualRegister.h
Source/JavaScriptCore/bytecompiler/BytecodeGenerator.cpp
Source/JavaScriptCore/bytecompiler/BytecodeGenerator.h
Source/JavaScriptCore/bytecompiler/Label.h
Source/JavaScriptCore/bytecompiler/NodesCodegen.cpp
Source/JavaScriptCore/bytecompiler/ProfileTypeBytecodeFlag.cpp [new file with mode: 0644]
Source/JavaScriptCore/bytecompiler/ProfileTypeBytecodeFlag.h [new file with mode: 0644]
Source/JavaScriptCore/bytecompiler/RegisterID.h
Source/JavaScriptCore/bytecompiler/StaticPropertyAnalysis.h
Source/JavaScriptCore/bytecompiler/StaticPropertyAnalyzer.h
Source/JavaScriptCore/dfg/DFGByteCodeParser.cpp
Source/JavaScriptCore/dfg/DFGCapabilities.cpp
Source/JavaScriptCore/dfg/DFGCapabilities.h
Source/JavaScriptCore/dfg/DFGOSREntry.cpp
Source/JavaScriptCore/dfg/DFGSpeculativeJIT.cpp
Source/JavaScriptCore/ftl/FTLLowerDFGToB3.cpp
Source/JavaScriptCore/ftl/FTLOperations.cpp
Source/JavaScriptCore/generate-bytecode-files [deleted file]
Source/JavaScriptCore/generator/Argument.rb [new file with mode: 0644]
Source/JavaScriptCore/generator/Assertion.rb [new file with mode: 0644]
Source/JavaScriptCore/generator/DSL.rb [new file with mode: 0644]
Source/JavaScriptCore/generator/Fits.rb [new file with mode: 0644]
Source/JavaScriptCore/generator/GeneratedFile.rb [new file with mode: 0644]
Source/JavaScriptCore/generator/Metadata.rb [new file with mode: 0644]
Source/JavaScriptCore/generator/Opcode.rb [new file with mode: 0644]
Source/JavaScriptCore/generator/OpcodeGroup.rb [new file with mode: 0644]
Source/JavaScriptCore/generator/Options.rb [new file with mode: 0644]
Source/JavaScriptCore/generator/Section.rb [new file with mode: 0644]
Source/JavaScriptCore/generator/Template.rb [new file with mode: 0644]
Source/JavaScriptCore/generator/Type.rb [new file with mode: 0644]
Source/JavaScriptCore/generator/main.rb [new file with mode: 0644]
Source/JavaScriptCore/interpreter/AbstractPC.h
Source/JavaScriptCore/interpreter/CallFrame.cpp
Source/JavaScriptCore/interpreter/CallFrame.h
Source/JavaScriptCore/interpreter/Interpreter.cpp
Source/JavaScriptCore/interpreter/Interpreter.h
Source/JavaScriptCore/interpreter/InterpreterInlines.h
Source/JavaScriptCore/interpreter/StackVisitor.cpp
Source/JavaScriptCore/interpreter/VMEntryRecord.h
Source/JavaScriptCore/jit/JIT.cpp
Source/JavaScriptCore/jit/JIT.h
Source/JavaScriptCore/jit/JITArithmetic.cpp
Source/JavaScriptCore/jit/JITCall.cpp
Source/JavaScriptCore/jit/JITDisassembler.cpp
Source/JavaScriptCore/jit/JITExceptions.cpp
Source/JavaScriptCore/jit/JITInlines.h
Source/JavaScriptCore/jit/JITMathIC.h
Source/JavaScriptCore/jit/JITOpcodes.cpp
Source/JavaScriptCore/jit/JITOpcodes32_64.cpp
Source/JavaScriptCore/jit/JITOperations.cpp
Source/JavaScriptCore/jit/JITOperations.h
Source/JavaScriptCore/jit/JITPropertyAccess.cpp
Source/JavaScriptCore/jit/RegisterSet.cpp
Source/JavaScriptCore/jit/SlowPathCall.h
Source/JavaScriptCore/llint/LLIntData.cpp
Source/JavaScriptCore/llint/LLIntData.h
Source/JavaScriptCore/llint/LLIntOffsetsExtractor.cpp
Source/JavaScriptCore/llint/LLIntSlowPaths.cpp
Source/JavaScriptCore/llint/LLIntSlowPaths.h
Source/JavaScriptCore/llint/LowLevelInterpreter.asm
Source/JavaScriptCore/llint/LowLevelInterpreter.cpp
Source/JavaScriptCore/llint/LowLevelInterpreter32_64.asm
Source/JavaScriptCore/llint/LowLevelInterpreter64.asm
Source/JavaScriptCore/offlineasm/arm64.rb
Source/JavaScriptCore/offlineasm/asm.rb
Source/JavaScriptCore/offlineasm/ast.rb
Source/JavaScriptCore/offlineasm/cloop.rb
Source/JavaScriptCore/offlineasm/generate_offset_extractor.rb
Source/JavaScriptCore/offlineasm/instructions.rb
Source/JavaScriptCore/offlineasm/parser.rb
Source/JavaScriptCore/offlineasm/transform.rb
Source/JavaScriptCore/offlineasm/x86.rb
Source/JavaScriptCore/parser/ResultType.h
Source/JavaScriptCore/profiler/ProfilerBytecodeSequence.cpp
Source/JavaScriptCore/runtime/CommonSlowPaths.cpp
Source/JavaScriptCore/runtime/CommonSlowPaths.h
Source/JavaScriptCore/runtime/ExceptionFuzz.cpp
Source/JavaScriptCore/runtime/ExceptionFuzz.h
Source/JavaScriptCore/runtime/GetPutInfo.cpp [new file with mode: 0644]
Source/JavaScriptCore/runtime/GetPutInfo.h
Source/JavaScriptCore/runtime/JSCPoison.h
Source/JavaScriptCore/runtime/JSType.cpp [new file with mode: 0644]
Source/JavaScriptCore/runtime/JSType.h
Source/JavaScriptCore/runtime/SamplingProfiler.cpp
Source/JavaScriptCore/runtime/SamplingProfiler.h
Source/JavaScriptCore/runtime/SlowPathReturnType.h
Source/JavaScriptCore/runtime/VM.h
Source/JavaScriptCore/runtime/Watchdog.h
Source/JavaScriptCore/tools/HeapVerifier.cpp
Source/WTF/ChangeLog
Source/WTF/wtf/Forward.h
Source/WTF/wtf/Platform.h
Source/WTF/wtf/Vector.h
Source/cmake/WebKitFeatures.cmake
Tools/ChangeLog
Tools/Scripts/build-jsc

index 5dc6a1b..2d1ccac 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,15 @@
+2018-10-26  Tadeu Zagallo  <tzagallo@apple.com>
+
+        New bytecode format for JSC
+        https://bugs.webkit.org/show_bug.cgi?id=187373
+        <rdar://problem/44186758>
+
+        Reviewed by Filip Pizlo.
+
+        Disable JIT by default on 32-bit platforms
+
+        * Source/cmake/WebKitFeatures.cmake:
+
 2018-10-25  Michael Catanzaro  <mcatanzaro@igalia.com>
 
         [GTK] Reenable the sandbox
index 40fdee9..bfeffbe 100644 (file)
@@ -1,3 +1,18 @@
+2018-10-26  Tadeu Zagallo  <tzagallo@apple.com>
+
+        New bytecode format for JSC
+        https://bugs.webkit.org/show_bug.cgi?id=187373
+        <rdar://problem/44186758>
+
+        Reviewed by Filip Pizlo.
+
+        Add tests to ensure that the inferred inline capacity for a narrow op_new_object will be capped at 255.
+
+        * stress/maximum-inline-capacity.js: Added.
+        (test1):
+        (test3.Foo):
+        (test3):
+
 2018-10-26  Mark Lam  <mark.lam@apple.com>
 
         Fix missing edge cases with JSGlobalObjects having a bad time.
diff --git a/JSTests/stress/maximum-inline-capacity.js b/JSTests/stress/maximum-inline-capacity.js
new file mode 100644 (file)
index 0000000..9b2a9d2
--- /dev/null
@@ -0,0 +1,3020 @@
+// test maximum inline capacity inferred for narrow instructions
+
+function test1() {
+    ({
+        property1: 1,
+        property2: 2,
+        property3: 3,
+        property4: 4,
+        property5: 5,
+        property6: 6,
+        property7: 7,
+        property8: 8,
+        property9: 9,
+        property10: 10,
+        property11: 11,
+        property12: 12,
+        property13: 13,
+        property14: 14,
+        property15: 15,
+        property16: 16,
+        property17: 17,
+        property18: 18,
+        property19: 19,
+        property20: 20,
+        property21: 21,
+        property22: 22,
+        property23: 23,
+        property24: 24,
+        property25: 25,
+        property26: 26,
+        property27: 27,
+        property28: 28,
+        property29: 29,
+        property30: 30,
+        property31: 31,
+        property32: 32,
+        property33: 33,
+        property34: 34,
+        property35: 35,
+        property36: 36,
+        property37: 37,
+        property38: 38,
+        property39: 39,
+        property40: 40,
+        property41: 41,
+        property42: 42,
+        property43: 43,
+        property44: 44,
+        property45: 45,
+        property46: 46,
+        property47: 47,
+        property48: 48,
+        property49: 49,
+        property50: 50,
+        property51: 51,
+        property52: 52,
+        property53: 53,
+        property54: 54,
+        property55: 55,
+        property56: 56,
+        property57: 57,
+        property58: 58,
+        property59: 59,
+        property60: 60,
+        property61: 61,
+        property62: 62,
+        property63: 63,
+        property64: 64,
+        property65: 65,
+        property66: 66,
+        property67: 67,
+        property68: 68,
+        property69: 69,
+        property70: 70,
+        property71: 71,
+        property72: 72,
+        property73: 73,
+        property74: 74,
+        property75: 75,
+        property76: 76,
+        property77: 77,
+        property78: 78,
+        property79: 79,
+        property80: 80,
+        property81: 81,
+        property82: 82,
+        property83: 83,
+        property84: 84,
+        property85: 85,
+        property86: 86,
+        property87: 87,
+        property88: 88,
+        property89: 89,
+        property90: 90,
+        property91: 91,
+        property92: 92,
+        property93: 93,
+        property94: 94,
+        property95: 95,
+        property96: 96,
+        property97: 97,
+        property98: 98,
+        property99: 99,
+        property100: 100,
+        property101: 101,
+        property102: 102,
+        property103: 103,
+        property104: 104,
+        property105: 105,
+        property106: 106,
+        property107: 107,
+        property108: 108,
+        property109: 109,
+        property110: 110,
+        property111: 111,
+        property112: 112,
+        property113: 113,
+        property114: 114,
+        property115: 115,
+        property116: 116,
+        property117: 117,
+        property118: 118,
+        property119: 119,
+        property120: 120,
+        property121: 121,
+        property122: 122,
+        property123: 123,
+        property124: 124,
+        property125: 125,
+        property126: 126,
+        property127: 127,
+        property128: 128,
+        property129: 129,
+        property130: 130,
+        property131: 131,
+        property132: 132,
+        property133: 133,
+        property134: 134,
+        property135: 135,
+        property136: 136,
+        property137: 137,
+        property138: 138,
+        property139: 139,
+        property140: 140,
+        property141: 141,
+        property142: 142,
+        property143: 143,
+        property144: 144,
+        property145: 145,
+        property146: 146,
+        property147: 147,
+        property148: 148,
+        property149: 149,
+        property150: 150,
+        property151: 151,
+        property152: 152,
+        property153: 153,
+        property154: 154,
+        property155: 155,
+        property156: 156,
+        property157: 157,
+        property158: 158,
+        property159: 159,
+        property160: 160,
+        property161: 161,
+        property162: 162,
+        property163: 163,
+        property164: 164,
+        property165: 165,
+        property166: 166,
+        property167: 167,
+        property168: 168,
+        property169: 169,
+        property170: 170,
+        property171: 171,
+        property172: 172,
+        property173: 173,
+        property174: 174,
+        property175: 175,
+        property176: 176,
+        property177: 177,
+        property178: 178,
+        property179: 179,
+        property180: 180,
+        property181: 181,
+        property182: 182,
+        property183: 183,
+        property184: 184,
+        property185: 185,
+        property186: 186,
+        property187: 187,
+        property188: 188,
+        property189: 189,
+        property190: 190,
+        property191: 191,
+        property192: 192,
+        property193: 193,
+        property194: 194,
+        property195: 195,
+        property196: 196,
+        property197: 197,
+        property198: 198,
+        property199: 199,
+        property200: 200,
+        property201: 201,
+        property202: 202,
+        property203: 203,
+        property204: 204,
+        property205: 205,
+        property206: 206,
+        property207: 207,
+        property208: 208,
+        property209: 209,
+        property210: 210,
+        property211: 211,
+        property212: 212,
+        property213: 213,
+        property214: 214,
+        property215: 215,
+        property216: 216,
+        property217: 217,
+        property218: 218,
+        property219: 219,
+        property220: 220,
+        property221: 221,
+        property222: 222,
+        property223: 223,
+        property224: 224,
+        property225: 225,
+        property226: 226,
+        property227: 227,
+        property228: 228,
+        property229: 229,
+        property230: 230,
+        property231: 231,
+        property232: 232,
+        property233: 233,
+        property234: 234,
+        property235: 235,
+        property236: 236,
+        property237: 237,
+        property238: 238,
+        property239: 239,
+        property240: 240,
+        property241: 241,
+        property242: 242,
+        property243: 243,
+        property244: 244,
+        property245: 245,
+        property246: 246,
+        property247: 247,
+        property248: 248,
+        property249: 249,
+        property250: 250,
+        property251: 251,
+        property252: 252,
+        property253: 253,
+        property254: 254,
+        property255: 255,
+        property256: 256,
+        property257: 257,
+        property258: 258,
+        property259: 259,
+        property260: 260,
+        property261: 261,
+        property262: 262,
+        property263: 263,
+        property264: 264,
+        property265: 265,
+        property266: 266,
+        property267: 267,
+        property268: 268,
+        property269: 269,
+        property270: 270,
+        property271: 271,
+        property272: 272,
+        property273: 273,
+        property274: 274,
+        property275: 275,
+        property276: 276,
+        property277: 277,
+        property278: 278,
+        property279: 279,
+        property280: 280,
+        property281: 281,
+        property282: 282,
+        property283: 283,
+        property284: 284,
+        property285: 285,
+        property286: 286,
+        property287: 287,
+        property288: 288,
+        property289: 289,
+        property290: 290,
+        property291: 291,
+        property292: 292,
+        property293: 293,
+        property294: 294,
+        property295: 295,
+        property296: 296,
+        property297: 297,
+        property298: 298,
+        property299: 299,
+        property300: 300,
+        property301: 301,
+        property302: 302,
+        property303: 303,
+        property304: 304,
+        property305: 305,
+        property306: 306,
+        property307: 307,
+        property308: 308,
+        property309: 309,
+        property310: 310,
+        property311: 311,
+        property312: 312,
+        property313: 313,
+        property314: 314,
+        property315: 315,
+        property316: 316,
+        property317: 317,
+        property318: 318,
+        property319: 319,
+        property320: 320,
+        property321: 321,
+        property322: 322,
+        property323: 323,
+        property324: 324,
+        property325: 325,
+        property326: 326,
+        property327: 327,
+        property328: 328,
+        property329: 329,
+        property330: 330,
+        property331: 331,
+        property332: 332,
+        property333: 333,
+        property334: 334,
+        property335: 335,
+        property336: 336,
+        property337: 337,
+        property338: 338,
+        property339: 339,
+        property340: 340,
+        property341: 341,
+        property342: 342,
+        property343: 343,
+        property344: 344,
+        property345: 345,
+        property346: 346,
+        property347: 347,
+        property348: 348,
+        property349: 349,
+        property350: 350,
+        property351: 351,
+        property352: 352,
+        property353: 353,
+        property354: 354,
+        property355: 355,
+        property356: 356,
+        property357: 357,
+        property358: 358,
+        property359: 359,
+        property360: 360,
+        property361: 361,
+        property362: 362,
+        property363: 363,
+        property364: 364,
+        property365: 365,
+        property366: 366,
+        property367: 367,
+        property368: 368,
+        property369: 369,
+        property370: 370,
+        property371: 371,
+        property372: 372,
+        property373: 373,
+        property374: 374,
+        property375: 375,
+        property376: 376,
+        property377: 377,
+        property378: 378,
+        property379: 379,
+        property380: 380,
+        property381: 381,
+        property382: 382,
+        property383: 383,
+        property384: 384,
+        property385: 385,
+        property386: 386,
+        property387: 387,
+        property388: 388,
+        property389: 389,
+        property390: 390,
+        property391: 391,
+        property392: 392,
+        property393: 393,
+        property394: 394,
+        property395: 395,
+        property396: 396,
+        property397: 397,
+        property398: 398,
+        property399: 399,
+        property400: 400,
+        property401: 401,
+        property402: 402,
+        property403: 403,
+        property404: 404,
+        property405: 405,
+        property406: 406,
+        property407: 407,
+        property408: 408,
+        property409: 409,
+        property410: 410,
+        property411: 411,
+        property412: 412,
+        property413: 413,
+        property414: 414,
+        property415: 415,
+        property416: 416,
+        property417: 417,
+        property418: 418,
+        property419: 419,
+        property420: 420,
+        property421: 421,
+        property422: 422,
+        property423: 423,
+        property424: 424,
+        property425: 425,
+        property426: 426,
+        property427: 427,
+        property428: 428,
+        property429: 429,
+        property430: 430,
+        property431: 431,
+        property432: 432,
+        property433: 433,
+        property434: 434,
+        property435: 435,
+        property436: 436,
+        property437: 437,
+        property438: 438,
+        property439: 439,
+        property440: 440,
+        property441: 441,
+        property442: 442,
+        property443: 443,
+        property444: 444,
+        property445: 445,
+        property446: 446,
+        property447: 447,
+        property448: 448,
+        property449: 449,
+        property450: 450,
+        property451: 451,
+        property452: 452,
+        property453: 453,
+        property454: 454,
+        property455: 455,
+        property456: 456,
+        property457: 457,
+        property458: 458,
+        property459: 459,
+        property460: 460,
+        property461: 461,
+        property462: 462,
+        property463: 463,
+        property464: 464,
+        property465: 465,
+        property466: 466,
+        property467: 467,
+        property468: 468,
+        property469: 469,
+        property470: 470,
+        property471: 471,
+        property472: 472,
+        property473: 473,
+        property474: 474,
+        property475: 475,
+        property476: 476,
+        property477: 477,
+        property478: 478,
+        property479: 479,
+        property480: 480,
+        property481: 481,
+        property482: 482,
+        property483: 483,
+        property484: 484,
+        property485: 485,
+        property486: 486,
+        property487: 487,
+        property488: 488,
+        property489: 489,
+        property490: 490,
+        property491: 491,
+        property492: 492,
+        property493: 493,
+        property494: 494,
+        property495: 495,
+        property496: 496,
+        property497: 497,
+        property498: 498,
+        property499: 499,
+        property500: 500,
+        property501: 501,
+        property502: 502,
+        property503: 503,
+        property504: 504,
+        property505: 505,
+        property506: 506,
+        property507: 507,
+        property508: 508,
+        property509: 509,
+        property510: 510,
+        property511: 511,
+        property512: 512,
+        property513: 513,
+        property514: 514,
+        property515: 515,
+        property516: 516,
+        property517: 517,
+        property518: 518,
+        property519: 519,
+        property520: 520,
+        property521: 521,
+        property522: 522,
+        property523: 523,
+        property524: 524,
+        property525: 525,
+        property526: 526,
+        property527: 527,
+        property528: 528,
+        property529: 529,
+        property530: 530,
+        property531: 531,
+        property532: 532,
+        property533: 533,
+        property534: 534,
+        property535: 535,
+        property536: 536,
+        property537: 537,
+        property538: 538,
+        property539: 539,
+        property540: 540,
+        property541: 541,
+        property542: 542,
+        property543: 543,
+        property544: 544,
+        property545: 545,
+        property546: 546,
+        property547: 547,
+        property548: 548,
+        property549: 549,
+        property550: 550,
+        property551: 551,
+        property552: 552,
+        property553: 553,
+        property554: 554,
+        property555: 555,
+        property556: 556,
+        property557: 557,
+        property558: 558,
+        property559: 559,
+        property560: 560,
+        property561: 561,
+        property562: 562,
+        property563: 563,
+        property564: 564,
+        property565: 565,
+        property566: 566,
+        property567: 567,
+        property568: 568,
+        property569: 569,
+        property570: 570,
+        property571: 571,
+        property572: 572,
+        property573: 573,
+        property574: 574,
+        property575: 575,
+        property576: 576,
+        property577: 577,
+        property578: 578,
+        property579: 579,
+        property580: 580,
+        property581: 581,
+        property582: 582,
+        property583: 583,
+        property584: 584,
+        property585: 585,
+        property586: 586,
+        property587: 587,
+        property588: 588,
+        property589: 589,
+        property590: 590,
+        property591: 591,
+        property592: 592,
+        property593: 593,
+        property594: 594,
+        property595: 595,
+        property596: 596,
+        property597: 597,
+        property598: 598,
+        property599: 599,
+        property600: 600,
+        property601: 601,
+        property602: 602,
+        property603: 603,
+        property604: 604,
+        property605: 605,
+        property606: 606,
+        property607: 607,
+        property608: 608,
+        property609: 609,
+        property610: 610,
+        property611: 611,
+        property612: 612,
+        property613: 613,
+        property614: 614,
+        property615: 615,
+        property616: 616,
+        property617: 617,
+        property618: 618,
+        property619: 619,
+        property620: 620,
+        property621: 621,
+        property622: 622,
+        property623: 623,
+        property624: 624,
+        property625: 625,
+        property626: 626,
+        property627: 627,
+        property628: 628,
+        property629: 629,
+        property630: 630,
+        property631: 631,
+        property632: 632,
+        property633: 633,
+        property634: 634,
+        property635: 635,
+        property636: 636,
+        property637: 637,
+        property638: 638,
+        property639: 639,
+        property640: 640,
+        property641: 641,
+        property642: 642,
+        property643: 643,
+        property644: 644,
+        property645: 645,
+        property646: 646,
+        property647: 647,
+        property648: 648,
+        property649: 649,
+        property650: 650,
+        property651: 651,
+        property652: 652,
+        property653: 653,
+        property654: 654,
+        property655: 655,
+        property656: 656,
+        property657: 657,
+        property658: 658,
+        property659: 659,
+        property660: 660,
+        property661: 661,
+        property662: 662,
+        property663: 663,
+        property664: 664,
+        property665: 665,
+        property666: 666,
+        property667: 667,
+        property668: 668,
+        property669: 669,
+        property670: 670,
+        property671: 671,
+        property672: 672,
+        property673: 673,
+        property674: 674,
+        property675: 675,
+        property676: 676,
+        property677: 677,
+        property678: 678,
+        property679: 679,
+        property680: 680,
+        property681: 681,
+        property682: 682,
+        property683: 683,
+        property684: 684,
+        property685: 685,
+        property686: 686,
+        property687: 687,
+        property688: 688,
+        property689: 689,
+        property690: 690,
+        property691: 691,
+        property692: 692,
+        property693: 693,
+        property694: 694,
+        property695: 695,
+        property696: 696,
+        property697: 697,
+        property698: 698,
+        property699: 699,
+        property700: 700,
+        property701: 701,
+        property702: 702,
+        property703: 703,
+        property704: 704,
+        property705: 705,
+        property706: 706,
+        property707: 707,
+        property708: 708,
+        property709: 709,
+        property710: 710,
+        property711: 711,
+        property712: 712,
+        property713: 713,
+        property714: 714,
+        property715: 715,
+        property716: 716,
+        property717: 717,
+        property718: 718,
+        property719: 719,
+        property720: 720,
+        property721: 721,
+        property722: 722,
+        property723: 723,
+        property724: 724,
+        property725: 725,
+        property726: 726,
+        property727: 727,
+        property728: 728,
+        property729: 729,
+        property730: 730,
+        property731: 731,
+        property732: 732,
+        property733: 733,
+        property734: 734,
+        property735: 735,
+        property736: 736,
+        property737: 737,
+        property738: 738,
+        property739: 739,
+        property740: 740,
+        property741: 741,
+        property742: 742,
+        property743: 743,
+        property744: 744,
+        property745: 745,
+        property746: 746,
+        property747: 747,
+        property748: 748,
+        property749: 749,
+        property750: 750,
+        property751: 751,
+        property752: 752,
+        property753: 753,
+        property754: 754,
+        property755: 755,
+        property756: 756,
+        property757: 757,
+        property758: 758,
+        property759: 759,
+        property760: 760,
+        property761: 761,
+        property762: 762,
+        property763: 763,
+        property764: 764,
+        property765: 765,
+        property766: 766,
+        property767: 767,
+        property768: 768,
+        property769: 769,
+        property770: 770,
+        property771: 771,
+        property772: 772,
+        property773: 773,
+        property774: 774,
+        property775: 775,
+        property776: 776,
+        property777: 777,
+        property778: 778,
+        property779: 779,
+        property780: 780,
+        property781: 781,
+        property782: 782,
+        property783: 783,
+        property784: 784,
+        property785: 785,
+        property786: 786,
+        property787: 787,
+        property788: 788,
+        property789: 789,
+        property790: 790,
+        property791: 791,
+        property792: 792,
+        property793: 793,
+        property794: 794,
+        property795: 795,
+        property796: 796,
+        property797: 797,
+        property798: 798,
+        property799: 799,
+        property800: 800,
+        property801: 801,
+        property802: 802,
+        property803: 803,
+        property804: 804,
+        property805: 805,
+        property806: 806,
+        property807: 807,
+        property808: 808,
+        property809: 809,
+        property810: 810,
+        property811: 811,
+        property812: 812,
+        property813: 813,
+        property814: 814,
+        property815: 815,
+        property816: 816,
+        property817: 817,
+        property818: 818,
+        property819: 819,
+        property820: 820,
+        property821: 821,
+        property822: 822,
+        property823: 823,
+        property824: 824,
+        property825: 825,
+        property826: 826,
+        property827: 827,
+        property828: 828,
+        property829: 829,
+        property830: 830,
+        property831: 831,
+        property832: 832,
+        property833: 833,
+        property834: 834,
+        property835: 835,
+        property836: 836,
+        property837: 837,
+        property838: 838,
+        property839: 839,
+        property840: 840,
+        property841: 841,
+        property842: 842,
+        property843: 843,
+        property844: 844,
+        property845: 845,
+        property846: 846,
+        property847: 847,
+        property848: 848,
+        property849: 849,
+        property850: 850,
+        property851: 851,
+        property852: 852,
+        property853: 853,
+        property854: 854,
+        property855: 855,
+        property856: 856,
+        property857: 857,
+        property858: 858,
+        property859: 859,
+        property860: 860,
+        property861: 861,
+        property862: 862,
+        property863: 863,
+        property864: 864,
+        property865: 865,
+        property866: 866,
+        property867: 867,
+        property868: 868,
+        property869: 869,
+        property870: 870,
+        property871: 871,
+        property872: 872,
+        property873: 873,
+        property874: 874,
+        property875: 875,
+        property876: 876,
+        property877: 877,
+        property878: 878,
+        property879: 879,
+        property880: 880,
+        property881: 881,
+        property882: 882,
+        property883: 883,
+        property884: 884,
+        property885: 885,
+        property886: 886,
+        property887: 887,
+        property888: 888,
+        property889: 889,
+        property890: 890,
+        property891: 891,
+        property892: 892,
+        property893: 893,
+        property894: 894,
+        property895: 895,
+        property896: 896,
+        property897: 897,
+        property898: 898,
+        property899: 899,
+        property900: 900,
+        property901: 901,
+        property902: 902,
+        property903: 903,
+        property904: 904,
+        property905: 905,
+        property906: 906,
+        property907: 907,
+        property908: 908,
+        property909: 909,
+        property910: 910,
+        property911: 911,
+        property912: 912,
+        property913: 913,
+        property914: 914,
+        property915: 915,
+        property916: 916,
+        property917: 917,
+        property918: 918,
+        property919: 919,
+        property920: 920,
+        property921: 921,
+        property922: 922,
+        property923: 923,
+        property924: 924,
+        property925: 925,
+        property926: 926,
+        property927: 927,
+        property928: 928,
+        property929: 929,
+        property930: 930,
+        property931: 931,
+        property932: 932,
+        property933: 933,
+        property934: 934,
+        property935: 935,
+        property936: 936,
+        property937: 937,
+        property938: 938,
+        property939: 939,
+        property940: 940,
+        property941: 941,
+        property942: 942,
+        property943: 943,
+        property944: 944,
+        property945: 945,
+        property946: 946,
+        property947: 947,
+        property948: 948,
+        property949: 949,
+        property950: 950,
+        property951: 951,
+        property952: 952,
+        property953: 953,
+        property954: 954,
+        property955: 955,
+        property956: 956,
+        property957: 957,
+        property958: 958,
+        property959: 959,
+        property960: 960,
+        property961: 961,
+        property962: 962,
+        property963: 963,
+        property964: 964,
+        property965: 965,
+        property966: 966,
+        property967: 967,
+        property968: 968,
+        property969: 969,
+        property970: 970,
+        property971: 971,
+        property972: 972,
+        property973: 973,
+        property974: 974,
+        property975: 975,
+        property976: 976,
+        property977: 977,
+        property978: 978,
+        property979: 979,
+        property980: 980,
+        property981: 981,
+        property982: 982,
+        property983: 983,
+        property984: 984,
+        property985: 985,
+        property986: 986,
+        property987: 987,
+        property988: 988,
+        property989: 989,
+        property990: 990,
+        property991: 991,
+        property992: 992,
+        property993: 993,
+        property994: 994,
+        property995: 995,
+        property996: 996,
+        property997: 997,
+        property998: 998,
+        property999: 999,
+        property1000: 1000,
+    });
+}
+
+function test2() {
+    var o = {};
+    o.property1 = 1;
+    o.property2 = 2;
+    o.property3 = 3;
+    o.property4 = 4;
+    o.property5 = 5;
+    o.property6 = 6;
+    o.property7 = 7;
+    o.property8 = 8;
+    o.property9 = 9;
+    o.property10 = 10;
+    o.property11 = 11;
+    o.property12 = 12;
+    o.property13 = 13;
+    o.property14 = 14;
+    o.property15 = 15;
+    o.property16 = 16;
+    o.property17 = 17;
+    o.property18 = 18;
+    o.property19 = 19;
+    o.property20 = 20;
+    o.property21 = 21;
+    o.property22 = 22;
+    o.property23 = 23;
+    o.property24 = 24;
+    o.property25 = 25;
+    o.property26 = 26;
+    o.property27 = 27;
+    o.property28 = 28;
+    o.property29 = 29;
+    o.property30 = 30;
+    o.property31 = 31;
+    o.property32 = 32;
+    o.property33 = 33;
+    o.property34 = 34;
+    o.property35 = 35;
+    o.property36 = 36;
+    o.property37 = 37;
+    o.property38 = 38;
+    o.property39 = 39;
+    o.property40 = 40;
+    o.property41 = 41;
+    o.property42 = 42;
+    o.property43 = 43;
+    o.property44 = 44;
+    o.property45 = 45;
+    o.property46 = 46;
+    o.property47 = 47;
+    o.property48 = 48;
+    o.property49 = 49;
+    o.property50 = 50;
+    o.property51 = 51;
+    o.property52 = 52;
+    o.property53 = 53;
+    o.property54 = 54;
+    o.property55 = 55;
+    o.property56 = 56;
+    o.property57 = 57;
+    o.property58 = 58;
+    o.property59 = 59;
+    o.property60 = 60;
+    o.property61 = 61;
+    o.property62 = 62;
+    o.property63 = 63;
+    o.property64 = 64;
+    o.property65 = 65;
+    o.property66 = 66;
+    o.property67 = 67;
+    o.property68 = 68;
+    o.property69 = 69;
+    o.property70 = 70;
+    o.property71 = 71;
+    o.property72 = 72;
+    o.property73 = 73;
+    o.property74 = 74;
+    o.property75 = 75;
+    o.property76 = 76;
+    o.property77 = 77;
+    o.property78 = 78;
+    o.property79 = 79;
+    o.property80 = 80;
+    o.property81 = 81;
+    o.property82 = 82;
+    o.property83 = 83;
+    o.property84 = 84;
+    o.property85 = 85;
+    o.property86 = 86;
+    o.property87 = 87;
+    o.property88 = 88;
+    o.property89 = 89;
+    o.property90 = 90;
+    o.property91 = 91;
+    o.property92 = 92;
+    o.property93 = 93;
+    o.property94 = 94;
+    o.property95 = 95;
+    o.property96 = 96;
+    o.property97 = 97;
+    o.property98 = 98;
+    o.property99 = 99;
+    o.property100 = 100;
+    o.property101 = 101;
+    o.property102 = 102;
+    o.property103 = 103;
+    o.property104 = 104;
+    o.property105 = 105;
+    o.property106 = 106;
+    o.property107 = 107;
+    o.property108 = 108;
+    o.property109 = 109;
+    o.property110 = 110;
+    o.property111 = 111;
+    o.property112 = 112;
+    o.property113 = 113;
+    o.property114 = 114;
+    o.property115 = 115;
+    o.property116 = 116;
+    o.property117 = 117;
+    o.property118 = 118;
+    o.property119 = 119;
+    o.property120 = 120;
+    o.property121 = 121;
+    o.property122 = 122;
+    o.property123 = 123;
+    o.property124 = 124;
+    o.property125 = 125;
+    o.property126 = 126;
+    o.property127 = 127;
+    o.property128 = 128;
+    o.property129 = 129;
+    o.property130 = 130;
+    o.property131 = 131;
+    o.property132 = 132;
+    o.property133 = 133;
+    o.property134 = 134;
+    o.property135 = 135;
+    o.property136 = 136;
+    o.property137 = 137;
+    o.property138 = 138;
+    o.property139 = 139;
+    o.property140 = 140;
+    o.property141 = 141;
+    o.property142 = 142;
+    o.property143 = 143;
+    o.property144 = 144;
+    o.property145 = 145;
+    o.property146 = 146;
+    o.property147 = 147;
+    o.property148 = 148;
+    o.property149 = 149;
+    o.property150 = 150;
+    o.property151 = 151;
+    o.property152 = 152;
+    o.property153 = 153;
+    o.property154 = 154;
+    o.property155 = 155;
+    o.property156 = 156;
+    o.property157 = 157;
+    o.property158 = 158;
+    o.property159 = 159;
+    o.property160 = 160;
+    o.property161 = 161;
+    o.property162 = 162;
+    o.property163 = 163;
+    o.property164 = 164;
+    o.property165 = 165;
+    o.property166 = 166;
+    o.property167 = 167;
+    o.property168 = 168;
+    o.property169 = 169;
+    o.property170 = 170;
+    o.property171 = 171;
+    o.property172 = 172;
+    o.property173 = 173;
+    o.property174 = 174;
+    o.property175 = 175;
+    o.property176 = 176;
+    o.property177 = 177;
+    o.property178 = 178;
+    o.property179 = 179;
+    o.property180 = 180;
+    o.property181 = 181;
+    o.property182 = 182;
+    o.property183 = 183;
+    o.property184 = 184;
+    o.property185 = 185;
+    o.property186 = 186;
+    o.property187 = 187;
+    o.property188 = 188;
+    o.property189 = 189;
+    o.property190 = 190;
+    o.property191 = 191;
+    o.property192 = 192;
+    o.property193 = 193;
+    o.property194 = 194;
+    o.property195 = 195;
+    o.property196 = 196;
+    o.property197 = 197;
+    o.property198 = 198;
+    o.property199 = 199;
+    o.property200 = 200;
+    o.property201 = 201;
+    o.property202 = 202;
+    o.property203 = 203;
+    o.property204 = 204;
+    o.property205 = 205;
+    o.property206 = 206;
+    o.property207 = 207;
+    o.property208 = 208;
+    o.property209 = 209;
+    o.property210 = 210;
+    o.property211 = 211;
+    o.property212 = 212;
+    o.property213 = 213;
+    o.property214 = 214;
+    o.property215 = 215;
+    o.property216 = 216;
+    o.property217 = 217;
+    o.property218 = 218;
+    o.property219 = 219;
+    o.property220 = 220;
+    o.property221 = 221;
+    o.property222 = 222;
+    o.property223 = 223;
+    o.property224 = 224;
+    o.property225 = 225;
+    o.property226 = 226;
+    o.property227 = 227;
+    o.property228 = 228;
+    o.property229 = 229;
+    o.property230 = 230;
+    o.property231 = 231;
+    o.property232 = 232;
+    o.property233 = 233;
+    o.property234 = 234;
+    o.property235 = 235;
+    o.property236 = 236;
+    o.property237 = 237;
+    o.property238 = 238;
+    o.property239 = 239;
+    o.property240 = 240;
+    o.property241 = 241;
+    o.property242 = 242;
+    o.property243 = 243;
+    o.property244 = 244;
+    o.property245 = 245;
+    o.property246 = 246;
+    o.property247 = 247;
+    o.property248 = 248;
+    o.property249 = 249;
+    o.property250 = 250;
+    o.property251 = 251;
+    o.property252 = 252;
+    o.property253 = 253;
+    o.property254 = 254;
+    o.property255 = 255;
+    o.property256 = 256;
+    o.property257 = 257;
+    o.property258 = 258;
+    o.property259 = 259;
+    o.property260 = 260;
+    o.property261 = 261;
+    o.property262 = 262;
+    o.property263 = 263;
+    o.property264 = 264;
+    o.property265 = 265;
+    o.property266 = 266;
+    o.property267 = 267;
+    o.property268 = 268;
+    o.property269 = 269;
+    o.property270 = 270;
+    o.property271 = 271;
+    o.property272 = 272;
+    o.property273 = 273;
+    o.property274 = 274;
+    o.property275 = 275;
+    o.property276 = 276;
+    o.property277 = 277;
+    o.property278 = 278;
+    o.property279 = 279;
+    o.property280 = 280;
+    o.property281 = 281;
+    o.property282 = 282;
+    o.property283 = 283;
+    o.property284 = 284;
+    o.property285 = 285;
+    o.property286 = 286;
+    o.property287 = 287;
+    o.property288 = 288;
+    o.property289 = 289;
+    o.property290 = 290;
+    o.property291 = 291;
+    o.property292 = 292;
+    o.property293 = 293;
+    o.property294 = 294;
+    o.property295 = 295;
+    o.property296 = 296;
+    o.property297 = 297;
+    o.property298 = 298;
+    o.property299 = 299;
+    o.property300 = 300;
+    o.property301 = 301;
+    o.property302 = 302;
+    o.property303 = 303;
+    o.property304 = 304;
+    o.property305 = 305;
+    o.property306 = 306;
+    o.property307 = 307;
+    o.property308 = 308;
+    o.property309 = 309;
+    o.property310 = 310;
+    o.property311 = 311;
+    o.property312 = 312;
+    o.property313 = 313;
+    o.property314 = 314;
+    o.property315 = 315;
+    o.property316 = 316;
+    o.property317 = 317;
+    o.property318 = 318;
+    o.property319 = 319;
+    o.property320 = 320;
+    o.property321 = 321;
+    o.property322 = 322;
+    o.property323 = 323;
+    o.property324 = 324;
+    o.property325 = 325;
+    o.property326 = 326;
+    o.property327 = 327;
+    o.property328 = 328;
+    o.property329 = 329;
+    o.property330 = 330;
+    o.property331 = 331;
+    o.property332 = 332;
+    o.property333 = 333;
+    o.property334 = 334;
+    o.property335 = 335;
+    o.property336 = 336;
+    o.property337 = 337;
+    o.property338 = 338;
+    o.property339 = 339;
+    o.property340 = 340;
+    o.property341 = 341;
+    o.property342 = 342;
+    o.property343 = 343;
+    o.property344 = 344;
+    o.property345 = 345;
+    o.property346 = 346;
+    o.property347 = 347;
+    o.property348 = 348;
+    o.property349 = 349;
+    o.property350 = 350;
+    o.property351 = 351;
+    o.property352 = 352;
+    o.property353 = 353;
+    o.property354 = 354;
+    o.property355 = 355;
+    o.property356 = 356;
+    o.property357 = 357;
+    o.property358 = 358;
+    o.property359 = 359;
+    o.property360 = 360;
+    o.property361 = 361;
+    o.property362 = 362;
+    o.property363 = 363;
+    o.property364 = 364;
+    o.property365 = 365;
+    o.property366 = 366;
+    o.property367 = 367;
+    o.property368 = 368;
+    o.property369 = 369;
+    o.property370 = 370;
+    o.property371 = 371;
+    o.property372 = 372;
+    o.property373 = 373;
+    o.property374 = 374;
+    o.property375 = 375;
+    o.property376 = 376;
+    o.property377 = 377;
+    o.property378 = 378;
+    o.property379 = 379;
+    o.property380 = 380;
+    o.property381 = 381;
+    o.property382 = 382;
+    o.property383 = 383;
+    o.property384 = 384;
+    o.property385 = 385;
+    o.property386 = 386;
+    o.property387 = 387;
+    o.property388 = 388;
+    o.property389 = 389;
+    o.property390 = 390;
+    o.property391 = 391;
+    o.property392 = 392;
+    o.property393 = 393;
+    o.property394 = 394;
+    o.property395 = 395;
+    o.property396 = 396;
+    o.property397 = 397;
+    o.property398 = 398;
+    o.property399 = 399;
+    o.property400 = 400;
+    o.property401 = 401;
+    o.property402 = 402;
+    o.property403 = 403;
+    o.property404 = 404;
+    o.property405 = 405;
+    o.property406 = 406;
+    o.property407 = 407;
+    o.property408 = 408;
+    o.property409 = 409;
+    o.property410 = 410;
+    o.property411 = 411;
+    o.property412 = 412;
+    o.property413 = 413;
+    o.property414 = 414;
+    o.property415 = 415;
+    o.property416 = 416;
+    o.property417 = 417;
+    o.property418 = 418;
+    o.property419 = 419;
+    o.property420 = 420;
+    o.property421 = 421;
+    o.property422 = 422;
+    o.property423 = 423;
+    o.property424 = 424;
+    o.property425 = 425;
+    o.property426 = 426;
+    o.property427 = 427;
+    o.property428 = 428;
+    o.property429 = 429;
+    o.property430 = 430;
+    o.property431 = 431;
+    o.property432 = 432;
+    o.property433 = 433;
+    o.property434 = 434;
+    o.property435 = 435;
+    o.property436 = 436;
+    o.property437 = 437;
+    o.property438 = 438;
+    o.property439 = 439;
+    o.property440 = 440;
+    o.property441 = 441;
+    o.property442 = 442;
+    o.property443 = 443;
+    o.property444 = 444;
+    o.property445 = 445;
+    o.property446 = 446;
+    o.property447 = 447;
+    o.property448 = 448;
+    o.property449 = 449;
+    o.property450 = 450;
+    o.property451 = 451;
+    o.property452 = 452;
+    o.property453 = 453;
+    o.property454 = 454;
+    o.property455 = 455;
+    o.property456 = 456;
+    o.property457 = 457;
+    o.property458 = 458;
+    o.property459 = 459;
+    o.property460 = 460;
+    o.property461 = 461;
+    o.property462 = 462;
+    o.property463 = 463;
+    o.property464 = 464;
+    o.property465 = 465;
+    o.property466 = 466;
+    o.property467 = 467;
+    o.property468 = 468;
+    o.property469 = 469;
+    o.property470 = 470;
+    o.property471 = 471;
+    o.property472 = 472;
+    o.property473 = 473;
+    o.property474 = 474;
+    o.property475 = 475;
+    o.property476 = 476;
+    o.property477 = 477;
+    o.property478 = 478;
+    o.property479 = 479;
+    o.property480 = 480;
+    o.property481 = 481;
+    o.property482 = 482;
+    o.property483 = 483;
+    o.property484 = 484;
+    o.property485 = 485;
+    o.property486 = 486;
+    o.property487 = 487;
+    o.property488 = 488;
+    o.property489 = 489;
+    o.property490 = 490;
+    o.property491 = 491;
+    o.property492 = 492;
+    o.property493 = 493;
+    o.property494 = 494;
+    o.property495 = 495;
+    o.property496 = 496;
+    o.property497 = 497;
+    o.property498 = 498;
+    o.property499 = 499;
+    o.property500 = 500;
+    o.property501 = 501;
+    o.property502 = 502;
+    o.property503 = 503;
+    o.property504 = 504;
+    o.property505 = 505;
+    o.property506 = 506;
+    o.property507 = 507;
+    o.property508 = 508;
+    o.property509 = 509;
+    o.property510 = 510;
+    o.property511 = 511;
+    o.property512 = 512;
+    o.property513 = 513;
+    o.property514 = 514;
+    o.property515 = 515;
+    o.property516 = 516;
+    o.property517 = 517;
+    o.property518 = 518;
+    o.property519 = 519;
+    o.property520 = 520;
+    o.property521 = 521;
+    o.property522 = 522;
+    o.property523 = 523;
+    o.property524 = 524;
+    o.property525 = 525;
+    o.property526 = 526;
+    o.property527 = 527;
+    o.property528 = 528;
+    o.property529 = 529;
+    o.property530 = 530;
+    o.property531 = 531;
+    o.property532 = 532;
+    o.property533 = 533;
+    o.property534 = 534;
+    o.property535 = 535;
+    o.property536 = 536;
+    o.property537 = 537;
+    o.property538 = 538;
+    o.property539 = 539;
+    o.property540 = 540;
+    o.property541 = 541;
+    o.property542 = 542;
+    o.property543 = 543;
+    o.property544 = 544;
+    o.property545 = 545;
+    o.property546 = 546;
+    o.property547 = 547;
+    o.property548 = 548;
+    o.property549 = 549;
+    o.property550 = 550;
+    o.property551 = 551;
+    o.property552 = 552;
+    o.property553 = 553;
+    o.property554 = 554;
+    o.property555 = 555;
+    o.property556 = 556;
+    o.property557 = 557;
+    o.property558 = 558;
+    o.property559 = 559;
+    o.property560 = 560;
+    o.property561 = 561;
+    o.property562 = 562;
+    o.property563 = 563;
+    o.property564 = 564;
+    o.property565 = 565;
+    o.property566 = 566;
+    o.property567 = 567;
+    o.property568 = 568;
+    o.property569 = 569;
+    o.property570 = 570;
+    o.property571 = 571;
+    o.property572 = 572;
+    o.property573 = 573;
+    o.property574 = 574;
+    o.property575 = 575;
+    o.property576 = 576;
+    o.property577 = 577;
+    o.property578 = 578;
+    o.property579 = 579;
+    o.property580 = 580;
+    o.property581 = 581;
+    o.property582 = 582;
+    o.property583 = 583;
+    o.property584 = 584;
+    o.property585 = 585;
+    o.property586 = 586;
+    o.property587 = 587;
+    o.property588 = 588;
+    o.property589 = 589;
+    o.property590 = 590;
+    o.property591 = 591;
+    o.property592 = 592;
+    o.property593 = 593;
+    o.property594 = 594;
+    o.property595 = 595;
+    o.property596 = 596;
+    o.property597 = 597;
+    o.property598 = 598;
+    o.property599 = 599;
+    o.property600 = 600;
+    o.property601 = 601;
+    o.property602 = 602;
+    o.property603 = 603;
+    o.property604 = 604;
+    o.property605 = 605;
+    o.property606 = 606;
+    o.property607 = 607;
+    o.property608 = 608;
+    o.property609 = 609;
+    o.property610 = 610;
+    o.property611 = 611;
+    o.property612 = 612;
+    o.property613 = 613;
+    o.property614 = 614;
+    o.property615 = 615;
+    o.property616 = 616;
+    o.property617 = 617;
+    o.property618 = 618;
+    o.property619 = 619;
+    o.property620 = 620;
+    o.property621 = 621;
+    o.property622 = 622;
+    o.property623 = 623;
+    o.property624 = 624;
+    o.property625 = 625;
+    o.property626 = 626;
+    o.property627 = 627;
+    o.property628 = 628;
+    o.property629 = 629;
+    o.property630 = 630;
+    o.property631 = 631;
+    o.property632 = 632;
+    o.property633 = 633;
+    o.property634 = 634;
+    o.property635 = 635;
+    o.property636 = 636;
+    o.property637 = 637;
+    o.property638 = 638;
+    o.property639 = 639;
+    o.property640 = 640;
+    o.property641 = 641;
+    o.property642 = 642;
+    o.property643 = 643;
+    o.property644 = 644;
+    o.property645 = 645;
+    o.property646 = 646;
+    o.property647 = 647;
+    o.property648 = 648;
+    o.property649 = 649;
+    o.property650 = 650;
+    o.property651 = 651;
+    o.property652 = 652;
+    o.property653 = 653;
+    o.property654 = 654;
+    o.property655 = 655;
+    o.property656 = 656;
+    o.property657 = 657;
+    o.property658 = 658;
+    o.property659 = 659;
+    o.property660 = 660;
+    o.property661 = 661;
+    o.property662 = 662;
+    o.property663 = 663;
+    o.property664 = 664;
+    o.property665 = 665;
+    o.property666 = 666;
+    o.property667 = 667;
+    o.property668 = 668;
+    o.property669 = 669;
+    o.property670 = 670;
+    o.property671 = 671;
+    o.property672 = 672;
+    o.property673 = 673;
+    o.property674 = 674;
+    o.property675 = 675;
+    o.property676 = 676;
+    o.property677 = 677;
+    o.property678 = 678;
+    o.property679 = 679;
+    o.property680 = 680;
+    o.property681 = 681;
+    o.property682 = 682;
+    o.property683 = 683;
+    o.property684 = 684;
+    o.property685 = 685;
+    o.property686 = 686;
+    o.property687 = 687;
+    o.property688 = 688;
+    o.property689 = 689;
+    o.property690 = 690;
+    o.property691 = 691;
+    o.property692 = 692;
+    o.property693 = 693;
+    o.property694 = 694;
+    o.property695 = 695;
+    o.property696 = 696;
+    o.property697 = 697;
+    o.property698 = 698;
+    o.property699 = 699;
+    o.property700 = 700;
+    o.property701 = 701;
+    o.property702 = 702;
+    o.property703 = 703;
+    o.property704 = 704;
+    o.property705 = 705;
+    o.property706 = 706;
+    o.property707 = 707;
+    o.property708 = 708;
+    o.property709 = 709;
+    o.property710 = 710;
+    o.property711 = 711;
+    o.property712 = 712;
+    o.property713 = 713;
+    o.property714 = 714;
+    o.property715 = 715;
+    o.property716 = 716;
+    o.property717 = 717;
+    o.property718 = 718;
+    o.property719 = 719;
+    o.property720 = 720;
+    o.property721 = 721;
+    o.property722 = 722;
+    o.property723 = 723;
+    o.property724 = 724;
+    o.property725 = 725;
+    o.property726 = 726;
+    o.property727 = 727;
+    o.property728 = 728;
+    o.property729 = 729;
+    o.property730 = 730;
+    o.property731 = 731;
+    o.property732 = 732;
+    o.property733 = 733;
+    o.property734 = 734;
+    o.property735 = 735;
+    o.property736 = 736;
+    o.property737 = 737;
+    o.property738 = 738;
+    o.property739 = 739;
+    o.property740 = 740;
+    o.property741 = 741;
+    o.property742 = 742;
+    o.property743 = 743;
+    o.property744 = 744;
+    o.property745 = 745;
+    o.property746 = 746;
+    o.property747 = 747;
+    o.property748 = 748;
+    o.property749 = 749;
+    o.property750 = 750;
+    o.property751 = 751;
+    o.property752 = 752;
+    o.property753 = 753;
+    o.property754 = 754;
+    o.property755 = 755;
+    o.property756 = 756;
+    o.property757 = 757;
+    o.property758 = 758;
+    o.property759 = 759;
+    o.property760 = 760;
+    o.property761 = 761;
+    o.property762 = 762;
+    o.property763 = 763;
+    o.property764 = 764;
+    o.property765 = 765;
+    o.property766 = 766;
+    o.property767 = 767;
+    o.property768 = 768;
+    o.property769 = 769;
+    o.property770 = 770;
+    o.property771 = 771;
+    o.property772 = 772;
+    o.property773 = 773;
+    o.property774 = 774;
+    o.property775 = 775;
+    o.property776 = 776;
+    o.property777 = 777;
+    o.property778 = 778;
+    o.property779 = 779;
+    o.property780 = 780;
+    o.property781 = 781;
+    o.property782 = 782;
+    o.property783 = 783;
+    o.property784 = 784;
+    o.property785 = 785;
+    o.property786 = 786;
+    o.property787 = 787;
+    o.property788 = 788;
+    o.property789 = 789;
+    o.property790 = 790;
+    o.property791 = 791;
+    o.property792 = 792;
+    o.property793 = 793;
+    o.property794 = 794;
+    o.property795 = 795;
+    o.property796 = 796;
+    o.property797 = 797;
+    o.property798 = 798;
+    o.property799 = 799;
+    o.property800 = 800;
+    o.property801 = 801;
+    o.property802 = 802;
+    o.property803 = 803;
+    o.property804 = 804;
+    o.property805 = 805;
+    o.property806 = 806;
+    o.property807 = 807;
+    o.property808 = 808;
+    o.property809 = 809;
+    o.property810 = 810;
+    o.property811 = 811;
+    o.property812 = 812;
+    o.property813 = 813;
+    o.property814 = 814;
+    o.property815 = 815;
+    o.property816 = 816;
+    o.property817 = 817;
+    o.property818 = 818;
+    o.property819 = 819;
+    o.property820 = 820;
+    o.property821 = 821;
+    o.property822 = 822;
+    o.property823 = 823;
+    o.property824 = 824;
+    o.property825 = 825;
+    o.property826 = 826;
+    o.property827 = 827;
+    o.property828 = 828;
+    o.property829 = 829;
+    o.property830 = 830;
+    o.property831 = 831;
+    o.property832 = 832;
+    o.property833 = 833;
+    o.property834 = 834;
+    o.property835 = 835;
+    o.property836 = 836;
+    o.property837 = 837;
+    o.property838 = 838;
+    o.property839 = 839;
+    o.property840 = 840;
+    o.property841 = 841;
+    o.property842 = 842;
+    o.property843 = 843;
+    o.property844 = 844;
+    o.property845 = 845;
+    o.property846 = 846;
+    o.property847 = 847;
+    o.property848 = 848;
+    o.property849 = 849;
+    o.property850 = 850;
+    o.property851 = 851;
+    o.property852 = 852;
+    o.property853 = 853;
+    o.property854 = 854;
+    o.property855 = 855;
+    o.property856 = 856;
+    o.property857 = 857;
+    o.property858 = 858;
+    o.property859 = 859;
+    o.property860 = 860;
+    o.property861 = 861;
+    o.property862 = 862;
+    o.property863 = 863;
+    o.property864 = 864;
+    o.property865 = 865;
+    o.property866 = 866;
+    o.property867 = 867;
+    o.property868 = 868;
+    o.property869 = 869;
+    o.property870 = 870;
+    o.property871 = 871;
+    o.property872 = 872;
+    o.property873 = 873;
+    o.property874 = 874;
+    o.property875 = 875;
+    o.property876 = 876;
+    o.property877 = 877;
+    o.property878 = 878;
+    o.property879 = 879;
+    o.property880 = 880;
+    o.property881 = 881;
+    o.property882 = 882;
+    o.property883 = 883;
+    o.property884 = 884;
+    o.property885 = 885;
+    o.property886 = 886;
+    o.property887 = 887;
+    o.property888 = 888;
+    o.property889 = 889;
+    o.property890 = 890;
+    o.property891 = 891;
+    o.property892 = 892;
+    o.property893 = 893;
+    o.property894 = 894;
+    o.property895 = 895;
+    o.property896 = 896;
+    o.property897 = 897;
+    o.property898 = 898;
+    o.property899 = 899;
+    o.property900 = 900;
+    o.property901 = 901;
+    o.property902 = 902;
+    o.property903 = 903;
+    o.property904 = 904;
+    o.property905 = 905;
+    o.property906 = 906;
+    o.property907 = 907;
+    o.property908 = 908;
+    o.property909 = 909;
+    o.property910 = 910;
+    o.property911 = 911;
+    o.property912 = 912;
+    o.property913 = 913;
+    o.property914 = 914;
+    o.property915 = 915;
+    o.property916 = 916;
+    o.property917 = 917;
+    o.property918 = 918;
+    o.property919 = 919;
+    o.property920 = 920;
+    o.property921 = 921;
+    o.property922 = 922;
+    o.property923 = 923;
+    o.property924 = 924;
+    o.property925 = 925;
+    o.property926 = 926;
+    o.property927 = 927;
+    o.property928 = 928;
+    o.property929 = 929;
+    o.property930 = 930;
+    o.property931 = 931;
+    o.property932 = 932;
+    o.property933 = 933;
+    o.property934 = 934;
+    o.property935 = 935;
+    o.property936 = 936;
+    o.property937 = 937;
+    o.property938 = 938;
+    o.property939 = 939;
+    o.property940 = 940;
+    o.property941 = 941;
+    o.property942 = 942;
+    o.property943 = 943;
+    o.property944 = 944;
+    o.property945 = 945;
+    o.property946 = 946;
+    o.property947 = 947;
+    o.property948 = 948;
+    o.property949 = 949;
+    o.property950 = 950;
+    o.property951 = 951;
+    o.property952 = 952;
+    o.property953 = 953;
+    o.property954 = 954;
+    o.property955 = 955;
+    o.property956 = 956;
+    o.property957 = 957;
+    o.property958 = 958;
+    o.property959 = 959;
+    o.property960 = 960;
+    o.property961 = 961;
+    o.property962 = 962;
+    o.property963 = 963;
+    o.property964 = 964;
+    o.property965 = 965;
+    o.property966 = 966;
+    o.property967 = 967;
+    o.property968 = 968;
+    o.property969 = 969;
+    o.property970 = 970;
+    o.property971 = 971;
+    o.property972 = 972;
+    o.property973 = 973;
+    o.property974 = 974;
+    o.property975 = 975;
+    o.property976 = 976;
+    o.property977 = 977;
+    o.property978 = 978;
+    o.property979 = 979;
+    o.property980 = 980;
+    o.property981 = 981;
+    o.property982 = 982;
+    o.property983 = 983;
+    o.property984 = 984;
+    o.property985 = 985;
+    o.property986 = 986;
+    o.property987 = 987;
+    o.property988 = 988;
+    o.property989 = 989;
+    o.property990 = 990;
+    o.property991 = 991;
+    o.property992 = 992;
+    o.property993 = 993;
+    o.property994 = 994;
+    o.property995 = 995;
+    o.property996 = 996;
+    o.property997 = 997;
+    o.property998 = 998;
+    o.property999 = 999;
+    o.property1000 = 1000;
+}
+
+function test3() {
+    function Foo() {
+        this.property1 = 1;
+        this.property2 = 2;
+        this.property3 = 3;
+        this.property4 = 4;
+        this.property5 = 5;
+        this.property6 = 6;
+        this.property7 = 7;
+        this.property8 = 8;
+        this.property9 = 9;
+        this.property10 = 10;
+        this.property11 = 11;
+        this.property12 = 12;
+        this.property13 = 13;
+        this.property14 = 14;
+        this.property15 = 15;
+        this.property16 = 16;
+        this.property17 = 17;
+        this.property18 = 18;
+        this.property19 = 19;
+        this.property20 = 20;
+        this.property21 = 21;
+        this.property22 = 22;
+        this.property23 = 23;
+        this.property24 = 24;
+        this.property25 = 25;
+        this.property26 = 26;
+        this.property27 = 27;
+        this.property28 = 28;
+        this.property29 = 29;
+        this.property30 = 30;
+        this.property31 = 31;
+        this.property32 = 32;
+        this.property33 = 33;
+        this.property34 = 34;
+        this.property35 = 35;
+        this.property36 = 36;
+        this.property37 = 37;
+        this.property38 = 38;
+        this.property39 = 39;
+        this.property40 = 40;
+        this.property41 = 41;
+        this.property42 = 42;
+        this.property43 = 43;
+        this.property44 = 44;
+        this.property45 = 45;
+        this.property46 = 46;
+        this.property47 = 47;
+        this.property48 = 48;
+        this.property49 = 49;
+        this.property50 = 50;
+        this.property51 = 51;
+        this.property52 = 52;
+        this.property53 = 53;
+        this.property54 = 54;
+        this.property55 = 55;
+        this.property56 = 56;
+        this.property57 = 57;
+        this.property58 = 58;
+        this.property59 = 59;
+        this.property60 = 60;
+        this.property61 = 61;
+        this.property62 = 62;
+        this.property63 = 63;
+        this.property64 = 64;
+        this.property65 = 65;
+        this.property66 = 66;
+        this.property67 = 67;
+        this.property68 = 68;
+        this.property69 = 69;
+        this.property70 = 70;
+        this.property71 = 71;
+        this.property72 = 72;
+        this.property73 = 73;
+        this.property74 = 74;
+        this.property75 = 75;
+        this.property76 = 76;
+        this.property77 = 77;
+        this.property78 = 78;
+        this.property79 = 79;
+        this.property80 = 80;
+        this.property81 = 81;
+        this.property82 = 82;
+        this.property83 = 83;
+        this.property84 = 84;
+        this.property85 = 85;
+        this.property86 = 86;
+        this.property87 = 87;
+        this.property88 = 88;
+        this.property89 = 89;
+        this.property90 = 90;
+        this.property91 = 91;
+        this.property92 = 92;
+        this.property93 = 93;
+        this.property94 = 94;
+        this.property95 = 95;
+        this.property96 = 96;
+        this.property97 = 97;
+        this.property98 = 98;
+        this.property99 = 99;
+        this.property100 = 100;
+        this.property101 = 101;
+        this.property102 = 102;
+        this.property103 = 103;
+        this.property104 = 104;
+        this.property105 = 105;
+        this.property106 = 106;
+        this.property107 = 107;
+        this.property108 = 108;
+        this.property109 = 109;
+        this.property110 = 110;
+        this.property111 = 111;
+        this.property112 = 112;
+        this.property113 = 113;
+        this.property114 = 114;
+        this.property115 = 115;
+        this.property116 = 116;
+        this.property117 = 117;
+        this.property118 = 118;
+        this.property119 = 119;
+        this.property120 = 120;
+        this.property121 = 121;
+        this.property122 = 122;
+        this.property123 = 123;
+        this.property124 = 124;
+        this.property125 = 125;
+        this.property126 = 126;
+        this.property127 = 127;
+        this.property128 = 128;
+        this.property129 = 129;
+        this.property130 = 130;
+        this.property131 = 131;
+        this.property132 = 132;
+        this.property133 = 133;
+        this.property134 = 134;
+        this.property135 = 135;
+        this.property136 = 136;
+        this.property137 = 137;
+        this.property138 = 138;
+        this.property139 = 139;
+        this.property140 = 140;
+        this.property141 = 141;
+        this.property142 = 142;
+        this.property143 = 143;
+        this.property144 = 144;
+        this.property145 = 145;
+        this.property146 = 146;
+        this.property147 = 147;
+        this.property148 = 148;
+        this.property149 = 149;
+        this.property150 = 150;
+        this.property151 = 151;
+        this.property152 = 152;
+        this.property153 = 153;
+        this.property154 = 154;
+        this.property155 = 155;
+        this.property156 = 156;
+        this.property157 = 157;
+        this.property158 = 158;
+        this.property159 = 159;
+        this.property160 = 160;
+        this.property161 = 161;
+        this.property162 = 162;
+        this.property163 = 163;
+        this.property164 = 164;
+        this.property165 = 165;
+        this.property166 = 166;
+        this.property167 = 167;
+        this.property168 = 168;
+        this.property169 = 169;
+        this.property170 = 170;
+        this.property171 = 171;
+        this.property172 = 172;
+        this.property173 = 173;
+        this.property174 = 174;
+        this.property175 = 175;
+        this.property176 = 176;
+        this.property177 = 177;
+        this.property178 = 178;
+        this.property179 = 179;
+        this.property180 = 180;
+        this.property181 = 181;
+        this.property182 = 182;
+        this.property183 = 183;
+        this.property184 = 184;
+        this.property185 = 185;
+        this.property186 = 186;
+        this.property187 = 187;
+        this.property188 = 188;
+        this.property189 = 189;
+        this.property190 = 190;
+        this.property191 = 191;
+        this.property192 = 192;
+        this.property193 = 193;
+        this.property194 = 194;
+        this.property195 = 195;
+        this.property196 = 196;
+        this.property197 = 197;
+        this.property198 = 198;
+        this.property199 = 199;
+        this.property200 = 200;
+        this.property201 = 201;
+        this.property202 = 202;
+        this.property203 = 203;
+        this.property204 = 204;
+        this.property205 = 205;
+        this.property206 = 206;
+        this.property207 = 207;
+        this.property208 = 208;
+        this.property209 = 209;
+        this.property210 = 210;
+        this.property211 = 211;
+        this.property212 = 212;
+        this.property213 = 213;
+        this.property214 = 214;
+        this.property215 = 215;
+        this.property216 = 216;
+        this.property217 = 217;
+        this.property218 = 218;
+        this.property219 = 219;
+        this.property220 = 220;
+        this.property221 = 221;
+        this.property222 = 222;
+        this.property223 = 223;
+        this.property224 = 224;
+        this.property225 = 225;
+        this.property226 = 226;
+        this.property227 = 227;
+        this.property228 = 228;
+        this.property229 = 229;
+        this.property230 = 230;
+        this.property231 = 231;
+        this.property232 = 232;
+        this.property233 = 233;
+        this.property234 = 234;
+        this.property235 = 235;
+        this.property236 = 236;
+        this.property237 = 237;
+        this.property238 = 238;
+        this.property239 = 239;
+        this.property240 = 240;
+        this.property241 = 241;
+        this.property242 = 242;
+        this.property243 = 243;
+        this.property244 = 244;
+        this.property245 = 245;
+        this.property246 = 246;
+        this.property247 = 247;
+        this.property248 = 248;
+        this.property249 = 249;
+        this.property250 = 250;
+        this.property251 = 251;
+        this.property252 = 252;
+        this.property253 = 253;
+        this.property254 = 254;
+        this.property255 = 255;
+        this.property256 = 256;
+        this.property257 = 257;
+        this.property258 = 258;
+        this.property259 = 259;
+        this.property260 = 260;
+        this.property261 = 261;
+        this.property262 = 262;
+        this.property263 = 263;
+        this.property264 = 264;
+        this.property265 = 265;
+        this.property266 = 266;
+        this.property267 = 267;
+        this.property268 = 268;
+        this.property269 = 269;
+        this.property270 = 270;
+        this.property271 = 271;
+        this.property272 = 272;
+        this.property273 = 273;
+        this.property274 = 274;
+        this.property275 = 275;
+        this.property276 = 276;
+        this.property277 = 277;
+        this.property278 = 278;
+        this.property279 = 279;
+        this.property280 = 280;
+        this.property281 = 281;
+        this.property282 = 282;
+        this.property283 = 283;
+        this.property284 = 284;
+        this.property285 = 285;
+        this.property286 = 286;
+        this.property287 = 287;
+        this.property288 = 288;
+        this.property289 = 289;
+        this.property290 = 290;
+        this.property291 = 291;
+        this.property292 = 292;
+        this.property293 = 293;
+        this.property294 = 294;
+        this.property295 = 295;
+        this.property296 = 296;
+        this.property297 = 297;
+        this.property298 = 298;
+        this.property299 = 299;
+        this.property300 = 300;
+        this.property301 = 301;
+        this.property302 = 302;
+        this.property303 = 303;
+        this.property304 = 304;
+        this.property305 = 305;
+        this.property306 = 306;
+        this.property307 = 307;
+        this.property308 = 308;
+        this.property309 = 309;
+        this.property310 = 310;
+        this.property311 = 311;
+        this.property312 = 312;
+        this.property313 = 313;
+        this.property314 = 314;
+        this.property315 = 315;
+        this.property316 = 316;
+        this.property317 = 317;
+        this.property318 = 318;
+        this.property319 = 319;
+        this.property320 = 320;
+        this.property321 = 321;
+        this.property322 = 322;
+        this.property323 = 323;
+        this.property324 = 324;
+        this.property325 = 325;
+        this.property326 = 326;
+        this.property327 = 327;
+        this.property328 = 328;
+        this.property329 = 329;
+        this.property330 = 330;
+        this.property331 = 331;
+        this.property332 = 332;
+        this.property333 = 333;
+        this.property334 = 334;
+        this.property335 = 335;
+        this.property336 = 336;
+        this.property337 = 337;
+        this.property338 = 338;
+        this.property339 = 339;
+        this.property340 = 340;
+        this.property341 = 341;
+        this.property342 = 342;
+        this.property343 = 343;
+        this.property344 = 344;
+        this.property345 = 345;
+        this.property346 = 346;
+        this.property347 = 347;
+        this.property348 = 348;
+        this.property349 = 349;
+        this.property350 = 350;
+        this.property351 = 351;
+        this.property352 = 352;
+        this.property353 = 353;
+        this.property354 = 354;
+        this.property355 = 355;
+        this.property356 = 356;
+        this.property357 = 357;
+        this.property358 = 358;
+        this.property359 = 359;
+        this.property360 = 360;
+        this.property361 = 361;
+        this.property362 = 362;
+        this.property363 = 363;
+        this.property364 = 364;
+        this.property365 = 365;
+        this.property366 = 366;
+        this.property367 = 367;
+        this.property368 = 368;
+        this.property369 = 369;
+        this.property370 = 370;
+        this.property371 = 371;
+        this.property372 = 372;
+        this.property373 = 373;
+        this.property374 = 374;
+        this.property375 = 375;
+        this.property376 = 376;
+        this.property377 = 377;
+        this.property378 = 378;
+        this.property379 = 379;
+        this.property380 = 380;
+        this.property381 = 381;
+        this.property382 = 382;
+        this.property383 = 383;
+        this.property384 = 384;
+        this.property385 = 385;
+        this.property386 = 386;
+        this.property387 = 387;
+        this.property388 = 388;
+        this.property389 = 389;
+        this.property390 = 390;
+        this.property391 = 391;
+        this.property392 = 392;
+        this.property393 = 393;
+        this.property394 = 394;
+        this.property395 = 395;
+        this.property396 = 396;
+        this.property397 = 397;
+        this.property398 = 398;
+        this.property399 = 399;
+        this.property400 = 400;
+        this.property401 = 401;
+        this.property402 = 402;
+        this.property403 = 403;
+        this.property404 = 404;
+        this.property405 = 405;
+        this.property406 = 406;
+        this.property407 = 407;
+        this.property408 = 408;
+        this.property409 = 409;
+        this.property410 = 410;
+        this.property411 = 411;
+        this.property412 = 412;
+        this.property413 = 413;
+        this.property414 = 414;
+        this.property415 = 415;
+        this.property416 = 416;
+        this.property417 = 417;
+        this.property418 = 418;
+        this.property419 = 419;
+        this.property420 = 420;
+        this.property421 = 421;
+        this.property422 = 422;
+        this.property423 = 423;
+        this.property424 = 424;
+        this.property425 = 425;
+        this.property426 = 426;
+        this.property427 = 427;
+        this.property428 = 428;
+        this.property429 = 429;
+        this.property430 = 430;
+        this.property431 = 431;
+        this.property432 = 432;
+        this.property433 = 433;
+        this.property434 = 434;
+        this.property435 = 435;
+        this.property436 = 436;
+        this.property437 = 437;
+        this.property438 = 438;
+        this.property439 = 439;
+        this.property440 = 440;
+        this.property441 = 441;
+        this.property442 = 442;
+        this.property443 = 443;
+        this.property444 = 444;
+        this.property445 = 445;
+        this.property446 = 446;
+        this.property447 = 447;
+        this.property448 = 448;
+        this.property449 = 449;
+        this.property450 = 450;
+        this.property451 = 451;
+        this.property452 = 452;
+        this.property453 = 453;
+        this.property454 = 454;
+        this.property455 = 455;
+        this.property456 = 456;
+        this.property457 = 457;
+        this.property458 = 458;
+        this.property459 = 459;
+        this.property460 = 460;
+        this.property461 = 461;
+        this.property462 = 462;
+        this.property463 = 463;
+        this.property464 = 464;
+        this.property465 = 465;
+        this.property466 = 466;
+        this.property467 = 467;
+        this.property468 = 468;
+        this.property469 = 469;
+        this.property470 = 470;
+        this.property471 = 471;
+        this.property472 = 472;
+        this.property473 = 473;
+        this.property474 = 474;
+        this.property475 = 475;
+        this.property476 = 476;
+        this.property477 = 477;
+        this.property478 = 478;
+        this.property479 = 479;
+        this.property480 = 480;
+        this.property481 = 481;
+        this.property482 = 482;
+        this.property483 = 483;
+        this.property484 = 484;
+        this.property485 = 485;
+        this.property486 = 486;
+        this.property487 = 487;
+        this.property488 = 488;
+        this.property489 = 489;
+        this.property490 = 490;
+        this.property491 = 491;
+        this.property492 = 492;
+        this.property493 = 493;
+        this.property494 = 494;
+        this.property495 = 495;
+        this.property496 = 496;
+        this.property497 = 497;
+        this.property498 = 498;
+        this.property499 = 499;
+        this.property500 = 500;
+        this.property501 = 501;
+        this.property502 = 502;
+        this.property503 = 503;
+        this.property504 = 504;
+        this.property505 = 505;
+        this.property506 = 506;
+        this.property507 = 507;
+        this.property508 = 508;
+        this.property509 = 509;
+        this.property510 = 510;
+        this.property511 = 511;
+        this.property512 = 512;
+        this.property513 = 513;
+        this.property514 = 514;
+        this.property515 = 515;
+        this.property516 = 516;
+        this.property517 = 517;
+        this.property518 = 518;
+        this.property519 = 519;
+        this.property520 = 520;
+        this.property521 = 521;
+        this.property522 = 522;
+        this.property523 = 523;
+        this.property524 = 524;
+        this.property525 = 525;
+        this.property526 = 526;
+        this.property527 = 527;
+        this.property528 = 528;
+        this.property529 = 529;
+        this.property530 = 530;
+        this.property531 = 531;
+        this.property532 = 532;
+        this.property533 = 533;
+        this.property534 = 534;
+        this.property535 = 535;
+        this.property536 = 536;
+        this.property537 = 537;
+        this.property538 = 538;
+        this.property539 = 539;
+        this.property540 = 540;
+        this.property541 = 541;
+        this.property542 = 542;
+        this.property543 = 543;
+        this.property544 = 544;
+        this.property545 = 545;
+        this.property546 = 546;
+        this.property547 = 547;
+        this.property548 = 548;
+        this.property549 = 549;
+        this.property550 = 550;
+        this.property551 = 551;
+        this.property552 = 552;
+        this.property553 = 553;
+        this.property554 = 554;
+        this.property555 = 555;
+        this.property556 = 556;
+        this.property557 = 557;
+        this.property558 = 558;
+        this.property559 = 559;
+        this.property560 = 560;
+        this.property561 = 561;
+        this.property562 = 562;
+        this.property563 = 563;
+        this.property564 = 564;
+        this.property565 = 565;
+        this.property566 = 566;
+        this.property567 = 567;
+        this.property568 = 568;
+        this.property569 = 569;
+        this.property570 = 570;
+        this.property571 = 571;
+        this.property572 = 572;
+        this.property573 = 573;
+        this.property574 = 574;
+        this.property575 = 575;
+        this.property576 = 576;
+        this.property577 = 577;
+        this.property578 = 578;
+        this.property579 = 579;
+        this.property580 = 580;
+        this.property581 = 581;
+        this.property582 = 582;
+        this.property583 = 583;
+        this.property584 = 584;
+        this.property585 = 585;
+        this.property586 = 586;
+        this.property587 = 587;
+        this.property588 = 588;
+        this.property589 = 589;
+        this.property590 = 590;
+        this.property591 = 591;
+        this.property592 = 592;
+        this.property593 = 593;
+        this.property594 = 594;
+        this.property595 = 595;
+        this.property596 = 596;
+        this.property597 = 597;
+        this.property598 = 598;
+        this.property599 = 599;
+        this.property600 = 600;
+        this.property601 = 601;
+        this.property602 = 602;
+        this.property603 = 603;
+        this.property604 = 604;
+        this.property605 = 605;
+        this.property606 = 606;
+        this.property607 = 607;
+        this.property608 = 608;
+        this.property609 = 609;
+        this.property610 = 610;
+        this.property611 = 611;
+        this.property612 = 612;
+        this.property613 = 613;
+        this.property614 = 614;
+        this.property615 = 615;
+        this.property616 = 616;
+        this.property617 = 617;
+        this.property618 = 618;
+        this.property619 = 619;
+        this.property620 = 620;
+        this.property621 = 621;
+        this.property622 = 622;
+        this.property623 = 623;
+        this.property624 = 624;
+        this.property625 = 625;
+        this.property626 = 626;
+        this.property627 = 627;
+        this.property628 = 628;
+        this.property629 = 629;
+        this.property630 = 630;
+        this.property631 = 631;
+        this.property632 = 632;
+        this.property633 = 633;
+        this.property634 = 634;
+        this.property635 = 635;
+        this.property636 = 636;
+        this.property637 = 637;
+        this.property638 = 638;
+        this.property639 = 639;
+        this.property640 = 640;
+        this.property641 = 641;
+        this.property642 = 642;
+        this.property643 = 643;
+        this.property644 = 644;
+        this.property645 = 645;
+        this.property646 = 646;
+        this.property647 = 647;
+        this.property648 = 648;
+        this.property649 = 649;
+        this.property650 = 650;
+        this.property651 = 651;
+        this.property652 = 652;
+        this.property653 = 653;
+        this.property654 = 654;
+        this.property655 = 655;
+        this.property656 = 656;
+        this.property657 = 657;
+        this.property658 = 658;
+        this.property659 = 659;
+        this.property660 = 660;
+        this.property661 = 661;
+        this.property662 = 662;
+        this.property663 = 663;
+        this.property664 = 664;
+        this.property665 = 665;
+        this.property666 = 666;
+        this.property667 = 667;
+        this.property668 = 668;
+        this.property669 = 669;
+        this.property670 = 670;
+        this.property671 = 671;
+        this.property672 = 672;
+        this.property673 = 673;
+        this.property674 = 674;
+        this.property675 = 675;
+        this.property676 = 676;
+        this.property677 = 677;
+        this.property678 = 678;
+        this.property679 = 679;
+        this.property680 = 680;
+        this.property681 = 681;
+        this.property682 = 682;
+        this.property683 = 683;
+        this.property684 = 684;
+        this.property685 = 685;
+        this.property686 = 686;
+        this.property687 = 687;
+        this.property688 = 688;
+        this.property689 = 689;
+        this.property690 = 690;
+        this.property691 = 691;
+        this.property692 = 692;
+        this.property693 = 693;
+        this.property694 = 694;
+        this.property695 = 695;
+        this.property696 = 696;
+        this.property697 = 697;
+        this.property698 = 698;
+        this.property699 = 699;
+        this.property700 = 700;
+        this.property701 = 701;
+        this.property702 = 702;
+        this.property703 = 703;
+        this.property704 = 704;
+        this.property705 = 705;
+        this.property706 = 706;
+        this.property707 = 707;
+        this.property708 = 708;
+        this.property709 = 709;
+        this.property710 = 710;
+        this.property711 = 711;
+        this.property712 = 712;
+        this.property713 = 713;
+        this.property714 = 714;
+        this.property715 = 715;
+        this.property716 = 716;
+        this.property717 = 717;
+        this.property718 = 718;
+        this.property719 = 719;
+        this.property720 = 720;
+        this.property721 = 721;
+        this.property722 = 722;
+        this.property723 = 723;
+        this.property724 = 724;
+        this.property725 = 725;
+        this.property726 = 726;
+        this.property727 = 727;
+        this.property728 = 728;
+        this.property729 = 729;
+        this.property730 = 730;
+        this.property731 = 731;
+        this.property732 = 732;
+        this.property733 = 733;
+        this.property734 = 734;
+        this.property735 = 735;
+        this.property736 = 736;
+        this.property737 = 737;
+        this.property738 = 738;
+        this.property739 = 739;
+        this.property740 = 740;
+        this.property741 = 741;
+        this.property742 = 742;
+        this.property743 = 743;
+        this.property744 = 744;
+        this.property745 = 745;
+        this.property746 = 746;
+        this.property747 = 747;
+        this.property748 = 748;
+        this.property749 = 749;
+        this.property750 = 750;
+        this.property751 = 751;
+        this.property752 = 752;
+        this.property753 = 753;
+        this.property754 = 754;
+        this.property755 = 755;
+        this.property756 = 756;
+        this.property757 = 757;
+        this.property758 = 758;
+        this.property759 = 759;
+        this.property760 = 760;
+        this.property761 = 761;
+        this.property762 = 762;
+        this.property763 = 763;
+        this.property764 = 764;
+        this.property765 = 765;
+        this.property766 = 766;
+        this.property767 = 767;
+        this.property768 = 768;
+        this.property769 = 769;
+        this.property770 = 770;
+        this.property771 = 771;
+        this.property772 = 772;
+        this.property773 = 773;
+        this.property774 = 774;
+        this.property775 = 775;
+        this.property776 = 776;
+        this.property777 = 777;
+        this.property778 = 778;
+        this.property779 = 779;
+        this.property780 = 780;
+        this.property781 = 781;
+        this.property782 = 782;
+        this.property783 = 783;
+        this.property784 = 784;
+        this.property785 = 785;
+        this.property786 = 786;
+        this.property787 = 787;
+        this.property788 = 788;
+        this.property789 = 789;
+        this.property790 = 790;
+        this.property791 = 791;
+        this.property792 = 792;
+        this.property793 = 793;
+        this.property794 = 794;
+        this.property795 = 795;
+        this.property796 = 796;
+        this.property797 = 797;
+        this.property798 = 798;
+        this.property799 = 799;
+        this.property800 = 800;
+        this.property801 = 801;
+        this.property802 = 802;
+        this.property803 = 803;
+        this.property804 = 804;
+        this.property805 = 805;
+        this.property806 = 806;
+        this.property807 = 807;
+        this.property808 = 808;
+        this.property809 = 809;
+        this.property810 = 810;
+        this.property811 = 811;
+        this.property812 = 812;
+        this.property813 = 813;
+        this.property814 = 814;
+        this.property815 = 815;
+        this.property816 = 816;
+        this.property817 = 817;
+        this.property818 = 818;
+        this.property819 = 819;
+        this.property820 = 820;
+        this.property821 = 821;
+        this.property822 = 822;
+        this.property823 = 823;
+        this.property824 = 824;
+        this.property825 = 825;
+        this.property826 = 826;
+        this.property827 = 827;
+        this.property828 = 828;
+        this.property829 = 829;
+        this.property830 = 830;
+        this.property831 = 831;
+        this.property832 = 832;
+        this.property833 = 833;
+        this.property834 = 834;
+        this.property835 = 835;
+        this.property836 = 836;
+        this.property837 = 837;
+        this.property838 = 838;
+        this.property839 = 839;
+        this.property840 = 840;
+        this.property841 = 841;
+        this.property842 = 842;
+        this.property843 = 843;
+        this.property844 = 844;
+        this.property845 = 845;
+        this.property846 = 846;
+        this.property847 = 847;
+        this.property848 = 848;
+        this.property849 = 849;
+        this.property850 = 850;
+        this.property851 = 851;
+        this.property852 = 852;
+        this.property853 = 853;
+        this.property854 = 854;
+        this.property855 = 855;
+        this.property856 = 856;
+        this.property857 = 857;
+        this.property858 = 858;
+        this.property859 = 859;
+        this.property860 = 860;
+        this.property861 = 861;
+        this.property862 = 862;
+        this.property863 = 863;
+        this.property864 = 864;
+        this.property865 = 865;
+        this.property866 = 866;
+        this.property867 = 867;
+        this.property868 = 868;
+        this.property869 = 869;
+        this.property870 = 870;
+        this.property871 = 871;
+        this.property872 = 872;
+        this.property873 = 873;
+        this.property874 = 874;
+        this.property875 = 875;
+        this.property876 = 876;
+        this.property877 = 877;
+        this.property878 = 878;
+        this.property879 = 879;
+        this.property880 = 880;
+        this.property881 = 881;
+        this.property882 = 882;
+        this.property883 = 883;
+        this.property884 = 884;
+        this.property885 = 885;
+        this.property886 = 886;
+        this.property887 = 887;
+        this.property888 = 888;
+        this.property889 = 889;
+        this.property890 = 890;
+        this.property891 = 891;
+        this.property892 = 892;
+        this.property893 = 893;
+        this.property894 = 894;
+        this.property895 = 895;
+        this.property896 = 896;
+        this.property897 = 897;
+        this.property898 = 898;
+        this.property899 = 899;
+        this.property900 = 900;
+        this.property901 = 901;
+        this.property902 = 902;
+        this.property903 = 903;
+        this.property904 = 904;
+        this.property905 = 905;
+        this.property906 = 906;
+        this.property907 = 907;
+        this.property908 = 908;
+        this.property909 = 909;
+        this.property910 = 910;
+        this.property911 = 911;
+        this.property912 = 912;
+        this.property913 = 913;
+        this.property914 = 914;
+        this.property915 = 915;
+        this.property916 = 916;
+        this.property917 = 917;
+        this.property918 = 918;
+        this.property919 = 919;
+        this.property920 = 920;
+        this.property921 = 921;
+        this.property922 = 922;
+        this.property923 = 923;
+        this.property924 = 924;
+        this.property925 = 925;
+        this.property926 = 926;
+        this.property927 = 927;
+        this.property928 = 928;
+        this.property929 = 929;
+        this.property930 = 930;
+        this.property931 = 931;
+        this.property932 = 932;
+        this.property933 = 933;
+        this.property934 = 934;
+        this.property935 = 935;
+        this.property936 = 936;
+        this.property937 = 937;
+        this.property938 = 938;
+        this.property939 = 939;
+        this.property940 = 940;
+        this.property941 = 941;
+        this.property942 = 942;
+        this.property943 = 943;
+        this.property944 = 944;
+        this.property945 = 945;
+        this.property946 = 946;
+        this.property947 = 947;
+        this.property948 = 948;
+        this.property949 = 949;
+        this.property950 = 950;
+        this.property951 = 951;
+        this.property952 = 952;
+        this.property953 = 953;
+        this.property954 = 954;
+        this.property955 = 955;
+        this.property956 = 956;
+        this.property957 = 957;
+        this.property958 = 958;
+        this.property959 = 959;
+        this.property960 = 960;
+        this.property961 = 961;
+        this.property962 = 962;
+        this.property963 = 963;
+        this.property964 = 964;
+        this.property965 = 965;
+        this.property966 = 966;
+        this.property967 = 967;
+        this.property968 = 968;
+        this.property969 = 969;
+        this.property970 = 970;
+        this.property971 = 971;
+        this.property972 = 972;
+        this.property973 = 973;
+        this.property974 = 974;
+        this.property975 = 975;
+        this.property976 = 976;
+        this.property977 = 977;
+        this.property978 = 978;
+        this.property979 = 979;
+        this.property980 = 980;
+        this.property981 = 981;
+        this.property982 = 982;
+        this.property983 = 983;
+        this.property984 = 984;
+        this.property985 = 985;
+        this.property986 = 986;
+        this.property987 = 987;
+        this.property988 = 988;
+        this.property989 = 989;
+        this.property990 = 990;
+        this.property991 = 991;
+        this.property992 = 992;
+        this.property993 = 993;
+        this.property994 = 994;
+        this.property995 = 995;
+        this.property996 = 996;
+        this.property997 = 997;
+        this.property998 = 998;
+        this.property999 = 999;
+        this.property1000 = 1000;
+    }
+    new Foo();
+}
+
+test1();
+test2();
+test3();
index d9f5c5a..084aa19 100644 (file)
@@ -1,3 +1,15 @@
+2018-10-26  Tadeu Zagallo  <tzagallo@apple.com>
+
+        New bytecode format for JSC
+        https://bugs.webkit.org/show_bug.cgi?id=187373
+        <rdar://problem/44186758>
+
+        Reviewed by Filip Pizlo.
+
+        Don't use recursion on `equal` to avoid premature stack overflows when testing deep arrays.
+
+        * fast/dom/Window/resources/postmessage-test.js:
+
 2018-10-26  Antoine Quint  <graouts@apple.com>
 
         [Web Animations] Remove useless internals methods
index a7743bf..286f236 100644 (file)
@@ -10,57 +10,68 @@ var evalThunks = [];
 
 function equal(actual, expected)
 {
-    if (actual === expected)
-        return true;
-    if (typeof actual !== typeof expected)
-        return false;
-    if ((actual instanceof Date) || (expected instanceof Date)) {
-        if ((actual instanceof Date) && (expected instanceof Date))
-            return (expected instanceof Date) && actual.getTime() == expected.getTime();
-        return false;
-    }
-    if ((actual instanceof Number) || (expected instanceof Number)) {
-        return (actual instanceof Number) && (expected instanceof Number) &&
-            (expected.valueOf() == actual.valueOf());
-    }
-    if ((actual instanceof Boolean) || (expected instanceof Boolean)) {
-        return (actual instanceof Boolean) && (expected instanceof Boolean) &&
-            (expected.valueOf() == actual.valueOf());
-    }
-    if ((actual instanceof String) || (expected instanceof String)) {
-        return (actual instanceof String) && (expected instanceof String) &&
-            (expected.valueOf() == actual.valueOf());
-    }
-    if (Array.isArray(actual) || Array.isArray(expected)) {
-        if (!Array.isArray(actual) || !Array.isArray(expected))
+    var actualQueue = [actual];
+    var expectedQueue = [expected];
+    while (actualQueue.length && expectedQueue.length) {
+        var actual = actualQueue.shift();
+        var expected = expectedQueue.shift();
+
+        if (actual === expected)
+            continue;
+        if (typeof actual !== typeof expected)
+            return false;
+        if ((actual instanceof Date) || (expected instanceof Date)) {
+            if ((actual instanceof Date) && (expected instanceof Date) && actual.getTime() == expected.getTime())
+                continue;
+            return false;
+        }
+        if ((actual instanceof Number) || (expected instanceof Number)) {
+            if ((actual instanceof Number) && (expected instanceof Number) && (expected.valueOf() == actual.valueOf()))
+                continue;
             return false;
-        if (actual.length != expected.length)
+        }
+        if ((actual instanceof Boolean) || (expected instanceof Boolean)) {
+            if ((actual instanceof Boolean) && (expected instanceof Boolean) && (expected.valueOf() == actual.valueOf()))
+                continue;
+            return false;
+        }
+        if ((actual instanceof String) || (expected instanceof String)) {
+            if ((actual instanceof String) && (expected instanceof String) && (expected.valueOf() == actual.valueOf()))
+                continue;
             return false;
-        for (var i = 0; i < actual.length; i++) {
-            if ((i in actual) ^ (i in expected))
+        }
+        if (Array.isArray(actual) || Array.isArray(expected)) {
+            if (!Array.isArray(actual) || !Array.isArray(expected))
                 return false;
-            if (!equal(actual[i], expected[i]))
+            if (actual.length != expected.length)
                 return false;
+            for (var i = 0; i < actual.length; i++) {
+                if ((i in actual) ^ (i in expected))
+                    return false;
+                actualQueue.push(actual[i]);
+                expectedQueue.push(expected[i]);
+            }
+            continue;
         }
-        return true;
-    }
-    if (actual.constructor !== expected.constructor)
-        return false;
-    try {
-        var keys = Object.keys(actual);
-    } catch(e) {
-        return false;
-    }
-    try {
-    if (!equal(keys, Object.keys(expected)))
-        return false;
-    } catch(e) {
-        return false;
-    }
-    for (var i = 0; i < keys.length; i++) {
-        if (!equal(actual[keys[i]], expected[keys[i]]))
+        if (actual.constructor !== expected.constructor)
             return false;
+        try {
+            var keys = Object.keys(actual);
+        } catch(e) {
+            return false;
+        }
+        try {
+        if (!equal(keys, Object.keys(expected)))
+            return false;
+        } catch(e) {
+            return false;
+        }
+        for (var i = 0; i < keys.length; i++) {
+            actualQueue.push(actual[keys[i]]);
+            expectedQueue.push(expected[keys[i]]);
+        }
     }
+
     return true;
 }
 
index 2291b03..b41dce9 100644 (file)
@@ -201,11 +201,27 @@ set(OFFLINE_ASM
     offlineasm/x86.rb
 )
 
+set(GENERATOR
+    generator/Argument.rb
+    generator/Assertion.rb
+    generator/DSL.rb
+    generator/Fits.rb
+    generator/GeneratedFile.rb
+    generator/Metadata.rb
+    generator/Opcode.rb
+    generator/OpcodeGroup.rb
+    generator/Options.rb
+    generator/Section.rb
+    generator/Template.rb
+    generator/Type.rb
+    generator/main.rb
+)
+
 add_custom_command(
-    OUTPUT ${DERIVED_SOURCES_JAVASCRIPTCORE_DIR}/Bytecodes.h ${DERIVED_SOURCES_JAVASCRIPTCORE_DIR}/InitBytecodes.asm ${DERIVED_SOURCES_JAVASCRIPTCORE_DIR}/BytecodeStructs.h
-    MAIN_DEPENDENCY ${JAVASCRIPTCORE_DIR}/generate-bytecode-files
-    DEPENDS ${JAVASCRIPTCORE_DIR}/generate-bytecode-files bytecode/BytecodeList.json
-    COMMAND ${PYTHON_EXECUTABLE} ${JAVASCRIPTCORE_DIR}/generate-bytecode-files --bytecodes_h ${DERIVED_SOURCES_JAVASCRIPTCORE_DIR}/Bytecodes.h --init_bytecodes_asm ${DERIVED_SOURCES_JAVASCRIPTCORE_DIR}/InitBytecodes.asm --bytecode_structs_h ${DERIVED_SOURCES_JAVASCRIPTCORE_DIR}/BytecodeStructs.h ${JAVASCRIPTCORE_DIR}/bytecode/BytecodeList.json
+    OUTPUT ${DERIVED_SOURCES_JAVASCRIPTCORE_DIR}/Bytecodes.h ${DERIVED_SOURCES_JAVASCRIPTCORE_DIR}/InitBytecodes.asm ${DERIVED_SOURCES_JAVASCRIPTCORE_DIR}/BytecodeStructs.h ${DERIVED_SOURCES_JAVASCRIPTCORE_DIR}/BytecodeIndices.h
+    MAIN_DEPENDENCY ${JAVASCRIPTCORE_DIR}/generator/main.rb
+    DEPENDS ${GENERATOR} bytecode/BytecodeList.rb
+    COMMAND ${RUBY_EXECUTABLE} ${JAVASCRIPTCORE_DIR}/generator/main.rb --bytecodes_h ${DERIVED_SOURCES_JAVASCRIPTCORE_DIR}/Bytecodes.h --init_bytecodes_asm ${DERIVED_SOURCES_JAVASCRIPTCORE_DIR}/InitBytecodes.asm --bytecode_structs_h ${DERIVED_SOURCES_JAVASCRIPTCORE_DIR}/BytecodeStructs.h --bytecode_indices_h ${DERIVED_SOURCES_JAVASCRIPTCORE_DIR}/BytecodeIndices.h ${JAVASCRIPTCORE_DIR}/bytecode/BytecodeList.rb
     VERBATIM)
 
 list(APPEND JavaScriptCore_HEADERS
@@ -466,13 +482,17 @@ set(JavaScriptCore_PRIVATE_FRAMEWORK_HEADERS
     bytecode/ICStatusMap.h
     bytecode/InlineCallFrame.h
     bytecode/Instruction.h
+    bytecode/InstructionStream.h
     bytecode/InternalFunctionAllocationProfile.h
     bytecode/JumpTable.h
     bytecode/LLIntCallLinkInfo.h
     bytecode/LLIntPrototypeLoadAdaptiveStructureWatchpoint.h
     bytecode/LazyOperandValueProfile.h
+    bytecode/MetadataTable.h
     bytecode/ObjectAllocationProfile.h
     bytecode/ObjectPropertyCondition.h
+    bytecode/Opcode.h
+    bytecode/OpcodeSize.h
     bytecode/PropertyCondition.h
     bytecode/PutByIdFlags.h
     bytecode/SpecialPointer.h
@@ -485,6 +505,7 @@ set(JavaScriptCore_PRIVATE_FRAMEWORK_HEADERS
     bytecode/UnlinkedEvalCodeBlock.h
     bytecode/UnlinkedFunctionExecutable.h
     bytecode/UnlinkedGlobalCodeBlock.h
+    bytecode/UnlinkedMetadataTable.h
     bytecode/ValueProfile.h
     bytecode/ValueRecovery.h
     bytecode/VariableWriteFireDetail.h
@@ -669,6 +690,8 @@ set(JavaScriptCore_PRIVATE_FRAMEWORK_HEADERS
     jit/ThunkGenerator.h
     jit/UnusedPointer.h
 
+    llint/LLIntOpcode.h
+
     parser/ParserError.h
     parser/ParserModes.h
     parser/ParserTokens.h
index b55b830..19645c2 100644 (file)
@@ -1,3 +1,852 @@
+2018-10-26  Tadeu Zagallo  <tzagallo@apple.com>
+
+        New bytecode format for JSC
+        https://bugs.webkit.org/show_bug.cgi?id=187373
+        <rdar://problem/44186758>
+
+        Reviewed by Filip Pizlo.
+
+        Replace unlinked and linked bytecode with a new immutable bytecode that does not embed
+        any addresses. Instructions can be encoded as narrow (1-byte operands) or wide (4-byte
+        operands) and might contain an extra operand, the metadataID. The metadataID is used to
+        access the instruction's mutable data in a side table in the CodeBlock (the MetadataTable).
+
+        Bytecodes now must be structs declared in the new BytecodeList.rb. All bytecodes give names
+        and types to all its operands. Additionally, reading a bytecode from the instruction stream
+        requires decoding the whole bytecode, i.e. it's no longer possible to access arbitrary
+        operands directly from the stream.
+
+
+        * CMakeLists.txt:
+        * DerivedSources.make:
+        * JavaScriptCore.xcodeproj/project.pbxproj:
+        * Sources.txt:
+        * assembler/MacroAssemblerCodeRef.h:
+        (JSC::ReturnAddressPtr::ReturnAddressPtr):
+        (JSC::ReturnAddressPtr::value const):
+        (JSC::MacroAssemblerCodePtr::MacroAssemblerCodePtr):
+        (JSC::MacroAssemblerCodePtr::createFromExecutableAddress):
+        * bytecode/ArithProfile.h:
+        (JSC::ArithProfile::ArithProfile):
+        * bytecode/ArrayAllocationProfile.h:
+        (JSC::ArrayAllocationProfile::ArrayAllocationProfile):
+        * bytecode/ArrayProfile.h:
+        * bytecode/BytecodeBasicBlock.cpp:
+        (JSC::isJumpTarget):
+        (JSC::BytecodeBasicBlock::computeImpl):
+        (JSC::BytecodeBasicBlock::compute):
+        * bytecode/BytecodeBasicBlock.h:
+        (JSC::BytecodeBasicBlock::leaderOffset const):
+        (JSC::BytecodeBasicBlock::totalLength const):
+        (JSC::BytecodeBasicBlock::offsets const):
+        (JSC::BytecodeBasicBlock::BytecodeBasicBlock):
+        (JSC::BytecodeBasicBlock::addLength):
+        * bytecode/BytecodeDumper.cpp:
+        (JSC::BytecodeDumper<Block>::printLocationAndOp):
+        (JSC::BytecodeDumper<Block>::dumpBytecode):
+        (JSC::BytecodeDumper<Block>::dumpIdentifiers):
+        (JSC::BytecodeDumper<Block>::dumpConstants):
+        (JSC::BytecodeDumper<Block>::dumpExceptionHandlers):
+        (JSC::BytecodeDumper<Block>::dumpSwitchJumpTables):
+        (JSC::BytecodeDumper<Block>::dumpStringSwitchJumpTables):
+        (JSC::BytecodeDumper<Block>::dumpBlock):
+        * bytecode/BytecodeDumper.h:
+        (JSC::BytecodeDumper::dumpOperand):
+        (JSC::BytecodeDumper::dumpValue):
+        (JSC::BytecodeDumper::BytecodeDumper):
+        (JSC::BytecodeDumper::block const):
+        * bytecode/BytecodeGeneratorification.cpp:
+        (JSC::BytecodeGeneratorification::BytecodeGeneratorification):
+        (JSC::BytecodeGeneratorification::enterPoint const):
+        (JSC::BytecodeGeneratorification::instructions const):
+        (JSC::GeneratorLivenessAnalysis::run):
+        (JSC::BytecodeGeneratorification::run):
+        (JSC::performGeneratorification):
+        * bytecode/BytecodeGeneratorification.h:
+        * bytecode/BytecodeGraph.h:
+        (JSC::BytecodeGraph::blockContainsBytecodeOffset):
+        (JSC::BytecodeGraph::findBasicBlockForBytecodeOffset):
+        (JSC::BytecodeGraph::findBasicBlockWithLeaderOffset):
+        (JSC::BytecodeGraph::BytecodeGraph):
+        * bytecode/BytecodeKills.h:
+        * bytecode/BytecodeList.json: Removed.
+        * bytecode/BytecodeList.rb: Added.
+        * bytecode/BytecodeLivenessAnalysis.cpp:
+        (JSC::BytecodeLivenessAnalysis::dumpResults):
+        * bytecode/BytecodeLivenessAnalysis.h:
+        * bytecode/BytecodeLivenessAnalysisInlines.h:
+        (JSC::isValidRegisterForLiveness):
+        (JSC::BytecodeLivenessPropagation::stepOverInstruction):
+        * bytecode/BytecodeRewriter.cpp:
+        (JSC::BytecodeRewriter::applyModification):
+        (JSC::BytecodeRewriter::execute):
+        (JSC::BytecodeRewriter::adjustJumpTargetsInFragment):
+        (JSC::BytecodeRewriter::insertImpl):
+        (JSC::BytecodeRewriter::adjustJumpTarget):
+        (JSC::BytecodeRewriter::adjustJumpTargets):
+        * bytecode/BytecodeRewriter.h:
+        (JSC::BytecodeRewriter::InsertionPoint::InsertionPoint):
+        (JSC::BytecodeRewriter::Fragment::Fragment):
+        (JSC::BytecodeRewriter::Fragment::appendInstruction):
+        (JSC::BytecodeRewriter::BytecodeRewriter):
+        (JSC::BytecodeRewriter::insertFragmentBefore):
+        (JSC::BytecodeRewriter::insertFragmentAfter):
+        (JSC::BytecodeRewriter::removeBytecode):
+        (JSC::BytecodeRewriter::adjustAbsoluteOffset):
+        (JSC::BytecodeRewriter::adjustJumpTarget):
+        * bytecode/BytecodeUseDef.h:
+        (JSC::computeUsesForBytecodeOffset):
+        (JSC::computeDefsForBytecodeOffset):
+        * bytecode/CallLinkStatus.cpp:
+        (JSC::CallLinkStatus::computeFromLLInt):
+        * bytecode/CodeBlock.cpp:
+        (JSC::CodeBlock::dumpBytecode):
+        (JSC::CodeBlock::CodeBlock):
+        (JSC::CodeBlock::finishCreation):
+        (JSC::CodeBlock::estimatedSize):
+        (JSC::CodeBlock::visitChildren):
+        (JSC::CodeBlock::propagateTransitions):
+        (JSC::CodeBlock::finalizeLLIntInlineCaches):
+        (JSC::CodeBlock::addJITAddIC):
+        (JSC::CodeBlock::addJITMulIC):
+        (JSC::CodeBlock::addJITSubIC):
+        (JSC::CodeBlock::addJITNegIC):
+        (JSC::CodeBlock::stronglyVisitStrongReferences):
+        (JSC::CodeBlock::ensureCatchLivenessIsComputedForBytecodeOffset):
+        (JSC::CodeBlock::ensureCatchLivenessIsComputedForBytecodeOffsetSlow):
+        (JSC::CodeBlock::hasOpDebugForLineAndColumn):
+        (JSC::CodeBlock::getArrayProfile):
+        (JSC::CodeBlock::updateAllArrayPredictions):
+        (JSC::CodeBlock::predictedMachineCodeSize):
+        (JSC::CodeBlock::tryGetValueProfileForBytecodeOffset):
+        (JSC::CodeBlock::valueProfilePredictionForBytecodeOffset):
+        (JSC::CodeBlock::valueProfileForBytecodeOffset):
+        (JSC::CodeBlock::validate):
+        (JSC::CodeBlock::outOfLineJumpOffset):
+        (JSC::CodeBlock::outOfLineJumpTarget):
+        (JSC::CodeBlock::arithProfileForBytecodeOffset):
+        (JSC::CodeBlock::arithProfileForPC):
+        (JSC::CodeBlock::couldTakeSpecialFastCase):
+        (JSC::CodeBlock::insertBasicBlockBoundariesForControlFlowProfiler):
+        * bytecode/CodeBlock.h:
+        (JSC::CodeBlock::addMathIC):
+        (JSC::CodeBlock::outOfLineJumpOffset):
+        (JSC::CodeBlock::bytecodeOffset):
+        (JSC::CodeBlock::instructions const):
+        (JSC::CodeBlock::instructionCount const):
+        (JSC::CodeBlock::llintBaselineCalleeSaveSpaceAsVirtualRegisters):
+        (JSC::CodeBlock::metadata):
+        (JSC::CodeBlock::metadataSizeInBytes):
+        (JSC::CodeBlock::numberOfNonArgumentValueProfiles):
+        (JSC::CodeBlock::totalNumberOfValueProfiles):
+        * bytecode/CodeBlockInlines.h: Added.
+        (JSC::CodeBlock::forEachValueProfile):
+        (JSC::CodeBlock::forEachArrayProfile):
+        (JSC::CodeBlock::forEachArrayAllocationProfile):
+        (JSC::CodeBlock::forEachObjectAllocationProfile):
+        (JSC::CodeBlock::forEachLLIntCallLinkInfo):
+        * bytecode/Fits.h: Added.
+        * bytecode/GetByIdMetadata.h: Copied from Source/JavaScriptCore/bytecode/LLIntPrototypeLoadAdaptiveStructureWatchpoint.h.
+        * bytecode/GetByIdStatus.cpp:
+        (JSC::GetByIdStatus::computeFromLLInt):
+        * bytecode/Instruction.h:
+        (JSC::Instruction::Instruction):
+        (JSC::Instruction::Impl::opcodeID const):
+        (JSC::Instruction::opcodeID const):
+        (JSC::Instruction::name const):
+        (JSC::Instruction::isWide const):
+        (JSC::Instruction::size const):
+        (JSC::Instruction::is const):
+        (JSC::Instruction::as const):
+        (JSC::Instruction::cast):
+        (JSC::Instruction::cast const):
+        (JSC::Instruction::narrow const):
+        (JSC::Instruction::wide const):
+        * bytecode/InstructionStream.cpp: Copied from Source/JavaScriptCore/bytecode/SpecialPointer.cpp.
+        (JSC::InstructionStream::InstructionStream):
+        (JSC::InstructionStream::sizeInBytes const):
+        * bytecode/InstructionStream.h: Added.
+        (JSC::InstructionStream::BaseRef::BaseRef):
+        (JSC::InstructionStream::BaseRef::operator=):
+        (JSC::InstructionStream::BaseRef::operator-> const):
+        (JSC::InstructionStream::BaseRef::ptr const):
+        (JSC::InstructionStream::BaseRef::operator!= const):
+        (JSC::InstructionStream::BaseRef::next const):
+        (JSC::InstructionStream::BaseRef::offset const):
+        (JSC::InstructionStream::BaseRef::isValid const):
+        (JSC::InstructionStream::BaseRef::unwrap const):
+        (JSC::InstructionStream::MutableRef::freeze const):
+        (JSC::InstructionStream::MutableRef::operator->):
+        (JSC::InstructionStream::MutableRef::ptr):
+        (JSC::InstructionStream::MutableRef::operator Ref):
+        (JSC::InstructionStream::MutableRef::unwrap):
+        (JSC::InstructionStream::iterator::operator*):
+        (JSC::InstructionStream::iterator::operator++):
+        (JSC::InstructionStream::begin const):
+        (JSC::InstructionStream::end const):
+        (JSC::InstructionStream::at const):
+        (JSC::InstructionStream::size const):
+        (JSC::InstructionStreamWriter::InstructionStreamWriter):
+        (JSC::InstructionStreamWriter::ref):
+        (JSC::InstructionStreamWriter::seek):
+        (JSC::InstructionStreamWriter::position):
+        (JSC::InstructionStreamWriter::write):
+        (JSC::InstructionStreamWriter::rewind):
+        (JSC::InstructionStreamWriter::finalize):
+        (JSC::InstructionStreamWriter::swap):
+        (JSC::InstructionStreamWriter::iterator::operator*):
+        (JSC::InstructionStreamWriter::iterator::operator++):
+        (JSC::InstructionStreamWriter::begin):
+        (JSC::InstructionStreamWriter::end):
+        * bytecode/LLIntPrototypeLoadAdaptiveStructureWatchpoint.cpp:
+        (JSC::LLIntPrototypeLoadAdaptiveStructureWatchpoint::LLIntPrototypeLoadAdaptiveStructureWatchpoint):
+        (JSC::LLIntPrototypeLoadAdaptiveStructureWatchpoint::fireInternal):
+        (JSC::LLIntPrototypeLoadAdaptiveStructureWatchpoint::clearLLIntGetByIdCache):
+        * bytecode/LLIntPrototypeLoadAdaptiveStructureWatchpoint.h:
+        * bytecode/MetadataTable.cpp: Copied from Source/JavaScriptCore/bytecode/SpecialPointer.cpp.
+        (JSC::MetadataTable::MetadataTable):
+        (JSC::DeallocTable::withOpcodeType):
+        (JSC::MetadataTable::~MetadataTable):
+        (JSC::MetadataTable::sizeInBytes):
+        * bytecode/MetadataTable.h: Copied from Source/JavaScriptCore/runtime/Watchdog.h.
+        (JSC::MetadataTable::get):
+        (JSC::MetadataTable::forEach):
+        (JSC::MetadataTable::getImpl):
+        * bytecode/Opcode.cpp:
+        (JSC::metadataSize):
+        * bytecode/Opcode.h:
+        (JSC::padOpcodeName):
+        * bytecode/OpcodeInlines.h:
+        (JSC::isOpcodeShape):
+        (JSC::getOpcodeType):
+        * bytecode/OpcodeSize.h: Copied from Source/JavaScriptCore/bytecode/SpecialPointer.cpp.
+        * bytecode/PreciseJumpTargets.cpp:
+        (JSC::getJumpTargetsForInstruction):
+        (JSC::computePreciseJumpTargetsInternal):
+        (JSC::computePreciseJumpTargets):
+        (JSC::recomputePreciseJumpTargets):
+        (JSC::findJumpTargetsForInstruction):
+        * bytecode/PreciseJumpTargets.h:
+        * bytecode/PreciseJumpTargetsInlines.h:
+        (JSC::jumpTargetForInstruction):
+        (JSC::extractStoredJumpTargetsForInstruction):
+        (JSC::updateStoredJumpTargetsForInstruction):
+        * bytecode/PutByIdStatus.cpp:
+        (JSC::PutByIdStatus::computeFromLLInt):
+        * bytecode/SpecialPointer.cpp:
+        (WTF::printInternal):
+        * bytecode/SpecialPointer.h:
+        * bytecode/UnlinkedCodeBlock.cpp:
+        (JSC::UnlinkedCodeBlock::UnlinkedCodeBlock):
+        (JSC::UnlinkedCodeBlock::visitChildren):
+        (JSC::UnlinkedCodeBlock::estimatedSize):
+        (JSC::UnlinkedCodeBlock::lineNumberForBytecodeOffset):
+        (JSC::dumpLineColumnEntry):
+        (JSC::UnlinkedCodeBlock::expressionRangeForBytecodeOffset const):
+        (JSC::UnlinkedCodeBlock::setInstructions):
+        (JSC::UnlinkedCodeBlock::instructions const):
+        (JSC::UnlinkedCodeBlock::applyModification):
+        (JSC::UnlinkedCodeBlock::addOutOfLineJumpTarget):
+        (JSC::UnlinkedCodeBlock::outOfLineJumpOffset):
+        * bytecode/UnlinkedCodeBlock.h:
+        (JSC::UnlinkedCodeBlock::addPropertyAccessInstruction):
+        (JSC::UnlinkedCodeBlock::propertyAccessInstructions const):
+        (JSC::UnlinkedCodeBlock::addOpProfileControlFlowBytecodeOffset):
+        (JSC::UnlinkedCodeBlock::opProfileControlFlowBytecodeOffsets const):
+        (JSC::UnlinkedCodeBlock::metadata):
+        (JSC::UnlinkedCodeBlock::metadataSizeInBytes):
+        (JSC::UnlinkedCodeBlock::outOfLineJumpOffset):
+        (JSC::UnlinkedCodeBlock::replaceOutOfLineJumpTargets):
+        * bytecode/UnlinkedInstructionStream.cpp: Removed.
+        * bytecode/UnlinkedInstructionStream.h: Removed.
+        * bytecode/UnlinkedMetadataTable.h: Copied from Source/JavaScriptCore/bytecode/LLIntPrototypeLoadAdaptiveStructureWatchpoint.h.
+        * bytecode/UnlinkedMetadataTableInlines.h: Added.
+        (JSC::UnlinkedMetadataTable::UnlinkedMetadataTable):
+        (JSC::UnlinkedMetadataTable::~UnlinkedMetadataTable):
+        (JSC::UnlinkedMetadataTable::addEntry):
+        (JSC::UnlinkedMetadataTable::sizeInBytes):
+        (JSC::UnlinkedMetadataTable::finalize):
+        (JSC::UnlinkedMetadataTable::link):
+        (JSC::UnlinkedMetadataTable::unlink):
+        * bytecode/VirtualRegister.cpp:
+        (JSC::VirtualRegister::VirtualRegister):
+        * bytecode/VirtualRegister.h:
+        * bytecompiler/BytecodeGenerator.cpp:
+        (JSC::Label::setLocation):
+        (JSC::Label::bind):
+        (JSC::BytecodeGenerator::generate):
+        (JSC::BytecodeGenerator::BytecodeGenerator):
+        (JSC::BytecodeGenerator::initializeVarLexicalEnvironment):
+        (JSC::BytecodeGenerator::emitEnter):
+        (JSC::BytecodeGenerator::emitLoopHint):
+        (JSC::BytecodeGenerator::emitJump):
+        (JSC::BytecodeGenerator::emitCheckTraps):
+        (JSC::BytecodeGenerator::rewind):
+        (JSC::BytecodeGenerator::fuseCompareAndJump):
+        (JSC::BytecodeGenerator::fuseTestAndJmp):
+        (JSC::BytecodeGenerator::emitJumpIfTrue):
+        (JSC::BytecodeGenerator::emitJumpIfFalse):
+        (JSC::BytecodeGenerator::emitJumpIfNotFunctionCall):
+        (JSC::BytecodeGenerator::emitJumpIfNotFunctionApply):
+        (JSC::BytecodeGenerator::moveLinkTimeConstant):
+        (JSC::BytecodeGenerator::moveEmptyValue):
+        (JSC::BytecodeGenerator::emitMove):
+        (JSC::BytecodeGenerator::emitUnaryOp):
+        (JSC::BytecodeGenerator::emitBinaryOp):
+        (JSC::BytecodeGenerator::emitToObject):
+        (JSC::BytecodeGenerator::emitToNumber):
+        (JSC::BytecodeGenerator::emitToString):
+        (JSC::BytecodeGenerator::emitTypeOf):
+        (JSC::BytecodeGenerator::emitInc):
+        (JSC::BytecodeGenerator::emitDec):
+        (JSC::BytecodeGenerator::emitEqualityOp):
+        (JSC::BytecodeGenerator::emitProfileType):
+        (JSC::BytecodeGenerator::emitProfileControlFlow):
+        (JSC::BytecodeGenerator::pushLexicalScopeInternal):
+        (JSC::BytecodeGenerator::emitResolveScopeForHoistingFuncDeclInEval):
+        (JSC::BytecodeGenerator::prepareLexicalScopeForNextForLoopIteration):
+        (JSC::BytecodeGenerator::emitOverridesHasInstance):
+        (JSC::BytecodeGenerator::emitResolveScope):
+        (JSC::BytecodeGenerator::emitGetFromScope):
+        (JSC::BytecodeGenerator::emitPutToScope):
+        (JSC::BytecodeGenerator::emitInstanceOf):
+        (JSC::BytecodeGenerator::emitInstanceOfCustom):
+        (JSC::BytecodeGenerator::emitInByVal):
+        (JSC::BytecodeGenerator::emitInById):
+        (JSC::BytecodeGenerator::emitTryGetById):
+        (JSC::BytecodeGenerator::emitGetById):
+        (JSC::BytecodeGenerator::emitDirectGetById):
+        (JSC::BytecodeGenerator::emitPutById):
+        (JSC::BytecodeGenerator::emitDirectPutById):
+        (JSC::BytecodeGenerator::emitPutGetterById):
+        (JSC::BytecodeGenerator::emitPutSetterById):
+        (JSC::BytecodeGenerator::emitPutGetterSetter):
+        (JSC::BytecodeGenerator::emitPutGetterByVal):
+        (JSC::BytecodeGenerator::emitPutSetterByVal):
+        (JSC::BytecodeGenerator::emitDeleteById):
+        (JSC::BytecodeGenerator::emitGetByVal):
+        (JSC::BytecodeGenerator::emitPutByVal):
+        (JSC::BytecodeGenerator::emitDirectPutByVal):
+        (JSC::BytecodeGenerator::emitDeleteByVal):
+        (JSC::BytecodeGenerator::emitSuperSamplerBegin):
+        (JSC::BytecodeGenerator::emitSuperSamplerEnd):
+        (JSC::BytecodeGenerator::emitIdWithProfile):
+        (JSC::BytecodeGenerator::emitUnreachable):
+        (JSC::BytecodeGenerator::emitGetArgument):
+        (JSC::BytecodeGenerator::emitCreateThis):
+        (JSC::BytecodeGenerator::emitTDZCheck):
+        (JSC::BytecodeGenerator::emitNewObject):
+        (JSC::BytecodeGenerator::emitNewArrayBuffer):
+        (JSC::BytecodeGenerator::emitNewArray):
+        (JSC::BytecodeGenerator::emitNewArrayWithSpread):
+        (JSC::BytecodeGenerator::emitNewArrayWithSize):
+        (JSC::BytecodeGenerator::emitNewRegExp):
+        (JSC::BytecodeGenerator::emitNewFunctionExpressionCommon):
+        (JSC::BytecodeGenerator::emitNewDefaultConstructor):
+        (JSC::BytecodeGenerator::emitNewFunction):
+        (JSC::BytecodeGenerator::emitSetFunctionNameIfNeeded):
+        (JSC::BytecodeGenerator::emitCall):
+        (JSC::BytecodeGenerator::emitCallInTailPosition):
+        (JSC::BytecodeGenerator::emitCallEval):
+        (JSC::BytecodeGenerator::emitExpectedFunctionSnippet):
+        (JSC::BytecodeGenerator::emitCallVarargs):
+        (JSC::BytecodeGenerator::emitCallVarargsInTailPosition):
+        (JSC::BytecodeGenerator::emitConstructVarargs):
+        (JSC::BytecodeGenerator::emitCallForwardArgumentsInTailPosition):
+        (JSC::BytecodeGenerator::emitLogShadowChickenPrologueIfNecessary):
+        (JSC::BytecodeGenerator::emitLogShadowChickenTailIfNecessary):
+        (JSC::BytecodeGenerator::emitCallDefineProperty):
+        (JSC::BytecodeGenerator::emitReturn):
+        (JSC::BytecodeGenerator::emitEnd):
+        (JSC::BytecodeGenerator::emitConstruct):
+        (JSC::BytecodeGenerator::emitStrcat):
+        (JSC::BytecodeGenerator::emitToPrimitive):
+        (JSC::BytecodeGenerator::emitGetScope):
+        (JSC::BytecodeGenerator::emitPushWithScope):
+        (JSC::BytecodeGenerator::emitGetParentScope):
+        (JSC::BytecodeGenerator::emitDebugHook):
+        (JSC::BytecodeGenerator::emitCatch):
+        (JSC::BytecodeGenerator::emitThrow):
+        (JSC::BytecodeGenerator::emitArgumentCount):
+        (JSC::BytecodeGenerator::emitThrowStaticError):
+        (JSC::BytecodeGenerator::beginSwitch):
+        (JSC::prepareJumpTableForSwitch):
+        (JSC::prepareJumpTableForStringSwitch):
+        (JSC::BytecodeGenerator::endSwitch):
+        (JSC::BytecodeGenerator::emitGetEnumerableLength):
+        (JSC::BytecodeGenerator::emitHasGenericProperty):
+        (JSC::BytecodeGenerator::emitHasIndexedProperty):
+        (JSC::BytecodeGenerator::emitHasStructureProperty):
+        (JSC::BytecodeGenerator::emitGetPropertyEnumerator):
+        (JSC::BytecodeGenerator::emitEnumeratorStructurePropertyName):
+        (JSC::BytecodeGenerator::emitEnumeratorGenericPropertyName):
+        (JSC::BytecodeGenerator::emitToIndexString):
+        (JSC::BytecodeGenerator::emitIsCellWithType):
+        (JSC::BytecodeGenerator::emitIsObject):
+        (JSC::BytecodeGenerator::emitIsNumber):
+        (JSC::BytecodeGenerator::emitIsUndefined):
+        (JSC::BytecodeGenerator::emitIsEmpty):
+        (JSC::BytecodeGenerator::emitRestParameter):
+        (JSC::BytecodeGenerator::emitRequireObjectCoercible):
+        (JSC::BytecodeGenerator::emitYieldPoint):
+        (JSC::BytecodeGenerator::emitYield):
+        (JSC::BytecodeGenerator::emitGetAsyncIterator):
+        (JSC::BytecodeGenerator::emitDelegateYield):
+        (JSC::BytecodeGenerator::emitFinallyCompletion):
+        (JSC::BytecodeGenerator::emitJumpIf):
+        (JSC::ForInContext::finalize):
+        (JSC::StructureForInContext::finalize):
+        (JSC::IndexedForInContext::finalize):
+        (JSC::StaticPropertyAnalysis::record):
+        (JSC::BytecodeGenerator::emitToThis):
+        * bytecompiler/BytecodeGenerator.h:
+        (JSC::StructureForInContext::addGetInst):
+        (JSC::BytecodeGenerator::recordOpcode):
+        (JSC::BytecodeGenerator::addMetadataFor):
+        (JSC::BytecodeGenerator::emitUnaryOp):
+        (JSC::BytecodeGenerator::kill):
+        (JSC::BytecodeGenerator::instructions const):
+        (JSC::BytecodeGenerator::write):
+        (JSC::BytecodeGenerator::withWriter):
+        * bytecompiler/Label.h:
+        (JSC::Label::Label):
+        (JSC::Label::bind):
+        * bytecompiler/NodesCodegen.cpp:
+        (JSC::ArrayNode::emitBytecode):
+        (JSC::BytecodeIntrinsicNode::emit_intrinsic_argumentCount):
+        (JSC::ApplyFunctionCallDotNode::emitBytecode):
+        (JSC::BitwiseNotNode::emitBytecode):
+        (JSC::BinaryOpNode::emitBytecode):
+        (JSC::EqualNode::emitBytecode):
+        (JSC::StrictEqualNode::emitBytecode):
+        (JSC::emitReadModifyAssignment):
+        (JSC::ForInNode::emitBytecode):
+        (JSC::CaseBlockNode::emitBytecodeForBlock):
+        (JSC::FunctionNode::emitBytecode):
+        (JSC::ClassExprNode::emitBytecode):
+        * bytecompiler/ProfileTypeBytecodeFlag.cpp: Copied from Source/JavaScriptCore/bytecode/VirtualRegister.cpp.
+        (WTF::printInternal):
+        * bytecompiler/ProfileTypeBytecodeFlag.h: Copied from Source/JavaScriptCore/bytecode/SpecialPointer.cpp.
+        * bytecompiler/RegisterID.h:
+        * bytecompiler/StaticPropertyAnalysis.h:
+        (JSC::StaticPropertyAnalysis::create):
+        (JSC::StaticPropertyAnalysis::StaticPropertyAnalysis):
+        * bytecompiler/StaticPropertyAnalyzer.h:
+        (JSC::StaticPropertyAnalyzer::createThis):
+        (JSC::StaticPropertyAnalyzer::newObject):
+        (JSC::StaticPropertyAnalyzer::putById):
+        (JSC::StaticPropertyAnalyzer::mov):
+        (JSC::StaticPropertyAnalyzer::kill):
+        * dfg/DFGByteCodeParser.cpp:
+        (JSC::DFG::ByteCodeParser::addCall):
+        (JSC::DFG::ByteCodeParser::getPredictionWithoutOSRExit):
+        (JSC::DFG::ByteCodeParser::getArrayMode):
+        (JSC::DFG::ByteCodeParser::handleCall):
+        (JSC::DFG::ByteCodeParser::handleVarargsCall):
+        (JSC::DFG::ByteCodeParser::handleRecursiveTailCall):
+        (JSC::DFG::ByteCodeParser::inlineCall):
+        (JSC::DFG::ByteCodeParser::handleCallVariant):
+        (JSC::DFG::ByteCodeParser::handleVarargsInlining):
+        (JSC::DFG::ByteCodeParser::handleInlining):
+        (JSC::DFG::ByteCodeParser::handleMinMax):
+        (JSC::DFG::ByteCodeParser::handleIntrinsicCall):
+        (JSC::DFG::ByteCodeParser::handleDOMJITCall):
+        (JSC::DFG::ByteCodeParser::handleIntrinsicGetter):
+        (JSC::DFG::ByteCodeParser::handleDOMJITGetter):
+        (JSC::DFG::ByteCodeParser::handleModuleNamespaceLoad):
+        (JSC::DFG::ByteCodeParser::handleTypedArrayConstructor):
+        (JSC::DFG::ByteCodeParser::handleConstantInternalFunction):
+        (JSC::DFG::ByteCodeParser::handleGetById):
+        (JSC::DFG::ByteCodeParser::handlePutById):
+        (JSC::DFG::ByteCodeParser::parseGetById):
+        (JSC::DFG::ByteCodeParser::parseBlock):
+        (JSC::DFG::ByteCodeParser::parseCodeBlock):
+        (JSC::DFG::ByteCodeParser::handlePutByVal):
+        (JSC::DFG::ByteCodeParser::handlePutAccessorById):
+        (JSC::DFG::ByteCodeParser::handlePutAccessorByVal):
+        (JSC::DFG::ByteCodeParser::handleNewFunc):
+        (JSC::DFG::ByteCodeParser::handleNewFuncExp):
+        (JSC::DFG::ByteCodeParser::parse):
+        * dfg/DFGCapabilities.cpp:
+        (JSC::DFG::capabilityLevel):
+        * dfg/DFGCapabilities.h:
+        (JSC::DFG::capabilityLevel):
+        * dfg/DFGOSREntry.cpp:
+        (JSC::DFG::prepareCatchOSREntry):
+        * dfg/DFGSpeculativeJIT.cpp:
+        (JSC::DFG::SpeculativeJIT::compileValueAdd):
+        (JSC::DFG::SpeculativeJIT::compileValueSub):
+        (JSC::DFG::SpeculativeJIT::compileValueNegate):
+        (JSC::DFG::SpeculativeJIT::compileArithMul):
+        * ftl/FTLLowerDFGToB3.cpp:
+        (JSC::FTL::DFG::LowerDFGToB3::compileValueAdd):
+        (JSC::FTL::DFG::LowerDFGToB3::compileValueSub):
+        (JSC::FTL::DFG::LowerDFGToB3::compileUnaryMathIC):
+        (JSC::FTL::DFG::LowerDFGToB3::compileBinaryMathIC):
+        (JSC::FTL::DFG::LowerDFGToB3::compileArithAddOrSub):
+        (JSC::FTL::DFG::LowerDFGToB3::compileArithMul):
+        (JSC::FTL::DFG::LowerDFGToB3::compileValueNegate):
+        * ftl/FTLOperations.cpp:
+        (JSC::FTL::operationMaterializeObjectInOSR):
+        * generate-bytecode-files: Removed.
+        * generator/Argument.rb: Added.
+        * generator/Assertion.rb: Added.
+        * generator/DSL.rb: Added.
+        * generator/Fits.rb: Added.
+        * generator/GeneratedFile.rb: Added.
+        * generator/Metadata.rb: Added.
+        * generator/Opcode.rb: Added.
+        * generator/OpcodeGroup.rb: Added.
+        * generator/Options.rb: Added.
+        * generator/Section.rb: Added.
+        * generator/Template.rb: Added.
+        * generator/Type.rb: Added.
+        * generator/main.rb: Added.
+        * interpreter/AbstractPC.h:
+        * interpreter/CallFrame.cpp:
+        (JSC::CallFrame::currentVPC const):
+        (JSC::CallFrame::setCurrentVPC):
+        * interpreter/CallFrame.h:
+        (JSC::CallSiteIndex::CallSiteIndex):
+        (JSC::ExecState::setReturnPC):
+        * interpreter/Interpreter.cpp:
+        (WTF::printInternal):
+        * interpreter/Interpreter.h:
+        * interpreter/InterpreterInlines.h:
+        * interpreter/StackVisitor.cpp:
+        (JSC::StackVisitor::Frame::dump const):
+        * interpreter/VMEntryRecord.h:
+        * jit/JIT.cpp:
+        (JSC::JIT::JIT):
+        (JSC::JIT::emitSlowCaseCall):
+        (JSC::JIT::privateCompileMainPass):
+        (JSC::JIT::privateCompileSlowCases):
+        (JSC::JIT::compileWithoutLinking):
+        (JSC::JIT::link):
+        * jit/JIT.h:
+        * jit/JITArithmetic.cpp:
+        (JSC::JIT::emit_op_jless):
+        (JSC::JIT::emit_op_jlesseq):
+        (JSC::JIT::emit_op_jgreater):
+        (JSC::JIT::emit_op_jgreatereq):
+        (JSC::JIT::emit_op_jnless):
+        (JSC::JIT::emit_op_jnlesseq):
+        (JSC::JIT::emit_op_jngreater):
+        (JSC::JIT::emit_op_jngreatereq):
+        (JSC::JIT::emitSlow_op_jless):
+        (JSC::JIT::emitSlow_op_jlesseq):
+        (JSC::JIT::emitSlow_op_jgreater):
+        (JSC::JIT::emitSlow_op_jgreatereq):
+        (JSC::JIT::emitSlow_op_jnless):
+        (JSC::JIT::emitSlow_op_jnlesseq):
+        (JSC::JIT::emitSlow_op_jngreater):
+        (JSC::JIT::emitSlow_op_jngreatereq):
+        (JSC::JIT::emit_op_below):
+        (JSC::JIT::emit_op_beloweq):
+        (JSC::JIT::emit_op_jbelow):
+        (JSC::JIT::emit_op_jbeloweq):
+        (JSC::JIT::emit_op_unsigned):
+        (JSC::JIT::emit_compareAndJump):
+        (JSC::JIT::emit_compareUnsignedAndJump):
+        (JSC::JIT::emit_compareUnsigned):
+        (JSC::JIT::emit_compareAndJumpSlow):
+        (JSC::JIT::emit_op_inc):
+        (JSC::JIT::emit_op_dec):
+        (JSC::JIT::emit_op_mod):
+        (JSC::JIT::emitSlow_op_mod):
+        (JSC::JIT::emit_op_negate):
+        (JSC::JIT::emitSlow_op_negate):
+        (JSC::JIT::emitBitBinaryOpFastPath):
+        (JSC::JIT::emit_op_bitand):
+        (JSC::JIT::emit_op_bitor):
+        (JSC::JIT::emit_op_bitxor):
+        (JSC::JIT::emit_op_lshift):
+        (JSC::JIT::emitRightShiftFastPath):
+        (JSC::JIT::emit_op_rshift):
+        (JSC::JIT::emit_op_urshift):
+        (JSC::getOperandTypes):
+        (JSC::JIT::emit_op_add):
+        (JSC::JIT::emitSlow_op_add):
+        (JSC::JIT::emitMathICFast):
+        (JSC::JIT::emitMathICSlow):
+        (JSC::JIT::emit_op_div):
+        (JSC::JIT::emit_op_mul):
+        (JSC::JIT::emitSlow_op_mul):
+        (JSC::JIT::emit_op_sub):
+        (JSC::JIT::emitSlow_op_sub):
+        * jit/JITCall.cpp:
+        (JSC::JIT::emitPutCallResult):
+        (JSC::JIT::compileSetupFrame):
+        (JSC::JIT::compileCallEval):
+        (JSC::JIT::compileCallEvalSlowCase):
+        (JSC::JIT::compileTailCall):
+        (JSC::JIT::compileOpCall):
+        (JSC::JIT::compileOpCallSlowCase):
+        (JSC::JIT::emit_op_call):
+        (JSC::JIT::emit_op_tail_call):
+        (JSC::JIT::emit_op_call_eval):
+        (JSC::JIT::emit_op_call_varargs):
+        (JSC::JIT::emit_op_tail_call_varargs):
+        (JSC::JIT::emit_op_tail_call_forward_arguments):
+        (JSC::JIT::emit_op_construct_varargs):
+        (JSC::JIT::emit_op_construct):
+        (JSC::JIT::emitSlow_op_call):
+        (JSC::JIT::emitSlow_op_tail_call):
+        (JSC::JIT::emitSlow_op_call_eval):
+        (JSC::JIT::emitSlow_op_call_varargs):
+        (JSC::JIT::emitSlow_op_tail_call_varargs):
+        (JSC::JIT::emitSlow_op_tail_call_forward_arguments):
+        (JSC::JIT::emitSlow_op_construct_varargs):
+        (JSC::JIT::emitSlow_op_construct):
+        * jit/JITDisassembler.cpp:
+        (JSC::JITDisassembler::JITDisassembler):
+        * jit/JITExceptions.cpp:
+        (JSC::genericUnwind):
+        * jit/JITInlines.h:
+        (JSC::JIT::emitDoubleGetByVal):
+        (JSC::JIT::emitLoadForArrayMode):
+        (JSC::JIT::emitContiguousGetByVal):
+        (JSC::JIT::emitArrayStorageGetByVal):
+        (JSC::JIT::appendCallWithExceptionCheckSetJSValueResultWithProfile):
+        (JSC::JIT::sampleInstruction):
+        (JSC::JIT::emitValueProfilingSiteIfProfiledOpcode):
+        (JSC::JIT::emitValueProfilingSite):
+        (JSC::JIT::jumpTarget):
+        (JSC::JIT::copiedGetPutInfo):
+        (JSC::JIT::copiedArithProfile):
+        * jit/JITMathIC.h:
+        (JSC::isProfileEmpty):
+        (JSC::JITBinaryMathIC::JITBinaryMathIC):
+        (JSC::JITUnaryMathIC::JITUnaryMathIC):
+        * jit/JITOpcodes.cpp:
+        (JSC::JIT::emit_op_mov):
+        (JSC::JIT::emit_op_end):
+        (JSC::JIT::emit_op_jmp):
+        (JSC::JIT::emit_op_new_object):
+        (JSC::JIT::emitSlow_op_new_object):
+        (JSC::JIT::emit_op_overrides_has_instance):
+        (JSC::JIT::emit_op_instanceof):
+        (JSC::JIT::emitSlow_op_instanceof):
+        (JSC::JIT::emit_op_instanceof_custom):
+        (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_ret):
+        (JSC::JIT::emit_op_to_primitive):
+        (JSC::JIT::emit_op_set_function_name):
+        (JSC::JIT::emit_op_not):
+        (JSC::JIT::emit_op_jfalse):
+        (JSC::JIT::emit_op_jeq_null):
+        (JSC::JIT::emit_op_jneq_null):
+        (JSC::JIT::emit_op_jneq_ptr):
+        (JSC::JIT::emit_op_eq):
+        (JSC::JIT::emit_op_jeq):
+        (JSC::JIT::emit_op_jtrue):
+        (JSC::JIT::emit_op_neq):
+        (JSC::JIT::emit_op_jneq):
+        (JSC::JIT::emit_op_throw):
+        (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::emit_op_to_number):
+        (JSC::JIT::emit_op_to_string):
+        (JSC::JIT::emit_op_to_object):
+        (JSC::JIT::emit_op_catch):
+        (JSC::JIT::emit_op_identity_with_profile):
+        (JSC::JIT::emit_op_get_parent_scope):
+        (JSC::JIT::emit_op_switch_imm):
+        (JSC::JIT::emit_op_switch_char):
+        (JSC::JIT::emit_op_switch_string):
+        (JSC::JIT::emit_op_debug):
+        (JSC::JIT::emit_op_eq_null):
+        (JSC::JIT::emit_op_neq_null):
+        (JSC::JIT::emit_op_enter):
+        (JSC::JIT::emit_op_get_scope):
+        (JSC::JIT::emit_op_to_this):
+        (JSC::JIT::emit_op_create_this):
+        (JSC::JIT::emit_op_check_tdz):
+        (JSC::JIT::emitSlow_op_eq):
+        (JSC::JIT::emitSlow_op_neq):
+        (JSC::JIT::emitSlow_op_jeq):
+        (JSC::JIT::emitSlow_op_jneq):
+        (JSC::JIT::emitSlow_op_instanceof_custom):
+        (JSC::JIT::emit_op_loop_hint):
+        (JSC::JIT::emitSlow_op_loop_hint):
+        (JSC::JIT::emit_op_check_traps):
+        (JSC::JIT::emit_op_nop):
+        (JSC::JIT::emit_op_super_sampler_begin):
+        (JSC::JIT::emit_op_super_sampler_end):
+        (JSC::JIT::emitSlow_op_check_traps):
+        (JSC::JIT::emit_op_new_regexp):
+        (JSC::JIT::emitNewFuncCommon):
+        (JSC::JIT::emit_op_new_func):
+        (JSC::JIT::emit_op_new_generator_func):
+        (JSC::JIT::emit_op_new_async_generator_func):
+        (JSC::JIT::emit_op_new_async_func):
+        (JSC::JIT::emitNewFuncExprCommon):
+        (JSC::JIT::emit_op_new_func_exp):
+        (JSC::JIT::emit_op_new_generator_func_exp):
+        (JSC::JIT::emit_op_new_async_func_exp):
+        (JSC::JIT::emit_op_new_async_generator_func_exp):
+        (JSC::JIT::emit_op_new_array):
+        (JSC::JIT::emit_op_new_array_with_size):
+        (JSC::JIT::emit_op_has_structure_property):
+        (JSC::JIT::privateCompileHasIndexedProperty):
+        (JSC::JIT::emit_op_has_indexed_property):
+        (JSC::JIT::emitSlow_op_has_indexed_property):
+        (JSC::JIT::emit_op_get_direct_pname):
+        (JSC::JIT::emit_op_enumerator_structure_pname):
+        (JSC::JIT::emit_op_enumerator_generic_pname):
+        (JSC::JIT::emit_op_profile_type):
+        (JSC::JIT::emit_op_log_shadow_chicken_prologue):
+        (JSC::JIT::emit_op_log_shadow_chicken_tail):
+        (JSC::JIT::emit_op_profile_control_flow):
+        (JSC::JIT::emit_op_argument_count):
+        (JSC::JIT::emit_op_get_rest_length):
+        (JSC::JIT::emit_op_get_argument):
+        * jit/JITOpcodes32_64.cpp:
+        (JSC::JIT::emit_op_to_this):
+        * jit/JITOperations.cpp:
+        * jit/JITOperations.h:
+        * jit/JITPropertyAccess.cpp:
+        (JSC::JIT::emit_op_get_by_val):
+        (JSC::JIT::emitGetByValWithCachedId):
+        (JSC::JIT::emitSlow_op_get_by_val):
+        (JSC::JIT::emit_op_put_by_val_direct):
+        (JSC::JIT::emit_op_put_by_val):
+        (JSC::JIT::emitGenericContiguousPutByVal):
+        (JSC::JIT::emitArrayStoragePutByVal):
+        (JSC::JIT::emitPutByValWithCachedId):
+        (JSC::JIT::emitSlow_op_put_by_val):
+        (JSC::JIT::emit_op_put_getter_by_id):
+        (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::emit_op_try_get_by_id):
+        (JSC::JIT::emitSlow_op_try_get_by_id):
+        (JSC::JIT::emit_op_get_by_id_direct):
+        (JSC::JIT::emitSlow_op_get_by_id_direct):
+        (JSC::JIT::emit_op_get_by_id):
+        (JSC::JIT::emit_op_get_by_id_with_this):
+        (JSC::JIT::emitSlow_op_get_by_id):
+        (JSC::JIT::emitSlow_op_get_by_id_with_this):
+        (JSC::JIT::emit_op_put_by_id):
+        (JSC::JIT::emitSlow_op_put_by_id):
+        (JSC::JIT::emit_op_in_by_id):
+        (JSC::JIT::emitSlow_op_in_by_id):
+        (JSC::JIT::emit_op_resolve_scope):
+        (JSC::JIT::emit_op_get_from_scope):
+        (JSC::JIT::emitSlow_op_get_from_scope):
+        (JSC::JIT::emit_op_put_to_scope):
+        (JSC::JIT::emitSlow_op_put_to_scope):
+        (JSC::JIT::emit_op_get_from_arguments):
+        (JSC::JIT::emit_op_put_to_arguments):
+        (JSC::JIT::privateCompileGetByVal):
+        (JSC::JIT::privateCompileGetByValWithCachedId):
+        (JSC::JIT::privateCompilePutByVal):
+        (JSC::JIT::privateCompilePutByValWithCachedId):
+        (JSC::JIT::emitDoubleLoad):
+        (JSC::JIT::emitContiguousLoad):
+        (JSC::JIT::emitArrayStorageLoad):
+        (JSC::JIT::emitDirectArgumentsGetByVal):
+        (JSC::JIT::emitScopedArgumentsGetByVal):
+        (JSC::JIT::emitIntTypedArrayGetByVal):
+        (JSC::JIT::emitFloatTypedArrayGetByVal):
+        (JSC::JIT::emitIntTypedArrayPutByVal):
+        (JSC::JIT::emitFloatTypedArrayPutByVal):
+        * jit/RegisterSet.cpp:
+        (JSC::RegisterSet::llintBaselineCalleeSaveRegisters):
+        * jit/SlowPathCall.h:
+        (JSC::JITSlowPathCall::JITSlowPathCall):
+        * llint/LLIntData.cpp:
+        (JSC::LLInt::initialize):
+        (JSC::LLInt::Data::performAssertions):
+        * llint/LLIntData.h:
+        (JSC::LLInt::exceptionInstructions):
+        (JSC::LLInt::opcodeMap):
+        (JSC::LLInt::opcodeMapWide):
+        (JSC::LLInt::getOpcode):
+        (JSC::LLInt::getOpcodeWide):
+        (JSC::LLInt::getWideCodePtr):
+        * llint/LLIntOffsetsExtractor.cpp:
+        * llint/LLIntSlowPaths.cpp:
+        (JSC::LLInt::llint_trace_operand):
+        (JSC::LLInt::llint_trace_value):
+        (JSC::LLInt::LLINT_SLOW_PATH_DECL):
+        (JSC::LLInt::entryOSR):
+        (JSC::LLInt::setupGetByIdPrototypeCache):
+        (JSC::LLInt::getByVal):
+        (JSC::LLInt::handleHostCall):
+        (JSC::LLInt::setUpCall):
+        (JSC::LLInt::genericCall):
+        (JSC::LLInt::varargsSetup):
+        (JSC::LLInt::commonCallEval):
+        * llint/LLIntSlowPaths.h:
+        * llint/LowLevelInterpreter.asm:
+        * llint/LowLevelInterpreter.cpp:
+        (JSC::CLoopRegister::operator const Instruction*):
+        (JSC::CLoop::execute):
+        * llint/LowLevelInterpreter32_64.asm:
+        * llint/LowLevelInterpreter64.asm:
+        * offlineasm/arm64.rb:
+        * offlineasm/asm.rb:
+        * offlineasm/ast.rb:
+        * offlineasm/cloop.rb:
+        * offlineasm/generate_offset_extractor.rb:
+        * offlineasm/instructions.rb:
+        * offlineasm/offsets.rb:
+        * offlineasm/parser.rb:
+        * offlineasm/transform.rb:
+        * offlineasm/x86.rb:
+        * parser/ResultType.h:
+        (JSC::ResultType::dump const):
+        (JSC::OperandTypes::first const):
+        (JSC::OperandTypes::second const):
+        (JSC::OperandTypes::dump const):
+        * profiler/ProfilerBytecodeSequence.cpp:
+        (JSC::Profiler::BytecodeSequence::BytecodeSequence):
+        * runtime/CommonSlowPaths.cpp:
+        (JSC::SLOW_PATH_DECL):
+        (JSC::updateArithProfileForUnaryArithOp):
+        (JSC::updateArithProfileForBinaryArithOp):
+        * runtime/CommonSlowPaths.h:
+        (JSC::CommonSlowPaths::tryCachePutToScopeGlobal):
+        (JSC::CommonSlowPaths::tryCacheGetFromScopeGlobal):
+        * runtime/ExceptionFuzz.cpp:
+        (JSC::doExceptionFuzzing):
+        * runtime/ExceptionFuzz.h:
+        (JSC::doExceptionFuzzingIfEnabled):
+        * runtime/GetPutInfo.cpp: Copied from Source/JavaScriptCore/bytecode/SpecialPointer.cpp.
+        (JSC::GetPutInfo::dump const):
+        (WTF::printInternal):
+        * runtime/GetPutInfo.h:
+        (JSC::GetPutInfo::operand const):
+        * runtime/JSCPoison.h:
+        * runtime/JSType.cpp: Added.
+        (WTF::printInternal):
+        * runtime/JSType.h:
+        * runtime/SamplingProfiler.cpp:
+        (JSC::SamplingProfiler::StackFrame::displayName):
+        * runtime/SamplingProfiler.h:
+        (JSC::SamplingProfiler::UnprocessedStackFrame::UnprocessedStackFrame):
+        * runtime/SlowPathReturnType.h:
+        (JSC::encodeResult):
+        (JSC::decodeResult):
+        * runtime/VM.h:
+        * runtime/Watchdog.h:
+        * tools/HeapVerifier.cpp:
+
 2018-10-26  Commit Queue  <commit-queue@webkit.org>
 
         Unreviewed, rolling out r237445.
index d1745c3..eabd777 100644 (file)
@@ -216,14 +216,8 @@ udis86_itab.h: $(JavaScriptCore)/disassembler/udis86/ud_itab.py $(JavaScriptCore
 
 # Bytecode files
 
-Bytecodes.h: $(JavaScriptCore)/generate-bytecode-files $(JavaScriptCore)/bytecode/BytecodeList.json
-       $(PYTHON) $(JavaScriptCore)/generate-bytecode-files --bytecodes_h Bytecodes.h $(JavaScriptCore)/bytecode/BytecodeList.json
-
-BytecodeStructs.h: $(JavaScriptCore)/generate-bytecode-files $(JavaScriptCore)/bytecode/BytecodeList.json
-       $(PYTHON) $(JavaScriptCore)/generate-bytecode-files --bytecode_structs_h BytecodeStructs.h $(JavaScriptCore)/bytecode/BytecodeList.json
-
-InitBytecodes.asm: $(JavaScriptCore)/generate-bytecode-files $(JavaScriptCore)/bytecode/BytecodeList.json
-       $(PYTHON) $(JavaScriptCore)/generate-bytecode-files --init_bytecodes_asm InitBytecodes.asm $(JavaScriptCore)/bytecode/BytecodeList.json
+Bytecodes.h BytecodeOffsets.h BytecodeStructs.h InitBytecodes.asm: $(wildcard $(JavaScriptCore)/generator/*.rb) $(JavaScriptCore)/bytecode/BytecodeList.rb
+       $(RUBY) $(JavaScriptCore)/generator/main.rb $(JavaScriptCore)/bytecode/BytecodeList.rb --bytecode_structs_h BytecodeStructs.h --init_bytecodes_asm InitBytecodes.asm --bytecodes_h Bytecodes.h --bytecode_indices_h BytecodeIndices.h
 
 # Inspector interfaces
 
index 391221d..39b5bf4 100644 (file)
@@ -14,7 +14,6 @@
                                0F4680AA14BA7FD900BFE272 /* Generate Derived Sources */,
                        );
                        dependencies = (
-                               65442D5018EBB744007AF92F /* PBXTargetDependency */,
                                14BD68992151916D0050DAFF /* PBXTargetDependency */,
                        );
                        name = "LLInt Offsets";
                142E3136134FF0A600AFADB5 /* HandleSet.h in Headers */ = {isa = PBXBuildFile; fileRef = 142E312D134FF0A600AFADB5 /* HandleSet.h */; settings = {ATTRIBUTES = (Private, ); }; };
                142E313B134FF0A600AFADB5 /* Strong.h in Headers */ = {isa = PBXBuildFile; fileRef = 142E3132134FF0A600AFADB5 /* Strong.h */; settings = {ATTRIBUTES = (Private, ); }; };
                142E313C134FF0A600AFADB5 /* Weak.h in Headers */ = {isa = PBXBuildFile; fileRef = 142E3133134FF0A600AFADB5 /* Weak.h */; settings = {ATTRIBUTES = (Private, ); }; };
+               142F16E021558802003D49C9 /* MetadataTable.h in Headers */ = {isa = PBXBuildFile; fileRef = 142F16DF215585C8003D49C9 /* MetadataTable.h */; settings = {ATTRIBUTES = (Private, ); }; };
                14386A751DD69895008652C4 /* DirectEvalExecutable.h in Headers */ = {isa = PBXBuildFile; fileRef = 14386A731DD69895008652C4 /* DirectEvalExecutable.h */; settings = {ATTRIBUTES = (Private, ); }; };
                14386A791DD6989C008652C4 /* IndirectEvalExecutable.h in Headers */ = {isa = PBXBuildFile; fileRef = 14386A771DD6989C008652C4 /* IndirectEvalExecutable.h */; settings = {ATTRIBUTES = (Private, ); }; };
                1440057F0A5335640005F061 /* JSNode.c in Sources */ = {isa = PBXBuildFile; fileRef = 1440F6420A4F8B6A0005F061 /* JSNode.c */; };
                1442566215EDE98D0066A49B /* JSWithScope.h in Headers */ = {isa = PBXBuildFile; fileRef = 1442566015EDE98D0066A49B /* JSWithScope.h */; settings = {ATTRIBUTES = (Private, ); }; };
                144836E7132DA7BE005BE785 /* ConservativeRoots.h in Headers */ = {isa = PBXBuildFile; fileRef = 149DAAF212EB559D0083B12B /* ConservativeRoots.h */; settings = {ATTRIBUTES = (Private, ); }; };
                145722861437E140005FDE26 /* StrongInlines.h in Headers */ = {isa = PBXBuildFile; fileRef = 145722851437E140005FDE26 /* StrongInlines.h */; settings = {ATTRIBUTES = (Private, ); }; };
+               146C384B2177ACDF0079F6D9 /* UnlinkedMetadataTable.h in Headers */ = {isa = PBXBuildFile; fileRef = 142D52BE21762958002DB086 /* UnlinkedMetadataTable.h */; settings = {ATTRIBUTES = (Private, ); }; };
                1471483020D323D30090E630 /* JSWrapperMapTests.mm in Sources */ = {isa = PBXBuildFile; fileRef = 1471482F20D323650090E630 /* JSWrapperMapTests.mm */; };
                147341CC1DC02D7200AA29BA /* ExecutableBase.h in Headers */ = {isa = PBXBuildFile; fileRef = 147341CB1DC02D7200AA29BA /* ExecutableBase.h */; settings = {ATTRIBUTES = (Private, ); }; };
                147341CE1DC02D7900AA29BA /* ScriptExecutable.h in Headers */ = {isa = PBXBuildFile; fileRef = 147341CD1DC02D7900AA29BA /* ScriptExecutable.h */; settings = {ATTRIBUTES = (Private, ); }; };
                14874AE615EBDE4A002E3587 /* JSScope.h in Headers */ = {isa = PBXBuildFile; fileRef = 14874AE215EBDE4A002E3587 /* JSScope.h */; settings = {ATTRIBUTES = (Private, ); }; };
                148A7BF01B82975A002D9157 /* InlineCallFrame.h in Headers */ = {isa = PBXBuildFile; fileRef = 148A7BEE1B82975A002D9157 /* InlineCallFrame.h */; settings = {ATTRIBUTES = (Private, ); }; };
                148CD1D8108CF902008163C6 /* JSContextRefPrivate.h in Headers */ = {isa = PBXBuildFile; fileRef = 148CD1D7108CF902008163C6 /* JSContextRefPrivate.h */; settings = {ATTRIBUTES = (Private, ); }; };
+               1498CAD6214BF36D00710879 /* GetByIdMetadata.h in Headers */ = {isa = PBXBuildFile; fileRef = 1498CAD5214BF36D00710879 /* GetByIdMetadata.h */; };
                14A1563210966365006FA260 /* DateInstanceCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 14A1563010966365006FA260 /* DateInstanceCache.h */; settings = {ATTRIBUTES = (Private, ); }; };
+               14A4680C216FA565000D2B1A /* Instruction.h in Headers */ = {isa = PBXBuildFile; fileRef = 14A4680A216FA535000D2B1A /* Instruction.h */; settings = {ATTRIBUTES = (Private, ); }; };
+               14A4680D216FA56A000D2B1A /* OpcodeSize.h in Headers */ = {isa = PBXBuildFile; fileRef = 14A4680B216FA535000D2B1A /* OpcodeSize.h */; settings = {ATTRIBUTES = (Private, ); }; };
                14AB66761DECF40900A56C26 /* UnlinkedSourceCode.h in Headers */ = {isa = PBXBuildFile; fileRef = 14AB66751DECF40900A56C26 /* UnlinkedSourceCode.h */; settings = {ATTRIBUTES = (Private, ); }; };
                14AD910C1DCA92940014F9FE /* EvalCodeBlock.h in Headers */ = {isa = PBXBuildFile; fileRef = 14AD91061DCA92940014F9FE /* EvalCodeBlock.h */; };
                14AD910D1DCA92940014F9FE /* FunctionCodeBlock.h in Headers */ = {isa = PBXBuildFile; fileRef = 14AD91071DCA92940014F9FE /* FunctionCodeBlock.h */; };
                14BD689D215191C10050DAFF /* LLIntSettingsExtractor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 14BD689C215191B30050DAFF /* LLIntSettingsExtractor.cpp */; };
                14BE7D3317135CF400D1807A /* WeakInlines.h in Headers */ = {isa = PBXBuildFile; fileRef = 14BE7D3217135CF400D1807A /* WeakInlines.h */; settings = {ATTRIBUTES = (Private, ); }; };
                14BFCE6910CDB1FC00364CCE /* WeakGCMap.h in Headers */ = {isa = PBXBuildFile; fileRef = 14BFCE6810CDB1FC00364CCE /* WeakGCMap.h */; settings = {ATTRIBUTES = (Private, ); }; };
+               14C25B9E216EA36A00137764 /* InstructionStream.h in Headers */ = {isa = PBXBuildFile; fileRef = 14CC3BA22138A238002D58B6 /* InstructionStream.h */; settings = {ATTRIBUTES = (Private, ); }; };
                14CA958B16AB50DE00938A06 /* StaticPropertyAnalyzer.h in Headers */ = {isa = PBXBuildFile; fileRef = 14CA958A16AB50DE00938A06 /* StaticPropertyAnalyzer.h */; settings = {ATTRIBUTES = (Private, ); }; };
                14CA958D16AB50FA00938A06 /* ObjectAllocationProfile.h in Headers */ = {isa = PBXBuildFile; fileRef = 14CA958C16AB50FA00938A06 /* ObjectAllocationProfile.h */; settings = {ATTRIBUTES = (Private, ); }; };
                14D2F3DB139F4BE200491031 /* MarkedSpace.h in Headers */ = {isa = PBXBuildFile; fileRef = 14D2F3D9139F4BE200491031 /* MarkedSpace.h */; settings = {ATTRIBUTES = (Private, ); }; };
                14E84FA114EE1ACC00D6D5D4 /* WeakSet.h in Headers */ = {isa = PBXBuildFile; fileRef = 14E84F9C14EE1ACC00D6D5D4 /* WeakSet.h */; settings = {ATTRIBUTES = (Private, ); }; };
                14E84FA214EE1ACC00D6D5D4 /* WeakImpl.h in Headers */ = {isa = PBXBuildFile; fileRef = 14E84F9D14EE1ACC00D6D5D4 /* WeakImpl.h */; settings = {ATTRIBUTES = (Private, ); }; };
                14F7256614EE265E00B1652B /* WeakHandleOwner.h in Headers */ = {isa = PBXBuildFile; fileRef = 14F7256414EE265E00B1652B /* WeakHandleOwner.h */; settings = {ATTRIBUTES = (Private, ); }; };
+               14F79F70216EAFD200046D39 /* Opcode.h in Headers */ = {isa = PBXBuildFile; fileRef = 969A07950ED1D3AE00F1F681 /* Opcode.h */; settings = {ATTRIBUTES = (Private, ); }; };
                1A28D4A8177B71C80007FA3C /* JSStringRefPrivate.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A28D4A7177B71C80007FA3C /* JSStringRefPrivate.h */; settings = {ATTRIBUTES = (Private, ); }; };
                2600B5A7152BAAA70091EE5F /* JSStringJoiner.h in Headers */ = {isa = PBXBuildFile; fileRef = 2600B5A5152BAAA70091EE5F /* JSStringJoiner.h */; };
                262D85B71C0D650F006ACB61 /* AirFixPartialRegisterStalls.h in Headers */ = {isa = PBXBuildFile; fileRef = 262D85B51C0D650F006ACB61 /* AirFixPartialRegisterStalls.h */; };
                969A072B0ED1CE6900F1F681 /* RegisterID.h in Headers */ = {isa = PBXBuildFile; fileRef = 969A07280ED1CE6900F1F681 /* RegisterID.h */; };
                969A07970ED1D3AE00F1F681 /* CodeBlock.h in Headers */ = {isa = PBXBuildFile; fileRef = 969A07910ED1D3AE00F1F681 /* CodeBlock.h */; settings = {ATTRIBUTES = (Private, ); }; };
                969A07980ED1D3AE00F1F681 /* DirectEvalCodeCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 969A07920ED1D3AE00F1F681 /* DirectEvalCodeCache.h */; settings = {ATTRIBUTES = (Private, ); }; };
-               969A07990ED1D3AE00F1F681 /* Instruction.h in Headers */ = {isa = PBXBuildFile; fileRef = 969A07930ED1D3AE00F1F681 /* Instruction.h */; settings = {ATTRIBUTES = (Private, ); }; };
-               969A079B0ED1D3AE00F1F681 /* Opcode.h in Headers */ = {isa = PBXBuildFile; fileRef = 969A07950ED1D3AE00F1F681 /* Opcode.h */; };
                978801411471AD920041B016 /* JSDateMath.h in Headers */ = {isa = PBXBuildFile; fileRef = 9788FC231471AD0C0068CE2D /* JSDateMath.h */; settings = {ATTRIBUTES = (Private, ); }; };
                981ED82328234D91BAECCADE /* MachineContext.h in Headers */ = {isa = PBXBuildFile; fileRef = 28806E21155E478A93FA7B02 /* MachineContext.h */; settings = {ATTRIBUTES = (Private, ); }; };
                990DA67F1C8E316A00295159 /* generate_objc_protocol_type_conversions_implementation.py in Headers */ = {isa = PBXBuildFile; fileRef = 990DA67E1C8E311D00295159 /* generate_objc_protocol_type_conversions_implementation.py */; settings = {ATTRIBUTES = (Private, ); }; };
                        remoteGlobalIDString = 65FB3F6609D11E9100F49DEB;
                        remoteInfo = "Derived Sources";
                };
-               65442D4F18EBB744007AF92F /* PBXContainerItemProxy */ = {
-                       isa = PBXContainerItemProxy;
-                       containerPortal = 0867D690FE84028FC02AAC07 /* Project object */;
-                       proxyType = 1;
-                       remoteGlobalIDString = 65FB3F6609D11E9100F49DEB;
-                       remoteInfo = "Derived Sources";
-               };
                65788A9F18B409EB00C189FF /* PBXContainerItemProxy */ = {
                        isa = PBXContainerItemProxy;
                        containerPortal = 0867D690FE84028FC02AAC07 /* Project object */;
                1429D92D0ED22D7000B89619 /* JIT.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JIT.cpp; sourceTree = "<group>"; };
                1429D92E0ED22D7000B89619 /* JIT.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JIT.h; sourceTree = "<group>"; };
                142D3938103E4560007DCB52 /* NumericStrings.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NumericStrings.h; sourceTree = "<group>"; };
+               142D52BD21762957002DB086 /* UnlinkedMetadataTableInlines.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UnlinkedMetadataTableInlines.h; sourceTree = "<group>"; };
+               142D52BE21762958002DB086 /* UnlinkedMetadataTable.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UnlinkedMetadataTable.h; sourceTree = "<group>"; };
                142D6F0613539A2800B02E86 /* MarkedBlock.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = MarkedBlock.cpp; sourceTree = "<group>"; };
                142D6F0713539A2800B02E86 /* MarkedBlock.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MarkedBlock.h; sourceTree = "<group>"; };
                142D6F0E13539A4100B02E86 /* MarkStack.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = MarkStack.cpp; sourceTree = "<group>"; };
                142E312D134FF0A600AFADB5 /* HandleSet.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HandleSet.h; sourceTree = "<group>"; };
                142E3132134FF0A600AFADB5 /* Strong.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Strong.h; sourceTree = "<group>"; };
                142E3133134FF0A600AFADB5 /* Weak.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Weak.h; sourceTree = "<group>"; };
+               142F16DF215585C8003D49C9 /* MetadataTable.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MetadataTable.h; sourceTree = "<group>"; };
+               142F16E921583B5E003D49C9 /* CodeBlockInlines.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CodeBlockInlines.h; sourceTree = "<group>"; };
                14386A721DD69895008652C4 /* DirectEvalExecutable.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = DirectEvalExecutable.cpp; sourceTree = "<group>"; };
                14386A731DD69895008652C4 /* DirectEvalExecutable.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DirectEvalExecutable.h; sourceTree = "<group>"; };
                14386A761DD6989C008652C4 /* IndirectEvalExecutable.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = IndirectEvalExecutable.cpp; sourceTree = "<group>"; };
                147341DF1DC2CE9600AA29BA /* ProgramExecutable.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ProgramExecutable.cpp; sourceTree = "<group>"; };
                147341E01DC2CE9600AA29BA /* ScriptExecutable.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ScriptExecutable.cpp; sourceTree = "<group>"; };
                147341E91DC2CF2500AA29BA /* ExecutableBase.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ExecutableBase.cpp; sourceTree = "<group>"; };
+               14788EE221501AF700A561C8 /* ProfileTypeBytecodeFlag.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ProfileTypeBytecodeFlag.cpp; sourceTree = "<group>"; };
+               14788EE421501B2800A561C8 /* JSType.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSType.cpp; sourceTree = "<group>"; };
+               14788EE521501B2900A561C8 /* GetPutInfo.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = GetPutInfo.cpp; sourceTree = "<group>"; };
                147B83AA0E6DB8C9004775A4 /* BatchedTransitionOptimizer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BatchedTransitionOptimizer.h; sourceTree = "<group>"; };
                147B84620E6DE6B1004775A4 /* PutPropertySlot.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PutPropertySlot.h; sourceTree = "<group>"; };
                1480DB9B0DDC227F003CFDF2 /* DebuggerCallFrame.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DebuggerCallFrame.h; sourceTree = "<group>"; };
                148A7BEE1B82975A002D9157 /* InlineCallFrame.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = InlineCallFrame.h; sourceTree = "<group>"; };
                148CD1D7108CF902008163C6 /* JSContextRefPrivate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSContextRefPrivate.h; sourceTree = "<group>"; };
                149559ED0DDCDDF700648087 /* DebuggerCallFrame.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = DebuggerCallFrame.cpp; sourceTree = "<group>"; };
+               1498CAD3214656C400710879 /* libWTF.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; path = libWTF.a; sourceTree = BUILT_PRODUCTS_DIR; };
+               1498CAD5214BF36D00710879 /* GetByIdMetadata.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GetByIdMetadata.h; sourceTree = "<group>"; };
                149B24FF0D8AF6D1009CB8C7 /* Register.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Register.h; sourceTree = "<group>"; };
                149DAAF212EB559D0083B12B /* ConservativeRoots.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ConservativeRoots.h; sourceTree = "<group>"; };
                14A1563010966365006FA260 /* DateInstanceCache.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DateInstanceCache.h; sourceTree = "<group>"; };
                14A396A60CD2933100B5B4FF /* SymbolTable.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SymbolTable.h; sourceTree = "<group>"; };
+               14A46809216FA534000D2B1A /* Fits.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Fits.h; sourceTree = "<group>"; };
+               14A4680A216FA535000D2B1A /* Instruction.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Instruction.h; sourceTree = "<group>"; };
+               14A4680B216FA535000D2B1A /* OpcodeSize.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OpcodeSize.h; sourceTree = "<group>"; };
                14AB66751DECF40900A56C26 /* UnlinkedSourceCode.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UnlinkedSourceCode.h; sourceTree = "<group>"; };
                14ABB36E099C076400E2A24F /* JSCJSValue.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = JSCJSValue.h; sourceTree = "<group>"; };
                14ABB454099C2A0F00E2A24F /* JSType.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSType.h; sourceTree = "<group>"; };
                14AD912B1DCAAAB00014F9FE /* UnlinkedFunctionCodeBlock.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = UnlinkedFunctionCodeBlock.cpp; sourceTree = "<group>"; };
                14B7233F12D7D0DA003BD5ED /* MachineStackMarker.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = MachineStackMarker.cpp; sourceTree = "<group>"; };
                14B7234012D7D0DA003BD5ED /* MachineStackMarker.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MachineStackMarker.h; sourceTree = "<group>"; };
+               14BA7751211086A0008D0B05 /* BytecodeList.rb */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.ruby; path = BytecodeList.rb; sourceTree = "<group>"; };
+               14BA7752211A8E5F008D0B05 /* ProfileTypeBytecodeFlag.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ProfileTypeBytecodeFlag.h; sourceTree = "<group>"; };
                14BA78F013AAB88F005B7C2C /* SlotVisitor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SlotVisitor.h; sourceTree = "<group>"; };
                14BA7A9513AADFF8005B7C2C /* Heap.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Heap.cpp; sourceTree = "<group>"; };
                14BA7A9613AADFF8005B7C2C /* Heap.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Heap.h; sourceTree = "<group>"; };
                14BFCE6810CDB1FC00364CCE /* WeakGCMap.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WeakGCMap.h; sourceTree = "<group>"; };
                14CA958A16AB50DE00938A06 /* StaticPropertyAnalyzer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = StaticPropertyAnalyzer.h; sourceTree = "<group>"; };
                14CA958C16AB50FA00938A06 /* ObjectAllocationProfile.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ObjectAllocationProfile.h; sourceTree = "<group>"; };
-               14D2F3D8139F4BE200491031 /* MarkedSpace.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = MarkedSpace.cpp; sourceTree = "<group>"; };
+               14CC3BA12138A238002D58B6 /* InstructionStream.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = InstructionStream.cpp; sourceTree = "<group>"; };
+               14CC3BA22138A238002D58B6 /* InstructionStream.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = InstructionStream.h; sourceTree = "<group>"; };
                14D2F3D9139F4BE200491031 /* MarkedSpace.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MarkedSpace.h; sourceTree = "<group>"; };
                14D792640DAA03FB001A9F05 /* CLoopStack.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CLoopStack.h; sourceTree = "<group>"; };
                14D857740A4696C80032146C /* testapi.js */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.javascript; name = testapi.js; path = API/tests/testapi.js; sourceTree = "<group>"; };
                14E84F9D14EE1ACC00D6D5D4 /* WeakImpl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WeakImpl.h; sourceTree = "<group>"; };
                14F7256314EE265E00B1652B /* WeakHandleOwner.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = WeakHandleOwner.cpp; sourceTree = "<group>"; };
                14F7256414EE265E00B1652B /* WeakHandleOwner.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WeakHandleOwner.h; sourceTree = "<group>"; };
+               14F79F6E216EAD5000046D39 /* MetadataTable.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = MetadataTable.cpp; sourceTree = "<group>"; };
                169948EDE68D4054B01EF797 /* DefinePropertyAttributes.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DefinePropertyAttributes.h; sourceTree = "<group>"; };
                1879510614C540FFB561C124 /* JSModuleLoader.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSModuleLoader.cpp; sourceTree = "<group>"; };
                1A28D4A7177B71C80007FA3C /* JSStringRefPrivate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSStringRefPrivate.h; sourceTree = "<group>"; };
                6511230514046A4C002B101D /* testRegExp */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = testRegExp; sourceTree = BUILT_PRODUCTS_DIR; };
                6514F21718B3E1670098FF8B /* Bytecodes.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Bytecodes.h; sourceTree = "<group>"; };
                6514F21818B3E1670098FF8B /* InitBytecodes.asm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.asm.asm; path = InitBytecodes.asm; sourceTree = "<group>"; };
-               6529FB3018B2D63900C61102 /* generate-bytecode-files */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.python; path = "generate-bytecode-files"; sourceTree = "<group>"; };
-               6529FB3118B2D99900C61102 /* BytecodeList.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = BytecodeList.json; sourceTree = "<group>"; };
                652A3A201651C66100A80AFE /* ARM64Disassembler.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = ARM64Disassembler.cpp; path = disassembler/ARM64Disassembler.cpp; sourceTree = "<group>"; };
                652A3A221651C69700A80AFE /* A64DOpcode.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = A64DOpcode.cpp; path = disassembler/ARM64/A64DOpcode.cpp; sourceTree = "<group>"; };
                652A3A231651C69700A80AFE /* A64DOpcode.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = A64DOpcode.h; path = disassembler/ARM64/A64DOpcode.h; sourceTree = "<group>"; };
                969A07900ED1D3AE00F1F681 /* CodeBlock.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CodeBlock.cpp; sourceTree = "<group>"; };
                969A07910ED1D3AE00F1F681 /* CodeBlock.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CodeBlock.h; sourceTree = "<group>"; };
                969A07920ED1D3AE00F1F681 /* DirectEvalCodeCache.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DirectEvalCodeCache.h; sourceTree = "<group>"; };
-               969A07930ED1D3AE00F1F681 /* Instruction.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Instruction.h; sourceTree = "<group>"; };
                969A07940ED1D3AE00F1F681 /* Opcode.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Opcode.cpp; sourceTree = "<group>"; };
                969A07950ED1D3AE00F1F681 /* Opcode.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Opcode.h; sourceTree = "<group>"; };
                969A09220ED1E09C00F1F681 /* Completion.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Completion.cpp; sourceTree = "<group>"; };
                ADE802961E08F1C90058DE78 /* WebAssemblyLinkErrorPrototype.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = WebAssemblyLinkErrorPrototype.cpp; path = js/WebAssemblyLinkErrorPrototype.cpp; sourceTree = "<group>"; };
                ADE802971E08F1C90058DE78 /* WebAssemblyLinkErrorPrototype.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = WebAssemblyLinkErrorPrototype.h; path = js/WebAssemblyLinkErrorPrototype.h; sourceTree = "<group>"; };
                ADE8029D1E08F2260058DE78 /* WebAssemblyLinkErrorConstructor.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = WebAssemblyLinkErrorConstructor.cpp; path = js/WebAssemblyLinkErrorConstructor.cpp; sourceTree = "<group>"; };
-               B59F89371891AD3300D5CCDC /* UnlinkedInstructionStream.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UnlinkedInstructionStream.h; sourceTree = "<group>"; };
-               B59F89381891ADB500D5CCDC /* UnlinkedInstructionStream.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = UnlinkedInstructionStream.cpp; sourceTree = "<group>"; };
                BC021BF2136900C300FC5467 /* ToolExecutable.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = ToolExecutable.xcconfig; sourceTree = "<group>"; };
                BC02E9040E1839DB000F9297 /* ErrorConstructor.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ErrorConstructor.cpp; sourceTree = "<group>"; };
                BC02E9050E1839DB000F9297 /* ErrorConstructor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ErrorConstructor.h; sourceTree = "<group>"; };
                                F692A8540255597D01FF60F7 /* create_hash_table */,
                                937B63CC09E766D200A671DD /* DerivedSources.make */,
                                0F93275A1C20BCDF00CF6564 /* dynbench.cpp */,
-                               6529FB3018B2D63900C61102 /* generate-bytecode-files */,
                                F5C290E60284F98E018635CA /* JavaScriptCorePrefix.h */,
                                45E12D8806A49B0F00E9DF84 /* jsc.cpp */,
                                A7C225CC139981F100FF1662 /* KeywordLookupGenerator.py */,
                                5D5D8AD00E0D0EBE00F9C692 /* libedit.dylib */,
                                9322A00306C341D3009067BB /* libicucore.dylib */,
                                51F0EC0705C86C9A00E6DF1B /* libobjc.dylib */,
+                               1498CAD3214656C400710879 /* libWTF.a */,
                                A8A4748D151A8306004123FF /* libWTF.a */,
                                371D842C17C98B6E00ECF994 /* libz.dylib */,
                                A5098B031C16AA0200087797 /* Security.framework */,
                                142D6F0713539A2800B02E86 /* MarkedBlock.h */,
                                0F7C5FB71D888A010044F5E2 /* MarkedBlockInlines.h */,
                                141448CA13A176EC00F5BA1A /* MarkedBlockSet.h */,
-                               14D2F3D8139F4BE200491031 /* MarkedSpace.cpp */,
                                14D2F3D9139F4BE200491031 /* MarkedSpace.h */,
                                0F7DF1301E2970D50095951B /* MarkedSpaceInlines.h */,
                                0F660E331E0517B70031462C /* MarkingConstraint.cpp */,
                                969A07270ED1CE6900F1F681 /* Label.h */,
                                960097A50EBABB58007A7297 /* LabelScope.h */,
                                655EB29A10CE2581001A990E /* NodesCodegen.cpp */,
+                               14788EE221501AF700A561C8 /* ProfileTypeBytecodeFlag.cpp */,
+                               14BA7752211A8E5F008D0B05 /* ProfileTypeBytecodeFlag.h */,
                                969A07280ED1CE6900F1F681 /* RegisterID.h */,
                                14DF04D916B3996D0016A513 /* StaticPropertyAnalysis.h */,
                                14CA958A16AB50DE00938A06 /* StaticPropertyAnalyzer.h */,
                                0FE050131AA9091100D33B33 /* GenericOffset.h */,
                                0F2B66B217B6B5AB00A7AE3F /* GenericTypedArrayView.h */,
                                0F2B66B317B6B5AB00A7AE3F /* GenericTypedArrayViewInlines.h */,
+                               14788EE521501B2900A561C8 /* GetPutInfo.cpp */,
                                796465681B952FF0003059EE /* GetPutInfo.h */,
                                BC02E9B80E184545000F9297 /* GetterSetter.cpp */,
                                BC337BDE0E1AF0B80076918A /* GetterSetter.h */,
                                0F919D0A157EE09D004A4E7D /* JSSymbolTableObject.h */,
                                70ECA6001AFDBEA200449739 /* JSTemplateObjectDescriptor.cpp */,
                                70ECA6011AFDBEA200449739 /* JSTemplateObjectDescriptor.h */,
+                               14788EE421501B2800A561C8 /* JSType.cpp */,
                                14ABB454099C2A0F00E2A24F /* JSType.h */,
                                0F2B66CC17B6B5AB00A7AE3F /* JSTypedArrayConstructors.cpp */,
                                0F2B66CD17B6B5AB00A7AE3F /* JSTypedArrayConstructors.h */,
                                7094C4DC1AE439530041A2EE /* BytecodeIntrinsicRegistry.cpp */,
                                7094C4DD1AE439530041A2EE /* BytecodeIntrinsicRegistry.h */,
                                0F2DD80A1AB3D85800BBB8E8 /* BytecodeKills.h */,
-                               6529FB3118B2D99900C61102 /* BytecodeList.json */,
+                               14BA7751211086A0008D0B05 /* BytecodeList.rb */,
                                C2FCAE0E17A9C24E0034C735 /* BytecodeLivenessAnalysis.cpp */,
                                C2FCAE0F17A9C24E0034C735 /* BytecodeLivenessAnalysis.h */,
                                0F666EBE183566F900D017F1 /* BytecodeLivenessAnalysisInlines.h */,
                                969A07910ED1D3AE00F1F681 /* CodeBlock.h */,
                                0F8F943D1667632D00D61971 /* CodeBlockHash.cpp */,
                                0F8F943E1667632D00D61971 /* CodeBlockHash.h */,
+                               142F16E921583B5E003D49C9 /* CodeBlockInlines.h */,
                                0FC97F2F182020D7002C9B26 /* CodeBlockJettisoningWatchpoint.cpp */,
                                0FC97F30182020D7002C9B26 /* CodeBlockJettisoningWatchpoint.h */,
                                0F96EBB116676EF4008BADE3 /* CodeBlockWithJITType.h */,
                                0FB105821675480C00F8AB6E /* ExitKind.cpp */,
                                0FB105831675480C00F8AB6E /* ExitKind.h */,
                                0F0B83AA14BCF5B900885B4F /* ExpressionRangeInfo.h */,
+                               14A46809216FA534000D2B1A /* Fits.h */,
                                0F666EBF183566F900D017F1 /* FullBytecodeLiveness.h */,
                                AD4252521E5D0F22009D2A97 /* FullCodeOrigin.cpp */,
                                AD4252501E5D0DEB009D2A97 /* FullCodeOrigin.h */,
                                14AD91161DCA97FD0014F9FE /* FunctionCodeBlock.cpp */,
                                14AD91071DCA92940014F9FE /* FunctionCodeBlock.h */,
+                               1498CAD5214BF36D00710879 /* GetByIdMetadata.h */,
                                0F93329514CA7DC10085F3C6 /* GetByIdStatus.cpp */,
                                0F93329614CA7DC10085F3C6 /* GetByIdStatus.h */,
                                0F0332C118B01763005F979A /* GetByIdVariant.cpp */,
                                0FB399BB20AF6B2A0017E213 /* InstanceOfStatus.h */,
                                0FB399BC20AF6B2A0017E213 /* InstanceOfVariant.cpp */,
                                0FB399B920AF6B2A0017E213 /* InstanceOfVariant.h */,
-                               969A07930ED1D3AE00F1F681 /* Instruction.h */,
+                               14A4680A216FA535000D2B1A /* Instruction.h */,
+                               14CC3BA12138A238002D58B6 /* InstructionStream.cpp */,
+                               14CC3BA22138A238002D58B6 /* InstructionStream.h */,
                                53F6BF6C1C3F060A00F41E5D /* InternalFunctionAllocationProfile.h */,
                                BCFD8C900EEB2EE700283848 /* JumpTable.cpp */,
                                BCFD8C910EEB2EE700283848 /* JumpTable.h */,
                                0F0FC45814BD15F100B81154 /* LLIntCallLinkInfo.h */,
                                53FA2AE21CF380390022711D /* LLIntPrototypeLoadAdaptiveStructureWatchpoint.cpp */,
                                53FA2AE01CF37F3F0022711D /* LLIntPrototypeLoadAdaptiveStructureWatchpoint.h */,
+                               14F79F6E216EAD5000046D39 /* MetadataTable.cpp */,
+                               142F16DF215585C8003D49C9 /* MetadataTable.h */,
                                0FB5467C14F5CFD3002C2989 /* MethodOfGettingAValueProfile.cpp */,
                                0FB5467A14F5C7D4002C2989 /* MethodOfGettingAValueProfile.h */,
                                20ECB15EFC524624BC2F02D5 /* ModuleNamespaceAccessCase.cpp */,
                                969A07940ED1D3AE00F1F681 /* Opcode.cpp */,
                                969A07950ED1D3AE00F1F681 /* Opcode.h */,
                                FE64872D2141D04800AB0D3E /* OpcodeInlines.h */,
+                               14A4680B216FA535000D2B1A /* OpcodeSize.h */,
                                0F2BDC2B151FDE8B00CD8910 /* Operands.h */,
                                A70447E917A0BD4600F5898E /* OperandsInlines.h */,
                                E34E657420668E8E00FB81AC /* ParseHash.cpp */,
                                14142E541B7973C000F4BF4B /* UnlinkedFunctionExecutable.cpp */,
                                14142E501B796ECE00F4BF4B /* UnlinkedFunctionExecutable.h */,
                                14AD911C1DCA9FA40014F9FE /* UnlinkedGlobalCodeBlock.h */,
-                               B59F89381891ADB500D5CCDC /* UnlinkedInstructionStream.cpp */,
-                               B59F89371891AD3300D5CCDC /* UnlinkedInstructionStream.h */,
+                               142D52BE21762958002DB086 /* UnlinkedMetadataTable.h */,
+                               142D52BD21762957002DB086 /* UnlinkedMetadataTableInlines.h */,
                                14AD912A1DCAAAB00014F9FE /* UnlinkedModuleProgramCodeBlock.cpp */,
                                14AD911F1DCA9FA40014F9FE /* UnlinkedModuleProgramCodeBlock.h */,
                                14AD91291DCAAAB00014F9FE /* UnlinkedProgramCodeBlock.cpp */,
                                0FE0501B1AA9091100D33B33 /* GenericOffset.h in Headers */,
                                0F2B66E017B6B5AB00A7AE3F /* GenericTypedArrayView.h in Headers */,
                                0F2B66E117B6B5AB00A7AE3F /* GenericTypedArrayViewInlines.h in Headers */,
+                               1498CAD6214BF36D00710879 /* GetByIdMetadata.h in Headers */,
                                0F9332A014CA7DCD0085F3C6 /* GetByIdStatus.h in Headers */,
                                0F0332C418B01763005F979A /* GetByIdVariant.h in Headers */,
                                7964656A1B952FF0003059EE /* GetPutInfo.h in Headers */,
                                0F49E9AA20AB4D00001CA0AA /* InstanceOfAccessCase.h in Headers */,
                                0FB399BF20AF6B3F0017E213 /* InstanceOfStatus.h in Headers */,
                                0FB399C020AF6B430017E213 /* InstanceOfVariant.h in Headers */,
-                               969A07990ED1D3AE00F1F681 /* Instruction.h in Headers */,
+                               14A4680C216FA565000D2B1A /* Instruction.h in Headers */,
+                               14C25B9E216EA36A00137764 /* InstructionStream.h in Headers */,
                                A7A8AF3B17ADB5F3005AB174 /* Int16Array.h in Headers */,
                                A7A8AF3C17ADB5F3005AB174 /* Int32Array.h in Headers */,
                                A7A8AF3A17ADB5F3005AB174 /* Int8Array.h in Headers */,
                                BC18C43C0E16F5CD00B34460 /* MathObject.h in Headers */,
                                E328C6C71DA4304500D255FD /* MaxFrameExtentForSlowPathCall.h in Headers */,
                                90213E3E123A40C200D422F3 /* MemoryStatistics.h in Headers */,
+                               142F16E021558802003D49C9 /* MetadataTable.h in Headers */,
                                0FB5467B14F5C7E1002C2989 /* MethodOfGettingAValueProfile.h in Headers */,
                                7C008CE7187631B600955C24 /* Microtask.h in Headers */,
                                FE2A87601F02381600EB31B2 /* MinimumReservedZoneSize.h in Headers */,
                                0FD3E40C1B618B6600C80E1E /* ObjectPropertyConditionSet.h in Headers */,
                                BC18C4460E16F5CD00B34460 /* ObjectPrototype.h in Headers */,
                                E124A8F70E555775003091F1 /* OpaqueJSString.h in Headers */,
-                               969A079B0ED1D3AE00F1F681 /* Opcode.h in Headers */,
+                               14F79F70216EAFD200046D39 /* Opcode.h in Headers */,
                                FE64872E2141D04800AB0D3E /* OpcodeInlines.h in Headers */,
+                               14A4680D216FA56A000D2B1A /* OpcodeSize.h in Headers */,
                                0F2BDC2C151FDE9100CD8910 /* Operands.h in Headers */,
                                A70447EA17A0BD4600F5898E /* OperandsInlines.h in Headers */,
                                BC18C4480E16F5CD00B34460 /* Operations.h in Headers */,
                                14AD91231DCA9FA40014F9FE /* UnlinkedFunctionCodeBlock.h in Headers */,
                                14142E511B796ECE00F4BF4B /* UnlinkedFunctionExecutable.h in Headers */,
                                14AD91221DCA9FA40014F9FE /* UnlinkedGlobalCodeBlock.h in Headers */,
+                               146C384B2177ACDF0079F6D9 /* UnlinkedMetadataTable.h in Headers */,
                                14AD91251DCA9FA40014F9FE /* UnlinkedModuleProgramCodeBlock.h in Headers */,
                                14AD91261DCA9FA40014F9FE /* UnlinkedProgramCodeBlock.h in Headers */,
                                14AB66761DECF40900A56C26 /* UnlinkedSourceCode.h in Headers */,
                        );
                        runOnlyForDeploymentPostprocessing = 0;
                        shellPath = /bin/sh;
-                       shellScript = "exec ${SRCROOT}/postprocess-headers.sh";
+                       shellScript = "exec ${SRCROOT}/postprocess-headers.sh\n";
                };
                374F95C9205F9975002BF68F /* Make libWTF.a Symbolic Link */ = {
                        isa = PBXShellScriptBuildPhase;
                        target = 65FB3F6609D11E9100F49DEB /* Derived Sources */;
                        targetProxy = 65244BD218ECB5000010B708 /* PBXContainerItemProxy */;
                };
-               65442D5018EBB744007AF92F /* PBXTargetDependency */ = {
-                       isa = PBXTargetDependency;
-                       target = 65FB3F6609D11E9100F49DEB /* Derived Sources */;
-                       targetProxy = 65442D4F18EBB744007AF92F /* PBXContainerItemProxy */;
-               };
                65788A9E18B409EB00C189FF /* PBXTargetDependency */ = {
                        isa = PBXTargetDependency;
                        target = 0FF922C314F46B130041A24E /* JSCLLIntOffsetsExtractor */;
index 2288c58..8ffa217 100644 (file)
@@ -233,10 +233,12 @@ bytecode/InlineCallFrameSet.cpp
 bytecode/InstanceOfAccessCase.cpp
 bytecode/InstanceOfStatus.cpp
 bytecode/InstanceOfVariant.cpp
+bytecode/InstructionStream.cpp
 bytecode/IntrinsicGetterAccessCase.cpp
 bytecode/JumpTable.cpp
 bytecode/LLIntPrototypeLoadAdaptiveStructureWatchpoint.cpp
 bytecode/LazyOperandValueProfile.cpp
+bytecode/MetadataTable.cpp
 bytecode/MethodOfGettingAValueProfile.cpp
 bytecode/ModuleNamespaceAccessCase.cpp
 bytecode/ModuleProgramCodeBlock.cpp
@@ -268,7 +270,6 @@ bytecode/UnlinkedCodeBlock.cpp
 bytecode/UnlinkedEvalCodeBlock.cpp
 bytecode/UnlinkedFunctionCodeBlock.cpp
 bytecode/UnlinkedFunctionExecutable.cpp
-bytecode/UnlinkedInstructionStream.cpp
 bytecode/UnlinkedModuleProgramCodeBlock.cpp
 bytecode/UnlinkedProgramCodeBlock.cpp
 bytecode/ValueRecovery.cpp
@@ -278,6 +279,7 @@ bytecode/Watchpoint.cpp
 
 bytecompiler/BytecodeGenerator.cpp
 bytecompiler/NodesCodegen.cpp
+bytecompiler/ProfileTypeBytecodeFlag.cpp
 
 debugger/Debugger.cpp
 debugger/DebuggerCallFrame.cpp
@@ -759,6 +761,7 @@ runtime/FunctionRareData.cpp
 runtime/GeneratorFunctionConstructor.cpp
 runtime/GeneratorFunctionPrototype.cpp
 runtime/GeneratorPrototype.cpp
+runtime/GetPutInfo.cpp
 runtime/GetterSetter.cpp
 runtime/HashMapImpl.cpp
 runtime/Identifier.cpp
@@ -851,6 +854,7 @@ runtime/JSStringJoiner.cpp
 runtime/JSStringHeapCellType.cpp
 runtime/JSSymbolTableObject.cpp
 runtime/JSTemplateObjectDescriptor.cpp
+runtime/JSType.cpp
 runtime/JSTypedArrayConstructors.cpp
 runtime/JSTypedArrayPrototypes.cpp
 runtime/JSTypedArrayViewConstructor.cpp
index fac8b86..83b49bb 100644 (file)
@@ -176,7 +176,7 @@ class ReturnAddressPtr {
 public:
     ReturnAddressPtr() { }
 
-    explicit ReturnAddressPtr(void* value)
+    explicit ReturnAddressPtr(const void* value)
         : m_value(value)
     {
         PoisonedMasmPtr::assertIsNotPoisoned(m_value);
@@ -191,7 +191,7 @@ public:
         ASSERT_VALID_CODE_POINTER(m_value);
     }
 
-    void* value() const
+    const void* value() const
     {
         PoisonedMasmPtr::assertIsNotPoisoned(m_value);
         return m_value;
@@ -203,7 +203,7 @@ public:
     }
 
 private:
-    void* m_value { nullptr };
+    const void* m_value { nullptr };
 };
 
 // MacroAssemblerCodePtr:
@@ -222,10 +222,10 @@ public:
     MacroAssemblerCodePtr() = default;
     MacroAssemblerCodePtr(std::nullptr_t) : m_value(nullptr) { }
 
-    explicit MacroAssemblerCodePtr(void* value)
+    explicit MacroAssemblerCodePtr(const void* value)
 #if CPU(ARM_THUMB2)
         // Decorate the pointer as a thumb code pointer.
-        : m_value(reinterpret_cast<char*>(value) + 1)
+        : m_value(reinterpret_cast<const char*>(value) + 1)
 #else
         : m_value(value)
 #endif
@@ -239,7 +239,7 @@ public:
         ASSERT_VALID_CODE_POINTER(m_value.unpoisoned());
     }
 
-    static MacroAssemblerCodePtr createFromExecutableAddress(void* value)
+    static MacroAssemblerCodePtr createFromExecutableAddress(const void* value)
     {
         ASSERT(value);
         ASSERT_VALID_CODE_POINTER(value);
index 52eef82..645c258 100644 (file)
@@ -105,6 +105,11 @@ public:
         ASSERT(lhsObservedType().isEmpty());
         ASSERT(rhsObservedType().isEmpty());
     }
+
+    ArithProfile(OperandTypes types)
+        : ArithProfile(types.first(), types.second())
+    { }
+
     ArithProfile() = default;
 
     static constexpr ArithProfile fromInt(uint32_t bits)
index c233deb..fef936e 100644 (file)
@@ -32,6 +32,13 @@ namespace JSC {
 
 class ArrayAllocationProfile {
 public:
+    ArrayAllocationProfile() = default;
+
+    ArrayAllocationProfile(IndexingType recommendedIndexingMode)
+    {
+        initializeIndexingMode(recommendedIndexingMode);
+    }
+
     IndexingType selectIndexingType()
     {
         JSArray* lastArray = m_lastArray;
index 3abeb26..b9d9f37 100644 (file)
@@ -210,6 +210,8 @@ inline bool hasSeenCopyOnWriteArray(ArrayModes arrayModes)
 }
 
 class ArrayProfile {
+    friend class CodeBlock;
+
 public:
     ArrayProfile()
         : ArrayProfile(std::numeric_limits<unsigned>::max())
index a4397b5..33bb0c0 100644 (file)
@@ -39,7 +39,7 @@ void BytecodeBasicBlock::shrinkToFit()
     m_successors.shrinkToFit();
 }
 
-static bool isJumpTarget(OpcodeID opcodeID, const Vector<unsigned, 32>& jumpTargets, unsigned bytecodeOffset)
+static bool isJumpTarget(OpcodeID opcodeID, const Vector<InstructionStream::Offset, 32>& jumpTargets, unsigned bytecodeOffset)
 {
     if (opcodeID == op_catch)
         return true;
@@ -47,11 +47,11 @@ static bool isJumpTarget(OpcodeID opcodeID, const Vector<unsigned, 32>& jumpTarg
     return std::binary_search(jumpTargets.begin(), jumpTargets.end(), bytecodeOffset);
 }
 
-template<typename Block, typename Instruction>
-void BytecodeBasicBlock::computeImpl(Block* codeBlock, Instruction* instructionsBegin, unsigned instructionCount, Vector<std::unique_ptr<BytecodeBasicBlock>>& basicBlocks)
+template<typename Block>
+void BytecodeBasicBlock::computeImpl(Block* codeBlock, const InstructionStream& instructions, Vector<std::unique_ptr<BytecodeBasicBlock>>& basicBlocks)
 {
-    Vector<unsigned, 32> jumpTargets;
-    computePreciseJumpTargets(codeBlock, instructionsBegin, instructionCount, jumpTargets);
+    Vector<InstructionStream::Offset, 32> jumpTargets;
+    computePreciseJumpTargets(codeBlock, instructions, jumpTargets);
 
     auto appendBlock = [&] (std::unique_ptr<BytecodeBasicBlock>&& block) {
         block->m_index = basicBlocks.size();
@@ -66,7 +66,7 @@ void BytecodeBasicBlock::computeImpl(Block* codeBlock, Instruction* instructions
     basicBlocks.reserveCapacity(jumpTargets.size() + 2);
 
     auto entry = std::make_unique<BytecodeBasicBlock>(BytecodeBasicBlock::EntryBlock);
-    auto firstBlock = std::make_unique<BytecodeBasicBlock>(0, 0);
+    auto firstBlock = std::make_unique<BytecodeBasicBlock>(BytecodeBasicBlock::EntryBlock);
     linkBlocks(entry.get(), firstBlock.get());
 
     appendBlock(WTFMove(entry));
@@ -77,19 +77,18 @@ void BytecodeBasicBlock::computeImpl(Block* codeBlock, Instruction* instructions
 
     bool nextInstructionIsLeader = false;
 
-    for (unsigned bytecodeOffset = 0; bytecodeOffset < instructionCount;) {
-        OpcodeID opcodeID = Interpreter::getOpcodeID(instructionsBegin[bytecodeOffset]);
-        unsigned opcodeLength = opcodeLengths[opcodeID];
+    for (const auto& instruction : instructions) {
+        auto bytecodeOffset = instruction.offset();
+        OpcodeID opcodeID = instruction->opcodeID();
 
         bool createdBlock = false;
         // If the current bytecode is a jump target, then it's the leader of its own basic block.
         if (isJumpTarget(opcodeID, jumpTargets, bytecodeOffset) || nextInstructionIsLeader) {
-            auto newBlock = std::make_unique<BytecodeBasicBlock>(bytecodeOffset, opcodeLength);
+            auto newBlock = std::make_unique<BytecodeBasicBlock>(instruction);
             current = newBlock.get();
             appendBlock(WTFMove(newBlock));
             createdBlock = true;
             nextInstructionIsLeader = false;
-            bytecodeOffset += opcodeLength;
         }
 
         // If the current bytecode is a branch or a return, then the next instruction is the leader of its own basic block.
@@ -100,8 +99,7 @@ void BytecodeBasicBlock::computeImpl(Block* codeBlock, Instruction* instructions
             continue;
 
         // Otherwise, just add to the length of the current block.
-        current->addLength(opcodeLength);
-        bytecodeOffset += opcodeLength;
+        current->addLength(instruction->size());
     }
 
     // Link basic blocks together.
@@ -111,24 +109,25 @@ void BytecodeBasicBlock::computeImpl(Block* codeBlock, Instruction* instructions
         if (block->isEntryBlock() || block->isExitBlock())
             continue;
 
-        bool fallsThrough = true; 
-        for (unsigned bytecodeOffset = block->leaderOffset(); bytecodeOffset < block->leaderOffset() + block->totalLength();) {
-            OpcodeID opcodeID = Interpreter::getOpcodeID(instructionsBegin[bytecodeOffset]);
-            unsigned opcodeLength = opcodeLengths[opcodeID];
+        bool fallsThrough = true;
+        for (auto bytecodeOffset : block->offsets()) {
+            auto instruction = instructions.at(bytecodeOffset);
+            OpcodeID opcodeID = instruction->opcodeID();
+
             // If we found a terminal bytecode, link to the exit block.
             if (isTerminal(opcodeID)) {
-                ASSERT(bytecodeOffset + opcodeLength == block->leaderOffset() + block->totalLength());
+                ASSERT(bytecodeOffset + instruction->size() == block->leaderOffset() + block->totalLength());
                 linkBlocks(block, exit.get());
                 fallsThrough = false;
                 break;
             }
 
-            // If we found a throw, get the HandlerInfo for this instruction to see where we will jump. 
+            // If we found a throw, get the HandlerInfo for this instruction to see where we will jump.
             // If there isn't one, treat this throw as a terminal. This is true even if we have a finally
             // block because the finally block will create its own catch, which will generate a HandlerInfo.
             if (isThrow(opcodeID)) {
-                ASSERT(bytecodeOffset + opcodeLength == block->leaderOffset() + block->totalLength());
-                auto* handler = codeBlock->handlerForBytecodeOffset(bytecodeOffset);
+                ASSERT(bytecodeOffset + instruction->size() == block->leaderOffset() + block->totalLength());
+                auto* handler = codeBlock->handlerForBytecodeOffset(instruction.offset());
                 fallsThrough = false;
                 if (!handler) {
                     linkBlocks(block, exit.get());
@@ -146,9 +145,9 @@ void BytecodeBasicBlock::computeImpl(Block* codeBlock, Instruction* instructions
 
             // If we found a branch, link to the block(s) that we jump to.
             if (isBranch(opcodeID)) {
-                ASSERT(bytecodeOffset + opcodeLength == block->leaderOffset() + block->totalLength());
-                Vector<unsigned, 1> bytecodeOffsetsJumpedTo;
-                findJumpTargetsForBytecodeOffset(codeBlock, instructionsBegin, bytecodeOffset, bytecodeOffsetsJumpedTo);
+                ASSERT(bytecodeOffset + instruction->size() == block->leaderOffset() + block->totalLength());
+                Vector<InstructionStream::Offset, 1> bytecodeOffsetsJumpedTo;
+                findJumpTargetsForInstruction(codeBlock, instruction, bytecodeOffsetsJumpedTo);
 
                 size_t numberOfJumpTargets = bytecodeOffsetsJumpedTo.size();
                 ASSERT(numberOfJumpTargets);
@@ -172,7 +171,6 @@ void BytecodeBasicBlock::computeImpl(Block* codeBlock, Instruction* instructions
 
                 break;
             }
-            bytecodeOffset += opcodeLength;
         }
 
         // If we fall through then link to the next block in program order.
@@ -184,19 +182,19 @@ void BytecodeBasicBlock::computeImpl(Block* codeBlock, Instruction* instructions
     }
 
     appendBlock(WTFMove(exit));
-    
+
     for (auto& basicBlock : basicBlocks)
         basicBlock->shrinkToFit();
 }
 
-void BytecodeBasicBlock::compute(CodeBlock* codeBlock, Instruction* instructionsBegin, unsigned instructionCount, Vector<std::unique_ptr<BytecodeBasicBlock>>& basicBlocks)
+void BytecodeBasicBlock::compute(CodeBlock* codeBlock, const InstructionStream& instructions, Vector<std::unique_ptr<BytecodeBasicBlock>>& basicBlocks)
 {
-    computeImpl(codeBlock, instructionsBegin, instructionCount, basicBlocks);
+    computeImpl(codeBlock, instructions, basicBlocks);
 }
 
-void BytecodeBasicBlock::compute(UnlinkedCodeBlock* codeBlock, UnlinkedInstruction* instructionsBegin, unsigned instructionCount, Vector<std::unique_ptr<BytecodeBasicBlock>>& basicBlocks)
+void BytecodeBasicBlock::compute(UnlinkedCodeBlock* codeBlock, const InstructionStream& instructions, Vector<std::unique_ptr<BytecodeBasicBlock>>& basicBlocks)
 {
-    BytecodeBasicBlock::computeImpl(codeBlock, instructionsBegin, instructionCount, basicBlocks);
+    computeImpl(codeBlock, instructions, basicBlocks);
 }
 
 } // namespace JSC
index fb81650..20e124c 100644 (file)
@@ -25,6 +25,7 @@
 
 #pragma once
 
+#include "InstructionStream.h"
 #include <limits.h>
 #include <wtf/FastBitVector.h>
 #include <wtf/Vector.h>
@@ -34,23 +35,22 @@ namespace JSC {
 class CodeBlock;
 class UnlinkedCodeBlock;
 struct Instruction;
-struct UnlinkedInstruction;
 
 class BytecodeBasicBlock {
     WTF_MAKE_FAST_ALLOCATED;
 public:
     enum SpecialBlockType { EntryBlock, ExitBlock };
-    BytecodeBasicBlock(unsigned start, unsigned length);
+    BytecodeBasicBlock(const InstructionStream::Ref&);
     BytecodeBasicBlock(SpecialBlockType);
     void shrinkToFit();
 
     bool isEntryBlock() { return !m_leaderOffset && !m_totalLength; }
     bool isExitBlock() { return m_leaderOffset == UINT_MAX && m_totalLength == UINT_MAX; }
 
-    unsigned leaderOffset() { return m_leaderOffset; }
-    unsigned totalLength() { return m_totalLength; }
+    unsigned leaderOffset() const { return m_leaderOffset; }
+    unsigned totalLength() const { return m_totalLength; }
 
-    const Vector<unsigned>& offsets() const { return m_offsets; }
+    const Vector<InstructionStream::Offset>& offsets() const { return m_offsets; }
 
     const Vector<BytecodeBasicBlock*>& successors() const { return m_successors; }
 
@@ -59,30 +59,30 @@ public:
 
     unsigned index() const { return m_index; }
 
-    static void compute(CodeBlock*, Instruction* instructionsBegin, unsigned instructionCount, Vector<std::unique_ptr<BytecodeBasicBlock>>&);
-    static void compute(UnlinkedCodeBlock*, UnlinkedInstruction* instructionsBegin, unsigned instructionCount, Vector<std::unique_ptr<BytecodeBasicBlock>>&);
+    static void compute(CodeBlock*, const InstructionStream& instructions, Vector<std::unique_ptr<BytecodeBasicBlock>>&);
+    static void compute(UnlinkedCodeBlock*, const InstructionStream& instructions, Vector<std::unique_ptr<BytecodeBasicBlock>>&);
 
 private:
-    template<typename Block, typename Instruction> static void computeImpl(Block* codeBlock, Instruction* instructionsBegin, unsigned instructionCount, Vector<std::unique_ptr<BytecodeBasicBlock>>& basicBlocks);
+    template<typename Block> static void computeImpl(Block* codeBlock, const InstructionStream& instructions, Vector<std::unique_ptr<BytecodeBasicBlock>>& basicBlocks);
 
     void addSuccessor(BytecodeBasicBlock* block) { m_successors.append(block); }
 
     void addLength(unsigned);
 
-    unsigned m_leaderOffset;
+    InstructionStream::Offset m_leaderOffset;
     unsigned m_totalLength;
     unsigned m_index;
 
-    Vector<unsigned> m_offsets;
+    Vector<InstructionStream::Offset> m_offsets;
     Vector<BytecodeBasicBlock*> m_successors;
 
     FastBitVector m_in;
     FastBitVector m_out;
 };
 
-inline BytecodeBasicBlock::BytecodeBasicBlock(unsigned start, unsigned length)
-    : m_leaderOffset(start)
-    , m_totalLength(length)
+inline BytecodeBasicBlock::BytecodeBasicBlock(const InstructionStream::Ref& instruction)
+    : m_leaderOffset(instruction.offset())
+    , m_totalLength(instruction->size())
 {
     m_offsets.append(m_leaderOffset);
 }
index 5d7c0ad..1f8cdbb 100644 (file)
@@ -28,6 +28,7 @@
 #include "BytecodeDumper.h"
 
 #include "ArithProfile.h"
+#include "BytecodeStructs.h"
 #include "CallLinkStatus.h"
 #include "CodeBlock.h"
 #include "Error.h"
 #include "StructureInlines.h"
 #include "ToThisStatus.h"
 #include "UnlinkedCodeBlock.h"
+#include "UnlinkedMetadataTableInlines.h"
 
 namespace JSC {
 
-static StructureID getStructureID(const Instruction& instruction)
-{
-    return instruction.u.structureID;
-}
-
-static StructureID getStructureID(const UnlinkedInstruction&)
-{
-    return 0;
-}
-
-static Special::Pointer getSpecialPointer(const Instruction& instruction)
-{
-    return instruction.u.specialPointer;
-}
-
-static Special::Pointer getSpecialPointer(const UnlinkedInstruction& instruction)
-{
-    return static_cast<Special::Pointer>(instruction.u.operand);
-}
-
-static PutByIdFlags getPutByIdFlags(const Instruction& instruction)
-{
-    return instruction.u.putByIdFlags;
-}
-
-static PutByIdFlags getPutByIdFlags(const UnlinkedInstruction& instruction)
-{
-    return static_cast<PutByIdFlags>(instruction.u.operand);
-}
-
-static ToThisStatus getToThisStatus(const Instruction& instruction)
-{
-    return instruction.u.toThisStatus;
-}
-
-static ToThisStatus getToThisStatus(const UnlinkedInstruction& instruction)
-{
-    return static_cast<ToThisStatus>(instruction.u.operand);
-}
-
-static void* getPointer(const Instruction& instruction)
-{
-    return instruction.u.pointer;
-}
-
-static void* getPointer(const UnlinkedInstruction&)
-{
-    return nullptr;
-}
-
-static StructureChain* getStructureChain(const Instruction& instruction)
-{
-    return instruction.u.structureChain.get();
-}
-
-static StructureChain* getStructureChain(const UnlinkedInstruction&)
-{
-    return nullptr;
-}
-
-static Structure* getStructure(const Instruction& instruction)
-{
-    return instruction.u.structure.get();
-}
-
-static Structure* getStructure(const UnlinkedInstruction&)
-{
-    return nullptr;
-}
-
-static LLIntCallLinkInfo* getCallLinkInfo(const Instruction& instruction)
-{
-    return instruction.u.callLinkInfo;
-}
-
-static LLIntCallLinkInfo* getCallLinkInfo(const UnlinkedInstruction&)
-{
-    return nullptr;
-}
-
-static BasicBlockLocation* getBasicBlockLocation(const Instruction& instruction)
-{
-    return instruction.u.basicBlockLocation;
-}
-
-static BasicBlockLocation* getBasicBlockLocation(const UnlinkedInstruction&)
-{
-    return nullptr;
-}
-
-template<class Block>
-void* BytecodeDumper<Block>::actualPointerFor(Special::Pointer) const
-{
-    return nullptr;
-}
-
-template<>
-void* BytecodeDumper<CodeBlock>::actualPointerFor(Special::Pointer pointer) const
-{
-    return block()->globalObject()->actualPointerFor(pointer);
-}
-
-static void beginDumpProfiling(PrintStream& out, bool& hasPrintedProfiling)
-{
-    if (hasPrintedProfiling) {
-        out.print("; ");
-        return;
-    }
-
-    out.print("    ");
-    hasPrintedProfiling = true;
-}
-
-template<class Block>
-void BytecodeDumper<Block>::dumpValueProfiling(PrintStream&, const typename Block::Instruction*& it, bool&)
-{
-    ++it;
-}
-
-template<>
-void BytecodeDumper<CodeBlock>::dumpValueProfiling(PrintStream& out, const typename CodeBlock::Instruction*& it, bool& hasPrintedProfiling)
-{
-    ConcurrentJSLocker locker(block()->m_lock);
-
-    ++it;
-    CString description = it->u.profile->briefDescription(locker);
-    if (!description.length())
-        return;
-    beginDumpProfiling(out, hasPrintedProfiling);
-    out.print(description);
-}
-
-template<class Block>
-void BytecodeDumper<Block>::dumpArrayProfiling(PrintStream&, const typename Block::Instruction*& it, bool&)
-{
-    ++it;
-}
-
-template<>
-void BytecodeDumper<CodeBlock>::dumpArrayProfiling(PrintStream& out, const typename CodeBlock::Instruction*& it, bool& hasPrintedProfiling)
-{
-    ConcurrentJSLocker locker(block()->m_lock);
-
-    ++it;
-    if (!it->u.arrayProfile)
-        return;
-    CString description = it->u.arrayProfile->briefDescription(locker, block());
-    if (!description.length())
-        return;
-    beginDumpProfiling(out, hasPrintedProfiling);
-    out.print(description);
-}
-
-template<class Block>
-void BytecodeDumper<Block>::dumpProfilesForBytecodeOffset(PrintStream&, unsigned, bool&)
-{
-}
-
-static void dumpRareCaseProfile(PrintStream& out, const char* name, RareCaseProfile* profile, bool& hasPrintedProfiling)
-{
-    if (!profile || !profile->m_counter)
-        return;
-
-    beginDumpProfiling(out, hasPrintedProfiling);
-    out.print(name, profile->m_counter);
-}
-
-static void dumpArithProfile(PrintStream& out, ArithProfile* profile, bool& hasPrintedProfiling)
-{
-    if (!profile)
-        return;
-
-    beginDumpProfiling(out, hasPrintedProfiling);
-    out.print("results: ", *profile);
-}
-
-template<>
-void BytecodeDumper<CodeBlock>::dumpProfilesForBytecodeOffset(PrintStream& out, unsigned location, bool& hasPrintedProfiling)
-{
-    dumpRareCaseProfile(out, "rare case: ", block()->rareCaseProfileForBytecodeOffset(location), hasPrintedProfiling);
-    {
-        dumpArithProfile(out, block()->arithProfileForBytecodeOffset(location), hasPrintedProfiling);
-    }
-
-#if ENABLE(DFG_JIT)
-    Vector<DFG::FrequentExitSite> exitSites = block()->unlinkedCodeBlock()->exitProfile().exitSitesFor(location);
-    if (!exitSites.isEmpty()) {
-        out.print(" !! frequent exits: ");
-        CommaPrinter comma;
-        for (auto& exitSite : exitSites)
-            out.print(comma, exitSite.kind(), " ", exitSite.jitType());
-    }
-#else // ENABLE(DFG_JIT)
-    UNUSED_PARAM(location);
-#endif // ENABLE(DFG_JIT)
-}
-
 template<class Block>
 VM* BytecodeDumper<Block>::vm() const
 {
@@ -250,40 +55,11 @@ const Identifier& BytecodeDumper<Block>::identifier(int index) const
     return block()->identifier(index);
 }
 
-template<class Instruction>
-static void printLocationAndOp(PrintStream& out, int location, const Instruction*&, const char* op)
-{
-    out.printf("[%4d] %-17s ", location, op);
-}
-
 static ALWAYS_INLINE bool isConstantRegisterIndex(int index)
 {
     return index >= FirstConstantRegisterIndex;
 }
 
-NEVER_INLINE static const char* debugHookName(int debugHookType)
-{
-    switch (static_cast<DebugHookType>(debugHookType)) {
-    case DidEnterCallFrame:
-        return "didEnterCallFrame";
-    case WillLeaveCallFrame:
-        return "willLeaveCallFrame";
-    case WillExecuteStatement:
-        return "willExecuteStatement";
-    case WillExecuteExpression:
-        return "willExecuteExpression";
-    case WillExecuteProgram:
-        return "willExecuteProgram";
-    case DidExecuteProgram:
-        return "didExecuteProgram";
-    case DidReachBreakpoint:
-        return "didReachBreakpoint";
-    }
-
-    RELEASE_ASSERT_NOT_REACHED();
-    return "";
-}
-
 template<class Block>
 CString BytecodeDumper<Block>::registerName(int r) const
 {
@@ -293,11 +69,6 @@ CString BytecodeDumper<Block>::registerName(int r) const
     return toCString(VirtualRegister(r));
 }
 
-static CString idName(int id0, const Identifier& ident)
-{
-    return toCString(ident.impl(), "(@id", id0, ")");
-}
-
 template<class Block>
 CString BytecodeDumper<Block>::constantName(int index) const
 {
@@ -306,1490 +77,43 @@ CString BytecodeDumper<Block>::constantName(int index) const
 }
 
 template<class Block>
-void BytecodeDumper<Block>::printUnaryOp(PrintStream& out, int location, const typename Block::Instruction*& it, const char* op)
-{
-    int r0 = (++it)->u.operand;
-    int r1 = (++it)->u.operand;
-
-    printLocationAndOp(out, location, it, op);
-    out.printf("%s, %s", registerName(r0).data(), registerName(r1).data());
-}
-
-template<class Block>
-void BytecodeDumper<Block>::printBinaryOp(PrintStream& out, int location, const typename Block::Instruction*& it, const char* op)
-{
-    int r0 = (++it)->u.operand;
-    int r1 = (++it)->u.operand;
-    int r2 = (++it)->u.operand;
-    printLocationAndOp(out, location, it, op);
-    out.printf("%s, %s, %s", registerName(r0).data(), registerName(r1).data(), registerName(r2).data());
-}
-
-template<class Block>
-void BytecodeDumper<Block>::printConditionalJump(PrintStream& out, const typename Block::Instruction*, const typename Block::Instruction*& it, int location, const char* op)
+void BytecodeDumper<Block>::printLocationAndOp(InstructionStream::Offset location, const char* op)
 {
-    int r0 = (++it)->u.operand;
-    int offset = (++it)->u.operand;
-    printLocationAndOp(out, location, it, op);
-    out.printf("%s, %d(->%d)", registerName(r0).data(), offset, location + offset);
+    m_out.printf("[%4u] %-18s ", location, op);
 }
 
 template<class Block>
-void BytecodeDumper<Block>::printCompareJump(PrintStream& out, const typename Block::Instruction*, const typename Block::Instruction*& it, int location, const char* op)
+void BytecodeDumper<Block>::dumpBytecode(const InstructionStream::Ref& it, const ICStatusMap&)
 {
-    int r0 = (++it)->u.operand;
-    int r1 = (++it)->u.operand;
-    int offset = (++it)->u.operand;
-    printLocationAndOp(out, location, it, op);
-    out.printf("%s, %s, %d(->%d)", registerName(r0).data(), registerName(r1).data(), offset, location + offset);
+    ::JSC::dumpBytecode(this, it.offset(), it.ptr());
+    m_out.print("\n");
 }
 
 template<class Block>
-void BytecodeDumper<Block>::printGetByIdOp(PrintStream& out, int location, const typename Block::Instruction*& it)
+void BytecodeDumper<Block>::dumpBytecode(Block* block, PrintStream& out, const InstructionStream::Ref& it, const ICStatusMap& statusMap)
 {
-    const char* op;
-    switch (Interpreter::getOpcodeID(*it)) {
-    case op_get_by_id:
-        op = "get_by_id";
-        break;
-    case op_get_by_id_proto_load:
-        op = "get_by_id_proto_load";
-        break;
-    case op_get_by_id_unset:
-        op = "get_by_id_unset";
-        break;
-    case op_get_array_length:
-        op = "array_length";
-        break;
-    default:
-        RELEASE_ASSERT_NOT_REACHED();
-#if COMPILER_QUIRK(CONSIDERS_UNREACHABLE_CODE)
-        op = 0;
-#endif
-    }
-    int r0 = (++it)->u.operand;
-    int r1 = (++it)->u.operand;
-    int id0 = (++it)->u.operand;
-    printLocationAndOp(out, location, it, op);
-    out.printf("%s, %s, %s", registerName(r0).data(), registerName(r1).data(), idName(id0, identifier(id0)).data());
-    it += 4; // Increment up to the value profiler.
-}
-
-static void dumpStructure(PrintStream& out, const char* name, Structure* structure, const Identifier& ident)
-{
-    if (!structure)
-        return;
-
-    out.printf("%s = %p", name, structure);
-
-    PropertyOffset offset = structure->getConcurrently(ident.impl());
-    if (offset != invalidOffset)
-        out.printf(" (offset = %d)", offset);
-}
-
-static void dumpChain(PrintStream& out, StructureChain* chain, const Identifier& ident)
-{
-    out.printf("chain = %p: [", chain);
-    bool first = true;
-    for (WriteBarrier<Structure>* currentStructure = chain->head(); *currentStructure; ++currentStructure) {
-        if (first)
-            first = false;
-        else
-            out.printf(", ");
-        dumpStructure(out, "struct", currentStructure->get(), ident);
-    }
-    out.printf("]");
+    BytecodeDumper dumper(block, out);
+    dumper.dumpBytecode(it, statusMap);
 }
 
 template<class Block>
-void BytecodeDumper<Block>::printGetByIdCacheStatus(PrintStream& out, int location, const ICStatusMap& statusMap)
-{
-    const auto* instruction = instructionsBegin() + location;
-
-    const Identifier& ident = identifier(instruction[3].u.operand);
-
-    UNUSED_PARAM(ident); // tell the compiler to shut up in certain platform configurations.
-
-    if (Interpreter::getOpcodeID(instruction[0]) == op_get_array_length)
-        out.printf(" llint(array_length)");
-    else if (StructureID structureID = getStructureID(instruction[4])) {
-        Structure* structure = vm()->heap.structureIDTable().get(structureID);
-        out.printf(" llint(");
-        dumpStructure(out, "struct", structure, ident);
-        out.printf(")");
-        if (Interpreter::getOpcodeID(instruction[0]) == op_get_by_id_proto_load)
-            out.printf(" proto(%p)", getPointer(instruction[6]));
-    }
-
-#if ENABLE(JIT)
-    if (StructureStubInfo* stubPtr = statusMap.get(CodeOrigin(location)).stubInfo) {
-        StructureStubInfo& stubInfo = *stubPtr;
-        if (stubInfo.resetByGC)
-            out.print(" (Reset By GC)");
-
-        out.printf(" jit(");
-
-        Structure* baseStructure = nullptr;
-        PolymorphicAccess* stub = nullptr;
-
-        switch (stubInfo.cacheType) {
-        case CacheType::GetByIdSelf:
-            out.printf("self");
-            baseStructure = stubInfo.u.byIdSelf.baseObjectStructure.get();
-            break;
-        case CacheType::Stub:
-            out.printf("stub");
-            stub = stubInfo.u.stub;
-            break;
-        case CacheType::Unset:
-            out.printf("unset");
-            break;
-        case CacheType::ArrayLength:
-            out.printf("ArrayLength");
-            break;
-        case CacheType::StringLength:
-            out.printf("StringLength");
-            break;
-        default:
-            RELEASE_ASSERT_NOT_REACHED();
-            break;
-        }
-
-        if (baseStructure) {
-            out.printf(", ");
-            dumpStructure(out, "struct", baseStructure, ident);
-        }
-
-        if (stub)
-            out.print(", ", *stub);
-
-        out.printf(")");
-    }
-#else
-    UNUSED_PARAM(statusMap);
-#endif
-}
-
-template<class Block>
-void BytecodeDumper<Block>::printPutByIdCacheStatus(PrintStream& out, int location, const ICStatusMap& statusMap)
-{
-    const auto* instruction = instructionsBegin() + location;
-
-    const Identifier& ident = identifier(instruction[2].u.operand);
-
-    UNUSED_PARAM(ident); // tell the compiler to shut up in certain platform configurations.
-
-    out.print(", ", getPutByIdFlags(instruction[8]));
-
-    if (StructureID structureID = getStructureID(instruction[4])) {
-        Structure* structure = vm()->heap.structureIDTable().get(structureID);
-        out.print(" llint(");
-        if (StructureID newStructureID = getStructureID(instruction[6])) {
-            Structure* newStructure = vm()->heap.structureIDTable().get(newStructureID);
-            dumpStructure(out, "prev", structure, ident);
-            out.print(", ");
-            dumpStructure(out, "next", newStructure, ident);
-            if (StructureChain* chain = getStructureChain(instruction[7])) {
-                out.print(", ");
-                dumpChain(out, chain, ident);
-            }
-        } else
-            dumpStructure(out, "struct", structure, ident);
-        out.print(")");
-    }
-
-#if ENABLE(JIT)
-    if (StructureStubInfo* stubPtr = statusMap.get(CodeOrigin(location)).stubInfo) {
-        StructureStubInfo& stubInfo = *stubPtr;
-        if (stubInfo.resetByGC)
-            out.print(" (Reset By GC)");
-
-        out.printf(" jit(");
-
-        switch (stubInfo.cacheType) {
-        case CacheType::PutByIdReplace:
-            out.print("replace, ");
-            dumpStructure(out, "struct", stubInfo.u.byIdSelf.baseObjectStructure.get(), ident);
-            break;
-        case CacheType::Stub: {
-            out.print("stub, ", *stubInfo.u.stub);
-            break;
-        }
-        case CacheType::Unset:
-            out.printf("unset");
-            break;
-        default:
-            RELEASE_ASSERT_NOT_REACHED();
-            break;
-        }
-        out.printf(")");
-    }
-#else
-    UNUSED_PARAM(statusMap);
-#endif
-}
-
-template<class Block>
-void BytecodeDumper<Block>::printInByIdCacheStatus(PrintStream& out, int location, const ICStatusMap& statusMap)
-{
-    const auto* instruction = instructionsBegin() + location;
-
-    const Identifier& ident = identifier(instruction[3].u.operand);
-
-    UNUSED_PARAM(ident); // tell the compiler to shut up in certain platform configurations.
-
-#if ENABLE(JIT)
-    if (StructureStubInfo* stubPtr = statusMap.get(CodeOrigin(location)).stubInfo) {
-        StructureStubInfo& stubInfo = *stubPtr;
-        if (stubInfo.resetByGC)
-            out.print(" (Reset By GC)");
-
-        out.printf(" jit(");
-
-        Structure* baseStructure = nullptr;
-        PolymorphicAccess* stub = nullptr;
-
-        switch (stubInfo.cacheType) {
-        case CacheType::InByIdSelf:
-            out.printf("self");
-            baseStructure = stubInfo.u.byIdSelf.baseObjectStructure.get();
-            break;
-        case CacheType::Stub:
-            out.printf("stub");
-            stub = stubInfo.u.stub;
-            break;
-        case CacheType::Unset:
-            out.printf("unset");
-            break;
-        default:
-            RELEASE_ASSERT_NOT_REACHED();
-            break;
-        }
-
-        if (baseStructure) {
-            out.printf(", ");
-            dumpStructure(out, "struct", baseStructure, ident);
-        }
-
-        if (stub)
-            out.print(", ", *stub);
-
-        out.printf(")");
-    }
-#else
-    UNUSED_PARAM(out);
-    UNUSED_PARAM(statusMap);
-#endif
-}
-
-#if ENABLE(JIT)
-template<typename Block>
-void BytecodeDumper<Block>::dumpCallLinkStatus(PrintStream&, unsigned, const ICStatusMap&)
-{
-}
-
-template<>
-void BytecodeDumper<CodeBlock>::dumpCallLinkStatus(PrintStream& out, unsigned location, const ICStatusMap& statusMap)
-{
-    if (block()->jitType() != JITCode::FTLJIT)
-        out.print(" status(", CallLinkStatus::computeFor(block(), location, statusMap), ")");
-}
-#endif
-
-template<class Block>
-void BytecodeDumper<Block>::printCallOp(PrintStream& out, int location, const typename Block::Instruction*& it, const char* op, CacheDumpMode cacheDumpMode, bool& hasPrintedProfiling, const ICStatusMap& statusMap)
-{
-    int dst = (++it)->u.operand;
-    int func = (++it)->u.operand;
-    int argCount = (++it)->u.operand;
-    int registerOffset = (++it)->u.operand;
-    printLocationAndOp(out, location, it, op);
-    out.print(registerName(dst), ", ", registerName(func), ", ", argCount, ", ", registerOffset);
-    out.print(" (this at ", virtualRegisterForArgument(0, -registerOffset), ")");
-    if (cacheDumpMode == DumpCaches) {
-        LLIntCallLinkInfo* callLinkInfo = getCallLinkInfo(it[1]);
-        if (callLinkInfo->lastSeenCallee) {
-            JSObject* object = callLinkInfo->lastSeenCallee.get();
-            if (auto* function = jsDynamicCast<JSFunction*>(*vm(), object))
-                out.printf(" llint(%p, exec %p)", function, function->executable());
-            else
-                out.printf(" llint(%p)", object);
-        }
-#if ENABLE(JIT)
-        if (CallLinkInfo* info = statusMap.get(CodeOrigin(location)).callLinkInfo) {
-            if (!info->isDirect() && info->haveLastSeenCallee()) {
-                JSObject* object = info->lastSeenCallee();
-                if (auto* function = jsDynamicCast<JSFunction*>(*vm(), object))
-                    out.printf(" jit(%p, exec %p)", function, function->executable());
-                else
-                    out.printf(" jit(%p)", object);
-            }
-        }
-
-        dumpCallLinkStatus(out, location, statusMap);
-#else
-        UNUSED_PARAM(statusMap);
-#endif
-    }
-    ++it;
-    ++it;
-    dumpArrayProfiling(out, it, hasPrintedProfiling);
-    dumpValueProfiling(out, it, hasPrintedProfiling);
-}
-
-template<class Block>
-void BytecodeDumper<Block>::printPutByIdOp(PrintStream& out, int location, const typename Block::Instruction*& it, const char* op)
-{
-    int r0 = (++it)->u.operand;
-    int id0 = (++it)->u.operand;
-    int r1 = (++it)->u.operand;
-    printLocationAndOp(out, location, it, op);
-    out.printf("%s, %s, %s", registerName(r0).data(), idName(id0, identifier(id0)).data(), registerName(r1).data());
-    it += 5;
-}
-
-template<class Block>
-void BytecodeDumper<Block>::printLocationOpAndRegisterOperand(PrintStream& out, int location, const typename Block::Instruction*& it, const char* op, int operand)
-{
-    printLocationAndOp(out, location, it, op);
-    out.printf("%s", registerName(operand).data());
-}
-
-template<class Block>
-void BytecodeDumper<Block>::dumpBytecode(PrintStream& out, const typename Block::Instruction* begin, const typename Block::Instruction*& it, const ICStatusMap& statusMap)
-{
-    int location = it - begin;
-    bool hasPrintedProfiling = false;
-    OpcodeID opcode = Interpreter::getOpcodeID(*it);
-    switch (opcode) {
-    case op_enter: {
-        printLocationAndOp(out, location, it, "enter");
-        break;
-    }
-    case op_get_scope: {
-        int r0 = (++it)->u.operand;
-        printLocationOpAndRegisterOperand(out, location, it, "get_scope", r0);
-        break;
-    }
-    case op_create_direct_arguments: {
-        int r0 = (++it)->u.operand;
-        printLocationAndOp(out, location, it, "create_direct_arguments");
-        out.printf("%s", registerName(r0).data());
-        break;
-    }
-    case op_create_scoped_arguments: {
-        int r0 = (++it)->u.operand;
-        int r1 = (++it)->u.operand;
-        printLocationAndOp(out, location, it, "create_scoped_arguments");
-        out.printf("%s, %s", registerName(r0).data(), registerName(r1).data());
-        break;
-    }
-    case op_create_cloned_arguments: {
-        int r0 = (++it)->u.operand;
-        printLocationAndOp(out, location, it, "create_cloned_arguments");
-        out.printf("%s", registerName(r0).data());
-        break;
-    }
-    case op_argument_count: {
-        int r0 = (++it)->u.operand;
-        printLocationOpAndRegisterOperand(out, location, it, "argument_count", r0);
-        break;
-    }
-    case op_get_argument: {
-        int r0 = (++it)->u.operand;
-        int index = (++it)->u.operand;
-        printLocationOpAndRegisterOperand(out, location, it, "argument", r0);
-        out.printf(", %d", index);
-        dumpValueProfiling(out, it, hasPrintedProfiling);
-        break;
-    }
-    case op_create_rest: {
-        int r0 = (++it)->u.operand;
-        int r1 = (++it)->u.operand;
-        unsigned argumentOffset = (++it)->u.unsignedValue;
-        printLocationAndOp(out, location, it, "create_rest");
-        out.printf("%s, %s, ", registerName(r0).data(), registerName(r1).data());
-        out.printf("ArgumentsOffset: %u", argumentOffset);
-        break;
-    }
-    case op_get_rest_length: {
-        int r0 = (++it)->u.operand;
-        printLocationAndOp(out, location, it, "get_rest_length");
-        out.printf("%s, ", registerName(r0).data());
-        unsigned argumentOffset = (++it)->u.unsignedValue;
-        out.printf("ArgumentsOffset: %u", argumentOffset);
-        break;
-    }
-    case op_create_this: {
-        int r0 = (++it)->u.operand;
-        int r1 = (++it)->u.operand;
-        unsigned inferredInlineCapacity = (++it)->u.operand;
-        unsigned cachedFunction = (++it)->u.operand;
-        printLocationAndOp(out, location, it, "create_this");
-        out.printf("%s, %s, %u, %u", registerName(r0).data(), registerName(r1).data(), inferredInlineCapacity, cachedFunction);
-        break;
-    }
-    case op_to_this: {
-        int r0 = (++it)->u.operand;
-        printLocationOpAndRegisterOperand(out, location, it, "to_this", r0);
-        Structure* structure = getStructure(*(++it));
-        if (structure)
-            out.print(", cache(struct = ", RawPointer(structure), ")");
-        out.print(", ", getToThisStatus(*(++it)));
-        dumpValueProfiling(out, it, hasPrintedProfiling);
-        break;
-    }
-    case op_check_tdz: {
-        int r0 = (++it)->u.operand;
-        printLocationOpAndRegisterOperand(out, location, it, "op_check_tdz", r0);
-        break;
-    }
-    case op_new_object: {
-        int r0 = (++it)->u.operand;
-        unsigned inferredInlineCapacity = (++it)->u.operand;
-        printLocationAndOp(out, location, it, "new_object");
-        out.printf("%s, %u", registerName(r0).data(), inferredInlineCapacity);
-        ++it; // Skip object allocation profile.
-        break;
-    }
-    case op_new_array: {
-        int dst = (++it)->u.operand;
-        int argv = (++it)->u.operand;
-        int argc = (++it)->u.operand;
-        printLocationAndOp(out, location, it, "new_array");
-        out.printf("%s, %s, %d", registerName(dst).data(), registerName(argv).data(), argc);
-        ++it; // Skip array allocation profile.
-        break;
-    }
-    case op_new_array_with_spread: {
-        int dst = (++it)->u.operand;
-        int argv = (++it)->u.operand;
-        int argc = (++it)->u.operand;
-        printLocationAndOp(out, location, it, "new_array_with_spread");
-        out.printf("%s, %s, %d, ", registerName(dst).data(), registerName(argv).data(), argc);
-        unsigned bitVectorIndex = (++it)->u.unsignedValue;
-        const BitVector& bitVector = block()->bitVector(bitVectorIndex);
-        out.print("BitVector:", bitVectorIndex, ":");
-        for (unsigned i = 0; i < static_cast<unsigned>(argc); i++) {
-            if (bitVector.get(i))
-                out.print("1");
-            else
-                out.print("0");
-        }
-        break;
-    }
-    case op_spread: {
-        int dst = (++it)->u.operand;
-        int arg = (++it)->u.operand;
-        printLocationAndOp(out, location, it, "spread");
-        out.printf("%s, %s", registerName(dst).data(), registerName(arg).data());
-        break;
-    }
-    case op_new_array_with_size: {
-        int dst = (++it)->u.operand;
-        int length = (++it)->u.operand;
-        printLocationAndOp(out, location, it, "new_array_with_size");
-        out.printf("%s, %s", registerName(dst).data(), registerName(length).data());
-        ++it; // Skip array allocation profile.
-        break;
-    }
-    case op_new_array_buffer: {
-        int dst = (++it)->u.operand;
-        int array = (++it)->u.operand;
-        printLocationAndOp(out, location, it, "new_array_buffer");
-        out.printf("%s, %s", registerName(dst).data(), registerName(array).data());
-        ++it; // Skip array allocation profile.
-        break;
-    }
-    case op_new_regexp: {
-        int r0 = (++it)->u.operand;
-        int re0 = (++it)->u.operand;
-        printLocationAndOp(out, location, it, "new_regexp");
-        out.printf("%s, %s", registerName(r0).data(), registerName(re0).data());
-        break;
-    }
-    case op_mov: {
-        int r0 = (++it)->u.operand;
-        int r1 = (++it)->u.operand;
-        printLocationAndOp(out, location, it, "mov");
-        out.printf("%s, %s", registerName(r0).data(), registerName(r1).data());
-        break;
-    }
-    case op_profile_type: {
-        int r0 = (++it)->u.operand;
-        ++it;
-        ++it;
-        ++it;
-        ++it;
-        printLocationAndOp(out, location, it, "op_profile_type");
-        out.printf("%s", registerName(r0).data());
-        break;
-    }
-    case op_profile_control_flow: {
-        BasicBlockLocation* basicBlockLocation = getBasicBlockLocation(*(++it));
-        printLocationAndOp(out, location, it, "profile_control_flow");
-        if (basicBlockLocation)
-            out.printf("[%d, %d]", basicBlockLocation->startOffset(), basicBlockLocation->endOffset());
-        break;
-    }
-    case op_not: {
-        printUnaryOp(out, location, it, "not");
-        break;
-    }
-    case op_eq: {
-        printBinaryOp(out, location, it, "eq");
-        break;
-    }
-    case op_eq_null: {
-        printUnaryOp(out, location, it, "eq_null");
-        break;
-    }
-    case op_neq: {
-        printBinaryOp(out, location, it, "neq");
-        break;
-    }
-    case op_neq_null: {
-        printUnaryOp(out, location, it, "neq_null");
-        break;
-    }
-    case op_stricteq: {
-        printBinaryOp(out, location, it, "stricteq");
-        break;
-    }
-    case op_nstricteq: {
-        printBinaryOp(out, location, it, "nstricteq");
-        break;
-    }
-    case op_less: {
-        printBinaryOp(out, location, it, "less");
-        break;
-    }
-    case op_lesseq: {
-        printBinaryOp(out, location, it, "lesseq");
-        break;
-    }
-    case op_greater: {
-        printBinaryOp(out, location, it, "greater");
-        break;
-    }
-    case op_greatereq: {
-        printBinaryOp(out, location, it, "greatereq");
-        break;
-    }
-    case op_below: {
-        printBinaryOp(out, location, it, "below");
-        break;
-    }
-    case op_beloweq: {
-        printBinaryOp(out, location, it, "beloweq");
-        break;
-    }
-    case op_inc: {
-        int r0 = (++it)->u.operand;
-        printLocationOpAndRegisterOperand(out, location, it, "inc", r0);
-        break;
-    }
-    case op_dec: {
-        int r0 = (++it)->u.operand;
-        printLocationOpAndRegisterOperand(out, location, it, "dec", r0);
-        break;
-    }
-    case op_to_number: {
-        printUnaryOp(out, location, it, "to_number");
-        dumpValueProfiling(out, it, hasPrintedProfiling);
-        break;
-    }
-    case op_to_string: {
-        printUnaryOp(out, location, it, "to_string");
-        break;
-    }
-    case op_to_object: {
-        printUnaryOp(out, location, it, "to_object");
-        int id0 = (++it)->u.operand;
-        out.printf(" %s", idName(id0, identifier(id0)).data());
-        dumpValueProfiling(out, it, hasPrintedProfiling);
-        break;
-    }
-    case op_negate: {
-        printUnaryOp(out, location, it, "negate");
-        ++it; // op_negate has an extra operand for the ArithProfile.
-        break;
-    }
-    case op_add: {
-        printBinaryOp(out, location, it, "add");
-        ++it;
-        break;
-    }
-    case op_mul: {
-        printBinaryOp(out, location, it, "mul");
-        ++it;
-        break;
-    }
-    case op_div: {
-        printBinaryOp(out, location, it, "div");
-        ++it;
-        break;
-    }
-    case op_mod: {
-        printBinaryOp(out, location, it, "mod");
-        break;
-    }
-    case op_pow: {
-        printBinaryOp(out, location, it, "pow");
-        break;
-    }
-    case op_sub: {
-        printBinaryOp(out, location, it, "sub");
-        ++it;
-        break;
-    }
-    case op_lshift: {
-        printBinaryOp(out, location, it, "lshift");
-        break;
-    }
-    case op_rshift: {
-        printBinaryOp(out, location, it, "rshift");
-        break;
-    }
-    case op_urshift: {
-        printBinaryOp(out, location, it, "urshift");
-        break;
-    }
-    case op_bitand: {
-        printBinaryOp(out, location, it, "bitand");
-        ++it;
-        break;
-    }
-    case op_bitxor: {
-        printBinaryOp(out, location, it, "bitxor");
-        ++it;
-        break;
-    }
-    case op_bitor: {
-        printBinaryOp(out, location, it, "bitor");
-        ++it;
-        break;
-    }
-    case op_overrides_has_instance: {
-        int r0 = (++it)->u.operand;
-        int r1 = (++it)->u.operand;
-        int r2 = (++it)->u.operand;
-        printLocationAndOp(out, location, it, "overrides_has_instance");
-        out.printf("%s, %s, %s", registerName(r0).data(), registerName(r1).data(), registerName(r2).data());
-        break;
-    }
-    case op_instanceof: {
-        int r0 = (++it)->u.operand;
-        int r1 = (++it)->u.operand;
-        int r2 = (++it)->u.operand;
-        printLocationAndOp(out, location, it, "instanceof");
-        out.printf("%s, %s, %s", registerName(r0).data(), registerName(r1).data(), registerName(r2).data());
-        break;
-    }
-    case op_instanceof_custom: {
-        int r0 = (++it)->u.operand;
-        int r1 = (++it)->u.operand;
-        int r2 = (++it)->u.operand;
-        int r3 = (++it)->u.operand;
-        printLocationAndOp(out, location, it, "instanceof_custom");
-        out.printf("%s, %s, %s, %s", registerName(r0).data(), registerName(r1).data(), registerName(r2).data(), registerName(r3).data());
-        break;
-    }
-    case op_unsigned: {
-        printUnaryOp(out, location, it, "unsigned");
-        break;
-    }
-    case op_typeof: {
-        printUnaryOp(out, location, it, "typeof");
-        break;
-    }
-    case op_is_empty: {
-        printUnaryOp(out, location, it, "is_empty");
-        break;
-    }
-    case op_is_undefined: {
-        printUnaryOp(out, location, it, "is_undefined");
-        break;
-    }
-    case op_is_boolean: {
-        printUnaryOp(out, location, it, "is_boolean");
-        break;
-    }
-    case op_is_number: {
-        printUnaryOp(out, location, it, "is_number");
-        break;
-    }
-    case op_is_cell_with_type: {
-        int r0 = (++it)->u.operand;
-        int r1 = (++it)->u.operand;
-        int type = (++it)->u.operand;
-        printLocationAndOp(out, location, it, "is_cell_with_type");
-        out.printf("%s, %s, %d", registerName(r0).data(), registerName(r1).data(), type);
-        break;
-    }
-    case op_is_object: {
-        printUnaryOp(out, location, it, "is_object");
-        break;
-    }
-    case op_is_object_or_null: {
-        printUnaryOp(out, location, it, "is_object_or_null");
-        break;
-    }
-    case op_is_function: {
-        printUnaryOp(out, location, it, "is_function");
-        break;
-    }
-    case op_in_by_id: {
-        int r0 = (++it)->u.operand;
-        int r1 = (++it)->u.operand;
-        int id0 = (++it)->u.operand;
-        printLocationAndOp(out, location, it, "in_by_id");
-        out.printf("%s, %s, %s", registerName(r0).data(), registerName(r1).data(), idName(id0, identifier(id0)).data());
-        printInByIdCacheStatus(out, location, statusMap);
-        break;
-    }
-    case op_in_by_val: {
-        printBinaryOp(out, location, it, "in_by_val");
-        dumpArrayProfiling(out, it, hasPrintedProfiling);
-        break;
-    }
-    case op_try_get_by_id: {
-        int r0 = (++it)->u.operand;
-        int r1 = (++it)->u.operand;
-        int id0 = (++it)->u.operand;
-        printLocationAndOp(out, location, it, "try_get_by_id");
-        out.printf("%s, %s, %s", registerName(r0).data(), registerName(r1).data(), idName(id0, identifier(id0)).data());
-        dumpValueProfiling(out, it, hasPrintedProfiling);
-        break;
-    }
-    case op_get_by_id_direct: {
-        int r0 = (++it)->u.operand;
-        int r1 = (++it)->u.operand;
-        int id0 = (++it)->u.operand;
-        printLocationAndOp(out, location, it, "get_by_id_direct");
-        out.printf("%s, %s, %s", registerName(r0).data(), registerName(r1).data(), idName(id0, identifier(id0)).data());
-        it += 2; // Increment up to the value profiler.
-        printGetByIdCacheStatus(out, location, statusMap);
-        dumpValueProfiling(out, it, hasPrintedProfiling);
-        break;
-    }
-    case op_get_by_id:
-    case op_get_by_id_proto_load:
-    case op_get_by_id_unset:
-    case op_get_array_length: {
-        printGetByIdOp(out, location, it);
-        printGetByIdCacheStatus(out, location, statusMap);
-        dumpValueProfiling(out, it, hasPrintedProfiling);
-        break;
-    }
-    case op_get_by_id_with_this: {
-        printLocationAndOp(out, location, it, "get_by_id_with_this");
-        int r0 = (++it)->u.operand;
-        int r1 = (++it)->u.operand;
-        int r2 = (++it)->u.operand;
-        int id0 = (++it)->u.operand;
-        out.printf("%s, %s, %s, %s", registerName(r0).data(), registerName(r1).data(), registerName(r2).data(), idName(id0, identifier(id0)).data());
-        dumpValueProfiling(out, it, hasPrintedProfiling);
-        break;
-    }
-    case op_get_by_val_with_this: {
-        int r0 = (++it)->u.operand;
-        int r1 = (++it)->u.operand;
-        int r2 = (++it)->u.operand;
-        int r3 = (++it)->u.operand;
-        printLocationAndOp(out, location, it, "get_by_val_with_this");
-        out.printf("%s, %s, %s, %s", registerName(r0).data(), registerName(r1).data(), registerName(r2).data(), registerName(r3).data());
-        dumpValueProfiling(out, it, hasPrintedProfiling);
-        break;
-    }
-    case op_put_by_id: {
-        printPutByIdOp(out, location, it, "put_by_id");
-        printPutByIdCacheStatus(out, location, statusMap);
-        break;
-    }
-    case op_put_by_id_with_this: {
-        int r0 = (++it)->u.operand;
-        int r1 = (++it)->u.operand;
-        int id0 = (++it)->u.operand;
-        int r2 = (++it)->u.operand;
-        printLocationAndOp(out, location, it, "put_by_id_with_this");
-        out.printf("%s, %s, %s, %s", registerName(r0).data(), registerName(r1).data(), idName(id0, identifier(id0)).data(), registerName(r2).data());
-        break;
-    }
-    case op_put_by_val_with_this: {
-        int r0 = (++it)->u.operand;
-        int r1 = (++it)->u.operand;
-        int r2 = (++it)->u.operand;
-        int r3 = (++it)->u.operand;
-        printLocationAndOp(out, location, it, "put_by_val_with_this");
-        out.printf("%s, %s, %s, %s", registerName(r0).data(), registerName(r1).data(), registerName(r2).data(), registerName(r3).data());
-        break;
-    }
-    case op_put_getter_by_id: {
-        int r0 = (++it)->u.operand;
-        int id0 = (++it)->u.operand;
-        int n0 = (++it)->u.operand;
-        int r1 = (++it)->u.operand;
-        printLocationAndOp(out, location, it, "put_getter_by_id");
-        out.printf("%s, %s, %d, %s", registerName(r0).data(), idName(id0, identifier(id0)).data(), n0, registerName(r1).data());
-        break;
-    }
-    case op_put_setter_by_id: {
-        int r0 = (++it)->u.operand;
-        int id0 = (++it)->u.operand;
-        int n0 = (++it)->u.operand;
-        int r1 = (++it)->u.operand;
-        printLocationAndOp(out, location, it, "put_setter_by_id");
-        out.printf("%s, %s, %d, %s", registerName(r0).data(), idName(id0, identifier(id0)).data(), n0, registerName(r1).data());
-        break;
-    }
-    case op_put_getter_setter_by_id: {
-        int r0 = (++it)->u.operand;
-        int id0 = (++it)->u.operand;
-        int n0 = (++it)->u.operand;
-        int r1 = (++it)->u.operand;
-        int r2 = (++it)->u.operand;
-        printLocationAndOp(out, location, it, "put_getter_setter_by_id");
-        out.printf("%s, %s, %d, %s, %s", registerName(r0).data(), idName(id0, identifier(id0)).data(), n0, registerName(r1).data(), registerName(r2).data());
-        break;
-    }
-    case op_put_getter_by_val: {
-        int r0 = (++it)->u.operand;
-        int r1 = (++it)->u.operand;
-        int n0 = (++it)->u.operand;
-        int r2 = (++it)->u.operand;
-        printLocationAndOp(out, location, it, "put_getter_by_val");
-        out.printf("%s, %s, %d, %s", registerName(r0).data(), registerName(r1).data(), n0, registerName(r2).data());
-        break;
-    }
-    case op_put_setter_by_val: {
-        int r0 = (++it)->u.operand;
-        int r1 = (++it)->u.operand;
-        int n0 = (++it)->u.operand;
-        int r2 = (++it)->u.operand;
-        printLocationAndOp(out, location, it, "put_setter_by_val");
-        out.printf("%s, %s, %d, %s", registerName(r0).data(), registerName(r1).data(), n0, registerName(r2).data());
-        break;
-    }
-    case op_define_data_property: {
-        int r0 = (++it)->u.operand;
-        int r1 = (++it)->u.operand;
-        int r2 = (++it)->u.operand;
-        int r3 = (++it)->u.operand;
-        printLocationAndOp(out, location, it, "define_data_property");
-        out.printf("%s, %s, %s, %s", registerName(r0).data(), registerName(r1).data(), registerName(r2).data(), registerName(r3).data());
-        break;
-    }
-    case op_define_accessor_property: {
-        int r0 = (++it)->u.operand;
-        int r1 = (++it)->u.operand;
-        int r2 = (++it)->u.operand;
-        int r3 = (++it)->u.operand;
-        int r4 = (++it)->u.operand;
-        printLocationAndOp(out, location, it, "define_accessor_property");
-        out.printf("%s, %s, %s, %s, %s", registerName(r0).data(), registerName(r1).data(), registerName(r2).data(), registerName(r3).data(), registerName(r4).data());
-        break;
-    }
-    case op_del_by_id: {
-        int r0 = (++it)->u.operand;
-        int r1 = (++it)->u.operand;
-        int id0 = (++it)->u.operand;
-        printLocationAndOp(out, location, it, "del_by_id");
-        out.printf("%s, %s, %s", registerName(r0).data(), registerName(r1).data(), idName(id0, identifier(id0)).data());
-        break;
-    }
-    case op_get_by_val: {
-        int r0 = (++it)->u.operand;
-        int r1 = (++it)->u.operand;
-        int r2 = (++it)->u.operand;
-        printLocationAndOp(out, location, it, "get_by_val");
-        out.printf("%s, %s, %s", registerName(r0).data(), registerName(r1).data(), registerName(r2).data());
-        dumpArrayProfiling(out, it, hasPrintedProfiling);
-        dumpValueProfiling(out, it, hasPrintedProfiling);
-        break;
-    }
-    case op_put_by_val: {
-        int r0 = (++it)->u.operand;
-        int r1 = (++it)->u.operand;
-        int r2 = (++it)->u.operand;
-        printLocationAndOp(out, location, it, "put_by_val");
-        out.printf("%s, %s, %s", registerName(r0).data(), registerName(r1).data(), registerName(r2).data());
-        dumpArrayProfiling(out, it, hasPrintedProfiling);
-        break;
-    }
-    case op_put_by_val_direct: {
-        int r0 = (++it)->u.operand;
-        int r1 = (++it)->u.operand;
-        int r2 = (++it)->u.operand;
-        printLocationAndOp(out, location, it, "put_by_val_direct");
-        out.printf("%s, %s, %s", registerName(r0).data(), registerName(r1).data(), registerName(r2).data());
-        dumpArrayProfiling(out, it, hasPrintedProfiling);
-        break;
-    }
-    case op_del_by_val: {
-        int r0 = (++it)->u.operand;
-        int r1 = (++it)->u.operand;
-        int r2 = (++it)->u.operand;
-        printLocationAndOp(out, location, it, "del_by_val");
-        out.printf("%s, %s, %s", registerName(r0).data(), registerName(r1).data(), registerName(r2).data());
-        break;
-    }
-    case op_jmp: {
-        int offset = (++it)->u.operand;
-        printLocationAndOp(out, location, it, "jmp");
-        out.printf("%d(->%d)", offset, location + offset);
-        break;
-    }
-    case op_jtrue: {
-        printConditionalJump(out, begin, it, location, "jtrue");
-        break;
-    }
-    case op_jfalse: {
-        printConditionalJump(out, begin, it, location, "jfalse");
-        break;
-    }
-    case op_jeq_null: {
-        printConditionalJump(out, begin, it, location, "jeq_null");
-        break;
-    }
-    case op_jneq_null: {
-        printConditionalJump(out, begin, it, location, "jneq_null");
-        break;
-    }
-    case op_jneq_ptr: {
-        int r0 = (++it)->u.operand;
-        Special::Pointer pointer = getSpecialPointer(*(++it));
-        int offset = (++it)->u.operand;
-        printLocationAndOp(out, location, it, "jneq_ptr");
-        out.printf("%s, %d (%p), %d(->%d)", registerName(r0).data(), pointer, actualPointerFor(pointer), offset, location + offset);
-        ++it;
-        break;
-    }
-    case op_jless: {
-        printCompareJump(out, begin, it, location, "jless");
-        break;
-    }
-    case op_jlesseq: {
-        printCompareJump(out, begin, it, location, "jlesseq");
-        break;
-    }
-    case op_jgreater: {
-        printCompareJump(out, begin, it, location, "jgreater");
-        break;
-    }
-    case op_jgreatereq: {
-        printCompareJump(out, begin, it, location, "jgreatereq");
-        break;
-    }
-    case op_jnless: {
-        printCompareJump(out, begin, it, location, "jnless");
-        break;
-    }
-    case op_jnlesseq: {
-        printCompareJump(out, begin, it, location, "jnlesseq");
-        break;
-    }
-    case op_jngreater: {
-        printCompareJump(out, begin, it, location, "jngreater");
-        break;
-    }
-    case op_jngreatereq: {
-        printCompareJump(out, begin, it, location, "jngreatereq");
-        break;
-    }
-    case op_jeq: {
-        printCompareJump(out, begin, it, location, "jeq");
-        break;
-    }
-    case op_jneq: {
-        printCompareJump(out, begin, it, location, "jneq");
-        break;
-    }
-    case op_jstricteq: {
-        printCompareJump(out, begin, it, location, "jstricteq");
-        break;
-    }
-    case op_jnstricteq: {
-        printCompareJump(out, begin, it, location, "jnstricteq");
-        break;
-    }
-    case op_jbelow: {
-        printCompareJump(out, begin, it, location, "jbelow");
-        break;
-    }
-    case op_jbeloweq: {
-        printCompareJump(out, begin, it, location, "jbeloweq");
-        break;
-    }
-    case op_loop_hint: {
-        printLocationAndOp(out, location, it, "loop_hint");
-        break;
-    }
-    case op_check_traps: {
-        printLocationAndOp(out, location, it, "check_traps");
-        break;
-    }
-    case op_nop: {
-        printLocationAndOp(out, location, it, "nop");
-        break;
-    }
-    case op_super_sampler_begin: {
-        printLocationAndOp(out, location, it, "super_sampler_begin");
-        break;
-    }
-    case op_super_sampler_end: {
-        printLocationAndOp(out, location, it, "super_sampler_end");
-        break;
-    }
-    case op_log_shadow_chicken_prologue: {
-        int r0 = (++it)->u.operand;
-        printLocationAndOp(out, location, it, "log_shadow_chicken_prologue");
-        out.printf("%s", registerName(r0).data());
-        break;
-    }
-    case op_log_shadow_chicken_tail: {
-        int r0 = (++it)->u.operand;
-        int r1 = (++it)->u.operand;
-        printLocationAndOp(out, location, it, "log_shadow_chicken_tail");
-        out.printf("%s, %s", registerName(r0).data(), registerName(r1).data());
-        break;
-    }
-    case op_switch_imm: {
-        int tableIndex = (++it)->u.operand;
-        int defaultTarget = (++it)->u.operand;
-        int scrutineeRegister = (++it)->u.operand;
-        printLocationAndOp(out, location, it, "switch_imm");
-        out.printf("%d, default:%d(->%d)", tableIndex, defaultTarget, location + defaultTarget);
-        const auto& table = block()->switchJumpTable(tableIndex);
-        for (unsigned i = 0; i < table.branchOffsets.size(); ++i)
-            out.printf(", %d:%d(->%d)", i, table.branchOffsets[i], location + table.branchOffsets[i]);
-        out.print(", ", registerName(scrutineeRegister).data());
-        break;
-    }
-    case op_switch_char: {
-        int tableIndex = (++it)->u.operand;
-        int defaultTarget = (++it)->u.operand;
-        int scrutineeRegister = (++it)->u.operand;
-        printLocationAndOp(out, location, it, "switch_char");
-        out.printf("%d, default:%d(->%d)", tableIndex, defaultTarget, location + defaultTarget);
-        const auto& table = block()->switchJumpTable(tableIndex);
-        for (unsigned i = 0; i < table.branchOffsets.size(); ++i)
-            out.printf(", %c:%d(->%d)", i, table.branchOffsets[i], location + table.branchOffsets[i]);
-        out.print(", ", registerName(scrutineeRegister).data());
-        break;
-    }
-    case op_switch_string: {
-        int tableIndex = (++it)->u.operand;
-        int defaultTarget = (++it)->u.operand;
-        int scrutineeRegister = (++it)->u.operand;
-        printLocationAndOp(out, location, it, "switch_string");
-        out.printf("%d, default:%d(->%d)", tableIndex, defaultTarget, location + defaultTarget);
-        const auto& table = block()->stringSwitchJumpTable(tableIndex);
-        for (const auto& offset : table.offsetTable) {
-            out.print(", ", Identifier::fromUid(vm(), static_cast<UniquedStringImpl*>(offset.key.get())));
-            out.printf(":%d(%d)", offset.value.branchOffset, location + offset.value.branchOffset);
-        }
-        out.print(", ", registerName(scrutineeRegister).data());
-        break;
-    }
-    case op_new_func: {
-        int r0 = (++it)->u.operand;
-        int r1 = (++it)->u.operand;
-        int f0 = (++it)->u.operand;
-        printLocationAndOp(out, location, it, "new_func");
-        out.printf("%s, %s, f%d", registerName(r0).data(), registerName(r1).data(), f0);
-        break;
-    }
-    case op_new_generator_func: {
-        int r0 = (++it)->u.operand;
-        int r1 = (++it)->u.operand;
-        int f0 = (++it)->u.operand;
-        printLocationAndOp(out, location, it, "new_generator_func");
-        out.printf("%s, %s, f%d", registerName(r0).data(), registerName(r1).data(), f0);
-        break;
-    }
-    case op_new_async_func: {
-        int r0 = (++it)->u.operand;
-        int r1 = (++it)->u.operand;
-        int f0 = (++it)->u.operand;
-        printLocationAndOp(out, location, it, "new_async_func");
-        out.printf("%s, %s, f%d", registerName(r0).data(), registerName(r1).data(), f0);
-        break;
-    }
-    case op_new_async_generator_func: {
-        int r0 = (++it)->u.operand;
-        int r1 = (++it)->u.operand;
-        int f0 = (++it)->u.operand;
-        printLocationAndOp(out, location, it, "new_async_generator_func");
-        out.printf("%s, %s, f%d", registerName(r0).data(), registerName(r1).data(), f0);
-        break;
-    }
-    case op_new_func_exp: {
-        int r0 = (++it)->u.operand;
-        int r1 = (++it)->u.operand;
-        int f0 = (++it)->u.operand;
-        printLocationAndOp(out, location, it, "new_func_exp");
-        out.printf("%s, %s, f%d", registerName(r0).data(), registerName(r1).data(), f0);
-        break;
-    }
-    case op_new_generator_func_exp: {
-        int r0 = (++it)->u.operand;
-        int r1 = (++it)->u.operand;
-        int f0 = (++it)->u.operand;
-        printLocationAndOp(out, location, it, "new_generator_func_exp");
-        out.printf("%s, %s, f%d", registerName(r0).data(), registerName(r1).data(), f0);
-        break;
-    }
-    case op_new_async_func_exp: {
-        int r0 = (++it)->u.operand;
-        int r1 = (++it)->u.operand;
-        int f0 = (++it)->u.operand;
-        printLocationAndOp(out, location, it, "new_async_func_exp");
-        out.printf("%s, %s, f%d", registerName(r0).data(), registerName(r1).data(), f0);
-        break;
-    }
-    case op_new_async_generator_func_exp: {
-        int r0 = (++it)->u.operand;
-        int r1 = (++it)->u.operand;
-        int f0 = (++it)->u.operand;
-        printLocationAndOp(out, location, it, "op_new_async_generator_func_exp");
-        out.printf("%s, %s, f%d", registerName(r0).data(), registerName(r1).data(), f0);
-        break;
-    }
-    case op_set_function_name: {
-        int funcReg = (++it)->u.operand;
-        int nameReg = (++it)->u.operand;
-        printLocationAndOp(out, location, it, "set_function_name");
-        out.printf("%s, %s", registerName(funcReg).data(), registerName(nameReg).data());
-        break;
-    }
-    case op_call: {
-        printCallOp(out, location, it, "call", DumpCaches, hasPrintedProfiling, statusMap);
-        break;
-    }
-    case op_tail_call: {
-        printCallOp(out, location, it, "tail_call", DumpCaches, hasPrintedProfiling, statusMap);
-        break;
-    }
-    case op_call_eval: {
-        printCallOp(out, location, it, "call_eval", DontDumpCaches, hasPrintedProfiling, statusMap);
-        break;
-    }
-
-    case op_construct_varargs:
-    case op_call_varargs:
-    case op_tail_call_varargs:
-    case op_tail_call_forward_arguments: {
-        int result = (++it)->u.operand;
-        int callee = (++it)->u.operand;
-        int thisValue = (++it)->u.operand;
-        int arguments = (++it)->u.operand;
-        int firstFreeRegister = (++it)->u.operand;
-        int varArgOffset = (++it)->u.operand;
-        ++it;
-        const char* opName;
-        if (opcode == op_call_varargs)
-            opName = "call_varargs";
-        else if (opcode == op_construct_varargs)
-            opName = "construct_varargs";
-        else if (opcode == op_tail_call_varargs)
-            opName = "tail_call_varargs";
-        else if (opcode == op_tail_call_forward_arguments)
-            opName = "tail_call_forward_arguments";
-        else
-            RELEASE_ASSERT_NOT_REACHED();
-
-        printLocationAndOp(out, location, it, opName);
-        out.printf("%s, %s, %s, %s, %d, %d", registerName(result).data(), registerName(callee).data(), registerName(thisValue).data(), registerName(arguments).data(), firstFreeRegister, varArgOffset);
-        dumpValueProfiling(out, it, hasPrintedProfiling);
-        break;
-    }
-
-    case op_ret: {
-        int r0 = (++it)->u.operand;
-        printLocationOpAndRegisterOperand(out, location, it, "ret", r0);
-        break;
-    }
-    case op_construct: {
-        printCallOp(out, location, it, "construct", DumpCaches, hasPrintedProfiling, statusMap);
-        break;
-    }
-    case op_strcat: {
-        int r0 = (++it)->u.operand;
-        int r1 = (++it)->u.operand;
-        int count = (++it)->u.operand;
-        printLocationAndOp(out, location, it, "strcat");
-        out.printf("%s, %s, %d", registerName(r0).data(), registerName(r1).data(), count);
-        break;
-    }
-    case op_to_primitive: {
-        int r0 = (++it)->u.operand;
-        int r1 = (++it)->u.operand;
-        printLocationAndOp(out, location, it, "to_primitive");
-        out.printf("%s, %s", registerName(r0).data(), registerName(r1).data());
-        break;
-    }
-    case op_get_enumerable_length: {
-        int dst = it[1].u.operand;
-        int base = it[2].u.operand;
-        printLocationAndOp(out, location, it, "op_get_enumerable_length");
-        out.printf("%s, %s", registerName(dst).data(), registerName(base).data());
-        it += OPCODE_LENGTH(op_get_enumerable_length) - 1;
-        break;
-    }
-    case op_has_indexed_property: {
-        int dst = (++it)->u.operand;
-        int base = (++it)->u.operand;
-        int propertyName = (++it)->u.operand;
-        printLocationAndOp(out, location, it, "op_has_indexed_property");
-        out.printf("%s, %s, %s", registerName(dst).data(), registerName(base).data(), registerName(propertyName).data());
-        dumpArrayProfiling(out, it, hasPrintedProfiling);
-        break;
-    }
-    case op_has_structure_property: {
-        int dst = it[1].u.operand;
-        int base = it[2].u.operand;
-        int propertyName = it[3].u.operand;
-        int enumerator = it[4].u.operand;
-        printLocationAndOp(out, location, it, "op_has_structure_property");
-        out.printf("%s, %s, %s, %s", registerName(dst).data(), registerName(base).data(), registerName(propertyName).data(), registerName(enumerator).data());
-        it += OPCODE_LENGTH(op_has_structure_property) - 1;
-        break;
-    }
-    case op_has_generic_property: {
-        int dst = it[1].u.operand;
-        int base = it[2].u.operand;
-        int propertyName = it[3].u.operand;
-        printLocationAndOp(out, location, it, "op_has_generic_property");
-        out.printf("%s, %s, %s", registerName(dst).data(), registerName(base).data(), registerName(propertyName).data());
-        it += OPCODE_LENGTH(op_has_generic_property) - 1;
-        break;
-    }
-    case op_get_direct_pname: {
-        int dst = (++it)->u.operand;
-        int base = (++it)->u.operand;
-        int propertyName = (++it)->u.operand;
-        int index = (++it)->u.operand;
-        int enumerator = (++it)->u.operand;
-        printLocationAndOp(out, location, it, "op_get_direct_pname");
-        out.printf("%s, %s, %s, %s, %s", registerName(dst).data(), registerName(base).data(), registerName(propertyName).data(), registerName(index).data(), registerName(enumerator).data());
-        dumpValueProfiling(out, it, hasPrintedProfiling);
-        break;
-
-    }
-    case op_get_property_enumerator: {
-        int dst = it[1].u.operand;
-        int base = it[2].u.operand;
-        printLocationAndOp(out, location, it, "op_get_property_enumerator");
-        out.printf("%s, %s", registerName(dst).data(), registerName(base).data());
-        it += OPCODE_LENGTH(op_get_property_enumerator) - 1;
-        break;
-    }
-    case op_enumerator_structure_pname: {
-        int dst = it[1].u.operand;
-        int enumerator = it[2].u.operand;
-        int index = it[3].u.operand;
-        printLocationAndOp(out, location, it, "op_enumerator_structure_pname");
-        out.printf("%s, %s, %s", registerName(dst).data(), registerName(enumerator).data(), registerName(index).data());
-        it += OPCODE_LENGTH(op_enumerator_structure_pname) - 1;
-        break;
-    }
-    case op_enumerator_generic_pname: {
-        int dst = it[1].u.operand;
-        int enumerator = it[2].u.operand;
-        int index = it[3].u.operand;
-        printLocationAndOp(out, location, it, "op_enumerator_generic_pname");
-        out.printf("%s, %s, %s", registerName(dst).data(), registerName(enumerator).data(), registerName(index).data());
-        it += OPCODE_LENGTH(op_enumerator_generic_pname) - 1;
-        break;
-    }
-    case op_to_index_string: {
-        int dst = it[1].u.operand;
-        int index = it[2].u.operand;
-        printLocationAndOp(out, location, it, "op_to_index_string");
-        out.printf("%s, %s", registerName(dst).data(), registerName(index).data());
-        it += OPCODE_LENGTH(op_to_index_string) - 1;
-        break;
-    }
-    case op_push_with_scope: {
-        int dst = (++it)->u.operand;
-        int newScope = (++it)->u.operand;
-        int currentScope = (++it)->u.operand;
-        printLocationAndOp(out, location, it, "push_with_scope");
-        out.printf("%s, %s, %s", registerName(dst).data(), registerName(newScope).data(), registerName(currentScope).data());
-        break;
-    }
-    case op_get_parent_scope: {
-        int dst = (++it)->u.operand;
-        int parentScope = (++it)->u.operand;
-        printLocationAndOp(out, location, it, "get_parent_scope");
-        out.printf("%s, %s", registerName(dst).data(), registerName(parentScope).data());
-        break;
-    }
-    case op_create_lexical_environment: {
-        int dst = (++it)->u.operand;
-        int scope = (++it)->u.operand;
-        int symbolTable = (++it)->u.operand;
-        int initialValue = (++it)->u.operand;
-        printLocationAndOp(out, location, it, "create_lexical_environment");
-        out.printf("%s, %s, %s, %s",
-            registerName(dst).data(), registerName(scope).data(), registerName(symbolTable).data(), registerName(initialValue).data());
-        break;
-    }
-    case op_catch: {
-        int r0 = (++it)->u.operand;
-        int r1 = (++it)->u.operand;
-        void* pointer = getPointer(*(++it));
-        printLocationAndOp(out, location, it, "catch");
-        out.printf("%s, %s, %p", registerName(r0).data(), registerName(r1).data(), pointer);
-        break;
-    }
-    case op_throw: {
-        int r0 = (++it)->u.operand;
-        printLocationOpAndRegisterOperand(out, location, it, "throw", r0);
-        break;
-    }
-    case op_throw_static_error: {
-        int r0 = (++it)->u.operand;
-        ErrorType k1 = static_cast<ErrorType>((++it)->u.unsignedValue);
-        printLocationAndOp(out, location, it, "throw_static_error");
-        out.printf("%s, ", registerName(r0).data());
-        out.print(k1);
-        break;
-    }
-    case op_debug: {
-        int debugHookType = (++it)->u.operand;
-        int hasBreakpointFlag = (++it)->u.operand;
-        printLocationAndOp(out, location, it, "debug");
-        out.printf("%s, %d", debugHookName(debugHookType), hasBreakpointFlag);
-        break;
-    }
-    case op_identity_with_profile: {
-        int r0 = (++it)->u.operand;
-        ++it; // Profile top half
-        ++it; // Profile bottom half
-        printLocationAndOp(out, location, it, "identity_with_profile");
-        out.printf("%s", registerName(r0).data());
-        break;
-    }
-    case op_unreachable: {
-        printLocationAndOp(out, location, it, "unreachable");
-        break;
-    }
-    case op_end: {
-        int r0 = (++it)->u.operand;
-        printLocationOpAndRegisterOperand(out, location, it, "end", r0);
-        break;
-    }
-    case op_resolve_scope_for_hoisting_func_decl_in_eval: {
-        int r0 = (++it)->u.operand;
-        int scope = (++it)->u.operand;
-        int id0 = (++it)->u.operand;
-        printLocationAndOp(out, location, it, "resolve_scope_for_hoisting_func_decl_in_eval");
-        out.printf("%s, %s, %s", registerName(r0).data(), registerName(scope).data(), idName(id0, identifier(id0)).data());
-        break;
-    }
-    case op_resolve_scope: {
-        int r0 = (++it)->u.operand;
-        int scope = (++it)->u.operand;
-        int id0 = (++it)->u.operand;
-        ResolveType resolveType = static_cast<ResolveType>((++it)->u.operand);
-        int depth = (++it)->u.operand;
-        void* pointer = getPointer(*(++it));
-        printLocationAndOp(out, location, it, "resolve_scope");
-        out.printf("%s, %s, %s, <%s>, %d, %p", registerName(r0).data(), registerName(scope).data(), idName(id0, identifier(id0)).data(), resolveTypeName(resolveType), depth, pointer);
-        break;
-    }
-    case op_get_from_scope: {
-        int r0 = (++it)->u.operand;
-        int r1 = (++it)->u.operand;
-        int id0 = (++it)->u.operand;
-        GetPutInfo getPutInfo = GetPutInfo((++it)->u.operand);
-        ++it; // Structure
-        int operand = (++it)->u.operand; // Operand
-        printLocationAndOp(out, location, it, "get_from_scope");
-        out.print(registerName(r0), ", ", registerName(r1));
-        if (static_cast<unsigned>(id0) == UINT_MAX)
-            out.print(", anonymous");
-        else
-            out.print(", ", idName(id0, identifier(id0)));
-        out.print(", ", getPutInfo.operand(), "<", resolveModeName(getPutInfo.resolveMode()), "|", resolveTypeName(getPutInfo.resolveType()), "|", initializationModeName(getPutInfo.initializationMode()), ">, ", operand);
-        dumpValueProfiling(out, it, hasPrintedProfiling);
-        break;
-    }
-    case op_put_to_scope: {
-        int r0 = (++it)->u.operand;
-        int id0 = (++it)->u.operand;
-        int r1 = (++it)->u.operand;
-        GetPutInfo getPutInfo = GetPutInfo((++it)->u.operand);
-        ++it; // Structure
-        int operand = (++it)->u.operand; // Operand
-        printLocationAndOp(out, location, it, "put_to_scope");
-        out.print(registerName(r0));
-        if (static_cast<unsigned>(id0) == UINT_MAX)
-            out.print(", anonymous");
-        else
-            out.print(", ", idName(id0, identifier(id0)));
-        out.print(", ", registerName(r1), ", ", getPutInfo.operand(), "<", resolveModeName(getPutInfo.resolveMode()), "|", resolveTypeName(getPutInfo.resolveType()), "|", initializationModeName(getPutInfo.initializationMode()), ">, <structure>, ", operand);
-        break;
-    }
-    case op_get_from_arguments: {
-        int r0 = (++it)->u.operand;
-        int r1 = (++it)->u.operand;
-        int offset = (++it)->u.operand;
-        printLocationAndOp(out, location, it, "get_from_arguments");
-        out.printf("%s, %s, %d", registerName(r0).data(), registerName(r1).data(), offset);
-        dumpValueProfiling(out, it, hasPrintedProfiling);
-        break;
-    }
-    case op_put_to_arguments: {
-        int r0 = (++it)->u.operand;
-        int offset = (++it)->u.operand;
-        int r1 = (++it)->u.operand;
-        printLocationAndOp(out, location, it, "put_to_arguments");
-        out.printf("%s, %d, %s", registerName(r0).data(), offset, registerName(r1).data());
-        break;
-    }
-    case op_yield: {
-        int r0 = (++it)->u.operand;
-        unsigned yieldPoint = (++it)->u.unsignedValue;
-        int r1 = (++it)->u.operand;
-        printLocationAndOp(out, location, it, "yield");
-        out.printf("%s, %u, %s", registerName(r0).data(), yieldPoint, registerName(r1).data());
-        break;
-    }
-    default:
-        RELEASE_ASSERT_NOT_REACHED();
-    }
-    dumpProfilesForBytecodeOffset(out, location, hasPrintedProfiling);
-    out.print("\n");
-}
-
-template<class Block>
-void BytecodeDumper<Block>::dumpBytecode(Block* block, PrintStream& out, const typename Block::Instruction* begin, const typename Block::Instruction*& it, const ICStatusMap& statusMap)
-{
-    BytecodeDumper dumper(block, begin);
-    dumper.dumpBytecode(out, begin, it, statusMap);
-}
-
-template<class Block>
-void BytecodeDumper<Block>::dumpIdentifiers(PrintStream& out)
+void BytecodeDumper<Block>::dumpIdentifiers()
 {
     if (size_t count = block()->numberOfIdentifiers()) {
-        out.printf("\nIdentifiers:\n");
+        m_out.printf("\nIdentifiers:\n");
         size_t i = 0;
         do {
-            out.printf("  id%u = %s\n", static_cast<unsigned>(i), identifier(i).string().utf8().data());
+            m_out.printf("  id%u = %s\n", static_cast<unsigned>(i), identifier(i).string().utf8().data());
             ++i;
         } while (i != count);
     }
 }
 
 template<class Block>
-void BytecodeDumper<Block>::dumpConstants(PrintStream& out)
+void BytecodeDumper<Block>::dumpConstants()
 {
     if (!block()->constantRegisters().isEmpty()) {
-        out.printf("\nConstants:\n");
+        m_out.printf("\nConstants:\n");
         size_t i = 0;
         for (const auto& constant : block()->constantRegisters()) {
             const char* sourceCodeRepresentationDescription = nullptr;
@@ -1804,94 +128,102 @@ void BytecodeDumper<Block>::dumpConstants(PrintStream& out)
                 sourceCodeRepresentationDescription = "";
                 break;
             }
-            out.printf("   k%u = %s%s\n", static_cast<unsigned>(i), toCString(constant.get()).data(), sourceCodeRepresentationDescription);
+            m_out.printf("   k%u = %s%s\n", static_cast<unsigned>(i), toCString(constant.get()).data(), sourceCodeRepresentationDescription);
             ++i;
         }
     }
 }
 
 template<class Block>
-void BytecodeDumper<Block>::dumpExceptionHandlers(PrintStream& out)
+void BytecodeDumper<Block>::dumpExceptionHandlers()
 {
     if (unsigned count = block()->numberOfExceptionHandlers()) {
-        out.printf("\nException Handlers:\n");
+        m_out.printf("\nException Handlers:\n");
         unsigned i = 0;
         do {
             const auto& handler = block()->exceptionHandler(i);
-            out.printf("\t %d: { start: [%4d] end: [%4d] target: [%4d] } %s\n", i + 1, handler.start, handler.end, handler.target, handler.typeName());
+            m_out.printf("\t %d: { start: [%4d] end: [%4d] target: [%4d] } %s\n", i + 1, handler.start, handler.end, handler.target, handler.typeName());
             ++i;
         } while (i < count);
     }
 }
 
 template<class Block>
-void BytecodeDumper<Block>::dumpSwitchJumpTables(PrintStream& out)
+void BytecodeDumper<Block>::dumpSwitchJumpTables()
 {
     if (unsigned count = block()->numberOfSwitchJumpTables()) {
-        out.printf("Switch Jump Tables:\n");
+        m_out.printf("Switch Jump Tables:\n");
         unsigned i = 0;
         do {
-            out.printf("  %1d = {\n", i);
+            m_out.printf("  %1d = {\n", i);
             const auto& switchJumpTable = block()->switchJumpTable(i);
             int entry = 0;
             auto end = switchJumpTable.branchOffsets.end();
             for (auto iter = switchJumpTable.branchOffsets.begin(); iter != end; ++iter, ++entry) {
                 if (!*iter)
                     continue;
-                out.printf("\t\t%4d => %04d\n", entry + switchJumpTable.min, *iter);
+                m_out.printf("\t\t%4d => %04d\n", entry + switchJumpTable.min, *iter);
             }
-            out.printf("      }\n");
+            m_out.printf("      }\n");
             ++i;
         } while (i < count);
     }
 }
 
 template<class Block>
-void BytecodeDumper<Block>::dumpStringSwitchJumpTables(PrintStream& out)
+void BytecodeDumper<Block>::dumpStringSwitchJumpTables()
 {
     if (unsigned count = block()->numberOfStringSwitchJumpTables()) {
-        out.printf("\nString Switch Jump Tables:\n");
+        m_out.printf("\nString Switch Jump Tables:\n");
         unsigned i = 0;
         do {
-            out.printf("  %1d = {\n", i);
+            m_out.printf("  %1d = {\n", i);
             const auto& stringSwitchJumpTable = block()->stringSwitchJumpTable(i);
             auto end = stringSwitchJumpTable.offsetTable.end();
             for (auto iter = stringSwitchJumpTable.offsetTable.begin(); iter != end; ++iter)
-                out.printf("\t\t\"%s\" => %04d\n", iter->key->utf8().data(), iter->value.branchOffset);
-            out.printf("      }\n");
+                m_out.printf("\t\t\"%s\" => %04d\n", iter->key->utf8().data(), iter->value.branchOffset);
+            m_out.printf("      }\n");
             ++i;
         } while (i < count);
     }
 }
 
 template<class Block>
-void BytecodeDumper<Block>::dumpBlock(Block* block, const typename Block::UnpackedInstructions& instructions, PrintStream& out, const ICStatusMap& statusMap)
+void BytecodeDumper<Block>::dumpBlock(Block* block, const InstructionStream& instructions, PrintStream& out, const ICStatusMap& statusMap)
 {
     size_t instructionCount = 0;
-
-    for (size_t i = 0; i < instructions.size(); i += opcodeLengths[Interpreter::getOpcodeID(instructions[i])])
+    size_t wideInstructionCount = 0;
+    size_t instructionWithMetadataCount = 0;
+
+    for (const auto& instruction : instructions) {
+        if (instruction->isWide())
+            ++wideInstructionCount;
+        if (instruction->opcodeID() < NUMBER_OF_BYTECODE_WITH_METADATA)
+            ++instructionWithMetadataCount;
         ++instructionCount;
+    }
 
     out.print(*block);
     out.printf(
-        ": %lu m_instructions; %lu bytes; %d parameter(s); %d callee register(s); %d variable(s)",
-        static_cast<unsigned long>(instructions.size()),
-        static_cast<unsigned long>(instructions.size() * sizeof(Instruction)),
+        ": %lu instructions (%lu wide instructions, %lu instructions with metadata); %lu bytes (%lu metadata bytes); %d parameter(s); %d callee register(s); %d variable(s)",
+        static_cast<unsigned long>(instructionCount),
+        static_cast<unsigned long>(wideInstructionCount),
+        static_cast<unsigned long>(instructionWithMetadataCount),
+        static_cast<unsigned long>(instructions.sizeInBytes() + block->metadataSizeInBytes()),
+        static_cast<unsigned long>(block->metadataSizeInBytes()),
         block->numParameters(), block->numCalleeLocals(), block->numVars());
     out.print("; scope at ", block->scopeRegister());
     out.printf("\n");
 
-    const auto* begin = instructions.begin();
-    const auto* end = instructions.end();
-    BytecodeDumper<Block> dumper(block, begin);
-    for (const auto* it = begin; it != end; ++it)
-        dumper.dumpBytecode(out, begin, it, statusMap);
+    BytecodeDumper<Block> dumper(block, out);
+    for (const auto& it : instructions)
+        dumper.dumpBytecode(it, statusMap);
 
-    dumper.dumpIdentifiers(out);
-    dumper.dumpConstants(out);
-    dumper.dumpExceptionHandlers(out);
-    dumper.dumpSwitchJumpTables(out);
-    dumper.dumpStringSwitchJumpTables(out);
+    dumper.dumpIdentifiers();
+    dumper.dumpConstants();
+    dumper.dumpExceptionHandlers();
+    dumper.dumpSwitchJumpTables();
+    dumper.dumpStringSwitchJumpTables();
 
     out.printf("\n");
 }
index d811a8d..a1503ba 100644 (file)
@@ -28,6 +28,7 @@
 
 #include "CallLinkInfo.h"
 #include "ICStatusMap.h"
+#include "InstructionStream.h"
 #include "StructureStubInfo.h"
 
 namespace JSC {
@@ -37,20 +38,31 @@ struct Instruction;
 template<class Block>
 class BytecodeDumper {
 public:
-    typedef typename Block::Instruction Instruction;
+    static void dumpBytecode(Block*, PrintStream& out, const InstructionStream::Ref& it, const ICStatusMap& = ICStatusMap());
+    static void dumpBlock(Block*, const InstructionStream&, PrintStream& out, const ICStatusMap& = ICStatusMap());
 
-    static void dumpBytecode(Block*, PrintStream& out, const Instruction* begin, const Instruction*& it, const ICStatusMap& statusMap = ICStatusMap());
-    static void dumpBlock(Block*, const typename Block::UnpackedInstructions&, PrintStream& out, const ICStatusMap& statusMap = ICStatusMap());
+    void printLocationAndOp(InstructionStream::Offset location, const char* op);
+
+    template<typename T>
+    void dumpOperand(T operand, bool isFirst = false)
+    {
+        if (!isFirst)
+            m_out.print(", ");
+        dumpValue(operand);
+    }
+
+    void dumpValue(VirtualRegister reg) { m_out.printf("%s", registerName(reg.offset()).data()); }
+    template<typename T>
+    void dumpValue(T v) { m_out.print(v); }
 
 private:
-    BytecodeDumper(Block* block, const Instruction* instructionsBegin)
+    BytecodeDumper(Block* block, PrintStream& out)
         : m_block(block)
-        , m_instructionsBegin(instructionsBegin)
+        , m_out(out)
     {
     }
 
     Block* block() const { return m_block; }
-    const Instruction* instructionsBegin() const { return m_instructionsBegin; }
 
     ALWAYS_INLINE VM* vm() const;
 
@@ -59,38 +71,16 @@ private:
 
     const Identifier& identifier(int index) const;
 
-    void dumpIdentifiers(PrintStream& out);
-    void dumpConstants(PrintStream& out);
-    void dumpExceptionHandlers(PrintStream& out);
-    void dumpSwitchJumpTables(PrintStream& out);
-    void dumpStringSwitchJumpTables(PrintStream& out);
-
-    void printUnaryOp(PrintStream& out, int location, const Instruction*& it, const char* op);
-    void printBinaryOp(PrintStream& out, int location, const Instruction*& it, const char* op);
-    void printConditionalJump(PrintStream& out, const Instruction*, const Instruction*& it, int location, const char* op);
-    void printCompareJump(PrintStream& out, const Instruction*, const Instruction*& it, int location, const char* op);
-    void printGetByIdOp(PrintStream& out, int location, const Instruction*& it);
-    void printGetByIdCacheStatus(PrintStream& out, int location, const ICStatusMap&);
-    void printPutByIdCacheStatus(PrintStream& out, int location, const ICStatusMap&);
-    void printInByIdCacheStatus(PrintStream& out, int location, const ICStatusMap&);
-    enum CacheDumpMode { DumpCaches, DontDumpCaches };
-    void printCallOp(PrintStream& out, int location, const Instruction*& it, const char* op, CacheDumpMode, bool& hasPrintedProfiling, const ICStatusMap&);
-    void printPutByIdOp(PrintStream& out, int location, const Instruction*& it, const char* op);
-    void printLocationOpAndRegisterOperand(PrintStream& out, int location, const Instruction*& it, const char* op, int operand);
-    void dumpBytecode(PrintStream& out, const Instruction* begin, const Instruction*& it, const ICStatusMap&);
-
-    void dumpValueProfiling(PrintStream&, const Instruction*&, bool& hasPrintedProfiling);
-    void dumpArrayProfiling(PrintStream&, const Instruction*&, bool& hasPrintedProfiling);
-    void dumpProfilesForBytecodeOffset(PrintStream&, unsigned location, bool& hasPrintedProfiling);
-
-    void* actualPointerFor(Special::Pointer) const;
-
-#if ENABLE(JIT)
-    void dumpCallLinkStatus(PrintStream&, unsigned location, const ICStatusMap&);
-#endif
+    void dumpIdentifiers();
+    void dumpConstants();
+    void dumpExceptionHandlers();
+    void dumpSwitchJumpTables();
+    void dumpStringSwitchJumpTables();
+
+    void dumpBytecode(const InstructionStream::Ref& it, const ICStatusMap&);
 
     Block* m_block;
-    const Instruction* m_instructionsBegin;
+    PrintStream& m_out;
 };
 
 }
index e91b5b5..cbd40e3 100644 (file)
@@ -30,6 +30,7 @@
 #include "BytecodeDumper.h"
 #include "BytecodeLivenessAnalysisInlines.h"
 #include "BytecodeRewriter.h"
+#include "BytecodeStructs.h"
 #include "BytecodeUseDef.h"
 #include "IdentifierInlines.h"
 #include "InterpreterInlines.h"
 #include "JSGeneratorFunction.h"
 #include "StrongInlines.h"
 #include "UnlinkedCodeBlock.h"
+#include "UnlinkedMetadataTableInlines.h"
 #include <wtf/Optional.h>
 
 namespace JSC {
 
 struct YieldData {
-    size_t point { 0 };
-    int argument { 0 };
+    InstructionStream::Offset point { 0 };
+    VirtualRegister argument { 0 };
     FastBitVector liveness;
 };
 
@@ -52,29 +54,31 @@ class BytecodeGeneratorification {
 public:
     typedef Vector<YieldData> Yields;
 
-    BytecodeGeneratorification(UnlinkedCodeBlock* codeBlock, UnlinkedCodeBlock::UnpackedInstructions& instructions, SymbolTable* generatorFrameSymbolTable, int generatorFrameSymbolTableIndex)
-        : m_codeBlock(codeBlock)
+    BytecodeGeneratorification(BytecodeGenerator& bytecodeGenerator, UnlinkedCodeBlock* codeBlock, InstructionStreamWriter& instructions, SymbolTable* generatorFrameSymbolTable, int generatorFrameSymbolTableIndex)
+        : m_bytecodeGenerator(bytecodeGenerator)
+        , m_codeBlock(codeBlock)
         , m_instructions(instructions)
         , m_graph(m_codeBlock, m_instructions)
         , m_generatorFrameSymbolTable(*codeBlock->vm(), generatorFrameSymbolTable)
         , m_generatorFrameSymbolTableIndex(generatorFrameSymbolTableIndex)
     {
         for (BytecodeBasicBlock* block : m_graph) {
-            for (unsigned bytecodeOffset : block->offsets()) {
-                const UnlinkedInstruction* pc = &instructions[bytecodeOffset];
-                switch (pc->u.opcode) {
+            for (const auto offset : block->offsets()) {
+                const auto instruction = m_instructions.at(offset);
+                switch (instruction->opcodeID()) {
                 case op_enter: {
-                    m_enterPoint = bytecodeOffset;
+                    m_enterPoint = instruction.offset();
                     break;
                 }
 
                 case op_yield: {
-                    unsigned liveCalleeLocalsIndex = pc[2].u.unsignedValue;
+                    auto bytecode = instruction->as<OpYield>();
+                    unsigned liveCalleeLocalsIndex = bytecode.yieldPoint;
                     if (liveCalleeLocalsIndex >= m_yields.size())
                         m_yields.resize(liveCalleeLocalsIndex + 1);
                     YieldData& data = m_yields[liveCalleeLocalsIndex];
-                    data.point = bytecodeOffset;
-                    data.argument = pc[3].u.operand;
+                    data.point = instruction.offset();
+                    data.argument = bytecode.argument;
                     break;
                 }
 
@@ -105,9 +109,14 @@ public:
         return m_yields;
     }
 
-    unsigned enterPoint() const
+    InstructionStream::Ref enterPoint() const
     {
-        return m_enterPoint;
+        return m_instructions.at(m_enterPoint);
+    }
+
+    const InstructionStream& instructions() const
+    {
+        return m_instructions;
     }
 
 private:
@@ -138,9 +147,10 @@ private:
         return storage;
     }
 
-    unsigned m_enterPoint { 0 };
+    BytecodeGenerator& m_bytecodeGenerator;
+    InstructionStream::Offset m_enterPoint;
     UnlinkedCodeBlock* m_codeBlock;
-    UnlinkedCodeBlock::UnpackedInstructions& m_instructions;
+    InstructionStreamWriter& m_instructions;
     BytecodeGraph m_graph;
     Vector<std::optional<Storage>> m_storages;
     Yields m_yields;
@@ -155,7 +165,7 @@ public:
     {
     }
 
-    void run(UnlinkedCodeBlock* codeBlock, UnlinkedCodeBlock::UnpackedInstructions& instructions)
+    void run(UnlinkedCodeBlock* codeBlock, InstructionStreamWriter& instructions)
     {
         // Perform modified liveness analysis to determine which locals are live at the merge points.
         // This produces the conservative results for the question, "which variables should be saved and resumed?".
@@ -163,7 +173,7 @@ public:
         runLivenessFixpoint(codeBlock, instructions, m_generatorification.graph());
 
         for (YieldData& data : m_generatorification.yields())
-            data.liveness = getLivenessInfoAtBytecodeOffset(codeBlock, instructions, m_generatorification.graph(), data.point + opcodeLength(op_yield));
+            data.liveness = getLivenessInfoAtBytecodeOffset(codeBlock, instructions, m_generatorification.graph(), m_generatorification.instructions().at(data.point).next().offset());
     }
 
 private:
@@ -179,85 +189,80 @@ void BytecodeGeneratorification::run()
         pass.run(m_codeBlock, m_instructions);
     }
 
-    BytecodeRewriter rewriter(m_graph, m_codeBlock, m_instructions);
+    BytecodeRewriter rewriter(m_bytecodeGenerator, m_graph, m_codeBlock, m_instructions);
 
     // Setup the global switch for the generator.
     {
-        unsigned nextToEnterPoint = enterPoint() + opcodeLength(op_enter);
+        auto nextToEnterPoint = enterPoint().next();
         unsigned switchTableIndex = m_codeBlock->numberOfSwitchJumpTables();
         VirtualRegister state = virtualRegisterForArgument(static_cast<int32_t>(JSGeneratorFunction::GeneratorArgument::State));
         auto& jumpTable = m_codeBlock->addSwitchJumpTable();
         jumpTable.min = 0;
         jumpTable.branchOffsets.resize(m_yields.size() + 1);
         jumpTable.branchOffsets.fill(0);
-        jumpTable.add(0, nextToEnterPoint);
+        jumpTable.add(0, nextToEnterPoint.offset());
         for (unsigned i = 0; i < m_yields.size(); ++i)
             jumpTable.add(i + 1, m_yields[i].point);
 
         rewriter.insertFragmentBefore(nextToEnterPoint, [&](BytecodeRewriter::Fragment& fragment) {
-            fragment.appendInstruction(op_switch_imm, switchTableIndex, nextToEnterPoint, state.offset());
+            fragment.appendInstruction<OpSwitchImm>(switchTableIndex, nextToEnterPoint.offset(), state);
         });
     }
 
     for (const YieldData& data : m_yields) {
         VirtualRegister scope = virtualRegisterForArgument(static_cast<int32_t>(JSGeneratorFunction::GeneratorArgument::Frame));
 
+        auto instruction = m_instructions.at(data.point);
         // Emit save sequence.
-        rewriter.insertFragmentBefore(data.point, [&](BytecodeRewriter::Fragment& fragment) {
+        rewriter.insertFragmentBefore(instruction, [&](BytecodeRewriter::Fragment& fragment) {
             data.liveness.forEachSetBit([&](size_t index) {
                 VirtualRegister operand = virtualRegisterForLocal(index);
                 Storage storage = storageForGeneratorLocal(index);
 
-                fragment.appendInstruction(
-                    op_put_to_scope,
-                    scope.offset(), // scope
+                fragment.appendInstruction<OpPutToScope>(
+                    scope, // scope
                     storage.identifierIndex, // identifier
-                    operand.offset(), // value
-                    GetPutInfo(DoNotThrowIfNotFound, LocalClosureVar, InitializationMode::NotInitialization).operand(), // info
+                    operand, // value
+                    GetPutInfo(DoNotThrowIfNotFound, LocalClosureVar, InitializationMode::NotInitialization), // info
                     m_generatorFrameSymbolTableIndex, // symbol table constant index
                     storage.scopeOffset.offset() // scope offset
                 );
             });
 
             // Insert op_ret just after save sequence.
-            fragment.appendInstruction(op_ret, data.argument);
+            fragment.appendInstruction<OpRet>(data.argument);
         });
 
         // Emit resume sequence.
-        rewriter.insertFragmentAfter(data.point, [&](BytecodeRewriter::Fragment& fragment) {
+        rewriter.insertFragmentAfter(instruction, [&](BytecodeRewriter::Fragment& fragment) {
             data.liveness.forEachSetBit([&](size_t index) {
                 VirtualRegister operand = virtualRegisterForLocal(index);
                 Storage storage = storageForGeneratorLocal(index);
 
-                UnlinkedValueProfile profile = m_codeBlock->vm()->canUseJIT()
-                    ? m_codeBlock->addValueProfile()
-                    : static_cast<UnlinkedValueProfile>(-1);
-                fragment.appendInstruction(
-                    op_get_from_scope,
-                    operand.offset(), // dst
-                    scope.offset(), // scope
+                fragment.appendInstruction<OpGetFromScope>(
+                    operand, // dst
+                    scope, // scope
                     storage.identifierIndex, // identifier
-                    GetPutInfo(DoNotThrowIfNotFound, LocalClosureVar, InitializationMode::NotInitialization).operand(), // info
+                    GetPutInfo(DoNotThrowIfNotFound, LocalClosureVar, InitializationMode::NotInitialization), // info
                     0, // local scope depth
-                    storage.scopeOffset.offset(), // scope offset
-                    profile // profile
+                    storage.scopeOffset.offset() // scope offset
                 );
             });
         });
 
         // Clip the unnecessary bytecodes.
-        rewriter.removeBytecode(data.point);
+        rewriter.removeBytecode(instruction);
     }
 
     rewriter.execute();
 }
 
-void performGeneratorification(UnlinkedCodeBlock* codeBlock, UnlinkedCodeBlock::UnpackedInstructions& instructions, SymbolTable* generatorFrameSymbolTable, int generatorFrameSymbolTableIndex)
+void performGeneratorification(BytecodeGenerator& bytecodeGenerator, UnlinkedCodeBlock* codeBlock, InstructionStreamWriter& instructions, SymbolTable* generatorFrameSymbolTable, int generatorFrameSymbolTableIndex)
 {
     if (Options::dumpBytecodesBeforeGeneratorification())
         BytecodeDumper<UnlinkedCodeBlock>::dumpBlock(codeBlock, instructions, WTF::dataFile());
 
-    BytecodeGeneratorification pass(codeBlock, instructions, generatorFrameSymbolTable, generatorFrameSymbolTableIndex);
+    BytecodeGeneratorification pass(bytecodeGenerator, codeBlock, instructions, generatorFrameSymbolTable, generatorFrameSymbolTableIndex);
     pass.run();
 }
 
index c7b6137..01f096e 100644 (file)
 
 #pragma once
 
-#include "UnlinkedCodeBlock.h"
-
 namespace JSC {
 
+class BytecodeGenerator;
+class InstructionStreamWriter;
+class SymbolTable;
+class UnlinkedCodeBlock;
 class SymbolTable;
 
-void performGeneratorification(UnlinkedCodeBlock*, UnlinkedCodeBlock::UnpackedInstructions&, SymbolTable* generatorFrameSymbolTable, int generatorFrameSymbolTableIndex);
+void performGeneratorification(BytecodeGenerator&, UnlinkedCodeBlock*, InstructionStreamWriter&, SymbolTable* generatorFrameSymbolTable, int generatorFrameSymbolTableIndex);
 
 } // namespace JSC
index c204b41..ee2da18 100644 (file)
@@ -44,20 +44,20 @@ public:
     typedef WTF::IndexedContainerIterator<BytecodeGraph> iterator;
 
     template <typename CodeBlockType>
-    inline BytecodeGraph(CodeBlockType*, typename CodeBlockType::UnpackedInstructions&);
+    inline BytecodeGraph(CodeBlockType*, const InstructionStream&);
 
     WTF::IteratorRange<BasicBlocksVector::reverse_iterator> basicBlocksInReverseOrder()
     {
         return WTF::makeIteratorRange(m_basicBlocks.rbegin(), m_basicBlocks.rend());
     }
 
-    static bool blockContainsBytecodeOffset(BytecodeBasicBlock* block, unsigned bytecodeOffset)
+    static bool blockContainsBytecodeOffset(BytecodeBasicBlock* block, InstructionStream::Offset bytecodeOffset)
     {
         unsigned leaderOffset = block->leaderOffset();