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

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

Issue 1226123010: Represent implicit 'this' binding by 'super' in AST. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Addressed comments. Created 5 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
« no previous file with comments | « src/arm/full-codegen-arm.cc ('k') | src/ast.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2013 the V8 project authors. All rights reserved. 1 // Copyright 2013 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_ARM64 7 #if V8_TARGET_ARCH_ARM64
8 8
9 #include "src/code-factory.h" 9 #include "src/code-factory.h"
10 #include "src/code-stubs.h" 10 #include "src/code-stubs.h"
(...skipping 1959 matching lines...) Expand 10 before | Expand all | Expand 10 after
1970 if (result_saved) { 1970 if (result_saved) {
1971 __ Drop(1); // literal index 1971 __ Drop(1); // literal index
1972 context()->PlugTOS(); 1972 context()->PlugTOS();
1973 } else { 1973 } else {
1974 context()->Plug(x0); 1974 context()->Plug(x0);
1975 } 1975 }
1976 } 1976 }
1977 1977
1978 1978
1979 void FullCodeGenerator::VisitAssignment(Assignment* expr) { 1979 void FullCodeGenerator::VisitAssignment(Assignment* expr) {
1980 DCHECK(expr->target()->IsValidReferenceExpression()); 1980 DCHECK(expr->target()->IsValidReferenceExpressionOrThis());
1981 1981
1982 Comment cmnt(masm_, "[ Assignment"); 1982 Comment cmnt(masm_, "[ Assignment");
1983 SetExpressionPosition(expr, INSERT_BREAK); 1983 SetExpressionPosition(expr, INSERT_BREAK);
1984 1984
1985 Property* property = expr->target()->AsProperty(); 1985 Property* property = expr->target()->AsProperty();
1986 LhsKind assign_type = Property::GetAssignType(property); 1986 LhsKind assign_type = Property::GetAssignType(property);
1987 1987
1988 // Evaluate LHS expression. 1988 // Evaluate LHS expression.
1989 switch (assign_type) { 1989 switch (assign_type) {
1990 case VARIABLE: 1990 case VARIABLE:
(...skipping 361 matching lines...) Expand 10 before | Expand all | Expand 10 after
2352 // Freeze the prototype. 2352 // Freeze the prototype.
2353 __ CallRuntime(Runtime::kObjectFreeze, 1); 2353 __ CallRuntime(Runtime::kObjectFreeze, 1);
2354 // Freeze the constructor. 2354 // Freeze the constructor.
2355 __ CallRuntime(Runtime::kObjectFreeze, 1); 2355 __ CallRuntime(Runtime::kObjectFreeze, 1);
2356 } 2356 }
2357 } 2357 }
2358 2358
2359 2359
2360 void FullCodeGenerator::EmitAssignment(Expression* expr, 2360 void FullCodeGenerator::EmitAssignment(Expression* expr,
2361 FeedbackVectorICSlot slot) { 2361 FeedbackVectorICSlot slot) {
2362 DCHECK(expr->IsValidReferenceExpression()); 2362 DCHECK(expr->IsValidReferenceExpressionOrThis());
2363 2363
2364 Property* prop = expr->AsProperty(); 2364 Property* prop = expr->AsProperty();
2365 LhsKind assign_type = Property::GetAssignType(prop); 2365 LhsKind assign_type = Property::GetAssignType(prop);
2366 2366
2367 switch (assign_type) { 2367 switch (assign_type) {
2368 case VARIABLE: { 2368 case VARIABLE: {
2369 Variable* var = expr->AsVariableProxy()->var(); 2369 Variable* var = expr->AsVariableProxy()->var();
2370 EffectContext context(this); 2370 EffectContext context(this);
2371 EmitVariableAssignment(var, Token::ASSIGN, slot); 2371 EmitVariableAssignment(var, Token::ASSIGN, slot);
2372 break; 2372 break;
(...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after
2501 Label const_error; 2501 Label const_error;
2502 MemOperand location = VarOperand(var, x1); 2502 MemOperand location = VarOperand(var, x1);
2503 __ Ldr(x10, location); 2503 __ Ldr(x10, location);
2504 __ JumpIfNotRoot(x10, Heap::kTheHoleValueRootIndex, &const_error); 2504 __ JumpIfNotRoot(x10, Heap::kTheHoleValueRootIndex, &const_error);
2505 __ Mov(x10, Operand(var->name())); 2505 __ Mov(x10, Operand(var->name()));
2506 __ Push(x10); 2506 __ Push(x10);
2507 __ CallRuntime(Runtime::kThrowReferenceError, 1); 2507 __ CallRuntime(Runtime::kThrowReferenceError, 1);
2508 __ Bind(&const_error); 2508 __ Bind(&const_error);
2509 __ CallRuntime(Runtime::kThrowConstAssignError, 0); 2509 __ CallRuntime(Runtime::kThrowConstAssignError, 0);
2510 2510
2511 } else if (var->is_this() && op == Token::INIT_CONST) {
2512 // Initializing assignment to const {this} needs a write barrier.
2513 DCHECK(var->IsStackAllocated() || var->IsContextSlot());
2514 Label uninitialized_this;
2515 MemOperand location = VarOperand(var, x1);
2516 __ Ldr(x10, location);
2517 __ JumpIfRoot(x10, Heap::kTheHoleValueRootIndex, &uninitialized_this);
2518 __ Mov(x0, Operand(var->name()));
2519 __ Push(x0);
2520 __ CallRuntime(Runtime::kThrowReferenceError, 1);
2521 __ bind(&uninitialized_this);
2522 EmitStoreToStackLocalOrContextSlot(var, location);
2523
2511 } else if (!var->is_const_mode() || op == Token::INIT_CONST) { 2524 } else if (!var->is_const_mode() || op == Token::INIT_CONST) {
2512 if (var->IsLookupSlot()) { 2525 if (var->IsLookupSlot()) {
2513 // Assignment to var. 2526 // Assignment to var.
2514 __ Mov(x11, Operand(var->name())); 2527 __ Mov(x11, Operand(var->name()));
2515 __ Mov(x10, Smi::FromInt(language_mode())); 2528 __ Mov(x10, Smi::FromInt(language_mode()));
2516 // jssp[0] : mode. 2529 // jssp[0] : mode.
2517 // jssp[8] : name. 2530 // jssp[8] : name.
2518 // jssp[16] : context. 2531 // jssp[16] : context.
2519 // jssp[24] : value. 2532 // jssp[24] : value.
2520 __ Push(x0, cp, x11, x10); 2533 __ Push(x0, cp, x11, x10);
(...skipping 338 matching lines...) Expand 10 before | Expand all | Expand 10 after
2859 __ Mov(x12, Smi::FromInt(scope()->start_position())); 2872 __ Mov(x12, Smi::FromInt(scope()->start_position()));
2860 2873
2861 // Push. 2874 // Push.
2862 __ Push(x9, x10, x11, x12); 2875 __ Push(x9, x10, x11, x12);
2863 2876
2864 // Do the runtime call. 2877 // Do the runtime call.
2865 __ CallRuntime(Runtime::kResolvePossiblyDirectEval, 5); 2878 __ CallRuntime(Runtime::kResolvePossiblyDirectEval, 5);
2866 } 2879 }
2867 2880
2868 2881
2869 void FullCodeGenerator::EmitInitializeThisAfterSuper(
2870 SuperCallReference* super_ref, FeedbackVectorICSlot slot) {
2871 Variable* this_var = super_ref->this_var()->var();
2872 GetVar(x1, this_var);
2873 Label uninitialized_this;
2874 __ JumpIfRoot(x1, Heap::kTheHoleValueRootIndex, &uninitialized_this);
2875 __ Mov(x0, Operand(this_var->name()));
2876 __ Push(x0);
2877 __ CallRuntime(Runtime::kThrowReferenceError, 1);
2878 __ bind(&uninitialized_this);
2879
2880 EmitVariableAssignment(this_var, Token::INIT_CONST, slot);
2881 }
2882
2883
2884 // See http://www.ecma-international.org/ecma-262/6.0/#sec-function-calls. 2882 // See http://www.ecma-international.org/ecma-262/6.0/#sec-function-calls.
2885 void FullCodeGenerator::PushCalleeAndWithBaseObject(Call* expr) { 2883 void FullCodeGenerator::PushCalleeAndWithBaseObject(Call* expr) {
2886 VariableProxy* callee = expr->expression()->AsVariableProxy(); 2884 VariableProxy* callee = expr->expression()->AsVariableProxy();
2887 if (callee->var()->IsLookupSlot()) { 2885 if (callee->var()->IsLookupSlot()) {
2888 Label slow, done; 2886 Label slow, done;
2889 SetExpressionPosition(callee); 2887 SetExpressionPosition(callee);
2890 // Generate code for loading from variables potentially shadowed 2888 // Generate code for loading from variables potentially shadowed
2891 // by eval-introduced variables. 2889 // by eval-introduced variables.
2892 EmitDynamicLookupFastCase(callee, NOT_INSIDE_TYPEOF, &slow, &done); 2890 EmitDynamicLookupFastCase(callee, NOT_INSIDE_TYPEOF, &slow, &done);
2893 2891
(...skipping 202 matching lines...) Expand 10 before | Expand all | Expand 10 after
3096 } 3094 }
3097 3095
3098 __ LoadObject(x2, FeedbackVector()); 3096 __ LoadObject(x2, FeedbackVector());
3099 __ Mov(x3, SmiFromSlot(expr->CallFeedbackSlot())); 3097 __ Mov(x3, SmiFromSlot(expr->CallFeedbackSlot()));
3100 3098
3101 CallConstructStub stub(isolate(), SUPER_CALL_RECORD_TARGET); 3099 CallConstructStub stub(isolate(), SUPER_CALL_RECORD_TARGET);
3102 __ Call(stub.GetCode(), RelocInfo::CONSTRUCT_CALL); 3100 __ Call(stub.GetCode(), RelocInfo::CONSTRUCT_CALL);
3103 3101
3104 RecordJSReturnSite(expr); 3102 RecordJSReturnSite(expr);
3105 3103
3106 EmitInitializeThisAfterSuper(super_call_ref, expr->CallFeedbackICSlot());
3107 context()->Plug(x0); 3104 context()->Plug(x0);
3108 } 3105 }
3109 3106
3110 3107
3111 void FullCodeGenerator::EmitIsSmi(CallRuntime* expr) { 3108 void FullCodeGenerator::EmitIsSmi(CallRuntime* expr) {
3112 ZoneList<Expression*>* args = expr->arguments(); 3109 ZoneList<Expression*>* args = expr->arguments();
3113 DCHECK(args->length() == 1); 3110 DCHECK(args->length() == 1);
3114 3111
3115 VisitForAccumulatorValue(args->at(0)); 3112 VisitForAccumulatorValue(args->at(0));
3116 3113
(...skipping 1310 matching lines...) Expand 10 before | Expand all | Expand 10 after
4427 4424
4428 // Push NewTarget 4425 // Push NewTarget
4429 DCHECK(args->at(2)->IsVariableProxy()); 4426 DCHECK(args->at(2)->IsVariableProxy());
4430 VisitForStackValue(args->at(2)); 4427 VisitForStackValue(args->at(2));
4431 4428
4432 EmitCallJSRuntimeFunction(call); 4429 EmitCallJSRuntimeFunction(call);
4433 4430
4434 // Restore context register. 4431 // Restore context register.
4435 __ Ldr(cp, MemOperand(fp, StandardFrameConstants::kContextOffset)); 4432 __ Ldr(cp, MemOperand(fp, StandardFrameConstants::kContextOffset));
4436 context()->DropAndPlug(1, x0); 4433 context()->DropAndPlug(1, x0);
4437
4438 // TODO(mvstanton): with FLAG_vector_stores this needs a slot id.
4439 EmitInitializeThisAfterSuper(super_call_ref);
4440 } 4434 }
4441 4435
4442 4436
4443 void FullCodeGenerator::EmitLoadJSRuntimeFunction(CallRuntime* expr) { 4437 void FullCodeGenerator::EmitLoadJSRuntimeFunction(CallRuntime* expr) {
4444 // Push the builtins object as the receiver. 4438 // Push the builtins object as the receiver.
4445 __ Ldr(x10, GlobalObjectMemOperand()); 4439 __ Ldr(x10, GlobalObjectMemOperand());
4446 __ Ldr(LoadDescriptor::ReceiverRegister(), 4440 __ Ldr(LoadDescriptor::ReceiverRegister(),
4447 FieldMemOperand(x10, GlobalObject::kBuiltinsOffset)); 4441 FieldMemOperand(x10, GlobalObject::kBuiltinsOffset));
4448 __ Push(LoadDescriptor::ReceiverRegister()); 4442 __ Push(LoadDescriptor::ReceiverRegister());
4449 4443
(...skipping 175 matching lines...) Expand 10 before | Expand all | Expand 10 after
4625 context()->Plug(x0); 4619 context()->Plug(x0);
4626 break; 4620 break;
4627 } 4621 }
4628 default: 4622 default:
4629 UNREACHABLE(); 4623 UNREACHABLE();
4630 } 4624 }
4631 } 4625 }
4632 4626
4633 4627
4634 void FullCodeGenerator::VisitCountOperation(CountOperation* expr) { 4628 void FullCodeGenerator::VisitCountOperation(CountOperation* expr) {
4635 DCHECK(expr->expression()->IsValidReferenceExpression()); 4629 DCHECK(expr->expression()->IsValidReferenceExpressionOrThis());
4636 4630
4637 Comment cmnt(masm_, "[ CountOperation"); 4631 Comment cmnt(masm_, "[ CountOperation");
4638 4632
4639 Property* prop = expr->expression()->AsProperty(); 4633 Property* prop = expr->expression()->AsProperty();
4640 LhsKind assign_type = Property::GetAssignType(prop); 4634 LhsKind assign_type = Property::GetAssignType(prop);
4641 4635
4642 // Evaluate expression and get value. 4636 // Evaluate expression and get value.
4643 if (assign_type == VARIABLE) { 4637 if (assign_type == VARIABLE) {
4644 DCHECK(expr->expression()->AsVariableProxy()->var() != NULL); 4638 DCHECK(expr->expression()->AsVariableProxy()->var() != NULL);
4645 AccumulatorValueContext context(this); 4639 AccumulatorValueContext context(this);
(...skipping 967 matching lines...) Expand 10 before | Expand all | Expand 10 after
5613 } 5607 }
5614 5608
5615 return INTERRUPT; 5609 return INTERRUPT;
5616 } 5610 }
5617 5611
5618 5612
5619 } // namespace internal 5613 } // namespace internal
5620 } // namespace v8 5614 } // namespace v8
5621 5615
5622 #endif // V8_TARGET_ARCH_ARM64 5616 #endif // V8_TARGET_ARCH_ARM64
OLDNEW
« no previous file with comments | « src/arm/full-codegen-arm.cc ('k') | src/ast.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698