[JSC] JSCallee should be in IsoSubspace
https://bugs.webkit.org/show_bug.cgi?id=204961
Reviewed by Mark Lam.
We should put JSCallee in IsoSubspace. Currently, we are also putting JSToWasmICCallee in IsoSusbapce
since it is a derived class of JSCallee, but I think we can remove this class completely. We are tracking
it in [1].
[1]: https://bugs.webkit.org/show_bug.cgi?id=204960
* debugger/DebuggerScope.h:
* interpreter/Interpreter.cpp:
(JSC::Interpreter::executeProgram):
(JSC::Interpreter::execute):
* runtime/JSCallee.h:
(JSC::JSCallee::subspaceFor):
* runtime/JSGlobalObject.h:
(JSC::JSGlobalObject::globalCallee):
* runtime/VM.cpp:
(JSC::VM::VM):
* runtime/VM.h:
* wasm/js/JSToWasmICCallee.h:
(JSC::JSToWasmICCallee::function): Deleted.
(JSC::JSToWasmICCallee::JSToWasmICCallee): Deleted.
git-svn-id: http://svn.webkit.org/repository/webkit/trunk@253233 268f45cc-cd09-0410-ab3c-d52691b4dbfc
diff --git a/Source/JavaScriptCore/ChangeLog b/Source/JavaScriptCore/ChangeLog
index ff56a72..18b6d54 100644
--- a/Source/JavaScriptCore/ChangeLog
+++ b/Source/JavaScriptCore/ChangeLog
@@ -1,3 +1,31 @@
+2019-12-06 Yusuke Suzuki <ysuzuki@apple.com>
+
+ [JSC] JSCallee should be in IsoSubspace
+ https://bugs.webkit.org/show_bug.cgi?id=204961
+
+ Reviewed by Mark Lam.
+
+ We should put JSCallee in IsoSubspace. Currently, we are also putting JSToWasmICCallee in IsoSusbapce
+ since it is a derived class of JSCallee, but I think we can remove this class completely. We are tracking
+ it in [1].
+
+ [1]: https://bugs.webkit.org/show_bug.cgi?id=204960
+
+ * debugger/DebuggerScope.h:
+ * interpreter/Interpreter.cpp:
+ (JSC::Interpreter::executeProgram):
+ (JSC::Interpreter::execute):
+ * runtime/JSCallee.h:
+ (JSC::JSCallee::subspaceFor):
+ * runtime/JSGlobalObject.h:
+ (JSC::JSGlobalObject::globalCallee):
+ * runtime/VM.cpp:
+ (JSC::VM::VM):
+ * runtime/VM.h:
+ * wasm/js/JSToWasmICCallee.h:
+ (JSC::JSToWasmICCallee::function): Deleted.
+ (JSC::JSToWasmICCallee::JSToWasmICCallee): Deleted.
+
2019-12-06 Devin Rousso <drousso@apple.com>
Web Inspector: add compiler UNLIKELY hints when checking if developer extras are enabled
diff --git a/Source/JavaScriptCore/debugger/DebuggerScope.h b/Source/JavaScriptCore/debugger/DebuggerScope.h
index 33170eb6..27ea0c6 100644
--- a/Source/JavaScriptCore/debugger/DebuggerScope.h
+++ b/Source/JavaScriptCore/debugger/DebuggerScope.h
@@ -54,8 +54,7 @@
static Structure* createStructure(VM& vm, JSGlobalObject* globalObject)
{
return Structure::create(vm, globalObject, jsNull(), TypeInfo(ObjectType, StructureFlags), info());
- }
-
+ }
class iterator {
public:
iterator(DebuggerScope* node)
diff --git a/Source/JavaScriptCore/interpreter/Interpreter.cpp b/Source/JavaScriptCore/interpreter/Interpreter.cpp
index c391608..9c1cc42 100644
--- a/Source/JavaScriptCore/interpreter/Interpreter.cpp
+++ b/Source/JavaScriptCore/interpreter/Interpreter.cpp
@@ -666,6 +666,7 @@
VM& vm = scope->vm();
auto throwScope = DECLARE_THROW_SCOPE(vm);
JSGlobalObject* globalObject = scope->globalObject(vm);
+ JSCallee* globalCallee = globalObject->globalCallee();
ProgramExecutable* program = ProgramExecutable::create(globalObject, source);
EXCEPTION_ASSERT(throwScope.exception() || program);
@@ -839,7 +840,7 @@
ASSERT(codeBlock->numParameters() == 1); // 1 parameter for 'this'.
ProtoCallFrame protoCallFrame;
- protoCallFrame.init(codeBlock, globalObject, JSCallee::create(vm, globalObject, scope), thisObj, 1);
+ protoCallFrame.init(codeBlock, globalObject, globalCallee, thisObj, 1);
// Execute the code:
throwScope.release();
@@ -1151,8 +1152,13 @@
ASSERT(codeBlock->numParameters() == 1); // 1 parameter for 'this'.
+ JSCallee* callee = nullptr;
+ if (scope == globalObject->globalScope())
+ callee = globalObject->globalCallee();
+ else
+ callee = JSCallee::create(vm, globalObject, scope);
ProtoCallFrame protoCallFrame;
- protoCallFrame.init(codeBlock, globalObject, JSCallee::create(vm, globalObject, scope), thisValue, 1);
+ protoCallFrame.init(codeBlock, globalObject, callee, thisValue, 1);
// Execute the code:
throwScope.release();
diff --git a/Source/JavaScriptCore/runtime/JSCallee.h b/Source/JavaScriptCore/runtime/JSCallee.h
index bbcebf3..0662c4d 100644
--- a/Source/JavaScriptCore/runtime/JSCallee.h
+++ b/Source/JavaScriptCore/runtime/JSCallee.h
@@ -44,9 +44,15 @@
friend class VM;
public:
- typedef JSNonFinalObject Base;
+ using Base = JSNonFinalObject;
static constexpr unsigned StructureFlags = Base::StructureFlags | ImplementsHasInstance | ImplementsDefaultHasInstance;
+ template<typename CellType, SubspaceAccess>
+ static IsoSubspace* subspaceFor(VM& vm)
+ {
+ return &vm.calleeSpace;
+ }
+
static JSCallee* create(VM& vm, JSGlobalObject* globalObject, JSScope* scope)
{
JSCallee* callee = new (NotNull, allocateCell<JSCallee>(vm.heap)) JSCallee(vm, scope, globalObject->calleeStructure());
diff --git a/Source/JavaScriptCore/runtime/JSGlobalObject.h b/Source/JavaScriptCore/runtime/JSGlobalObject.h
index 1bf4e27..8a7ff96 100644
--- a/Source/JavaScriptCore/runtime/JSGlobalObject.h
+++ b/Source/JavaScriptCore/runtime/JSGlobalObject.h
@@ -581,6 +581,8 @@
void setGlobalScopeExtension(JSScope*);
void clearGlobalScopeExtension();
+ JSCallee* globalCallee() { return m_globalCallee.get(); }
+
// The following accessors return pristine values, even if a script
// replaces the global object's associated property.
diff --git a/Source/JavaScriptCore/runtime/VM.cpp b/Source/JavaScriptCore/runtime/VM.cpp
index 72a2007..a7de6af 100644
--- a/Source/JavaScriptCore/runtime/VM.cpp
+++ b/Source/JavaScriptCore/runtime/VM.cpp
@@ -84,6 +84,7 @@
#include "JSBoundFunction.h"
#include "JSCInlines.h"
#include "JSCallbackFunction.h"
+#include "JSCallee.h"
#include "JSCustomGetterSetterFunction.h"
#include "JSDestructibleObjectHeapCellType.h"
#include "JSFixedArray.h"
@@ -102,6 +103,7 @@
#include "JSSetIterator.h"
#include "JSSourceCode.h"
#include "JSTemplateObjectDescriptor.h"
+#include "JSToWasmICCallee.h"
#include "JSTypedArrays.h"
#include "JSWeakMap.h"
#include "JSWeakObjectRef.h"
@@ -317,6 +319,7 @@
, destructibleCellSpace("Destructible JSCell", heap, destructibleCellHeapCellType.get(), fastMallocAllocator.get()) // Hash:0xbfff3d73
, destructibleObjectSpace("JSDestructibleObject", heap, destructibleObjectHeapCellType.get(), fastMallocAllocator.get()) // Hash:0x4f5ed7a9
, bigIntSpace ISO_SUBSPACE_INIT(heap, destructibleCellHeapCellType.get(), JSBigInt)
+ , calleeSpace ISO_SUBSPACE_INIT(heap, cellHeapCellType.get(), JSCallee)
, clonedArgumentsSpace ISO_SUBSPACE_INIT(heap, cellHeapCellType.get(), ClonedArguments)
, dateInstanceSpace ISO_SUBSPACE_INIT(heap, dateInstanceHeapCellType.get(), DateInstance)
, executableToCodeBlockEdgeSpace ISO_SUBSPACE_INIT(heap, cellHeapCellType.get(), ExecutableToCodeBlockEdge) // Hash:0x7b730b20
@@ -1386,6 +1389,7 @@
DYNAMIC_ISO_SUBSPACE_DEFINE_MEMBER_SLOW(intlPluralRulesSpace, intlPluralRulesHeapCellType.get(), IntlPluralRules)
#endif
#if ENABLE(WEBASSEMBLY)
+DYNAMIC_ISO_SUBSPACE_DEFINE_MEMBER_SLOW(jsToWasmICCalleeSpace, cellHeapCellType.get(), JSToWasmICCallee)
DYNAMIC_ISO_SUBSPACE_DEFINE_MEMBER_SLOW(webAssemblyCodeBlockSpace, webAssemblyCodeBlockHeapCellType.get(), JSWebAssemblyCodeBlock) // Hash:0x9ad995cd
DYNAMIC_ISO_SUBSPACE_DEFINE_MEMBER_SLOW(webAssemblyFunctionSpace, webAssemblyFunctionHeapCellType.get(), WebAssemblyFunction) // Hash:0x8b7c32db
DYNAMIC_ISO_SUBSPACE_DEFINE_MEMBER_SLOW(webAssemblyGlobalSpace, webAssemblyGlobalHeapCellType.get(), JSWebAssemblyGlobal)
diff --git a/Source/JavaScriptCore/runtime/VM.h b/Source/JavaScriptCore/runtime/VM.h
index 12957ad..4f94ed0 100644
--- a/Source/JavaScriptCore/runtime/VM.h
+++ b/Source/JavaScriptCore/runtime/VM.h
@@ -414,6 +414,7 @@
CompleteSubspace destructibleObjectSpace;
IsoSubspace bigIntSpace;
+ IsoSubspace calleeSpace;
IsoSubspace clonedArgumentsSpace;
IsoSubspace dateInstanceSpace;
IsoSubspace executableToCodeBlockEdgeSpace;
@@ -488,6 +489,7 @@
DYNAMIC_ISO_SUBSPACE_DEFINE_MEMBER(intlPluralRulesSpace)
#endif
#if ENABLE(WEBASSEMBLY)
+ DYNAMIC_ISO_SUBSPACE_DEFINE_MEMBER(jsToWasmICCalleeSpace)
DYNAMIC_ISO_SUBSPACE_DEFINE_MEMBER(webAssemblyCodeBlockSpace)
DYNAMIC_ISO_SUBSPACE_DEFINE_MEMBER(webAssemblyFunctionSpace)
DYNAMIC_ISO_SUBSPACE_DEFINE_MEMBER(webAssemblyGlobalSpace)
diff --git a/Source/JavaScriptCore/wasm/js/JSToWasmICCallee.h b/Source/JavaScriptCore/wasm/js/JSToWasmICCallee.h
index 4618ebb..c024ca2 100644
--- a/Source/JavaScriptCore/wasm/js/JSToWasmICCallee.h
+++ b/Source/JavaScriptCore/wasm/js/JSToWasmICCallee.h
@@ -33,9 +33,18 @@
class WebAssemblyFunction;
-class JSToWasmICCallee : public JSCallee {
- using Base = JSCallee;
+// FIXME: Remove this type. Unwinding should just work by using WebAssemblyFunction instead of JSToWasmICCallee.
+// https://bugs.webkit.org/show_bug.cgi?id=204960
+class JSToWasmICCallee final : public JSCallee {
public:
+ using Base = JSCallee;
+
+ template<typename CellType, SubspaceAccess mode>
+ static IsoSubspace* subspaceFor(VM& vm)
+ {
+ return vm.jsToWasmICCalleeSpace<mode>();
+ }
+
DECLARE_INFO;
static JSToWasmICCallee* create(VM&, JSGlobalObject*, WebAssemblyFunction*);