Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(727)

Side by Side Diff: src/hydrogen.cc

Issue 7020021: Disable context-allocated const variables. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 9 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2011 the V8 project authors. All rights reserved. 1 // Copyright 2011 the V8 project authors. All rights reserved.
2 // Redistribution and use in source and binary forms, with or without 2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are 3 // modification, are permitted provided that the following conditions are
4 // met: 4 // met:
5 // 5 //
6 // * Redistributions of source code must retain the above copyright 6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer. 7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above 8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following 9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided 10 // disclaimer in the documentation and/or other materials provided
(...skipping 3559 matching lines...) Expand 10 before | Expand all | Expand 10 after
3570 if (expr->is_compound()) { 3570 if (expr->is_compound()) {
3571 HandleCompoundAssignment(expr); 3571 HandleCompoundAssignment(expr);
3572 return; 3572 return;
3573 } 3573 }
3574 3574
3575 if (var != NULL) { 3575 if (var != NULL) {
3576 if (var->mode() == Variable::CONST) { 3576 if (var->mode() == Variable::CONST) {
3577 if (expr->op() != Token::INIT_CONST) { 3577 if (expr->op() != Token::INIT_CONST) {
3578 return Bailout("non-initializer assignment to const"); 3578 return Bailout("non-initializer assignment to const");
3579 } 3579 }
3580 if (!var->IsStackAllocated()) {
3581 return Bailout("assignment to const context slot");
3582 }
3580 // We insert a use of the old value to detect unsupported uses of const 3583 // We insert a use of the old value to detect unsupported uses of const
3581 // variables (e.g. initialization inside a loop). 3584 // variables (e.g. initialization inside a loop).
3582 HValue* old_value = environment()->Lookup(var); 3585 HValue* old_value = environment()->Lookup(var);
3583 AddInstruction(new HUseConst(old_value)); 3586 AddInstruction(new HUseConst(old_value));
3584 } 3587 }
3585 3588
3586 if (proxy->IsArguments()) return Bailout("assignment to arguments"); 3589 if (proxy->IsArguments()) return Bailout("assignment to arguments");
3587 3590
3588 // Handle the assignment. 3591 // Handle the assignment.
3589 if (var->IsStackAllocated()) { 3592 if (var->IsStackAllocated()) {
3590 // We do not allow the arguments object to occur in a context where it 3593 // We do not allow the arguments object to occur in a context where it
3591 // may escape, but assignments to stack-allocated locals are 3594 // may escape, but assignments to stack-allocated locals are
3592 // permitted. 3595 // permitted.
3593 CHECK_ALIVE(VisitForValue(expr->value(), ARGUMENTS_ALLOWED)); 3596 CHECK_ALIVE(VisitForValue(expr->value(), ARGUMENTS_ALLOWED));
3594 HValue* value = Pop(); 3597 HValue* value = Pop();
3595 Bind(var, value); 3598 Bind(var, value);
3596 ast_context()->ReturnValue(value); 3599 ast_context()->ReturnValue(value);
3597 3600
3598 } else if (var->IsContextSlot() && var->mode() != Variable::CONST) { 3601 } else if (var->IsContextSlot()) {
3602 ASSERT(var->mode() != Variable::CONST);
3599 CHECK_ALIVE(VisitForValue(expr->value())); 3603 CHECK_ALIVE(VisitForValue(expr->value()));
3600 HValue* context = BuildContextChainWalk(var); 3604 HValue* context = BuildContextChainWalk(var);
3601 int index = var->AsSlot()->index(); 3605 int index = var->AsSlot()->index();
3602 HStoreContextSlot* instr = 3606 HStoreContextSlot* instr =
3603 new(zone()) HStoreContextSlot(context, index, Top()); 3607 new(zone()) HStoreContextSlot(context, index, Top());
3604 AddInstruction(instr); 3608 AddInstruction(instr);
3605 if (instr->HasSideEffects()) AddSimulate(expr->AssignmentId()); 3609 if (instr->HasSideEffects()) AddSimulate(expr->AssignmentId());
3606 ast_context()->ReturnValue(Pop()); 3610 ast_context()->ReturnValue(Pop());
3607 3611
3608 } else if (var->is_global()) { 3612 } else if (var->is_global()) {
(...skipping 1765 matching lines...) Expand 10 before | Expand all | Expand 10 after
5374 Variable* var = decl->proxy()->var(); 5378 Variable* var = decl->proxy()->var();
5375 Slot* slot = var->AsSlot(); 5379 Slot* slot = var->AsSlot();
5376 if (var->is_global() || 5380 if (var->is_global() ||
5377 !var->IsStackAllocated() || 5381 !var->IsStackAllocated() ||
5378 (slot != NULL && slot->type() == Slot::LOOKUP) || 5382 (slot != NULL && slot->type() == Slot::LOOKUP) ||
5379 decl->fun() != NULL) { 5383 decl->fun() != NULL) {
5380 return Bailout("unsupported declaration"); 5384 return Bailout("unsupported declaration");
5381 } 5385 }
5382 5386
5383 if (decl->mode() == Variable::CONST) { 5387 if (decl->mode() == Variable::CONST) {
5388 ASSERT(var->IsStackAllocated());
5384 environment()->Bind(var, graph()->GetConstantHole()); 5389 environment()->Bind(var, graph()->GetConstantHole());
5385 } 5390 }
5386 } 5391 }
5387 5392
5388 5393
5389 // Generators for inline runtime functions. 5394 // Generators for inline runtime functions.
5390 // Support for types. 5395 // Support for types.
5391 void HGraphBuilder::GenerateIsSmi(CallRuntime* call) { 5396 void HGraphBuilder::GenerateIsSmi(CallRuntime* call) {
5392 ASSERT(call->arguments()->length() == 1); 5397 ASSERT(call->arguments()->length() == 1);
5393 CHECK_ALIVE(VisitForValue(call->arguments()->at(0))); 5398 CHECK_ALIVE(VisitForValue(call->arguments()->at(0)));
(...skipping 916 matching lines...) Expand 10 before | Expand all | Expand 10 after
6310 } 6315 }
6311 } 6316 }
6312 6317
6313 #ifdef DEBUG 6318 #ifdef DEBUG
6314 if (graph_ != NULL) graph_->Verify(); 6319 if (graph_ != NULL) graph_->Verify();
6315 if (allocator_ != NULL) allocator_->Verify(); 6320 if (allocator_ != NULL) allocator_->Verify();
6316 #endif 6321 #endif
6317 } 6322 }
6318 6323
6319 } } // namespace v8::internal 6324 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698