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