Title: [128534] trunk/Source/_javascript_Core
Revision
128534
Author
[email protected]
Date
2012-09-13 17:43:04 -0700 (Thu, 13 Sep 2012)

Log Message

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:

Modified Paths

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
_______________________________________________
webkit-changes mailing list
[email protected]
http://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to