Diff
Modified: trunk/Source/_javascript_Core/ChangeLog (128533 => 128534)
--- trunk/Source/_javascript_Core/ChangeLog 2012-09-14 00:28:38 UTC (rev 128533)
+++ trunk/Source/_javascript_Core/ChangeLog 2012-09-14 00:43:04 UTC (rev 128534)
@@ -1,3 +1,38 @@
+2012-09-13 Oliver Hunt <[email protected]>
+
+ Make global const initialisation explicit in the bytecode
+ https://bugs.webkit.org/show_bug.cgi?id=96711
+
+ Reviewed by Gavin Barraclough.
+
+ Added op_init_global_const to make initialisation of global const
+ fields explicit. This will help us keep correct semantics in the
+ upcoming variable resolution refactoring.
+
+ * bytecode/CodeBlock.cpp:
+ (JSC::CodeBlock::dump):
+ * bytecode/Opcode.h:
+ (JSC):
+ (JSC::padOpcodeName):
+ * bytecompiler/BytecodeGenerator.cpp:
+ (JSC::BytecodeGenerator::emitInitGlobalConst):
+ (JSC):
+ * bytecompiler/BytecodeGenerator.h:
+ (BytecodeGenerator):
+ * bytecompiler/NodesCodegen.cpp:
+ (JSC::ConstDeclNode::emitCodeSingle):
+ * dfg/DFGByteCodeParser.cpp:
+ (JSC::DFG::ByteCodeParser::parseBlock):
+ * dfg/DFGCapabilities.h:
+ (JSC::DFG::canCompileOpcode):
+ * interpreter/Interpreter.cpp:
+ (JSC::Interpreter::privateExecute):
+ * jit/JIT.cpp:
+ (JSC::JIT::privateCompileMainPass):
+ (JSC::JIT::privateCompileSlowCases):
+ * llint/LowLevelInterpreter32_64.asm:
+ * llint/LowLevelInterpreter64.asm:
+
2012-09-13 Mark Hahnenberg <[email protected]>
Rename forEachCell to forEachLiveCell
Modified: trunk/Source/_javascript_Core/bytecode/CodeBlock.cpp (128533 => 128534)
--- trunk/Source/_javascript_Core/bytecode/CodeBlock.cpp 2012-09-14 00:28:38 UTC (rev 128533)
+++ trunk/Source/_javascript_Core/bytecode/CodeBlock.cpp 2012-09-14 00:43:04 UTC (rev 128534)
@@ -1005,6 +1005,22 @@
it++;
break;
}
+ case op_init_global_const: {
+ WriteBarrier<Unknown>* registerPointer = (++it)->u.registerPointer;
+ int r0 = (++it)->u.operand;
+ dataLog("[%4d] init_global_const\t g%d(%p), %s", location, m_globalObject->findRegisterIndex(registerPointer), registerPointer, registerName(exec, r0).data());
+ dumpBytecodeCommentAndNewLine(location);
+ break;
+ }
+ case op_init_global_const_check: {
+ WriteBarrier<Unknown>* registerPointer = (++it)->u.registerPointer;
+ int r0 = (++it)->u.operand;
+ dataLog("[%4d] init_global_const_check\t g%d(%p), %s", location, m_globalObject->findRegisterIndex(registerPointer), registerPointer, registerName(exec, r0).data());
+ dumpBytecodeCommentAndNewLine(location);
+ it++;
+ it++;
+ break;
+ }
case op_resolve_base: {
int r0 = (++it)->u.operand;
int id0 = (++it)->u.operand;
Modified: trunk/Source/_javascript_Core/bytecode/Opcode.h (128533 => 128534)
--- trunk/Source/_javascript_Core/bytecode/Opcode.h 2012-09-14 00:28:38 UTC (rev 128533)
+++ trunk/Source/_javascript_Core/bytecode/Opcode.h 2012-09-14 00:43:04 UTC (rev 128534)
@@ -105,6 +105,8 @@
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_init_global_const, 3) \
+ macro(op_init_global_const_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 */ \
Modified: trunk/Source/_javascript_Core/bytecompiler/BytecodeGenerator.cpp (128533 => 128534)
--- trunk/Source/_javascript_Core/bytecompiler/BytecodeGenerator.cpp 2012-09-14 00:28:38 UTC (rev 128533)
+++ trunk/Source/_javascript_Core/bytecompiler/BytecodeGenerator.cpp 2012-09-14 00:43:04 UTC (rev 128534)
@@ -1663,6 +1663,31 @@
}
}
+RegisterID* BytecodeGenerator::emitInitGlobalConst(const ResolveResult& resolveResult, const Identifier& identifier, RegisterID* value)
+{
+ ASSERT(m_codeType == GlobalCode);
+ switch (resolveResult.type()) {
+ case ResolveResult::IndexedGlobal:
+ case ResolveResult::ReadOnlyIndexedGlobal:
+ emitOpcode(op_init_global_const);
+ instructions().append(resolveResult.registerPointer());
+ instructions().append(value->index());
+ return value;
+
+ case ResolveResult::WatchedIndexedGlobal:
+ emitOpcode(op_init_global_const_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();
+ return 0;
+ }
+}
+
RegisterID* BytecodeGenerator::emitPutStaticVar(const ResolveResult& resolveResult, const Identifier& identifier, RegisterID* value)
{
switch (resolveResult.type()) {
Modified: trunk/Source/_javascript_Core/bytecompiler/BytecodeGenerator.h (128533 => 128534)
--- trunk/Source/_javascript_Core/bytecompiler/BytecodeGenerator.h 2012-09-14 00:28:38 UTC (rev 128533)
+++ trunk/Source/_javascript_Core/bytecompiler/BytecodeGenerator.h 2012-09-14 00:43:04 UTC (rev 128534)
@@ -462,6 +462,7 @@
RegisterID* emitGetStaticVar(RegisterID* dst, const ResolveResult&, const Identifier&);
RegisterID* emitPutStaticVar(const ResolveResult&, const Identifier&, RegisterID* value);
+ RegisterID* emitInitGlobalConst(const ResolveResult&, const Identifier&, RegisterID* value);
RegisterID* emitResolve(RegisterID* dst, const ResolveResult&, const Identifier& property);
RegisterID* emitResolveBase(RegisterID* dst, const ResolveResult&, const Identifier& property);
Modified: trunk/Source/_javascript_Core/bytecompiler/NodesCodegen.cpp (128533 => 128534)
--- trunk/Source/_javascript_Core/bytecompiler/NodesCodegen.cpp 2012-09-14 00:28:38 UTC (rev 128533)
+++ trunk/Source/_javascript_Core/bytecompiler/NodesCodegen.cpp 2012-09-14 00:43:04 UTC (rev 128534)
@@ -1387,9 +1387,11 @@
RefPtr<RegisterID> value = m_init ? generator.emitNode(m_init) : generator.emitLoad(0, jsUndefined());
- if (resolveResult.isStatic())
+ if (resolveResult.isStatic()) {
+ if (generator.codeType() == GlobalCode)
+ return generator.emitInitGlobalConst(resolveResult, m_ident, value.get());
return generator.emitPutStaticVar(resolveResult, m_ident, value.get());
-
+ }
if (generator.codeType() != EvalCode)
return value.get();
Modified: trunk/Source/_javascript_Core/dfg/DFGByteCodeParser.cpp (128533 => 128534)
--- trunk/Source/_javascript_Core/dfg/DFGByteCodeParser.cpp 2012-09-14 00:28:38 UTC (rev 128533)
+++ trunk/Source/_javascript_Core/dfg/DFGByteCodeParser.cpp 2012-09-14 00:43:04 UTC (rev 128534)
@@ -2459,7 +2459,8 @@
NEXT_OPCODE(op_get_global_var_watchable);
}
- case op_put_global_var: {
+ case op_put_global_var:
+ case op_init_global_const: {
NodeIndex value = get(currentInstruction[2].u.operand);
addToGraph(
PutGlobalVar,
@@ -2468,7 +2469,8 @@
NEXT_OPCODE(op_put_global_var);
}
- case op_put_global_var_check: {
+ case op_put_global_var_check:
+ case op_init_global_const_check: {
NodeIndex value = get(currentInstruction[2].u.operand);
CodeBlock* codeBlock = m_inlineStackTop->m_codeBlock;
JSGlobalObject* globalObject = codeBlock->globalObject();
Modified: trunk/Source/_javascript_Core/dfg/DFGCapabilities.h (128533 => 128534)
--- trunk/Source/_javascript_Core/dfg/DFGCapabilities.h 2012-09-14 00:28:38 UTC (rev 128533)
+++ trunk/Source/_javascript_Core/dfg/DFGCapabilities.h 2012-09-14 00:43:04 UTC (rev 128534)
@@ -131,6 +131,8 @@
case op_get_global_var_watchable:
case op_put_global_var:
case op_put_global_var_check:
+ case op_init_global_const:
+ case op_init_global_const_check:
case op_jmp:
case op_loop:
case op_jtrue:
Modified: trunk/Source/_javascript_Core/interpreter/Interpreter.cpp (128533 => 128534)
--- trunk/Source/_javascript_Core/interpreter/Interpreter.cpp 2012-09-14 00:28:38 UTC (rev 128533)
+++ trunk/Source/_javascript_Core/interpreter/Interpreter.cpp 2012-09-14 00:43:04 UTC (rev 128534)
@@ -2680,6 +2680,7 @@
vPC += OPCODE_LENGTH(op_get_global_var_watchable);
NEXT_INSTRUCTION();
}
+ DEFINE_OPCODE(op_init_global_const)
DEFINE_OPCODE(op_put_global_var) {
/* put_global_var globalObject(c) registerPointer(n) value(r)
@@ -2694,6 +2695,7 @@
vPC += OPCODE_LENGTH(op_put_global_var);
NEXT_INSTRUCTION();
}
+ DEFINE_OPCODE(op_init_global_const_check)
DEFINE_OPCODE(op_put_global_var_check) {
/* put_global_var_check globalObject(c) registerPointer(n) value(r)
Modified: trunk/Source/_javascript_Core/jit/JIT.cpp (128533 => 128534)
--- trunk/Source/_javascript_Core/jit/JIT.cpp 2012-09-14 00:28:38 UTC (rev 128533)
+++ trunk/Source/_javascript_Core/jit/JIT.cpp 2012-09-14 00:43:04 UTC (rev 128534)
@@ -330,7 +330,9 @@
DEFINE_OP(op_put_by_index)
DEFINE_OP(op_put_by_val)
DEFINE_OP(op_put_getter_setter)
+ case op_init_global_const:
DEFINE_OP(op_put_global_var)
+ case op_init_global_const_check:
DEFINE_OP(op_put_global_var_check)
DEFINE_OP(op_put_scoped_var)
DEFINE_OP(op_resolve)
@@ -491,6 +493,7 @@
case op_put_by_id_transition_normal_out_of_line:
DEFINE_SLOWCASE_OP(op_put_by_id)
DEFINE_SLOWCASE_OP(op_put_by_val)
+ case op_init_global_const_check:
DEFINE_SLOWCASE_OP(op_put_global_var_check);
DEFINE_SLOWCASE_OP(op_resolve_global)
DEFINE_SLOWCASE_OP(op_resolve_global_dynamic)
Modified: trunk/Source/_javascript_Core/llint/LowLevelInterpreter32_64.asm (128533 => 128534)
--- trunk/Source/_javascript_Core/llint/LowLevelInterpreter32_64.asm 2012-09-14 00:28:38 UTC (rev 128533)
+++ trunk/Source/_javascript_Core/llint/LowLevelInterpreter32_64.asm 2012-09-14 00:43:04 UTC (rev 128534)
@@ -1101,6 +1101,7 @@
getGlobalVar(5)
+_llint_op_init_global_const:
_llint_op_put_global_var:
traceExecution()
loadi 8[PC], t1
@@ -1112,6 +1113,7 @@
dispatch(3)
+_llint_op_init_global_const_check:
_llint_op_put_global_var_check:
traceExecution()
loadp 12[PC], t2
Modified: trunk/Source/_javascript_Core/llint/LowLevelInterpreter64.asm (128533 => 128534)
--- trunk/Source/_javascript_Core/llint/LowLevelInterpreter64.asm 2012-09-14 00:28:38 UTC (rev 128533)
+++ trunk/Source/_javascript_Core/llint/LowLevelInterpreter64.asm 2012-09-14 00:43:04 UTC (rev 128534)
@@ -953,6 +953,7 @@
getGlobalVar(5)
+_llint_op_init_global_const:
_llint_op_put_global_var:
traceExecution()
loadis 16[PB, PC, 8], t1
@@ -963,6 +964,7 @@
dispatch(3)
+_llint_op_init_global_const_check:
_llint_op_put_global_var_check:
traceExecution()
loadp 24[PB, PC, 8], t2