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

Side by Side Diff: sdk/lib/_internal/compiler/implementation/enqueue.dart

Issue 11308257: - Parse the return type of JS during resolution to know what can be instantiated there. (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 8 years 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 | Annotate | Revision Log
OLDNEW
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 part of dart2js; 5 part of dart2js;
6 6
7 class EnqueueTask extends CompilerTask { 7 class EnqueueTask extends CompilerTask {
8 final Enqueuer codegen; 8 final Enqueuer codegen;
9 final Enqueuer resolution; 9 final Enqueuer resolution;
10 10
(...skipping 370 matching lines...) Expand 10 before | Expand all | Expand 10 after
381 registerNewSelector(setterName, 381 registerNewSelector(setterName,
382 new TypedSelector(type, setter), 382 new TypedSelector(type, setter),
383 universe.fieldSetters); 383 universe.fieldSetters);
384 }); 384 });
385 } 385 }
386 386
387 void registerIsCheck(DartType type) { 387 void registerIsCheck(DartType type) {
388 universe.isChecks.add(type); 388 universe.isChecks.add(type);
389 } 389 }
390 390
391 void registerJsCall(Send node, ResolverVisitor resolver) {
392 var argNodes = node.arguments;
sra1 2012/11/29 00:12:51 We should avoid parsing this string in two places.
ngeoffray 2012/11/29 11:10:44 Done.
393 if (argNodes.isEmpty) {
394 compiler.cancel("JS expression has no type", node: node);
395 }
396
397 LiteralString specLiteral = argNodes.head.asLiteralString();
398 if (specLiteral != null) {
399 // Register primitive types we know a JS can return.
400 String specString = specLiteral.dartString.slowToString();
401 for (String typeString in specString.split('|')) {
402 if (specString == 'int') {
403 registerInstantiatedClass(compiler.intClass);
404 } else if (specString == 'double') {
405 registerInstantiatedClass(compiler.doubleClass);
406 } else if (specString == 'num') {
407 registerInstantiatedClass(compiler.numClass);
408 } else if (specString == 'String') {
409 registerInstantiatedClass(compiler.stringClass);
410 } else if (specString == '=List') {
411 registerInstantiatedClass(compiler.listClass);
412 } else if (specString == 'bool') {
413 registerInstantiatedClass(compiler.boolClass);
414 } else if (specString == 'Null') {
415 registerInstantiatedClass(compiler.nullClass);
416 }
417 }
418 }
419
420 nativeEnqueuer.registerJsCall(node, resolver);
421 }
422
423
391 void forEach(f(WorkItem work)) { 424 void forEach(f(WorkItem work)) {
392 while (!queue.isEmpty) { 425 while (!queue.isEmpty) {
393 f(queue.removeLast()); // TODO(kasperl): Why isn't this removeFirst? 426 f(queue.removeLast()); // TODO(kasperl): Why isn't this removeFirst?
394 } 427 }
395 } 428 }
396 429
397 String toString() => 'Enqueuer($name)'; 430 String toString() => 'Enqueuer($name)';
398 431
399 void logSummary(log(message)) { 432 void logSummary(log(message)) {
400 log(isResolutionQueue 433 log(isResolutionQueue
401 ? 'Resolved ${resolvedElements.length} elements.' 434 ? 'Resolved ${resolvedElements.length} elements.'
402 : 'Compiled ${universe.generatedCode.length} methods.'); 435 : 'Compiled ${universe.generatedCode.length} methods.');
403 nativeEnqueuer.logSummary(log); 436 nativeEnqueuer.logSummary(log);
404 } 437 }
405 } 438 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698