Commit ae8c5def authored by rossberg@chromium.org's avatar rossberg@chromium.org

Enable compound assignment to context slots.

Review URL: http://codereview.chromium.org/6523025

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@6798 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
parent 0976d48b
...@@ -3375,10 +3375,6 @@ void HGraphBuilder::HandleCompoundAssignment(Assignment* expr) { ...@@ -3375,10 +3375,6 @@ void HGraphBuilder::HandleCompoundAssignment(Assignment* expr) {
BinaryOperation* operation = expr->binary_operation(); BinaryOperation* operation = expr->binary_operation();
if (var != NULL) { if (var != NULL) {
if (!var->is_global() && !var->IsStackAllocated()) {
BAILOUT("non-stack/non-global in compound assignment");
}
VISIT_FOR_VALUE(operation); VISIT_FOR_VALUE(operation);
if (var->is_global()) { if (var->is_global()) {
...@@ -3386,8 +3382,16 @@ void HGraphBuilder::HandleCompoundAssignment(Assignment* expr) { ...@@ -3386,8 +3382,16 @@ void HGraphBuilder::HandleCompoundAssignment(Assignment* expr) {
Top(), Top(),
expr->position(), expr->position(),
expr->AssignmentId()); expr->AssignmentId());
} else { } else if (var->IsStackAllocated()) {
Bind(var, Top()); 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 {
BAILOUT("compound assignment to lookup slot");
} }
ast_context()->ReturnValue(Pop()); ast_context()->ReturnValue(Pop());
...@@ -4704,10 +4708,6 @@ void HGraphBuilder::VisitCountOperation(CountOperation* expr) { ...@@ -4704,10 +4708,6 @@ void HGraphBuilder::VisitCountOperation(CountOperation* expr) {
bool inc = expr->op() == Token::INC; bool inc = expr->op() == Token::INC;
if (var != NULL) { if (var != NULL) {
if (!var->is_global() && !var->IsStackAllocated()) {
BAILOUT("non-stack/non-global variable in count operation");
}
VISIT_FOR_VALUE(target); VISIT_FOR_VALUE(target);
// Match the full code generator stack by simulating an extra stack // Match the full code generator stack by simulating an extra stack
...@@ -4723,9 +4723,16 @@ void HGraphBuilder::VisitCountOperation(CountOperation* expr) { ...@@ -4723,9 +4723,16 @@ void HGraphBuilder::VisitCountOperation(CountOperation* expr) {
after, after,
expr->position(), expr->position(),
expr->AssignmentId()); expr->AssignmentId());
} else { } else if (var->IsStackAllocated()) {
ASSERT(var->IsStackAllocated());
Bind(var, after); 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 {
BAILOUT("lookup variable in count operation");
} }
Drop(has_extra ? 2 : 1); Drop(has_extra ? 2 : 1);
ast_context()->ReturnValue(expr->is_postfix() ? before : after); ast_context()->ReturnValue(expr->is_postfix() ? before : after);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment