| 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 <set> | 5 #include <set> |
| 6 | 6 |
| 7 #include "vm/kernel_to_il.h" | 7 #include "vm/kernel_to_il.h" |
| 8 | 8 |
| 9 #include "vm/compiler.h" | 9 #include "vm/compiler.h" |
| 10 #include "vm/intermediate_language.h" | 10 #include "vm/intermediate_language.h" |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 64 Fragment operator<<(const Fragment& fragment, Instruction* next) { | 64 Fragment operator<<(const Fragment& fragment, Instruction* next) { |
| 65 Fragment result = fragment; | 65 Fragment result = fragment; |
| 66 result <<= next; | 66 result <<= next; |
| 67 return result; | 67 return result; |
| 68 } | 68 } |
| 69 | 69 |
| 70 intptr_t ActiveClass::MemberTypeParameterCount(Zone* zone) { | 70 intptr_t ActiveClass::MemberTypeParameterCount(Zone* zone) { |
| 71 ASSERT(member != NULL); | 71 ASSERT(member != NULL); |
| 72 if (member->IsFactory()) { | 72 if (member->IsFactory()) { |
| 73 TypeArguments& class_types = | 73 TypeArguments& class_types = |
| 74 dart::TypeArguments::Handle(zone, klass->type_parameters()); | 74 TypeArguments::Handle(zone, klass->type_parameters()); |
| 75 return class_types.Length(); | 75 return class_types.Length(); |
| 76 } else if (member->IsMethodExtractor()) { | 76 } else if (member->IsMethodExtractor()) { |
| 77 Function& extracted = | 77 Function& extracted = |
| 78 Function::Handle(zone, member->extracted_method_closure()); | 78 Function::Handle(zone, member->extracted_method_closure()); |
| 79 TypeArguments& function_types = | 79 TypeArguments& function_types = |
| 80 dart::TypeArguments::Handle(zone, extracted.type_parameters()); | 80 TypeArguments::Handle(zone, extracted.type_parameters()); |
| 81 return function_types.Length(); | 81 return function_types.Length(); |
| 82 } else { | 82 } else { |
| 83 TypeArguments& function_types = | 83 TypeArguments& function_types = |
| 84 dart::TypeArguments::Handle(zone, member->type_parameters()); | 84 TypeArguments::Handle(zone, member->type_parameters()); |
| 85 return function_types.Length(); | 85 return function_types.Length(); |
| 86 } | 86 } |
| 87 } | 87 } |
| 88 | 88 |
| 89 TranslationHelper::TranslationHelper(Thread* thread) | 89 TranslationHelper::TranslationHelper(Thread* thread) |
| 90 : thread_(thread), | 90 : thread_(thread), |
| 91 zone_(thread->zone()), | 91 zone_(thread->zone()), |
| 92 isolate_(thread->isolate()), | 92 isolate_(thread->isolate()), |
| 93 allocation_space_(thread->IsMutatorThread() ? Heap::kNew : Heap::kOld), | 93 allocation_space_(thread->IsMutatorThread() ? Heap::kNew : Heap::kOld), |
| 94 string_offsets_(TypedData::Handle(Z)), | 94 string_offsets_(TypedData::Handle(Z)), |
| 95 string_data_(TypedData::Handle(Z)), | 95 string_data_(TypedData::Handle(Z)), |
| 96 canonical_names_(TypedData::Handle(Z)) {} | 96 canonical_names_(TypedData::Handle(Z)) {} |
| 97 | 97 |
| 98 TranslationHelper::TranslationHelper(Thread* thread, | 98 TranslationHelper::TranslationHelper(Thread* thread, |
| 99 dart::RawTypedData* string_offsets, | 99 RawTypedData* string_offsets, |
| 100 dart::RawTypedData* string_data, | 100 RawTypedData* string_data, |
| 101 dart::RawTypedData* canonical_names) | 101 RawTypedData* canonical_names) |
| 102 : thread_(thread), | 102 : thread_(thread), |
| 103 zone_(thread->zone()), | 103 zone_(thread->zone()), |
| 104 isolate_(thread->isolate()), | 104 isolate_(thread->isolate()), |
| 105 allocation_space_(Heap::kNew), | 105 allocation_space_(Heap::kNew), |
| 106 string_offsets_(TypedData::Handle(Z, string_offsets)), | 106 string_offsets_(TypedData::Handle(Z, string_offsets)), |
| 107 string_data_(TypedData::Handle(Z, string_data)), | 107 string_data_(TypedData::Handle(Z, string_data)), |
| 108 canonical_names_(TypedData::Handle(Z, canonical_names)) { | 108 canonical_names_(TypedData::Handle(Z, canonical_names)) { |
| 109 ASSERT(thread->IsMutatorThread()); | 109 ASSERT(thread->IsMutatorThread()); |
| 110 } | 110 } |
| 111 | 111 |
| (...skipping 183 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 295 if (instance.IsNull()) return instance.raw(); | 295 if (instance.IsNull()) return instance.raw(); |
| 296 | 296 |
| 297 const char* error_str = NULL; | 297 const char* error_str = NULL; |
| 298 RawInstance* result = instance.CheckAndCanonicalize(thread(), &error_str); | 298 RawInstance* result = instance.CheckAndCanonicalize(thread(), &error_str); |
| 299 if (result == Object::null()) { | 299 if (result == Object::null()) { |
| 300 ReportError("Invalid const object %s", error_str); | 300 ReportError("Invalid const object %s", error_str); |
| 301 } | 301 } |
| 302 return result; | 302 return result; |
| 303 } | 303 } |
| 304 | 304 |
| 305 const dart::String& TranslationHelper::DartString(const char* content, | 305 const String& TranslationHelper::DartString(const char* content, |
| 306 Heap::Space space) { | 306 Heap::Space space) { |
| 307 return dart::String::ZoneHandle(Z, dart::String::New(content, space)); | 307 return String::ZoneHandle(Z, String::New(content, space)); |
| 308 } | 308 } |
| 309 | 309 |
| 310 dart::String& TranslationHelper::DartString(StringIndex string_index, | 310 String& TranslationHelper::DartString(StringIndex string_index, |
| 311 Heap::Space space) { | 311 Heap::Space space) { |
| 312 intptr_t length = StringSize(string_index); | 312 intptr_t length = StringSize(string_index); |
| 313 uint8_t* buffer = Z->Alloc<uint8_t>(length); | 313 uint8_t* buffer = Z->Alloc<uint8_t>(length); |
| 314 { | 314 { |
| 315 NoSafepointScope no_safepoint; | 315 NoSafepointScope no_safepoint; |
| 316 memmove(buffer, string_data_.DataAddr(StringOffset(string_index)), length); | 316 memmove(buffer, string_data_.DataAddr(StringOffset(string_index)), length); |
| 317 } | 317 } |
| 318 return dart::String::ZoneHandle( | 318 return String::ZoneHandle(Z, String::FromUTF8(buffer, length, space)); |
| 319 Z, dart::String::FromUTF8(buffer, length, space)); | |
| 320 } | 319 } |
| 321 | 320 |
| 322 dart::String& TranslationHelper::DartString(const uint8_t* utf8_array, | 321 String& TranslationHelper::DartString(const uint8_t* utf8_array, |
| 323 intptr_t len, | 322 intptr_t len, |
| 324 Heap::Space space) { | 323 Heap::Space space) { |
| 325 return dart::String::ZoneHandle( | 324 return String::ZoneHandle(Z, String::FromUTF8(utf8_array, len, space)); |
| 326 Z, dart::String::FromUTF8(utf8_array, len, space)); | |
| 327 } | 325 } |
| 328 | 326 |
| 329 const dart::String& TranslationHelper::DartSymbol(const char* content) const { | 327 const String& TranslationHelper::DartSymbol(const char* content) const { |
| 330 return dart::String::ZoneHandle(Z, Symbols::New(thread_, content)); | 328 return String::ZoneHandle(Z, Symbols::New(thread_, content)); |
| 331 } | 329 } |
| 332 | 330 |
| 333 dart::String& TranslationHelper::DartSymbol(StringIndex string_index) const { | 331 String& TranslationHelper::DartSymbol(StringIndex string_index) const { |
| 334 intptr_t length = StringSize(string_index); | 332 intptr_t length = StringSize(string_index); |
| 335 uint8_t* buffer = Z->Alloc<uint8_t>(length); | 333 uint8_t* buffer = Z->Alloc<uint8_t>(length); |
| 336 { | 334 { |
| 337 NoSafepointScope no_safepoint; | 335 NoSafepointScope no_safepoint; |
| 338 memmove(buffer, string_data_.DataAddr(StringOffset(string_index)), length); | 336 memmove(buffer, string_data_.DataAddr(StringOffset(string_index)), length); |
| 339 } | 337 } |
| 340 return dart::String::ZoneHandle(Z, | 338 return String::ZoneHandle(Z, Symbols::FromUTF8(thread_, buffer, length)); |
| 341 Symbols::FromUTF8(thread_, buffer, length)); | |
| 342 } | 339 } |
| 343 | 340 |
| 344 dart::String& TranslationHelper::DartSymbol(const uint8_t* utf8_array, | 341 String& TranslationHelper::DartSymbol(const uint8_t* utf8_array, |
| 345 intptr_t len) const { | 342 intptr_t len) const { |
| 346 return dart::String::ZoneHandle(Z, | 343 return String::ZoneHandle(Z, Symbols::FromUTF8(thread_, utf8_array, len)); |
| 347 Symbols::FromUTF8(thread_, utf8_array, len)); | |
| 348 } | 344 } |
| 349 | 345 |
| 350 const dart::String& TranslationHelper::DartClassName(NameIndex kernel_class) { | 346 const String& TranslationHelper::DartClassName(NameIndex kernel_class) { |
| 351 ASSERT(IsClass(kernel_class)); | 347 ASSERT(IsClass(kernel_class)); |
| 352 dart::String& name = DartString(CanonicalNameString(kernel_class)); | 348 String& name = DartString(CanonicalNameString(kernel_class)); |
| 353 return ManglePrivateName(CanonicalNameParent(kernel_class), &name); | 349 return ManglePrivateName(CanonicalNameParent(kernel_class), &name); |
| 354 } | 350 } |
| 355 | 351 |
| 356 const dart::String& TranslationHelper::DartConstructorName( | 352 const String& TranslationHelper::DartConstructorName(NameIndex constructor) { |
| 357 NameIndex constructor) { | |
| 358 ASSERT(IsConstructor(constructor)); | 353 ASSERT(IsConstructor(constructor)); |
| 359 return DartFactoryName(constructor); | 354 return DartFactoryName(constructor); |
| 360 } | 355 } |
| 361 | 356 |
| 362 const dart::String& TranslationHelper::DartProcedureName(NameIndex procedure) { | 357 const String& TranslationHelper::DartProcedureName(NameIndex procedure) { |
| 363 ASSERT(IsProcedure(procedure)); | 358 ASSERT(IsProcedure(procedure)); |
| 364 if (IsSetter(procedure)) { | 359 if (IsSetter(procedure)) { |
| 365 return DartSetterName(procedure); | 360 return DartSetterName(procedure); |
| 366 } else if (IsGetter(procedure)) { | 361 } else if (IsGetter(procedure)) { |
| 367 return DartGetterName(procedure); | 362 return DartGetterName(procedure); |
| 368 } else if (IsFactory(procedure)) { | 363 } else if (IsFactory(procedure)) { |
| 369 return DartFactoryName(procedure); | 364 return DartFactoryName(procedure); |
| 370 } else { | 365 } else { |
| 371 return DartMethodName(procedure); | 366 return DartMethodName(procedure); |
| 372 } | 367 } |
| 373 } | 368 } |
| 374 | 369 |
| 375 const dart::String& TranslationHelper::DartSetterName(NameIndex setter) { | 370 const String& TranslationHelper::DartSetterName(NameIndex setter) { |
| 376 return DartSetterName(CanonicalNameParent(setter), | 371 return DartSetterName(CanonicalNameParent(setter), |
| 377 CanonicalNameString(setter)); | 372 CanonicalNameString(setter)); |
| 378 } | 373 } |
| 379 | 374 |
| 380 const dart::String& TranslationHelper::DartSetterName(NameIndex parent, | 375 const String& TranslationHelper::DartSetterName(NameIndex parent, |
| 381 StringIndex setter) { | 376 StringIndex setter) { |
| 382 // The names flowing into [setter] are coming from the Kernel file: | 377 // The names flowing into [setter] are coming from the Kernel file: |
| 383 // * user-defined setters: `fieldname=` | 378 // * user-defined setters: `fieldname=` |
| 384 // * property-set expressions: `fieldname` | 379 // * property-set expressions: `fieldname` |
| 385 // | 380 // |
| 386 // The VM uses `get:fieldname` and `set:fieldname`. | 381 // The VM uses `get:fieldname` and `set:fieldname`. |
| 387 // | 382 // |
| 388 // => In order to be consistent, we remove the `=` always and adopt the VM | 383 // => In order to be consistent, we remove the `=` always and adopt the VM |
| 389 // conventions. | 384 // conventions. |
| 390 intptr_t size = StringSize(setter); | 385 intptr_t size = StringSize(setter); |
| 391 ASSERT(size > 0); | 386 ASSERT(size > 0); |
| 392 if (CharacterAt(setter, size - 1) == '=') { | 387 if (CharacterAt(setter, size - 1) == '=') { |
| 393 --size; | 388 --size; |
| 394 } | 389 } |
| 395 uint8_t* buffer = Z->Alloc<uint8_t>(size); | 390 uint8_t* buffer = Z->Alloc<uint8_t>(size); |
| 396 { | 391 { |
| 397 NoSafepointScope no_safepoint; | 392 NoSafepointScope no_safepoint; |
| 398 memmove(buffer, string_data_.DataAddr(StringOffset(setter)), size); | 393 memmove(buffer, string_data_.DataAddr(StringOffset(setter)), size); |
| 399 } | 394 } |
| 400 dart::String& name = dart::String::ZoneHandle( | 395 String& name = |
| 401 Z, dart::String::FromUTF8(buffer, size, allocation_space_)); | 396 String::ZoneHandle(Z, String::FromUTF8(buffer, size, allocation_space_)); |
| 402 ManglePrivateName(parent, &name, false); | 397 ManglePrivateName(parent, &name, false); |
| 403 name = dart::Field::SetterSymbol(name); | 398 name = Field::SetterSymbol(name); |
| 404 return name; | 399 return name; |
| 405 } | 400 } |
| 406 | 401 |
| 407 const dart::String& TranslationHelper::DartGetterName(NameIndex getter) { | 402 const String& TranslationHelper::DartGetterName(NameIndex getter) { |
| 408 return DartGetterName(CanonicalNameParent(getter), | 403 return DartGetterName(CanonicalNameParent(getter), |
| 409 CanonicalNameString(getter)); | 404 CanonicalNameString(getter)); |
| 410 } | 405 } |
| 411 | 406 |
| 412 const dart::String& TranslationHelper::DartGetterName(NameIndex parent, | 407 const String& TranslationHelper::DartGetterName(NameIndex parent, |
| 413 StringIndex getter) { | 408 StringIndex getter) { |
| 414 dart::String& name = DartString(getter); | 409 String& name = DartString(getter); |
| 415 ManglePrivateName(parent, &name, false); | 410 ManglePrivateName(parent, &name, false); |
| 416 name = dart::Field::GetterSymbol(name); | 411 name = Field::GetterSymbol(name); |
| 417 return name; | 412 return name; |
| 418 } | 413 } |
| 419 | 414 |
| 420 const dart::String& TranslationHelper::DartFieldName(NameIndex parent, | 415 const String& TranslationHelper::DartFieldName(NameIndex parent, |
| 421 StringIndex field) { | 416 StringIndex field) { |
| 422 dart::String& name = DartString(field); | 417 String& name = DartString(field); |
| 423 return ManglePrivateName(parent, &name); | 418 return ManglePrivateName(parent, &name); |
| 424 } | 419 } |
| 425 | 420 |
| 426 const dart::String& TranslationHelper::DartMethodName(NameIndex method) { | 421 const String& TranslationHelper::DartMethodName(NameIndex method) { |
| 427 return DartMethodName(CanonicalNameParent(method), | 422 return DartMethodName(CanonicalNameParent(method), |
| 428 CanonicalNameString(method)); | 423 CanonicalNameString(method)); |
| 429 } | 424 } |
| 430 | 425 |
| 431 const dart::String& TranslationHelper::DartMethodName(NameIndex parent, | 426 const String& TranslationHelper::DartMethodName(NameIndex parent, |
| 432 StringIndex method) { | 427 StringIndex method) { |
| 433 dart::String& name = DartString(method); | 428 String& name = DartString(method); |
| 434 return ManglePrivateName(parent, &name); | 429 return ManglePrivateName(parent, &name); |
| 435 } | 430 } |
| 436 | 431 |
| 437 const dart::String& TranslationHelper::DartFactoryName(NameIndex factory) { | 432 const String& TranslationHelper::DartFactoryName(NameIndex factory) { |
| 438 ASSERT(IsConstructor(factory) || IsFactory(factory)); | 433 ASSERT(IsConstructor(factory) || IsFactory(factory)); |
| 439 GrowableHandlePtrArray<const dart::String> pieces(Z, 3); | 434 GrowableHandlePtrArray<const String> pieces(Z, 3); |
| 440 pieces.Add(DartClassName(EnclosingName(factory))); | 435 pieces.Add(DartClassName(EnclosingName(factory))); |
| 441 pieces.Add(Symbols::Dot()); | 436 pieces.Add(Symbols::Dot()); |
| 442 // [DartMethodName] will mangle the name. | 437 // [DartMethodName] will mangle the name. |
| 443 pieces.Add(DartMethodName(factory)); | 438 pieces.Add(DartMethodName(factory)); |
| 444 return dart::String::ZoneHandle(Z, Symbols::FromConcatAll(thread_, pieces)); | 439 return String::ZoneHandle(Z, Symbols::FromConcatAll(thread_, pieces)); |
| 445 } | 440 } |
| 446 | 441 |
| 447 RawLibrary* TranslationHelper::LookupLibraryByKernelLibrary( | 442 RawLibrary* TranslationHelper::LookupLibraryByKernelLibrary( |
| 448 NameIndex kernel_library) { | 443 NameIndex kernel_library) { |
| 449 // We only use the string and don't rely on having any particular parent. | 444 // We only use the string and don't rely on having any particular parent. |
| 450 // This ASSERT is just a sanity check. | 445 // This ASSERT is just a sanity check. |
| 451 ASSERT(IsLibrary(kernel_library) || | 446 ASSERT(IsLibrary(kernel_library) || |
| 452 IsAdministrative(CanonicalNameParent(kernel_library))); | 447 IsAdministrative(CanonicalNameParent(kernel_library))); |
| 453 const dart::String& library_name = | 448 const String& library_name = DartSymbol(CanonicalNameString(kernel_library)); |
| 454 DartSymbol(CanonicalNameString(kernel_library)); | |
| 455 ASSERT(!library_name.IsNull()); | 449 ASSERT(!library_name.IsNull()); |
| 456 RawLibrary* library = dart::Library::LookupLibrary(thread_, library_name); | 450 RawLibrary* library = Library::LookupLibrary(thread_, library_name); |
| 457 ASSERT(library != Object::null()); | 451 ASSERT(library != Object::null()); |
| 458 return library; | 452 return library; |
| 459 } | 453 } |
| 460 | 454 |
| 461 RawClass* TranslationHelper::LookupClassByKernelClass(NameIndex kernel_class) { | 455 RawClass* TranslationHelper::LookupClassByKernelClass(NameIndex kernel_class) { |
| 462 ASSERT(IsClass(kernel_class)); | 456 ASSERT(IsClass(kernel_class)); |
| 463 const dart::String& class_name = DartClassName(kernel_class); | 457 const String& class_name = DartClassName(kernel_class); |
| 464 NameIndex kernel_library = CanonicalNameParent(kernel_class); | 458 NameIndex kernel_library = CanonicalNameParent(kernel_class); |
| 465 dart::Library& library = | 459 Library& library = |
| 466 dart::Library::Handle(Z, LookupLibraryByKernelLibrary(kernel_library)); | 460 Library::Handle(Z, LookupLibraryByKernelLibrary(kernel_library)); |
| 467 RawClass* klass = library.LookupClassAllowPrivate(class_name); | 461 RawClass* klass = library.LookupClassAllowPrivate(class_name); |
| 468 | 462 |
| 469 ASSERT(klass != Object::null()); | 463 ASSERT(klass != Object::null()); |
| 470 return klass; | 464 return klass; |
| 471 } | 465 } |
| 472 | 466 |
| 473 RawField* TranslationHelper::LookupFieldByKernelField(NameIndex kernel_field) { | 467 RawField* TranslationHelper::LookupFieldByKernelField(NameIndex kernel_field) { |
| 474 ASSERT(IsField(kernel_field)); | 468 ASSERT(IsField(kernel_field)); |
| 475 NameIndex enclosing = EnclosingName(kernel_field); | 469 NameIndex enclosing = EnclosingName(kernel_field); |
| 476 | 470 |
| 477 dart::Class& klass = dart::Class::Handle(Z); | 471 Class& klass = Class::Handle(Z); |
| 478 if (IsLibrary(enclosing)) { | 472 if (IsLibrary(enclosing)) { |
| 479 dart::Library& library = | 473 Library& library = |
| 480 dart::Library::Handle(Z, LookupLibraryByKernelLibrary(enclosing)); | 474 Library::Handle(Z, LookupLibraryByKernelLibrary(enclosing)); |
| 481 klass = library.toplevel_class(); | 475 klass = library.toplevel_class(); |
| 482 } else { | 476 } else { |
| 483 ASSERT(IsClass(enclosing)); | 477 ASSERT(IsClass(enclosing)); |
| 484 klass = LookupClassByKernelClass(enclosing); | 478 klass = LookupClassByKernelClass(enclosing); |
| 485 } | 479 } |
| 486 RawField* field = klass.LookupFieldAllowPrivate( | 480 RawField* field = klass.LookupFieldAllowPrivate( |
| 487 DartSymbol(CanonicalNameString(kernel_field))); | 481 DartSymbol(CanonicalNameString(kernel_field))); |
| 488 ASSERT(field != Object::null()); | 482 ASSERT(field != Object::null()); |
| 489 return field; | 483 return field; |
| 490 } | 484 } |
| 491 | 485 |
| 492 RawFunction* TranslationHelper::LookupStaticMethodByKernelProcedure( | 486 RawFunction* TranslationHelper::LookupStaticMethodByKernelProcedure( |
| 493 NameIndex procedure) { | 487 NameIndex procedure) { |
| 494 const dart::String& procedure_name = DartProcedureName(procedure); | 488 const String& procedure_name = DartProcedureName(procedure); |
| 495 | 489 |
| 496 // The parent is either a library or a class (in which case the procedure is a | 490 // The parent is either a library or a class (in which case the procedure is a |
| 497 // static method). | 491 // static method). |
| 498 NameIndex enclosing = EnclosingName(procedure); | 492 NameIndex enclosing = EnclosingName(procedure); |
| 499 if (IsLibrary(enclosing)) { | 493 if (IsLibrary(enclosing)) { |
| 500 dart::Library& library = | 494 Library& library = |
| 501 dart::Library::Handle(Z, LookupLibraryByKernelLibrary(enclosing)); | 495 Library::Handle(Z, LookupLibraryByKernelLibrary(enclosing)); |
| 502 RawFunction* function = library.LookupFunctionAllowPrivate(procedure_name); | 496 RawFunction* function = library.LookupFunctionAllowPrivate(procedure_name); |
| 503 ASSERT(function != Object::null()); | 497 ASSERT(function != Object::null()); |
| 504 return function; | 498 return function; |
| 505 } else { | 499 } else { |
| 506 ASSERT(IsClass(enclosing)); | 500 ASSERT(IsClass(enclosing)); |
| 507 dart::Class& klass = | 501 Class& klass = Class::Handle(Z, LookupClassByKernelClass(enclosing)); |
| 508 dart::Class::Handle(Z, LookupClassByKernelClass(enclosing)); | |
| 509 Function& function = Function::ZoneHandle( | 502 Function& function = Function::ZoneHandle( |
| 510 Z, klass.LookupFunctionAllowPrivate(procedure_name)); | 503 Z, klass.LookupFunctionAllowPrivate(procedure_name)); |
| 511 ASSERT(!function.IsNull()); | 504 ASSERT(!function.IsNull()); |
| 512 | 505 |
| 513 // TODO(27590): We can probably get rid of this after no longer using | 506 // TODO(27590): We can probably get rid of this after no longer using |
| 514 // core libraries from the source. | 507 // core libraries from the source. |
| 515 if (function.IsRedirectingFactory()) { | 508 if (function.IsRedirectingFactory()) { |
| 516 ClassFinalizer::ResolveRedirectingFactory(klass, function); | 509 ClassFinalizer::ResolveRedirectingFactory(klass, function); |
| 517 function = function.RedirectionTarget(); | 510 function = function.RedirectionTarget(); |
| 518 } | 511 } |
| 519 return function.raw(); | 512 return function.raw(); |
| 520 } | 513 } |
| 521 } | 514 } |
| 522 | 515 |
| 523 RawFunction* TranslationHelper::LookupConstructorByKernelConstructor( | 516 RawFunction* TranslationHelper::LookupConstructorByKernelConstructor( |
| 524 NameIndex constructor) { | 517 NameIndex constructor) { |
| 525 ASSERT(IsConstructor(constructor)); | 518 ASSERT(IsConstructor(constructor)); |
| 526 dart::Class& klass = dart::Class::Handle( | 519 Class& klass = |
| 527 Z, LookupClassByKernelClass(EnclosingName(constructor))); | 520 Class::Handle(Z, LookupClassByKernelClass(EnclosingName(constructor))); |
| 528 return LookupConstructorByKernelConstructor(klass, constructor); | 521 return LookupConstructorByKernelConstructor(klass, constructor); |
| 529 } | 522 } |
| 530 | 523 |
| 531 RawFunction* TranslationHelper::LookupConstructorByKernelConstructor( | 524 RawFunction* TranslationHelper::LookupConstructorByKernelConstructor( |
| 532 const dart::Class& owner, | 525 const Class& owner, |
| 533 NameIndex constructor) { | 526 NameIndex constructor) { |
| 534 ASSERT(IsConstructor(constructor)); | 527 ASSERT(IsConstructor(constructor)); |
| 535 RawFunction* function = | 528 RawFunction* function = |
| 536 owner.LookupConstructorAllowPrivate(DartConstructorName(constructor)); | 529 owner.LookupConstructorAllowPrivate(DartConstructorName(constructor)); |
| 537 ASSERT(function != Object::null()); | 530 ASSERT(function != Object::null()); |
| 538 return function; | 531 return function; |
| 539 } | 532 } |
| 540 | 533 |
| 541 dart::Type& TranslationHelper::GetCanonicalType(const dart::Class& klass) { | 534 Type& TranslationHelper::GetCanonicalType(const Class& klass) { |
| 542 ASSERT(!klass.IsNull()); | 535 ASSERT(!klass.IsNull()); |
| 543 // Note that if cls is _Closure, the returned type will be _Closure, | 536 // Note that if cls is _Closure, the returned type will be _Closure, |
| 544 // and not the signature type. | 537 // and not the signature type. |
| 545 Type& type = Type::ZoneHandle(Z, klass.CanonicalType()); | 538 Type& type = Type::ZoneHandle(Z, klass.CanonicalType()); |
| 546 if (!type.IsNull()) { | 539 if (!type.IsNull()) { |
| 547 return type; | 540 return type; |
| 548 } | 541 } |
| 549 type = Type::New(klass, TypeArguments::Handle(Z, klass.type_parameters()), | 542 type = Type::New(klass, TypeArguments::Handle(Z, klass.type_parameters()), |
| 550 klass.token_pos()); | 543 klass.token_pos()); |
| 551 if (klass.is_type_finalized()) { | 544 if (klass.is_type_finalized()) { |
| (...skipping 21 matching lines...) Expand all Loading... |
| 573 const Script& null_script = Script::Handle(Z); | 566 const Script& null_script = Script::Handle(Z); |
| 574 | 567 |
| 575 va_list args; | 568 va_list args; |
| 576 va_start(args, format); | 569 va_start(args, format); |
| 577 Report::LongJumpV(prev_error, null_script, TokenPosition::kNoSource, format, | 570 Report::LongJumpV(prev_error, null_script, TokenPosition::kNoSource, format, |
| 578 args); | 571 args); |
| 579 va_end(args); | 572 va_end(args); |
| 580 UNREACHABLE(); | 573 UNREACHABLE(); |
| 581 } | 574 } |
| 582 | 575 |
| 583 dart::String& TranslationHelper::ManglePrivateName(NameIndex parent, | 576 String& TranslationHelper::ManglePrivateName(NameIndex parent, |
| 584 dart::String* name_to_modify, | 577 String* name_to_modify, |
| 585 bool symbolize) { | 578 bool symbolize) { |
| 586 if (name_to_modify->Length() >= 1 && name_to_modify->CharAt(0) == '_') { | 579 if (name_to_modify->Length() >= 1 && name_to_modify->CharAt(0) == '_') { |
| 587 const dart::Library& library = | 580 const Library& library = |
| 588 dart::Library::Handle(Z, LookupLibraryByKernelLibrary(parent)); | 581 Library::Handle(Z, LookupLibraryByKernelLibrary(parent)); |
| 589 *name_to_modify = library.PrivateName(*name_to_modify); | 582 *name_to_modify = library.PrivateName(*name_to_modify); |
| 590 } else if (symbolize) { | 583 } else if (symbolize) { |
| 591 *name_to_modify = Symbols::New(thread_, *name_to_modify); | 584 *name_to_modify = Symbols::New(thread_, *name_to_modify); |
| 592 } | 585 } |
| 593 return *name_to_modify; | 586 return *name_to_modify; |
| 594 } | 587 } |
| 595 | 588 |
| 596 FlowGraphBuilder::FlowGraphBuilder( | 589 FlowGraphBuilder::FlowGraphBuilder( |
| 597 intptr_t kernel_offset, | 590 intptr_t kernel_offset, |
| 598 ParsedFunction* parsed_function, | 591 ParsedFunction* parsed_function, |
| (...skipping 174 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 773 function = function.parent_function(); | 766 function = function.parent_function(); |
| 774 } | 767 } |
| 775 ASSERT(function.IsFactory()); | 768 ASSERT(function.IsFactory()); |
| 776 #endif | 769 #endif |
| 777 instructions += LoadLocal(scopes_->type_arguments_variable); | 770 instructions += LoadLocal(scopes_->type_arguments_variable); |
| 778 } else if (scopes_->this_variable != NULL && | 771 } else if (scopes_->this_variable != NULL && |
| 779 active_class_.ClassTypeParameterCount(Z) > 0) { | 772 active_class_.ClassTypeParameterCount(Z) > 0) { |
| 780 ASSERT(!parsed_function_->function().IsFactory()); | 773 ASSERT(!parsed_function_->function().IsFactory()); |
| 781 intptr_t type_arguments_field_offset = | 774 intptr_t type_arguments_field_offset = |
| 782 active_class_.klass->type_arguments_field_offset(); | 775 active_class_.klass->type_arguments_field_offset(); |
| 783 ASSERT(type_arguments_field_offset != dart::Class::kNoTypeArguments); | 776 ASSERT(type_arguments_field_offset != Class::kNoTypeArguments); |
| 784 | 777 |
| 785 instructions += LoadLocal(scopes_->this_variable); | 778 instructions += LoadLocal(scopes_->this_variable); |
| 786 instructions += LoadField(type_arguments_field_offset); | 779 instructions += LoadField(type_arguments_field_offset); |
| 787 } else { | 780 } else { |
| 788 instructions += NullConstant(); | 781 instructions += NullConstant(); |
| 789 } | 782 } |
| 790 return instructions; | 783 return instructions; |
| 791 } | 784 } |
| 792 | 785 |
| 793 // TODO(30455): Kernel generic methods undone. This seems to work for static | 786 // TODO(30455): Kernel generic methods undone. This seems to work for static |
| (...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 865 } | 858 } |
| 866 | 859 |
| 867 Fragment FlowGraphBuilder::AllocateContext(intptr_t size) { | 860 Fragment FlowGraphBuilder::AllocateContext(intptr_t size) { |
| 868 AllocateContextInstr* allocate = | 861 AllocateContextInstr* allocate = |
| 869 new (Z) AllocateContextInstr(TokenPosition::kNoSource, size); | 862 new (Z) AllocateContextInstr(TokenPosition::kNoSource, size); |
| 870 Push(allocate); | 863 Push(allocate); |
| 871 return Fragment(allocate); | 864 return Fragment(allocate); |
| 872 } | 865 } |
| 873 | 866 |
| 874 Fragment FlowGraphBuilder::AllocateObject(TokenPosition position, | 867 Fragment FlowGraphBuilder::AllocateObject(TokenPosition position, |
| 875 const dart::Class& klass, | 868 const Class& klass, |
| 876 intptr_t argument_count) { | 869 intptr_t argument_count) { |
| 877 ArgumentArray arguments = GetArguments(argument_count); | 870 ArgumentArray arguments = GetArguments(argument_count); |
| 878 AllocateObjectInstr* allocate = | 871 AllocateObjectInstr* allocate = |
| 879 new (Z) AllocateObjectInstr(position, klass, arguments); | 872 new (Z) AllocateObjectInstr(position, klass, arguments); |
| 880 Push(allocate); | 873 Push(allocate); |
| 881 return Fragment(allocate); | 874 return Fragment(allocate); |
| 882 } | 875 } |
| 883 | 876 |
| 884 Fragment FlowGraphBuilder::AllocateObject(const dart::Class& klass, | 877 Fragment FlowGraphBuilder::AllocateObject(const Class& klass, |
| 885 const Function& closure_function) { | 878 const Function& closure_function) { |
| 886 ArgumentArray arguments = new (Z) ZoneGrowableArray<PushArgumentInstr*>(Z, 0); | 879 ArgumentArray arguments = new (Z) ZoneGrowableArray<PushArgumentInstr*>(Z, 0); |
| 887 AllocateObjectInstr* allocate = | 880 AllocateObjectInstr* allocate = |
| 888 new (Z) AllocateObjectInstr(TokenPosition::kNoSource, klass, arguments); | 881 new (Z) AllocateObjectInstr(TokenPosition::kNoSource, klass, arguments); |
| 889 allocate->set_closure_function(closure_function); | 882 allocate->set_closure_function(closure_function); |
| 890 Push(allocate); | 883 Push(allocate); |
| 891 return Fragment(allocate); | 884 return Fragment(allocate); |
| 892 } | 885 } |
| 893 | 886 |
| 894 Fragment FlowGraphBuilder::BooleanNegate() { | 887 Fragment FlowGraphBuilder::BooleanNegate() { |
| (...skipping 155 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1050 Fragment FlowGraphBuilder::Goto(JoinEntryInstr* destination) { | 1043 Fragment FlowGraphBuilder::Goto(JoinEntryInstr* destination) { |
| 1051 return Fragment(new (Z) GotoInstr(destination, GetNextDeoptId())).closed(); | 1044 return Fragment(new (Z) GotoInstr(destination, GetNextDeoptId())).closed(); |
| 1052 } | 1045 } |
| 1053 | 1046 |
| 1054 Fragment FlowGraphBuilder::IntConstant(int64_t value) { | 1047 Fragment FlowGraphBuilder::IntConstant(int64_t value) { |
| 1055 return Fragment( | 1048 return Fragment( |
| 1056 Constant(Integer::ZoneHandle(Z, Integer::New(value, Heap::kOld)))); | 1049 Constant(Integer::ZoneHandle(Z, Integer::New(value, Heap::kOld)))); |
| 1057 } | 1050 } |
| 1058 | 1051 |
| 1059 Fragment FlowGraphBuilder::InstanceCall(TokenPosition position, | 1052 Fragment FlowGraphBuilder::InstanceCall(TokenPosition position, |
| 1060 const dart::String& name, | 1053 const String& name, |
| 1061 Token::Kind kind, | 1054 Token::Kind kind, |
| 1062 intptr_t argument_count, | 1055 intptr_t argument_count, |
| 1063 intptr_t checked_argument_count) { | 1056 intptr_t checked_argument_count) { |
| 1064 const intptr_t kTypeArgsLen = 0; | 1057 const intptr_t kTypeArgsLen = 0; |
| 1065 return InstanceCall(position, name, kind, kTypeArgsLen, argument_count, | 1058 return InstanceCall(position, name, kind, kTypeArgsLen, argument_count, |
| 1066 Array::null_array(), checked_argument_count); | 1059 Array::null_array(), checked_argument_count); |
| 1067 } | 1060 } |
| 1068 | 1061 |
| 1069 Fragment FlowGraphBuilder::InstanceCall(TokenPosition position, | 1062 Fragment FlowGraphBuilder::InstanceCall(TokenPosition position, |
| 1070 const dart::String& name, | 1063 const String& name, |
| 1071 Token::Kind kind, | 1064 Token::Kind kind, |
| 1072 intptr_t type_args_len, | 1065 intptr_t type_args_len, |
| 1073 intptr_t argument_count, | 1066 intptr_t argument_count, |
| 1074 const Array& argument_names, | 1067 const Array& argument_names, |
| 1075 intptr_t checked_argument_count) { | 1068 intptr_t checked_argument_count) { |
| 1076 const intptr_t total_count = argument_count + (type_args_len > 0 ? 1 : 0); | 1069 const intptr_t total_count = argument_count + (type_args_len > 0 ? 1 : 0); |
| 1077 ArgumentArray arguments = GetArguments(total_count); | 1070 ArgumentArray arguments = GetArguments(total_count); |
| 1078 InstanceCallInstr* call = new (Z) InstanceCallInstr( | 1071 InstanceCallInstr* call = new (Z) InstanceCallInstr( |
| 1079 position, name, kind, arguments, type_args_len, argument_names, | 1072 position, name, kind, arguments, type_args_len, argument_names, |
| 1080 checked_argument_count, ic_data_array_, GetNextDeoptId()); | 1073 checked_argument_count, ic_data_array_, GetNextDeoptId()); |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1125 | 1118 |
| 1126 return instructions; | 1119 return instructions; |
| 1127 } | 1120 } |
| 1128 | 1121 |
| 1129 Fragment FlowGraphBuilder::LoadClassId() { | 1122 Fragment FlowGraphBuilder::LoadClassId() { |
| 1130 LoadClassIdInstr* load = new (Z) LoadClassIdInstr(Pop()); | 1123 LoadClassIdInstr* load = new (Z) LoadClassIdInstr(Pop()); |
| 1131 Push(load); | 1124 Push(load); |
| 1132 return Fragment(load); | 1125 return Fragment(load); |
| 1133 } | 1126 } |
| 1134 | 1127 |
| 1135 const dart::Field& MayCloneField(Zone* zone, const dart::Field& field) { | 1128 const Field& MayCloneField(Zone* zone, const Field& field) { |
| 1136 if ((Compiler::IsBackgroundCompilation() || | 1129 if ((Compiler::IsBackgroundCompilation() || |
| 1137 FLAG_force_clone_compiler_objects) && | 1130 FLAG_force_clone_compiler_objects) && |
| 1138 field.IsOriginal()) { | 1131 field.IsOriginal()) { |
| 1139 return dart::Field::ZoneHandle(zone, field.CloneFromOriginal()); | 1132 return Field::ZoneHandle(zone, field.CloneFromOriginal()); |
| 1140 } else { | 1133 } else { |
| 1141 ASSERT(field.IsZoneHandle()); | 1134 ASSERT(field.IsZoneHandle()); |
| 1142 return field; | 1135 return field; |
| 1143 } | 1136 } |
| 1144 } | 1137 } |
| 1145 | 1138 |
| 1146 Fragment FlowGraphBuilder::LoadField(const dart::Field& field) { | 1139 Fragment FlowGraphBuilder::LoadField(const Field& field) { |
| 1147 LoadFieldInstr* load = | 1140 LoadFieldInstr* load = |
| 1148 new (Z) LoadFieldInstr(Pop(), &MayCloneField(Z, field), | 1141 new (Z) LoadFieldInstr(Pop(), &MayCloneField(Z, field), |
| 1149 AbstractType::ZoneHandle(Z, field.type()), | 1142 AbstractType::ZoneHandle(Z, field.type()), |
| 1150 TokenPosition::kNoSource, parsed_function_); | 1143 TokenPosition::kNoSource, parsed_function_); |
| 1151 Push(load); | 1144 Push(load); |
| 1152 return Fragment(load); | 1145 return Fragment(load); |
| 1153 } | 1146 } |
| 1154 | 1147 |
| 1155 Fragment FlowGraphBuilder::LoadField(intptr_t offset, intptr_t class_id) { | 1148 Fragment FlowGraphBuilder::LoadField(intptr_t offset, intptr_t class_id) { |
| 1156 LoadFieldInstr* load = new (Z) LoadFieldInstr( | 1149 LoadFieldInstr* load = new (Z) LoadFieldInstr( |
| (...skipping 24 matching lines...) Expand all Loading... |
| 1181 instructions += LoadField(Context::variable_offset(variable->index())); | 1174 instructions += LoadField(Context::variable_offset(variable->index())); |
| 1182 } else { | 1175 } else { |
| 1183 LoadLocalInstr* load = | 1176 LoadLocalInstr* load = |
| 1184 new (Z) LoadLocalInstr(*variable, TokenPosition::kNoSource); | 1177 new (Z) LoadLocalInstr(*variable, TokenPosition::kNoSource); |
| 1185 instructions <<= load; | 1178 instructions <<= load; |
| 1186 Push(load); | 1179 Push(load); |
| 1187 } | 1180 } |
| 1188 return instructions; | 1181 return instructions; |
| 1189 } | 1182 } |
| 1190 | 1183 |
| 1191 Fragment FlowGraphBuilder::InitStaticField(const dart::Field& field) { | 1184 Fragment FlowGraphBuilder::InitStaticField(const Field& field) { |
| 1192 InitStaticFieldInstr* init = new (Z) | 1185 InitStaticFieldInstr* init = new (Z) |
| 1193 InitStaticFieldInstr(Pop(), MayCloneField(Z, field), GetNextDeoptId()); | 1186 InitStaticFieldInstr(Pop(), MayCloneField(Z, field), GetNextDeoptId()); |
| 1194 return Fragment(init); | 1187 return Fragment(init); |
| 1195 } | 1188 } |
| 1196 | 1189 |
| 1197 Fragment FlowGraphBuilder::LoadStaticField() { | 1190 Fragment FlowGraphBuilder::LoadStaticField() { |
| 1198 LoadStaticFieldInstr* load = | 1191 LoadStaticFieldInstr* load = |
| 1199 new (Z) LoadStaticFieldInstr(Pop(), TokenPosition::kNoSource); | 1192 new (Z) LoadStaticFieldInstr(Pop(), TokenPosition::kNoSource); |
| 1200 Push(load); | 1193 Push(load); |
| 1201 return Fragment(load); | 1194 return Fragment(load); |
| 1202 } | 1195 } |
| 1203 | 1196 |
| 1204 Fragment FlowGraphBuilder::NullConstant() { | 1197 Fragment FlowGraphBuilder::NullConstant() { |
| 1205 return Constant(Instance::ZoneHandle(Z, Instance::null())); | 1198 return Constant(Instance::ZoneHandle(Z, Instance::null())); |
| 1206 } | 1199 } |
| 1207 | 1200 |
| 1208 Fragment FlowGraphBuilder::NativeCall(const dart::String* name, | 1201 Fragment FlowGraphBuilder::NativeCall(const String* name, |
| 1209 const Function* function) { | 1202 const Function* function) { |
| 1210 InlineBailout("kernel::FlowGraphBuilder::NativeCall"); | 1203 InlineBailout("kernel::FlowGraphBuilder::NativeCall"); |
| 1211 NativeCallInstr* call = new (Z) NativeCallInstr( | 1204 NativeCallInstr* call = new (Z) NativeCallInstr( |
| 1212 name, function, FLAG_link_natives_lazily, TokenPosition::kNoSource); | 1205 name, function, FLAG_link_natives_lazily, TokenPosition::kNoSource); |
| 1213 Push(call); | 1206 Push(call); |
| 1214 return Fragment(call); | 1207 return Fragment(call); |
| 1215 } | 1208 } |
| 1216 | 1209 |
| 1217 Fragment FlowGraphBuilder::PushArgument() { | 1210 Fragment FlowGraphBuilder::PushArgument() { |
| 1218 PushArgumentInstr* argument = new (Z) PushArgumentInstr(Pop()); | 1211 PushArgumentInstr* argument = new (Z) PushArgumentInstr(Pop()); |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1263 return StaticCall(position, target, argument_count, Array::null_array()); | 1256 return StaticCall(position, target, argument_count, Array::null_array()); |
| 1264 } | 1257 } |
| 1265 | 1258 |
| 1266 static intptr_t GetResultCidOfListFactory(Zone* zone, | 1259 static intptr_t GetResultCidOfListFactory(Zone* zone, |
| 1267 const Function& function, | 1260 const Function& function, |
| 1268 intptr_t argument_count) { | 1261 intptr_t argument_count) { |
| 1269 if (!function.IsFactory()) { | 1262 if (!function.IsFactory()) { |
| 1270 return kDynamicCid; | 1263 return kDynamicCid; |
| 1271 } | 1264 } |
| 1272 | 1265 |
| 1273 const dart::Class& owner = dart::Class::Handle(zone, function.Owner()); | 1266 const Class& owner = Class::Handle(zone, function.Owner()); |
| 1274 if ((owner.library() != dart::Library::CoreLibrary()) && | 1267 if ((owner.library() != Library::CoreLibrary()) && |
| 1275 (owner.library() != dart::Library::TypedDataLibrary())) { | 1268 (owner.library() != Library::TypedDataLibrary())) { |
| 1276 return kDynamicCid; | 1269 return kDynamicCid; |
| 1277 } | 1270 } |
| 1278 | 1271 |
| 1279 if ((owner.Name() == Symbols::List().raw()) && | 1272 if ((owner.Name() == Symbols::List().raw()) && |
| 1280 (function.name() == Symbols::ListFactory().raw())) { | 1273 (function.name() == Symbols::ListFactory().raw())) { |
| 1281 ASSERT(argument_count == 1 || argument_count == 2); | 1274 ASSERT(argument_count == 1 || argument_count == 2); |
| 1282 return (argument_count == 1) ? kGrowableObjectArrayCid : kArrayCid; | 1275 return (argument_count == 1) ? kGrowableObjectArrayCid : kArrayCid; |
| 1283 } | 1276 } |
| 1284 return FactoryRecognizer::ResultCid(function); | 1277 return FactoryRecognizer::ResultCid(function); |
| 1285 } | 1278 } |
| (...skipping 26 matching lines...) Expand all Loading... |
| 1312 value->BindsToConstant() ? kNoStoreBarrier : kEmitStoreBarrier; | 1305 value->BindsToConstant() ? kNoStoreBarrier : kEmitStoreBarrier; |
| 1313 StoreIndexedInstr* store = new (Z) StoreIndexedInstr( | 1306 StoreIndexedInstr* store = new (Z) StoreIndexedInstr( |
| 1314 Pop(), // Array. | 1307 Pop(), // Array. |
| 1315 index, value, emit_store_barrier, Instance::ElementSizeFor(class_id), | 1308 index, value, emit_store_barrier, Instance::ElementSizeFor(class_id), |
| 1316 class_id, kAlignedAccess, Thread::kNoDeoptId, TokenPosition::kNoSource); | 1309 class_id, kAlignedAccess, Thread::kNoDeoptId, TokenPosition::kNoSource); |
| 1317 Push(store); | 1310 Push(store); |
| 1318 return Fragment(store); | 1311 return Fragment(store); |
| 1319 } | 1312 } |
| 1320 | 1313 |
| 1321 Fragment FlowGraphBuilder::StoreInstanceField( | 1314 Fragment FlowGraphBuilder::StoreInstanceField( |
| 1322 const dart::Field& field, | 1315 const Field& field, |
| 1323 bool is_initialization_store, | 1316 bool is_initialization_store, |
| 1324 StoreBarrierType emit_store_barrier) { | 1317 StoreBarrierType emit_store_barrier) { |
| 1325 Fragment instructions; | 1318 Fragment instructions; |
| 1326 | 1319 |
| 1327 const AbstractType& dst_type = AbstractType::ZoneHandle(Z, field.type()); | 1320 const AbstractType& dst_type = AbstractType::ZoneHandle(Z, field.type()); |
| 1328 instructions += CheckAssignableInCheckedMode( | 1321 instructions += CheckAssignableInCheckedMode( |
| 1329 dst_type, dart::String::ZoneHandle(Z, field.name())); | 1322 dst_type, String::ZoneHandle(Z, field.name())); |
| 1330 | 1323 |
| 1331 Value* value = Pop(); | 1324 Value* value = Pop(); |
| 1332 if (value->BindsToConstant()) { | 1325 if (value->BindsToConstant()) { |
| 1333 emit_store_barrier = kNoStoreBarrier; | 1326 emit_store_barrier = kNoStoreBarrier; |
| 1334 } | 1327 } |
| 1335 | 1328 |
| 1336 StoreInstanceFieldInstr* store = new (Z) | 1329 StoreInstanceFieldInstr* store = new (Z) |
| 1337 StoreInstanceFieldInstr(MayCloneField(Z, field), Pop(), value, | 1330 StoreInstanceFieldInstr(MayCloneField(Z, field), Pop(), value, |
| 1338 emit_store_barrier, TokenPosition::kNoSource); | 1331 emit_store_barrier, TokenPosition::kNoSource); |
| 1339 store->set_is_initialization(is_initialization_store); | 1332 store->set_is_initialization(is_initialization_store); |
| 1340 instructions <<= store; | 1333 instructions <<= store; |
| 1341 | 1334 |
| 1342 return instructions; | 1335 return instructions; |
| 1343 } | 1336 } |
| 1344 | 1337 |
| 1345 Fragment FlowGraphBuilder::StoreInstanceFieldGuarded( | 1338 Fragment FlowGraphBuilder::StoreInstanceFieldGuarded( |
| 1346 const dart::Field& field, | 1339 const Field& field, |
| 1347 bool is_initialization_store) { | 1340 bool is_initialization_store) { |
| 1348 Fragment instructions; | 1341 Fragment instructions; |
| 1349 const dart::Field& field_clone = MayCloneField(Z, field); | 1342 const Field& field_clone = MayCloneField(Z, field); |
| 1350 if (I->use_field_guards()) { | 1343 if (I->use_field_guards()) { |
| 1351 LocalVariable* store_expression = MakeTemporary(); | 1344 LocalVariable* store_expression = MakeTemporary(); |
| 1352 instructions += LoadLocal(store_expression); | 1345 instructions += LoadLocal(store_expression); |
| 1353 instructions += GuardFieldClass(field_clone, GetNextDeoptId()); | 1346 instructions += GuardFieldClass(field_clone, GetNextDeoptId()); |
| 1354 instructions += LoadLocal(store_expression); | 1347 instructions += LoadLocal(store_expression); |
| 1355 instructions += GuardFieldLength(field_clone, GetNextDeoptId()); | 1348 instructions += GuardFieldLength(field_clone, GetNextDeoptId()); |
| 1356 } | 1349 } |
| 1357 instructions += StoreInstanceField(field_clone, is_initialization_store); | 1350 instructions += StoreInstanceField(field_clone, is_initialization_store); |
| 1358 return instructions; | 1351 return instructions; |
| 1359 } | 1352 } |
| (...skipping 24 matching lines...) Expand all Loading... |
| 1384 Value* value = Pop(); | 1377 Value* value = Pop(); |
| 1385 StoreLocalInstr* store = | 1378 StoreLocalInstr* store = |
| 1386 new (Z) StoreLocalInstr(*variable, value, position); | 1379 new (Z) StoreLocalInstr(*variable, value, position); |
| 1387 instructions <<= store; | 1380 instructions <<= store; |
| 1388 Push(store); | 1381 Push(store); |
| 1389 } | 1382 } |
| 1390 return instructions; | 1383 return instructions; |
| 1391 } | 1384 } |
| 1392 | 1385 |
| 1393 Fragment FlowGraphBuilder::StoreStaticField(TokenPosition position, | 1386 Fragment FlowGraphBuilder::StoreStaticField(TokenPosition position, |
| 1394 const dart::Field& field) { | 1387 const Field& field) { |
| 1395 return Fragment( | 1388 return Fragment( |
| 1396 new (Z) StoreStaticFieldInstr(MayCloneField(Z, field), Pop(), position)); | 1389 new (Z) StoreStaticFieldInstr(MayCloneField(Z, field), Pop(), position)); |
| 1397 } | 1390 } |
| 1398 | 1391 |
| 1399 Fragment FlowGraphBuilder::StringInterpolate(TokenPosition position) { | 1392 Fragment FlowGraphBuilder::StringInterpolate(TokenPosition position) { |
| 1400 Value* array = Pop(); | 1393 Value* array = Pop(); |
| 1401 StringInterpolateInstr* interpolate = | 1394 StringInterpolateInstr* interpolate = |
| 1402 new (Z) StringInterpolateInstr(array, position, GetNextDeoptId()); | 1395 new (Z) StringInterpolateInstr(array, position, GetNextDeoptId()); |
| 1403 Push(interpolate); | 1396 Push(interpolate); |
| 1404 return Fragment(interpolate); | 1397 return Fragment(interpolate); |
| 1405 } | 1398 } |
| 1406 | 1399 |
| 1407 Fragment FlowGraphBuilder::StringInterpolateSingle(TokenPosition position) { | 1400 Fragment FlowGraphBuilder::StringInterpolateSingle(TokenPosition position) { |
| 1408 const int kTypeArgsLen = 0; | 1401 const int kTypeArgsLen = 0; |
| 1409 const int kNumberOfArguments = 1; | 1402 const int kNumberOfArguments = 1; |
| 1410 const Array& kNoArgumentNames = Object::null_array(); | 1403 const Array& kNoArgumentNames = Object::null_array(); |
| 1411 const dart::Class& cls = dart::Class::Handle( | 1404 const Class& cls = |
| 1412 dart::Library::LookupCoreClass(Symbols::StringBase())); | 1405 Class::Handle(Library::LookupCoreClass(Symbols::StringBase())); |
| 1413 ASSERT(!cls.IsNull()); | 1406 ASSERT(!cls.IsNull()); |
| 1414 const Function& function = Function::ZoneHandle( | 1407 const Function& function = Function::ZoneHandle( |
| 1415 Z, | 1408 Z, Resolver::ResolveStatic( |
| 1416 Resolver::ResolveStatic( | 1409 cls, Library::PrivateCoreLibName(Symbols::InterpolateSingle()), |
| 1417 cls, dart::Library::PrivateCoreLibName(Symbols::InterpolateSingle()), | 1410 kTypeArgsLen, kNumberOfArguments, kNoArgumentNames)); |
| 1418 kTypeArgsLen, kNumberOfArguments, kNoArgumentNames)); | |
| 1419 Fragment instructions; | 1411 Fragment instructions; |
| 1420 instructions += PushArgument(); | 1412 instructions += PushArgument(); |
| 1421 instructions += StaticCall(position, function, 1); | 1413 instructions += StaticCall(position, function, 1); |
| 1422 return instructions; | 1414 return instructions; |
| 1423 } | 1415 } |
| 1424 | 1416 |
| 1425 Fragment FlowGraphBuilder::ThrowTypeError() { | 1417 Fragment FlowGraphBuilder::ThrowTypeError() { |
| 1426 const dart::Class& klass = dart::Class::ZoneHandle( | 1418 const Class& klass = |
| 1427 Z, dart::Library::LookupCoreClass(Symbols::TypeError())); | 1419 Class::ZoneHandle(Z, Library::LookupCoreClass(Symbols::TypeError())); |
| 1428 ASSERT(!klass.IsNull()); | 1420 ASSERT(!klass.IsNull()); |
| 1429 const Function& constructor = Function::ZoneHandle( | 1421 const Function& constructor = Function::ZoneHandle( |
| 1430 Z, | 1422 Z, |
| 1431 klass.LookupConstructorAllowPrivate(H.DartSymbol("_TypeError._create"))); | 1423 klass.LookupConstructorAllowPrivate(H.DartSymbol("_TypeError._create"))); |
| 1432 ASSERT(!constructor.IsNull()); | 1424 ASSERT(!constructor.IsNull()); |
| 1433 | 1425 |
| 1434 const dart::String& url = H.DartString( | 1426 const String& url = H.DartString( |
| 1435 parsed_function_->function().ToLibNamePrefixedQualifiedCString(), | 1427 parsed_function_->function().ToLibNamePrefixedQualifiedCString(), |
| 1436 Heap::kOld); | 1428 Heap::kOld); |
| 1437 | 1429 |
| 1438 Fragment instructions; | 1430 Fragment instructions; |
| 1439 | 1431 |
| 1440 // Create instance of _FallThroughError | 1432 // Create instance of _FallThroughError |
| 1441 instructions += AllocateObject(TokenPosition::kNoSource, klass, 0); | 1433 instructions += AllocateObject(TokenPosition::kNoSource, klass, 0); |
| 1442 LocalVariable* instance = MakeTemporary(); | 1434 LocalVariable* instance = MakeTemporary(); |
| 1443 | 1435 |
| 1444 // Call _TypeError._create constructor. | 1436 // Call _TypeError._create constructor. |
| (...skipping 16 matching lines...) Expand all Loading... |
| 1461 instructions += Drop(); | 1453 instructions += Drop(); |
| 1462 | 1454 |
| 1463 // Throw the exception | 1455 // Throw the exception |
| 1464 instructions += PushArgument(); | 1456 instructions += PushArgument(); |
| 1465 instructions += ThrowException(TokenPosition::kNoSource); | 1457 instructions += ThrowException(TokenPosition::kNoSource); |
| 1466 | 1458 |
| 1467 return instructions; | 1459 return instructions; |
| 1468 } | 1460 } |
| 1469 | 1461 |
| 1470 Fragment FlowGraphBuilder::ThrowNoSuchMethodError() { | 1462 Fragment FlowGraphBuilder::ThrowNoSuchMethodError() { |
| 1471 const dart::Class& klass = dart::Class::ZoneHandle( | 1463 const Class& klass = Class::ZoneHandle( |
| 1472 Z, dart::Library::LookupCoreClass(Symbols::NoSuchMethodError())); | 1464 Z, Library::LookupCoreClass(Symbols::NoSuchMethodError())); |
| 1473 ASSERT(!klass.IsNull()); | 1465 ASSERT(!klass.IsNull()); |
| 1474 const Function& throw_function = Function::ZoneHandle( | 1466 const Function& throw_function = Function::ZoneHandle( |
| 1475 Z, klass.LookupStaticFunctionAllowPrivate(Symbols::ThrowNew())); | 1467 Z, klass.LookupStaticFunctionAllowPrivate(Symbols::ThrowNew())); |
| 1476 ASSERT(!throw_function.IsNull()); | 1468 ASSERT(!throw_function.IsNull()); |
| 1477 | 1469 |
| 1478 Fragment instructions; | 1470 Fragment instructions; |
| 1479 | 1471 |
| 1480 // Call NoSuchMethodError._throwNew static function. | 1472 // Call NoSuchMethodError._throwNew static function. |
| 1481 instructions += NullConstant(); | 1473 instructions += NullConstant(); |
| 1482 instructions += PushArgument(); // receiver | 1474 instructions += PushArgument(); // receiver |
| (...skipping 13 matching lines...) Expand all Loading... |
| 1496 instructions += NullConstant(); | 1488 instructions += NullConstant(); |
| 1497 instructions += PushArgument(); // existingArgumentNames | 1489 instructions += PushArgument(); // existingArgumentNames |
| 1498 | 1490 |
| 1499 instructions += StaticCall(TokenPosition::kNoSource, throw_function, 6); | 1491 instructions += StaticCall(TokenPosition::kNoSource, throw_function, 6); |
| 1500 // Leave "result" on the stack since callers expect it to be there (even | 1492 // Leave "result" on the stack since callers expect it to be there (even |
| 1501 // though the function will result in an exception). | 1493 // though the function will result in an exception). |
| 1502 | 1494 |
| 1503 return instructions; | 1495 return instructions; |
| 1504 } | 1496 } |
| 1505 | 1497 |
| 1506 RawFunction* FlowGraphBuilder::LookupMethodByMember( | 1498 RawFunction* FlowGraphBuilder::LookupMethodByMember(NameIndex target, |
| 1507 NameIndex target, | 1499 const String& method_name) { |
| 1508 const dart::String& method_name) { | |
| 1509 NameIndex kernel_class = H.EnclosingName(target); | 1500 NameIndex kernel_class = H.EnclosingName(target); |
| 1510 dart::Class& klass = | 1501 Class& klass = Class::Handle(Z, H.LookupClassByKernelClass(kernel_class)); |
| 1511 dart::Class::Handle(Z, H.LookupClassByKernelClass(kernel_class)); | |
| 1512 | 1502 |
| 1513 RawFunction* function = klass.LookupFunctionAllowPrivate(method_name); | 1503 RawFunction* function = klass.LookupFunctionAllowPrivate(method_name); |
| 1514 ASSERT(function != Object::null()); | 1504 ASSERT(function != Object::null()); |
| 1515 return function; | 1505 return function; |
| 1516 } | 1506 } |
| 1517 | 1507 |
| 1518 LocalVariable* FlowGraphBuilder::MakeTemporary() { | 1508 LocalVariable* FlowGraphBuilder::MakeTemporary() { |
| 1519 char name[64]; | 1509 char name[64]; |
| 1520 intptr_t index = stack_->definition()->temp_index(); | 1510 intptr_t index = stack_->definition()->temp_index(); |
| 1521 OS::SNPrint(name, 64, ":temp%" Pd, index); | 1511 OS::SNPrint(name, 64, ":temp%" Pd, index); |
| (...skipping 15 matching lines...) Expand all Loading... |
| 1537 } | 1527 } |
| 1538 | 1528 |
| 1539 intptr_t FlowGraphBuilder::CurrentTryIndex() { | 1529 intptr_t FlowGraphBuilder::CurrentTryIndex() { |
| 1540 if (try_catch_block_ == NULL) { | 1530 if (try_catch_block_ == NULL) { |
| 1541 return CatchClauseNode::kInvalidTryIndex; | 1531 return CatchClauseNode::kInvalidTryIndex; |
| 1542 } else { | 1532 } else { |
| 1543 return try_catch_block_->try_index(); | 1533 return try_catch_block_->try_index(); |
| 1544 } | 1534 } |
| 1545 } | 1535 } |
| 1546 | 1536 |
| 1547 dart::LocalVariable* FlowGraphBuilder::LookupVariable(intptr_t kernel_offset) { | 1537 LocalVariable* FlowGraphBuilder::LookupVariable(intptr_t kernel_offset) { |
| 1548 LocalVariable* local = scopes_->locals.Lookup(kernel_offset); | 1538 LocalVariable* local = scopes_->locals.Lookup(kernel_offset); |
| 1549 ASSERT(local != NULL); | 1539 ASSERT(local != NULL); |
| 1550 return local; | 1540 return local; |
| 1551 } | 1541 } |
| 1552 | 1542 |
| 1553 void FlowGraphBuilder::SetTempIndex(Definition* definition) { | 1543 void FlowGraphBuilder::SetTempIndex(Definition* definition) { |
| 1554 definition->set_temp_index( | 1544 definition->set_temp_index( |
| 1555 stack_ == NULL ? 0 : stack_->definition()->temp_index() + 1); | 1545 stack_ == NULL ? 0 : stack_->definition()->temp_index() + 1); |
| 1556 } | 1546 } |
| 1557 | 1547 |
| (...skipping 25 matching lines...) Expand all Loading... |
| 1583 } else { | 1573 } else { |
| 1584 definition->ClearTempIndex(); | 1574 definition->ClearTempIndex(); |
| 1585 } | 1575 } |
| 1586 | 1576 |
| 1587 Pop(); | 1577 Pop(); |
| 1588 return instructions; | 1578 return instructions; |
| 1589 } | 1579 } |
| 1590 | 1580 |
| 1591 // TODO(27590): This method should be shared with | 1581 // TODO(27590): This method should be shared with |
| 1592 // runtime/vm/object.cc:RecognizeArithmeticOp. | 1582 // runtime/vm/object.cc:RecognizeArithmeticOp. |
| 1593 Token::Kind FlowGraphBuilder::MethodKind(const dart::String& name) { | 1583 Token::Kind FlowGraphBuilder::MethodKind(const String& name) { |
| 1594 ASSERT(name.IsSymbol()); | 1584 ASSERT(name.IsSymbol()); |
| 1595 if (name.raw() == Symbols::Plus().raw()) { | 1585 if (name.raw() == Symbols::Plus().raw()) { |
| 1596 return Token::kADD; | 1586 return Token::kADD; |
| 1597 } else if (name.raw() == Symbols::Minus().raw()) { | 1587 } else if (name.raw() == Symbols::Minus().raw()) { |
| 1598 return Token::kSUB; | 1588 return Token::kSUB; |
| 1599 } else if (name.raw() == Symbols::Star().raw()) { | 1589 } else if (name.raw() == Symbols::Star().raw()) { |
| 1600 return Token::kMUL; | 1590 return Token::kMUL; |
| 1601 } else if (name.raw() == Symbols::Slash().raw()) { | 1591 } else if (name.raw() == Symbols::Slash().raw()) { |
| 1602 return Token::kDIV; | 1592 return Token::kDIV; |
| 1603 } else if (name.raw() == Symbols::TruncDivOperator().raw()) { | 1593 } else if (name.raw() == Symbols::TruncDivOperator().raw()) { |
| (...skipping 19 matching lines...) Expand all Loading... |
| 1623 } else if (name.raw() == Symbols::Token(Token::kNE).raw()) { | 1613 } else if (name.raw() == Symbols::Token(Token::kNE).raw()) { |
| 1624 return Token::kNE; | 1614 return Token::kNE; |
| 1625 } else if (name.raw() == Symbols::LAngleBracket().raw()) { | 1615 } else if (name.raw() == Symbols::LAngleBracket().raw()) { |
| 1626 return Token::kLT; | 1616 return Token::kLT; |
| 1627 } else if (name.raw() == Symbols::RAngleBracket().raw()) { | 1617 } else if (name.raw() == Symbols::RAngleBracket().raw()) { |
| 1628 return Token::kGT; | 1618 return Token::kGT; |
| 1629 } else if (name.raw() == Symbols::LessEqualOperator().raw()) { | 1619 } else if (name.raw() == Symbols::LessEqualOperator().raw()) { |
| 1630 return Token::kLTE; | 1620 return Token::kLTE; |
| 1631 } else if (name.raw() == Symbols::GreaterEqualOperator().raw()) { | 1621 } else if (name.raw() == Symbols::GreaterEqualOperator().raw()) { |
| 1632 return Token::kGTE; | 1622 return Token::kGTE; |
| 1633 } else if (dart::Field::IsGetterName(name)) { | 1623 } else if (Field::IsGetterName(name)) { |
| 1634 return Token::kGET; | 1624 return Token::kGET; |
| 1635 } else if (dart::Field::IsSetterName(name)) { | 1625 } else if (Field::IsSetterName(name)) { |
| 1636 return Token::kSET; | 1626 return Token::kSET; |
| 1637 } | 1627 } |
| 1638 return Token::kILLEGAL; | 1628 return Token::kILLEGAL; |
| 1639 } | 1629 } |
| 1640 | 1630 |
| 1641 void FlowGraphBuilder::InlineBailout(const char* reason) { | 1631 void FlowGraphBuilder::InlineBailout(const char* reason) { |
| 1642 bool is_inlining = exit_collector_ != NULL; | 1632 bool is_inlining = exit_collector_ != NULL; |
| 1643 if (is_inlining) { | 1633 if (is_inlining) { |
| 1644 parsed_function_->function().set_is_inlinable(false); | 1634 parsed_function_->function().set_is_inlinable(false); |
| 1645 parsed_function_->Bailout("kernel::FlowGraphBuilder", reason); | 1635 parsed_function_->Bailout("kernel::FlowGraphBuilder", reason); |
| (...skipping 30 matching lines...) Expand all Loading... |
| 1676 body += StrictCompare(Token::kEQ_STRICT); | 1666 body += StrictCompare(Token::kEQ_STRICT); |
| 1677 break; | 1667 break; |
| 1678 case MethodRecognizer::kStringBaseLength: | 1668 case MethodRecognizer::kStringBaseLength: |
| 1679 case MethodRecognizer::kStringBaseIsEmpty: | 1669 case MethodRecognizer::kStringBaseIsEmpty: |
| 1680 // Depending on FLAG_support_externalizable_strings, treat string length | 1670 // Depending on FLAG_support_externalizable_strings, treat string length |
| 1681 // loads as mutable so that the class check that precedes them will not be | 1671 // loads as mutable so that the class check that precedes them will not be |
| 1682 // hoisted. This is unsafe because string externalization can change the | 1672 // hoisted. This is unsafe because string externalization can change the |
| 1683 // class. | 1673 // class. |
| 1684 body += LoadLocal(scopes_->this_variable); | 1674 body += LoadLocal(scopes_->this_variable); |
| 1685 body += LoadNativeField(MethodRecognizer::kStringBaseLength, | 1675 body += LoadNativeField(MethodRecognizer::kStringBaseLength, |
| 1686 dart::String::length_offset(), | 1676 String::length_offset(), |
| 1687 Type::ZoneHandle(Z, Type::SmiType()), kSmiCid, | 1677 Type::ZoneHandle(Z, Type::SmiType()), kSmiCid, |
| 1688 !FLAG_support_externalizable_strings); | 1678 !FLAG_support_externalizable_strings); |
| 1689 if (kind == MethodRecognizer::kStringBaseIsEmpty) { | 1679 if (kind == MethodRecognizer::kStringBaseIsEmpty) { |
| 1690 body += IntConstant(0); | 1680 body += IntConstant(0); |
| 1691 body += StrictCompare(Token::kEQ_STRICT); | 1681 body += StrictCompare(Token::kEQ_STRICT); |
| 1692 } | 1682 } |
| 1693 break; | 1683 break; |
| 1694 case MethodRecognizer::kGrowableArrayLength: | 1684 case MethodRecognizer::kGrowableArrayLength: |
| 1695 body += LoadLocal(scopes_->this_variable); | 1685 body += LoadLocal(scopes_->this_variable); |
| 1696 body += LoadNativeField(kind, GrowableObjectArray::length_offset(), | 1686 body += LoadNativeField(kind, GrowableObjectArray::length_offset(), |
| (...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1797 LinkedHashMap::deleted_keys_offset(), | 1787 LinkedHashMap::deleted_keys_offset(), |
| 1798 kNoStoreBarrier); | 1788 kNoStoreBarrier); |
| 1799 body += NullConstant(); | 1789 body += NullConstant(); |
| 1800 break; | 1790 break; |
| 1801 case MethodRecognizer::kBigint_getNeg: | 1791 case MethodRecognizer::kBigint_getNeg: |
| 1802 body += LoadLocal(scopes_->this_variable); | 1792 body += LoadLocal(scopes_->this_variable); |
| 1803 body += LoadNativeField(kind, Bigint::neg_offset(), | 1793 body += LoadNativeField(kind, Bigint::neg_offset(), |
| 1804 Type::ZoneHandle(Z, Type::BoolType()), kBoolCid); | 1794 Type::ZoneHandle(Z, Type::BoolType()), kBoolCid); |
| 1805 break; | 1795 break; |
| 1806 default: { | 1796 default: { |
| 1807 dart::String& name = dart::String::ZoneHandle(Z, function.native_name()); | 1797 String& name = String::ZoneHandle(Z, function.native_name()); |
| 1808 body += NativeCall(&name, &function); | 1798 body += NativeCall(&name, &function); |
| 1809 break; | 1799 break; |
| 1810 } | 1800 } |
| 1811 } | 1801 } |
| 1812 return body + Return(TokenPosition::kNoSource); | 1802 return body + Return(TokenPosition::kNoSource); |
| 1813 } | 1803 } |
| 1814 | 1804 |
| 1815 Fragment FlowGraphBuilder::BuildImplicitClosureCreation( | 1805 Fragment FlowGraphBuilder::BuildImplicitClosureCreation( |
| 1816 const Function& target) { | 1806 const Function& target) { |
| 1817 Fragment fragment; | 1807 Fragment fragment; |
| 1818 const dart::Class& closure_class = | 1808 const Class& closure_class = |
| 1819 dart::Class::ZoneHandle(Z, I->object_store()->closure_class()); | 1809 Class::ZoneHandle(Z, I->object_store()->closure_class()); |
| 1820 fragment += AllocateObject(closure_class, target); | 1810 fragment += AllocateObject(closure_class, target); |
| 1821 LocalVariable* closure = MakeTemporary(); | 1811 LocalVariable* closure = MakeTemporary(); |
| 1822 | 1812 |
| 1823 // The function signature can have uninstantiated class type parameters. | 1813 // The function signature can have uninstantiated class type parameters. |
| 1824 // | 1814 // |
| 1825 // TODO(regis): Also handle the case of a function signature that has | 1815 // TODO(regis): Also handle the case of a function signature that has |
| 1826 // uninstantiated function type parameters. | 1816 // uninstantiated function type parameters. |
| 1827 if (!target.HasInstantiatedSignature(kCurrentClass)) { | 1817 if (!target.HasInstantiatedSignature(kCurrentClass)) { |
| 1828 fragment += LoadLocal(closure); | 1818 fragment += LoadLocal(closure); |
| 1829 fragment += LoadInstantiatorTypeArguments(); | 1819 fragment += LoadInstantiatorTypeArguments(); |
| (...skipping 20 matching lines...) Expand all Loading... |
| 1850 // The context is on top of the operand stack. Store `this`. The context | 1840 // The context is on top of the operand stack. Store `this`. The context |
| 1851 // doesn't need a parent pointer because it doesn't close over anything | 1841 // doesn't need a parent pointer because it doesn't close over anything |
| 1852 // else. | 1842 // else. |
| 1853 fragment += LoadLocal(scopes_->this_variable); | 1843 fragment += LoadLocal(scopes_->this_variable); |
| 1854 fragment += | 1844 fragment += |
| 1855 StoreInstanceField(TokenPosition::kNoSource, Context::variable_offset(0)); | 1845 StoreInstanceField(TokenPosition::kNoSource, Context::variable_offset(0)); |
| 1856 | 1846 |
| 1857 return fragment; | 1847 return fragment; |
| 1858 } | 1848 } |
| 1859 | 1849 |
| 1860 Fragment FlowGraphBuilder::GuardFieldLength(const dart::Field& field, | 1850 Fragment FlowGraphBuilder::GuardFieldLength(const Field& field, |
| 1861 intptr_t deopt_id) { | 1851 intptr_t deopt_id) { |
| 1862 return Fragment(new (Z) GuardFieldLengthInstr(Pop(), field, deopt_id)); | 1852 return Fragment(new (Z) GuardFieldLengthInstr(Pop(), field, deopt_id)); |
| 1863 } | 1853 } |
| 1864 | 1854 |
| 1865 Fragment FlowGraphBuilder::GuardFieldClass(const dart::Field& field, | 1855 Fragment FlowGraphBuilder::GuardFieldClass(const Field& field, |
| 1866 intptr_t deopt_id) { | 1856 intptr_t deopt_id) { |
| 1867 return Fragment(new (Z) GuardFieldClassInstr(Pop(), field, deopt_id)); | 1857 return Fragment(new (Z) GuardFieldClassInstr(Pop(), field, deopt_id)); |
| 1868 } | 1858 } |
| 1869 | 1859 |
| 1870 Fragment FlowGraphBuilder::CheckVariableTypeInCheckedMode( | 1860 Fragment FlowGraphBuilder::CheckVariableTypeInCheckedMode( |
| 1871 const AbstractType& dst_type, | 1861 const AbstractType& dst_type, |
| 1872 const dart::String& name_symbol) { | 1862 const String& name_symbol) { |
| 1873 if (I->type_checks()) { | 1863 if (I->type_checks()) { |
| 1874 if (dst_type.IsMalformed()) { | 1864 if (dst_type.IsMalformed()) { |
| 1875 return ThrowTypeError(); | 1865 return ThrowTypeError(); |
| 1876 } | 1866 } |
| 1877 return CheckAssignableInCheckedMode(dst_type, name_symbol); | 1867 return CheckAssignableInCheckedMode(dst_type, name_symbol); |
| 1878 } | 1868 } |
| 1879 return Fragment(); | 1869 return Fragment(); |
| 1880 } | 1870 } |
| 1881 | 1871 |
| 1882 bool FlowGraphBuilder::NeedsDebugStepCheck(const Function& function, | 1872 bool FlowGraphBuilder::NeedsDebugStepCheck(const Function& function, |
| (...skipping 17 matching lines...) Expand all Loading... |
| 1900 return definition->IsLoadLocal() && | 1890 return definition->IsLoadLocal() && |
| 1901 !definition->AsLoadLocal()->local().IsInternal(); | 1891 !definition->AsLoadLocal()->local().IsInternal(); |
| 1902 } | 1892 } |
| 1903 | 1893 |
| 1904 Fragment FlowGraphBuilder::DebugStepCheck(TokenPosition position) { | 1894 Fragment FlowGraphBuilder::DebugStepCheck(TokenPosition position) { |
| 1905 return Fragment(new (Z) DebugStepCheckInstr( | 1895 return Fragment(new (Z) DebugStepCheckInstr( |
| 1906 position, RawPcDescriptors::kRuntimeCall, GetNextDeoptId())); | 1896 position, RawPcDescriptors::kRuntimeCall, GetNextDeoptId())); |
| 1907 } | 1897 } |
| 1908 | 1898 |
| 1909 Fragment FlowGraphBuilder::EvaluateAssertion() { | 1899 Fragment FlowGraphBuilder::EvaluateAssertion() { |
| 1910 const dart::Class& klass = dart::Class::ZoneHandle( | 1900 const Class& klass = |
| 1911 Z, dart::Library::LookupCoreClass(Symbols::AssertionError())); | 1901 Class::ZoneHandle(Z, Library::LookupCoreClass(Symbols::AssertionError())); |
| 1912 ASSERT(!klass.IsNull()); | 1902 ASSERT(!klass.IsNull()); |
| 1913 const Function& target = | 1903 const Function& target = |
| 1914 Function::ZoneHandle(Z, klass.LookupStaticFunctionAllowPrivate( | 1904 Function::ZoneHandle(Z, klass.LookupStaticFunctionAllowPrivate( |
| 1915 H.DartSymbol("_evaluateAssertion"))); | 1905 H.DartSymbol("_evaluateAssertion"))); |
| 1916 ASSERT(!target.IsNull()); | 1906 ASSERT(!target.IsNull()); |
| 1917 return StaticCall(TokenPosition::kNoSource, target, 1); | 1907 return StaticCall(TokenPosition::kNoSource, target, 1); |
| 1918 } | 1908 } |
| 1919 | 1909 |
| 1920 Fragment FlowGraphBuilder::CheckReturnTypeInCheckedMode() { | 1910 Fragment FlowGraphBuilder::CheckReturnTypeInCheckedMode() { |
| 1921 if (I->type_checks()) { | 1911 if (I->type_checks()) { |
| (...skipping 10 matching lines...) Expand all Loading... |
| 1932 LocalVariable* top_of_stack = MakeTemporary(); | 1922 LocalVariable* top_of_stack = MakeTemporary(); |
| 1933 instructions += LoadLocal(top_of_stack); | 1923 instructions += LoadLocal(top_of_stack); |
| 1934 instructions += AssertBool(); | 1924 instructions += AssertBool(); |
| 1935 instructions += Drop(); | 1925 instructions += Drop(); |
| 1936 } | 1926 } |
| 1937 return instructions; | 1927 return instructions; |
| 1938 } | 1928 } |
| 1939 | 1929 |
| 1940 Fragment FlowGraphBuilder::CheckAssignableInCheckedMode( | 1930 Fragment FlowGraphBuilder::CheckAssignableInCheckedMode( |
| 1941 const AbstractType& dst_type, | 1931 const AbstractType& dst_type, |
| 1942 const dart::String& dst_name) { | 1932 const String& dst_name) { |
| 1943 Fragment instructions; | 1933 Fragment instructions; |
| 1944 if (I->type_checks() && !dst_type.IsDynamicType() && | 1934 if (I->type_checks() && !dst_type.IsDynamicType() && |
| 1945 !dst_type.IsObjectType() && !dst_type.IsVoidType()) { | 1935 !dst_type.IsObjectType() && !dst_type.IsVoidType()) { |
| 1946 LocalVariable* top_of_stack = MakeTemporary(); | 1936 LocalVariable* top_of_stack = MakeTemporary(); |
| 1947 instructions += LoadLocal(top_of_stack); | 1937 instructions += LoadLocal(top_of_stack); |
| 1948 instructions += AssertAssignable(dst_type, dst_name); | 1938 instructions += AssertAssignable(dst_type, dst_name); |
| 1949 instructions += Drop(); | 1939 instructions += Drop(); |
| 1950 } | 1940 } |
| 1951 return instructions; | 1941 return instructions; |
| 1952 } | 1942 } |
| 1953 | 1943 |
| 1954 Fragment FlowGraphBuilder::AssertBool() { | 1944 Fragment FlowGraphBuilder::AssertBool() { |
| 1955 Value* value = Pop(); | 1945 Value* value = Pop(); |
| 1956 AssertBooleanInstr* instr = new (Z) | 1946 AssertBooleanInstr* instr = new (Z) |
| 1957 AssertBooleanInstr(TokenPosition::kNoSource, value, GetNextDeoptId()); | 1947 AssertBooleanInstr(TokenPosition::kNoSource, value, GetNextDeoptId()); |
| 1958 Push(instr); | 1948 Push(instr); |
| 1959 return Fragment(instr); | 1949 return Fragment(instr); |
| 1960 } | 1950 } |
| 1961 | 1951 |
| 1962 Fragment FlowGraphBuilder::AssertAssignable(const AbstractType& dst_type, | 1952 Fragment FlowGraphBuilder::AssertAssignable(const AbstractType& dst_type, |
| 1963 const dart::String& dst_name) { | 1953 const String& dst_name) { |
| 1964 Fragment instructions; | 1954 Fragment instructions; |
| 1965 Value* value = Pop(); | 1955 Value* value = Pop(); |
| 1966 | 1956 |
| 1967 if (!dst_type.IsInstantiated(kCurrentClass)) { | 1957 if (!dst_type.IsInstantiated(kCurrentClass)) { |
| 1968 instructions += LoadInstantiatorTypeArguments(); | 1958 instructions += LoadInstantiatorTypeArguments(); |
| 1969 } else { | 1959 } else { |
| 1970 instructions += NullConstant(); | 1960 instructions += NullConstant(); |
| 1971 } | 1961 } |
| 1972 Value* instantiator_type_args = Pop(); | 1962 Value* instantiator_type_args = Pop(); |
| 1973 | 1963 |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2034 // TODO(regis): Check if a type argument vector is passed. | 2024 // TODO(regis): Check if a type argument vector is passed. |
| 2035 | 2025 |
| 2036 // The receiver is the first argument to noSuchMethod, and it is the first | 2026 // The receiver is the first argument to noSuchMethod, and it is the first |
| 2037 // argument passed to the dispatcher function. | 2027 // argument passed to the dispatcher function. |
| 2038 LocalScope* scope = parsed_function_->node_sequence()->scope(); | 2028 LocalScope* scope = parsed_function_->node_sequence()->scope(); |
| 2039 body += LoadLocal(scope->VariableAt(0)); | 2029 body += LoadLocal(scope->VariableAt(0)); |
| 2040 body += PushArgument(); | 2030 body += PushArgument(); |
| 2041 | 2031 |
| 2042 // The second argument to noSuchMethod is an invocation mirror. Push the | 2032 // The second argument to noSuchMethod is an invocation mirror. Push the |
| 2043 // arguments for allocating the invocation mirror. First, the name. | 2033 // arguments for allocating the invocation mirror. First, the name. |
| 2044 body += Constant(dart::String::ZoneHandle(Z, function.name())); | 2034 body += Constant(String::ZoneHandle(Z, function.name())); |
| 2045 body += PushArgument(); | 2035 body += PushArgument(); |
| 2046 | 2036 |
| 2047 // Second, the arguments descriptor. | 2037 // Second, the arguments descriptor. |
| 2048 body += Constant(descriptor_array); | 2038 body += Constant(descriptor_array); |
| 2049 body += PushArgument(); | 2039 body += PushArgument(); |
| 2050 | 2040 |
| 2051 // Third, an array containing the original arguments. Create it and fill | 2041 // Third, an array containing the original arguments. Create it and fill |
| 2052 // it in. | 2042 // it in. |
| 2053 body += Constant(TypeArguments::ZoneHandle(Z, TypeArguments::null())); | 2043 body += Constant(TypeArguments::ZoneHandle(Z, TypeArguments::null())); |
| 2054 body += IntConstant(descriptor.Count()); | 2044 body += IntConstant(descriptor.Count()); |
| 2055 body += CreateArray(); | 2045 body += CreateArray(); |
| 2056 LocalVariable* array = MakeTemporary(); | 2046 LocalVariable* array = MakeTemporary(); |
| 2057 for (intptr_t i = 0; i < descriptor.PositionalCount(); ++i) { | 2047 for (intptr_t i = 0; i < descriptor.PositionalCount(); ++i) { |
| 2058 body += LoadLocal(array); | 2048 body += LoadLocal(array); |
| 2059 body += IntConstant(i); | 2049 body += IntConstant(i); |
| 2060 body += LoadLocal(scope->VariableAt(i)); | 2050 body += LoadLocal(scope->VariableAt(i)); |
| 2061 body += StoreIndexed(kArrayCid); | 2051 body += StoreIndexed(kArrayCid); |
| 2062 body += Drop(); | 2052 body += Drop(); |
| 2063 } | 2053 } |
| 2064 dart::String& name = dart::String::Handle(Z); | 2054 String& name = String::Handle(Z); |
| 2065 for (intptr_t i = 0; i < descriptor.NamedCount(); ++i) { | 2055 for (intptr_t i = 0; i < descriptor.NamedCount(); ++i) { |
| 2066 intptr_t parameter_index = descriptor.PositionalCount() + i; | 2056 intptr_t parameter_index = descriptor.PositionalCount() + i; |
| 2067 name = descriptor.NameAt(i); | 2057 name = descriptor.NameAt(i); |
| 2068 name = Symbols::New(H.thread(), name); | 2058 name = Symbols::New(H.thread(), name); |
| 2069 body += LoadLocal(array); | 2059 body += LoadLocal(array); |
| 2070 body += IntConstant(descriptor.PositionAt(i)); | 2060 body += IntConstant(descriptor.PositionAt(i)); |
| 2071 body += LoadLocal(scope->VariableAt(parameter_index)); | 2061 body += LoadLocal(scope->VariableAt(parameter_index)); |
| 2072 body += StoreIndexed(kArrayCid); | 2062 body += StoreIndexed(kArrayCid); |
| 2073 body += Drop(); | 2063 body += Drop(); |
| 2074 } | 2064 } |
| 2075 body += PushArgument(); | 2065 body += PushArgument(); |
| 2076 | 2066 |
| 2077 // Fourth, false indicating this is not a super NoSuchMethod. | 2067 // Fourth, false indicating this is not a super NoSuchMethod. |
| 2078 body += Constant(Bool::False()); | 2068 body += Constant(Bool::False()); |
| 2079 body += PushArgument(); | 2069 body += PushArgument(); |
| 2080 | 2070 |
| 2081 const dart::Class& mirror_class = dart::Class::Handle( | 2071 const Class& mirror_class = |
| 2082 Z, dart::Library::LookupCoreClass(Symbols::InvocationMirror())); | 2072 Class::Handle(Z, Library::LookupCoreClass(Symbols::InvocationMirror())); |
| 2083 ASSERT(!mirror_class.IsNull()); | 2073 ASSERT(!mirror_class.IsNull()); |
| 2084 const Function& allocation_function = Function::ZoneHandle( | 2074 const Function& allocation_function = Function::ZoneHandle( |
| 2085 Z, mirror_class.LookupStaticFunction(dart::Library::PrivateCoreLibName( | 2075 Z, mirror_class.LookupStaticFunction( |
| 2086 Symbols::AllocateInvocationMirror()))); | 2076 Library::PrivateCoreLibName(Symbols::AllocateInvocationMirror()))); |
| 2087 ASSERT(!allocation_function.IsNull()); | 2077 ASSERT(!allocation_function.IsNull()); |
| 2088 body += StaticCall(TokenPosition::kMinSource, allocation_function, 4); | 2078 body += StaticCall(TokenPosition::kMinSource, allocation_function, 4); |
| 2089 body += PushArgument(); // For the call to noSuchMethod. | 2079 body += PushArgument(); // For the call to noSuchMethod. |
| 2090 | 2080 |
| 2091 const int kTypeArgsLen = 0; | 2081 const int kTypeArgsLen = 0; |
| 2092 ArgumentsDescriptor two_arguments( | 2082 ArgumentsDescriptor two_arguments( |
| 2093 Array::Handle(Z, ArgumentsDescriptor::New(kTypeArgsLen, 2))); | 2083 Array::Handle(Z, ArgumentsDescriptor::New(kTypeArgsLen, 2))); |
| 2094 Function& no_such_method = | 2084 Function& no_such_method = |
| 2095 Function::ZoneHandle(Z, Resolver::ResolveDynamicForReceiverClass( | 2085 Function::ZoneHandle(Z, Resolver::ResolveDynamicForReceiverClass( |
| 2096 dart::Class::Handle(Z, function.Owner()), | 2086 Class::Handle(Z, function.Owner()), |
| 2097 Symbols::NoSuchMethod(), two_arguments)); | 2087 Symbols::NoSuchMethod(), two_arguments)); |
| 2098 if (no_such_method.IsNull()) { | 2088 if (no_such_method.IsNull()) { |
| 2099 // If noSuchMethod is not found on the receiver class, call | 2089 // If noSuchMethod is not found on the receiver class, call |
| 2100 // Object.noSuchMethod. | 2090 // Object.noSuchMethod. |
| 2101 no_such_method = Resolver::ResolveDynamicForReceiverClass( | 2091 no_such_method = Resolver::ResolveDynamicForReceiverClass( |
| 2102 dart::Class::Handle(Z, I->object_store()->object_class()), | 2092 Class::Handle(Z, I->object_store()->object_class()), |
| 2103 Symbols::NoSuchMethod(), two_arguments); | 2093 Symbols::NoSuchMethod(), two_arguments); |
| 2104 } | 2094 } |
| 2105 body += StaticCall(TokenPosition::kMinSource, no_such_method, 2); | 2095 body += StaticCall(TokenPosition::kMinSource, no_such_method, 2); |
| 2106 body += Return(TokenPosition::kNoSource); | 2096 body += Return(TokenPosition::kNoSource); |
| 2107 | 2097 |
| 2108 return new (Z) FlowGraph(*parsed_function_, graph_entry_, next_block_id_ - 1); | 2098 return new (Z) FlowGraph(*parsed_function_, graph_entry_, next_block_id_ - 1); |
| 2109 } | 2099 } |
| 2110 | 2100 |
| 2111 FlowGraph* FlowGraphBuilder::BuildGraphOfInvokeFieldDispatcher( | 2101 FlowGraph* FlowGraphBuilder::BuildGraphOfInvokeFieldDispatcher( |
| 2112 const Function& function) { | 2102 const Function& function) { |
| 2113 // Find the name of the field we should dispatch to. | 2103 // Find the name of the field we should dispatch to. |
| 2114 const dart::Class& owner = dart::Class::Handle(Z, function.Owner()); | 2104 const Class& owner = Class::Handle(Z, function.Owner()); |
| 2115 ASSERT(!owner.IsNull()); | 2105 ASSERT(!owner.IsNull()); |
| 2116 const dart::String& field_name = dart::String::Handle(Z, function.name()); | 2106 const String& field_name = String::Handle(Z, function.name()); |
| 2117 const dart::String& getter_name = dart::String::ZoneHandle( | 2107 const String& getter_name = String::ZoneHandle( |
| 2118 Z, | 2108 Z, Symbols::New(H.thread(), |
| 2119 Symbols::New(H.thread(), dart::String::Handle( | 2109 String::Handle(Z, Field::GetterSymbol(field_name)))); |
| 2120 Z, dart::Field::GetterSymbol(field_name)))); | |
| 2121 | 2110 |
| 2122 // Determine if this is `class Closure { get call => this; }` | 2111 // Determine if this is `class Closure { get call => this; }` |
| 2123 const dart::Class& closure_class = | 2112 const Class& closure_class = |
| 2124 dart::Class::Handle(Z, I->object_store()->closure_class()); | 2113 Class::Handle(Z, I->object_store()->closure_class()); |
| 2125 const bool is_closure_call = (owner.raw() == closure_class.raw()) && | 2114 const bool is_closure_call = (owner.raw() == closure_class.raw()) && |
| 2126 field_name.Equals(Symbols::Call()); | 2115 field_name.Equals(Symbols::Call()); |
| 2127 | 2116 |
| 2128 // Set default parameters & construct argument names array. | 2117 // Set default parameters & construct argument names array. |
| 2129 // | 2118 // |
| 2130 // The backend will expect an array of default values for all the named | 2119 // The backend will expect an array of default values for all the named |
| 2131 // parameters, even if they are all known to be passed at the call site | 2120 // parameters, even if they are all known to be passed at the call site |
| 2132 // because the call site matches the arguments descriptor. Use null for | 2121 // because the call site matches the arguments descriptor. Use null for |
| 2133 // the default values. | 2122 // the default values. |
| 2134 const Array& descriptor_array = | 2123 const Array& descriptor_array = |
| 2135 Array::ZoneHandle(Z, function.saved_args_desc()); | 2124 Array::ZoneHandle(Z, function.saved_args_desc()); |
| 2136 ArgumentsDescriptor descriptor(descriptor_array); | 2125 ArgumentsDescriptor descriptor(descriptor_array); |
| 2137 const Array& argument_names = | 2126 const Array& argument_names = |
| 2138 Array::ZoneHandle(Z, Array::New(descriptor.NamedCount(), Heap::kOld)); | 2127 Array::ZoneHandle(Z, Array::New(descriptor.NamedCount(), Heap::kOld)); |
| 2139 ZoneGrowableArray<const Instance*>* default_values = | 2128 ZoneGrowableArray<const Instance*>* default_values = |
| 2140 new ZoneGrowableArray<const Instance*>(Z, descriptor.NamedCount()); | 2129 new ZoneGrowableArray<const Instance*>(Z, descriptor.NamedCount()); |
| 2141 dart::String& string_handle = dart::String::Handle(Z); | 2130 String& string_handle = String::Handle(Z); |
| 2142 for (intptr_t i = 0; i < descriptor.NamedCount(); ++i) { | 2131 for (intptr_t i = 0; i < descriptor.NamedCount(); ++i) { |
| 2143 default_values->Add(&Object::null_instance()); | 2132 default_values->Add(&Object::null_instance()); |
| 2144 string_handle = descriptor.NameAt(i); | 2133 string_handle = descriptor.NameAt(i); |
| 2145 argument_names.SetAt(i, string_handle); | 2134 argument_names.SetAt(i, string_handle); |
| 2146 } | 2135 } |
| 2147 parsed_function_->set_default_parameter_values(default_values); | 2136 parsed_function_->set_default_parameter_values(default_values); |
| 2148 | 2137 |
| 2149 TargetEntryInstr* normal_entry = BuildTargetEntry(); | 2138 TargetEntryInstr* normal_entry = BuildTargetEntry(); |
| 2150 graph_entry_ = new (Z) | 2139 graph_entry_ = new (Z) |
| 2151 GraphEntryInstr(*parsed_function_, normal_entry, Compiler::kNoOSRDeoptId); | 2140 GraphEntryInstr(*parsed_function_, normal_entry, Compiler::kNoOSRDeoptId); |
| (...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2225 ASSERT(stack_->definition()->IsPushArgument()); | 2214 ASSERT(stack_->definition()->IsPushArgument()); |
| 2226 ASSERT(!stack_->definition()->HasSSATemp()); | 2215 ASSERT(!stack_->definition()->HasSSATemp()); |
| 2227 arguments->data()[i] = stack_->definition()->AsPushArgument(); | 2216 arguments->data()[i] = stack_->definition()->AsPushArgument(); |
| 2228 Drop(); | 2217 Drop(); |
| 2229 } | 2218 } |
| 2230 pending_argument_count_ -= count; | 2219 pending_argument_count_ -= count; |
| 2231 ASSERT(pending_argument_count_ >= 0); | 2220 ASSERT(pending_argument_count_ >= 0); |
| 2232 return arguments; | 2221 return arguments; |
| 2233 } | 2222 } |
| 2234 | 2223 |
| 2235 RawObject* EvaluateMetadata(const dart::Field& metadata_field) { | 2224 RawObject* EvaluateMetadata(const Field& metadata_field) { |
| 2236 LongJumpScope jump; | 2225 LongJumpScope jump; |
| 2237 if (setjmp(*jump.Set()) == 0) { | 2226 if (setjmp(*jump.Set()) == 0) { |
| 2238 Thread* thread = Thread::Current(); | 2227 Thread* thread = Thread::Current(); |
| 2239 Zone* zone_ = thread->zone(); | 2228 Zone* zone_ = thread->zone(); |
| 2240 TranslationHelper helper(thread); | 2229 TranslationHelper helper(thread); |
| 2241 Script& script = Script::Handle(Z, metadata_field.Script()); | 2230 Script& script = Script::Handle(Z, metadata_field.Script()); |
| 2242 helper.SetStringOffsets( | 2231 helper.SetStringOffsets( |
| 2243 TypedData::Handle(Z, script.kernel_string_offsets())); | 2232 TypedData::Handle(Z, script.kernel_string_offsets())); |
| 2244 helper.SetStringData(TypedData::Handle(Z, script.kernel_string_data())); | 2233 helper.SetStringData(TypedData::Handle(Z, script.kernel_string_data())); |
| 2245 helper.SetCanonicalNames( | 2234 helper.SetCanonicalNames( |
| (...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2367 entry = it.GetNext(); | 2356 entry = it.GetNext(); |
| 2368 data = TypedData::null(); | 2357 data = TypedData::null(); |
| 2369 if (entry.IsClass()) { | 2358 if (entry.IsClass()) { |
| 2370 const Class& klass = Class::Cast(entry); | 2359 const Class& klass = Class::Cast(entry); |
| 2371 entry_script = klass.script(); | 2360 entry_script = klass.script(); |
| 2372 if (!entry_script.IsNull() && script.kernel_script_index() == | 2361 if (!entry_script.IsNull() && script.kernel_script_index() == |
| 2373 entry_script.kernel_script_index()) { | 2362 entry_script.kernel_script_index()) { |
| 2374 token_positions.Add(klass.token_pos().value()); | 2363 token_positions.Add(klass.token_pos().value()); |
| 2375 } | 2364 } |
| 2376 Array& array = Array::Handle(zone_, klass.fields()); | 2365 Array& array = Array::Handle(zone_, klass.fields()); |
| 2377 dart::Field& field = dart::Field::Handle(Z); | 2366 Field& field = Field::Handle(Z); |
| 2378 for (intptr_t i = 0; i < array.Length(); ++i) { | 2367 for (intptr_t i = 0; i < array.Length(); ++i) { |
| 2379 field ^= array.At(i); | 2368 field ^= array.At(i); |
| 2380 data = field.kernel_data(); | 2369 data = field.kernel_data(); |
| 2381 entry_script = field.Script(); | 2370 entry_script = field.Script(); |
| 2382 ProcessTokenPositionsEntry(data, script, entry_script, | 2371 ProcessTokenPositionsEntry(data, script, entry_script, |
| 2383 field.kernel_offset(), zone_, &helper, | 2372 field.kernel_offset(), zone_, &helper, |
| 2384 &token_positions, &yield_positions); | 2373 &token_positions, &yield_positions); |
| 2385 } | 2374 } |
| 2386 array = klass.functions(); | 2375 array = klass.functions(); |
| 2387 Function& function = Function::Handle(Z); | 2376 Function& function = Function::Handle(Z); |
| 2388 for (intptr_t i = 0; i < array.Length(); ++i) { | 2377 for (intptr_t i = 0; i < array.Length(); ++i) { |
| 2389 function ^= array.At(i); | 2378 function ^= array.At(i); |
| 2390 data = function.kernel_data(); | 2379 data = function.kernel_data(); |
| 2391 entry_script = function.script(); | 2380 entry_script = function.script(); |
| 2392 ProcessTokenPositionsEntry(data, script, entry_script, | 2381 ProcessTokenPositionsEntry(data, script, entry_script, |
| 2393 function.kernel_offset(), zone_, &helper, | 2382 function.kernel_offset(), zone_, &helper, |
| 2394 &token_positions, &yield_positions); | 2383 &token_positions, &yield_positions); |
| 2395 } | 2384 } |
| 2396 } else if (entry.IsFunction()) { | 2385 } else if (entry.IsFunction()) { |
| 2397 const Function& function = Function::Cast(entry); | 2386 const Function& function = Function::Cast(entry); |
| 2398 data = function.kernel_data(); | 2387 data = function.kernel_data(); |
| 2399 entry_script = function.script(); | 2388 entry_script = function.script(); |
| 2400 ProcessTokenPositionsEntry(data, script, entry_script, | 2389 ProcessTokenPositionsEntry(data, script, entry_script, |
| 2401 function.kernel_offset(), zone_, &helper, | 2390 function.kernel_offset(), zone_, &helper, |
| 2402 &token_positions, &yield_positions); | 2391 &token_positions, &yield_positions); |
| 2403 } else if (entry.IsField()) { | 2392 } else if (entry.IsField()) { |
| 2404 const dart::Field& field = dart::Field::Cast(entry); | 2393 const Field& field = Field::Cast(entry); |
| 2405 data = field.kernel_data(); | 2394 data = field.kernel_data(); |
| 2406 entry_script = field.Script(); | 2395 entry_script = field.Script(); |
| 2407 ProcessTokenPositionsEntry(data, script, entry_script, | 2396 ProcessTokenPositionsEntry(data, script, entry_script, |
| 2408 field.kernel_offset(), zone_, &helper, | 2397 field.kernel_offset(), zone_, &helper, |
| 2409 &token_positions, &yield_positions); | 2398 &token_positions, &yield_positions); |
| 2410 } | 2399 } |
| 2411 } | 2400 } |
| 2412 } | 2401 } |
| 2413 | 2402 |
| 2414 Array& array_object = Array::Handle(Z); | 2403 Array& array_object = Array::Handle(Z); |
| 2415 array_object = AsSortedDuplicateFreeArray(&token_positions); | 2404 array_object = AsSortedDuplicateFreeArray(&token_positions); |
| 2416 script.set_debug_positions(array_object); | 2405 script.set_debug_positions(array_object); |
| 2417 array_object = AsSortedDuplicateFreeArray(&yield_positions); | 2406 array_object = AsSortedDuplicateFreeArray(&yield_positions); |
| 2418 script.set_yield_positions(array_object); | 2407 script.set_yield_positions(array_object); |
| 2419 } | 2408 } |
| 2420 | 2409 |
| 2421 } // namespace kernel | 2410 } // namespace kernel |
| 2422 } // namespace dart | 2411 } // namespace dart |
| 2423 | 2412 |
| 2424 #endif // !defined(DART_PRECOMPILED_RUNTIME) | 2413 #endif // !defined(DART_PRECOMPILED_RUNTIME) |
| OLD | NEW |