Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2016, 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/kernel_reader.h" | 5 #include "vm/kernel_reader.h" |
| 6 | 6 |
| 7 #include <string.h> | 7 #include <string.h> |
| 8 | 8 |
| 9 #include "vm/dart_api_impl.h" | 9 #include "vm/dart_api_impl.h" |
| 10 #include "vm/longjump.h" | 10 #include "vm/longjump.h" |
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 76 dart::Zone* zone() const { return zone_; } | 76 dart::Zone* zone() const { return zone_; } |
| 77 | 77 |
| 78 private: | 78 private: |
| 79 TranslationHelper translation_helper_; | 79 TranslationHelper translation_helper_; |
| 80 dart::Zone* zone_; | 80 dart::Zone* zone_; |
| 81 bool is_simple_; | 81 bool is_simple_; |
| 82 dart::Instance* simple_value_; | 82 dart::Instance* simple_value_; |
| 83 }; | 83 }; |
| 84 | 84 |
| 85 | 85 |
| 86 RawArray* KernelReader::MakeFunctionsArray( | |
| 87 GrowableArray<const dart::Function*>* functions) { | |
| 88 const intptr_t len = functions->length(); | |
| 89 const Array& res = Array::Handle(zone_, Array::New(len, Heap::kOld)); | |
| 90 for (intptr_t i = 0; i < len; i++) { | |
| 91 res.SetAt(i, *functions->At(i)); | |
| 92 } | |
| 93 return res.raw(); | |
| 94 } | |
| 95 | |
| 96 | |
| 86 RawLibrary* BuildingTranslationHelper::LookupLibraryByKernelLibrary( | 97 RawLibrary* BuildingTranslationHelper::LookupLibraryByKernelLibrary( |
| 87 CanonicalName* library) { | 98 CanonicalName* library) { |
| 88 return reader_->LookupLibrary(library).raw(); | 99 return reader_->LookupLibrary(library).raw(); |
| 89 } | 100 } |
| 90 | 101 |
| 91 | 102 |
| 92 RawClass* BuildingTranslationHelper::LookupClassByKernelClass( | 103 RawClass* BuildingTranslationHelper::LookupClassByKernelClass( |
| 93 CanonicalName* klass) { | 104 CanonicalName* klass) { |
| 94 return reader_->LookupClass(klass).raw(); | 105 return reader_->LookupClass(klass).raw(); |
| 95 } | 106 } |
| (...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 162 // Setup toplevel class (which contains library fields/procedures). | 173 // Setup toplevel class (which contains library fields/procedures). |
| 163 | 174 |
| 164 Script& script = ScriptAt(kernel_library->source_uri_index(), | 175 Script& script = ScriptAt(kernel_library->source_uri_index(), |
| 165 kernel_library->import_uri()); | 176 kernel_library->import_uri()); |
| 166 dart::Class& toplevel_class = dart::Class::Handle( | 177 dart::Class& toplevel_class = dart::Class::Handle( |
| 167 Z, dart::Class::New(library, Symbols::TopLevel(), script, | 178 Z, dart::Class::New(library, Symbols::TopLevel(), script, |
| 168 TokenPosition::kNoSource)); | 179 TokenPosition::kNoSource)); |
| 169 toplevel_class.set_is_cycle_free(); | 180 toplevel_class.set_is_cycle_free(); |
| 170 library.set_toplevel_class(toplevel_class); | 181 library.set_toplevel_class(toplevel_class); |
| 171 | 182 |
| 183 GrowableArray<const dart::Function*> functions; | |
|
Vyacheslav Egorov (Google)
2017/03/27 17:31:55
Maybe make
functions_ and fields_ members of the
Dmitry Olshansky
2017/03/27 18:08:47
Done.
| |
| 184 intptr_t num_fields = kernel_library->fields().length(); | |
| 185 GrowableArray<const dart::Field*> fields(num_fields); | |
| 172 ActiveClassScope active_class_scope(&active_class_, NULL, &toplevel_class); | 186 ActiveClassScope active_class_scope(&active_class_, NULL, &toplevel_class); |
| 173 // Load toplevel fields. | 187 // Load toplevel fields. |
| 174 for (intptr_t i = 0; i < kernel_library->fields().length(); i++) { | 188 for (intptr_t i = 0; i < num_fields; i++) { |
| 175 Field* kernel_field = kernel_library->fields()[i]; | 189 Field* kernel_field = kernel_library->fields()[i]; |
| 176 | 190 |
| 177 ActiveMemberScope active_member_scope(&active_class_, kernel_field); | 191 ActiveMemberScope active_member_scope(&active_class_, kernel_field); |
| 178 const dart::String& name = H.DartFieldName(kernel_field->name()); | 192 const dart::String& name = H.DartFieldName(kernel_field->name()); |
| 179 const Object& script_class = | 193 const Object& script_class = |
| 180 ClassForScriptAt(toplevel_class, kernel_field->source_uri_index()); | 194 ClassForScriptAt(toplevel_class, kernel_field->source_uri_index()); |
| 181 dart::Field& field = dart::Field::Handle( | 195 dart::Field& field = dart::Field::Handle( |
| 182 Z, dart::Field::NewTopLevel(name, kernel_field->IsFinal(), | 196 Z, dart::Field::NewTopLevel(name, kernel_field->IsFinal(), |
| 183 kernel_field->IsConst(), script_class, | 197 kernel_field->IsConst(), script_class, |
| 184 kernel_field->position())); | 198 kernel_field->position())); |
| 185 field.set_kernel_field(kernel_field); | 199 field.set_kernel_field(kernel_field); |
| 186 const AbstractType& type = T.TranslateType(kernel_field->type()); | 200 const AbstractType& type = T.TranslateType(kernel_field->type()); |
| 187 field.SetFieldType(type); | 201 field.SetFieldType(type); |
| 188 field.set_has_initializer(kernel_field->initializer() != NULL); | 202 field.set_has_initializer(kernel_field->initializer() != NULL); |
| 189 GenerateFieldAccessors(toplevel_class, field, kernel_field); | 203 GenerateFieldAccessors(toplevel_class, field, kernel_field, &functions); |
| 190 toplevel_class.AddField(field); | 204 fields.Add(&field); |
| 191 library.AddObject(field, name); | 205 library.AddObject(field, name); |
| 192 } | 206 } |
| 207 toplevel_class.AddFields(fields); | |
| 193 | 208 |
| 194 // Load toplevel procedures. | 209 // Load toplevel procedures. |
| 195 for (intptr_t i = 0; i < kernel_library->procedures().length(); i++) { | 210 for (intptr_t i = 0; i < kernel_library->procedures().length(); i++) { |
| 196 Procedure* kernel_procedure = kernel_library->procedures()[i]; | 211 Procedure* kernel_procedure = kernel_library->procedures()[i]; |
| 197 ReadProcedure(library, toplevel_class, kernel_procedure); | 212 ReadProcedure(library, toplevel_class, kernel_procedure, NULL, &functions); |
| 198 } | 213 } |
| 199 | 214 |
| 215 toplevel_class.SetFunctions(Array::Handle(MakeFunctionsArray(&functions))); | |
| 216 | |
| 200 const GrowableObjectArray& classes = | 217 const GrowableObjectArray& classes = |
| 201 GrowableObjectArray::Handle(I->object_store()->pending_classes()); | 218 GrowableObjectArray::Handle(I->object_store()->pending_classes()); |
| 202 | 219 |
| 203 // Load all classes. | 220 // Load all classes. |
| 204 for (intptr_t i = 0; i < kernel_library->classes().length(); i++) { | 221 for (intptr_t i = 0; i < kernel_library->classes().length(); i++) { |
| 205 Class* kernel_klass = kernel_library->classes()[i]; | 222 Class* kernel_klass = kernel_library->classes()[i]; |
| 206 classes.Add(ReadClass(library, toplevel_class, kernel_klass), Heap::kOld); | 223 classes.Add(ReadClass(library, toplevel_class, kernel_klass), Heap::kOld); |
| 207 } | 224 } |
| 208 | 225 |
| 209 classes.Add(toplevel_class, Heap::kOld); | 226 classes.Add(toplevel_class, Heap::kOld); |
| (...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 295 klass.set_script(ScriptAt(kernel_klass->source_uri_index())); | 312 klass.set_script(ScriptAt(kernel_klass->source_uri_index())); |
| 296 } | 313 } |
| 297 if (klass.token_pos() == TokenPosition::kNoSource) { | 314 if (klass.token_pos() == TokenPosition::kNoSource) { |
| 298 klass.set_token_pos(kernel_klass->position()); | 315 klass.set_token_pos(kernel_klass->position()); |
| 299 } | 316 } |
| 300 if (!klass.is_cycle_free()) { | 317 if (!klass.is_cycle_free()) { |
| 301 ReadPreliminaryClass(&klass, kernel_klass); | 318 ReadPreliminaryClass(&klass, kernel_klass); |
| 302 } | 319 } |
| 303 | 320 |
| 304 ActiveClassScope active_class_scope(&active_class_, kernel_klass, &klass); | 321 ActiveClassScope active_class_scope(&active_class_, kernel_klass, &klass); |
| 322 GrowableArray<const dart::Function*> functions; | |
| 305 | 323 |
| 306 if (library.raw() == dart::Library::InternalLibrary() && | 324 if (library.raw() == dart::Library::InternalLibrary() && |
| 307 klass.Name() == Symbols::ClassID().raw()) { | 325 klass.Name() == Symbols::ClassID().raw()) { |
| 308 // If this is a dart:internal.ClassID class ignore field declarations | 326 // If this is a dart:internal.ClassID class ignore field declarations |
| 309 // contained in the Kernel file and instead inject our own const | 327 // contained in the Kernel file and instead inject our own const |
| 310 // fields. | 328 // fields. |
| 311 klass.InjectCIDFields(); | 329 klass.InjectCIDFields(); |
| 312 } else { | 330 } else { |
| 313 for (intptr_t i = 0; i < kernel_klass->fields().length(); i++) { | 331 intptr_t num_fields = kernel_klass->fields().length(); |
| 332 GrowableArray<const dart::Field*> fields(num_fields); | |
| 333 for (intptr_t i = 0; i < num_fields; i++) { | |
| 314 Field* kernel_field = kernel_klass->fields()[i]; | 334 Field* kernel_field = kernel_klass->fields()[i]; |
| 315 ActiveMemberScope active_member_scope(&active_class_, kernel_field); | 335 ActiveMemberScope active_member_scope(&active_class_, kernel_field); |
| 316 | 336 |
| 317 const dart::String& name = H.DartFieldName(kernel_field->name()); | 337 const dart::String& name = H.DartFieldName(kernel_field->name()); |
| 318 const AbstractType& type = | 338 const AbstractType& type = |
| 319 T.TranslateTypeWithoutFinalization(kernel_field->type()); | 339 T.TranslateTypeWithoutFinalization(kernel_field->type()); |
| 320 const Object& script_class = | 340 const Object& script_class = |
| 321 ClassForScriptAt(klass, kernel_field->source_uri_index()); | 341 ClassForScriptAt(klass, kernel_field->source_uri_index()); |
| 322 dart::Field& field = dart::Field::Handle( | 342 dart::Field& field = dart::Field::Handle( |
| 323 Z, | 343 Z, |
| 324 dart::Field::New(name, kernel_field->IsStatic(), | 344 dart::Field::New(name, kernel_field->IsStatic(), |
| 325 // In the VM all const fields are implicitly final | 345 // In the VM all const fields are implicitly final |
| 326 // whereas in Kernel they are not final because they | 346 // whereas in Kernel they are not final because they |
| 327 // are not explicitly declared that way. | 347 // are not explicitly declared that way. |
| 328 kernel_field->IsFinal() || kernel_field->IsConst(), | 348 kernel_field->IsFinal() || kernel_field->IsConst(), |
| 329 kernel_field->IsConst(), | 349 kernel_field->IsConst(), |
| 330 false, // is_reflectable | 350 false, // is_reflectable |
| 331 script_class, type, kernel_field->position())); | 351 script_class, type, kernel_field->position())); |
| 332 field.set_kernel_field(kernel_field); | 352 field.set_kernel_field(kernel_field); |
| 333 field.set_has_initializer(kernel_field->initializer() != NULL); | 353 field.set_has_initializer(kernel_field->initializer() != NULL); |
| 334 GenerateFieldAccessors(klass, field, kernel_field); | 354 GenerateFieldAccessors(klass, field, kernel_field, &functions); |
| 335 klass.AddField(field); | 355 fields.Add(&field); |
| 336 } | 356 } |
| 357 klass.AddFields(fields); | |
| 337 } | 358 } |
| 338 | 359 |
| 339 for (intptr_t i = 0; i < kernel_klass->constructors().length(); i++) { | 360 for (intptr_t i = 0; i < kernel_klass->constructors().length(); i++) { |
| 340 Constructor* kernel_constructor = kernel_klass->constructors()[i]; | 361 Constructor* kernel_constructor = kernel_klass->constructors()[i]; |
| 341 ActiveMemberScope active_member_scope(&active_class_, kernel_constructor); | 362 ActiveMemberScope active_member_scope(&active_class_, kernel_constructor); |
| 342 ActiveFunctionScope active_function_scope(&active_class_, | 363 ActiveFunctionScope active_function_scope(&active_class_, |
| 343 kernel_constructor->function()); | 364 kernel_constructor->function()); |
| 344 | 365 |
| 345 const dart::String& name = H.DartConstructorName(kernel_constructor); | 366 const dart::String& name = H.DartConstructorName(kernel_constructor); |
| 346 Function& function = dart::Function::ZoneHandle( | 367 Function& function = dart::Function::ZoneHandle( |
| 347 Z, dart::Function::New(name, RawFunction::kConstructor, | 368 Z, dart::Function::New(name, RawFunction::kConstructor, |
| 348 false, // is_static | 369 false, // is_static |
| 349 kernel_constructor->IsConst(), | 370 kernel_constructor->IsConst(), |
| 350 false, // is_abstract | 371 false, // is_abstract |
| 351 kernel_constructor->IsExternal(), | 372 kernel_constructor->IsExternal(), |
| 352 false, // is_native | 373 false, // is_native |
| 353 klass, kernel_constructor->position())); | 374 klass, kernel_constructor->position())); |
| 354 function.set_end_token_pos(kernel_constructor->end_position()); | 375 function.set_end_token_pos(kernel_constructor->end_position()); |
| 355 klass.AddFunction(function); | 376 functions.Add(&function); |
| 356 function.set_kernel_function(kernel_constructor); | 377 function.set_kernel_function(kernel_constructor); |
| 357 function.set_result_type(T.ReceiverType(klass)); | 378 function.set_result_type(T.ReceiverType(klass)); |
| 358 SetupFunctionParameters(H, T, klass, function, | 379 SetupFunctionParameters(H, T, klass, function, |
| 359 kernel_constructor->function(), | 380 kernel_constructor->function(), |
| 360 true, // is_method | 381 true, // is_method |
| 361 false); // is_closure | 382 false); // is_closure |
| 362 | 383 |
| 363 if (FLAG_enable_mirrors) { | 384 if (FLAG_enable_mirrors) { |
| 364 library.AddFunctionMetadata(function, TokenPosition::kNoSource, | 385 library.AddFunctionMetadata(function, TokenPosition::kNoSource, |
| 365 kernel_constructor); | 386 kernel_constructor); |
| 366 } | 387 } |
| 367 } | 388 } |
| 368 | 389 |
| 369 for (intptr_t i = 0; i < kernel_klass->procedures().length(); i++) { | 390 for (intptr_t i = 0; i < kernel_klass->procedures().length(); i++) { |
| 370 Procedure* kernel_procedure = kernel_klass->procedures()[i]; | 391 Procedure* kernel_procedure = kernel_klass->procedures()[i]; |
| 371 ActiveMemberScope active_member_scope(&active_class_, kernel_procedure); | 392 ActiveMemberScope active_member_scope(&active_class_, kernel_procedure); |
| 372 ReadProcedure(library, klass, kernel_procedure, kernel_klass); | 393 ReadProcedure(library, klass, kernel_procedure, kernel_klass, &functions); |
| 373 } | 394 } |
| 374 | 395 |
| 396 klass.SetFunctions(Array::Handle(MakeFunctionsArray(&functions))); | |
| 397 | |
| 375 if (!klass.is_marked_for_parsing()) { | 398 if (!klass.is_marked_for_parsing()) { |
| 376 klass.set_is_marked_for_parsing(); | 399 klass.set_is_marked_for_parsing(); |
| 377 } | 400 } |
| 378 | 401 |
| 379 if (FLAG_enable_mirrors) { | 402 if (FLAG_enable_mirrors) { |
| 380 library.AddClassMetadata(klass, toplevel_class, TokenPosition::kNoSource, | 403 library.AddClassMetadata(klass, toplevel_class, TokenPosition::kNoSource, |
| 381 kernel_klass); | 404 kernel_klass); |
| 382 } | 405 } |
| 383 | 406 |
| 384 return klass; | 407 return klass; |
| 385 } | 408 } |
| 386 | 409 |
| 387 | 410 |
| 388 void KernelReader::ReadProcedure(const dart::Library& library, | 411 void KernelReader::ReadProcedure( |
| 389 const dart::Class& owner, | 412 const dart::Library& library, |
| 390 Procedure* kernel_procedure, | 413 const dart::Class& owner, |
| 391 Class* kernel_klass) { | 414 Procedure* kernel_procedure, |
| 415 Class* kernel_klass, | |
| 416 GrowableArray<const dart::Function*>* functions) { | |
| 392 ActiveClassScope active_class_scope(&active_class_, kernel_klass, &owner); | 417 ActiveClassScope active_class_scope(&active_class_, kernel_klass, &owner); |
| 393 ActiveMemberScope active_member_scope(&active_class_, kernel_procedure); | 418 ActiveMemberScope active_member_scope(&active_class_, kernel_procedure); |
| 394 ActiveFunctionScope active_function_scope(&active_class_, | 419 ActiveFunctionScope active_function_scope(&active_class_, |
| 395 kernel_procedure->function()); | 420 kernel_procedure->function()); |
| 396 | 421 |
| 397 const dart::String& name = H.DartProcedureName(kernel_procedure); | 422 const dart::String& name = H.DartProcedureName(kernel_procedure); |
| 398 bool is_method = kernel_klass != NULL && !kernel_procedure->IsStatic(); | 423 bool is_method = kernel_klass != NULL && !kernel_procedure->IsStatic(); |
| 399 bool is_abstract = kernel_procedure->IsAbstract(); | 424 bool is_abstract = kernel_procedure->IsAbstract(); |
| 400 bool is_external = kernel_procedure->IsExternal(); | 425 bool is_external = kernel_procedure->IsExternal(); |
| 401 dart::String* native_name = NULL; | 426 dart::String* native_name = NULL; |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 433 const Object& script_class = | 458 const Object& script_class = |
| 434 ClassForScriptAt(owner, kernel_procedure->source_uri_index()); | 459 ClassForScriptAt(owner, kernel_procedure->source_uri_index()); |
| 435 dart::Function& function = dart::Function::ZoneHandle( | 460 dart::Function& function = dart::Function::ZoneHandle( |
| 436 Z, Function::New(name, GetFunctionType(kernel_procedure), | 461 Z, Function::New(name, GetFunctionType(kernel_procedure), |
| 437 !is_method, // is_static | 462 !is_method, // is_static |
| 438 false, // is_const | 463 false, // is_const |
| 439 is_abstract, is_external, | 464 is_abstract, is_external, |
| 440 native_name != NULL, // is_native | 465 native_name != NULL, // is_native |
| 441 script_class, kernel_procedure->position())); | 466 script_class, kernel_procedure->position())); |
| 442 function.set_end_token_pos(kernel_procedure->end_position()); | 467 function.set_end_token_pos(kernel_procedure->end_position()); |
| 443 owner.AddFunction(function); | 468 functions->Add(&function); |
| 444 function.set_kernel_function(kernel_procedure); | 469 function.set_kernel_function(kernel_procedure); |
| 445 | 470 |
| 446 function.set_is_debuggable( | 471 function.set_is_debuggable( |
| 447 kernel_procedure->function()->dart_async_marker() == FunctionNode::kSync); | 472 kernel_procedure->function()->dart_async_marker() == FunctionNode::kSync); |
| 448 switch (kernel_procedure->function()->dart_async_marker()) { | 473 switch (kernel_procedure->function()->dart_async_marker()) { |
| 449 case FunctionNode::kSyncStar: | 474 case FunctionNode::kSyncStar: |
| 450 function.set_modifier(RawFunction::kSyncGen); | 475 function.set_modifier(RawFunction::kSyncGen); |
| 451 break; | 476 break; |
| 452 case FunctionNode::kAsync: | 477 case FunctionNode::kAsync: |
| 453 function.set_modifier(RawFunction::kAsync); | 478 function.set_modifier(RawFunction::kAsync); |
| (...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 567 script.set_debug_positions(array_object); | 592 script.set_debug_positions(array_object); |
| 568 | 593 |
| 569 // Create yield_positions array for the script. | 594 // Create yield_positions array for the script. |
| 570 array_object ^= AsSortedDuplicateFreeArray( | 595 array_object ^= AsSortedDuplicateFreeArray( |
| 571 source_uri_index, &program_->yield_token_positions); | 596 source_uri_index, &program_->yield_token_positions); |
| 572 script.set_yield_positions(array_object); | 597 script.set_yield_positions(array_object); |
| 573 } | 598 } |
| 574 return script; | 599 return script; |
| 575 } | 600 } |
| 576 | 601 |
| 577 void KernelReader::GenerateFieldAccessors(const dart::Class& klass, | 602 void KernelReader::GenerateFieldAccessors( |
| 578 const dart::Field& field, | 603 const dart::Class& klass, |
| 579 Field* kernel_field) { | 604 const dart::Field& field, |
| 605 Field* kernel_field, | |
| 606 GrowableArray<const dart::Function*>* functions) { | |
| 580 if (kernel_field->IsStatic() && kernel_field->initializer() == NULL) { | 607 if (kernel_field->IsStatic() && kernel_field->initializer() == NULL) { |
| 581 // Static fields without an initializer are implicitly initialized to null. | 608 // Static fields without an initializer are implicitly initialized to null. |
| 582 // We do not need a getter. | 609 // We do not need a getter. |
| 583 field.SetStaticValue(Instance::Handle(Z), true); | 610 field.SetStaticValue(Instance::Handle(Z), true); |
| 584 return; | 611 return; |
| 585 } | 612 } |
| 586 if (kernel_field->initializer() != NULL) { | 613 if (kernel_field->initializer() != NULL) { |
| 587 SimpleExpressionConverter converter(H.thread()); | 614 SimpleExpressionConverter converter(H.thread()); |
| 588 const bool has_simple_initializer = | 615 const bool has_simple_initializer = |
| 589 converter.IsSimple(kernel_field->initializer()); | 616 converter.IsSimple(kernel_field->initializer()); |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 622 // The functions created by the parser have is_const for static fields | 649 // The functions created by the parser have is_const for static fields |
| 623 // that are const (not just final) and they have is_const for | 650 // that are const (not just final) and they have is_const for |
| 624 // non-static | 651 // non-static |
| 625 // fields that are final. | 652 // fields that are final. |
| 626 kernel_field->IsStatic() ? kernel_field->IsConst() | 653 kernel_field->IsStatic() ? kernel_field->IsConst() |
| 627 : kernel_field->IsFinal(), | 654 : kernel_field->IsFinal(), |
| 628 false, // is_abstract | 655 false, // is_abstract |
| 629 false, // is_external | 656 false, // is_external |
| 630 false, // is_native | 657 false, // is_native |
| 631 script_class, kernel_field->position())); | 658 script_class, kernel_field->position())); |
| 632 klass.AddFunction(getter); | 659 functions->Add(&getter); |
| 633 getter.set_end_token_pos(kernel_field->end_position()); | 660 getter.set_end_token_pos(kernel_field->end_position()); |
| 634 getter.set_kernel_function(kernel_field); | 661 getter.set_kernel_function(kernel_field); |
| 635 getter.set_result_type(AbstractType::Handle(Z, field.type())); | 662 getter.set_result_type(AbstractType::Handle(Z, field.type())); |
| 636 getter.set_is_debuggable(false); | 663 getter.set_is_debuggable(false); |
| 637 SetupFieldAccessorFunction(klass, getter); | 664 SetupFieldAccessorFunction(klass, getter); |
| 638 | 665 |
| 639 if (!kernel_field->IsStatic() && !kernel_field->IsFinal()) { | 666 if (!kernel_field->IsStatic() && !kernel_field->IsFinal()) { |
| 640 // Only static fields can be const. | 667 // Only static fields can be const. |
| 641 ASSERT(!kernel_field->IsConst()); | 668 ASSERT(!kernel_field->IsConst()); |
| 642 const dart::String& setter_name = H.DartSetterName(kernel_field->name()); | 669 const dart::String& setter_name = H.DartSetterName(kernel_field->name()); |
| 643 Function& setter = Function::ZoneHandle( | 670 Function& setter = Function::ZoneHandle( |
| 644 Z, Function::New(setter_name, RawFunction::kImplicitSetter, | 671 Z, Function::New(setter_name, RawFunction::kImplicitSetter, |
| 645 false, // is_static | 672 false, // is_static |
| 646 false, // is_const | 673 false, // is_const |
| 647 false, // is_abstract | 674 false, // is_abstract |
| 648 false, // is_external | 675 false, // is_external |
| 649 false, // is_native | 676 false, // is_native |
| 650 script_class, kernel_field->position())); | 677 script_class, kernel_field->position())); |
| 651 klass.AddFunction(setter); | 678 functions->Add(&setter); |
| 652 setter.set_end_token_pos(kernel_field->end_position()); | 679 setter.set_end_token_pos(kernel_field->end_position()); |
| 653 setter.set_kernel_function(kernel_field); | 680 setter.set_kernel_function(kernel_field); |
| 654 setter.set_result_type(Object::void_type()); | 681 setter.set_result_type(Object::void_type()); |
| 655 setter.set_is_debuggable(false); | 682 setter.set_is_debuggable(false); |
| 656 SetupFieldAccessorFunction(klass, setter); | 683 SetupFieldAccessorFunction(klass, setter); |
| 657 } | 684 } |
| 658 } | 685 } |
| 659 | 686 |
| 660 | 687 |
| 661 void KernelReader::SetupFunctionParameters(TranslationHelper translation_helper, | 688 void KernelReader::SetupFunctionParameters(TranslationHelper translation_helper, |
| (...skipping 177 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 839 initializer_fun.set_is_debuggable(false); | 866 initializer_fun.set_is_debuggable(false); |
| 840 initializer_fun.set_is_reflectable(false); | 867 initializer_fun.set_is_reflectable(false); |
| 841 initializer_fun.set_is_inlinable(false); | 868 initializer_fun.set_is_inlinable(false); |
| 842 return new (zone) ParsedFunction(thread, initializer_fun); | 869 return new (zone) ParsedFunction(thread, initializer_fun); |
| 843 } | 870 } |
| 844 | 871 |
| 845 | 872 |
| 846 } // namespace kernel | 873 } // namespace kernel |
| 847 } // namespace dart | 874 } // namespace dart |
| 848 #endif // !defined(DART_PRECOMPILED_RUNTIME) | 875 #endif // !defined(DART_PRECOMPILED_RUNTIME) |
| OLD | NEW |