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

Side by Side Diff: runtime/vm/kernel_to_il.cc

Issue 3001103002: Do not qualify with dart:: except where necessary (Closed)
Patch Set: Created 3 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « runtime/vm/kernel_to_il.h ('k') | runtime/vm/parser.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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)
OLDNEW
« no previous file with comments | « runtime/vm/kernel_to_il.h ('k') | runtime/vm/parser.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698