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

Side by Side Diff: src/parsing/parser.cc

Issue 1593553002: [runtime] Throw exception for derived constructors in correct context. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: disable regression test for ignition Created 4 years, 11 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/mips64/builtins-mips64.cc ('k') | src/ppc/builtins-ppc.cc » ('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 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/parsing/parser.h" 5 #include "src/parsing/parser.h"
6 6
7 #include "src/api.h" 7 #include "src/api.h"
8 #include "src/ast/ast.h" 8 #include "src/ast/ast.h"
9 #include "src/ast/ast-expression-rewriter.h" 9 #include "src/ast/ast-expression-rewriter.h"
10 #include "src/ast/ast-expression-visitor.h" 10 #include "src/ast/ast-expression-visitor.h"
(...skipping 2707 matching lines...) Expand 10 before | Expand all | Expand 10 after
2718 MessageTemplate::kStrongConstructorReturnValue); 2718 MessageTemplate::kStrongConstructorReturnValue);
2719 *ok = false; 2719 *ok = false;
2720 return NULL; 2720 return NULL;
2721 } 2721 }
2722 2722
2723 int pos = peek_position(); 2723 int pos = peek_position();
2724 return_value = ParseExpression(true, CHECK_OK); 2724 return_value = ParseExpression(true, CHECK_OK);
2725 2725
2726 if (IsSubclassConstructor(function_state_->kind())) { 2726 if (IsSubclassConstructor(function_state_->kind())) {
2727 // For subclass constructors we need to return this in case of undefined 2727 // For subclass constructors we need to return this in case of undefined
2728 // and throw an exception in case of a non object. 2728 // return a Smi (transformed into an exception in the ConstructStub)
2729 // for a non object.
2729 // 2730 //
2730 // return expr; 2731 // return expr;
2731 // 2732 //
2732 // Is rewritten as: 2733 // Is rewritten as:
2733 // 2734 //
2734 // return (temp = expr) === undefined ? this : 2735 // return (temp = expr) === undefined ? this :
2735 // %_IsJSReceiver(temp) ? temp : throw new TypeError(...); 2736 // %_IsJSReceiver(temp) ? temp : 1;
2737
2738 // temp = expr
2736 Variable* temp = scope_->NewTemporary( 2739 Variable* temp = scope_->NewTemporary(
2737 ast_value_factory()->empty_string()); 2740 ast_value_factory()->empty_string());
2738 Assignment* assign = factory()->NewAssignment( 2741 Assignment* assign = factory()->NewAssignment(
2739 Token::ASSIGN, factory()->NewVariableProxy(temp), return_value, pos); 2742 Token::ASSIGN, factory()->NewVariableProxy(temp), return_value, pos);
2740 2743
2741 Expression* throw_expression =
2742 NewThrowTypeError(MessageTemplate::kDerivedConstructorReturn,
2743 ast_value_factory()->empty_string(), pos);
2744
2745 // %_IsJSReceiver(temp) 2744 // %_IsJSReceiver(temp)
2746 ZoneList<Expression*>* is_spec_object_args = 2745 ZoneList<Expression*>* is_spec_object_args =
2747 new (zone()) ZoneList<Expression*>(1, zone()); 2746 new (zone()) ZoneList<Expression*>(1, zone());
2748 is_spec_object_args->Add(factory()->NewVariableProxy(temp), zone()); 2747 is_spec_object_args->Add(factory()->NewVariableProxy(temp), zone());
2749 Expression* is_spec_object_call = factory()->NewCallRuntime( 2748 Expression* is_spec_object_call = factory()->NewCallRuntime(
2750 Runtime::kInlineIsJSReceiver, is_spec_object_args, pos); 2749 Runtime::kInlineIsJSReceiver, is_spec_object_args, pos);
2751 2750
2752 // %_IsJSReceiver(temp) ? temp : throw_expression 2751 // %_IsJSReceiver(temp) ? temp : throw_expression
2753 Expression* is_object_conditional = factory()->NewConditional( 2752 Expression* is_object_conditional = factory()->NewConditional(
2754 is_spec_object_call, factory()->NewVariableProxy(temp), 2753 is_spec_object_call, factory()->NewVariableProxy(temp),
2755 throw_expression, pos); 2754 factory()->NewSmiLiteral(1, pos), pos);
2756 2755
2757 // temp === undefined 2756 // temp === undefined
2758 Expression* is_undefined = factory()->NewCompareOperation( 2757 Expression* is_undefined = factory()->NewCompareOperation(
2759 Token::EQ_STRICT, assign, 2758 Token::EQ_STRICT, assign,
2760 factory()->NewUndefinedLiteral(RelocInfo::kNoPosition), pos); 2759 factory()->NewUndefinedLiteral(RelocInfo::kNoPosition), pos);
2761 2760
2762 // is_undefined ? this : is_object_conditional 2761 // is_undefined ? this : is_object_conditional
2763 return_value = factory()->NewConditional( 2762 return_value = factory()->NewConditional(
2764 is_undefined, ThisExpression(scope_, factory(), pos), 2763 is_undefined, ThisExpression(scope_, factory(), pos),
2765 is_object_conditional, pos); 2764 is_object_conditional, pos);
(...skipping 2932 matching lines...) Expand 10 before | Expand all | Expand 10 after
5698 auto class_literal = value->AsClassLiteral(); 5697 auto class_literal = value->AsClassLiteral();
5699 if (class_literal->raw_name() == nullptr) { 5698 if (class_literal->raw_name() == nullptr) {
5700 class_literal->set_raw_name(name); 5699 class_literal->set_raw_name(name);
5701 } 5700 }
5702 } 5701 }
5703 } 5702 }
5704 5703
5705 5704
5706 } // namespace internal 5705 } // namespace internal
5707 } // namespace v8 5706 } // namespace v8
OLDNEW
« no previous file with comments | « src/mips64/builtins-mips64.cc ('k') | src/ppc/builtins-ppc.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698