Unreviewed, rolling out r120172.
http://trac.webkit.org/changeset/120172
https://bugs.webkit.org/show_bug.cgi?id=88976
The patch causes compilation failures on Gtk, Qt and Apple Win
bots (Requested by zdobersek on #webkit).
Patch by Sheriff Bot <webkit.review.bot@gmail.com> on 2012-06-13
Source/JavaScriptCore:
* CMakeLists.txt:
* GNUmakefile.list.am:
* JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.def:
* JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj:
* JavaScriptCore.xcodeproj/project.pbxproj:
* Target.pri:
* assembler/ARMv7Assembler.h:
(JSC::ARMv7Assembler::nop):
(JSC::ARMv7Assembler::label):
(JSC::ARMv7Assembler::readPointer):
(ARMv7Assembler):
* assembler/AbstractMacroAssembler.h:
(JSC):
(AbstractMacroAssembler):
(Label):
* assembler/AssemblerBuffer.h:
* assembler/MacroAssemblerARM.h:
* assembler/MacroAssemblerARMv7.h:
(JSC::MacroAssemblerARMv7::nop):
(JSC::MacroAssemblerARMv7::jump):
(JSC::MacroAssemblerARMv7::makeBranch):
* assembler/MacroAssemblerMIPS.h:
* assembler/MacroAssemblerSH4.h:
* assembler/MacroAssemblerX86.h:
(MacroAssemblerX86):
(JSC::MacroAssemblerX86::moveWithPatch):
* assembler/MacroAssemblerX86Common.h:
* assembler/MacroAssemblerX86_64.h:
(JSC::MacroAssemblerX86_64::branchTest8):
* assembler/X86Assembler.h:
(JSC::X86Assembler::cmpb_im):
(JSC::X86Assembler::codeSize):
(JSC::X86Assembler::label):
(JSC::X86Assembler::X86InstructionFormatter::memoryModRM):
* bytecode/CodeBlock.cpp:
(JSC::CodeBlock::dump):
* bytecode/CodeBlock.h:
(JSC::CodeBlock::appendOSRExit):
(JSC::CodeBlock::appendSpeculationRecovery):
(DFGData):
* bytecode/DFGExitProfile.h:
(JSC::DFG::exitKindToString):
(JSC::DFG::exitKindIsCountable):
* bytecode/Instruction.h:
* bytecode/Opcode.h:
(JSC):
(JSC::padOpcodeName):
* bytecode/Watchpoint.cpp: Removed.
* bytecode/Watchpoint.h: Removed.
* bytecompiler/BytecodeGenerator.cpp:
(JSC::ResolveResult::checkValidity):
(JSC::BytecodeGenerator::addGlobalVar):
(JSC::BytecodeGenerator::BytecodeGenerator):
(JSC::BytecodeGenerator::resolve):
(JSC::BytecodeGenerator::emitResolve):
(JSC::BytecodeGenerator::emitResolveWithBase):
(JSC::BytecodeGenerator::emitResolveWithThis):
(JSC::BytecodeGenerator::emitGetStaticVar):
(JSC::BytecodeGenerator::emitPutStaticVar):
* bytecompiler/BytecodeGenerator.h:
(BytecodeGenerator):
* bytecompiler/NodesCodegen.cpp:
(JSC::FunctionCallResolveNode::emitBytecode):
(JSC::PostfixResolveNode::emitBytecode):
(JSC::PrefixResolveNode::emitBytecode):
(JSC::ReadModifyResolveNode::emitBytecode):
(JSC::AssignResolveNode::emitBytecode):
(JSC::ConstDeclNode::emitCodeSingle):
* dfg/DFGAbstractState.cpp:
(JSC::DFG::AbstractState::execute):
(JSC::DFG::AbstractState::clobberStructures):
* dfg/DFGAbstractState.h:
(AbstractState):
* dfg/DFGByteCodeParser.cpp:
(JSC::DFG::ByteCodeParser::handleInlining):
(JSC::DFG::ByteCodeParser::parseBlock):
* dfg/DFGCCallHelpers.h:
(JSC::DFG::CCallHelpers::setupArguments):
* dfg/DFGCSEPhase.cpp:
(JSC::DFG::CSEPhase::globalVarStoreElimination):
(JSC::DFG::CSEPhase::performNodeCSE):
* dfg/DFGCapabilities.h:
(JSC::DFG::canCompileOpcode):
* dfg/DFGConstantFoldingPhase.cpp:
(JSC::DFG::ConstantFoldingPhase::run):
* dfg/DFGCorrectableJumpPoint.h:
* dfg/DFGJITCompiler.cpp:
(JSC::DFG::JITCompiler::linkOSRExits):
(JSC::DFG::JITCompiler::link):
* dfg/DFGNode.h:
(JSC::DFG::Node::hasRegisterPointer):
* dfg/DFGNodeType.h:
(DFG):
* dfg/DFGOSRExit.cpp:
(JSC::DFG::OSRExit::OSRExit):
* dfg/DFGOSRExit.h:
(OSRExit):
* dfg/DFGOperations.cpp:
* dfg/DFGOperations.h:
* dfg/DFGPredictionPropagationPhase.cpp:
(JSC::DFG::PredictionPropagationPhase::propagate):
* dfg/DFGSpeculativeJIT.h:
(JSC::DFG::SpeculativeJIT::callOperation):
(JSC::DFG::SpeculativeJIT::appendCallSetResult):
(JSC::DFG::SpeculativeJIT::speculationCheck):
* dfg/DFGSpeculativeJIT32_64.cpp:
(JSC::DFG::SpeculativeJIT::compile):
* dfg/DFGSpeculativeJIT64.cpp:
(JSC::DFG::SpeculativeJIT::compile):
* jit/JIT.cpp:
(JSC::JIT::privateCompileMainPass):
(JSC::JIT::privateCompileSlowCases):
* jit/JIT.h:
* jit/JITPropertyAccess.cpp:
* jit/JITPropertyAccess32_64.cpp:
* jit/JITStubs.cpp:
* jit/JITStubs.h:
* llint/LLIntSlowPaths.cpp:
* llint/LLIntSlowPaths.h:
(LLInt):
* llint/LowLevelInterpreter32_64.asm:
* llint/LowLevelInterpreter64.asm:
* runtime/JSObject.cpp:
(JSC::JSObject::removeDirect):
* runtime/JSObject.h:
(JSObject):
* runtime/JSSymbolTableObject.h:
(JSC::symbolTableGet):
(JSC::symbolTablePut):
(JSC::symbolTablePutWithAttributes):
* runtime/SymbolTable.cpp: Removed.
* runtime/SymbolTable.h:
(JSC):
(JSC::SymbolTableEntry::isNull):
(JSC::SymbolTableEntry::getIndex):
(SymbolTableEntry):
(JSC::SymbolTableEntry::getAttributes):
(JSC::SymbolTableEntry::isReadOnly):
(JSC::SymbolTableEntry::pack):
(JSC::SymbolTableEntry::isValidIndex):
Source/WTF:
* wtf/SegmentedVector.h:
(WTF):
(SegmentedVectorIterator):
(WTF::SegmentedVectorIterator::operator=):
(WTF::SegmentedVectorIterator::SegmentedVectorIterator):
(SegmentedVector):
LayoutTests:
* fast/js/dfg-call-function-hit-watchpoint-expected.txt: Removed.
* fast/js/dfg-call-function-hit-watchpoint.html: Removed.
* fast/js/jsc-test-list:
* fast/js/script-tests/dfg-call-function-hit-watchpoint.js: Removed.
git-svn-id: http://svn.webkit.org/repository/webkit/trunk@120175 268f45cc-cd09-0410-ab3c-d52691b4dbfc
diff --git a/Source/JavaScriptCore/CMakeLists.txt b/Source/JavaScriptCore/CMakeLists.txt
index 05cd7d7..084f660 100644
--- a/Source/JavaScriptCore/CMakeLists.txt
+++ b/Source/JavaScriptCore/CMakeLists.txt
@@ -53,7 +53,6 @@
bytecode/PutByIdStatus.cpp
bytecode/SamplingTool.cpp
bytecode/StructureStubInfo.cpp
- bytecode/Watchpoint.cpp
bytecompiler/BytecodeGenerator.cpp
bytecompiler/NodesCodegen.cpp
@@ -232,7 +231,6 @@
runtime/StringRecursionChecker.cpp
runtime/Structure.cpp
runtime/StructureChain.cpp
- runtime/SymbolTable.cpp
runtime/TimeoutChecker.cpp
runtime/UString.cpp
diff --git a/Source/JavaScriptCore/ChangeLog b/Source/JavaScriptCore/ChangeLog
index 1f123c1..5e5a80b 100644
--- a/Source/JavaScriptCore/ChangeLog
+++ b/Source/JavaScriptCore/ChangeLog
@@ -1,3 +1,153 @@
+2012-06-13 Sheriff Bot <webkit.review.bot@gmail.com>
+
+ Unreviewed, rolling out r120172.
+ http://trac.webkit.org/changeset/120172
+ https://bugs.webkit.org/show_bug.cgi?id=88976
+
+ The patch causes compilation failures on Gtk, Qt and Apple Win
+ bots (Requested by zdobersek on #webkit).
+
+ * CMakeLists.txt:
+ * GNUmakefile.list.am:
+ * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.def:
+ * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj:
+ * JavaScriptCore.xcodeproj/project.pbxproj:
+ * Target.pri:
+ * assembler/ARMv7Assembler.h:
+ (JSC::ARMv7Assembler::nop):
+ (JSC::ARMv7Assembler::label):
+ (JSC::ARMv7Assembler::readPointer):
+ (ARMv7Assembler):
+ * assembler/AbstractMacroAssembler.h:
+ (JSC):
+ (AbstractMacroAssembler):
+ (Label):
+ * assembler/AssemblerBuffer.h:
+ * assembler/MacroAssemblerARM.h:
+ * assembler/MacroAssemblerARMv7.h:
+ (JSC::MacroAssemblerARMv7::nop):
+ (JSC::MacroAssemblerARMv7::jump):
+ (JSC::MacroAssemblerARMv7::makeBranch):
+ * assembler/MacroAssemblerMIPS.h:
+ * assembler/MacroAssemblerSH4.h:
+ * assembler/MacroAssemblerX86.h:
+ (MacroAssemblerX86):
+ (JSC::MacroAssemblerX86::moveWithPatch):
+ * assembler/MacroAssemblerX86Common.h:
+ * assembler/MacroAssemblerX86_64.h:
+ (JSC::MacroAssemblerX86_64::branchTest8):
+ * assembler/X86Assembler.h:
+ (JSC::X86Assembler::cmpb_im):
+ (JSC::X86Assembler::codeSize):
+ (JSC::X86Assembler::label):
+ (JSC::X86Assembler::X86InstructionFormatter::memoryModRM):
+ * bytecode/CodeBlock.cpp:
+ (JSC::CodeBlock::dump):
+ * bytecode/CodeBlock.h:
+ (JSC::CodeBlock::appendOSRExit):
+ (JSC::CodeBlock::appendSpeculationRecovery):
+ (DFGData):
+ * bytecode/DFGExitProfile.h:
+ (JSC::DFG::exitKindToString):
+ (JSC::DFG::exitKindIsCountable):
+ * bytecode/Instruction.h:
+ * bytecode/Opcode.h:
+ (JSC):
+ (JSC::padOpcodeName):
+ * bytecode/Watchpoint.cpp: Removed.
+ * bytecode/Watchpoint.h: Removed.
+ * bytecompiler/BytecodeGenerator.cpp:
+ (JSC::ResolveResult::checkValidity):
+ (JSC::BytecodeGenerator::addGlobalVar):
+ (JSC::BytecodeGenerator::BytecodeGenerator):
+ (JSC::BytecodeGenerator::resolve):
+ (JSC::BytecodeGenerator::emitResolve):
+ (JSC::BytecodeGenerator::emitResolveWithBase):
+ (JSC::BytecodeGenerator::emitResolveWithThis):
+ (JSC::BytecodeGenerator::emitGetStaticVar):
+ (JSC::BytecodeGenerator::emitPutStaticVar):
+ * bytecompiler/BytecodeGenerator.h:
+ (BytecodeGenerator):
+ * bytecompiler/NodesCodegen.cpp:
+ (JSC::FunctionCallResolveNode::emitBytecode):
+ (JSC::PostfixResolveNode::emitBytecode):
+ (JSC::PrefixResolveNode::emitBytecode):
+ (JSC::ReadModifyResolveNode::emitBytecode):
+ (JSC::AssignResolveNode::emitBytecode):
+ (JSC::ConstDeclNode::emitCodeSingle):
+ * dfg/DFGAbstractState.cpp:
+ (JSC::DFG::AbstractState::execute):
+ (JSC::DFG::AbstractState::clobberStructures):
+ * dfg/DFGAbstractState.h:
+ (AbstractState):
+ * dfg/DFGByteCodeParser.cpp:
+ (JSC::DFG::ByteCodeParser::handleInlining):
+ (JSC::DFG::ByteCodeParser::parseBlock):
+ * dfg/DFGCCallHelpers.h:
+ (JSC::DFG::CCallHelpers::setupArguments):
+ * dfg/DFGCSEPhase.cpp:
+ (JSC::DFG::CSEPhase::globalVarStoreElimination):
+ (JSC::DFG::CSEPhase::performNodeCSE):
+ * dfg/DFGCapabilities.h:
+ (JSC::DFG::canCompileOpcode):
+ * dfg/DFGConstantFoldingPhase.cpp:
+ (JSC::DFG::ConstantFoldingPhase::run):
+ * dfg/DFGCorrectableJumpPoint.h:
+ * dfg/DFGJITCompiler.cpp:
+ (JSC::DFG::JITCompiler::linkOSRExits):
+ (JSC::DFG::JITCompiler::link):
+ * dfg/DFGNode.h:
+ (JSC::DFG::Node::hasRegisterPointer):
+ * dfg/DFGNodeType.h:
+ (DFG):
+ * dfg/DFGOSRExit.cpp:
+ (JSC::DFG::OSRExit::OSRExit):
+ * dfg/DFGOSRExit.h:
+ (OSRExit):
+ * dfg/DFGOperations.cpp:
+ * dfg/DFGOperations.h:
+ * dfg/DFGPredictionPropagationPhase.cpp:
+ (JSC::DFG::PredictionPropagationPhase::propagate):
+ * dfg/DFGSpeculativeJIT.h:
+ (JSC::DFG::SpeculativeJIT::callOperation):
+ (JSC::DFG::SpeculativeJIT::appendCallSetResult):
+ (JSC::DFG::SpeculativeJIT::speculationCheck):
+ * dfg/DFGSpeculativeJIT32_64.cpp:
+ (JSC::DFG::SpeculativeJIT::compile):
+ * dfg/DFGSpeculativeJIT64.cpp:
+ (JSC::DFG::SpeculativeJIT::compile):
+ * jit/JIT.cpp:
+ (JSC::JIT::privateCompileMainPass):
+ (JSC::JIT::privateCompileSlowCases):
+ * jit/JIT.h:
+ * jit/JITPropertyAccess.cpp:
+ * jit/JITPropertyAccess32_64.cpp:
+ * jit/JITStubs.cpp:
+ * jit/JITStubs.h:
+ * llint/LLIntSlowPaths.cpp:
+ * llint/LLIntSlowPaths.h:
+ (LLInt):
+ * llint/LowLevelInterpreter32_64.asm:
+ * llint/LowLevelInterpreter64.asm:
+ * runtime/JSObject.cpp:
+ (JSC::JSObject::removeDirect):
+ * runtime/JSObject.h:
+ (JSObject):
+ * runtime/JSSymbolTableObject.h:
+ (JSC::symbolTableGet):
+ (JSC::symbolTablePut):
+ (JSC::symbolTablePutWithAttributes):
+ * runtime/SymbolTable.cpp: Removed.
+ * runtime/SymbolTable.h:
+ (JSC):
+ (JSC::SymbolTableEntry::isNull):
+ (JSC::SymbolTableEntry::getIndex):
+ (SymbolTableEntry):
+ (JSC::SymbolTableEntry::getAttributes):
+ (JSC::SymbolTableEntry::isReadOnly):
+ (JSC::SymbolTableEntry::pack):
+ (JSC::SymbolTableEntry::isValidIndex):
+
2012-06-12 Filip Pizlo <fpizlo@apple.com>
DFG should be able to set watchpoints on global variables
diff --git a/Source/JavaScriptCore/GNUmakefile.list.am b/Source/JavaScriptCore/GNUmakefile.list.am
index 83c85ed..aaf8b37 100644
--- a/Source/JavaScriptCore/GNUmakefile.list.am
+++ b/Source/JavaScriptCore/GNUmakefile.list.am
@@ -133,8 +133,6 @@
Source/JavaScriptCore/bytecode/ValueProfile.h \
Source/JavaScriptCore/bytecode/ValueRecovery.h \
Source/JavaScriptCore/bytecode/VirtualRegister.h \
- Source/JavaScriptCore/bytecode/Watchpoint.cpp \
- Source/JavaScriptCore/bytecode/Watchpoint.h \
Source/JavaScriptCore/bytecompiler/BytecodeGenerator.cpp \
Source/JavaScriptCore/bytecompiler/BytecodeGenerator.h \
Source/JavaScriptCore/bytecompiler/Label.h \
@@ -605,7 +603,6 @@
Source/JavaScriptCore/runtime/Structure.cpp \
Source/JavaScriptCore/runtime/Structure.h \
Source/JavaScriptCore/runtime/StructureTransitionTable.h \
- Source/JavaScriptCore/runtime/SymbolTable.cpp \
Source/JavaScriptCore/runtime/SymbolTable.h \
Source/JavaScriptCore/runtime/Terminator.h \
Source/JavaScriptCore/runtime/TimeoutChecker.cpp \
diff --git a/Source/JavaScriptCore/JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.def b/Source/JavaScriptCore/JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.def
index e8579ee..a2900b5 100755
--- a/Source/JavaScriptCore/JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.def
+++ b/Source/JavaScriptCore/JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.def
@@ -246,7 +246,6 @@
?name@JSFunction@JSC@@QAEABVUString@2@PAVExecState@2@@Z
?neuter@ArrayBufferView@WTF@@MAEXXZ
?newUninitialized@CString@WTF@@SA?AV12@IAAPAD@Z
- ?notifyWriteSlow@SymbolTableEntry@JSC@@AAEXXZ
?nullptr@@3Vnullptr_t@std@@A
?number@String@WTF@@SA?AV12@NII@Z
?number@UString@JSC@@SA?AV12@H@Z
diff --git a/Source/JavaScriptCore/JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj b/Source/JavaScriptCore/JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj
index 96c3159..0a3fab8 100644
--- a/Source/JavaScriptCore/JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj
+++ b/Source/JavaScriptCore/JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj
@@ -1254,10 +1254,6 @@
>
</File>
<File
- RelativePath="..\..\runtime\SymbolTable.cpp"
- >
- </File>
- <File
RelativePath="..\..\runtime\SymbolTable.h"
>
</File>
@@ -1685,14 +1681,6 @@
RelativePath="..\..\bytecode\ValueProfile.h"
>
</File>
- <File
- RelativePath="..\..\bytecode\Watchpoint.cpp"
- >
- </File>
- <File
- RelativePath="..\..\bytecode\Watchpoint.h"
- >
- </File>
</Filter>
<Filter
Name="debugger"
diff --git a/Source/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj b/Source/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj
index ea5b577..497c899 100644
--- a/Source/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj
+++ b/Source/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj
@@ -139,9 +139,6 @@
0F919D0D157EE0A2004A4E7D /* JSSymbolTableObject.h in Headers */ = {isa = PBXBuildFile; fileRef = 0F919D0A157EE09D004A4E7D /* JSSymbolTableObject.h */; settings = {ATTRIBUTES = (Private, ); }; };
0F919D10157F3329004A4E7D /* JSSegmentedVariableObject.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0F919D0E157F3327004A4E7D /* JSSegmentedVariableObject.cpp */; };
0F919D11157F332C004A4E7D /* JSSegmentedVariableObject.h in Headers */ = {isa = PBXBuildFile; fileRef = 0F919D0F157F3327004A4E7D /* JSSegmentedVariableObject.h */; settings = {ATTRIBUTES = (Private, ); }; };
- 0F919D2515853CE0004A4E7D /* Watchpoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0F919D2215853CDE004A4E7D /* Watchpoint.cpp */; };
- 0F919D2615853CE3004A4E7D /* Watchpoint.h in Headers */ = {isa = PBXBuildFile; fileRef = 0F919D2315853CDE004A4E7D /* Watchpoint.h */; settings = {ATTRIBUTES = (Private, ); }; };
- 0F919D2815856773004A4E7D /* SymbolTable.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0F919D2715856770004A4E7D /* SymbolTable.cpp */; };
0F93329D14CA7DC30085F3C6 /* CallLinkStatus.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0F93329314CA7DC10085F3C6 /* CallLinkStatus.cpp */; };
0F93329E14CA7DC50085F3C6 /* CallLinkStatus.h in Headers */ = {isa = PBXBuildFile; fileRef = 0F93329414CA7DC10085F3C6 /* CallLinkStatus.h */; settings = {ATTRIBUTES = (Private, ); }; };
0F93329F14CA7DCA0085F3C6 /* GetByIdStatus.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0F93329514CA7DC10085F3C6 /* GetByIdStatus.cpp */; };
@@ -373,10 +370,10 @@
7E4EE70F0EBB7A5B005934AA /* StructureChain.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7E4EE70E0EBB7A5B005934AA /* StructureChain.cpp */; };
7EFF00640EC05A9A00AA7C93 /* NodeInfo.h in Headers */ = {isa = PBXBuildFile; fileRef = 7EFF00630EC05A9A00AA7C93 /* NodeInfo.h */; };
840480131021A1D9008E7F01 /* JSAPIValueWrapper.h in Headers */ = {isa = PBXBuildFile; fileRef = BC0894D60FAFBA2D00001865 /* JSAPIValueWrapper.h */; settings = {ATTRIBUTES = (Private, ); }; };
- 860161E30F3A83C100F84710 /* AbstractMacroAssembler.h in Headers */ = {isa = PBXBuildFile; fileRef = 860161DF0F3A83C100F84710 /* AbstractMacroAssembler.h */; settings = {ATTRIBUTES = (Private, ); }; };
- 860161E40F3A83C100F84710 /* MacroAssemblerX86.h in Headers */ = {isa = PBXBuildFile; fileRef = 860161E00F3A83C100F84710 /* MacroAssemblerX86.h */; settings = {ATTRIBUTES = (Private, ); }; };
- 860161E50F3A83C100F84710 /* MacroAssemblerX86_64.h in Headers */ = {isa = PBXBuildFile; fileRef = 860161E10F3A83C100F84710 /* MacroAssemblerX86_64.h */; settings = {ATTRIBUTES = (Private, ); }; };
- 860161E60F3A83C100F84710 /* MacroAssemblerX86Common.h in Headers */ = {isa = PBXBuildFile; fileRef = 860161E20F3A83C100F84710 /* MacroAssemblerX86Common.h */; settings = {ATTRIBUTES = (Private, ); }; };
+ 860161E30F3A83C100F84710 /* AbstractMacroAssembler.h in Headers */ = {isa = PBXBuildFile; fileRef = 860161DF0F3A83C100F84710 /* AbstractMacroAssembler.h */; };
+ 860161E40F3A83C100F84710 /* MacroAssemblerX86.h in Headers */ = {isa = PBXBuildFile; fileRef = 860161E00F3A83C100F84710 /* MacroAssemblerX86.h */; };
+ 860161E50F3A83C100F84710 /* MacroAssemblerX86_64.h in Headers */ = {isa = PBXBuildFile; fileRef = 860161E10F3A83C100F84710 /* MacroAssemblerX86_64.h */; };
+ 860161E60F3A83C100F84710 /* MacroAssemblerX86Common.h in Headers */ = {isa = PBXBuildFile; fileRef = 860161E20F3A83C100F84710 /* MacroAssemblerX86Common.h */; };
8604F505143CE1C200B295F5 /* JSGlobalThis.h in Headers */ = {isa = PBXBuildFile; fileRef = 8604F503143CE1C100B295F5 /* JSGlobalThis.h */; settings = {ATTRIBUTES = (Private, ); }; };
860BD801148EA6F200112B2F /* Intrinsic.h in Headers */ = {isa = PBXBuildFile; fileRef = 86BF642A148DB2B5004DE36A /* Intrinsic.h */; settings = {ATTRIBUTES = (Private, ); }; };
8612E4CD152389EC00C836BE /* MatchResult.h in Headers */ = {isa = PBXBuildFile; fileRef = 8612E4CB1522918400C836BE /* MatchResult.h */; settings = {ATTRIBUTES = (Private, ); }; };
@@ -404,11 +401,11 @@
869D04AF1193B54D00803475 /* CachedTranscendentalFunction.h in Headers */ = {isa = PBXBuildFile; fileRef = 869D04AE1193B54D00803475 /* CachedTranscendentalFunction.h */; settings = {ATTRIBUTES = (Private, ); }; };
869EBCB70E8C6D4A008722CC /* ResultType.h in Headers */ = {isa = PBXBuildFile; fileRef = 869EBCB60E8C6D4A008722CC /* ResultType.h */; settings = {ATTRIBUTES = (Private, ); }; };
86A90ED00EE7D51F00AB350D /* JITArithmetic.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 86A90ECF0EE7D51F00AB350D /* JITArithmetic.cpp */; };
- 86ADD1450FDDEA980006EEC2 /* ARMv7Assembler.h in Headers */ = {isa = PBXBuildFile; fileRef = 86ADD1430FDDEA980006EEC2 /* ARMv7Assembler.h */; settings = {ATTRIBUTES = (Private, ); }; };
- 86ADD1460FDDEA980006EEC2 /* MacroAssemblerARMv7.h in Headers */ = {isa = PBXBuildFile; fileRef = 86ADD1440FDDEA980006EEC2 /* MacroAssemblerARMv7.h */; settings = {ATTRIBUTES = (Private, ); }; };
+ 86ADD1450FDDEA980006EEC2 /* ARMv7Assembler.h in Headers */ = {isa = PBXBuildFile; fileRef = 86ADD1430FDDEA980006EEC2 /* ARMv7Assembler.h */; };
+ 86ADD1460FDDEA980006EEC2 /* MacroAssemblerARMv7.h in Headers */ = {isa = PBXBuildFile; fileRef = 86ADD1440FDDEA980006EEC2 /* MacroAssemblerARMv7.h */; };
86AE64A8135E5E1C00963012 /* MacroAssemblerSH4.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 86AE64A5135E5E1C00963012 /* MacroAssemblerSH4.cpp */; };
- 86AE64A9135E5E1C00963012 /* MacroAssemblerSH4.h in Headers */ = {isa = PBXBuildFile; fileRef = 86AE64A6135E5E1C00963012 /* MacroAssemblerSH4.h */; settings = {ATTRIBUTES = (Private, ); }; };
- 86AE64AA135E5E1C00963012 /* SH4Assembler.h in Headers */ = {isa = PBXBuildFile; fileRef = 86AE64A7135E5E1C00963012 /* SH4Assembler.h */; settings = {ATTRIBUTES = (Private, ); }; };
+ 86AE64A9135E5E1C00963012 /* MacroAssemblerSH4.h in Headers */ = {isa = PBXBuildFile; fileRef = 86AE64A6135E5E1C00963012 /* MacroAssemblerSH4.h */; };
+ 86AE64AA135E5E1C00963012 /* SH4Assembler.h in Headers */ = {isa = PBXBuildFile; fileRef = 86AE64A7135E5E1C00963012 /* SH4Assembler.h */; };
86AE6C4D136A11E400963012 /* DFGFPRInfo.h in Headers */ = {isa = PBXBuildFile; fileRef = 86AE6C4B136A11E400963012 /* DFGFPRInfo.h */; };
86AE6C4E136A11E400963012 /* DFGGPRInfo.h in Headers */ = {isa = PBXBuildFile; fileRef = 86AE6C4C136A11E400963012 /* DFGGPRInfo.h */; };
86B5826714D2796C00A9C306 /* CodeProfile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 86B5822E14D2373B00A9C306 /* CodeProfile.cpp */; };
@@ -417,8 +414,8 @@
86BB09C1138E381B0056702F /* DFGRepatch.h in Headers */ = {isa = PBXBuildFile; fileRef = 86BB09BF138E381B0056702F /* DFGRepatch.h */; };
86C36EEA0EE1289D00B3DF59 /* MacroAssembler.h in Headers */ = {isa = PBXBuildFile; fileRef = 86C36EE90EE1289D00B3DF59 /* MacroAssembler.h */; settings = {ATTRIBUTES = (Private, ); }; };
86C568E011A213EE0007F7F0 /* MacroAssemblerARM.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 86C568DD11A213EE0007F7F0 /* MacroAssemblerARM.cpp */; };
- 86C568E111A213EE0007F7F0 /* MacroAssemblerMIPS.h in Headers */ = {isa = PBXBuildFile; fileRef = 86C568DE11A213EE0007F7F0 /* MacroAssemblerMIPS.h */; settings = {ATTRIBUTES = (Private, ); }; };
- 86C568E211A213EE0007F7F0 /* MIPSAssembler.h in Headers */ = {isa = PBXBuildFile; fileRef = 86C568DF11A213EE0007F7F0 /* MIPSAssembler.h */; settings = {ATTRIBUTES = (Private, ); }; };
+ 86C568E111A213EE0007F7F0 /* MacroAssemblerMIPS.h in Headers */ = {isa = PBXBuildFile; fileRef = 86C568DE11A213EE0007F7F0 /* MacroAssemblerMIPS.h */; };
+ 86C568E211A213EE0007F7F0 /* MIPSAssembler.h in Headers */ = {isa = PBXBuildFile; fileRef = 86C568DF11A213EE0007F7F0 /* MIPSAssembler.h */; };
86CA032E1038E8440028A609 /* Executable.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 86CA032D1038E8440028A609 /* Executable.cpp */; };
86CAFEE31035DDE60028A609 /* Executable.h in Headers */ = {isa = PBXBuildFile; fileRef = 86CAFEE21035DDE60028A609 /* Executable.h */; settings = {ATTRIBUTES = (Private, ); }; };
86CC85A10EE79A4700288682 /* JITInlineMethods.h in Headers */ = {isa = PBXBuildFile; fileRef = 86CC85A00EE79A4700288682 /* JITInlineMethods.h */; };
@@ -426,13 +423,13 @@
86CC85C40EE7A89400288682 /* JITPropertyAccess.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 86CC85C30EE7A89400288682 /* JITPropertyAccess.cpp */; };
86CCEFDE0F413F8900FD7F9E /* JITCode.h in Headers */ = {isa = PBXBuildFile; fileRef = 86CCEFDD0F413F8900FD7F9E /* JITCode.h */; settings = {ATTRIBUTES = (Private, ); }; };
86D3B2C310156BDE002865E7 /* ARMAssembler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 86D3B2BF10156BDE002865E7 /* ARMAssembler.cpp */; };
- 86D3B2C410156BDE002865E7 /* ARMAssembler.h in Headers */ = {isa = PBXBuildFile; fileRef = 86D3B2C010156BDE002865E7 /* ARMAssembler.h */; settings = {ATTRIBUTES = (Private, ); }; };
- 86D3B2C510156BDE002865E7 /* AssemblerBufferWithConstantPool.h in Headers */ = {isa = PBXBuildFile; fileRef = 86D3B2C110156BDE002865E7 /* AssemblerBufferWithConstantPool.h */; settings = {ATTRIBUTES = (Private, ); }; };
- 86D3B2C610156BDE002865E7 /* MacroAssemblerARM.h in Headers */ = {isa = PBXBuildFile; fileRef = 86D3B2C210156BDE002865E7 /* MacroAssemblerARM.h */; settings = {ATTRIBUTES = (Private, ); }; };
- 86D3B3C310159D7F002865E7 /* LinkBuffer.h in Headers */ = {isa = PBXBuildFile; fileRef = 86D3B3C110159D7F002865E7 /* LinkBuffer.h */; settings = {ATTRIBUTES = (Private, ); }; };
- 86D3B3C410159D7F002865E7 /* RepatchBuffer.h in Headers */ = {isa = PBXBuildFile; fileRef = 86D3B3C210159D7F002865E7 /* RepatchBuffer.h */; settings = {ATTRIBUTES = (Private, ); }; };
+ 86D3B2C410156BDE002865E7 /* ARMAssembler.h in Headers */ = {isa = PBXBuildFile; fileRef = 86D3B2C010156BDE002865E7 /* ARMAssembler.h */; };
+ 86D3B2C510156BDE002865E7 /* AssemblerBufferWithConstantPool.h in Headers */ = {isa = PBXBuildFile; fileRef = 86D3B2C110156BDE002865E7 /* AssemblerBufferWithConstantPool.h */; };
+ 86D3B2C610156BDE002865E7 /* MacroAssemblerARM.h in Headers */ = {isa = PBXBuildFile; fileRef = 86D3B2C210156BDE002865E7 /* MacroAssemblerARM.h */; };
+ 86D3B3C310159D7F002865E7 /* LinkBuffer.h in Headers */ = {isa = PBXBuildFile; fileRef = 86D3B3C110159D7F002865E7 /* LinkBuffer.h */; };
+ 86D3B3C410159D7F002865E7 /* RepatchBuffer.h in Headers */ = {isa = PBXBuildFile; fileRef = 86D3B3C210159D7F002865E7 /* RepatchBuffer.h */; };
86DB64640F95C6FC00D7D921 /* ExecutableAllocatorFixedVMPool.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 86DB64630F95C6FC00D7D921 /* ExecutableAllocatorFixedVMPool.cpp */; };
- 86E116B10FE75AC800B512BC /* CodeLocation.h in Headers */ = {isa = PBXBuildFile; fileRef = 86E116B00FE75AC800B512BC /* CodeLocation.h */; settings = {ATTRIBUTES = (Private, ); }; };
+ 86E116B10FE75AC800B512BC /* CodeLocation.h in Headers */ = {isa = PBXBuildFile; fileRef = 86E116B00FE75AC800B512BC /* CodeLocation.h */; };
86E85539111B9968001AF51E /* JSStringBuilder.h in Headers */ = {isa = PBXBuildFile; fileRef = 86E85538111B9968001AF51E /* JSStringBuilder.h */; };
86EBF2FF1560F06A008E9222 /* NameConstructor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 86EBF2F91560F036008E9222 /* NameConstructor.cpp */; };
86EBF3001560F06A008E9222 /* NameConstructor.h in Headers */ = {isa = PBXBuildFile; fileRef = 86EBF2FA1560F036008E9222 /* NameConstructor.h */; };
@@ -478,8 +475,8 @@
95F6E6950E5B5F970091E860 /* JSProfilerPrivate.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 95988BA90E477BEC00D28D4D /* JSProfilerPrivate.cpp */; };
960097A60EBABB58007A7297 /* LabelScope.h in Headers */ = {isa = PBXBuildFile; fileRef = 960097A50EBABB58007A7297 /* LabelScope.h */; };
960626960FB8EC02009798AB /* JITStubCall.h in Headers */ = {isa = PBXBuildFile; fileRef = 960626950FB8EC02009798AB /* JITStubCall.h */; };
- 9688CB150ED12B4E001D649F /* AssemblerBuffer.h in Headers */ = {isa = PBXBuildFile; fileRef = 9688CB130ED12B4E001D649F /* AssemblerBuffer.h */; settings = {ATTRIBUTES = (Private, ); }; };
- 9688CB160ED12B4E001D649F /* X86Assembler.h in Headers */ = {isa = PBXBuildFile; fileRef = 9688CB140ED12B4E001D649F /* X86Assembler.h */; settings = {ATTRIBUTES = (Private, ); }; };
+ 9688CB150ED12B4E001D649F /* AssemblerBuffer.h in Headers */ = {isa = PBXBuildFile; fileRef = 9688CB130ED12B4E001D649F /* AssemblerBuffer.h */; };
+ 9688CB160ED12B4E001D649F /* X86Assembler.h in Headers */ = {isa = PBXBuildFile; fileRef = 9688CB140ED12B4E001D649F /* X86Assembler.h */; };
969A07230ED1CE3300F1F681 /* BytecodeGenerator.h in Headers */ = {isa = PBXBuildFile; fileRef = 969A07210ED1CE3300F1F681 /* BytecodeGenerator.h */; };
969A072A0ED1CE6900F1F681 /* Label.h in Headers */ = {isa = PBXBuildFile; fileRef = 969A07270ED1CE6900F1F681 /* Label.h */; };
969A072B0ED1CE6900F1F681 /* RegisterID.h in Headers */ = {isa = PBXBuildFile; fileRef = 969A07280ED1CE6900F1F681 /* RegisterID.h */; };
@@ -839,9 +836,6 @@
0F919D0A157EE09D004A4E7D /* JSSymbolTableObject.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSSymbolTableObject.h; sourceTree = "<group>"; };
0F919D0E157F3327004A4E7D /* JSSegmentedVariableObject.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSSegmentedVariableObject.cpp; sourceTree = "<group>"; };
0F919D0F157F3327004A4E7D /* JSSegmentedVariableObject.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSSegmentedVariableObject.h; sourceTree = "<group>"; };
- 0F919D2215853CDE004A4E7D /* Watchpoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Watchpoint.cpp; sourceTree = "<group>"; };
- 0F919D2315853CDE004A4E7D /* Watchpoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Watchpoint.h; sourceTree = "<group>"; };
- 0F919D2715856770004A4E7D /* SymbolTable.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SymbolTable.cpp; sourceTree = "<group>"; };
0F93329314CA7DC10085F3C6 /* CallLinkStatus.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CallLinkStatus.cpp; sourceTree = "<group>"; };
0F93329414CA7DC10085F3C6 /* CallLinkStatus.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CallLinkStatus.h; sourceTree = "<group>"; };
0F93329514CA7DC10085F3C6 /* GetByIdStatus.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = GetByIdStatus.cpp; sourceTree = "<group>"; };
@@ -2051,7 +2045,6 @@
7E4EE70E0EBB7A5B005934AA /* StructureChain.cpp */,
7E4EE7080EBB7963005934AA /* StructureChain.h */,
BC9041470EB9250900FE26FA /* StructureTransitionTable.h */,
- 0F919D2715856770004A4E7D /* SymbolTable.cpp */,
14A396A60CD2933100B5B4FF /* SymbolTable.h */,
97F6903A1169DF7F00A6BB46 /* Terminator.h */,
14A42E3D0F4F60EE00599099 /* TimeoutChecker.cpp */,
@@ -2303,8 +2296,6 @@
0F963B3613FC6FDE0002D9B2 /* ValueProfile.h */,
0F426A451460CBAB00131F8F /* ValueRecovery.h */,
0F426A461460CBAB00131F8F /* VirtualRegister.h */,
- 0F919D2215853CDE004A4E7D /* Watchpoint.cpp */,
- 0F919D2315853CDE004A4E7D /* Watchpoint.h */,
);
path = bytecode;
sourceTree = "<group>";
@@ -2680,7 +2671,6 @@
0F16015E156198C900C2587C /* DFGArgumentsSimplificationPhase.h in Headers */,
0F919D0D157EE0A2004A4E7D /* JSSymbolTableObject.h in Headers */,
0F919D11157F332C004A4E7D /* JSSegmentedVariableObject.h in Headers */,
- 0F919D2615853CE3004A4E7D /* Watchpoint.h in Headers */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -3255,8 +3245,6 @@
C25F8BCD157544A900245B71 /* IncrementalSweeper.cpp in Sources */,
0F919D0C157EE09F004A4E7D /* JSSymbolTableObject.cpp in Sources */,
0F919D10157F3329004A4E7D /* JSSegmentedVariableObject.cpp in Sources */,
- 0F919D2515853CE0004A4E7D /* Watchpoint.cpp in Sources */,
- 0F919D2815856773004A4E7D /* SymbolTable.cpp in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
diff --git a/Source/JavaScriptCore/Target.pri b/Source/JavaScriptCore/Target.pri
index ec82012..2a21163 100644
--- a/Source/JavaScriptCore/Target.pri
+++ b/Source/JavaScriptCore/Target.pri
@@ -62,11 +62,10 @@
bytecode/MethodOfGettingAValueProfile.cpp \
bytecode/Opcode.cpp \
bytecode/PolymorphicPutByIdList.cpp \
+ bytecode/SpeculatedType.cpp \
bytecode/PutByIdStatus.cpp \
bytecode/SamplingTool.cpp \
- bytecode/SpeculatedType.cpp \
bytecode/StructureStubInfo.cpp \
- bytecode/Watchpoint.cpp \
bytecompiler/BytecodeGenerator.cpp \
bytecompiler/NodesCodegen.cpp \
heap/CopiedSpace.cpp \
@@ -237,7 +236,6 @@
runtime/StringRecursionChecker.cpp \
runtime/StructureChain.cpp \
runtime/Structure.cpp \
- runtime/SymbolTable.cpp \
runtime/TimeoutChecker.cpp \
runtime/UString.cpp \
tools/CodeProfile.cpp \
diff --git a/Source/JavaScriptCore/assembler/ARMv7Assembler.h b/Source/JavaScriptCore/assembler/ARMv7Assembler.h
index 95c812c..0cbe799 100644
--- a/Source/JavaScriptCore/assembler/ARMv7Assembler.h
+++ b/Source/JavaScriptCore/assembler/ARMv7Assembler.h
@@ -483,12 +483,6 @@
JumpLinkType m_linkType : 8;
Condition m_condition : 16;
};
-
- ARMv7Assembler()
- : m_indexOfLastWatchpoint(INT_MIN)
- , m_indexOfTailOfLastWatchpoint(INT_MIN)
- {
- }
private:
@@ -1826,25 +1820,10 @@
{
m_formatter.oneWordOp8Imm8(OP_NOP_T1, 0);
}
-
- AssemblerLabel labelForWatchpoint()
- {
- AssemblerLabel result = m_formatter.label();
- if (static_cast<int>(result.m_offset) != m_indexOfLastWatchpoint)
- result = label();
- m_indexOfLastWatchpoint = result.m_offset;
- m_indexOfTailOfLastWatchpoint = result.m_offset + maxJumpReplacementSize();
- return result;
- }
AssemblerLabel label()
{
- AssemblerLabel result = m_formatter.label();
- while (UNLIKELY(static_cast<int>(result.m_offset) < m_indexOfTailOfLastWatchpoint)) {
- nop();
- result = m_formatter.label();
- }
- return result;
+ return m_formatter.label();
}
AssemblerLabel align(int alignment)
@@ -2088,30 +2067,6 @@
{
return reinterpret_cast<void*>(readInt32(where));
}
-
- static void replaceWithJump(void* instructionStart, void* to)
- {
- ASSERT(!(bitwise_cast<uintptr_t>(instructionStart) & 1));
- ASSERT(!(bitwise_cast<uintptr_t>(to) & 1));
- uint16_t* ptr = reinterpret_cast<uint16_t*>(instructionStart) + 2;
-
- // Ensure that we're not in one of those errata-triggering thingies. If we are, then
- // prepend a nop.
- bool spansTwo4K = ((reinterpret_cast<intptr_t>(ptr) & 0xfff) == 0x002);
-
- if (spansTwo4K) {
- ptr[-2] = OP_NOP_T1;
- ptr++;
- }
-
- linkJumpT4(ptr, to);
- cacheFlush(ptr - 2, sizeof(uint16_t) * 2);
- }
-
- static ptrdiff_t maxJumpReplacementSize()
- {
- return 6;
- }
unsigned debugOffset() { return m_formatter.debugOffset(); }
@@ -2649,8 +2604,6 @@
Vector<LinkRecord> m_jumpsToLink;
Vector<int32_t> m_offsets;
- int m_indexOfLastWatchpoint;
- int m_indexOfTailOfLastWatchpoint;
};
} // namespace JSC
diff --git a/Source/JavaScriptCore/assembler/AbstractMacroAssembler.h b/Source/JavaScriptCore/assembler/AbstractMacroAssembler.h
index 7461806..a0039cb 100644
--- a/Source/JavaScriptCore/assembler/AbstractMacroAssembler.h
+++ b/Source/JavaScriptCore/assembler/AbstractMacroAssembler.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2008, 2012 Apple Inc. All rights reserved.
+ * Copyright (C) 2008 Apple Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
@@ -48,7 +48,6 @@
class LinkBuffer;
class RepatchBuffer;
-class Watchpoint;
namespace DFG {
class CorrectableJumpPoint;
}
@@ -71,6 +70,7 @@
// The following types are used as operands to MacroAssembler operations,
// describing immediate and memory operands to the instructions to be planted.
+
enum Scale {
TimesOne,
TimesTwo,
@@ -279,7 +279,6 @@
friend class Jump;
friend class MacroAssemblerCodeRef;
friend class LinkBuffer;
- friend class Watchpoint;
public:
Label()
@@ -560,13 +559,6 @@
return Label(this);
}
- Label watchpointLabel()
- {
- Label result;
- result.m_label = m_assembler.labelForWatchpoint();
- return result;
- }
-
Label align()
{
m_assembler.align(16);
diff --git a/Source/JavaScriptCore/assembler/AssemblerBuffer.h b/Source/JavaScriptCore/assembler/AssemblerBuffer.h
index 6bc1b39..d1deef2 100644
--- a/Source/JavaScriptCore/assembler/AssemblerBuffer.h
+++ b/Source/JavaScriptCore/assembler/AssemblerBuffer.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2008, 2012 Apple Inc. All rights reserved.
+ * Copyright (C) 2008 Apple Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
@@ -28,11 +28,11 @@
#if ENABLE(ASSEMBLER)
-#include "ExecutableAllocator.h"
#include "JITCompilationEffort.h"
#include "JSGlobalData.h"
#include "stdint.h"
#include <string.h>
+#include <jit/ExecutableAllocator.h>
#include <wtf/Assertions.h>
#include <wtf/FastMalloc.h>
#include <wtf/StdLibExtras.h>
diff --git a/Source/JavaScriptCore/assembler/MacroAssemblerARM.h b/Source/JavaScriptCore/assembler/MacroAssemblerARM.h
index 56c8642..1775cb4 100644
--- a/Source/JavaScriptCore/assembler/MacroAssemblerARM.h
+++ b/Source/JavaScriptCore/assembler/MacroAssemblerARM.h
@@ -1010,17 +1010,6 @@
return FunctionPtr(reinterpret_cast<void(*)()>(ARMAssembler::readCallTarget(call.dataLocation())));
}
- static void replaceWithJump(CodeLocationLabel instructionStart, CodeLocationLabel destination)
- {
- ASSERT_NOT_REACHED();
- }
-
- static ptrdiff_t maxJumpReplacementSize()
- {
- ASSERT_NOT_REACHED();
- return 0;
- }
-
protected:
ARMAssembler::Condition ARMCondition(RelationalCondition cond)
{
diff --git a/Source/JavaScriptCore/assembler/MacroAssemblerARMv7.h b/Source/JavaScriptCore/assembler/MacroAssemblerARMv7.h
index b26b925..3b62cb5 100644
--- a/Source/JavaScriptCore/assembler/MacroAssemblerARMv7.h
+++ b/Source/JavaScriptCore/assembler/MacroAssemblerARMv7.h
@@ -1186,16 +1186,6 @@
{
m_assembler.nop();
}
-
- static void replaceWithJump(CodeLocationLabel instructionStart, CodeLocationLabel destination)
- {
- ARMv7Assembler::replaceWithJump(instructionStart.dataLocation(), destination.dataLocation());
- }
-
- static ptrdiff_t maxJumpReplacementSize()
- {
- return ARMv7Assembler::maxJumpReplacementSize();
- }
// Forwards / external control flow operations:
//
@@ -1366,14 +1356,6 @@
return branchTest32(cond, addressTempRegister, mask);
}
- Jump branchTest8(ResultCondition cond, AbsoluteAddress address, TrustedImm32 mask = TrustedImm32(-1))
- {
- // use addressTempRegister incase the branchTest8 we call uses dataTempRegister. :-/
- move(TrustedImmPtr(address.m_ptr), addressTempRegister);
- load8(Address(addressTempRegister), addressTempRegister);
- return branchTest32(cond, addressTempRegister, mask);
- }
-
void jump(RegisterID target)
{
m_assembler.bx(target);
@@ -1697,14 +1679,12 @@
protected:
ALWAYS_INLINE Jump jump()
{
- m_assembler.label(); // Force nop-padding if we're in the middle of a watchpoint.
moveFixedWidthEncoding(TrustedImm32(0), dataTempRegister);
return Jump(m_assembler.bx(dataTempRegister), m_makeJumpPatchable ? ARMv7Assembler::JumpNoConditionFixedSize : ARMv7Assembler::JumpNoCondition);
}
ALWAYS_INLINE Jump makeBranch(ARMv7Assembler::Condition cond)
{
- m_assembler.label(); // Force nop-padding if we're in the middle of a watchpoint.
m_assembler.it(cond, true, true);
moveFixedWidthEncoding(TrustedImm32(0), dataTempRegister);
return Jump(m_assembler.bx(dataTempRegister), m_makeJumpPatchable ? ARMv7Assembler::JumpConditionFixedSize : ARMv7Assembler::JumpCondition, cond);
diff --git a/Source/JavaScriptCore/assembler/MacroAssemblerMIPS.h b/Source/JavaScriptCore/assembler/MacroAssemblerMIPS.h
index e50a0ca..f9c3457 100644
--- a/Source/JavaScriptCore/assembler/MacroAssemblerMIPS.h
+++ b/Source/JavaScriptCore/assembler/MacroAssemblerMIPS.h
@@ -1868,17 +1868,6 @@
return FunctionPtr(reinterpret_cast<void(*)()>(MIPSAssembler::readCallTarget(call.dataLocation())));
}
- static void replaceWithJump(CodeLocationLabel instructionStart, CodeLocationLabel destination)
- {
- ASSERT_NOT_REACHED();
- }
-
- static ptrdiff_t maxJumpReplacementSize()
- {
- ASSERT_NOT_REACHED();
- return 0;
- }
-
private:
// If m_fixedWidth is true, we will generate a fixed number of instructions.
// Otherwise, we can emit any number of instructions.
diff --git a/Source/JavaScriptCore/assembler/MacroAssemblerSH4.h b/Source/JavaScriptCore/assembler/MacroAssemblerSH4.h
index dff6894..c132ad6 100644
--- a/Source/JavaScriptCore/assembler/MacroAssemblerSH4.h
+++ b/Source/JavaScriptCore/assembler/MacroAssemblerSH4.h
@@ -1971,17 +1971,6 @@
return FunctionPtr(reinterpret_cast<void(*)()>(SH4Assembler::readCallTarget(call.dataLocation())));
}
- static void replaceWithJump(CodeLocationLabel instructionStart, CodeLocationLabel destination)
- {
- ASSERT_NOT_REACHED();
- }
-
- static ptrdiff_t maxJumpReplacementSize()
- {
- ASSERT_NOT_REACHED();
- return 0;
- }
-
protected:
SH4Assembler::Condition SH4Condition(RelationalCondition cond)
{
diff --git a/Source/JavaScriptCore/assembler/MacroAssemblerX86.h b/Source/JavaScriptCore/assembler/MacroAssemblerX86.h
index 3ea40c9..088fe19 100644
--- a/Source/JavaScriptCore/assembler/MacroAssemblerX86.h
+++ b/Source/JavaScriptCore/assembler/MacroAssemblerX86.h
@@ -51,7 +51,6 @@
using MacroAssemblerX86Common::loadDouble;
using MacroAssemblerX86Common::storeDouble;
using MacroAssemblerX86Common::convertInt32ToDouble;
- using MacroAssemblerX86Common::branchTest8;
void add32(TrustedImm32 imm, RegisterID src, RegisterID dest)
{
@@ -166,16 +165,6 @@
m_assembler.movl_i32r(initialValue.asIntptr(), dest);
return DataLabelPtr(this);
}
-
- Jump branchTest8(ResultCondition cond, AbsoluteAddress address, TrustedImm32 mask = TrustedImm32(-1))
- {
- ASSERT(mask.m_value >= -128 && mask.m_value <= 255);
- if (mask.m_value == -1)
- m_assembler.cmpb_im(0, address.m_ptr);
- else
- m_assembler.testb_im(mask.m_value, address.m_ptr);
- return Jump(m_assembler.jCC(x86Condition(cond)));
- }
Jump branchPtrWithPatch(RelationalCondition cond, RegisterID left, DataLabelPtr& dataLabel, TrustedImmPtr initialRightValue = TrustedImmPtr(0))
{
diff --git a/Source/JavaScriptCore/assembler/MacroAssemblerX86Common.h b/Source/JavaScriptCore/assembler/MacroAssemblerX86Common.h
index 432489d..e398dcda 100644
--- a/Source/JavaScriptCore/assembler/MacroAssemblerX86Common.h
+++ b/Source/JavaScriptCore/assembler/MacroAssemblerX86Common.h
@@ -1408,16 +1408,6 @@
m_assembler.nop();
}
- static void replaceWithJump(CodeLocationLabel instructionStart, CodeLocationLabel destination)
- {
- X86Assembler::replaceWithJump(instructionStart.executableAddress(), destination.executableAddress());
- }
-
- static ptrdiff_t maxJumpReplacementSize()
- {
- return X86Assembler::maxJumpReplacementSize();
- }
-
protected:
X86Assembler::Condition x86Condition(RelationalCondition cond)
{
diff --git a/Source/JavaScriptCore/assembler/MacroAssemblerX86_64.h b/Source/JavaScriptCore/assembler/MacroAssemblerX86_64.h
index fa95b33..41479f9 100644
--- a/Source/JavaScriptCore/assembler/MacroAssemblerX86_64.h
+++ b/Source/JavaScriptCore/assembler/MacroAssemblerX86_64.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2008, 2012 Apple Inc. All rights reserved.
+ * Copyright (C) 2008 Apple Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
@@ -513,12 +513,6 @@
MacroAssemblerX86Common::move(addr, scratchRegister);
return MacroAssemblerX86Common::branchTest8(cond, BaseIndex(scratchRegister, address.base, TimesOne), mask);
}
-
- Jump branchTest8(ResultCondition cond, AbsoluteAddress address, TrustedImm32 mask = TrustedImm32(-1))
- {
- MacroAssemblerX86Common::move(TrustedImmPtr(address.m_ptr), scratchRegister);
- return MacroAssemblerX86Common::branchTest8(cond, Address(scratchRegister), mask);
- }
static bool supportsFloatingPoint() { return true; }
// See comment on MacroAssemblerARMv7::supportsFloatingPointTruncate()
diff --git a/Source/JavaScriptCore/assembler/X86Assembler.h b/Source/JavaScriptCore/assembler/X86Assembler.h
index 8c56069..ff8d25b 100644
--- a/Source/JavaScriptCore/assembler/X86Assembler.h
+++ b/Source/JavaScriptCore/assembler/X86Assembler.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2008, 2012 Apple Inc. All rights reserved.
+ * Copyright (C) 2008 Apple Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
@@ -247,8 +247,6 @@
public:
X86Assembler()
- : m_indexOfLastWatchpoint(INT_MIN)
- , m_indexOfTailOfLastWatchpoint(INT_MIN)
{
}
@@ -800,14 +798,6 @@
m_formatter.oneByteOp(OP_GROUP1_EbIb, GROUP1_OP_CMP, base, index, scale, offset);
m_formatter.immediate8(imm);
}
-
-#if CPU(X86)
- void cmpb_im(int imm, const void* addr)
- {
- m_formatter.oneByteOp(OP_GROUP1_EbIb, GROUP1_OP_CMP, addr);
- m_formatter.immediate8(imm);
- }
-#endif
void cmpl_im(int imm, int offset, RegisterID base, RegisterID index, int scale)
{
@@ -958,14 +948,6 @@
m_formatter.immediate8(imm);
}
-#if CPU(X86)
- void testb_im(int imm, const void* addr)
- {
- m_formatter.oneByteOp(OP_GROUP3_EbIb, GROUP3_OP_TEST, addr);
- m_formatter.immediate8(imm);
- }
-#endif
-
void testl_i32m(int imm, int offset, RegisterID base, RegisterID index, int scale)
{
m_formatter.oneByteOp(OP_GROUP3_EvIz, GROUP3_OP_TEST, base, index, scale, offset);
@@ -1720,25 +1702,10 @@
{
return m_formatter.codeSize();
}
-
- AssemblerLabel labelForWatchpoint()
- {
- AssemblerLabel result = m_formatter.label();
- if (static_cast<int>(result.m_offset) != m_indexOfLastWatchpoint)
- result = label();
- m_indexOfLastWatchpoint = result.m_offset;
- m_indexOfTailOfLastWatchpoint = result.m_offset + maxJumpReplacementSize();
- return result;
- }
AssemblerLabel label()
{
- AssemblerLabel result = m_formatter.label();
- while (UNLIKELY(static_cast<int>(result.m_offset) < m_indexOfTailOfLastWatchpoint)) {
- nop();
- result = m_formatter.label();
- }
- return result;
+ return m_formatter.label();
}
AssemblerLabel align(int alignment)
@@ -1820,20 +1787,6 @@
return reinterpret_cast<void**>(where)[-1];
}
- static void replaceWithJump(void* instructionStart, void* to)
- {
- uint8_t* ptr = reinterpret_cast<uint8_t*>(instructionStart);
- uint8_t* dstPtr = reinterpret_cast<uint8_t*>(to);
- intptr_t distance = (intptr_t)(dstPtr - (ptr + 5));
- ptr[0] = static_cast<uint8_t>(OP_JMP_rel32);
- *reinterpret_cast<int32_t*>(ptr + 1) = static_cast<int32_t>(distance);
- }
-
- static ptrdiff_t maxJumpReplacementSize()
- {
- return 5;
- }
-
static unsigned getCallReturnOffset(AssemblerLabel call)
{
ASSERT(call.isSet());
@@ -2386,8 +2339,6 @@
AssemblerBuffer m_buffer;
} m_formatter;
- int m_indexOfLastWatchpoint;
- int m_indexOfTailOfLastWatchpoint;
};
} // namespace JSC
diff --git a/Source/JavaScriptCore/bytecode/CodeBlock.cpp b/Source/JavaScriptCore/bytecode/CodeBlock.cpp
index 155e6dd..9100109 100644
--- a/Source/JavaScriptCore/bytecode/CodeBlock.cpp
+++ b/Source/JavaScriptCore/bytecode/CodeBlock.cpp
@@ -928,28 +928,12 @@
it++;
break;
}
- case op_get_global_var_watchable: {
- int r0 = (++it)->u.operand;
- WriteBarrier<Unknown>* registerPointer = (++it)->u.registerPointer;
- dataLog("[%4d] get_global_var_watchable\t %s, g%d(%p)\n", location, registerName(exec, r0).data(), m_globalObject->findRegisterIndex(registerPointer), registerPointer);
- it++;
- it++;
- break;
- }
case op_put_global_var: {
WriteBarrier<Unknown>* registerPointer = (++it)->u.registerPointer;
int r0 = (++it)->u.operand;
dataLog("[%4d] put_global_var\t g%d(%p), %s\n", location, m_globalObject->findRegisterIndex(registerPointer), registerPointer, registerName(exec, r0).data());
break;
}
- case op_put_global_var_check: {
- WriteBarrier<Unknown>* registerPointer = (++it)->u.registerPointer;
- int r0 = (++it)->u.operand;
- dataLog("[%4d] put_global_var_check\t g%d(%p), %s\n", location, m_globalObject->findRegisterIndex(registerPointer), registerPointer, registerName(exec, r0).data());
- it++;
- it++;
- break;
- }
case op_resolve_base: {
int r0 = (++it)->u.operand;
int id0 = (++it)->u.operand;
@@ -1322,7 +1306,7 @@
}
case op_call_put_result: {
int r0 = (++it)->u.operand;
- dataLog("[%4d] call_put_result\t\t %s\n", location, registerName(exec, r0).data());
+ dataLog("[%4d] op_call_put_result\t\t %s\n", location, registerName(exec, r0).data());
it++;
break;
}
diff --git a/Source/JavaScriptCore/bytecode/CodeBlock.h b/Source/JavaScriptCore/bytecode/CodeBlock.h
index aa724fc..7420e23 100644
--- a/Source/JavaScriptCore/bytecode/CodeBlock.h
+++ b/Source/JavaScriptCore/bytecode/CodeBlock.h
@@ -62,7 +62,6 @@
#include "UString.h"
#include "UnconditionalFinalizer.h"
#include "ValueProfile.h"
-#include "Watchpoint.h"
#include <wtf/RefCountedArray.h>
#include <wtf/FastAllocBase.h>
#include <wtf/PassOwnPtr.h>
@@ -274,12 +273,10 @@
return result;
}
- unsigned appendOSRExit(const DFG::OSRExit& osrExit)
+ void appendOSRExit(const DFG::OSRExit& osrExit)
{
createDFGDataIfNecessary();
- unsigned result = m_dfgData->osrExit.size();
m_dfgData->osrExit.append(osrExit);
- return result;
}
DFG::OSRExit& lastOSRExit()
@@ -287,20 +284,10 @@
return m_dfgData->osrExit.last();
}
- unsigned appendSpeculationRecovery(const DFG::SpeculationRecovery& recovery)
+ void appendSpeculationRecovery(const DFG::SpeculationRecovery& recovery)
{
createDFGDataIfNecessary();
- unsigned result = m_dfgData->speculationRecovery.size();
m_dfgData->speculationRecovery.append(recovery);
- return result;
- }
-
- unsigned appendWatchpoint(const Watchpoint& watchpoint)
- {
- createDFGDataIfNecessary();
- unsigned result = m_dfgData->watchpoints.size();
- m_dfgData->watchpoints.append(watchpoint);
- return result;
}
unsigned numberOfOSRExits()
@@ -317,13 +304,6 @@
return m_dfgData->speculationRecovery.size();
}
- unsigned numberOfWatchpoints()
- {
- if (!m_dfgData)
- return 0;
- return m_dfgData->watchpoints.size();
- }
-
DFG::OSRExit& osrExit(unsigned index)
{
return m_dfgData->osrExit[index];
@@ -334,11 +314,6 @@
return m_dfgData->speculationRecovery[index];
}
- Watchpoint& watchpoint(unsigned index)
- {
- return m_dfgData->watchpoints[index];
- }
-
void appendWeakReference(JSCell* target)
{
createDFGDataIfNecessary();
@@ -1263,7 +1238,6 @@
Vector<DFG::OSREntryData> osrEntry;
SegmentedVector<DFG::OSRExit, 8> osrExit;
Vector<DFG::SpeculationRecovery> speculationRecovery;
- SegmentedVector<Watchpoint, 1, 0> watchpoints;
Vector<WeakReferenceTransition> transitions;
Vector<WriteBarrier<JSCell> > weakReferences;
bool mayBeExecuting;
diff --git a/Source/JavaScriptCore/bytecode/DFGExitProfile.h b/Source/JavaScriptCore/bytecode/DFGExitProfile.h
index d751ce6..09f9ee0 100644
--- a/Source/JavaScriptCore/bytecode/DFGExitProfile.h
+++ b/Source/JavaScriptCore/bytecode/DFGExitProfile.h
@@ -41,7 +41,6 @@
InadequateCoverage, // We exited because we ended up in code that didn't have profiling coverage.
ArgumentsEscaped, // We exited because arguments escaped but we didn't expect them to.
Uncountable, // We exited for none of the above reasons, and we should not count it. Most uses of this should be viewed as a FIXME.
- UncountableWatchpoint // We exited because of a watchpoint, which isn't counted because watchpoints do tracking themselves.
};
inline const char* exitKindToString(ExitKind kind)
@@ -59,12 +58,6 @@
return "NegativeZero";
case InadequateCoverage:
return "InadequateCoverage";
- case ArgumentsEscaped:
- return "ArgumentsEscaped";
- case Uncountable:
- return "Uncountable";
- case UncountableWatchpoint:
- return "UncountableWatchpoint";
default:
return "Unknown";
}
@@ -77,7 +70,6 @@
ASSERT_NOT_REACHED();
case BadType:
case Uncountable:
- case UncountableWatchpoint:
return false;
default:
return true;
diff --git a/Source/JavaScriptCore/bytecode/Instruction.h b/Source/JavaScriptCore/bytecode/Instruction.h
index 6e76512..af45510 100644
--- a/Source/JavaScriptCore/bytecode/Instruction.h
+++ b/Source/JavaScriptCore/bytecode/Instruction.h
@@ -193,8 +193,6 @@
Instruction(ValueProfile* profile) { u.profile = profile; }
Instruction(WriteBarrier<Unknown>* registerPointer) { u.registerPointer = registerPointer; }
-
- Instruction(bool* predicatePointer) { u.predicatePointer = predicatePointer; }
union {
Opcode opcode;
@@ -207,7 +205,6 @@
LLIntCallLinkInfo* callLinkInfo;
ValueProfile* profile;
void* pointer;
- bool* predicatePointer;
} u;
private:
diff --git a/Source/JavaScriptCore/bytecode/Opcode.h b/Source/JavaScriptCore/bytecode/Opcode.h
index e0cff16..aa83d9b 100644
--- a/Source/JavaScriptCore/bytecode/Opcode.h
+++ b/Source/JavaScriptCore/bytecode/Opcode.h
@@ -100,9 +100,7 @@
macro(op_get_scoped_var, 5) /* has value profiling */ \
macro(op_put_scoped_var, 4) \
macro(op_get_global_var, 4) /* has value profiling */ \
- macro(op_get_global_var_watchable, 5) /* has value profiling */ \
macro(op_put_global_var, 3) \
- macro(op_put_global_var_check, 5) \
macro(op_resolve_base, 5) /* has value profiling */ \
macro(op_ensure_property_exists, 3) \
macro(op_resolve_with_base, 5) /* has value profiling */ \
diff --git a/Source/JavaScriptCore/bytecode/Watchpoint.cpp b/Source/JavaScriptCore/bytecode/Watchpoint.cpp
deleted file mode 100644
index 425c105..0000000
--- a/Source/JavaScriptCore/bytecode/Watchpoint.cpp
+++ /dev/null
@@ -1,98 +0,0 @@
-/*
- * Copyright (C) 2012 Apple Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of
- * its contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
- * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "config.h"
-#include "Watchpoint.h"
-
-#include "LinkBuffer.h"
-
-namespace JSC {
-
-Watchpoint::~Watchpoint()
-{
- if (isOnList())
- remove();
-}
-
-void Watchpoint::correctLabels(LinkBuffer& linkBuffer)
-{
- MacroAssembler::Label label;
- label.m_label.m_offset = m_source;
- m_source = bitwise_cast<uintptr_t>(linkBuffer.locationOf(label).dataLocation());
- label.m_label.m_offset = m_destination;
- m_destination = bitwise_cast<uintptr_t>(linkBuffer.locationOf(label).dataLocation());
-}
-
-void Watchpoint::fire()
-{
- MacroAssembler::replaceWithJump(
- CodeLocationLabel(bitwise_cast<void*>(m_source)),
- CodeLocationLabel(bitwise_cast<void*>(m_destination)));
- if (isOnList())
- remove();
-}
-
-WatchpointSet::WatchpointSet()
- : m_isWatched(false)
- , m_isInvalidated(false)
-{
-}
-
-WatchpointSet::~WatchpointSet()
-{
- // Fire all watchpoints. This is necessary because it is possible, say with
- // structure watchpoints, for the watchpoint set owner to die while the
- // watchpoint owners are still live.
- fireAllWatchpoints();
-}
-
-void WatchpointSet::add(Watchpoint* watchpoint)
-{
- if (!watchpoint)
- return;
- m_set.push(watchpoint);
- m_isWatched = true;
-}
-
-void WatchpointSet::notifyWriteSlow()
-{
- ASSERT(m_isWatched);
-
- fireAllWatchpoints();
- m_isWatched = false;
- m_isInvalidated = true;
-}
-
-void WatchpointSet::fireAllWatchpoints()
-{
- while (!m_set.isEmpty())
- m_set.begin()->fire();
-}
-
-} // namespace JSC
-
diff --git a/Source/JavaScriptCore/bytecode/Watchpoint.h b/Source/JavaScriptCore/bytecode/Watchpoint.h
deleted file mode 100644
index 54dddba..0000000
--- a/Source/JavaScriptCore/bytecode/Watchpoint.h
+++ /dev/null
@@ -1,105 +0,0 @@
-/*
- * Copyright (C) 2012 Apple Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of
- * its contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
- * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef Watchpoint_h
-#define Watchpoint_h
-
-#include "CodeLocation.h"
-#include "MacroAssembler.h"
-#include <wtf/RefCounted.h>
-#include <wtf/SentinelLinkedList.h>
-
-namespace JSC {
-
-class Watchpoint : public BasicRawSentinelNode<Watchpoint> {
-public:
- Watchpoint(MacroAssembler::Label source)
- : m_source(source.m_label.m_offset)
- , m_destination(std::numeric_limits<uintptr_t>::max())
- {
- }
-
- void setDestination(MacroAssembler::Label destination)
- {
- m_destination = destination.m_label.m_offset;
- }
-
- void correctLabels(LinkBuffer&);
-
- ~Watchpoint();
-
- void fire();
-
-private:
- uintptr_t m_source;
- uintptr_t m_destination;
-};
-
-class WatchpointSet : public RefCounted<WatchpointSet> {
-public:
- WatchpointSet();
- ~WatchpointSet();
-
- bool isStillValid() const { return !m_isInvalidated; }
- bool hasBeenInvalidated() const { return m_isInvalidated; }
-
- // As a convenience, this will ignore 0. That's because code paths in the DFG
- // that create speculation watchpoints may choose to bail out if speculation
- // had already been terminated.
- void add(Watchpoint*);
-
- // Force the watchpoint set to behave as if it was being watched even if no
- // watchpoints have been installed. This will result in invalidation if the
- // watchpoint would have fired. That's a pretty good indication that you
- // probably don't want to set watchpoints, since we typically don't want to
- // set watchpoints that we believe will actually be fired.
- void startWatching() { m_isWatched = true; }
-
- void notifyWrite()
- {
- if (!m_isWatched)
- return;
- notifyWriteSlow();
- }
-
- bool* addressOfIsWatched() { return &m_isWatched; }
-
- void notifyWriteSlow(); // Call only if you've checked isWatched.
-
-private:
- void fireAllWatchpoints();
-
- SentinelLinkedList<Watchpoint, BasicRawSentinelNode<Watchpoint> > m_set;
- bool m_isWatched;
- bool m_isInvalidated;
-};
-
-} // namespace JSC
-
-#endif // Watchpoint_h
-
diff --git a/Source/JavaScriptCore/bytecompiler/BytecodeGenerator.cpp b/Source/JavaScriptCore/bytecompiler/BytecodeGenerator.cpp
index 8969a7f..c4f7faf 100644
--- a/Source/JavaScriptCore/bytecompiler/BytecodeGenerator.cpp
+++ b/Source/JavaScriptCore/bytecompiler/BytecodeGenerator.cpp
@@ -148,7 +148,6 @@
return;
case IndexedGlobal:
case ReadOnlyIndexedGlobal:
- case WatchedIndexedGlobal:
case DynamicIndexedGlobal:
case DynamicReadOnlyIndexedGlobal:
ASSERT(m_index != missingSymbolMarker());
@@ -217,19 +216,13 @@
return true;
}
-int BytecodeGenerator::addGlobalVar(
- const Identifier& ident, ConstantMode constantMode, FunctionMode functionMode)
+int BytecodeGenerator::addGlobalVar(const Identifier& ident, bool isConstant)
{
- UNUSED_PARAM(functionMode);
int index = symbolTable().size();
- SymbolTableEntry newEntry(index, (constantMode == IsConstant) ? ReadOnly : 0);
- if (functionMode == IsFunctionToSpecialize)
- newEntry.attemptToWatch();
+ SymbolTableEntry newEntry(index, isConstant ? ReadOnly : 0);
SymbolTable::AddResult result = symbolTable().add(ident.impl(), newEntry);
- if (!result.isNewEntry) {
- result.iterator->second.notifyWrite();
+ if (!result.isNewEntry)
index = result.iterator->second.getIndex();
- }
return index;
}
@@ -296,23 +289,17 @@
for (size_t i = 0; i < functionStack.size(); ++i) {
FunctionBodyNode* function = functionStack[i];
- bool propertyDidExist =
- globalObject->removeDirect(*m_globalData, function->ident()); // Newly declared functions overwrite existing properties.
-
+ globalObject->removeDirect(*m_globalData, function->ident()); // Newly declared functions overwrite existing properties.
+
JSValue value = JSFunction::create(exec, makeFunction(exec, function), scopeChain);
- int index = addGlobalVar(
- function->ident(), IsVariable,
- !propertyDidExist ? IsFunctionToSpecialize : NotFunctionOrNotSpecializable);
+ int index = addGlobalVar(function->ident(), false);
globalObject->registerAt(index).set(*m_globalData, globalObject, value);
}
for (size_t i = 0; i < varStack.size(); ++i) {
if (globalObject->hasProperty(exec, *varStack[i].first))
continue;
- addGlobalVar(
- *varStack[i].first,
- (varStack[i].second & DeclarationStacks::IsConstant) ? IsConstant : IsVariable,
- NotFunctionOrNotSpecializable);
+ addGlobalVar(*varStack[i].first, varStack[i].second & DeclarationStacks::IsConstant);
}
}
@@ -1215,9 +1202,7 @@
if (++iter == end) {
if (flags & ResolveResult::DynamicFlag)
return ResolveResult::dynamicIndexedGlobalResolve(entry.getIndex(), depth, currentScope, flags);
- return ResolveResult::indexedGlobalResolve(
- entry.getIndex(), currentScope,
- flags | (entry.couldBeWatched() ? ResolveResult::WatchedFlag : 0));
+ return ResolveResult::indexedGlobalResolve(entry.getIndex(), currentScope, flags);
}
#if !ASSERT_DISABLED
if (JSActivation* activation = jsDynamicCast<JSActivation*>(currentVariableObject))
@@ -1311,7 +1296,7 @@
RegisterID* BytecodeGenerator::emitResolve(RegisterID* dst, const ResolveResult& resolveResult, const Identifier& property)
{
if (resolveResult.isStatic())
- return emitGetStaticVar(dst, resolveResult, property);
+ return emitGetStaticVar(dst, resolveResult);
if (resolveResult.isGlobal() && !shouldAvoidResolveGlobal()) {
#if ENABLE(JIT)
@@ -1394,7 +1379,7 @@
if (resolveResult.isStatic()) {
// Directly index the property lookup across multiple scopes.
- emitGetStaticVar(propDst, resolveResult, property);
+ emitGetStaticVar(propDst, resolveResult);
return baseDst;
}
@@ -1433,7 +1418,7 @@
{
if (resolveResult.isStatic()) {
emitLoad(baseDst, jsUndefined());
- emitGetStaticVar(propDst, resolveResult, property);
+ emitGetStaticVar(propDst, resolveResult);
return baseDst;
}
@@ -1451,7 +1436,7 @@
return emitResolve(propDst, resolveResult, property);
}
-RegisterID* BytecodeGenerator::emitGetStaticVar(RegisterID* dst, const ResolveResult& resolveResult, const Identifier& identifier)
+RegisterID* BytecodeGenerator::emitGetStaticVar(RegisterID* dst, const ResolveResult& resolveResult)
{
ValueProfile* profile = 0;
@@ -1487,24 +1472,13 @@
instructions().append(profile);
return dst;
- case ResolveResult::WatchedIndexedGlobal:
- // Skip the peephole for now. It's not clear that it's profitable given
- // the DFG's capabilities, and the fact that if it's watchable then we
- // don't expect to see any put_global_var's anyway.
- profile = emitProfiledOpcode(op_get_global_var_watchable);
- instructions().append(dst->index());
- instructions().append(resolveResult.registerPointer());
- instructions().append(addConstant(identifier)); // For the benefit of the DFG.
- instructions().append(profile);
- return dst;
-
default:
ASSERT_NOT_REACHED();
return 0;
}
}
-RegisterID* BytecodeGenerator::emitPutStaticVar(const ResolveResult& resolveResult, const Identifier& identifier, RegisterID* value)
+RegisterID* BytecodeGenerator::emitPutStaticVar(const ResolveResult& resolveResult, RegisterID* value)
{
switch (resolveResult.type()) {
case ResolveResult::Register:
@@ -1525,14 +1499,6 @@
instructions().append(resolveResult.registerPointer());
instructions().append(value->index());
return value;
-
- case ResolveResult::WatchedIndexedGlobal:
- emitOpcode(op_put_global_var_check);
- instructions().append(resolveResult.registerPointer());
- instructions().append(value->index());
- instructions().append(jsCast<JSGlobalObject*>(resolveResult.globalObject())->symbolTable().get(identifier.impl()).addressOfIsWatched());
- instructions().append(addConstant(identifier));
- return value;
default:
ASSERT_NOT_REACHED();
diff --git a/Source/JavaScriptCore/bytecompiler/BytecodeGenerator.h b/Source/JavaScriptCore/bytecompiler/BytecodeGenerator.h
index 8c3fc7b..53256f3 100644
--- a/Source/JavaScriptCore/bytecompiler/BytecodeGenerator.h
+++ b/Source/JavaScriptCore/bytecompiler/BytecodeGenerator.h
@@ -111,9 +111,7 @@
// The resolved binding is immutable.
ReadOnlyFlag = 0x20,
// The base object is the global object.
- GlobalFlag = 0x40,
- // The property is being watched, so writes should be special.
- WatchedFlag = 0x80
+ GlobalFlag = 0x40
};
enum Type {
// The property is local, and stored in a register.
@@ -133,8 +131,6 @@
// binding created with "var" at the top level. At runtime we'll
// just index into the global object.
IndexedGlobal = IndexedFlag | GlobalFlag | StaticFlag,
- // Like IndexedGlobal, but the property is being watched.
- WatchedIndexedGlobal = IndexedFlag | GlobalFlag | StaticFlag | WatchedFlag,
// Like IndexedGlobal, but the property is also read-only, like NaN,
// Infinity, or undefined.
ReadOnlyIndexedGlobal = IndexedFlag | ReadOnlyFlag | GlobalFlag | StaticFlag,
@@ -445,8 +441,8 @@
RegisterID* emitTypeOf(RegisterID* dst, RegisterID* src) { return emitUnaryOp(op_typeof, dst, src); }
RegisterID* emitIn(RegisterID* dst, RegisterID* property, RegisterID* base) { return emitBinaryOp(op_in, dst, property, base, OperandTypes()); }
- RegisterID* emitGetStaticVar(RegisterID* dst, const ResolveResult&, const Identifier&);
- RegisterID* emitPutStaticVar(const ResolveResult&, const Identifier&, RegisterID* value);
+ RegisterID* emitGetStaticVar(RegisterID* dst, const ResolveResult&);
+ RegisterID* emitPutStaticVar(const ResolveResult&, RegisterID* value);
RegisterID* emitResolve(RegisterID* dst, const ResolveResult&, const Identifier& property);
RegisterID* emitResolveBase(RegisterID* dst, const ResolveResult&, const Identifier& property);
@@ -578,9 +574,7 @@
}
// Returns the index of the added var.
- enum ConstantMode { IsConstant, IsVariable };
- enum FunctionMode { IsFunctionToSpecialize, NotFunctionOrNotSpecializable };
- int addGlobalVar(const Identifier&, ConstantMode, FunctionMode);
+ int addGlobalVar(const Identifier&, bool isConstant);
void addParameter(const Identifier&, int parameterIndex);
diff --git a/Source/JavaScriptCore/bytecompiler/NodesCodegen.cpp b/Source/JavaScriptCore/bytecompiler/NodesCodegen.cpp
index d243e8c..4f113f7 100644
--- a/Source/JavaScriptCore/bytecompiler/NodesCodegen.cpp
+++ b/Source/JavaScriptCore/bytecompiler/NodesCodegen.cpp
@@ -430,7 +430,7 @@
if (resolveResult.isStatic()) {
RefPtr<RegisterID> func = generator.newTemporary();
CallArguments callArguments(generator, m_args);
- generator.emitGetStaticVar(func.get(), resolveResult, m_ident);
+ generator.emitGetStaticVar(func.get(), resolveResult);
generator.emitLoad(callArguments.thisRegister(), jsUndefined());
return generator.emitCall(generator.finalDestinationOrIgnored(dst, func.get()), func.get(), callArguments, divot(), startOffset(), endOffset());
}
@@ -618,7 +618,7 @@
}
if (resolveResult.isStatic() && !resolveResult.isReadOnly()) {
- RefPtr<RegisterID> value = generator.emitGetStaticVar(generator.newTemporary(), resolveResult, m_ident);
+ RefPtr<RegisterID> value = generator.emitGetStaticVar(generator.newTemporary(), resolveResult);
RegisterID* oldValue;
if (dst == generator.ignoredResult()) {
oldValue = 0;
@@ -626,7 +626,7 @@
} else {
oldValue = emitPostIncOrDec(generator, generator.finalDestination(dst), value.get(), m_operator);
}
- generator.emitPutStaticVar(resolveResult, m_ident, value.get());
+ generator.emitPutStaticVar(resolveResult, value.get());
return oldValue;
}
@@ -803,9 +803,9 @@
}
if (resolveResult.isStatic() && !resolveResult.isReadOnly()) {
- RefPtr<RegisterID> propDst = generator.emitGetStaticVar(generator.tempDestination(dst), resolveResult, m_ident);
+ RefPtr<RegisterID> propDst = generator.emitGetStaticVar(generator.tempDestination(dst), resolveResult);
emitPreIncOrDec(generator, propDst.get(), m_operator);
- generator.emitPutStaticVar(resolveResult, m_ident, propDst.get());
+ generator.emitPutStaticVar(resolveResult, propDst.get());
return generator.moveToDestinationIfNeeded(dst, propDst.get());
}
@@ -1226,9 +1226,9 @@
}
if (resolveResult.isStatic() && !resolveResult.isReadOnly()) {
- RefPtr<RegisterID> src1 = generator.emitGetStaticVar(generator.tempDestination(dst), resolveResult, m_ident);
+ RefPtr<RegisterID> src1 = generator.emitGetStaticVar(generator.tempDestination(dst), resolveResult);
RegisterID* result = emitReadModifyAssignment(generator, generator.finalDestination(dst, src1.get()), src1.get(), m_right, m_operator, OperandTypes(ResultType::unknownType(), m_right->resultDescriptor()));
- generator.emitPutStaticVar(resolveResult, m_ident, result);
+ generator.emitPutStaticVar(resolveResult, result);
return result;
}
@@ -1256,7 +1256,7 @@
if (dst == generator.ignoredResult())
dst = 0;
RegisterID* value = generator.emitNode(dst, m_right);
- generator.emitPutStaticVar(resolveResult, m_ident, value);
+ generator.emitPutStaticVar(resolveResult, value);
return value;
}
@@ -1361,7 +1361,7 @@
RefPtr<RegisterID> value = m_init ? generator.emitNode(m_init) : generator.emitLoad(0, jsUndefined());
if (resolveResult.isStatic())
- return generator.emitPutStaticVar(resolveResult, m_ident, value.get());
+ return generator.emitPutStaticVar(resolveResult, value.get());
if (generator.codeType() != EvalCode)
return value.get();
diff --git a/Source/JavaScriptCore/dfg/DFGAbstractState.cpp b/Source/JavaScriptCore/dfg/DFGAbstractState.cpp
index 51516f9..4186120 100644
--- a/Source/JavaScriptCore/dfg/DFGAbstractState.cpp
+++ b/Source/JavaScriptCore/dfg/DFGAbstractState.cpp
@@ -219,9 +219,7 @@
{
ASSERT(m_block);
ASSERT(m_isValid);
-
- m_didClobber = false;
-
+
NodeIndex nodeIndex = m_block->at(indexInBlock);
Node& node = m_graph[nodeIndex];
@@ -239,12 +237,8 @@
case GetLocal: {
VariableAccessData* variableAccessData = node.variableAccessData();
- if (variableAccessData->prediction() == SpecNone) {
- m_isValid = false;
- node.setCanExit(true);
- break;
- }
bool canExit = false;
+ canExit |= variableAccessData->prediction() == SpecNone;
AbstractValue value = m_variables.operand(variableAccessData->local());
if (!variableAccessData->isCaptured()) {
if (value.isClear())
@@ -1482,7 +1476,7 @@
forNode(node.child1()).filter(SpecFunction);
// FIXME: Should be able to propagate the fact that we know what the function is.
break;
-
+
case PutById:
case PutByIdDirect:
node.setCanExit(true);
@@ -1494,13 +1488,8 @@
node.setCanExit(false);
forNode(nodeIndex).makeTop();
break;
-
- case GlobalVarWatchpoint:
- node.setCanExit(true);
- break;
case PutGlobalVar:
- case PutGlobalVarCheck:
node.setCanExit(false);
break;
@@ -1589,7 +1578,6 @@
for (size_t i = m_variables.numberOfLocals(); i--;)
m_variables.local(i).clobberStructures();
m_haveStructures = false;
- m_didClobber = true;
}
inline bool AbstractState::mergeStateAtTail(AbstractValue& destination, AbstractValue& inVariable, NodeIndex nodeIndex)
diff --git a/Source/JavaScriptCore/dfg/DFGAbstractState.h b/Source/JavaScriptCore/dfg/DFGAbstractState.h
index 9bb74cd..68f16a1 100644
--- a/Source/JavaScriptCore/dfg/DFGAbstractState.h
+++ b/Source/JavaScriptCore/dfg/DFGAbstractState.h
@@ -193,9 +193,6 @@
// of Throw.
bool execute(unsigned);
- // Did the last executed node clobber the world?
- bool didClobber() const { return m_didClobber; }
-
// Is the execution state still valid? This will be false if execute() has
// returned false previously.
bool isValid() const { return m_isValid; }
@@ -277,7 +274,6 @@
bool m_foundConstants;
bool m_isValid;
- bool m_didClobber;
BranchDirection m_branchDirection; // This is only set for blocks that end in Branch and that execute to completion (i.e. m_isValid == true).
};
diff --git a/Source/JavaScriptCore/dfg/DFGByteCodeParser.cpp b/Source/JavaScriptCore/dfg/DFGByteCodeParser.cpp
index 5be5555..6b8c9ce 100644
--- a/Source/JavaScriptCore/dfg/DFGByteCodeParser.cpp
+++ b/Source/JavaScriptCore/dfg/DFGByteCodeParser.cpp
@@ -1234,9 +1234,6 @@
// Does the code block's size match the heuristics/requirements for being
// an inline candidate?
CodeBlock* profiledBlock = executable->profiledCodeBlockFor(kind);
- if (!profiledBlock)
- return false;
-
if (!mightInlineFunctionFor(profiledBlock, kind))
return false;
@@ -2254,61 +2251,13 @@
case op_get_global_var: {
SpeculatedType prediction = getPrediction();
- JSGlobalObject* globalObject = m_inlineStackTop->m_codeBlock->globalObject();
-
NodeIndex getGlobalVar = addToGraph(
GetGlobalVar,
- OpInfo(globalObject->assertRegisterIsInThisObject(currentInstruction[2].u.registerPointer)),
+ OpInfo(m_inlineStackTop->m_codeBlock->globalObject()->assertRegisterIsInThisObject(currentInstruction[2].u.registerPointer)),
OpInfo(prediction));
set(currentInstruction[1].u.operand, getGlobalVar);
NEXT_OPCODE(op_get_global_var);
}
-
- case op_get_global_var_watchable: {
- SpeculatedType prediction = getPrediction();
-
- JSGlobalObject* globalObject = m_inlineStackTop->m_codeBlock->globalObject();
-
- unsigned identifierNumber = m_inlineStackTop->m_identifierRemap[currentInstruction[3].u.operand];
- Identifier identifier = m_codeBlock->identifier(identifierNumber);
- SymbolTableEntry entry = globalObject->symbolTable().get(identifier.impl());
- if (!entry.couldBeWatched()) {
- NodeIndex getGlobalVar = addToGraph(
- GetGlobalVar,
- OpInfo(globalObject->assertRegisterIsInThisObject(currentInstruction[2].u.registerPointer)),
- OpInfo(prediction));
- set(currentInstruction[1].u.operand, getGlobalVar);
- NEXT_OPCODE(op_get_global_var_watchable);
- }
-
- // The watchpoint is still intact! This means that we will get notified if the
- // current value in the global variable changes. So, we can inline that value.
- // Moreover, currently we can assume that this value is a JSFunction*, which
- // implies that it's a cell. This simplifies things, since in general we'd have
- // to use a JSConstant for non-cells and a WeakJSConstant for cells. So instead
- // of having both cases we just assert that the value is a cell.
-
- // NB. If it wasn't for CSE, GlobalVarWatchpoint would have no need for the
- // register pointer. But CSE tracks effects on global variables by comparing
- // register pointers. Because CSE executes multiple times while the backend
- // executes once, we use the following performance trade-off:
- // - The node refers directly to the register pointer to make CSE super cheap.
- // - To perform backend code generation, the node only contains the identifier
- // number, from which it is possible to get (via a few average-time O(1)
- // lookups) to the WatchpointSet.
-
- addToGraph(
- GlobalVarWatchpoint,
- OpInfo(globalObject->assertRegisterIsInThisObject(currentInstruction[2].u.registerPointer)),
- OpInfo(identifierNumber));
-
- JSValue specificValue = globalObject->registerAt(entry.getIndex()).get();
- ASSERT(specificValue.isCell());
- set(currentInstruction[1].u.operand,
- addToGraph(WeakJSConstant, OpInfo(specificValue.asCell())));
-
- NEXT_OPCODE(op_get_global_var_watchable);
- }
case op_put_global_var: {
NodeIndex value = get(currentInstruction[2].u.operand);
@@ -2319,28 +2268,6 @@
NEXT_OPCODE(op_put_global_var);
}
- case op_put_global_var_check: {
- NodeIndex value = get(currentInstruction[2].u.operand);
- CodeBlock* codeBlock = m_inlineStackTop->m_codeBlock;
- JSGlobalObject* globalObject = codeBlock->globalObject();
- unsigned identifierNumber = m_inlineStackTop->m_identifierRemap[currentInstruction[4].u.operand];
- Identifier identifier = m_codeBlock->identifier(identifierNumber);
- SymbolTableEntry entry = globalObject->symbolTable().get(identifier.impl());
- if (!entry.couldBeWatched()) {
- addToGraph(
- PutGlobalVar,
- OpInfo(globalObject->assertRegisterIsInThisObject(currentInstruction[1].u.registerPointer)),
- value);
- NEXT_OPCODE(op_put_global_var_check);
- }
- addToGraph(
- PutGlobalVarCheck,
- OpInfo(codeBlock->globalObject()->assertRegisterIsInThisObject(currentInstruction[1].u.registerPointer)),
- OpInfo(identifierNumber),
- value);
- NEXT_OPCODE(op_put_global_var_check);
- }
-
// === Block terminators. ===
case op_jmp: {
diff --git a/Source/JavaScriptCore/dfg/DFGCCallHelpers.h b/Source/JavaScriptCore/dfg/DFGCCallHelpers.h
index 4cacd45..5bc45d8 100644
--- a/Source/JavaScriptCore/dfg/DFGCCallHelpers.h
+++ b/Source/JavaScriptCore/dfg/DFGCCallHelpers.h
@@ -94,12 +94,6 @@
addCallArgument(arg1);
addCallArgument(arg2);
}
-
- ALWAYS_INLINE void setupArguments(TrustedImmPtr arg1)
- {
- resetCallArguments();
- addCallArgument(arg1);
- }
ALWAYS_INLINE void setupArgumentsExecState()
{
@@ -439,11 +433,6 @@
{
setupTwoStubArgs<GPRInfo::argumentGPR0, GPRInfo::argumentGPR1>(arg1, arg2);
}
-
- ALWAYS_INLINE void setupArguments(TrustedImmPtr arg1)
- {
- move(arg1, GPRInfo::argumentGPR0);
- }
ALWAYS_INLINE void setupArgumentsExecState()
{
diff --git a/Source/JavaScriptCore/dfg/DFGCSEPhase.cpp b/Source/JavaScriptCore/dfg/DFGCSEPhase.cpp
index 6f58b6a..f26de01 100644
--- a/Source/JavaScriptCore/dfg/DFGCSEPhase.cpp
+++ b/Source/JavaScriptCore/dfg/DFGCSEPhase.cpp
@@ -217,29 +217,6 @@
return NoNode;
}
- bool globalVarWatchpointElimination(WriteBarrier<Unknown>* registerPointer)
- {
- for (unsigned i = m_indexInBlock; i--;) {
- NodeIndex index = m_currentBlock->at(i);
- Node& node = m_graph[index];
- switch (node.op()) {
- case GlobalVarWatchpoint:
- if (node.registerPointer() == registerPointer)
- return true;
- break;
- case PutGlobalVar:
- if (node.registerPointer() == registerPointer)
- return false;
- break;
- default:
- break;
- }
- if (m_graph.clobbersWorld(index))
- break;
- }
- return false;
- }
-
NodeIndex globalVarStoreElimination(WriteBarrier<Unknown>* registerPointer)
{
for (unsigned i = m_indexInBlock; i--;) {
@@ -249,7 +226,6 @@
continue;
switch (node.op()) {
case PutGlobalVar:
- case PutGlobalVarCheck:
if (node.registerPointer() == registerPointer)
return index;
break;
@@ -1009,13 +985,7 @@
setReplacement(globalVarLoadElimination(node.registerPointer()));
break;
- case GlobalVarWatchpoint:
- if (globalVarWatchpointElimination(node.registerPointer()))
- eliminate();
- break;
-
case PutGlobalVar:
- case PutGlobalVarCheck:
if (m_fixpointState == FixpointNotConverged)
break;
eliminate(globalVarStoreElimination(node.registerPointer()));
diff --git a/Source/JavaScriptCore/dfg/DFGCapabilities.h b/Source/JavaScriptCore/dfg/DFGCapabilities.h
index 027b0f7..694e886 100644
--- a/Source/JavaScriptCore/dfg/DFGCapabilities.h
+++ b/Source/JavaScriptCore/dfg/DFGCapabilities.h
@@ -123,9 +123,7 @@
case op_put_by_id_transition_direct:
case op_put_by_id_transition_normal:
case op_get_global_var:
- case op_get_global_var_watchable:
case op_put_global_var:
- case op_put_global_var_check:
case op_jmp:
case op_loop:
case op_jtrue:
diff --git a/Source/JavaScriptCore/dfg/DFGConstantFoldingPhase.cpp b/Source/JavaScriptCore/dfg/DFGConstantFoldingPhase.cpp
index 9e6720c..7ab2528 100644
--- a/Source/JavaScriptCore/dfg/DFGConstantFoldingPhase.cpp
+++ b/Source/JavaScriptCore/dfg/DFGConstantFoldingPhase.cpp
@@ -56,9 +56,6 @@
continue;
if (!block->cfaFoundConstants)
continue;
-#if DFG_ENABLE(DEBUG_PROPAGATION_VERBOSE)
- dataLog("Constant folding considering Block #%u.\n", blockIndex);
-#endif
state.beginBasicBlock(block);
for (unsigned indexInBlock = 0; indexInBlock < block->size(); ++indexInBlock) {
if (!state.isValid())
@@ -93,7 +90,7 @@
state.execute(indexInBlock);
if (!node.shouldGenerate()
- || state.didClobber()
+ || m_graph.clobbersWorld(node)
|| node.hasConstant())
continue;
JSValue value = state.forNode(nodeIndex).value();
diff --git a/Source/JavaScriptCore/dfg/DFGCorrectableJumpPoint.h b/Source/JavaScriptCore/dfg/DFGCorrectableJumpPoint.h
index 93cb49c..bfa1496 100644
--- a/Source/JavaScriptCore/dfg/DFGCorrectableJumpPoint.h
+++ b/Source/JavaScriptCore/dfg/DFGCorrectableJumpPoint.h
@@ -66,11 +66,6 @@
#endif
}
- bool isSet()
- {
- return m_codeOffset != std::numeric_limits<uint32_t>::max();
- }
-
void switchToLateJump(MacroAssembler::PatchableJump check)
{
#ifndef NDEBUG
diff --git a/Source/JavaScriptCore/dfg/DFGJITCompiler.cpp b/Source/JavaScriptCore/dfg/DFGJITCompiler.cpp
index b8b33f2..54b5aae 100644
--- a/Source/JavaScriptCore/dfg/DFGJITCompiler.cpp
+++ b/Source/JavaScriptCore/dfg/DFGJITCompiler.cpp
@@ -44,11 +44,7 @@
{
for (unsigned i = 0; i < codeBlock()->numberOfOSRExits(); ++i) {
OSRExit& exit = codeBlock()->osrExit(i);
- ASSERT(!exit.m_check.isSet() == (exit.m_watchpointIndex != std::numeric_limits<unsigned>::max()));
- if (exit.m_watchpointIndex == std::numeric_limits<unsigned>::max())
- exit.m_check.initialJump().link(this);
- else
- codeBlock()->watchpoint(exit.m_watchpointIndex).setDestination(label());
+ exit.m_check.initialJump().link(this);
jitAssertHasValidCallFrame();
store32(TrustedImm32(i), &globalData()->osrExitIndex);
exit.m_check.switchToLateJump(patchableJump());
@@ -194,8 +190,6 @@
OSRExit& exit = codeBlock()->osrExit(i);
linkBuffer.link(exit.m_check.lateJump(), target);
exit.m_check.correctLateJump(linkBuffer);
- if (exit.m_watchpointIndex != std::numeric_limits<unsigned>::max())
- codeBlock()->watchpoint(exit.m_watchpointIndex).correctLabels(linkBuffer);
}
codeBlock()->shrinkToFit(CodeBlock::LateShrink);
diff --git a/Source/JavaScriptCore/dfg/DFGNode.h b/Source/JavaScriptCore/dfg/DFGNode.h
index b96f69f..29783c8 100644
--- a/Source/JavaScriptCore/dfg/DFGNode.h
+++ b/Source/JavaScriptCore/dfg/DFGNode.h
@@ -430,20 +430,9 @@
return m_opInfo;
}
- bool hasIdentifierNumberForCheck()
- {
- return op() == GlobalVarWatchpoint || op() == PutGlobalVarCheck;
- }
-
- unsigned identifierNumberForCheck()
- {
- ASSERT(hasIdentifierNumberForCheck());
- return m_opInfo2;
- }
-
bool hasRegisterPointer()
{
- return op() == GetGlobalVar || op() == PutGlobalVar || op() == GlobalVarWatchpoint || op() == PutGlobalVarCheck;
+ return op() == GetGlobalVar || op() == PutGlobalVar;
}
WriteBarrier<Unknown>* registerPointer()
diff --git a/Source/JavaScriptCore/dfg/DFGNodeType.h b/Source/JavaScriptCore/dfg/DFGNodeType.h
index 9a81bd3..743f879 100644
--- a/Source/JavaScriptCore/dfg/DFGNodeType.h
+++ b/Source/JavaScriptCore/dfg/DFGNodeType.h
@@ -141,8 +141,6 @@
macro(PutScopedVar, NodeMustGenerate | NodeClobbersWorld) \
macro(GetGlobalVar, NodeResultJS | NodeMustGenerate) \
macro(PutGlobalVar, NodeMustGenerate) \
- macro(GlobalVarWatchpoint, NodeMustGenerate) \
- macro(PutGlobalVarCheck, NodeMustGenerate) \
macro(CheckFunction, NodeMustGenerate) \
\
/* Optimizations for array mutation. */\
diff --git a/Source/JavaScriptCore/dfg/DFGOSRExit.cpp b/Source/JavaScriptCore/dfg/DFGOSRExit.cpp
index d0e0de9..bcb98a1 100644
--- a/Source/JavaScriptCore/dfg/DFGOSRExit.cpp
+++ b/Source/JavaScriptCore/dfg/DFGOSRExit.cpp
@@ -51,7 +51,6 @@
, m_codeOrigin(jit->m_codeOriginForOSR)
, m_codeOriginForExitProfile(m_codeOrigin)
, m_recoveryIndex(recoveryIndex)
- , m_watchpointIndex(std::numeric_limits<unsigned>::max())
, m_kind(kind)
, m_count(0)
, m_arguments(jit->m_arguments.size())
diff --git a/Source/JavaScriptCore/dfg/DFGOSRExit.h b/Source/JavaScriptCore/dfg/DFGOSRExit.h
index 683f260..841fddd 100644
--- a/Source/JavaScriptCore/dfg/DFGOSRExit.h
+++ b/Source/JavaScriptCore/dfg/DFGOSRExit.h
@@ -96,7 +96,6 @@
CodeOrigin m_codeOriginForExitProfile;
unsigned m_recoveryIndex;
- unsigned m_watchpointIndex;
ExitKind m_kind;
uint32_t m_count;
diff --git a/Source/JavaScriptCore/dfg/DFGOperations.cpp b/Source/JavaScriptCore/dfg/DFGOperations.cpp
index 06a1cf8..ec3d4cc 100644
--- a/Source/JavaScriptCore/dfg/DFGOperations.cpp
+++ b/Source/JavaScriptCore/dfg/DFGOperations.cpp
@@ -924,11 +924,6 @@
return virtualFor(execCallee, CodeForConstruct);
}
-void DFG_OPERATION operationNotifyGlobalVarWrite(WatchpointSet* watchpointSet)
-{
- watchpointSet->notifyWrite();
-}
-
EncodedJSValue DFG_OPERATION operationResolve(ExecState* exec, Identifier* propertyName)
{
JSGlobalData* globalData = &exec->globalData();
diff --git a/Source/JavaScriptCore/dfg/DFGOperations.h b/Source/JavaScriptCore/dfg/DFGOperations.h
index 38166a8..58aa68b 100644
--- a/Source/JavaScriptCore/dfg/DFGOperations.h
+++ b/Source/JavaScriptCore/dfg/DFGOperations.h
@@ -100,7 +100,6 @@
typedef void DFG_OPERATION (*V_DFGOperation_EJJJ)(ExecState*, EncodedJSValue, EncodedJSValue, EncodedJSValue);
typedef void DFG_OPERATION (*V_DFGOperation_EJPP)(ExecState*, EncodedJSValue, EncodedJSValue, void*);
typedef void DFG_OPERATION (*V_DFGOperation_EPZJ)(ExecState*, void*, int32_t, EncodedJSValue);
-typedef void DFG_OPERATION (*V_DFGOperation_W)(WatchpointSet*);
typedef void* DFG_OPERATION (*P_DFGOperation_E)(ExecState*);
// These routines are provide callbacks out to C++ implementations of operations too complex to JIT.
@@ -117,7 +116,6 @@
EncodedJSValue DFG_OPERATION operationGetByIdOptimize(ExecState*, EncodedJSValue, Identifier*) WTF_INTERNAL;
EncodedJSValue DFG_OPERATION operationCallCustomGetter(ExecState*, JSCell*, PropertySlot::GetValueFunc, Identifier*) WTF_INTERNAL;
EncodedJSValue DFG_OPERATION operationCallGetter(ExecState*, JSCell*, JSCell*) WTF_INTERNAL;
-void DFG_OPERATION operationNotifyGlobalVarWrite(WatchpointSet* watchpointSet) WTF_INTERNAL;
EncodedJSValue DFG_OPERATION operationResolve(ExecState*, Identifier*) WTF_INTERNAL;
EncodedJSValue DFG_OPERATION operationResolveBase(ExecState*, Identifier*) WTF_INTERNAL;
EncodedJSValue DFG_OPERATION operationResolveBaseStrictPut(ExecState*, Identifier*) WTF_INTERNAL;
diff --git a/Source/JavaScriptCore/dfg/DFGPredictionPropagationPhase.cpp b/Source/JavaScriptCore/dfg/DFGPredictionPropagationPhase.cpp
index 0d44afb..86ee7a3 100644
--- a/Source/JavaScriptCore/dfg/DFGPredictionPropagationPhase.cpp
+++ b/Source/JavaScriptCore/dfg/DFGPredictionPropagationPhase.cpp
@@ -491,8 +491,7 @@
break;
}
- case PutGlobalVar:
- case PutGlobalVarCheck: {
+ case PutGlobalVar: {
changed |= m_graph[node.child1()].mergeFlags(NodeUsedAsValue);
break;
}
@@ -670,7 +669,6 @@
case TearOffArguments:
case CheckNumber:
case CheckArgumentsNotCreated:
- case GlobalVarWatchpoint:
changed |= mergeDefaultFlags(node);
break;
diff --git a/Source/JavaScriptCore/dfg/DFGSpeculativeJIT.h b/Source/JavaScriptCore/dfg/DFGSpeculativeJIT.h
index 9337846..74fe706f 100644
--- a/Source/JavaScriptCore/dfg/DFGSpeculativeJIT.h
+++ b/Source/JavaScriptCore/dfg/DFGSpeculativeJIT.h
@@ -1414,11 +1414,6 @@
m_jit.setupArgumentsWithExecState(arg1, TrustedImm32(arg2));
return appendCallWithExceptionCheck(operation);
}
- JITCompiler::Call callOperation(V_DFGOperation_W operation, WatchpointSet* watchpointSet)
- {
- m_jit.setupArguments(TrustedImmPtr(watchpointSet));
- return appendCall(operation);
- }
template<typename FunctionType, typename ArgumentType1>
JITCompiler::Call callOperation(FunctionType operation, NoResultTag, ArgumentType1 arg1)
{
@@ -1677,11 +1672,6 @@
m_jit.setupArgumentsWithExecState(arg1, arg2, EABI_32BIT_DUMMY_ARG arg3Payload, arg3Tag);
return appendCallWithExceptionCheck(operation);
}
- JITCompiler::Call callOperation(V_DFGOperation_W operation, WatchpointSet* watchpointSet)
- {
- m_jit.setupArguments(TrustedImmPtr(watchpointSet));
- return appendCall(operation);
- }
template<typename FunctionType, typename ArgumentType1>
JITCompiler::Call callOperation(FunctionType operation, NoResultTag, ArgumentType1 arg1)
{
@@ -1803,11 +1793,6 @@
m_jit.move(GPRInfo::returnValueGPR, result);
return call;
}
- JITCompiler::Call appendCall(const FunctionPtr& function)
- {
- prepareForExternalCall();
- return m_jit.appendCall(function);
- }
JITCompiler::Call appendCallWithExceptionCheckSetResult(const FunctionPtr& function, GPRReg result1, GPRReg result2)
{
JITCompiler::Call call = appendCallWithExceptionCheck(function);
@@ -2208,32 +2193,6 @@
ASSERT(at(m_compileIndex).canExit() || m_isCheckingArgumentTypes);
speculationCheck(kind, jsValueSource, nodeUse.index(), jumpToFail, recovery);
}
- // Use this like you would use speculationCheck(), except that you don't pass it a jump
- // (because you don't have to execute a branch; that's kind of the whole point), and you
- // must register the returned Watchpoint with something relevant. In general, this should
- // be used with extreme care. Use speculationCheck() unless you've got an amazing reason
- // not to.
- Watchpoint* speculationWatchpoint(ExitKind kind, JSValueSource jsValueSource, NodeIndex nodeIndex)
- {
- if (!m_compileOkay)
- return 0;
- ASSERT(at(m_compileIndex).canExit() || m_isCheckingArgumentTypes);
- OSRExit& exit = m_jit.codeBlock()->osrExit(
- m_jit.codeBlock()->appendOSRExit(
- OSRExit(kind, jsValueSource,
- m_jit.graph().methodOfGettingAValueProfileFor(nodeIndex),
- JITCompiler::Jump(), this)));
- exit.m_watchpointIndex = m_jit.codeBlock()->appendWatchpoint(
- Watchpoint(m_jit.watchpointLabel()));
- return &m_jit.codeBlock()->watchpoint(exit.m_watchpointIndex);
- }
- // The default for speculation watchpoints is that they're uncounted, because the
- // act of firing a watchpoint invalidates it. So, future recompilations will not
- // attempt to set this watchpoint again.
- Watchpoint* speculationWatchpoint()
- {
- return speculationWatchpoint(UncountableWatchpoint, JSValueSource(), NoNode);
- }
void forwardSpeculationCheck(ExitKind kind, JSValueSource jsValueSource, NodeIndex nodeIndex, MacroAssembler::Jump jumpToFail, const ValueRecovery& valueRecovery)
{
ASSERT(at(m_compileIndex).canExit() || m_isCheckingArgumentTypes);
diff --git a/Source/JavaScriptCore/dfg/DFGSpeculativeJIT32_64.cpp b/Source/JavaScriptCore/dfg/DFGSpeculativeJIT32_64.cpp
index 9cfa28f..6e4b548 100644
--- a/Source/JavaScriptCore/dfg/DFGSpeculativeJIT32_64.cpp
+++ b/Source/JavaScriptCore/dfg/DFGSpeculativeJIT32_64.cpp
@@ -3596,62 +3596,6 @@
break;
}
- case PutGlobalVarCheck: {
- JSValueOperand value(this, node.child1());
-
- WatchpointSet* watchpointSet =
- m_jit.globalObjectFor(node.codeOrigin)->symbolTable().get(
- identifier(node.identifierNumberForCheck())->impl()).watchpointSet();
- addSlowPathGenerator(
- slowPathCall(
- m_jit.branchTest8(
- JITCompiler::NonZero,
- JITCompiler::AbsoluteAddress(watchpointSet->addressOfIsWatched())),
- this, operationNotifyGlobalVarWrite, NoResult, watchpointSet));
-
- if (Heap::isWriteBarrierEnabled()) {
- GPRTemporary scratch(this);
- GPRReg scratchReg = scratch.gpr();
-
- writeBarrier(m_jit.globalObjectFor(node.codeOrigin), value.tagGPR(), node.child1(), WriteBarrierForVariableAccess, scratchReg);
- }
-
- // FIXME: if we happen to have a spare register - and _ONLY_ if we happen to have
- // a spare register - a good optimization would be to put the register pointer into
- // a register and then do a zero offset store followed by a four-offset store (or
- // vice-versa depending on endianness).
- m_jit.store32(value.tagGPR(), node.registerPointer()->tagPointer());
- m_jit.store32(value.payloadGPR(), node.registerPointer()->payloadPointer());
-
- noResult(m_compileIndex);
- break;
- }
-
- case GlobalVarWatchpoint: {
- m_jit.globalObjectFor(node.codeOrigin)->symbolTable().get(
- identifier(node.identifierNumberForCheck())->impl()).addWatchpoint(
- speculationWatchpoint());
-
-#if DFG_ENABLE(JIT_ASSERT)
- GPRTemporary scratch(this);
- GPRReg scratchGPR = scratch.gpr();
- m_jit.load32(node.registerPointer()->tagPointer(), scratchGPR);
- JITCompiler::Jump notOK = m_jit.branch32(
- JITCompiler::NotEqual, scratchGPR,
- TrustedImm32(node.registerPointer()->get().tag()));
- m_jit.load32(node.registerPointer()->payloadPointer(), scratchGPR);
- JITCompiler::Jump ok = m_jit.branch32(
- JITCompiler::Equal, scratchGPR,
- TrustedImm32(node.registerPointer()->get().payload()));
- notOK.link(&m_jit);
- m_jit.breakpoint();
- ok.link(&m_jit);
-#endif
-
- noResult(m_compileIndex);
- break;
- }
-
case CheckHasInstance: {
SpeculateCellOperand base(this, node.child1());
GPRTemporary structure(this);
diff --git a/Source/JavaScriptCore/dfg/DFGSpeculativeJIT64.cpp b/Source/JavaScriptCore/dfg/DFGSpeculativeJIT64.cpp
index 48b3e9a..c8c927d 100644
--- a/Source/JavaScriptCore/dfg/DFGSpeculativeJIT64.cpp
+++ b/Source/JavaScriptCore/dfg/DFGSpeculativeJIT64.cpp
@@ -3615,52 +3615,6 @@
break;
}
- case PutGlobalVarCheck: {
- JSValueOperand value(this, node.child1());
-
- WatchpointSet* watchpointSet =
- m_jit.globalObjectFor(node.codeOrigin)->symbolTable().get(
- identifier(node.identifierNumberForCheck())->impl()).watchpointSet();
- addSlowPathGenerator(
- slowPathCall(
- m_jit.branchTest8(
- JITCompiler::NonZero,
- JITCompiler::AbsoluteAddress(watchpointSet->addressOfIsWatched())),
- this, operationNotifyGlobalVarWrite, NoResult, watchpointSet));
-
- if (Heap::isWriteBarrierEnabled()) {
- GPRTemporary scratch(this);
- GPRReg scratchReg = scratch.gpr();
-
- writeBarrier(m_jit.globalObjectFor(node.codeOrigin), value.gpr(), node.child1(), WriteBarrierForVariableAccess, scratchReg);
- }
-
- m_jit.storePtr(value.gpr(), node.registerPointer());
-
- noResult(m_compileIndex);
- break;
- }
-
- case GlobalVarWatchpoint: {
- m_jit.globalObjectFor(node.codeOrigin)->symbolTable().get(
- identifier(node.identifierNumberForCheck())->impl()).addWatchpoint(
- speculationWatchpoint());
-
-#if DFG_ENABLE(JIT_ASSERT)
- GPRTemporary scratch(this);
- GPRReg scratchGPR = scratch.gpr();
- m_jit.loadPtr(node.registerPointer(), scratchGPR);
- JITCompiler::Jump ok = m_jit.branchPtr(
- JITCompiler::Equal, scratchGPR,
- TrustedImmPtr(bitwise_cast<void*>(JSValue::encode(node.registerPointer()->get()))));
- m_jit.breakpoint();
- ok.link(&m_jit);
-#endif
-
- noResult(m_compileIndex);
- break;
- }
-
case CheckHasInstance: {
SpeculateCellOperand base(this, node.child1());
GPRTemporary structure(this);
diff --git a/Source/JavaScriptCore/jit/JIT.cpp b/Source/JavaScriptCore/jit/JIT.cpp
index 09afd7a..ff5615f 100644
--- a/Source/JavaScriptCore/jit/JIT.cpp
+++ b/Source/JavaScriptCore/jit/JIT.cpp
@@ -259,7 +259,6 @@
DEFINE_OP(op_get_by_val)
DEFINE_OP(op_get_argument_by_val)
DEFINE_OP(op_get_by_pname)
- DEFINE_OP(op_get_global_var_watchable)
DEFINE_OP(op_get_global_var)
DEFINE_OP(op_get_pnames)
DEFINE_OP(op_get_scoped_var)
@@ -325,7 +324,6 @@
DEFINE_OP(op_put_by_val)
DEFINE_OP(op_put_getter_setter)
DEFINE_OP(op_put_global_var)
- DEFINE_OP(op_put_global_var_check)
DEFINE_OP(op_put_scoped_var)
DEFINE_OP(op_resolve)
DEFINE_OP(op_resolve_base)
@@ -483,7 +481,6 @@
case op_put_by_id_transition_normal:
DEFINE_SLOWCASE_OP(op_put_by_id)
DEFINE_SLOWCASE_OP(op_put_by_val)
- DEFINE_SLOWCASE_OP(op_put_global_var_check);
DEFINE_SLOWCASE_OP(op_resolve_global)
DEFINE_SLOWCASE_OP(op_resolve_global_dynamic)
DEFINE_SLOWCASE_OP(op_rshift)
diff --git a/Source/JavaScriptCore/jit/JIT.h b/Source/JavaScriptCore/jit/JIT.h
index 6491edb..d1143105 100644
--- a/Source/JavaScriptCore/jit/JIT.h
+++ b/Source/JavaScriptCore/jit/JIT.h
@@ -463,7 +463,7 @@
bool isMapped(int virtualRegisterIndex);
bool getMappedPayload(int virtualRegisterIndex, RegisterID& payload);
bool getMappedTag(int virtualRegisterIndex, RegisterID& tag);
-
+
void emitJumpSlowCaseIfNotJSCell(int virtualRegisterIndex);
void emitJumpSlowCaseIfNotJSCell(int virtualRegisterIndex, RegisterID tag);
@@ -599,7 +599,6 @@
void emit_op_get_argument_by_val(Instruction*);
void emit_op_get_by_pname(Instruction*);
void emit_op_get_global_var(Instruction*);
- void emit_op_get_global_var_watchable(Instruction* instruction) { emit_op_get_global_var(instruction); }
void emit_op_get_scoped_var(Instruction*);
void emit_op_init_lazy_reg(Instruction*);
void emit_op_check_has_instance(Instruction*);
@@ -663,7 +662,6 @@
void emit_op_put_by_val(Instruction*);
void emit_op_put_getter_setter(Instruction*);
void emit_op_put_global_var(Instruction*);
- void emit_op_put_global_var_check(Instruction*);
void emit_op_put_scoped_var(Instruction*);
void emit_op_resolve(Instruction*);
void emit_op_resolve_base(Instruction*);
@@ -741,7 +739,6 @@
void emitSlow_op_pre_inc(Instruction*, Vector<SlowCaseEntry>::iterator&);
void emitSlow_op_put_by_id(Instruction*, Vector<SlowCaseEntry>::iterator&);
void emitSlow_op_put_by_val(Instruction*, Vector<SlowCaseEntry>::iterator&);
- void emitSlow_op_put_global_var_check(Instruction*, Vector<SlowCaseEntry>::iterator&);
void emitSlow_op_resolve_global(Instruction*, Vector<SlowCaseEntry>::iterator&);
void emitSlow_op_resolve_global_dynamic(Instruction*, Vector<SlowCaseEntry>::iterator&);
void emitSlow_op_rshift(Instruction*, Vector<SlowCaseEntry>::iterator&);
diff --git a/Source/JavaScriptCore/jit/JITPropertyAccess.cpp b/Source/JavaScriptCore/jit/JITPropertyAccess.cpp
index 4fb40aa..b64f162 100644
--- a/Source/JavaScriptCore/jit/JITPropertyAccess.cpp
+++ b/Source/JavaScriptCore/jit/JITPropertyAccess.cpp
@@ -1027,29 +1027,6 @@
emitWriteBarrier(globalObject, regT0, regT2, ShouldFilterImmediates, WriteBarrierForVariableAccess);
}
-void JIT::emit_op_put_global_var_check(Instruction* currentInstruction)
-{
- emitGetVirtualRegister(currentInstruction[2].u.operand, regT0);
-
- addSlowCase(branchTest8(NonZero, AbsoluteAddress(currentInstruction[3].u.predicatePointer)));
-
- JSGlobalObject* globalObject = m_codeBlock->globalObject();
-
- storePtr(regT0, currentInstruction[1].u.registerPointer);
- if (Heap::isWriteBarrierEnabled())
- emitWriteBarrier(globalObject, regT0, regT2, ShouldFilterImmediates, WriteBarrierForVariableAccess);
-}
-
-void JIT::emitSlow_op_put_global_var_check(Instruction* currentInstruction, Vector<SlowCaseEntry>::iterator& iter)
-{
- linkSlowCase(iter);
-
- JITStubCall stubCall(this, cti_op_put_global_var_check);
- stubCall.addArgument(regT0);
- stubCall.addArgument(TrustedImm32(currentInstruction[4].u.operand));
- stubCall.call();
-}
-
void JIT::resetPatchGetById(RepatchBuffer& repatchBuffer, StructureStubInfo* stubInfo)
{
repatchBuffer.relink(stubInfo->callReturnLocation, cti_op_get_by_id);
diff --git a/Source/JavaScriptCore/jit/JITPropertyAccess32_64.cpp b/Source/JavaScriptCore/jit/JITPropertyAccess32_64.cpp
index 5bec19e..78b17d7d 100644
--- a/Source/JavaScriptCore/jit/JITPropertyAccess32_64.cpp
+++ b/Source/JavaScriptCore/jit/JITPropertyAccess32_64.cpp
@@ -1090,37 +1090,6 @@
map(m_bytecodeOffset + OPCODE_LENGTH(op_put_global_var), value, regT1, regT0);
}
-void JIT::emit_op_put_global_var_check(Instruction* currentInstruction)
-{
- WriteBarrier<Unknown>* registerPointer = currentInstruction[1].u.registerPointer;
- int value = currentInstruction[2].u.operand;
-
- JSGlobalObject* globalObject = m_codeBlock->globalObject();
-
- emitLoad(value, regT1, regT0);
-
- addSlowCase(branchTest8(NonZero, AbsoluteAddress(currentInstruction[3].u.predicatePointer)));
-
- if (Heap::isWriteBarrierEnabled()) {
- move(TrustedImmPtr(globalObject), regT2);
- emitWriteBarrier(globalObject, regT1, regT3, ShouldFilterImmediates, WriteBarrierForVariableAccess);
- }
-
- store32(regT1, registerPointer->tagPointer());
- store32(regT0, registerPointer->payloadPointer());
- unmap();
-}
-
-void JIT::emitSlow_op_put_global_var_check(Instruction* currentInstruction, Vector<SlowCaseEntry>::iterator& iter)
-{
- linkSlowCase(iter);
-
- JITStubCall stubCall(this, cti_op_put_global_var_check);
- stubCall.addArgument(regT1, regT0);
- stubCall.addArgument(TrustedImm32(currentInstruction[4].u.operand));
- stubCall.call();
-}
-
void JIT::resetPatchGetById(RepatchBuffer& repatchBuffer, StructureStubInfo* stubInfo)
{
repatchBuffer.relink(stubInfo->callReturnLocation, cti_op_get_by_id);
diff --git a/Source/JavaScriptCore/jit/JITStubs.cpp b/Source/JavaScriptCore/jit/JITStubs.cpp
index f83fbd4..98a56c1 100644
--- a/Source/JavaScriptCore/jit/JITStubs.cpp
+++ b/Source/JavaScriptCore/jit/JITStubs.cpp
@@ -2377,15 +2377,6 @@
return constructArray(stackFrame.callFrame, stackFrame.callFrame->codeBlock()->constantBuffer(stackFrame.args[0].int32()), stackFrame.args[1].int32());
}
-DEFINE_STUB_FUNCTION(void, op_put_global_var_check)
-{
- STUB_INIT_STACK_FRAME(stackFrame);
-
- CallFrame* callFrame = stackFrame.callFrame;
- CodeBlock* codeBlock = callFrame->codeBlock();
- symbolTablePut(codeBlock->globalObject(), callFrame, codeBlock->identifier(stackFrame.args[1].int32()), stackFrame.args[0].jsValue(), true);
-}
-
DEFINE_STUB_FUNCTION(EncodedJSValue, op_resolve)
{
STUB_INIT_STACK_FRAME(stackFrame);
diff --git a/Source/JavaScriptCore/jit/JITStubs.h b/Source/JavaScriptCore/jit/JITStubs.h
index 2517760..a6f7947 100644
--- a/Source/JavaScriptCore/jit/JITStubs.h
+++ b/Source/JavaScriptCore/jit/JITStubs.h
@@ -445,7 +445,6 @@
void JIT_STUB cti_op_put_by_index(STUB_ARGS_DECLARATION) WTF_INTERNAL;
void JIT_STUB cti_op_put_by_val(STUB_ARGS_DECLARATION) WTF_INTERNAL;
void JIT_STUB cti_op_put_getter_setter(STUB_ARGS_DECLARATION) WTF_INTERNAL;
- void JIT_STUB cti_op_put_global_var_check(STUB_ARGS_DECLARATION) WTF_INTERNAL;
void JIT_STUB cti_op_tear_off_activation(STUB_ARGS_DECLARATION) WTF_INTERNAL;
void JIT_STUB cti_op_tear_off_arguments(STUB_ARGS_DECLARATION) WTF_INTERNAL;
void JIT_STUB cti_op_throw_reference_error(STUB_ARGS_DECLARATION) WTF_INTERNAL;
diff --git a/Source/JavaScriptCore/llint/LLIntSlowPaths.cpp b/Source/JavaScriptCore/llint/LLIntSlowPaths.cpp
index acd824f..7133b0d 100644
--- a/Source/JavaScriptCore/llint/LLIntSlowPaths.cpp
+++ b/Source/JavaScriptCore/llint/LLIntSlowPaths.cpp
@@ -856,14 +856,6 @@
LLINT_END();
}
-LLINT_SLOW_PATH_DECL(slow_path_put_global_var_check)
-{
- LLINT_BEGIN();
- CodeBlock* codeBlock = exec->codeBlock();
- symbolTablePut(codeBlock->globalObject(), exec, codeBlock->identifier(pc[4].u.operand), LLINT_OP_C(2).jsValue(), true);
- LLINT_END();
-}
-
LLINT_SLOW_PATH_DECL(slow_path_get_by_id)
{
LLINT_BEGIN();
diff --git a/Source/JavaScriptCore/llint/LLIntSlowPaths.h b/Source/JavaScriptCore/llint/LLIntSlowPaths.h
index 2e069d0..3553462 100644
--- a/Source/JavaScriptCore/llint/LLIntSlowPaths.h
+++ b/Source/JavaScriptCore/llint/LLIntSlowPaths.h
@@ -147,7 +147,6 @@
LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_ensure_property_exists);
LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_resolve_with_base);
LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_resolve_with_this);
-LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_put_global_var_check);
LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_get_by_id);
LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_get_arguments_length);
LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_put_by_id);
diff --git a/Source/JavaScriptCore/llint/LowLevelInterpreter32_64.asm b/Source/JavaScriptCore/llint/LowLevelInterpreter32_64.asm
index d27fd82..9f540f8 100644
--- a/Source/JavaScriptCore/llint/LowLevelInterpreter32_64.asm
+++ b/Source/JavaScriptCore/llint/LowLevelInterpreter32_64.asm
@@ -1039,7 +1039,7 @@
dispatch(4)
-macro getGlobalVar(size)
+_llint_op_get_global_var:
traceExecution()
loadp 8[PC], t0
loadi 4[PC], t3
@@ -1047,17 +1047,9 @@
loadi PayloadOffset[t0], t1
storei t2, TagOffset[cfr, t3, 8]
storei t1, PayloadOffset[cfr, t3, 8]
- loadi (size - 1) * 4[PC], t3
+ loadi 12[PC], t3
valueProfile(t2, t1, t3)
- dispatch(size)
-end
-
-_llint_op_get_global_var:
- getGlobalVar(4)
-
-
-_llint_op_get_global_var_watchable:
- getGlobalVar(5)
+ dispatch(4)
_llint_op_put_global_var:
@@ -1071,22 +1063,6 @@
dispatch(3)
-_llint_op_put_global_var_check:
- traceExecution()
- loadp 12[PC], t2
- loadi 8[PC], t1
- loadi 4[PC], t0
- btbnz [t2], .opPutGlobalVarCheckSlow
- loadConstantOrVariable(t1, t2, t3)
- writeBarrier(t2, t3)
- storei t2, TagOffset[t0]
- storei t3, PayloadOffset[t0]
- dispatch(5)
-.opPutGlobalVarCheckSlow:
- callSlowPath(_llint_slow_path_put_global_var_check)
- dispatch(5)
-
-
_llint_op_get_by_id:
traceExecution()
# We only do monomorphic get_by_id caching for now, and we do not modify the
diff --git a/Source/JavaScriptCore/llint/LowLevelInterpreter64.asm b/Source/JavaScriptCore/llint/LowLevelInterpreter64.asm
index a153586..4fe4d5e 100644
--- a/Source/JavaScriptCore/llint/LowLevelInterpreter64.asm
+++ b/Source/JavaScriptCore/llint/LowLevelInterpreter64.asm
@@ -893,23 +893,15 @@
dispatch(4)
-macro getGlobalVar(size)
+_llint_op_get_global_var:
traceExecution()
loadp 16[PB, PC, 8], t0
loadis 8[PB, PC, 8], t3
loadp [t0], t1
storep t1, [cfr, t3, 8]
- loadp (size - 1) * 8[PB, PC, 8], t0
+ loadp 24[PB, PC, 8], t0
valueProfile(t1, t0)
- dispatch(size)
-end
-
-_llint_op_get_global_var:
- getGlobalVar(4)
-
-
-_llint_op_get_global_var_watchable:
- getGlobalVar(5)
+ dispatch(4)
_llint_op_put_global_var:
@@ -922,21 +914,6 @@
dispatch(3)
-_llint_op_put_global_var_check:
- traceExecution()
- loadp 24[PB, PC, 8], t2
- loadis 16[PB, PC, 8], t1
- loadp 8[PB, PC, 8], t0
- btbnz [t2], .opPutGlobalVarCheckSlow
- loadConstantOrVariable(t1, t2)
- writeBarrier(t2)
- storep t2, [t0]
- dispatch(5)
-.opPutGlobalVarCheckSlow:
- callSlowPath(_llint_slow_path_put_global_var_check)
- dispatch(5)
-
-
_llint_op_get_by_id:
traceExecution()
# We only do monomorphic get_by_id caching for now, and we do not modify the
diff --git a/Source/JavaScriptCore/runtime/JSObject.cpp b/Source/JavaScriptCore/runtime/JSObject.cpp
index aa71b8a..525c00b 100644
--- a/Source/JavaScriptCore/runtime/JSObject.cpp
+++ b/Source/JavaScriptCore/runtime/JSObject.cpp
@@ -504,25 +504,22 @@
structure()->setStaticFunctionsReified();
}
-bool JSObject::removeDirect(JSGlobalData& globalData, PropertyName propertyName)
+void JSObject::removeDirect(JSGlobalData& globalData, PropertyName propertyName)
{
if (structure()->get(globalData, propertyName) == WTF::notFound)
- return false;
+ return;
size_t offset;
if (structure()->isUncacheableDictionary()) {
offset = structure()->removePropertyWithoutTransition(globalData, propertyName);
- if (offset == WTF::notFound)
- return false;
- putUndefinedAtDirectOffset(offset);
- return true;
+ if (offset != WTF::notFound)
+ putUndefinedAtDirectOffset(offset);
+ return;
}
setStructure(globalData, Structure::removePropertyTransition(globalData, structure(), propertyName, offset));
- if (offset == WTF::notFound)
- return false;
- putUndefinedAtDirectOffset(offset);
- return true;
+ if (offset != WTF::notFound)
+ putUndefinedAtDirectOffset(offset);
}
NEVER_INLINE void JSObject::fillGetterPropertySlot(PropertySlot& slot, WriteBarrierBase<Unknown>* location)
diff --git a/Source/JavaScriptCore/runtime/JSObject.h b/Source/JavaScriptCore/runtime/JSObject.h
index ac8601d..67aa151 100644
--- a/Source/JavaScriptCore/runtime/JSObject.h
+++ b/Source/JavaScriptCore/runtime/JSObject.h
@@ -176,7 +176,7 @@
void transitionTo(JSGlobalData&, Structure*);
- bool removeDirect(JSGlobalData&, PropertyName); // Return true if anything is removed.
+ void removeDirect(JSGlobalData&, PropertyName);
bool hasCustomProperties() { return structure()->didTransition(); }
bool hasGetterSetterProperties() { return structure()->hasGetterSetterProperties(); }
diff --git a/Source/JavaScriptCore/runtime/JSSymbolTableObject.h b/Source/JavaScriptCore/runtime/JSSymbolTableObject.h
index 2bbe21d..a933177 100644
--- a/Source/JavaScriptCore/runtime/JSSymbolTableObject.h
+++ b/Source/JavaScriptCore/runtime/JSSymbolTableObject.h
@@ -72,12 +72,9 @@
inline bool symbolTableGet(
SymbolTableObjectType* object, PropertyName propertyName, PropertySlot& slot)
{
- SymbolTable& symbolTable = object->symbolTable();
- SymbolTable::iterator iter = symbolTable.find(propertyName.publicName());
- if (iter == symbolTable.end())
+ SymbolTableEntry entry = object->symbolTable().inlineGet(propertyName.publicName());
+ if (entry.isNull())
return false;
- SymbolTableEntry::Fast entry = iter->second;
- ASSERT(!entry.isNull());
slot.setValue(object->registerAt(entry.getIndex()).get());
return true;
}
@@ -86,12 +83,9 @@
inline bool symbolTableGet(
SymbolTableObjectType* object, PropertyName propertyName, PropertyDescriptor& descriptor)
{
- SymbolTable& symbolTable = object->symbolTable();
- SymbolTable::iterator iter = symbolTable.find(propertyName.publicName());
- if (iter == symbolTable.end())
+ SymbolTableEntry entry = object->symbolTable().inlineGet(propertyName.publicName());
+ if (entry.isNull())
return false;
- SymbolTableEntry::Fast entry = iter->second;
- ASSERT(!entry.isNull());
descriptor.setDescriptor(
object->registerAt(entry.getIndex()).get(), entry.getAttributes() | DontDelete);
return true;
@@ -102,12 +96,9 @@
SymbolTableObjectType* object, PropertyName propertyName, PropertySlot& slot,
bool& slotIsWriteable)
{
- SymbolTable& symbolTable = object->symbolTable();
- SymbolTable::iterator iter = symbolTable.find(propertyName.publicName());
- if (iter == symbolTable.end())
+ SymbolTableEntry entry = object->symbolTable().inlineGet(propertyName.publicName());
+ if (entry.isNull())
return false;
- SymbolTableEntry::Fast entry = iter->second;
- ASSERT(!entry.isNull());
slot.setValue(object->registerAt(entry.getIndex()).get());
slotIsWriteable = !entry.isReadOnly();
return true;
@@ -121,21 +112,15 @@
JSGlobalData& globalData = exec->globalData();
ASSERT(!Heap::heap(value) || Heap::heap(value) == Heap::heap(object));
- SymbolTable& symbolTable = object->symbolTable();
- SymbolTable::iterator iter = symbolTable.find(propertyName.publicName());
- if (iter == symbolTable.end())
+ SymbolTableEntry entry = object->symbolTable().inlineGet(propertyName.publicName());
+ if (entry.isNull())
return false;
- bool wasFat;
- SymbolTableEntry::Fast fastEntry = iter->second.getFast(wasFat);
- ASSERT(!fastEntry.isNull());
- if (fastEntry.isReadOnly()) {
+ if (entry.isReadOnly()) {
if (shouldThrow)
throwTypeError(exec, StrictModeReadonlyPropertyWriteError);
return true;
}
- if (UNLIKELY(wasFat))
- iter->second.notifyWrite();
- object->registerAt(fastEntry.getIndex()).set(globalData, object, value);
+ object->registerAt(entry.getIndex()).set(globalData, object, value);
return true;
}
@@ -151,7 +136,6 @@
return false;
SymbolTableEntry& entry = iter->second;
ASSERT(!entry.isNull());
- entry.notifyWrite();
entry.setAttributes(attributes);
object->registerAt(entry.getIndex()).set(globalData, object, value);
return true;
diff --git a/Source/JavaScriptCore/runtime/SymbolTable.cpp b/Source/JavaScriptCore/runtime/SymbolTable.cpp
deleted file mode 100644
index 99e2f23..0000000
--- a/Source/JavaScriptCore/runtime/SymbolTable.cpp
+++ /dev/null
@@ -1,96 +0,0 @@
-/*
- * Copyright (C) 2012 Apple Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of
- * its contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
- * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "config.h"
-#include "SymbolTable.h"
-
-namespace JSC {
-
-SymbolTableEntry& SymbolTableEntry::copySlow(const SymbolTableEntry& other)
-{
- ASSERT(other.isFat());
- FatEntry* newFatEntry = new FatEntry(*other.fatEntry());
- freeFatEntry();
- m_bits = bitwise_cast<intptr_t>(newFatEntry) | FatFlag;
- return *this;
-}
-
-void SymbolTableEntry::freeFatEntrySlow()
-{
- ASSERT(isFat());
- delete fatEntry();
-}
-
-bool SymbolTableEntry::couldBeWatched()
-{
- if (!isFat())
- return false;
- WatchpointSet* watchpoints = fatEntry()->m_watchpoints.get();
- if (!watchpoints)
- return false;
- return watchpoints->isStillValid();
-}
-
-void SymbolTableEntry::attemptToWatch()
-{
- FatEntry* entry = inflate();
- if (!entry->m_watchpoints) {
- entry->m_watchpoints = adoptRef(new WatchpointSet());
- entry->m_watchpoints->startWatching();
- }
-}
-
-bool* SymbolTableEntry::addressOfIsWatched()
-{
- ASSERT(couldBeWatched());
- return fatEntry()->m_watchpoints->addressOfIsWatched();
-}
-
-void SymbolTableEntry::addWatchpoint(Watchpoint* watchpoint)
-{
- ASSERT(couldBeWatched());
- fatEntry()->m_watchpoints->add(watchpoint);
-}
-
-void SymbolTableEntry::notifyWriteSlow()
-{
- WatchpointSet* watchpoints = fatEntry()->m_watchpoints.get();
- if (!watchpoints)
- return;
- watchpoints->notifyWrite();
-}
-
-SymbolTableEntry::FatEntry* SymbolTableEntry::inflateSlow()
-{
- FatEntry* entry = new FatEntry(m_bits);
- m_bits = bitwise_cast<intptr_t>(entry) | FatFlag;
- return entry;
-}
-
-} // namespace JSC
-
diff --git a/Source/JavaScriptCore/runtime/SymbolTable.h b/Source/JavaScriptCore/runtime/SymbolTable.h
index 9ddc32c..f540a12 100644
--- a/Source/JavaScriptCore/runtime/SymbolTable.h
+++ b/Source/JavaScriptCore/runtime/SymbolTable.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2007, 2008, 2012 Apple Inc. All rights reserved.
+ * Copyright (C) 2007, 2008 Apple Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
@@ -31,163 +31,53 @@
#include "JSObject.h"
#include "UString.h"
-#include "Watchpoint.h"
#include <wtf/AlwaysInline.h>
#include <wtf/HashTraits.h>
namespace JSC {
- class Watchpoint;
- class WatchpointSet;
-
static ALWAYS_INLINE int missingSymbolMarker() { return std::numeric_limits<int>::max(); }
// The bit twiddling in this class assumes that every register index is a
// reasonably small positive or negative number, and therefore has its high
// four bits all set or all unset.
- // In addition to implementing semantics-mandated variable attributes and
- // implementation-mandated variable indexing, this class also implements
- // watchpoints to be used for JIT optimizations. Because watchpoints are
- // meant to be relatively rare, this class optimizes heavily for the case
- // that they are not being used. To that end, this class uses the thin-fat
- // idiom: either it is thin, in which case it contains an in-place encoded
- // word that consists of attributes, the index, and a bit saying that it is
- // thin; or it is fat, in which case it contains a pointer to a malloc'd
- // data structure and a bit saying that it is fat. The malloc'd data
- // structure will be malloced a second time upon copy, to preserve the
- // property that in-place edits to SymbolTableEntry do not manifest in any
- // copies. However, the malloc'd FatEntry data structure contains a ref-
- // counted pointer to a shared WatchpointSet. Thus, in-place edits of the
- // WatchpointSet will manifest in all copies. Here's a picture:
- //
- // SymbolTableEntry --> FatEntry --> WatchpointSet
- //
- // If you make a copy of a SymbolTableEntry, you will have:
- //
- // original: SymbolTableEntry --> FatEntry --> WatchpointSet
- // copy: SymbolTableEntry --> FatEntry -----^
-
struct SymbolTableEntry {
- // Use the SymbolTableEntry::Fast class, either via implicit cast or by calling
- // getFast(), when you (1) only care about isNull(), getIndex(), and isReadOnly(),
- // and (2) you are in a hot path where you need to minimize the number of times
- // that you branch on isFat() when getting the bits().
- class Fast {
- public:
- Fast()
- : m_bits(0)
- {
- }
-
- ALWAYS_INLINE Fast(const SymbolTableEntry& entry)
- : m_bits(entry.bits())
- {
- }
-
- bool isNull() const
- {
- return !m_bits;
- }
-
- int getIndex() const
- {
- return static_cast<int>(m_bits >> FlagBits);
- }
-
- bool isReadOnly() const
- {
- return m_bits & ReadOnlyFlag;
- }
-
- unsigned getAttributes() const
- {
- unsigned attributes = 0;
- if (m_bits & ReadOnlyFlag)
- attributes |= ReadOnly;
- if (m_bits & DontEnumFlag)
- attributes |= DontEnum;
- return attributes;
- }
-
- bool isFat() const
- {
- return m_bits & FatFlag;
- }
-
- private:
- friend struct SymbolTableEntry;
- intptr_t m_bits;
- };
-
SymbolTableEntry()
: m_bits(0)
{
}
SymbolTableEntry(int index)
- : m_bits(0)
{
ASSERT(isValidIndex(index));
pack(index, false, false);
}
SymbolTableEntry(int index, unsigned attributes)
- : m_bits(0)
{
ASSERT(isValidIndex(index));
pack(index, attributes & ReadOnly, attributes & DontEnum);
}
- ~SymbolTableEntry()
- {
- freeFatEntry();
- }
-
- SymbolTableEntry(const SymbolTableEntry& other)
- : m_bits(0)
- {
- *this = other;
- }
-
- SymbolTableEntry& operator=(const SymbolTableEntry& other)
- {
- if (UNLIKELY(other.isFat()))
- return copySlow(other);
- freeFatEntry();
- m_bits = other.m_bits;
- return *this;
- }
-
bool isNull() const
{
- return !bits();
+ return !m_bits;
}
int getIndex() const
{
- return static_cast<int>(bits() >> FlagBits);
+ return m_bits >> FlagBits;
}
-
- ALWAYS_INLINE Fast getFast() const
- {
- return Fast(*this);
- }
-
- ALWAYS_INLINE Fast getFast(bool& wasFat) const
- {
- Fast result;
- wasFat = isFat();
- if (wasFat)
- result.m_bits = fatEntry()->m_bits;
- else
- result.m_bits = m_bits;
- return result;
- }
-
+
unsigned getAttributes() const
{
- return getFast().getAttributes();
+ unsigned attributes = 0;
+ if (m_bits & ReadOnlyFlag)
+ attributes |= ReadOnly;
+ if (m_bits & DontEnumFlag)
+ attributes |= DontEnum;
+ return attributes;
}
void setAttributes(unsigned attributes)
@@ -197,125 +87,30 @@
bool isReadOnly() const
{
- return bits() & ReadOnlyFlag;
+ return m_bits & ReadOnlyFlag;
}
-
- bool couldBeWatched();
-
- // Notify an opportunity to create a watchpoint for a variable. This is
- // idempotent and fail-silent. It is idempotent in the sense that if
- // a watchpoint set had already been created, then another one will not
- // be created. Hence two calls to this method have the same effect as
- // one call. It is also fail-silent, in the sense that if a watchpoint
- // set had been created and had already been invalidated, then this will
- // just return. This means that couldBeWatched() may return false even
- // immediately after a call to attemptToWatch().
- void attemptToWatch();
-
- bool* addressOfIsWatched();
-
- void addWatchpoint(Watchpoint*);
-
- WatchpointSet* watchpointSet()
- {
- return fatEntry()->m_watchpoints.get();
- }
-
- ALWAYS_INLINE void notifyWrite()
- {
- if (LIKELY(!isFat()))
- return;
- notifyWriteSlow();
- }
-
+
private:
- static const intptr_t FatFlag = 0x1;
- static const intptr_t ReadOnlyFlag = 0x2;
- static const intptr_t DontEnumFlag = 0x4;
- static const intptr_t NotNullFlag = 0x8;
- static const intptr_t FlagBits = 4;
-
- class FatEntry {
- WTF_MAKE_FAST_ALLOCATED;
- public:
- FatEntry(intptr_t bits)
- : m_bits(bits | FatFlag)
- {
- }
-
- intptr_t m_bits; // always has FatFlag set and exactly matches what the bits would have been if this wasn't fat.
-
- RefPtr<WatchpointSet> m_watchpoints;
- };
-
- SymbolTableEntry& copySlow(const SymbolTableEntry&);
- JS_EXPORT_PRIVATE void notifyWriteSlow();
-
- bool isFat() const
- {
- return m_bits & FatFlag;
- }
-
- const FatEntry* fatEntry() const
- {
- ASSERT(isFat());
- return bitwise_cast<const FatEntry*>(m_bits & ~FatFlag);
- }
-
- FatEntry* fatEntry()
- {
- ASSERT(isFat());
- return bitwise_cast<FatEntry*>(m_bits & ~FatFlag);
- }
-
- FatEntry* inflate()
- {
- if (LIKELY(isFat()))
- return fatEntry();
- return inflateSlow();
- }
-
- FatEntry* inflateSlow();
-
- ALWAYS_INLINE intptr_t bits() const
- {
- if (isFat())
- return fatEntry()->m_bits;
- return m_bits;
- }
-
- ALWAYS_INLINE intptr_t& bits()
- {
- if (isFat())
- return fatEntry()->m_bits;
- return m_bits;
- }
-
- void freeFatEntry()
- {
- if (LIKELY(!isFat()))
- return;
- freeFatEntrySlow();
- }
-
- void freeFatEntrySlow();
+ static const unsigned ReadOnlyFlag = 0x1;
+ static const unsigned DontEnumFlag = 0x2;
+ static const unsigned NotNullFlag = 0x4;
+ static const unsigned FlagBits = 3;
void pack(int index, bool readOnly, bool dontEnum)
{
- intptr_t& bitsRef = bits();
- bitsRef = (static_cast<intptr_t>(index) << FlagBits) | NotNullFlag;
+ m_bits = (index << FlagBits) | NotNullFlag;
if (readOnly)
- bitsRef |= ReadOnlyFlag;
+ m_bits |= ReadOnlyFlag;
if (dontEnum)
- bitsRef |= DontEnumFlag;
+ m_bits |= DontEnumFlag;
}
bool isValidIndex(int index)
{
- return ((static_cast<intptr_t>(index) << FlagBits) >> FlagBits) == static_cast<intptr_t>(index);
+ return ((index << FlagBits) >> FlagBits) == index;
}
- intptr_t m_bits;
+ int m_bits;
};
struct SymbolTableIndexHashTraits : HashTraits<SymbolTableEntry> {