OLD | NEW |
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 #include "lib/invocation_mirror.h" | 5 #include "lib/invocation_mirror.h" |
6 #include "vm/bootstrap_natives.h" | 6 #include "vm/bootstrap_natives.h" |
7 #include "vm/class_finalizer.h" | 7 #include "vm/class_finalizer.h" |
8 #include "vm/compiler.h" | 8 #include "vm/compiler.h" |
9 #include "vm/dart_entry.h" | 9 #include "vm/dart_entry.h" |
10 #include "vm/exceptions.h" | 10 #include "vm/exceptions.h" |
(...skipping 367 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
378 } | 378 } |
379 | 379 |
380 | 380 |
381 static RawInstance* CreateLibraryMirror(const Library& lib) { | 381 static RawInstance* CreateLibraryMirror(const Library& lib) { |
382 const Array& args = Array::Handle(Array::New(3)); | 382 const Array& args = Array::Handle(Array::New(3)); |
383 args.SetAt(0, MirrorReference::Handle(MirrorReference::New(lib))); | 383 args.SetAt(0, MirrorReference::Handle(MirrorReference::New(lib))); |
384 String& str = String::Handle(); | 384 String& str = String::Handle(); |
385 str = lib.name(); | 385 str = lib.name(); |
386 args.SetAt(1, str); | 386 args.SetAt(1, str); |
387 str = lib.url(); | 387 str = lib.url(); |
| 388 if (str.Equals("dart:builtin") || str.Equals("dart:_blink")) { |
| 389 // Censored library (grumble). |
| 390 return Instance::null(); |
| 391 } |
388 args.SetAt(2, str); | 392 args.SetAt(2, str); |
389 return CreateMirror(Symbols::_LocalLibraryMirror(), args); | 393 return CreateMirror(Symbols::_LocalLibraryMirror(), args); |
390 } | 394 } |
391 | 395 |
392 | 396 |
393 static RawInstance* CreateCombinatorMirror(const Object& identifiers, | 397 static RawInstance* CreateCombinatorMirror(const Object& identifiers, |
394 bool is_show) { | 398 bool is_show) { |
395 const Array& args = Array::Handle(Array::New(2)); | 399 const Array& args = Array::Handle(Array::New(2)); |
396 args.SetAt(0, identifiers); | 400 args.SetAt(0, identifiers); |
397 args.SetAt(1, Bool::Get(is_show)); | 401 args.SetAt(1, Bool::Get(is_show)); |
398 return CreateMirror(Symbols::_LocalCombinatorMirror(), args); | 402 return CreateMirror(Symbols::_LocalCombinatorMirror(), args); |
399 } | 403 } |
400 | 404 |
401 | 405 |
402 static RawInstance* CreateLibraryDependencyMirror(const Instance& importer, | 406 static RawInstance* CreateLibraryDependencyMirror(const Instance& importer, |
403 const Namespace& ns, | 407 const Namespace& ns, |
404 const String& prefix, | 408 const String& prefix, |
405 bool is_import) { | 409 bool is_import) { |
406 const Library& importee = Library::Handle(ns.library()); | 410 const Library& importee = Library::Handle(ns.library()); |
407 const Instance& importee_mirror = | 411 const Instance& importee_mirror = |
408 Instance::Handle(CreateLibraryMirror(importee)); | 412 Instance::Handle(CreateLibraryMirror(importee)); |
| 413 if (importee_mirror.IsNull()) { |
| 414 // Imported library is censored: censor the import. |
| 415 return Instance::null(); |
| 416 } |
409 | 417 |
410 const Array& show_names = Array::Handle(ns.show_names()); | 418 const Array& show_names = Array::Handle(ns.show_names()); |
411 const Array& hide_names = Array::Handle(ns.hide_names()); | 419 const Array& hide_names = Array::Handle(ns.hide_names()); |
412 intptr_t n = show_names.IsNull() ? 0 : show_names.Length(); | 420 intptr_t n = show_names.IsNull() ? 0 : show_names.Length(); |
413 intptr_t m = hide_names.IsNull() ? 0 : hide_names.Length(); | 421 intptr_t m = hide_names.IsNull() ? 0 : hide_names.Length(); |
414 const Array& combinators = Array::Handle(Array::New(n + m)); | 422 const Array& combinators = Array::Handle(Array::New(n + m)); |
415 Object& t = Object::Handle(); | 423 Object& t = Object::Handle(); |
416 intptr_t i = 0; | 424 intptr_t i = 0; |
417 for (intptr_t j = 0; j < n; j++) { | 425 for (intptr_t j = 0; j < n; j++) { |
418 t = show_names.At(j); | 426 t = show_names.At(j); |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
454 String& prefix = String::Handle(); | 462 String& prefix = String::Handle(); |
455 GrowableObjectArray& deps = | 463 GrowableObjectArray& deps = |
456 GrowableObjectArray::Handle(GrowableObjectArray::New()); | 464 GrowableObjectArray::Handle(GrowableObjectArray::New()); |
457 | 465 |
458 // Unprefixed imports. | 466 // Unprefixed imports. |
459 ports = lib.imports(); | 467 ports = lib.imports(); |
460 for (intptr_t i = 0; i < ports.Length(); i++) { | 468 for (intptr_t i = 0; i < ports.Length(); i++) { |
461 ns ^= ports.At(i); | 469 ns ^= ports.At(i); |
462 if (!ns.IsNull()) { | 470 if (!ns.IsNull()) { |
463 dep = CreateLibraryDependencyMirror(lib_mirror, ns, prefix, true); | 471 dep = CreateLibraryDependencyMirror(lib_mirror, ns, prefix, true); |
464 deps.Add(dep); | 472 if (!dep.IsNull()) { |
| 473 deps.Add(dep); |
| 474 } |
465 } | 475 } |
466 } | 476 } |
467 | 477 |
468 // Exports. | 478 // Exports. |
469 ports = lib.exports(); | 479 ports = lib.exports(); |
470 for (intptr_t i = 0; i < ports.Length(); i++) { | 480 for (intptr_t i = 0; i < ports.Length(); i++) { |
471 ns ^= ports.At(i); | 481 ns ^= ports.At(i); |
472 dep = CreateLibraryDependencyMirror(lib_mirror, ns, prefix, false); | 482 dep = CreateLibraryDependencyMirror(lib_mirror, ns, prefix, false); |
473 deps.Add(dep); | 483 if (!dep.IsNull()) { |
| 484 deps.Add(dep); |
| 485 } |
474 } | 486 } |
475 | 487 |
476 // Prefixed imports. | 488 // Prefixed imports. |
477 DictionaryIterator entries(lib); | 489 DictionaryIterator entries(lib); |
478 Object& entry = Object::Handle(); | 490 Object& entry = Object::Handle(); |
479 while (entries.HasNext()) { | 491 while (entries.HasNext()) { |
480 entry = entries.GetNext(); | 492 entry = entries.GetNext(); |
481 if (entry.IsLibraryPrefix()) { | 493 if (entry.IsLibraryPrefix()) { |
482 const LibraryPrefix& lib_prefix = LibraryPrefix::Cast(entry); | 494 const LibraryPrefix& lib_prefix = LibraryPrefix::Cast(entry); |
483 prefix = lib_prefix.name(); | 495 prefix = lib_prefix.name(); |
484 ports = lib_prefix.imports(); | 496 ports = lib_prefix.imports(); |
485 for (intptr_t i = 0; i < ports.Length(); i++) { | 497 for (intptr_t i = 0; i < ports.Length(); i++) { |
486 ns ^= ports.At(i); | 498 ns ^= ports.At(i); |
487 if (!ns.IsNull()) { | 499 if (!ns.IsNull()) { |
488 dep = CreateLibraryDependencyMirror(lib_mirror, ns, prefix, true); | 500 dep = CreateLibraryDependencyMirror(lib_mirror, ns, prefix, true); |
489 deps.Add(dep); | 501 if (!dep.IsNull()) { |
| 502 deps.Add(dep); |
| 503 } |
490 } | 504 } |
491 } | 505 } |
492 } | 506 } |
493 } | 507 } |
494 | 508 |
495 return deps.raw(); | 509 return deps.raw(); |
496 } | 510 } |
497 | 511 |
498 static RawInstance* CreateTypeMirror(const AbstractType& type) { | 512 static RawInstance* CreateTypeMirror(const AbstractType& type) { |
499 if (type.IsTypeRef()) { | 513 if (type.IsTypeRef()) { |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
542 | 556 |
543 const Array& args = Array::Handle(Array::New(2)); | 557 const Array& args = Array::Handle(Array::New(2)); |
544 args.SetAt(0, debug_name); | 558 args.SetAt(0, debug_name); |
545 args.SetAt(1, root_library_mirror); | 559 args.SetAt(1, root_library_mirror); |
546 return CreateMirror(Symbols::_LocalIsolateMirror(), args); | 560 return CreateMirror(Symbols::_LocalIsolateMirror(), args); |
547 } | 561 } |
548 | 562 |
549 | 563 |
550 static RawInstance* CreateMirrorSystem() { | 564 static RawInstance* CreateMirrorSystem() { |
551 Isolate* isolate = Isolate::Current(); | 565 Isolate* isolate = Isolate::Current(); |
552 const GrowableObjectArray& libraries = | 566 const GrowableObjectArray& libraries = GrowableObjectArray::Handle( |
553 GrowableObjectArray::Handle(isolate->object_store()->libraries()); | 567 isolate, isolate->object_store()->libraries()); |
554 | 568 |
555 const intptr_t num_libraries = libraries.Length(); | 569 const intptr_t num_libraries = libraries.Length(); |
556 const Array& library_mirrors = Array::Handle(Array::New(num_libraries)); | 570 const GrowableObjectArray& library_mirrors = GrowableObjectArray::Handle( |
557 Library& library = Library::Handle(); | 571 isolate, GrowableObjectArray::New(num_libraries)); |
558 Instance& library_mirror = Instance::Handle(); | 572 Library& library = Library::Handle(isolate); |
| 573 Instance& library_mirror = Instance::Handle(isolate); |
559 | 574 |
560 for (int i = 0; i < num_libraries; i++) { | 575 for (int i = 0; i < num_libraries; i++) { |
561 library ^= libraries.At(i); | 576 library ^= libraries.At(i); |
562 library_mirror = CreateLibraryMirror(library); | 577 library_mirror = CreateLibraryMirror(library); |
563 library_mirrors.SetAt(i, library_mirror); | 578 if (!library_mirror.IsNull()) { |
| 579 library_mirrors.Add(library_mirror); |
| 580 } |
564 } | 581 } |
565 | 582 |
566 const Instance& isolate_mirror = Instance::Handle(CreateIsolateMirror()); | 583 const Instance& isolate_mirror = Instance::Handle(CreateIsolateMirror()); |
567 | 584 |
568 const Array& args = Array::Handle(Array::New(2)); | 585 const Array& args = Array::Handle(Array::New(2)); |
569 args.SetAt(0, library_mirrors); | 586 args.SetAt(0, library_mirrors); |
570 args.SetAt(1, isolate_mirror); | 587 args.SetAt(1, isolate_mirror); |
571 return CreateMirror(Symbols::_LocalMirrorSystem(), args); | 588 return CreateMirror(Symbols::_LocalMirrorSystem(), args); |
572 } | 589 } |
573 | 590 |
(...skipping 1375 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1949 } | 1966 } |
1950 | 1967 |
1951 DEFINE_NATIVE_ENTRY(TypeMirror_moreSpecificTest, 2) { | 1968 DEFINE_NATIVE_ENTRY(TypeMirror_moreSpecificTest, 2) { |
1952 GET_NON_NULL_NATIVE_ARGUMENT(AbstractType, a, arguments->NativeArgAt(0)); | 1969 GET_NON_NULL_NATIVE_ARGUMENT(AbstractType, a, arguments->NativeArgAt(0)); |
1953 GET_NON_NULL_NATIVE_ARGUMENT(AbstractType, b, arguments->NativeArgAt(1)); | 1970 GET_NON_NULL_NATIVE_ARGUMENT(AbstractType, b, arguments->NativeArgAt(1)); |
1954 return Bool::Get(a.IsMoreSpecificThan(b, NULL)).raw(); | 1971 return Bool::Get(a.IsMoreSpecificThan(b, NULL)).raw(); |
1955 } | 1972 } |
1956 | 1973 |
1957 | 1974 |
1958 } // namespace dart | 1975 } // namespace dart |
OLD | NEW |