OLD | NEW |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |