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 library native; | 5 library native; |
6 | 6 |
7 import 'dart:collection' show Queue; | 7 import 'dart:collection' show Queue; |
8 import 'dart:uri'; | 8 import 'dart:uri'; |
9 import 'dart2jslib.dart' hide SourceString; | 9 import 'dart2jslib.dart' hide SourceString; |
10 import 'elements/elements.dart'; | 10 import 'elements/elements.dart'; |
(...skipping 206 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
217 // Also parse the node to know all its methods because otherwise it will | 217 // Also parse the node to know all its methods because otherwise it will |
218 // only be parsed if there is a call to one of its constructors. | 218 // only be parsed if there is a call to one of its constructors. |
219 classElement.parseNode(compiler); | 219 classElement.parseNode(compiler); |
220 | 220 |
221 if (firstTime) { | 221 if (firstTime) { |
222 queue.add(onFirstNativeClass); | 222 queue.add(onFirstNativeClass); |
223 } | 223 } |
224 } | 224 } |
225 | 225 |
226 registerElement(Element element) { | 226 registerElement(Element element) { |
227 if (element.isFunction() || element.isGetter() || element.isSetter()) { | 227 compiler.withCurrentElement(element, () { |
228 handleMethodAnnotations(element); | 228 if (element.isFunction() || element.isGetter() || element.isSetter()) { |
229 if (element.isNative()) { | 229 handleMethodAnnotations(element); |
230 registerMethodUsed(element); | 230 if (element.isNative()) { |
| 231 registerMethodUsed(element); |
| 232 } |
| 233 } else if (element.isField()) { |
| 234 handleFieldAnnotations(element); |
| 235 if (element.isNative()) { |
| 236 registerFieldLoad(element); |
| 237 registerFieldStore(element); |
| 238 } |
231 } | 239 } |
232 } else if (element.isField()) { | 240 }); |
233 handleFieldAnnotations(element); | |
234 if (element.isNative()) { | |
235 registerFieldLoad(element); | |
236 registerFieldStore(element); | |
237 } | |
238 } | |
239 } | 241 } |
240 | 242 |
241 handleFieldAnnotations(Element element) { | 243 handleFieldAnnotations(Element element) { |
242 if (element.enclosingElement.isNative()) { | 244 if (element.enclosingElement.isNative()) { |
243 // Exclude non-instance (static) fields - they not really native and are | 245 // Exclude non-instance (static) fields - they not really native and are |
244 // compiled as isolate globals. Access of a property of a constructor | 246 // compiled as isolate globals. Access of a property of a constructor |
245 // function or a non-method property in the prototype chain, must be coded | 247 // function or a non-method property in the prototype chain, must be coded |
246 // using a JS-call. | 248 // using a JS-call. |
247 if (element.isInstanceMember()) { | 249 if (element.isInstanceMember()) { |
248 setNativeName(element); | 250 setNativeName(element); |
(...skipping 194 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
443 directSubtypes.add(cls); | 445 directSubtypes.add(cls); |
444 } | 446 } |
445 | 447 |
446 void logSummary(log(message)) { | 448 void logSummary(log(message)) { |
447 log('Compiled ${registeredClasses.length} native classes, ' | 449 log('Compiled ${registeredClasses.length} native classes, ' |
448 '${unusedClasses.length} native classes omitted.'); | 450 '${unusedClasses.length} native classes omitted.'); |
449 } | 451 } |
450 } | 452 } |
451 | 453 |
452 void maybeEnableNative(Compiler compiler, | 454 void maybeEnableNative(Compiler compiler, |
453 LibraryElement library, | 455 LibraryElement library) { |
454 Uri uri) { | 456 String libraryName = library.canonicalUri.toString(); |
455 String libraryName = uri.toString(); | |
456 if (library.entryCompilationUnit.script.name.contains( | 457 if (library.entryCompilationUnit.script.name.contains( |
457 'dart/tests/compiler/dart2js_native') | 458 'dart/tests/compiler/dart2js_native') |
458 || libraryName == 'dart:async' | 459 || libraryName == 'dart:async' |
459 || libraryName == 'dart:html' | 460 || libraryName == 'dart:html' |
460 || libraryName == 'dart:html_common' | 461 || libraryName == 'dart:html_common' |
461 || libraryName == 'dart:indexed_db' | 462 || libraryName == 'dart:indexed_db' |
462 || libraryName == 'dart:svg' | 463 || libraryName == 'dart:svg' |
463 || libraryName == 'dart:web_audio') { | 464 || libraryName == 'dart:web_audio') { |
464 library.canUseNative = true; | 465 library.canUseNative = true; |
465 } | 466 } |
(...skipping 410 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
876 } else { | 877 } else { |
877 if (parameters.parameterCount != 0) { | 878 if (parameters.parameterCount != 0) { |
878 compiler.cancel( | 879 compiler.cancel( |
879 'native "..." syntax is restricted to functions with zero parameters', | 880 'native "..." syntax is restricted to functions with zero parameters', |
880 node: nativeBody); | 881 node: nativeBody); |
881 } | 882 } |
882 LiteralString jsCode = nativeBody.asLiteralString(); | 883 LiteralString jsCode = nativeBody.asLiteralString(); |
883 builder.push(new HForeign.statement(jsCode.dartString, <HInstruction>[])); | 884 builder.push(new HForeign.statement(jsCode.dartString, <HInstruction>[])); |
884 } | 885 } |
885 } | 886 } |
OLD | NEW |