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

Side by Side Diff: src/arm/full-codegen-arm.cc

Issue 379893002: Clean up and update const / var (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 6 years, 5 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 | src/arm64/full-codegen-arm64.cc » ('j') | src/objects.cc » ('J')
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "src/v8.h" 5 #include "src/v8.h"
6 6
7 #if V8_TARGET_ARCH_ARM 7 #if V8_TARGET_ARCH_ARM
8 8
9 #include "src/code-stubs.h" 9 #include "src/code-stubs.h"
10 #include "src/codegen.h" 10 #include "src/codegen.h"
(...skipping 2438 matching lines...) Expand 10 before | Expand all | Expand 10 after
2449 if (var->IsContextSlot()) { 2449 if (var->IsContextSlot()) {
2450 // RecordWrite may destroy all its register arguments. 2450 // RecordWrite may destroy all its register arguments.
2451 __ mov(r3, result_register()); 2451 __ mov(r3, result_register());
2452 int offset = Context::SlotOffset(var->index()); 2452 int offset = Context::SlotOffset(var->index());
2453 __ RecordWriteContextSlot( 2453 __ RecordWriteContextSlot(
2454 r1, offset, r3, r2, kLRHasBeenSaved, kDontSaveFPRegs); 2454 r1, offset, r3, r2, kLRHasBeenSaved, kDontSaveFPRegs);
2455 } 2455 }
2456 } 2456 }
2457 2457
2458 2458
2459 void FullCodeGenerator::EmitCallStoreContextSlot(
2460 Handle<String> name, StrictMode strict_mode) {
2461 __ push(r0); // Value.
2462 __ mov(r1, Operand(name));
2463 __ mov(r0, Operand(Smi::FromInt(strict_mode)));
2464 __ Push(cp, r1, r0); // Context, name, strict mode.
2465 __ CallRuntime(Runtime::kStoreContextSlot, 4);
2466 }
2467
2468
2469 void FullCodeGenerator::EmitVariableAssignment(Variable* var, Token::Value op) { 2459 void FullCodeGenerator::EmitVariableAssignment(Variable* var, Token::Value op) {
2470 if (var->IsUnallocated()) { 2460 if (var->IsUnallocated()) {
2471 // Global var, const, or let. 2461 // Global var, const, or let.
2472 __ mov(r2, Operand(var->name())); 2462 __ mov(r2, Operand(var->name()));
2473 __ ldr(r1, GlobalObjectOperand()); 2463 __ ldr(r1, GlobalObjectOperand());
2474 CallStoreIC(); 2464 CallStoreIC();
2475 2465
2476 } else if (op == Token::INIT_CONST_LEGACY) { 2466 } else if (op == Token::INIT_CONST_LEGACY) {
2477 // Const initializers need a write barrier. 2467 // Const initializers need a write barrier.
2478 ASSERT(!var->IsParameter()); // No const parameters. 2468 ASSERT(!var->IsParameter()); // No const parameters.
2479 if (var->IsLookupSlot()) { 2469 if (var->IsLookupSlot()) {
2480 __ push(r0); 2470 __ push(r0);
2481 __ mov(r0, Operand(var->name())); 2471 __ mov(r0, Operand(var->name()));
2482 __ Push(cp, r0); // Context and name. 2472 __ Push(cp, r0); // Context and name.
2483 __ CallRuntime(Runtime::kInitializeConstContextSlot, 3); 2473 __ CallRuntime(Runtime::kInitializeConstContextSlot, 3);
2484 } else { 2474 } else {
2485 ASSERT(var->IsStackAllocated() || var->IsContextSlot()); 2475 ASSERT(var->IsStackAllocated() || var->IsContextSlot());
2486 Label skip; 2476 Label skip;
2487 MemOperand location = VarOperand(var, r1); 2477 MemOperand location = VarOperand(var, r1);
2488 __ ldr(r2, location); 2478 __ ldr(r2, location);
2489 __ CompareRoot(r2, Heap::kTheHoleValueRootIndex); 2479 __ CompareRoot(r2, Heap::kTheHoleValueRootIndex);
2490 __ b(ne, &skip); 2480 __ b(ne, &skip);
2491 EmitStoreToStackLocalOrContextSlot(var, location); 2481 EmitStoreToStackLocalOrContextSlot(var, location);
2492 __ bind(&skip); 2482 __ bind(&skip);
2493 } 2483 }
2494 2484
2495 } else if (var->mode() == LET && op != Token::INIT_LET) { 2485 } else if (var->mode() == LET && op != Token::INIT_LET) {
2496 // Non-initializing assignment to let variable needs a write barrier. 2486 // Non-initializing assignment to let variable needs a write barrier.
2497 if (var->IsLookupSlot()) { 2487 ASSERT(!var->IsLookupSlot());
2498 EmitCallStoreContextSlot(var->name(), strict_mode()); 2488 ASSERT(var->IsStackAllocated() || var->IsContextSlot());
2499 } else { 2489 Label assign;
2500 ASSERT(var->IsStackAllocated() || var->IsContextSlot()); 2490 MemOperand location = VarOperand(var, r1);
2501 Label assign; 2491 __ ldr(r3, location);
2502 MemOperand location = VarOperand(var, r1); 2492 __ CompareRoot(r3, Heap::kTheHoleValueRootIndex);
2503 __ ldr(r3, location); 2493 __ b(ne, &assign);
2504 __ CompareRoot(r3, Heap::kTheHoleValueRootIndex); 2494 __ mov(r3, Operand(var->name()));
2505 __ b(ne, &assign); 2495 __ push(r3);
2506 __ mov(r3, Operand(var->name())); 2496 __ CallRuntime(Runtime::kThrowReferenceError, 1);
2507 __ push(r3); 2497 // Perform the assignment.
2508 __ CallRuntime(Runtime::kThrowReferenceError, 1); 2498 __ bind(&assign);
2509 // Perform the assignment. 2499 EmitStoreToStackLocalOrContextSlot(var, location);
2510 __ bind(&assign);
2511 EmitStoreToStackLocalOrContextSlot(var, location);
2512 }
2513 2500
2514 } else if (!var->is_const_mode() || op == Token::INIT_CONST) { 2501 } else if (!var->is_const_mode() || op == Token::INIT_CONST) {
2515 // Assignment to var or initializing assignment to let/const
2516 // in harmony mode.
2517 if (var->IsLookupSlot()) { 2502 if (var->IsLookupSlot()) {
2518 EmitCallStoreContextSlot(var->name(), strict_mode()); 2503 ASSERT(opt == Token::ASSIGN || op == Token::INIT_VAR ||
2504 op == Token::ASSIGN_ADD);
2505 // Assignment to var.
2506 __ push(r0); // Value.
2507 __ mov(r1, Operand(var->name()));
2508 __ mov(r0, Operand(Smi::FromInt(strict_mode())));
2509 __ Push(cp, r1, r0); // Context, name, strict mode.
2510 __ CallRuntime(Runtime::kStoreLookupSlot, 4);
2519 } else { 2511 } else {
2512 // Assignment to var or initializing assignment to let/const in harmony
2513 // mode.
2520 ASSERT((var->IsStackAllocated() || var->IsContextSlot())); 2514 ASSERT((var->IsStackAllocated() || var->IsContextSlot()));
2521 MemOperand location = VarOperand(var, r1); 2515 MemOperand location = VarOperand(var, r1);
2522 if (generate_debug_code_ && op == Token::INIT_LET) { 2516 if (generate_debug_code_ && op == Token::INIT_LET) {
2523 // Check for an uninitialized let binding. 2517 // Check for an uninitialized let binding.
2524 __ ldr(r2, location); 2518 __ ldr(r2, location);
2525 __ CompareRoot(r2, Heap::kTheHoleValueRootIndex); 2519 __ CompareRoot(r2, Heap::kTheHoleValueRootIndex);
2526 __ Check(eq, kLetBindingReInitialization); 2520 __ Check(eq, kLetBindingReInitialization);
2527 } 2521 }
2528 EmitStoreToStackLocalOrContextSlot(var, location); 2522 EmitStoreToStackLocalOrContextSlot(var, location);
2529 } 2523 }
(...skipping 2329 matching lines...) Expand 10 before | Expand all | Expand 10 after
4859 4853
4860 ASSERT(interrupt_address == 4854 ASSERT(interrupt_address ==
4861 isolate->builtins()->OsrAfterStackCheck()->entry()); 4855 isolate->builtins()->OsrAfterStackCheck()->entry());
4862 return OSR_AFTER_STACK_CHECK; 4856 return OSR_AFTER_STACK_CHECK;
4863 } 4857 }
4864 4858
4865 4859
4866 } } // namespace v8::internal 4860 } } // namespace v8::internal
4867 4861
4868 #endif // V8_TARGET_ARCH_ARM 4862 #endif // V8_TARGET_ARCH_ARM
OLDNEW
« no previous file with comments | « no previous file | src/arm64/full-codegen-arm64.cc » ('j') | src/objects.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698