Refactor JSStack to only be the stack data structure for the C Loop.
https://bugs.webkit.org/show_bug.cgi?id=159545
Reviewed by Geoffrey Garen.
Changes made:
1. Renamed JSStack to CLoopStack.
2. Made all of CLoopStack code to conditional on #if !ENABLE(JIT) i.e. they will
only be in effect for the C Loop build.
3. Changed clients of JSStack to use new equivalent VM APIs:
a. JSStack::ensureCapacityFor() => VM::ensureStackCapacityFor()
b. JSStack::committedByteCount() => VM::committedStackByteCount()
4. Made VM::updateReservedZoneSize() call CLoopStack::setReservedZoneSize()
instead of calling it from all the clients of VM::updateReservedZoneSize().
5. Removed all unnecessary references to JSStack.
* CMakeLists.txt:
* JavaScriptCore.xcodeproj/project.pbxproj:
* assembler/MaxFrameExtentForSlowPathCall.h:
* bytecode/BytecodeConventions.h:
* dfg/DFGGraph.h:
* dfg/DFGOSREntry.cpp:
(JSC::DFG::prepareOSREntry):
* ftl/FTLOSREntry.cpp:
(JSC::FTL::prepareOSREntry):
* heap/Heap.cpp:
(JSC::Heap::finalizeUnconditionalFinalizers):
(JSC::Heap::willStartIterating):
(JSC::Heap::gatherJSStackRoots):
(JSC::Heap::stack): Deleted.
* heap/Heap.h:
* interpreter/CLoopStack.cpp: Copied from Source/JavaScriptCore/interpreter/JSStack.cpp.
(JSC::commitSize):
(JSC::CLoopStack::CLoopStack):
(JSC::CLoopStack::~CLoopStack):
(JSC::CLoopStack::grow):
(JSC::CLoopStack::gatherConservativeRoots):
(JSC::CLoopStack::sanitizeStack):
(JSC::CLoopStack::releaseExcessCapacity):
(JSC::CLoopStack::addToCommittedByteCount):
(JSC::CLoopStack::setReservedZoneSize):
(JSC::CLoopStack::committedByteCount):
(JSC::JSStack::JSStack): Deleted.
(JSC::JSStack::~JSStack): Deleted.
(JSC::JSStack::growSlowCase): Deleted.
(JSC::JSStack::gatherConservativeRoots): Deleted.
(JSC::JSStack::sanitizeStack): Deleted.
(JSC::JSStack::releaseExcessCapacity): Deleted.
(JSC::JSStack::addToCommittedByteCount): Deleted.
(JSC::JSStack::setReservedZoneSize): Deleted.
(JSC::JSStack::lowAddress): Deleted.
(JSC::JSStack::highAddress): Deleted.
(JSC::JSStack::committedByteCount): Deleted.
* interpreter/CLoopStack.h: Copied from Source/JavaScriptCore/interpreter/JSStack.h.
(JSC::CLoopStack::containsAddress):
(JSC::CLoopStack::lowAddress):
(JSC::CLoopStack::highAddress):
(JSC::CLoopStack::reservationTop):
(JSC::JSStack::containsAddress): Deleted.
(JSC::JSStack::lowAddress): Deleted.
(JSC::JSStack::highAddress): Deleted.
(JSC::JSStack::reservationTop): Deleted.
* interpreter/CLoopStackInlines.h: Copied from Source/JavaScriptCore/interpreter/JSStackInlines.h.
(JSC::CLoopStack::ensureCapacityFor):
(JSC::CLoopStack::topOfFrameFor):
(JSC::CLoopStack::topOfStack):
(JSC::CLoopStack::shrink):
(JSC::CLoopStack::setCLoopStackLimit):
(JSC::JSStack::ensureCapacityFor): Deleted.
(JSC::JSStack::topOfFrameFor): Deleted.
(JSC::JSStack::topOfStack): Deleted.
(JSC::JSStack::shrink): Deleted.
(JSC::JSStack::grow): Deleted.
(JSC::JSStack::setCLoopStackLimit): Deleted.
* interpreter/CallFrame.cpp:
(JSC::CallFrame::unsafeCallSiteIndex):
(JSC::CallFrame::currentVPC):
(JSC::CallFrame::stack): Deleted.
* interpreter/CallFrame.h:
(JSC::ExecState::callerFrameAndPC):
(JSC::ExecState::unsafeCallerFrameAndPC):
* interpreter/Interpreter.cpp:
(JSC::sizeOfVarargs):
(JSC::sizeFrameForForwardArguments):
(JSC::sizeFrameForVarargs):
(JSC::Interpreter::Interpreter):
* interpreter/Interpreter.h:
(JSC::Interpreter::cloopStack):
(JSC::Interpreter::getOpcode):
(JSC::Interpreter::isCallBytecode):
(JSC::Interpreter::stack): Deleted.
* interpreter/JSStack.cpp: Removed.
* interpreter/JSStack.h: Removed.
* interpreter/JSStackInlines.h: Removed.
* interpreter/StackVisitor.cpp:
(JSC::StackVisitor::Frame::dump):
* jit/JIT.h:
* jit/JITOperations.cpp:
* jit/JSInterfaceJIT.h:
* jit/SpecializedThunkJIT.h:
* jit/ThunkGenerators.cpp:
* llint/LLIntOffsetsExtractor.cpp:
* llint/LLIntSlowPaths.cpp:
(JSC::LLInt::LLINT_SLOW_PATH_DECL):
(JSC::LLInt::llint_stack_check_at_vm_entry):
* llint/LLIntThunks.cpp:
* llint/LowLevelInterpreter.cpp:
(JSC::CLoop::execute):
* runtime/CommonSlowPaths.cpp:
(JSC::SLOW_PATH_DECL):
* runtime/CommonSlowPaths.h:
(JSC::CommonSlowPaths::arityCheckFor):
* runtime/ErrorHandlingScope.cpp:
(JSC::ErrorHandlingScope::ErrorHandlingScope):
(JSC::ErrorHandlingScope::~ErrorHandlingScope):
* runtime/JSGlobalObject.h:
* runtime/MemoryStatistics.cpp:
(JSC::globalMemoryStatistics):
* runtime/StackAlignment.h:
* runtime/VM.cpp:
(JSC::VM::VM):
(JSC::VM::updateReservedZoneSize):
(JSC::sanitizeStackForVM):
(JSC::VM::committedStackByteCount):
* runtime/VM.h:
(JSC::VM::reservedZoneSize):
(JSC::VM::osStackLimitWithReserve):
(JSC::VM::addressOfOSStackLimitWithReserve):
* runtime/VMInlines.h:
(JSC::VM::ensureStackCapacityFor):
(JSC::VM::shouldTriggerTermination):
git-svn-id: http://svn.webkit.org/repository/webkit/trunk@203081 268f45cc-cd09-0410-ab3c-d52691b4dbfc
diff --git a/Source/JavaScriptCore/CMakeLists.txt b/Source/JavaScriptCore/CMakeLists.txt
index eb4ed05..c19e621 100644
--- a/Source/JavaScriptCore/CMakeLists.txt
+++ b/Source/JavaScriptCore/CMakeLists.txt
@@ -507,9 +507,9 @@
inspector/agents/JSGlobalObjectRuntimeAgent.cpp
interpreter/AbstractPC.cpp
+ interpreter/CLoopStack.cpp
interpreter/CallFrame.cpp
interpreter/Interpreter.cpp
- interpreter/JSStack.cpp
interpreter/ProtoCallFrame.cpp
interpreter/ShadowChicken.cpp
interpreter/StackVisitor.cpp
diff --git a/Source/JavaScriptCore/ChangeLog b/Source/JavaScriptCore/ChangeLog
index 1987db4..94637a28 100644
--- a/Source/JavaScriptCore/ChangeLog
+++ b/Source/JavaScriptCore/ChangeLog
@@ -1,3 +1,137 @@
+2016-07-11 Mark Lam <mark.lam@apple.com>
+
+ Refactor JSStack to only be the stack data structure for the C Loop.
+ https://bugs.webkit.org/show_bug.cgi?id=159545
+
+ Reviewed by Geoffrey Garen.
+
+ Changes made:
+ 1. Renamed JSStack to CLoopStack.
+ 2. Made all of CLoopStack code to conditional on #if !ENABLE(JIT) i.e. they will
+ only be in effect for the C Loop build.
+ 3. Changed clients of JSStack to use new equivalent VM APIs:
+ a. JSStack::ensureCapacityFor() => VM::ensureStackCapacityFor()
+ b. JSStack::committedByteCount() => VM::committedStackByteCount()
+ 4. Made VM::updateReservedZoneSize() call CLoopStack::setReservedZoneSize()
+ instead of calling it from all the clients of VM::updateReservedZoneSize().
+ 5. Removed all unnecessary references to JSStack.
+
+ * CMakeLists.txt:
+ * JavaScriptCore.xcodeproj/project.pbxproj:
+ * assembler/MaxFrameExtentForSlowPathCall.h:
+ * bytecode/BytecodeConventions.h:
+ * dfg/DFGGraph.h:
+ * dfg/DFGOSREntry.cpp:
+ (JSC::DFG::prepareOSREntry):
+ * ftl/FTLOSREntry.cpp:
+ (JSC::FTL::prepareOSREntry):
+ * heap/Heap.cpp:
+ (JSC::Heap::finalizeUnconditionalFinalizers):
+ (JSC::Heap::willStartIterating):
+ (JSC::Heap::gatherJSStackRoots):
+ (JSC::Heap::stack): Deleted.
+ * heap/Heap.h:
+ * interpreter/CLoopStack.cpp: Copied from Source/JavaScriptCore/interpreter/JSStack.cpp.
+ (JSC::commitSize):
+ (JSC::CLoopStack::CLoopStack):
+ (JSC::CLoopStack::~CLoopStack):
+ (JSC::CLoopStack::grow):
+ (JSC::CLoopStack::gatherConservativeRoots):
+ (JSC::CLoopStack::sanitizeStack):
+ (JSC::CLoopStack::releaseExcessCapacity):
+ (JSC::CLoopStack::addToCommittedByteCount):
+ (JSC::CLoopStack::setReservedZoneSize):
+ (JSC::CLoopStack::committedByteCount):
+ (JSC::JSStack::JSStack): Deleted.
+ (JSC::JSStack::~JSStack): Deleted.
+ (JSC::JSStack::growSlowCase): Deleted.
+ (JSC::JSStack::gatherConservativeRoots): Deleted.
+ (JSC::JSStack::sanitizeStack): Deleted.
+ (JSC::JSStack::releaseExcessCapacity): Deleted.
+ (JSC::JSStack::addToCommittedByteCount): Deleted.
+ (JSC::JSStack::setReservedZoneSize): Deleted.
+ (JSC::JSStack::lowAddress): Deleted.
+ (JSC::JSStack::highAddress): Deleted.
+ (JSC::JSStack::committedByteCount): Deleted.
+ * interpreter/CLoopStack.h: Copied from Source/JavaScriptCore/interpreter/JSStack.h.
+ (JSC::CLoopStack::containsAddress):
+ (JSC::CLoopStack::lowAddress):
+ (JSC::CLoopStack::highAddress):
+ (JSC::CLoopStack::reservationTop):
+ (JSC::JSStack::containsAddress): Deleted.
+ (JSC::JSStack::lowAddress): Deleted.
+ (JSC::JSStack::highAddress): Deleted.
+ (JSC::JSStack::reservationTop): Deleted.
+ * interpreter/CLoopStackInlines.h: Copied from Source/JavaScriptCore/interpreter/JSStackInlines.h.
+ (JSC::CLoopStack::ensureCapacityFor):
+ (JSC::CLoopStack::topOfFrameFor):
+ (JSC::CLoopStack::topOfStack):
+ (JSC::CLoopStack::shrink):
+ (JSC::CLoopStack::setCLoopStackLimit):
+ (JSC::JSStack::ensureCapacityFor): Deleted.
+ (JSC::JSStack::topOfFrameFor): Deleted.
+ (JSC::JSStack::topOfStack): Deleted.
+ (JSC::JSStack::shrink): Deleted.
+ (JSC::JSStack::grow): Deleted.
+ (JSC::JSStack::setCLoopStackLimit): Deleted.
+ * interpreter/CallFrame.cpp:
+ (JSC::CallFrame::unsafeCallSiteIndex):
+ (JSC::CallFrame::currentVPC):
+ (JSC::CallFrame::stack): Deleted.
+ * interpreter/CallFrame.h:
+ (JSC::ExecState::callerFrameAndPC):
+ (JSC::ExecState::unsafeCallerFrameAndPC):
+ * interpreter/Interpreter.cpp:
+ (JSC::sizeOfVarargs):
+ (JSC::sizeFrameForForwardArguments):
+ (JSC::sizeFrameForVarargs):
+ (JSC::Interpreter::Interpreter):
+ * interpreter/Interpreter.h:
+ (JSC::Interpreter::cloopStack):
+ (JSC::Interpreter::getOpcode):
+ (JSC::Interpreter::isCallBytecode):
+ (JSC::Interpreter::stack): Deleted.
+ * interpreter/JSStack.cpp: Removed.
+ * interpreter/JSStack.h: Removed.
+ * interpreter/JSStackInlines.h: Removed.
+ * interpreter/StackVisitor.cpp:
+ (JSC::StackVisitor::Frame::dump):
+ * jit/JIT.h:
+ * jit/JITOperations.cpp:
+ * jit/JSInterfaceJIT.h:
+ * jit/SpecializedThunkJIT.h:
+ * jit/ThunkGenerators.cpp:
+ * llint/LLIntOffsetsExtractor.cpp:
+ * llint/LLIntSlowPaths.cpp:
+ (JSC::LLInt::LLINT_SLOW_PATH_DECL):
+ (JSC::LLInt::llint_stack_check_at_vm_entry):
+ * llint/LLIntThunks.cpp:
+ * llint/LowLevelInterpreter.cpp:
+ (JSC::CLoop::execute):
+ * runtime/CommonSlowPaths.cpp:
+ (JSC::SLOW_PATH_DECL):
+ * runtime/CommonSlowPaths.h:
+ (JSC::CommonSlowPaths::arityCheckFor):
+ * runtime/ErrorHandlingScope.cpp:
+ (JSC::ErrorHandlingScope::ErrorHandlingScope):
+ (JSC::ErrorHandlingScope::~ErrorHandlingScope):
+ * runtime/JSGlobalObject.h:
+ * runtime/MemoryStatistics.cpp:
+ (JSC::globalMemoryStatistics):
+ * runtime/StackAlignment.h:
+ * runtime/VM.cpp:
+ (JSC::VM::VM):
+ (JSC::VM::updateReservedZoneSize):
+ (JSC::sanitizeStackForVM):
+ (JSC::VM::committedStackByteCount):
+ * runtime/VM.h:
+ (JSC::VM::reservedZoneSize):
+ (JSC::VM::osStackLimitWithReserve):
+ (JSC::VM::addressOfOSStackLimitWithReserve):
+ * runtime/VMInlines.h:
+ (JSC::VM::ensureStackCapacityFor):
+ (JSC::VM::shouldTriggerTermination):
+
2016-07-11 Keith Miller <keith_miller@apple.com>
STP TypedArray.subarray 5x slowdown compared to 9.1
diff --git a/Source/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj b/Source/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj
index 4938f74..5917aeb0 100644
--- a/Source/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj
+++ b/Source/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj
@@ -973,7 +973,7 @@
14280823107EC02C0013E7B2 /* Debugger.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F692A8580255597D01FF60F7 /* Debugger.cpp */; };
1428082D107EC0570013E7B2 /* CallData.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BCA62DFE0E2826230004F30D /* CallData.cpp */; };
1428082E107EC0570013E7B2 /* ConstructData.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BCA62DFF0E2826310004F30D /* ConstructData.cpp */; };
- 1428083A107EC0750013E7B2 /* JSStack.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1429D85B0ED218E900B89619 /* JSStack.cpp */; };
+ 1428083A107EC0750013E7B2 /* CLoopStack.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1429D85B0ED218E900B89619 /* CLoopStack.cpp */; };
14280841107EC0930013E7B2 /* RegExp.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F692A87D0255597D01FF60F7 /* RegExp.cpp */; };
14280842107EC0930013E7B2 /* RegExpConstructor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BCD202BD0E1706A7002C7E82 /* RegExpConstructor.cpp */; };
14280843107EC0930013E7B2 /* RegExpObject.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F692A87B0255597D01FF60F7 /* RegExpObject.cpp */; };
@@ -1140,6 +1140,10 @@
2AF7382C18BBBF92008A5A37 /* StructureIDTable.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 2AF7382A18BBBF92008A5A37 /* StructureIDTable.cpp */; };
2AF7382D18BBBF92008A5A37 /* StructureIDTable.h in Headers */ = {isa = PBXBuildFile; fileRef = 2AF7382B18BBBF92008A5A37 /* StructureIDTable.h */; settings = {ATTRIBUTES = (Private, ); }; };
371D842D17C98B6E00ECF994 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 371D842C17C98B6E00ECF994 /* libz.dylib */; };
+ 412952771D2CF6BC00E78B89 /* builtins_generate_internals_wrapper_header.py in Headers */ = {isa = PBXBuildFile; fileRef = 412952731D2CF6AC00E78B89 /* builtins_generate_internals_wrapper_header.py */; settings = {ATTRIBUTES = (Private, ); }; };
+ 412952781D2CF6BC00E78B89 /* builtins_generate_internals_wrapper_implementation.py in Headers */ = {isa = PBXBuildFile; fileRef = 412952741D2CF6AC00E78B89 /* builtins_generate_internals_wrapper_implementation.py */; settings = {ATTRIBUTES = (Private, ); }; };
+ 412952791D2CF6BC00E78B89 /* builtins_generate_wrapper_header.py in Headers */ = {isa = PBXBuildFile; fileRef = 412952751D2CF6AC00E78B89 /* builtins_generate_wrapper_header.py */; settings = {ATTRIBUTES = (Private, ); }; };
+ 4129527A1D2CF6BC00E78B89 /* builtins_generate_wrapper_implementation.py in Headers */ = {isa = PBXBuildFile; fileRef = 412952761D2CF6AC00E78B89 /* builtins_generate_wrapper_implementation.py */; settings = {ATTRIBUTES = (Private, ); }; };
41359CF30FDD89AD00206180 /* DateConversion.h in Headers */ = {isa = PBXBuildFile; fileRef = D21202290AD4310C00ED79B6 /* DateConversion.h */; };
41DEA1321B9F3163006D65DD /* BuiltinUtils.h in Headers */ = {isa = PBXBuildFile; fileRef = 41DEA1311B9F3154006D65DD /* BuiltinUtils.h */; settings = {ATTRIBUTES = (Private, ); }; };
4319DA031C1BE40A001D260B /* B3LowerMacrosAfterOptimizations.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4319DA011C1BE3C1001D260B /* B3LowerMacrosAfterOptimizations.cpp */; };
@@ -1474,10 +1478,6 @@
99DA00A81BD5993100F4575C /* builtins_generate_combined_implementation.py in Headers */ = {isa = PBXBuildFile; fileRef = 99DA009F1BD5992700F4575C /* builtins_generate_combined_implementation.py */; settings = {ATTRIBUTES = (Private, ); }; };
99DA00A91BD5993100F4575C /* builtins_generate_separate_header.py in Headers */ = {isa = PBXBuildFile; fileRef = 99DA00A01BD5992700F4575C /* builtins_generate_separate_header.py */; settings = {ATTRIBUTES = (Private, ); }; };
99DA00AA1BD5993100F4575C /* builtins_generate_separate_implementation.py in Headers */ = {isa = PBXBuildFile; fileRef = 99DA00A11BD5992700F4575C /* builtins_generate_separate_implementation.py */; settings = {ATTRIBUTES = (Private, ); }; };
- 412952771D2CF6BC00E78B89 /* builtins_generate_internals_wrapper_header.py in Resources */ = {isa = PBXBuildFile; fileRef = 412952731D2CF6AC00E78B89 /* builtins_generate_internals_wrapper_header.py */; settings = {ATTRIBUTES = (Private, ); }; };
- 412952781D2CF6BC00E78B89 /* builtins_generate_internals_wrapper_implementation.py in Resources */ = {isa = PBXBuildFile; fileRef = 412952741D2CF6AC00E78B89 /* builtins_generate_internals_wrapper_implementation.py */; settings = {ATTRIBUTES = (Private, ); }; };
- 412952791D2CF6BC00E78B89 /* builtins_generate_wrapper_header.py in Resources */ = {isa = PBXBuildFile; fileRef = 412952751D2CF6AC00E78B89 /* builtins_generate_wrapper_header.py */; settings = {ATTRIBUTES = (Private, ); }; };
- 4129527A1D2CF6BC00E78B89 /* builtins_generate_wrapper_implementation.py in Resources */ = {isa = PBXBuildFile; fileRef = 412952761D2CF6AC00E78B89 /* builtins_generate_wrapper_implementation.py */; settings = {ATTRIBUTES = (Private, ); }; };
99DA00AF1BD5994E00F4575C /* generate-js-builtins.py in Headers */ = {isa = PBXBuildFile; fileRef = 99DA00AC1BD5993E00F4575C /* generate-js-builtins.py */; settings = {ATTRIBUTES = (Private, ); }; };
99DA00B01BD5994E00F4575C /* lazywriter.py in Headers */ = {isa = PBXBuildFile; fileRef = 99DA00AD1BD5993E00F4575C /* lazywriter.py */; settings = {ATTRIBUTES = (Private, ); }; };
99DA00B11BD5994E00F4575C /* UpdateContents.py in Headers */ = {isa = PBXBuildFile; fileRef = 99DA00AE1BD5993E00F4575C /* UpdateContents.py */; settings = {ATTRIBUTES = (Private, ); }; };
@@ -1776,7 +1776,7 @@
A7C0C4AC168103020017011D /* JSScriptRefPrivate.h in Headers */ = {isa = PBXBuildFile; fileRef = A7C0C4AB167C08CD0017011D /* JSScriptRefPrivate.h */; settings = {ATTRIBUTES = (Private, ); }; };
A7C0C4AD1681067E0017011D /* JSScriptRef.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A7C0C4AA167C08CD0017011D /* JSScriptRef.cpp */; };
A7C1E8E4112E72EF00A37F98 /* JITPropertyAccess32_64.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A7C1E8C8112E701C00A37F98 /* JITPropertyAccess32_64.cpp */; };
- A7C1EAF017987AB600299DB2 /* JSStackInlines.h in Headers */ = {isa = PBXBuildFile; fileRef = A7C1EAEB17987AB600299DB2 /* JSStackInlines.h */; };
+ A7C1EAF017987AB600299DB2 /* CLoopStackInlines.h in Headers */ = {isa = PBXBuildFile; fileRef = A7C1EAEB17987AB600299DB2 /* CLoopStackInlines.h */; };
A7C1EAF117987AB600299DB2 /* StackVisitor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A7C1EAEC17987AB600299DB2 /* StackVisitor.cpp */; };
A7C1EAF217987AB600299DB2 /* StackVisitor.h in Headers */ = {isa = PBXBuildFile; fileRef = A7C1EAED17987AB600299DB2 /* StackVisitor.h */; settings = {ATTRIBUTES = (Private, ); }; };
A7CA3AE317DA41AE006538AF /* WeakMapConstructor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A7CA3ADD17DA41AE006538AF /* WeakMapConstructor.cpp */; };
@@ -1898,7 +1898,7 @@
BC18C45A0E16F5CD00B34460 /* RegExp.h in Headers */ = {isa = PBXBuildFile; fileRef = F692A87E0255597D01FF60F7 /* RegExp.h */; settings = {ATTRIBUTES = (Private, ); }; };
BC18C45B0E16F5CD00B34460 /* RegExpObject.h in Headers */ = {isa = PBXBuildFile; fileRef = F692A87C0255597D01FF60F7 /* RegExpObject.h */; settings = {ATTRIBUTES = (Private, ); }; };
BC18C45D0E16F5CD00B34460 /* Register.h in Headers */ = {isa = PBXBuildFile; fileRef = 149B24FF0D8AF6D1009CB8C7 /* Register.h */; settings = {ATTRIBUTES = (Private, ); }; };
- BC18C45E0E16F5CD00B34460 /* JSStack.h in Headers */ = {isa = PBXBuildFile; fileRef = 14D792640DAA03FB001A9F05 /* JSStack.h */; settings = {ATTRIBUTES = (Private, ); }; };
+ BC18C45E0E16F5CD00B34460 /* CLoopStack.h in Headers */ = {isa = PBXBuildFile; fileRef = 14D792640DAA03FB001A9F05 /* CLoopStack.h */; settings = {ATTRIBUTES = (Private, ); }; };
BC18C4630E16F5CD00B34460 /* SourceProvider.h in Headers */ = {isa = PBXBuildFile; fileRef = 65E866ED0DD59AFA00A2B2A1 /* SourceProvider.h */; settings = {ATTRIBUTES = (Private, ); }; };
BC18C4640E16F5CD00B34460 /* SourceCode.h in Headers */ = {isa = PBXBuildFile; fileRef = 65E866EE0DD59AFA00A2B2A1 /* SourceCode.h */; settings = {ATTRIBUTES = (Private, ); }; };
BC18C4660E16F5CD00B34460 /* StringConstructor.h in Headers */ = {isa = PBXBuildFile; fileRef = BC18C3C10E16EE3300B34460 /* StringConstructor.h */; };
@@ -3150,7 +3150,7 @@
142711380A460BBB0080EEEA /* JSBase.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSBase.h; sourceTree = "<group>"; };
1429D77B0ED20D7300B89619 /* Interpreter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Interpreter.h; sourceTree = "<group>"; };
1429D7D30ED2128200B89619 /* Interpreter.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Interpreter.cpp; sourceTree = "<group>"; };
- 1429D85B0ED218E900B89619 /* JSStack.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSStack.cpp; sourceTree = "<group>"; };
+ 1429D85B0ED218E900B89619 /* CLoopStack.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CLoopStack.cpp; sourceTree = "<group>"; };
1429D8770ED21ACD00B89619 /* ExceptionHelpers.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ExceptionHelpers.cpp; sourceTree = "<group>"; };
1429D8DB0ED2205B00B89619 /* CallFrame.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CallFrame.cpp; sourceTree = "<group>"; };
1429D8DC0ED2205B00B89619 /* CallFrame.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; lineEnding = 0; path = CallFrame.h; sourceTree = "<group>"; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; };
@@ -3232,7 +3232,7 @@
14CA958C16AB50FA00938A06 /* ObjectAllocationProfile.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ObjectAllocationProfile.h; sourceTree = "<group>"; };
14D2F3D8139F4BE200491031 /* MarkedSpace.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = MarkedSpace.cpp; sourceTree = "<group>"; };
14D2F3D9139F4BE200491031 /* MarkedSpace.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MarkedSpace.h; sourceTree = "<group>"; };
- 14D792640DAA03FB001A9F05 /* JSStack.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSStack.h; sourceTree = "<group>"; };
+ 14D792640DAA03FB001A9F05 /* CLoopStack.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CLoopStack.h; sourceTree = "<group>"; };
14D844A216AA2C7000A65AF0 /* PrototypeMap.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = PrototypeMap.cpp; sourceTree = "<group>"; };
14D844A316AA2C7000A65AF0 /* PrototypeMap.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PrototypeMap.h; sourceTree = "<group>"; };
14D857740A4696C80032146C /* testapi.js */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.javascript; name = testapi.js; path = API/tests/testapi.js; sourceTree = "<group>"; };
@@ -4007,7 +4007,7 @@
A7C0C4AA167C08CD0017011D /* JSScriptRef.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSScriptRef.cpp; sourceTree = "<group>"; };
A7C0C4AB167C08CD0017011D /* JSScriptRefPrivate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSScriptRefPrivate.h; sourceTree = "<group>"; };
A7C1E8C8112E701C00A37F98 /* JITPropertyAccess32_64.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JITPropertyAccess32_64.cpp; sourceTree = "<group>"; };
- A7C1EAEB17987AB600299DB2 /* JSStackInlines.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSStackInlines.h; sourceTree = "<group>"; };
+ A7C1EAEB17987AB600299DB2 /* CLoopStackInlines.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CLoopStackInlines.h; sourceTree = "<group>"; };
A7C1EAEC17987AB600299DB2 /* StackVisitor.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; lineEnding = 0; path = StackVisitor.cpp; sourceTree = "<group>"; };
A7C1EAED17987AB600299DB2 /* StackVisitor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = StackVisitor.h; sourceTree = "<group>"; };
A7C225CC139981F100FF1662 /* KeywordLookupGenerator.py */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.python; path = KeywordLookupGenerator.py; sourceTree = "<group>"; };
@@ -5000,15 +5000,15 @@
children = (
0F55F0F114D1063600AC7649 /* AbstractPC.cpp */,
0F55F0F214D1063600AC7649 /* AbstractPC.h */,
+ 1429D85B0ED218E900B89619 /* CLoopStack.cpp */,
+ 14D792640DAA03FB001A9F05 /* CLoopStack.h */,
+ A7C1EAEB17987AB600299DB2 /* CLoopStackInlines.h */,
A7F8690E0F9584A100558697 /* CachedCall.h */,
1429D8DB0ED2205B00B89619 /* CallFrame.cpp */,
1429D8DC0ED2205B00B89619 /* CallFrame.h */,
A7F869EC0F95C2EC00558697 /* CallFrameClosure.h */,
1429D7D30ED2128200B89619 /* Interpreter.cpp */,
1429D77B0ED20D7300B89619 /* Interpreter.h */,
- 1429D85B0ED218E900B89619 /* JSStack.cpp */,
- 14D792640DAA03FB001A9F05 /* JSStack.h */,
- A7C1EAEB17987AB600299DB2 /* JSStackInlines.h */,
65FB5116184EE9BC00C12B70 /* ProtoCallFrame.cpp */,
65FB5115184EE8F800C12B70 /* ProtoCallFrame.h */,
149B24FF0D8AF6D1009CB8C7 /* Register.h */,
@@ -7805,8 +7805,8 @@
0F919D11157F332C004A4E7D /* JSSegmentedVariableObject.h in Headers */,
A7299D9E17D12837005F5FF9 /* JSSet.h in Headers */,
A790DD70182F499700588807 /* JSSetIterator.h in Headers */,
- BC18C45E0E16F5CD00B34460 /* JSStack.h in Headers */,
- A7C1EAF017987AB600299DB2 /* JSStackInlines.h in Headers */,
+ BC18C45E0E16F5CD00B34460 /* CLoopStack.h in Headers */,
+ A7C1EAF017987AB600299DB2 /* CLoopStackInlines.h in Headers */,
BC18C4270E16F5CD00B34460 /* JSString.h in Headers */,
86E85539111B9968001AF51E /* JSStringBuilder.h in Headers */,
70EC0EC31AA0D7DA00B6AAFA /* JSStringIterator.h in Headers */,
@@ -9218,7 +9218,7 @@
DC17E8171C9C91D6008A6AB3 /* ShadowChicken.cpp in Sources */,
A7299D9D17D12837005F5FF9 /* JSSet.cpp in Sources */,
A790DD6F182F499700588807 /* JSSetIterator.cpp in Sources */,
- 1428083A107EC0750013E7B2 /* JSStack.cpp in Sources */,
+ 1428083A107EC0750013E7B2 /* CLoopStack.cpp in Sources */,
147F39D5107EC37600427A48 /* JSString.cpp in Sources */,
70EC0EC21AA0D7DA00B6AAFA /* JSStringIterator.cpp in Sources */,
0F9D4C101C3E2C74006CD984 /* FTLPatchpointExceptionHandle.cpp in Sources */,
diff --git a/Source/JavaScriptCore/assembler/MaxFrameExtentForSlowPathCall.h b/Source/JavaScriptCore/assembler/MaxFrameExtentForSlowPathCall.h
index 39ed6fa..bd93599 100644
--- a/Source/JavaScriptCore/assembler/MaxFrameExtentForSlowPathCall.h
+++ b/Source/JavaScriptCore/assembler/MaxFrameExtentForSlowPathCall.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2013 Apple Inc. All rights reserved.
+ * Copyright (C) 2013, 2016 Apple Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
@@ -26,7 +26,6 @@
#ifndef MaxFrameExtentForSlowPathCall_h
#define MaxFrameExtentForSlowPathCall_h
-#include "JSStack.h"
#include "Register.h"
#include "StackAlignment.h"
#include <wtf/Assertions.h>
diff --git a/Source/JavaScriptCore/bytecode/BytecodeConventions.h b/Source/JavaScriptCore/bytecode/BytecodeConventions.h
index e375f26..6b1c50b 100644
--- a/Source/JavaScriptCore/bytecode/BytecodeConventions.h
+++ b/Source/JavaScriptCore/bytecode/BytecodeConventions.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2012 Apple Inc. All rights reserved.
+ * Copyright (C) 2012, 2016 Apple Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
@@ -27,7 +27,7 @@
#define BytecodeConventions_h
// Register numbers used in bytecode operations have different meaning according to their ranges:
-// 0x80000000-0xFFFFFFFF Negative indices from the CallFrame pointer are entries in the call frame, see JSStack.h.
+// 0x80000000-0xFFFFFFFF Negative indices from the CallFrame pointer are entries in the call frame.
// 0x00000000-0x3FFFFFFF Forwards indices from the CallFrame pointer are local vars and temporaries with the function's callframe.
// 0x40000000-0x7FFFFFFF Positive indices from 0x40000000 specify entries in the constant pool on the CodeBlock.
static const int FirstConstantRegisterIndex = 0x40000000;
diff --git a/Source/JavaScriptCore/dfg/DFGGraph.h b/Source/JavaScriptCore/dfg/DFGGraph.h
index 0703618..fc238d8 100644
--- a/Source/JavaScriptCore/dfg/DFGGraph.h
+++ b/Source/JavaScriptCore/dfg/DFGGraph.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2011-2015 Apple Inc. All rights reserved.
+ * Copyright (C) 2011-2016 Apple Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
@@ -41,7 +41,6 @@
#include "DFGPropertyTypeKey.h"
#include "DFGScannable.h"
#include "FullBytecodeLiveness.h"
-#include "JSStack.h"
#include "MethodOfGettingAValueProfile.h"
#include <unordered_map>
#include <wtf/BitVector.h>
diff --git a/Source/JavaScriptCore/dfg/DFGOSREntry.cpp b/Source/JavaScriptCore/dfg/DFGOSREntry.cpp
index e2e0600..205b678 100644
--- a/Source/JavaScriptCore/dfg/DFGOSREntry.cpp
+++ b/Source/JavaScriptCore/dfg/DFGOSREntry.cpp
@@ -33,8 +33,8 @@
#include "DFGJITCode.h"
#include "DFGNode.h"
#include "JIT.h"
-#include "JSStackInlines.h"
#include "JSCInlines.h"
+#include "VMInlines.h"
#include <wtf/CommaPrinter.h>
namespace JSC { namespace DFG {
@@ -244,7 +244,7 @@
// would have otherwise just kept running albeit less quickly.
unsigned frameSizeForCheck = jitCode->common.requiredRegisterCountForExecutionAndExit();
- if (!vm->interpreter->stack().ensureCapacityFor(&exec->registers()[virtualRegisterForLocal(frameSizeForCheck - 1).offset()])) {
+ if (UNLIKELY(!vm->ensureStackCapacityFor(&exec->registers()[virtualRegisterForLocal(frameSizeForCheck - 1).offset()]))) {
if (Options::verboseOSR())
dataLogF(" OSR failed because stack growth failed.\n");
return 0;
diff --git a/Source/JavaScriptCore/ftl/FTLOSREntry.cpp b/Source/JavaScriptCore/ftl/FTLOSREntry.cpp
index 601b460..9a391e3 100644
--- a/Source/JavaScriptCore/ftl/FTLOSREntry.cpp
+++ b/Source/JavaScriptCore/ftl/FTLOSREntry.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2013, 2014 Apple Inc. All rights reserved.
+ * Copyright (C) 2013-2014, 2016 Apple Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
@@ -30,9 +30,9 @@
#include "CodeBlock.h"
#include "DFGJITCode.h"
#include "FTLForOSREntryJITCode.h"
-#include "JSStackInlines.h"
#include "OperandsInlines.h"
#include "JSCInlines.h"
+#include "VMInlines.h"
#if ENABLE(FTL_JIT)
@@ -92,7 +92,7 @@
scratch[local] = JSValue::encode(values.local(local));
int stackFrameSize = entryCode->common.requiredRegisterCountForExecutionAndExit();
- if (!vm.interpreter->stack().ensureCapacityFor(&exec->registers()[virtualRegisterForLocal(stackFrameSize - 1).offset()])) {
+ if (UNLIKELY(!vm.ensureStackCapacityFor(&exec->registers()[virtualRegisterForLocal(stackFrameSize - 1).offset()]))) {
if (Options::verboseOSR())
dataLog(" OSR failed because stack growth failed.\n");
return 0;
diff --git a/Source/JavaScriptCore/heap/Heap.cpp b/Source/JavaScriptCore/heap/Heap.cpp
index 14cda7a..5c0f186 100644
--- a/Source/JavaScriptCore/heap/Heap.cpp
+++ b/Source/JavaScriptCore/heap/Heap.cpp
@@ -486,11 +486,6 @@
m_slotVisitor.finalizeUnconditionalFinalizers();
}
-inline JSStack& Heap::stack()
-{
- return m_vm->interpreter->stack();
-}
-
void Heap::willStartIterating()
{
m_objectSpace.willStartIterating();
@@ -681,7 +676,7 @@
{
#if !ENABLE(JIT)
GCPHASE(GatherJSStackRoots);
- stack().gatherConservativeRoots(roots, m_jitStubRoutines, m_codeBlocks);
+ m_vm->interpreter->cloopStack().gatherConservativeRoots(roots, m_jitStubRoutines, m_codeBlocks);
#else
UNUSED_PARAM(roots);
#endif
diff --git a/Source/JavaScriptCore/heap/Heap.h b/Source/JavaScriptCore/heap/Heap.h
index 56ee7fb..1a9635d 100644
--- a/Source/JavaScriptCore/heap/Heap.h
+++ b/Source/JavaScriptCore/heap/Heap.h
@@ -66,7 +66,6 @@
class IncrementalSweeper;
class JITStubRoutine;
class JSCell;
-class JSStack;
class JSValue;
class LLIntOffsetsExtractor;
class MarkedArgumentBuffer;
@@ -355,8 +354,6 @@
bool shouldDoFullCollection(HeapOperation requestedCollectionType) const;
- JSStack& stack();
-
void incrementDeferralDepth();
void decrementDeferralDepth();
void decrementDeferralDepthAndGCIfNeeded();
diff --git a/Source/JavaScriptCore/interpreter/JSStack.cpp b/Source/JavaScriptCore/interpreter/CLoopStack.cpp
similarity index 78%
rename from Source/JavaScriptCore/interpreter/JSStack.cpp
rename to Source/JavaScriptCore/interpreter/CLoopStack.cpp
index eb01ec8..ec7fee3 100644
--- a/Source/JavaScriptCore/interpreter/JSStack.cpp
+++ b/Source/JavaScriptCore/interpreter/CLoopStack.cpp
@@ -27,8 +27,11 @@
*/
#include "config.h"
-#include "JSStackInlines.h"
+#include "CLoopStack.h"
+#if !ENABLE(JIT)
+
+#include "CLoopStackInlines.h"
#include "ConservativeRoots.h"
#include "Interpreter.h"
#include "JSCInlines.h"
@@ -37,7 +40,6 @@
namespace JSC {
-#if !ENABLE(JIT)
static size_t committedBytesCount = 0;
static size_t commitSize()
@@ -47,17 +49,13 @@
}
static StaticLock stackStatisticsMutex;
-#endif // !ENABLE(JIT)
-JSStack::JSStack(VM& vm)
+CLoopStack::CLoopStack(VM& vm)
: m_vm(vm)
, m_topCallFrame(vm.topCallFrame)
-#if !ENABLE(JIT)
, m_end(0)
, m_reservedZoneSizeInRegisters(0)
-#endif
{
-#if !ENABLE(JIT)
size_t capacity = Options::maxPerThreadStackUsage();
ASSERT(capacity && isPageAligned(capacity));
@@ -66,13 +64,11 @@
m_commitTop = highAddress();
m_lastStackTop = baseOfStack();
-#endif // !ENABLE(JIT)
m_topCallFrame = 0;
}
-#if !ENABLE(JIT)
-JSStack::~JSStack()
+CLoopStack::~CLoopStack()
{
ptrdiff_t sizeToDecommit = reinterpret_cast<char*>(highAddress()) - reinterpret_cast<char*>(m_commitTop);
m_reservation.decommit(reinterpret_cast<void*>(m_commitTop), sizeToDecommit);
@@ -80,7 +76,7 @@
m_reservation.deallocate();
}
-bool JSStack::growSlowCase(Register* newTopOfStack)
+bool CLoopStack::grow(Register* newTopOfStack)
{
Register* newTopOfStackWithReservedZone = newTopOfStack - m_reservedZoneSizeInRegisters;
@@ -108,12 +104,12 @@
return true;
}
-void JSStack::gatherConservativeRoots(ConservativeRoots& conservativeRoots, JITStubRoutineSet& jitStubRoutines, CodeBlockSet& codeBlocks)
+void CLoopStack::gatherConservativeRoots(ConservativeRoots& conservativeRoots, JITStubRoutineSet& jitStubRoutines, CodeBlockSet& codeBlocks)
{
conservativeRoots.add(topOfStack() + 1, highAddress(), jitStubRoutines, codeBlocks);
}
-void JSStack::sanitizeStack()
+void CLoopStack::sanitizeStack()
{
#if !ASAN_ENABLED
ASSERT(topOfStack() <= baseOfStack());
@@ -128,7 +124,7 @@
#endif
}
-void JSStack::releaseExcessCapacity()
+void CLoopStack::releaseExcessCapacity()
{
Register* highAddressWithReservedZone = highAddress() - m_reservedZoneSizeInRegisters;
ptrdiff_t delta = reinterpret_cast<char*>(highAddressWithReservedZone) - reinterpret_cast<char*>(m_commitTop);
@@ -137,48 +133,26 @@
m_commitTop = highAddressWithReservedZone;
}
-void JSStack::addToCommittedByteCount(long byteCount)
+void CLoopStack::addToCommittedByteCount(long byteCount)
{
LockHolder locker(stackStatisticsMutex);
ASSERT(static_cast<long>(committedBytesCount) + byteCount > -1);
committedBytesCount += byteCount;
}
-void JSStack::setReservedZoneSize(size_t reservedZoneSize)
+void CLoopStack::setReservedZoneSize(size_t reservedZoneSize)
{
m_reservedZoneSizeInRegisters = reservedZoneSize / sizeof(Register);
if (m_commitTop >= (m_end + 1) - m_reservedZoneSizeInRegisters)
- growSlowCase(m_end + 1);
-}
-#endif // !ENABLE(JIT)
-
-#if ENABLE(JIT)
-Register* JSStack::lowAddress() const
-{
- ASSERT(wtfThreadData().stack().isGrowingDownward());
- return reinterpret_cast<Register*>(m_vm.osStackLimitWithReserve());
+ grow(m_end + 1);
}
-Register* JSStack::highAddress() const
+size_t CLoopStack::committedByteCount()
{
- ASSERT(wtfThreadData().stack().isGrowingDownward());
- return reinterpret_cast<Register*>(wtfThreadData().stack().origin());
-}
-#endif // ENABLE(JIT)
-
-size_t JSStack::committedByteCount()
-{
-#if !ENABLE(JIT)
LockHolder locker(stackStatisticsMutex);
return committedBytesCount;
-#else
- // When using the C stack, we don't know how many stack pages are actually
- // committed. So, we use the current stack usage as an estimate.
- ASSERT(wtfThreadData().stack().isGrowingDownward());
- int8_t* current = reinterpret_cast<int8_t*>(¤t);
- int8_t* high = reinterpret_cast<int8_t*>(wtfThreadData().stack().origin());
- return high - current;
-#endif
}
} // namespace JSC
+
+#endif // !ENABLE(JIT)
diff --git a/Source/JavaScriptCore/interpreter/JSStack.h b/Source/JavaScriptCore/interpreter/CLoopStack.h
similarity index 89%
rename from Source/JavaScriptCore/interpreter/JSStack.h
rename to Source/JavaScriptCore/interpreter/CLoopStack.h
index f068ac3..ac08a2f 100644
--- a/Source/JavaScriptCore/interpreter/JSStack.h
+++ b/Source/JavaScriptCore/interpreter/CLoopStack.h
@@ -26,8 +26,9 @@
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-#ifndef JSStack_h
-#define JSStack_h
+#pragma once
+
+#if !ENABLE(JIT)
#include "Register.h"
#include <wtf/Noncopyable.h>
@@ -42,22 +43,20 @@
class VM;
class LLIntOffsetsExtractor;
- class JSStack {
- WTF_MAKE_NONCOPYABLE(JSStack);
+ class CLoopStack {
+ WTF_MAKE_NONCOPYABLE(CLoopStack);
public:
// Allow 8k of excess registers before we start trying to reap the stack
static const ptrdiff_t maxExcessCapacity = 8 * 1024;
- JSStack(VM&);
+ CLoopStack(VM&);
+ ~CLoopStack();
bool ensureCapacityFor(Register* newTopOfStack);
bool containsAddress(Register* address) { return (lowAddress() <= address && address < highAddress()); }
static size_t committedByteCount();
-#if !ENABLE(JIT)
- ~JSStack();
-
void gatherConservativeRoots(ConservativeRoots&, JITStubRoutineSet&, CodeBlockSet&);
void sanitizeStack();
@@ -71,11 +70,9 @@
void setReservedZoneSize(size_t);
inline Register* topOfStack();
-#endif // ENABLE(JIT)
private:
-#if !ENABLE(JIT)
Register* lowAddress() const
{
return m_end + 1;
@@ -85,12 +82,7 @@
{
return reinterpret_cast_ptr<Register*>(static_cast<char*>(m_reservation.base()) + m_reservation.size());
}
-#else
- Register* lowAddress() const;
- Register* highAddress() const;
-#endif // !ENABLE(JIT)
-#if !ENABLE(JIT)
inline Register* topOfFrameFor(CallFrame*);
Register* reservationTop() const
@@ -100,27 +92,23 @@
}
bool grow(Register* newTopOfStack);
- bool growSlowCase(Register* newTopOfStack);
void shrink(Register* newTopOfStack);
void releaseExcessCapacity();
void addToCommittedByteCount(long);
void setCLoopStackLimit(Register* newTopOfStack);
-#endif // !ENABLE(JIT)
VM& m_vm;
CallFrame*& m_topCallFrame;
-#if !ENABLE(JIT)
Register* m_end;
Register* m_commitTop;
PageReservation m_reservation;
Register* m_lastStackTop;
ptrdiff_t m_reservedZoneSizeInRegisters;
-#endif // !ENABLE(JIT)
friend class LLIntOffsetsExtractor;
};
} // namespace JSC
-#endif // JSStack_h
+#endif // !ENABLE(JIT)
diff --git a/Source/JavaScriptCore/interpreter/JSStackInlines.h b/Source/JavaScriptCore/interpreter/CLoopStackInlines.h
similarity index 78%
rename from Source/JavaScriptCore/interpreter/JSStackInlines.h
rename to Source/JavaScriptCore/interpreter/CLoopStackInlines.h
index 206b257..b8b5bb8 100644
--- a/Source/JavaScriptCore/interpreter/JSStackInlines.h
+++ b/Source/JavaScriptCore/interpreter/CLoopStackInlines.h
@@ -23,41 +23,38 @@
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-#ifndef JSStackInlines_h
-#define JSStackInlines_h
+#pragma once
+#if !ENABLE(JIT)
+
+#include "CLoopStack.h"
#include "CallFrame.h"
#include "CodeBlock.h"
-#include "JSStack.h"
#include "VM.h"
namespace JSC {
-inline bool JSStack::ensureCapacityFor(Register* newTopOfStack)
+inline bool CLoopStack::ensureCapacityFor(Register* newTopOfStack)
{
-#if !ENABLE(JIT)
+ Register* newEnd = newTopOfStack - 1;
+ if (newEnd >= m_end)
+ return true;
return grow(newTopOfStack);
-#else
- ASSERT(wtfThreadData().stack().isGrowingDownward());
- return newTopOfStack >= m_vm.osStackLimitWithReserve();
-#endif
}
-#if !ENABLE(JIT)
-
-inline Register* JSStack::topOfFrameFor(CallFrame* frame)
+inline Register* CLoopStack::topOfFrameFor(CallFrame* frame)
{
if (UNLIKELY(!frame))
return baseOfStack();
return frame->topOfFrame() - 1;
}
-inline Register* JSStack::topOfStack()
+inline Register* CLoopStack::topOfStack()
{
return topOfFrameFor(m_topCallFrame);
}
-inline void JSStack::shrink(Register* newTopOfStack)
+inline void CLoopStack::shrink(Register* newTopOfStack)
{
Register* newEnd = newTopOfStack - 1;
if (newEnd >= m_end)
@@ -66,29 +63,19 @@
// Note: Clang complains of an unresolved linkage to maxExcessCapacity if
// invoke std::max() with it as an argument. To work around this, we first
// assign the constant to a local variable, and use the local instead.
- ptrdiff_t maxExcessCapacity = JSStack::maxExcessCapacity;
+ ptrdiff_t maxExcessCapacity = CLoopStack::maxExcessCapacity;
ptrdiff_t maxExcessInRegisters = std::max(maxExcessCapacity, m_reservedZoneSizeInRegisters);
if (m_end == baseOfStack() && (highAddress() - m_commitTop) >= maxExcessInRegisters)
releaseExcessCapacity();
}
-inline bool JSStack::grow(Register* newTopOfStack)
-{
- Register* newEnd = newTopOfStack - 1;
- if (newEnd >= m_end)
- return true;
- return growSlowCase(newTopOfStack);
-}
-
-inline void JSStack::setCLoopStackLimit(Register* newTopOfStack)
+inline void CLoopStack::setCLoopStackLimit(Register* newTopOfStack)
{
Register* newEnd = newTopOfStack - 1;
m_end = newEnd;
m_vm.setCLoopStackLimit(newTopOfStack);
}
-#endif // !ENABLE(JIT)
-
} // namespace JSC
-#endif // JSStackInlines_h
+#endif // !ENABLE(JIT)
diff --git a/Source/JavaScriptCore/interpreter/CallFrame.cpp b/Source/JavaScriptCore/interpreter/CallFrame.cpp
index 477926d..16e5799 100644
--- a/Source/JavaScriptCore/interpreter/CallFrame.cpp
+++ b/Source/JavaScriptCore/interpreter/CallFrame.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2008, 2013, 2014 Apple Inc. All Rights Reserved.
+ * Copyright (C) 2008, 2013-2014, 2016 Apple Inc. All Rights Reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
@@ -103,14 +103,6 @@
return CallSiteIndex(unsafeCallSiteAsRawBits());
}
-#ifndef NDEBUG
-JSStack* CallFrame::stack()
-{
- return &interpreter()->stack();
-}
-
-#endif
-
#if USE(JSVALUE32_64)
Instruction* CallFrame::currentVPC() const
{
diff --git a/Source/JavaScriptCore/interpreter/CallFrame.h b/Source/JavaScriptCore/interpreter/CallFrame.h
index 4a47b8d..33354f0 100644
--- a/Source/JavaScriptCore/interpreter/CallFrame.h
+++ b/Source/JavaScriptCore/interpreter/CallFrame.h
@@ -270,9 +270,6 @@
private:
-#ifndef NDEBUG
- JSStack* stack();
-#endif
ExecState();
~ExecState();
@@ -301,10 +298,6 @@
CallerFrameAndPC& callerFrameAndPC() { return *reinterpret_cast<CallerFrameAndPC*>(this); }
const CallerFrameAndPC& callerFrameAndPC() const { return *reinterpret_cast<const CallerFrameAndPC*>(this); }
SUPPRESS_ASAN const CallerFrameAndPC& unsafeCallerFrameAndPC() const { return *reinterpret_cast<const CallerFrameAndPC*>(this); }
-
-#if !ENABLE(JIT)
- friend class JSStack;
-#endif
};
} // namespace JSC
diff --git a/Source/JavaScriptCore/interpreter/Interpreter.cpp b/Source/JavaScriptCore/interpreter/Interpreter.cpp
index 7d47ecd..c1d1de3 100644
--- a/Source/JavaScriptCore/interpreter/Interpreter.cpp
+++ b/Source/JavaScriptCore/interpreter/Interpreter.cpp
@@ -48,7 +48,6 @@
#include "JSCInlines.h"
#include "JSLexicalEnvironment.h"
#include "JSModuleEnvironment.h"
-#include "JSStackInlines.h"
#include "JSString.h"
#include "JSWithScope.h"
#include "LLIntCLoop.h"
@@ -235,22 +234,22 @@
return length;
}
-unsigned sizeFrameForForwardArguments(CallFrame* callFrame, JSStack* stack, unsigned numUsedStackSlots)
+unsigned sizeFrameForForwardArguments(CallFrame* callFrame, VM& vm, unsigned numUsedStackSlots)
{
unsigned length = callFrame->argumentCount();
CallFrame* calleeFrame = calleeFrameForVarargs(callFrame, numUsedStackSlots, length + 1);
- if (!stack->ensureCapacityFor(calleeFrame->registers()))
+ if (UNLIKELY(!vm.ensureStackCapacityFor(calleeFrame->registers())))
throwStackOverflowError(callFrame);
return length;
}
-unsigned sizeFrameForVarargs(CallFrame* callFrame, JSStack* stack, JSValue arguments, unsigned numUsedStackSlots, uint32_t firstVarArgOffset)
+unsigned sizeFrameForVarargs(CallFrame* callFrame, VM& vm, JSValue arguments, unsigned numUsedStackSlots, uint32_t firstVarArgOffset)
{
unsigned length = sizeOfVarargs(callFrame, arguments, firstVarArgOffset);
CallFrame* calleeFrame = calleeFrameForVarargs(callFrame, numUsedStackSlots, length + 1);
- if (length > maxArguments || !stack->ensureCapacityFor(calleeFrame->registers())) {
+ if (UNLIKELY(length > maxArguments || !vm.ensureStackCapacityFor(calleeFrame->registers()))) {
throwStackOverflowError(callFrame);
return 0;
}
@@ -323,7 +322,9 @@
Interpreter::Interpreter(VM& vm)
: m_vm(vm)
- , m_stack(vm)
+#if !ENABLE(JIT)
+ , m_cloopStack(vm)
+#endif
, m_errorHandlingModeReentry(0)
#if !ASSERT_DISABLED
, m_initialized(false)
diff --git a/Source/JavaScriptCore/interpreter/Interpreter.h b/Source/JavaScriptCore/interpreter/Interpreter.h
index db68271..d2094de 100644
--- a/Source/JavaScriptCore/interpreter/Interpreter.h
+++ b/Source/JavaScriptCore/interpreter/Interpreter.h
@@ -34,7 +34,6 @@
#include "JSCJSValue.h"
#include "JSCell.h"
#include "JSObject.h"
-#include "JSStack.h"
#include "Opcode.h"
#include "SourceProvider.h"
#include "StackAlignment.h"
@@ -42,6 +41,11 @@
#include <wtf/HashMap.h>
#include <wtf/text/StringBuilder.h>
+#if !ENABLE(JIT)
+#include "CLoopStack.h"
+#endif
+
+
namespace JSC {
class CodeBlock;
@@ -180,7 +184,9 @@
void initialize();
- JSStack& stack() { return m_stack; }
+#if !ENABLE(JIT)
+ CLoopStack& cloopStack() { return m_cloopStack; }
+#endif
Opcode getOpcode(OpcodeID id)
{
@@ -241,7 +247,9 @@
bool isCallBytecode(Opcode opcode) { return opcode == getOpcode(op_call) || opcode == getOpcode(op_construct) || opcode == getOpcode(op_call_eval) || opcode == getOpcode(op_tail_call); }
VM& m_vm;
- JSStack m_stack;
+#if !ENABLE(JIT)
+ CLoopStack m_cloopStack;
+#endif
int m_errorHandlingModeReentry;
#if ENABLE(COMPUTED_GOTO_OPCODES)
@@ -273,8 +281,8 @@
unsigned sizeOfVarargs(CallFrame* exec, JSValue arguments, uint32_t firstVarArgOffset);
static const unsigned maxArguments = 0x10000;
- unsigned sizeFrameForVarargs(CallFrame* exec, JSStack*, JSValue arguments, unsigned numUsedStackSlots, uint32_t firstVarArgOffset);
- unsigned sizeFrameForForwardArguments(CallFrame* exec, JSStack*, unsigned numUsedStackSlots);
+ unsigned sizeFrameForVarargs(CallFrame* exec, VM&, JSValue arguments, unsigned numUsedStackSlots, uint32_t firstVarArgOffset);
+ unsigned sizeFrameForForwardArguments(CallFrame* exec, VM&, unsigned numUsedStackSlots);
void loadVarargs(CallFrame* execCaller, VirtualRegister firstElementDest, JSValue source, uint32_t offset, uint32_t length);
void setupVarargsFrame(CallFrame* execCaller, CallFrame* execCallee, JSValue arguments, uint32_t firstVarArgOffset, uint32_t length);
void setupVarargsFrameAndSetThis(CallFrame* execCaller, CallFrame* execCallee, JSValue thisValue, JSValue arguments, uint32_t firstVarArgOffset, uint32_t length);
diff --git a/Source/JavaScriptCore/interpreter/StackVisitor.cpp b/Source/JavaScriptCore/interpreter/StackVisitor.cpp
index 5b5ce0f..f150445 100644
--- a/Source/JavaScriptCore/interpreter/StackVisitor.cpp
+++ b/Source/JavaScriptCore/interpreter/StackVisitor.cpp
@@ -424,6 +424,7 @@
indent--;
}
+ out.print(indent, "vmEntryFrame: ", RawPointer(vmEntryFrame()), "\n");
indent--;
}
out.print(indent, "}\n");
diff --git a/Source/JavaScriptCore/jit/JIT.h b/Source/JavaScriptCore/jit/JIT.h
index c133734..7311dfa 100644
--- a/Source/JavaScriptCore/jit/JIT.h
+++ b/Source/JavaScriptCore/jit/JIT.h
@@ -59,7 +59,6 @@
class Identifier;
class Interpreter;
class JSScope;
- class JSStack;
class MarkedAllocator;
class Register;
class StructureChain;
diff --git a/Source/JavaScriptCore/jit/JITOperations.cpp b/Source/JavaScriptCore/jit/JITOperations.cpp
index eb4e381..b567423 100644
--- a/Source/JavaScriptCore/jit/JITOperations.cpp
+++ b/Source/JavaScriptCore/jit/JITOperations.cpp
@@ -51,7 +51,6 @@
#include "JSGlobalObjectFunctions.h"
#include "JSLexicalEnvironment.h"
#include "JSPropertyNameEnumerator.h"
-#include "JSStackInlines.h"
#include "JSWithScope.h"
#include "ObjectConstructor.h"
#include "PolymorphicAccess.h"
@@ -129,9 +128,8 @@
int32_t JIT_OPERATION operationCallArityCheck(ExecState* exec)
{
VM* vm = &exec->vm();
- JSStack& stack = vm->interpreter->stack();
- int32_t missingArgCount = CommonSlowPaths::arityCheckFor(exec, &stack, CodeForCall);
+ int32_t missingArgCount = CommonSlowPaths::arityCheckFor(exec, *vm, CodeForCall);
if (missingArgCount < 0) {
VMEntryFrame* vmEntryFrame = vm->topVMEntryFrame;
CallFrame* callerFrame = exec->callerFrame(vmEntryFrame);
@@ -145,9 +143,8 @@
int32_t JIT_OPERATION operationConstructArityCheck(ExecState* exec)
{
VM* vm = &exec->vm();
- JSStack& stack = vm->interpreter->stack();
- int32_t missingArgCount = CommonSlowPaths::arityCheckFor(exec, &stack, CodeForConstruct);
+ int32_t missingArgCount = CommonSlowPaths::arityCheckFor(exec, *vm, CodeForConstruct);
if (missingArgCount < 0) {
VMEntryFrame* vmEntryFrame = vm->topVMEntryFrame;
CallFrame* callerFrame = exec->callerFrame(vmEntryFrame);
@@ -1924,17 +1921,15 @@
{
VM& vm = exec->vm();
NativeCallFrameTracer tracer(&vm, exec);
- JSStack* stack = &exec->interpreter()->stack();
- return sizeFrameForForwardArguments(exec, stack, numUsedStackSlots);
+ return sizeFrameForForwardArguments(exec, vm, numUsedStackSlots);
}
int32_t JIT_OPERATION operationSizeFrameForVarargs(ExecState* exec, EncodedJSValue encodedArguments, int32_t numUsedStackSlots, int32_t firstVarArgOffset)
{
VM& vm = exec->vm();
NativeCallFrameTracer tracer(&vm, exec);
- JSStack* stack = &exec->interpreter()->stack();
JSValue arguments = JSValue::decode(encodedArguments);
- return sizeFrameForVarargs(exec, stack, arguments, numUsedStackSlots, firstVarArgOffset);
+ return sizeFrameForVarargs(exec, vm, arguments, numUsedStackSlots, firstVarArgOffset);
}
CallFrame* JIT_OPERATION operationSetupForwardArgumentsFrame(ExecState* exec, CallFrame* newCallFrame, EncodedJSValue, int32_t, int32_t length)
diff --git a/Source/JavaScriptCore/jit/JSInterfaceJIT.h b/Source/JavaScriptCore/jit/JSInterfaceJIT.h
index 2ee7f72..97ea53b 100644
--- a/Source/JavaScriptCore/jit/JSInterfaceJIT.h
+++ b/Source/JavaScriptCore/jit/JSInterfaceJIT.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2010 Apple Inc. All rights reserved.
+ * Copyright (C) 2010, 2016 Apple Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
@@ -33,7 +33,6 @@
#include "JITCode.h"
#include "JITOperations.h"
#include "JSCJSValue.h"
-#include "JSStack.h"
#include "JSString.h"
#include "MacroAssembler.h"
#include <wtf/Vector.h>
diff --git a/Source/JavaScriptCore/jit/SpecializedThunkJIT.h b/Source/JavaScriptCore/jit/SpecializedThunkJIT.h
index a66ca2e..d18c407 100644
--- a/Source/JavaScriptCore/jit/SpecializedThunkJIT.h
+++ b/Source/JavaScriptCore/jit/SpecializedThunkJIT.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2010 Apple Inc. All rights reserved.
+ * Copyright (C) 2010, 2016 Apple Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
@@ -32,7 +32,6 @@
#include "JIT.h"
#include "JITInlines.h"
#include "JSInterfaceJIT.h"
-#include "JSStack.h"
#include "LinkBuffer.h"
namespace JSC {
diff --git a/Source/JavaScriptCore/jit/ThunkGenerators.cpp b/Source/JavaScriptCore/jit/ThunkGenerators.cpp
index faee40a..7a11ea6 100644
--- a/Source/JavaScriptCore/jit/ThunkGenerators.cpp
+++ b/Source/JavaScriptCore/jit/ThunkGenerators.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2010, 2012, 2013, 2014, 2016 Apple Inc. All rights reserved.
+ * Copyright (C) 2010, 2012-2014, 2016 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,7 +31,6 @@
#include "JITOperations.h"
#include "JSArray.h"
#include "JSBoundFunction.h"
-#include "JSStack.h"
#include "MathCommon.h"
#include "MaxFrameExtentForSlowPathCall.h"
#include "JSCInlines.h"
diff --git a/Source/JavaScriptCore/llint/LLIntOffsetsExtractor.cpp b/Source/JavaScriptCore/llint/LLIntOffsetsExtractor.cpp
index 8eb9a50..307eaf0 100644
--- a/Source/JavaScriptCore/llint/LLIntOffsetsExtractor.cpp
+++ b/Source/JavaScriptCore/llint/LLIntOffsetsExtractor.cpp
@@ -42,7 +42,6 @@
#include "JSGlobalObject.h"
#include "JSModuleRecord.h"
#include "JSObject.h"
-#include "JSStack.h"
#include "JSString.h"
#include "JSTypeInfo.h"
#include "JumpTable.h"
diff --git a/Source/JavaScriptCore/llint/LLIntSlowPaths.cpp b/Source/JavaScriptCore/llint/LLIntSlowPaths.cpp
index b6e7279..9620238 100644
--- a/Source/JavaScriptCore/llint/LLIntSlowPaths.cpp
+++ b/Source/JavaScriptCore/llint/LLIntSlowPaths.cpp
@@ -46,7 +46,6 @@
#include "JSCJSValue.h"
#include "JSGeneratorFunction.h"
#include "JSGlobalObjectFunctions.h"
-#include "JSStackInlines.h"
#include "JSString.h"
#include "JSWithScope.h"
#include "LLIntCommon.h"
@@ -498,8 +497,8 @@
// Hence, if we get here, then we know a stack overflow is imminent. So, just
// throw the StackOverflowError unconditionally.
#if !ENABLE(JIT)
- ASSERT(!vm.interpreter->stack().containsAddress(exec->topOfFrame()));
- if (LIKELY(vm.interpreter->stack().ensureCapacityFor(exec->topOfFrame())))
+ ASSERT(!vm.interpreter->cloopStack().containsAddress(exec->topOfFrame()));
+ if (LIKELY(vm.ensureStackCapacityFor(exec->topOfFrame())))
LLINT_RETURN_TWO(pc, 0);
#endif
@@ -1352,7 +1351,7 @@
// - Set up a call frame while respecting the variable arguments.
unsigned numUsedStackSlots = -pc[5].u.operand;
- unsigned length = sizeFrameForVarargs(exec, &vm.interpreter->stack(),
+ unsigned length = sizeFrameForVarargs(exec, vm,
LLINT_OP_C(4).jsValue(), numUsedStackSlots, pc[6].u.operand);
LLINT_CALL_CHECK_EXCEPTION(exec, exec);
@@ -1371,7 +1370,7 @@
unsigned numUsedStackSlots = -pc[5].u.operand;
- unsigned arguments = sizeFrameForForwardArguments(exec, &vm.interpreter->stack(), numUsedStackSlots);
+ unsigned arguments = sizeFrameForForwardArguments(exec, vm, numUsedStackSlots);
LLINT_CALL_CHECK_EXCEPTION(exec, exec);
ExecState* execCallee = calleeFrameForVarargs(exec, numUsedStackSlots, arguments + 1);
@@ -1629,7 +1628,7 @@
#if !ENABLE(JIT)
extern "C" SlowPathReturnType llint_stack_check_at_vm_entry(VM* vm, Register* newTopOfStack)
{
- bool success = vm->interpreter->stack().ensureCapacityFor(newTopOfStack);
+ bool success = vm->ensureStackCapacityFor(newTopOfStack);
return encodeResult(reinterpret_cast<void*>(success), 0);
}
#endif
diff --git a/Source/JavaScriptCore/llint/LLIntThunks.cpp b/Source/JavaScriptCore/llint/LLIntThunks.cpp
index daaaef5..b6d4817 100644
--- a/Source/JavaScriptCore/llint/LLIntThunks.cpp
+++ b/Source/JavaScriptCore/llint/LLIntThunks.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2012, 2013 Apple Inc. All rights reserved.
+ * Copyright (C) 2012-2013, 2016 Apple Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
@@ -32,7 +32,6 @@
#include "JSCJSValueInlines.h"
#include "JSInterfaceJIT.h"
#include "JSObject.h"
-#include "JSStackInlines.h"
#include "LLIntCLoop.h"
#include "LinkBuffer.h"
#include "LowLevelInterpreter.h"
diff --git a/Source/JavaScriptCore/llint/LowLevelInterpreter.cpp b/Source/JavaScriptCore/llint/LowLevelInterpreter.cpp
index 72bcddf..409604f 100644
--- a/Source/JavaScriptCore/llint/LowLevelInterpreter.cpp
+++ b/Source/JavaScriptCore/llint/LowLevelInterpreter.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2012, 2014 Apple Inc. All rights reserved.
+ * Copyright (C) 2012, 2014, 2016 Apple Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
@@ -330,7 +330,7 @@
CLoopDoubleRegister d0, d1;
lr.opcode = getOpcode(llint_return_to_host);
- sp.vp = vm->interpreter->stack().topOfStack() + 1;
+ sp.vp = vm->interpreter->cloopStack().topOfStack() + 1;
cfr.callFrame = vm->topCallFrame;
#ifndef NDEBUG
void* startSP = sp.vp;
diff --git a/Source/JavaScriptCore/runtime/CommonSlowPaths.cpp b/Source/JavaScriptCore/runtime/CommonSlowPaths.cpp
index a157891..0061245 100644
--- a/Source/JavaScriptCore/runtime/CommonSlowPaths.cpp
+++ b/Source/JavaScriptCore/runtime/CommonSlowPaths.cpp
@@ -178,7 +178,7 @@
SLOW_PATH_DECL(slow_path_call_arityCheck)
{
BEGIN();
- int slotsToAdd = CommonSlowPaths::arityCheckFor(exec, &vm.interpreter->stack(), CodeForCall);
+ int slotsToAdd = CommonSlowPaths::arityCheckFor(exec, vm, CodeForCall);
if (slotsToAdd < 0) {
exec = exec->callerFrame();
ErrorHandlingScope errorScope(exec->vm());
@@ -191,7 +191,7 @@
SLOW_PATH_DECL(slow_path_construct_arityCheck)
{
BEGIN();
- int slotsToAdd = CommonSlowPaths::arityCheckFor(exec, &vm.interpreter->stack(), CodeForConstruct);
+ int slotsToAdd = CommonSlowPaths::arityCheckFor(exec, vm, CodeForConstruct);
if (slotsToAdd < 0) {
exec = exec->callerFrame();
ErrorHandlingScope errorScope(exec->vm());
diff --git a/Source/JavaScriptCore/runtime/CommonSlowPaths.h b/Source/JavaScriptCore/runtime/CommonSlowPaths.h
index 50b5e1e..ebc9130 100644
--- a/Source/JavaScriptCore/runtime/CommonSlowPaths.h
+++ b/Source/JavaScriptCore/runtime/CommonSlowPaths.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2011-2013, 2015 Apple Inc. All rights reserved.
+ * Copyright (C) 2011-2013, 2015-2016 Apple Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
@@ -29,11 +29,10 @@
#include "CodeBlock.h"
#include "CodeSpecializationKind.h"
#include "ExceptionHelpers.h"
-#include "JSStackInlines.h"
#include "SlowPathReturnType.h"
#include "StackAlignment.h"
#include "Symbol.h"
-#include "VM.h"
+#include "VMInlines.h"
#include <wtf/StdLibExtras.h>
namespace JSC {
@@ -52,7 +51,7 @@
void* thunkToCall;
};
-ALWAYS_INLINE int arityCheckFor(ExecState* exec, JSStack* stack, CodeSpecializationKind kind)
+ALWAYS_INLINE int arityCheckFor(ExecState* exec, VM& vm, CodeSpecializationKind kind)
{
JSFunction* callee = jsCast<JSFunction*>(exec->callee());
ASSERT(!callee->isHostFunction());
@@ -65,7 +64,7 @@
newCodeBlock->numParameters() + CallFrame::headerSizeInRegisters);
int paddedStackSpace = alignedFrameSizeForParameters - frameSize;
- if (!stack->ensureCapacityFor(exec->registers() - paddedStackSpace % stackAlignmentRegisters()))
+ if (UNLIKELY(!vm.ensureStackCapacityFor(exec->registers() - paddedStackSpace % stackAlignmentRegisters())))
return -1;
return paddedStackSpace;
}
diff --git a/Source/JavaScriptCore/runtime/ErrorHandlingScope.cpp b/Source/JavaScriptCore/runtime/ErrorHandlingScope.cpp
index beb52a3..9e85313 100644
--- a/Source/JavaScriptCore/runtime/ErrorHandlingScope.cpp
+++ b/Source/JavaScriptCore/runtime/ErrorHandlingScope.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2014 Apple Inc. All rights reserved.
+ * Copyright (C) 2014, 2016 Apple Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
@@ -26,7 +26,6 @@
#include "config.h"
#include "ErrorHandlingScope.h"
-#include "Interpreter.h"
#include "Options.h"
#include "VM.h"
@@ -38,18 +37,12 @@
RELEASE_ASSERT(m_vm.stackPointerAtVMEntry());
size_t newReservedZoneSize = Options::errorModeReservedZoneSize();
m_savedReservedZoneSize = m_vm.updateReservedZoneSize(newReservedZoneSize);
-#if !ENABLE(JIT)
- m_vm.interpreter->stack().setReservedZoneSize(newReservedZoneSize);
-#endif
}
ErrorHandlingScope::~ErrorHandlingScope()
{
RELEASE_ASSERT(m_vm.stackPointerAtVMEntry());
m_vm.updateReservedZoneSize(m_savedReservedZoneSize);
-#if !ENABLE(JIT)
- m_vm.interpreter->stack().setReservedZoneSize(m_savedReservedZoneSize);
-#endif
}
} // namespace JSC
diff --git a/Source/JavaScriptCore/runtime/JSGlobalObject.h b/Source/JavaScriptCore/runtime/JSGlobalObject.h
index 9b9bff7..be8989f 100644
--- a/Source/JavaScriptCore/runtime/JSGlobalObject.h
+++ b/Source/JavaScriptCore/runtime/JSGlobalObject.h
@@ -77,7 +77,6 @@
class JSPromise;
class JSPromiseConstructor;
class JSPromisePrototype;
-class JSStack;
class JSTypedArrayViewConstructor;
class JSTypedArrayViewPrototype;
class LLIntOffsetsExtractor;
diff --git a/Source/JavaScriptCore/runtime/MemoryStatistics.cpp b/Source/JavaScriptCore/runtime/MemoryStatistics.cpp
index ba2cc45..8aa9a75 100644
--- a/Source/JavaScriptCore/runtime/MemoryStatistics.cpp
+++ b/Source/JavaScriptCore/runtime/MemoryStatistics.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2010 Apple Inc. All rights reserved.
+ * Copyright (C) 2010, 2016 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,7 +28,6 @@
#include "ExecutableAllocator.h"
#include "VM.h"
-#include "JSStack.h"
namespace JSC {
@@ -36,7 +35,7 @@
{
GlobalMemoryStatistics stats;
- stats.stackBytes = JSStack::committedByteCount();
+ stats.stackBytes = VM::committedStackByteCount();
#if ENABLE(ASSEMBLER)
stats.JITBytes = ExecutableAllocator::committedByteCount();
#endif
diff --git a/Source/JavaScriptCore/runtime/StackAlignment.h b/Source/JavaScriptCore/runtime/StackAlignment.h
index 25c6b89..8142080 100644
--- a/Source/JavaScriptCore/runtime/StackAlignment.h
+++ b/Source/JavaScriptCore/runtime/StackAlignment.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2013 Apple Inc. All rights reserved.
+ * Copyright (C) 2013, 2016 Apple Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
@@ -27,7 +27,6 @@
#define StackAlignment_h
#include "JSCJSValue.h"
-#include "JSStack.h"
#include <wtf/MathExtras.h>
namespace JSC {
diff --git a/Source/JavaScriptCore/runtime/VM.cpp b/Source/JavaScriptCore/runtime/VM.cpp
index 6f46dd4..d4e7f9d 100644
--- a/Source/JavaScriptCore/runtime/VM.cpp
+++ b/Source/JavaScriptCore/runtime/VM.cpp
@@ -106,6 +106,10 @@
#include <wtf/text/AtomicStringTable.h>
#include <wtf/text/SymbolRegistry.h>
+#if !ENABLE(JIT)
+#include "CLoopStack.h"
+#endif
+
#if ENABLE(DFG_JIT)
#include "ConservativeRoots.h"
#endif
@@ -194,9 +198,6 @@
interpreter = new Interpreter(*this);
StackBounds stack = wtfThreadData().stack();
updateReservedZoneSize(Options::reservedZoneSize());
-#if !ENABLE(JIT)
- interpreter->stack().setReservedZoneSize(Options::reservedZoneSize());
-#endif
setLastStackTop(stack.origin());
// Need to be careful to keep everything consistent here
@@ -616,6 +617,9 @@
{
size_t oldReservedZoneSize = m_reservedZoneSize;
m_reservedZoneSize = reservedZoneSize;
+#if !ENABLE(JIT)
+ interpreter->cloopStack().setReservedZoneSize(reservedZoneSize);
+#endif
updateStackLimit();
@@ -839,10 +843,24 @@
{
logSanitizeStack(vm);
#if !ENABLE(JIT)
- vm->interpreter->stack().sanitizeStack();
+ vm->interpreter->cloopStack().sanitizeStack();
#else
sanitizeStackForVMImpl(vm);
#endif
}
+size_t VM::committedStackByteCount()
+{
+#if ENABLE(JIT)
+ // When using the C stack, we don't know how many stack pages are actually
+ // committed. So, we use the current stack usage as an estimate.
+ ASSERT(wtfThreadData().stack().isGrowingDownward());
+ int8_t* current = reinterpret_cast<int8_t*>(¤t);
+ int8_t* high = reinterpret_cast<int8_t*>(wtfThreadData().stack().origin());
+ return high - current;
+#else
+ return CLoopStack::committedByteCount();
+#endif
+}
+
} // namespace JSC
diff --git a/Source/JavaScriptCore/runtime/VM.h b/Source/JavaScriptCore/runtime/VM.h
index a8c4688..7dd1233 100644
--- a/Source/JavaScriptCore/runtime/VM.h
+++ b/Source/JavaScriptCore/runtime/VM.h
@@ -94,6 +94,7 @@
class LLIntOffsetsExtractor;
class NativeExecutable;
class RegExpCache;
+class Register;
class RegisterAtOffsetList;
#if ENABLE(SAMPLING_PROFILER)
class SamplingProfiler;
@@ -461,6 +462,9 @@
size_t reservedZoneSize() const { return m_reservedZoneSize; }
size_t updateReservedZoneSize(size_t reservedZoneSize);
+ static size_t committedStackByteCount();
+ inline bool ensureStackCapacityFor(Register* newTopOfStack);
+
void* osStackLimitWithReserve() { return m_osStackLimitWithReserve; }
void** addressOfOSStackLimitWithReserve() { return &m_osStackLimitWithReserve; }
#if !ENABLE(JIT)
diff --git a/Source/JavaScriptCore/runtime/VMInlines.h b/Source/JavaScriptCore/runtime/VMInlines.h
index 7f91869..f46c37e 100644
--- a/Source/JavaScriptCore/runtime/VMInlines.h
+++ b/Source/JavaScriptCore/runtime/VMInlines.h
@@ -30,8 +30,23 @@
#include "VM.h"
#include "Watchdog.h"
+#if !ENABLE(JIT)
+#include "CLoopStackInlines.h"
+#endif
+
namespace JSC {
+bool VM::ensureStackCapacityFor(Register* newTopOfStack)
+{
+#if ENABLE(JIT)
+ ASSERT(wtfThreadData().stack().isGrowingDownward());
+ return newTopOfStack >= m_osStackLimitWithReserve;
+#else
+ return interpreter->cloopStack().ensureCapacityFor(newTopOfStack);
+#endif
+
+}
+
bool VM::shouldTriggerTermination(ExecState* exec)
{
if (!watchdog())