| OLD | NEW |
| 1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2014, 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 import 'dart:collection' show Queue; | 5 import 'dart:collection' show Queue; |
| 6 | 6 |
| 7 import '../common.dart'; | 7 import '../common.dart'; |
| 8 import '../common/backend_api.dart' show ForeignResolver; | 8 import '../common/backend_api.dart' show ForeignResolver; |
| 9 import '../common/registry.dart' show Registry; | 9 import '../common/registry.dart' show Registry; |
| 10 import '../common/resolution.dart' show Resolution; | 10 import '../common/resolution.dart' show Resolution; |
| (...skipping 16 matching lines...) Expand all Loading... |
| 27 * This could be an abstract class but we use it as a stub for the dart_backend. | 27 * This could be an abstract class but we use it as a stub for the dart_backend. |
| 28 */ | 28 */ |
| 29 class NativeEnqueuer { | 29 class NativeEnqueuer { |
| 30 /// Initial entry point to native enqueuer. | 30 /// Initial entry point to native enqueuer. |
| 31 void processNativeClasses(Iterable<LibraryElement> libraries) {} | 31 void processNativeClasses(Iterable<LibraryElement> libraries) {} |
| 32 | 32 |
| 33 /// Registers the [nativeBehavior]. Adds the liveness of its instantiated | 33 /// Registers the [nativeBehavior]. Adds the liveness of its instantiated |
| 34 /// types to the world. | 34 /// types to the world. |
| 35 void registerNativeBehavior(NativeBehavior nativeBehavior, cause) {} | 35 void registerNativeBehavior(NativeBehavior nativeBehavior, cause) {} |
| 36 | 36 |
| 37 /// Notification of a main Enqueuer worklist element. For methods, adds | 37 // TODO(johnniwinther): Move [handleFieldAnnotations] and |
| 38 /// information from metadata attributes, and computes types instantiated due | 38 // [handleMethodAnnotations] to [JavaScriptBackend] or [NativeData]. |
| 39 /// to calling the method. | 39 // TODO(johnniwinther): Change the return type to 'bool' and rename them to |
| 40 void registerElement(Element element) {} | 40 // something like `computeNativeField`. |
| 41 | 41 /// Process the potentially native [field]. Adds information from metadata |
| 42 /// Notification of native field. Adds information from metadata attributes. | 42 /// attributes. |
| 43 void handleFieldAnnotations(Element field) {} | 43 void handleFieldAnnotations(Element field) {} |
| 44 | 44 |
| 45 /// Computes types instantiated due to getting a native field. | 45 /// Process the potentially native [method]. Adds information from metadata |
| 46 void registerFieldLoad(Element field) {} | 46 /// attributes. |
| 47 | 47 void handleMethodAnnotations(Element method) {} |
| 48 /// Computes types instantiated due to setting a native field. | |
| 49 void registerFieldStore(Element field) {} | |
| 50 | 48 |
| 51 /// Returns whether native classes are being used. | 49 /// Returns whether native classes are being used. |
| 52 bool hasInstantiatedNativeClasses() => false; | 50 bool hasInstantiatedNativeClasses() => false; |
| 53 | 51 |
| 54 /// Emits a summary information using the [log] function. | 52 /// Emits a summary information using the [log] function. |
| 55 void logSummary(log(message)) {} | 53 void logSummary(log(message)) {} |
| 56 | 54 |
| 57 // Do not use annotations in dart2dart. | 55 // Do not use annotations in dart2dart. |
| 58 ClassElement get annotationCreatesClass => null; | 56 ClassElement get annotationCreatesClass => null; |
| 59 ClassElement get annotationReturnsClass => null; | 57 ClassElement get annotationReturnsClass => null; |
| (...skipping 304 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 364 // TODO(ahe): Is this really a global dependency? | 362 // TODO(ahe): Is this really a global dependency? |
| 365 classElement.ensureResolved(resolution); | 363 classElement.ensureResolved(resolution); |
| 366 compiler.backend.registerInstantiatedType( | 364 compiler.backend.registerInstantiatedType( |
| 367 classElement.rawType, world, compiler.globalDependencies); | 365 classElement.rawType, world, compiler.globalDependencies); |
| 368 | 366 |
| 369 if (firstTime) { | 367 if (firstTime) { |
| 370 queue.add(onFirstNativeClass); | 368 queue.add(onFirstNativeClass); |
| 371 } | 369 } |
| 372 } | 370 } |
| 373 | 371 |
| 374 registerElement(Element element) { | |
| 375 reporter.withCurrentElement(element, () { | |
| 376 if (element.isFunction || | |
| 377 element.isFactoryConstructor || | |
| 378 element.isGetter || | |
| 379 element.isSetter) { | |
| 380 handleMethodAnnotations(element); | |
| 381 if (backend.isNative(element)) { | |
| 382 registerMethodUsed(element); | |
| 383 } | |
| 384 } else if (element.isField) { | |
| 385 handleFieldAnnotations(element); | |
| 386 if (backend.isNative(element)) { | |
| 387 registerFieldLoad(element); | |
| 388 registerFieldStore(element); | |
| 389 } | |
| 390 } | |
| 391 }); | |
| 392 } | |
| 393 | |
| 394 void handleFieldAnnotations(Element element) { | 372 void handleFieldAnnotations(Element element) { |
| 395 if (compiler.serialization.isDeserialized(element)) { | 373 if (compiler.serialization.isDeserialized(element)) { |
| 396 return; | 374 return; |
| 397 } | 375 } |
| 398 if (backend.isNative(element.enclosingElement)) { | 376 if (backend.isNative(element.enclosingElement)) { |
| 399 // Exclude non-instance (static) fields - they not really native and are | 377 // Exclude non-instance (static) fields - they not really native and are |
| 400 // compiled as isolate globals. Access of a property of a constructor | 378 // compiled as isolate globals. Access of a property of a constructor |
| 401 // function or a non-method property in the prototype chain, must be coded | 379 // function or a non-method property in the prototype chain, must be coded |
| 402 // using a JS-call. | 380 // using a JS-call. |
| 403 if (element.isInstanceMember) { | 381 if (element.isInstanceMember) { |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 468 if (identical(token.stringValue, 'native')) return true; | 446 if (identical(token.stringValue, 'native')) return true; |
| 469 return false; | 447 return false; |
| 470 }); | 448 }); |
| 471 } | 449 } |
| 472 | 450 |
| 473 void registerNativeBehavior(NativeBehavior nativeBehavior, cause) { | 451 void registerNativeBehavior(NativeBehavior nativeBehavior, cause) { |
| 474 processNativeBehavior(nativeBehavior, cause); | 452 processNativeBehavior(nativeBehavior, cause); |
| 475 flushQueue(); | 453 flushQueue(); |
| 476 } | 454 } |
| 477 | 455 |
| 478 void registerMethodUsed(Element method) { | |
| 479 registerNativeBehavior(NativeBehavior.ofMethod(method, compiler), method); | |
| 480 } | |
| 481 | |
| 482 void registerFieldLoad(Element field) { | |
| 483 registerNativeBehavior(NativeBehavior.ofFieldLoad(field, compiler), field); | |
| 484 } | |
| 485 | |
| 486 void registerFieldStore(Element field) { | |
| 487 registerNativeBehavior(NativeBehavior.ofFieldStore(field, compiler), field); | |
| 488 } | |
| 489 | |
| 490 processNativeBehavior(NativeBehavior behavior, cause) { | 456 processNativeBehavior(NativeBehavior behavior, cause) { |
| 491 // TODO(ahe): Is this really a global dependency? | 457 // TODO(ahe): Is this really a global dependency? |
| 492 Registry registry = compiler.globalDependencies; | 458 Registry registry = compiler.globalDependencies; |
| 493 bool allUsedBefore = unusedClasses.isEmpty; | 459 bool allUsedBefore = unusedClasses.isEmpty; |
| 494 for (var type in behavior.typesInstantiated) { | 460 for (var type in behavior.typesInstantiated) { |
| 495 if (matchedTypeConstraints.contains(type)) continue; | 461 if (matchedTypeConstraints.contains(type)) continue; |
| 496 matchedTypeConstraints.add(type); | 462 matchedTypeConstraints.add(type); |
| 497 if (type is SpecialType) { | 463 if (type is SpecialType) { |
| 498 if (type == SpecialType.JsObject) { | 464 if (type == SpecialType.JsObject) { |
| 499 backend.registerInstantiatedType( | 465 backend.registerInstantiatedType( |
| (...skipping 206 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 706 List<Element> directSubtypes = | 672 List<Element> directSubtypes = |
| 707 emitter.directSubtypes.putIfAbsent(superclass, () => <ClassElement>[]); | 673 emitter.directSubtypes.putIfAbsent(superclass, () => <ClassElement>[]); |
| 708 directSubtypes.add(cls); | 674 directSubtypes.add(cls); |
| 709 } | 675 } |
| 710 | 676 |
| 711 void logSummary(log(message)) { | 677 void logSummary(log(message)) { |
| 712 log('Compiled ${registeredClasses.length} native classes, ' | 678 log('Compiled ${registeredClasses.length} native classes, ' |
| 713 '${unusedClasses.length} native classes omitted.'); | 679 '${unusedClasses.length} native classes omitted.'); |
| 714 } | 680 } |
| 715 } | 681 } |
| OLD | NEW |