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

Side by Side Diff: vm/parser.cc

Issue 8363034: Report NullPointerException when we try to construct a regular expression (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/runtime/
Patch Set: Created 9 years, 1 month 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
« lib/regexp.cc ('K') | « vm/code_generator.cc ('k') | 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 (c) 2011, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 #include "vm/parser.h" 5 #include "vm/parser.h"
6 6
7 #include "vm/bigint_operations.h" 7 #include "vm/bigint_operations.h"
8 #include "vm/class_finalizer.h" 8 #include "vm/class_finalizer.h"
9 #include "vm/compiler.h" 9 #include "vm/compiler.h"
10 #include "vm/compiler_stats.h" 10 #include "vm/compiler_stats.h"
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after
95 95
96 static RawTypeArray* NewTypeArray(const GrowableArray<Type*>& objs) { 96 static RawTypeArray* NewTypeArray(const GrowableArray<Type*>& objs) {
97 TypeArray& a = TypeArray::Handle(TypeArray::New(objs.length())); 97 TypeArray& a = TypeArray::Handle(TypeArray::New(objs.length()));
98 for (int i = 0; i < objs.length(); i++) { 98 for (int i = 0; i < objs.length(); i++) {
99 a.SetTypeAt(i, *objs[i]); 99 a.SetTypeAt(i, *objs[i]);
100 } 100 }
101 return a.raw(); 101 return a.raw();
102 } 102 }
103 103
104 104
105 static ThrowNode* CreateEvalConstConstructorThrow(intptr_t token_pos,
106 const Instance& instance) {
107 UnhandledException& excp = UnhandledException::Handle();
108 excp ^= instance.raw();
109 const Instance& exception = Instance::ZoneHandle(excp.exception());
110 const Instance& stack_trace = Instance::ZoneHandle(excp.stacktrace());
111 return new ThrowNode(token_pos,
112 new LiteralNode(token_pos, exception),
113 new LiteralNode(token_pos, stack_trace));
114 }
115
116
105 struct Parser::Block : public ZoneAllocated { 117 struct Parser::Block : public ZoneAllocated {
106 Block(Block* outer_block, LocalScope* local_scope, SequenceNode* seq) 118 Block(Block* outer_block, LocalScope* local_scope, SequenceNode* seq)
107 : parent(outer_block), scope(local_scope), statements(seq) { 119 : parent(outer_block), scope(local_scope), statements(seq) {
108 ASSERT(scope != NULL); 120 ASSERT(scope != NULL);
109 ASSERT(statements != NULL); 121 ASSERT(statements != NULL);
110 } 122 }
111 Block* parent; // Enclosing block, or NULL if outermost. 123 Block* parent; // Enclosing block, or NULL if outermost.
112 LocalScope* scope; 124 LocalScope* scope;
113 SequenceNode* statements; 125 SequenceNode* statements;
114 }; 126 };
(...skipping 5708 matching lines...) Expand 10 before | Expand all | Expand 10 after
5823 for (int i = 0; i < arguments->length(); i++) { 5835 for (int i = 0; i < arguments->length(); i++) {
5824 AstNode* arg = arguments->NodeAt(i); 5836 AstNode* arg = arguments->NodeAt(i);
5825 // Arguments have been evaluated to a literal value already. 5837 // Arguments have been evaluated to a literal value already.
5826 ASSERT(arg->IsLiteralNode()); 5838 ASSERT(arg->IsLiteralNode());
5827 arg_values.Add(&arg->AsLiteralNode()->literal()); 5839 arg_values.Add(&arg->AsLiteralNode()->literal());
5828 } 5840 }
5829 const Array& opt_arg_names = arguments->names(); 5841 const Array& opt_arg_names = arguments->names();
5830 const Instance& result = Instance::Handle( 5842 const Instance& result = Instance::Handle(
5831 DartEntry::InvokeStatic(constructor, arg_values, opt_arg_names)); 5843 DartEntry::InvokeStatic(constructor, arg_values, opt_arg_names));
5832 if (result.IsUnhandledException()) { 5844 if (result.IsUnhandledException()) {
5833 ErrorMsg("Exception thrown in EvaluateConstConstructorCall");
5834 }
5835 if (constructor.IsFactory()) {
5836 // The factory method returns the allocated object.
5837 instance = result.raw(); 5845 instance = result.raw();
5838 } 5846 } else {
5839 if (!instance.IsNull()) { 5847 if (constructor.IsFactory()) {
5840 instance ^= instance.Canonicalize(); 5848 // The factory method returns the allocated object.
5849 instance = result.raw();
5850 }
5851 if (!instance.IsNull()) {
5852 instance ^= instance.Canonicalize();
5853 }
5841 } 5854 }
5842 return instance.raw(); 5855 return instance.raw();
5843 } 5856 }
5844 5857
5845 5858
5846 // Do a lookup for the identifier in the block scope and the class scope 5859 // Do a lookup for the identifier in the block scope and the class scope
5847 // return true if the identifier is found, false otherwise. 5860 // return true if the identifier is found, false otherwise.
5848 // If node is non NULL return an AST node corresponding to the identifier. 5861 // If node is non NULL return an AST node corresponding to the identifier.
5849 bool Parser::ResolveIdentInLocalScope(intptr_t ident_pos, 5862 bool Parser::ResolveIdentInLocalScope(intptr_t ident_pos,
5850 const String &ident, 5863 const String &ident,
(...skipping 472 matching lines...) Expand 10 before | Expand all | Expand 10 after
6323 key_value_array.MakeImmutable(); 6336 key_value_array.MakeImmutable();
6324 6337
6325 // Construct the map object. 6338 // Construct the map object.
6326 ArgumentListNode* constr_args = new ArgumentListNode(token_index_); 6339 ArgumentListNode* constr_args = new ArgumentListNode(token_index_);
6327 constr_args->Add(new LiteralNode(literal_pos, key_value_array)); 6340 constr_args->Add(new LiteralNode(literal_pos, key_value_array));
6328 const String& constr_name = 6341 const String& constr_name =
6329 String::Handle(String::NewSymbol(kImmutableMapConstructorName)); 6342 String::Handle(String::NewSymbol(kImmutableMapConstructorName));
6330 const Function& map_constr = Function::ZoneHandle( 6343 const Function& map_constr = Function::ZoneHandle(
6331 map_class.LookupConstructor(constr_name)); 6344 map_class.LookupConstructor(constr_name));
6332 ASSERT(!map_constr.IsNull()); 6345 ASSERT(!map_constr.IsNull());
6333 return new LiteralNode(literal_pos, Instance::ZoneHandle( 6346 const Instance& const_instance = Instance::ZoneHandle(
6334 EvaluateConstConstructorCall( 6347 EvaluateConstConstructorCall(map_class,
6335 map_class, map_type_arguments, map_constr, constr_args))); 6348 map_type_arguments,
6349 map_constr,
6350 constr_args));
6351 if (const_instance.IsUnhandledException()) {
6352 return CreateEvalConstConstructorThrow(literal_pos, const_instance);
6353 } else {
6354 return new LiteralNode(literal_pos, const_instance);
6355 }
6336 } else { 6356 } else {
6337 // Static call at runtime. 6357 // Static call at runtime.
6338 const String& static_factory_name = 6358 const String& static_factory_name =
6339 String::Handle(String::NewSymbol(kMutableMapFromLiteralName)); 6359 String::Handle(String::NewSymbol(kMutableMapFromLiteralName));
6340 const Function& static_factory = Function::ZoneHandle( 6360 const Function& static_factory = Function::ZoneHandle(
6341 map_class.LookupStaticFunction(static_factory_name)); 6361 map_class.LookupStaticFunction(static_factory_name));
6342 ASSERT(!static_factory.IsNull()); 6362 ASSERT(!static_factory.IsNull());
6343 if (!map_type_arguments.IsNull() && 6363 if (!map_type_arguments.IsNull() &&
6344 !map_type_arguments.IsInstantiated() && 6364 !map_type_arguments.IsInstantiated() &&
6345 (current_block_->scope->function_level() > 0)) { 6365 (current_block_->scope->function_level() > 0)) {
(...skipping 203 matching lines...) Expand 10 before | Expand all | Expand 10 after
6549 String::Handle(type_class.Name()).ToCString()); 6569 String::Handle(type_class.Name()).ToCString());
6550 } 6570 }
6551 6571
6552 AstNode* new_object = NULL; 6572 AstNode* new_object = NULL;
6553 if (is_const) { 6573 if (is_const) {
6554 if (!constructor.is_const()) { 6574 if (!constructor.is_const()) {
6555 ErrorMsg("'const' requires const constructor: '%s'", 6575 ErrorMsg("'const' requires const constructor: '%s'",
6556 String::Handle(constructor.name()).ToCString()); 6576 String::Handle(constructor.name()).ToCString());
6557 } 6577 }
6558 const Instance& const_instance = Instance::ZoneHandle( 6578 const Instance& const_instance = Instance::ZoneHandle(
6559 EvaluateConstConstructorCall( 6579 EvaluateConstConstructorCall(type_class,
6560 type_class, type_arguments, constructor, arguments)); 6580 type_arguments,
6561 new_object = new LiteralNode(new_pos, const_instance); 6581 constructor,
6582 arguments));
6583 if (const_instance.IsUnhandledException()) {
6584 new_object = CreateEvalConstConstructorThrow(new_pos, const_instance);
6585 } else {
6586 new_object = new LiteralNode(new_pos, const_instance);
6587 }
6562 } else { 6588 } else {
6563 CheckFunctionIsCallable(new_pos, constructor); 6589 CheckFunctionIsCallable(new_pos, constructor);
6564 if (!type_arguments.IsNull() && 6590 if (!type_arguments.IsNull() &&
6565 !type_arguments.IsInstantiated() && 6591 !type_arguments.IsInstantiated() &&
6566 (current_block_->scope->function_level() > 0)) { 6592 (current_block_->scope->function_level() > 0)) {
6567 // Make sure that the instantiator is captured. 6593 // Make sure that the instantiator is captured.
6568 CaptureReceiver(); 6594 CaptureReceiver();
6569 } 6595 }
6570 new_object = new ConstructorCallNode( 6596 new_object = new ConstructorCallNode(
6571 new_pos, type_arguments, constructor, arguments); 6597 new_pos, type_arguments, constructor, arguments);
(...skipping 432 matching lines...) Expand 10 before | Expand all | Expand 10 after
7004 } 7030 }
7005 7031
7006 7032
7007 void Parser::SkipNestedExpr() { 7033 void Parser::SkipNestedExpr() {
7008 const bool saved_mode = SetAllowFunctionLiterals(true); 7034 const bool saved_mode = SetAllowFunctionLiterals(true);
7009 SkipExpr(); 7035 SkipExpr();
7010 SetAllowFunctionLiterals(saved_mode); 7036 SetAllowFunctionLiterals(saved_mode);
7011 } 7037 }
7012 7038
7013 } // namespace dart 7039 } // namespace dart
OLDNEW
« lib/regexp.cc ('K') | « vm/code_generator.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698