Modified: trunk/Source/_javascript_Core/ChangeLog (181827 => 181828)
--- trunk/Source/_javascript_Core/ChangeLog 2015-03-21 19:34:31 UTC (rev 181827)
+++ trunk/Source/_javascript_Core/ChangeLog 2015-03-22 00:07:46 UTC (rev 181828)
@@ -1,3 +1,20 @@
+2015-03-21 Andreas Kling <[email protected]>
+
+ Make UnlinkedFunctionExecutable fit in a 128-byte cell.
+ <https://webkit.org/b/142939>
+
+ Reviewed by Mark Hahnenberg.
+
+ Re-arrange the members of UnlinkedFunctionExecutable so it can fit inside
+ a 128-byte heap cell instead of requiring a 256-byte one.
+
+ Threw in a static_assert to catch anyone pushing it over the limit again.
+
+ * bytecode/UnlinkedCodeBlock.cpp:
+ (JSC::UnlinkedFunctionExecutable::UnlinkedFunctionExecutable):
+ * bytecode/UnlinkedCodeBlock.h:
+ (JSC::UnlinkedFunctionExecutable::functionMode):
+
2015-03-20 Mark Hahnenberg <[email protected]>
GCTimer should know keep track of nested GC phases
Modified: trunk/Source/_javascript_Core/bytecode/UnlinkedCodeBlock.cpp (181827 => 181828)
--- trunk/Source/_javascript_Core/bytecode/UnlinkedCodeBlock.cpp 2015-03-21 19:34:31 UTC (rev 181827)
+++ trunk/Source/_javascript_Core/bytecode/UnlinkedCodeBlock.cpp 2015-03-22 00:07:46 UTC (rev 181828)
@@ -42,6 +42,8 @@
namespace JSC {
+static_assert(sizeof(UnlinkedFunctionExecutable) <= 128, "UnlinkedFunctionExecutable should fit in a 128-byte cell.");
+
const ClassInfo UnlinkedFunctionExecutable::s_info = { "UnlinkedFunctionExecutable", 0, 0, CREATE_METHOD_TABLE(UnlinkedFunctionExecutable) };
const ClassInfo UnlinkedCodeBlock::s_info = { "UnlinkedCodeBlock", 0, 0, CREATE_METHOD_TABLE(UnlinkedCodeBlock) };
const ClassInfo UnlinkedGlobalCodeBlock::s_info = { "UnlinkedGlobalCodeBlock", &Base::s_info, 0, CREATE_METHOD_TABLE(UnlinkedGlobalCodeBlock) };
@@ -89,13 +91,10 @@
UnlinkedFunctionExecutable::UnlinkedFunctionExecutable(VM* vm, Structure* structure, const SourceCode& source, RefPtr<SourceProvider>&& sourceOverride, FunctionBodyNode* node, UnlinkedFunctionKind kind)
: Base(*vm, structure)
- , m_isInStrictContext(node->isInStrictContext())
- , m_hasCapturedVariables(false)
- , m_isBuiltinFunction(kind == UnlinkedBuiltinFunction)
- , m_constructorKind(static_cast<unsigned>(node->constructorKind()))
, m_name(node->ident())
, m_inferredName(node->inferredName())
, m_parameters(node->parameters())
+ , m_sourceOverride(WTF::move(sourceOverride))
, m_firstLineOffset(node->firstLine() - source.firstLine())
, m_lineCount(node->lastLine() - node->firstLine())
, m_unlinkedFunctionNameStart(node->functionNameStart() - source.startOffset())
@@ -105,8 +104,11 @@
, m_sourceLength(node->source().length())
, m_typeProfilingStartOffset(node->functionKeywordStart())
, m_typeProfilingEndOffset(node->startStartOffset() + node->source().length() - 1)
- , m_sourceOverride(sourceOverride)
, m_features(0)
+ , m_isInStrictContext(node->isInStrictContext())
+ , m_hasCapturedVariables(false)
+ , m_isBuiltinFunction(kind == UnlinkedBuiltinFunction)
+ , m_constructorKind(static_cast<unsigned>(node->constructorKind()))
, m_functionMode(node->functionMode())
{
ASSERT(m_constructorKind == static_cast<unsigned>(node->constructorKind()));
Modified: trunk/Source/_javascript_Core/bytecode/UnlinkedCodeBlock.h (181827 => 181828)
--- trunk/Source/_javascript_Core/bytecode/UnlinkedCodeBlock.h 2015-03-21 19:34:31 UTC (rev 181827)
+++ trunk/Source/_javascript_Core/bytecode/UnlinkedCodeBlock.h 2015-03-22 00:07:46 UTC (rev 181828)
@@ -120,7 +120,7 @@
}
size_t parameterCount() const;
bool isInStrictContext() const { return m_isInStrictContext; }
- FunctionMode functionMode() const { return m_functionMode; }
+ FunctionMode functionMode() const { return static_cast<FunctionMode>(m_functionMode); }
ConstructorKind constructorKind() const { return static_cast<ConstructorKind>(m_constructorKind); }
unsigned unlinkedFunctionNameStart() const { return m_unlinkedFunctionNameStart; }
@@ -169,17 +169,13 @@
WriteBarrier<UnlinkedFunctionCodeBlock> m_codeBlockForCall;
WriteBarrier<UnlinkedFunctionCodeBlock> m_codeBlockForConstruct;
- unsigned m_isInStrictContext : 1;
- unsigned m_hasCapturedVariables : 1;
- unsigned m_isBuiltinFunction : 1;
- unsigned m_constructorKind : 2;
-
Identifier m_name;
Identifier m_inferredName;
WriteBarrier<JSString> m_nameValue;
WriteBarrier<SymbolTable> m_symbolTableForCall;
WriteBarrier<SymbolTable> m_symbolTableForConstruct;
RefPtr<FunctionParameters> m_parameters;
+ RefPtr<SourceProvider> m_sourceOverride;
unsigned m_firstLineOffset;
unsigned m_lineCount;
unsigned m_unlinkedFunctionNameStart;
@@ -189,11 +185,14 @@
unsigned m_sourceLength;
unsigned m_typeProfilingStartOffset;
unsigned m_typeProfilingEndOffset;
- RefPtr<SourceProvider> m_sourceOverride;
CodeFeatures m_features;
- FunctionMode m_functionMode;
+ unsigned m_isInStrictContext : 1;
+ unsigned m_hasCapturedVariables : 1;
+ unsigned m_isBuiltinFunction : 1;
+ unsigned m_constructorKind : 2;
+ unsigned m_functionMode : 1; // FunctionMode
protected:
void finishCreation(VM& vm)