OLD | NEW |
---|---|
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, 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 "lib/invocation_mirror.h" | 7 #include "lib/invocation_mirror.h" |
8 #include "platform/utils.h" | 8 #include "platform/utils.h" |
9 #include "vm/ast_transformer.h" | 9 #include "vm/ast_transformer.h" |
10 #include "vm/bootstrap.h" | 10 #include "vm/bootstrap.h" |
(...skipping 1088 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1099 if (parsed_function->has_finally_return_temp_var()) { | 1099 if (parsed_function->has_finally_return_temp_var()) { |
1100 body->scope()->AddVariable(parsed_function->finally_return_temp_var()); | 1100 body->scope()->AddVariable(parsed_function->finally_return_temp_var()); |
1101 } | 1101 } |
1102 // The instantiator is not required in a static expression. | 1102 // The instantiator is not required in a static expression. |
1103 ASSERT(!parser.IsInstantiatorRequired()); | 1103 ASSERT(!parser.IsInstantiatorRequired()); |
1104 | 1104 |
1105 return parsed_function; | 1105 return parsed_function; |
1106 } | 1106 } |
1107 | 1107 |
1108 | 1108 |
1109 RawObject* Parser::ParseFunctionFromSource(const Class& owning_class, | |
1110 const String& source) { | |
1111 Isolate* isolate = Isolate::Current(); | |
1112 StackZone zone(isolate); | |
1113 LongJumpScope jump; | |
1114 if (setjmp(*jump.Set()) == 0) { | |
1115 const String& uri = String::Handle(Symbols::New("dynamically-added")); | |
1116 const Script& script = Script::Handle( | |
1117 Script::New(uri, source, RawScript::kSourceTag)); | |
1118 const Library& owning_library = Library::Handle(owning_class.library()); | |
1119 const String& private_key = String::Handle(owning_library.private_key()); | |
1120 script.Tokenize(private_key); | |
1121 const intptr_t token_pos = 0; | |
1122 Parser parser(script, owning_library, token_pos); | |
1123 parser.is_top_level_ = true; | |
1124 parser.set_current_class(owning_class); | |
1125 const String& class_name = String::Handle(owning_class.Name()); | |
1126 ClassDesc members(owning_class, class_name, false, token_pos); | |
1127 const intptr_t metadata_pos = parser.SkipMetadata(); | |
1128 parser.ParseClassMemberDefinition(&members, metadata_pos); | |
1129 ASSERT(members.functions().Length() == 1); | |
rmacnak
2014/12/04 23:28:04
Actually, make this return an error: a user could
Cutch
2014/12/04 23:31:45
Done.
| |
1130 const Function& func = | |
1131 Function::ZoneHandle(Function::RawCast(members.functions().At(0))); | |
1132 func.set_eval_script(script); | |
1133 ParsedFunction* parsed_function = new ParsedFunction(isolate, func); | |
1134 Parser::ParseFunction(parsed_function); | |
1135 return func.raw(); | |
1136 } else { | |
1137 const Error& error = Error::Handle(isolate->object_store()->sticky_error()); | |
1138 isolate->object_store()->clear_sticky_error(); | |
1139 return error.raw(); | |
1140 } | |
1141 UNREACHABLE(); | |
1142 } | |
1143 | |
1144 | |
1109 SequenceNode* Parser::ParseStaticFinalGetter(const Function& func) { | 1145 SequenceNode* Parser::ParseStaticFinalGetter(const Function& func) { |
1110 TRACE_PARSER("ParseStaticFinalGetter"); | 1146 TRACE_PARSER("ParseStaticFinalGetter"); |
1111 ParamList params; | 1147 ParamList params; |
1112 ASSERT(func.num_fixed_parameters() == 0); // static. | 1148 ASSERT(func.num_fixed_parameters() == 0); // static. |
1113 ASSERT(!func.HasOptionalParameters()); | 1149 ASSERT(!func.HasOptionalParameters()); |
1114 ASSERT(AbstractType::Handle(I, func.result_type()).IsResolved()); | 1150 ASSERT(AbstractType::Handle(I, func.result_type()).IsResolved()); |
1115 | 1151 |
1116 // Build local scope for function and populate with the formal parameters. | 1152 // Build local scope for function and populate with the formal parameters. |
1117 OpenFunctionBlock(func); | 1153 OpenFunctionBlock(func); |
1118 AddFormalParamsToScope(¶ms, current_block_->scope); | 1154 AddFormalParamsToScope(¶ms, current_block_->scope); |
(...skipping 2175 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
3294 ASSERT(CurrentToken() == Token::kPERIOD); // We checked above. | 3330 ASSERT(CurrentToken() == Token::kPERIOD); // We checked above. |
3295 ConsumeToken(); | 3331 ConsumeToken(); |
3296 return prefix.raw(); | 3332 return prefix.raw(); |
3297 } | 3333 } |
3298 | 3334 |
3299 | 3335 |
3300 void Parser::ParseMethodOrConstructor(ClassDesc* members, MemberDesc* method) { | 3336 void Parser::ParseMethodOrConstructor(ClassDesc* members, MemberDesc* method) { |
3301 TRACE_PARSER("ParseMethodOrConstructor"); | 3337 TRACE_PARSER("ParseMethodOrConstructor"); |
3302 ASSERT(CurrentToken() == Token::kLPAREN || method->IsGetter()); | 3338 ASSERT(CurrentToken() == Token::kLPAREN || method->IsGetter()); |
3303 ASSERT(method->type != NULL); | 3339 ASSERT(method->type != NULL); |
3304 ASSERT(method->name_pos > 0); | 3340 ASSERT(is_top_level_ || method->name_pos > 0); |
3305 ASSERT(current_member_ == method); | 3341 ASSERT(current_member_ == method); |
3306 | 3342 |
3307 if (method->has_var) { | 3343 if (method->has_var) { |
3308 ReportError(method->name_pos, "keyword var not allowed for methods"); | 3344 ReportError(method->name_pos, "keyword var not allowed for methods"); |
3309 } | 3345 } |
3310 if (method->has_final) { | 3346 if (method->has_final) { |
3311 ReportError(method->name_pos, "'final' not allowed for methods"); | 3347 ReportError(method->name_pos, "'final' not allowed for methods"); |
3312 } | 3348 } |
3313 if (method->has_abstract && method->has_static) { | 3349 if (method->has_abstract && method->has_static) { |
3314 ReportError(method->name_pos, | 3350 ReportError(method->name_pos, |
(...skipping 8851 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
12166 void Parser::SkipQualIdent() { | 12202 void Parser::SkipQualIdent() { |
12167 ASSERT(IsIdentifier()); | 12203 ASSERT(IsIdentifier()); |
12168 ConsumeToken(); | 12204 ConsumeToken(); |
12169 if (CurrentToken() == Token::kPERIOD) { | 12205 if (CurrentToken() == Token::kPERIOD) { |
12170 ConsumeToken(); // Consume the kPERIOD token. | 12206 ConsumeToken(); // Consume the kPERIOD token. |
12171 ExpectIdentifier("identifier expected after '.'"); | 12207 ExpectIdentifier("identifier expected after '.'"); |
12172 } | 12208 } |
12173 } | 12209 } |
12174 | 12210 |
12175 } // namespace dart | 12211 } // namespace dart |
OLD | NEW |