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

Side by Side Diff: src/compiler.cc

Issue 776563002: Better message location for 'super(...)' restriction error. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: One more Created 6 years 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 | « no previous file | test/message/super-constructor.js » ('j') | test/message/testcfg.py » ('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 #include "src/compiler.h" 7 #include "src/compiler.h"
8 8
9 #include "src/ast-numbering.h" 9 #include "src/ast-numbering.h"
10 #include "src/ast-this-access-visitor.h" 10 #include "src/ast-this-access-visitor.h"
(...skipping 744 matching lines...) Expand 10 before | Expand all | Expand 10 after
755 if (!info->shared_info().is_null()) { 755 if (!info->shared_info().is_null()) {
756 FunctionLiteral* lit = info->function(); 756 FunctionLiteral* lit = info->function();
757 info->shared_info()->set_ast_node_count(lit->ast_node_count()); 757 info->shared_info()->set_ast_node_count(lit->ast_node_count());
758 MaybeDisableOptimization(info->shared_info(), lit->dont_optimize_reason()); 758 MaybeDisableOptimization(info->shared_info(), lit->dont_optimize_reason());
759 info->shared_info()->set_dont_cache(lit->flags()->Contains(kDontCache)); 759 info->shared_info()->set_dont_cache(lit->flags()->Contains(kDontCache));
760 } 760 }
761 return true; 761 return true;
762 } 762 }
763 763
764 764
765 static void ThrowSuperConstructorCheckError(CompilationInfo* info) { 765 static void ThrowSuperConstructorCheckError(CompilationInfo* info,
766 Statement* stmt) {
766 MaybeHandle<Object> obj = info->isolate()->factory()->NewTypeError( 767 MaybeHandle<Object> obj = info->isolate()->factory()->NewTypeError(
767 "super_constructor_call", HandleVector<Object>(nullptr, 0)); 768 "super_constructor_call", HandleVector<Object>(nullptr, 0));
768 Handle<Object> exception; 769 Handle<Object> exception;
769 if (!obj.ToHandle(&exception)) return; 770 if (!obj.ToHandle(&exception)) return;
770 771
771 FunctionLiteral* lit = info->function(); 772 MessageLocation location(info->script(), stmt->position(), stmt->position());
772 MessageLocation location(info->script(), lit->start_position(),
773 lit->end_position());
774 USE(info->isolate()->Throw(*exception, &location)); 773 USE(info->isolate()->Throw(*exception, &location));
775 } 774 }
776 775
777 776
778 static bool CheckSuperConstructorCall(CompilationInfo* info) { 777 static bool CheckSuperConstructorCall(CompilationInfo* info) {
779 FunctionLiteral* function = info->function(); 778 FunctionLiteral* function = info->function();
780 if (!function->uses_super_constructor_call()) return true; 779 if (!function->uses_super_constructor_call()) return true;
781 780
782 if (function->is_default_constructor()) return true; 781 if (function->is_default_constructor()) return true;
783 782
(...skipping 10 matching lines...) Expand all
794 super_call_index++; 793 super_call_index++;
795 continue; 794 continue;
796 } 795 }
797 if (stmt->IsEmptyStatement()) { 796 if (stmt->IsEmptyStatement()) {
798 super_call_index++; 797 super_call_index++;
799 continue; 798 continue;
800 } 799 }
801 break; 800 break;
802 } 801 }
803 802
804 ExpressionStatement* exprStm = 803 Statement* stmt = body->at(super_call_index);
805 body->at(super_call_index)->AsExpressionStatement(); 804 ExpressionStatement* exprStm = stmt->AsExpressionStatement();
806 if (exprStm == nullptr) { 805 if (exprStm == nullptr) {
807 ThrowSuperConstructorCheckError(info); 806 ThrowSuperConstructorCheckError(info, stmt);
808 return false; 807 return false;
809 } 808 }
810 Call* callExpr = exprStm->expression()->AsCall(); 809 Call* callExpr = exprStm->expression()->AsCall();
811 if (callExpr == nullptr) { 810 if (callExpr == nullptr) {
812 ThrowSuperConstructorCheckError(info); 811 ThrowSuperConstructorCheckError(info, stmt);
813 return false; 812 return false;
814 } 813 }
815 814
816 if (!callExpr->expression()->IsSuperReference()) { 815 if (!callExpr->expression()->IsSuperReference()) {
817 ThrowSuperConstructorCheckError(info); 816 ThrowSuperConstructorCheckError(info, stmt);
818 return false; 817 return false;
819 } 818 }
820 819
821 ZoneList<Expression*>* arguments = callExpr->arguments(); 820 ZoneList<Expression*>* arguments = callExpr->arguments();
822 821
823 AstThisAccessVisitor this_access_visitor(info->zone()); 822 AstThisAccessVisitor this_access_visitor(info->zone());
824 this_access_visitor.VisitExpressions(arguments); 823 this_access_visitor.VisitExpressions(arguments);
825 824
826 if (this_access_visitor.HasStackOverflow()) return false; 825 if (this_access_visitor.HasStackOverflow()) return false;
827 if (this_access_visitor.UsesThis()) { 826 if (this_access_visitor.UsesThis()) {
828 ThrowSuperConstructorCheckError(info); 827 ThrowSuperConstructorCheckError(info, stmt);
829 return false; 828 return false;
830 } 829 }
831 830
832 return true; 831 return true;
833 } 832 }
834 833
835 834
836 bool Compiler::Analyze(CompilationInfo* info) { 835 bool Compiler::Analyze(CompilationInfo* info) {
837 DCHECK(info->function() != NULL); 836 DCHECK(info->function() != NULL);
838 if (!Rewriter::Rewrite(info)) return false; 837 if (!Rewriter::Rewrite(info)) return false;
(...skipping 736 matching lines...) Expand 10 before | Expand all | Expand 10 after
1575 AllowHandleDereference allow_deref; 1574 AllowHandleDereference allow_deref;
1576 bool tracing_on = info()->IsStub() 1575 bool tracing_on = info()->IsStub()
1577 ? FLAG_trace_hydrogen_stubs 1576 ? FLAG_trace_hydrogen_stubs
1578 : (FLAG_trace_hydrogen && 1577 : (FLAG_trace_hydrogen &&
1579 info()->closure()->PassesFilter(FLAG_trace_hydrogen_filter)); 1578 info()->closure()->PassesFilter(FLAG_trace_hydrogen_filter));
1580 return (tracing_on && 1579 return (tracing_on &&
1581 base::OS::StrChr(const_cast<char*>(FLAG_trace_phase), name_[0]) != NULL); 1580 base::OS::StrChr(const_cast<char*>(FLAG_trace_phase), name_[0]) != NULL);
1582 } 1581 }
1583 1582
1584 } } // namespace v8::internal 1583 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « no previous file | test/message/super-constructor.js » ('j') | test/message/testcfg.py » ('J')

Powered by Google App Engine
This is Rietveld 408576698