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

Side by Side Diff: compiler/java/com/google/dart/compiler/backend/isolate/DartIsolateStubGenerator.java

Issue 8403040: Don't wait unnecessarily. (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: '' Created 9 years, 1 month 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) 2011, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2011, 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 package com.google.dart.compiler.backend.isolate; 5 package com.google.dart.compiler.backend.isolate;
6 6
7 import java.io.FileNotFoundException; 7 import java.io.FileNotFoundException;
8 import java.io.IOException; 8 import java.io.IOException;
9 import java.io.PrintStream; 9 import java.io.PrintStream;
10 import java.util.Collection; 10 import java.util.Collection;
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after
92 return true; 92 return true;
93 return false; 93 return false;
94 } 94 }
95 95
96 private static boolean isPromise(DartTypeNode x) { 96 private static boolean isPromise(DartTypeNode x) {
97 if (!(x.getIdentifier() instanceof DartIdentifier)) 97 if (!(x.getIdentifier() instanceof DartIdentifier))
98 return false; 98 return false;
99 String name = ((DartIdentifier)x.getIdentifier()).getTargetName(); 99 String name = ((DartIdentifier)x.getIdentifier()).getTargetName();
100 return name.equals("Promise"); 100 return name.equals("Promise");
101 } 101 }
102
103 private String getPromiseType(DartTypeNode x) {
104 assert isPromise(x);
105 List<DartTypeNode> types = x.getTypeArguments();
106 assert types.size() == 1;
107 return ((DartIdentifier)types.get(0).getIdentifier()).getTargetName();
108 }
109
110 private static boolean isPromiseForProxy(DartTypeNode x) {
111 if (!isPromise(x))
112 return false;
113 List<DartTypeNode> types = x.getTypeArguments();
114 if (types.size() != 1)
115 return false;
116 String name = ((DartIdentifier)types.get(0).getIdentifier()).getTargetName() ;
117 return name.endsWith("$Proxy");
118 }
102 119
103 private static boolean isVoid(DartTypeNode x) { 120 private static boolean isVoid(DartTypeNode x) {
104 if (!isSimpleType(x)) 121 if (!isSimpleType(x))
105 return false; 122 return false;
106 return ((DartIdentifier)x.getIdentifier()).getTargetName().equals("void"); 123 return ((DartIdentifier)x.getIdentifier()).getTargetName().equals("void");
107 } 124 }
108 125
109 private static boolean isProxyType(DartTypeNode x) { 126 private static boolean isProxyType(DartTypeNode x) {
110 if (!(x.getIdentifier() instanceof DartIdentifier)) 127 if (!(x.getIdentifier() instanceof DartIdentifier))
111 return false; 128 return false;
(...skipping 152 matching lines...) Expand 10 before | Expand all | Expand 10 after
264 * return new Purse$ProxyImpl(this.call(["sproutPurse"])); 281 * return new Purse$ProxyImpl(this.call(["sproutPurse"]));
265 * } 282 * }
266 * 283 *
267 * void deposit(int amount, Purse$Proxy source) { 284 * void deposit(int amount, Purse$Proxy source) {
268 * this.send(["deposit", amount, source]); 285 * this.send(["deposit", amount, source]);
269 * } 286 * }
270 * } 287 * }
271 */ 288 */
272 private void generateProxyClass(DartClass clazz) { 289 private void generateProxyClass(DartClass clazz) {
273 String name = clazz.getClassName(); 290 String name = clazz.getClassName();
274 p("interface " + name + "$Proxy {"); 291 p("interface " + name + "$Proxy extends Proxy {");
275 printProxyInterfaceFunctions(clazz); 292 printProxyInterfaceFunctions(clazz);
276 p("}"); 293 p("}");
277 nl(); 294 nl();
278 nl(); 295 nl();
279 296
280 p("class " + name + "$ProxyImpl extends ProxyImpl implements " + name + "$Pr oxy {"); 297 p("class " + name + "$ProxyImpl extends ProxyImpl implements " + name + "$Pr oxy {");
281 nl(); 298 nl();
282 p(" " + name + "$ProxyImpl(Promise<SendPort> port) : super.forReply(port) { }"); 299 p(" " + name + "$ProxyImpl(Promise<SendPort> port) : super.forReply(port) { }");
283 nl(); 300 nl();
284 p(" " + name 301 p(" " + name
(...skipping 26 matching lines...) Expand all
311 return false; 328 return false;
312 p(" {"); 329 p(" {");
313 nl(); 330 nl();
314 p(" "); 331 p(" ");
315 final DartFunction func = x.getFunction(); 332 final DartFunction func = x.getFunction();
316 final DartTypeNode returnTypeNode = func.getReturnTypeNode(); 333 final DartTypeNode returnTypeNode = func.getReturnTypeNode();
317 final boolean isVoid = isVoid(returnTypeNode); 334 final boolean isVoid = isVoid(returnTypeNode);
318 final boolean isSimple = isSimpleType(returnTypeNode); 335 final boolean isSimple = isSimpleType(returnTypeNode);
319 final boolean isProxy = isProxyType(returnTypeNode); 336 final boolean isProxy = isProxyType(returnTypeNode);
320 final boolean isPromise = isPromise(returnTypeNode); 337 final boolean isPromise = isPromise(returnTypeNode);
321 if (!isVoid) { 338 final boolean isPromiseForProxy = isPromiseForProxy(returnTypeNode);
322 p("return "); 339 if (isPromiseForProxy) {
323 if (!isSimple) { 340 String type = getPromiseType(returnTypeNode);
324 p("new "); 341 // This horrific unpacking is because a Proxy is, in effect, a Promise , but not quite, so
325 accept(returnTypeNode); 342 // a Promise<Proxy> ends up begin wrapped in two layers of SendPorts.
326 if (!isProxy) { 343 // FIXME(benl): unifying Promise and Proxy under Completable might wel l reduce the
327 p("$Proxy"); 344 // complexity here.
345 p("return new Promise<" + type + ">.fromValue(new " + type
346 + "Impl(new PromiseProxy<SendPort>(new PromiseProxy<SendPort>(");
347 } else {
348 if (!isVoid) {
349 p("return ");
350 if (!isSimple) {
351 p("new ");
352 accept(returnTypeNode);
353 if (!isProxy) {
354 p("$Proxy");
355 }
356 p("Impl(");
328 } 357 }
329 p("Impl(");
330 } 358 }
331 } 359 if (isProxy) {
332 if (isProxy) { 360 // Note that Promises are Proxies.
333 // Note that Promises are Proxies. 361 p("new PromiseProxy");
334 p("new PromiseProxy"); 362 if (isPromise) {
335 if (isPromise) { 363 printTypeArguments(returnTypeNode);
336 printTypeArguments(returnTypeNode); 364 } else {
337 } else { 365 p("<SendPort>");
338 p("<SendPort>"); 366 }
367 p("(");
339 } 368 }
340 p("(");
341 } 369 }
342 p("this."); 370 p("this.");
343 if (isVoid) { 371 if (isVoid) {
344 p("send"); 372 p("send");
345 } else { 373 } else {
346 p("call"); 374 p("call");
347 } 375 }
348 p("([\""); 376 p("([\"");
349 accept(x.getName()); 377 accept(x.getName());
350 p("\""); 378 p("\"");
351 DartVisitor params = new DartVisitor() { 379 DartVisitor params = new DartVisitor() {
352 @Override 380 @Override
353 public boolean visit(DartIdentifier x, DartContext ctx) { 381 public boolean visit(DartIdentifier x, DartContext ctx) {
354 p(", "); 382 p(", ");
355 p(x.getTargetName()); 383 p(x.getTargetName());
356 return false; 384 return false;
357 } 385 }
358 386
359 @Override 387 @Override
360 public boolean visit(DartParameter x, DartContext ctx) { 388 public boolean visit(DartParameter x, DartContext ctx) {
361 accept(x.getName()); 389 accept(x.getName());
362 return false; 390 return false;
363 } 391 }
364 }; 392 };
365 params.acceptList(func.getParams()); 393 params.acceptList(func.getParams());
366 p("])"); 394 p("])");
367 if (isProxy) { 395 if (isPromiseForProxy) {
368 p(")"); 396 p("))))");
369 } 397 } else {
370 if (!isSimple) { 398 if (isProxy) {
371 p(")"); 399 p(")");
400 }
401 if (!isSimple) {
402 p(")");
403 }
372 } 404 }
373 p(";"); 405 p(";");
374 nl(); 406 nl();
375 407
376 p(" }"); 408 p(" }");
377 nl(); 409 nl();
378 410
379 return false; 411 return false;
380 } 412 }
381 413
(...skipping 22 matching lines...) Expand all
404 if (first) { 436 if (first) {
405 p(" "); 437 p(" ");
406 } else { 438 } else {
407 p(" else "); 439 p(" else ");
408 } 440 }
409 p("if (command == \""); 441 p("if (command == \"");
410 printFunctionName(member); 442 printFunctionName(member);
411 p("\") {"); 443 p("\") {");
412 nl(); 444 nl();
413 int proxies = unpackParams(member); 445 int proxies = unpackParams(member);
414 String extra = "";
415 if (proxies != 0) { 446 if (proxies != 0) {
416 p(" Promise done = new Promise();"); 447 // FIXME(benl): we don't need to gather them anymore, could just pass th em directly. Too
417 nl(); 448 // lazy right now.
418 p(" done.waitFor(promises, " + proxies + ");");
419 nl();
420 p(" done.addCompleteHandler((_) {");
421 nl();
422 gatherProxies(member); 449 gatherProxies(member);
423 extra = " ";
424 } 450 }
425 callTarget((DartMethodDefinition)member, extra); 451 callTarget((DartMethodDefinition)member, "");
426 if (proxies != 0) {
427 p(" });");
428 nl();
429 }
430 p(" }"); 452 p(" }");
431 first = false; 453 first = false;
432 } 454 }
433 p(" else {"); 455 p(" else {");
434 nl(); 456 nl();
435 p(" // TODO(kasperl,benl): Somehow throw an exception instead."); 457 p(" // TODO(kasperl,benl): Somehow throw an exception instead.");
436 nl(); 458 nl();
437 p(" reply(\"Exception: command '\" + command + \"' not understood by " + dispatcherName + ".\");"); 459 p(" reply(\"Exception: command '\" + command + \"' not understood by " + dispatcherName + ".\");");
438 nl(); 460 nl();
439 p(" }"); 461 p(" }");
(...skipping 201 matching lines...) Expand 10 before | Expand all | Expand 10 after
641 accept(param); 663 accept(param);
642 } 664 }
643 return false; 665 return false;
644 } 666 }
645 667
646 @Override 668 @Override
647 public boolean visit(DartParameter x, DartContext ctx) { 669 public boolean visit(DartParameter x, DartContext ctx) {
648 boolean isSimpleType = isSimpleType(x.getTypeNode()); 670 boolean isSimpleType = isSimpleType(x.getTypeNode());
649 671
650 if (!isSimpleType) { 672 if (!isSimpleType) {
651 p(" "); 673 p(" ");
652 accept(x.getTypeNode()); 674 accept(x.getTypeNode());
653 p(" "); 675 p(" ");
654 accept(x.getName()); 676 accept(x.getName());
655 p(" = new "); 677 p(" = new ");
656 accept(x.getTypeNode()); 678 accept(x.getTypeNode());
657 p("Impl(promises[" + proxies + "]);"); 679 p("Impl(promises[" + proxies + "]);");
658 ++proxies; 680 ++proxies;
659 nl(); 681 nl();
660 } 682 }
661 return false; 683 return false;
(...skipping 185 matching lines...) Expand 10 before | Expand all | Expand 10 after
847 } 869 }
848 p(" "); 870 p(" ");
849 visitor.accept(x.getName()); 871 visitor.accept(x.getName());
850 p("("); 872 p("(");
851 printParams(func.getParams()); 873 printParams(func.getParams());
852 p(")"); 874 p(")");
853 875
854 return true; 876 return true;
855 } 877 }
856 } 878 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698