Reviewers: Kevin Millikin, danno,

Message:
Also supports count operations.

Description:
Enable compound assignment to context slots.

Please review this at http://codereview.chromium.org/6523025/

SVN Base: http://v8.googlecode.com/svn/branches/bleeding_edge/

Affected files:
  M     src/hydrogen.cc


Index: src/hydrogen.cc
===================================================================
--- src/hydrogen.cc     (revision 6795)
+++ src/hydrogen.cc     (working copy)
@@ -3375,10 +3375,6 @@
   BinaryOperation* operation = expr->binary_operation();

   if (var != NULL) {
-    if (!var->is_global() && !var->IsStackAllocated()) {
-      BAILOUT("non-stack/non-global in compound assignment");
-    }
-
     VISIT_FOR_VALUE(operation);

     if (var->is_global()) {
@@ -3386,8 +3382,16 @@
                                      Top(),
                                      expr->position(),
                                      expr->AssignmentId());
+    } else if (var->IsStackAllocated()) {
+      Bind(var, Top());
+    } else if (var->IsContextSlot()) {
+      HValue* context = BuildContextChainWalk(var);
+      int index = var->AsSlot()->index();
+ HStoreContextSlot* instr = new HStoreContextSlot(context, index, Top());
+      AddInstruction(instr);
+      if (instr->HasSideEffects()) AddSimulate(expr->AssignmentId());
     } else {
-      Bind(var, Top());
+      BAILOUT("compound assignment to lookup slot");
     }
     ast_context()->ReturnValue(Pop());

@@ -4704,10 +4708,6 @@
   bool inc = expr->op() == Token::INC;

   if (var != NULL) {
-    if (!var->is_global() && !var->IsStackAllocated()) {
-      BAILOUT("non-stack/non-global variable in count operation");
-    }
-
     VISIT_FOR_VALUE(target);

     // Match the full code generator stack by simulating an extra stack
@@ -4723,9 +4723,16 @@
                                      after,
                                      expr->position(),
                                      expr->AssignmentId());
+    } else if (var->IsStackAllocated()) {
+      Bind(var, after);
+    } else if (var->IsContextSlot()) {
+      HValue* context = BuildContextChainWalk(var);
+      int index = var->AsSlot()->index();
+ HStoreContextSlot* instr = new HStoreContextSlot(context, index, after);
+      AddInstruction(instr);
+      if (instr->HasSideEffects()) AddSimulate(expr->AssignmentId());
     } else {
-      ASSERT(var->IsStackAllocated());
-      Bind(var, after);
+      BAILOUT("non-stack/non-global variable in count operation");
     }
     Drop(has_extra ? 2 : 1);
     ast_context()->ReturnValue(expr->is_postfix() ? before : after);


--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev

Reply via email to