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

Side by Side Diff: lib/runtime/dart_runtime.js

Issue 1149243002: Allow null args to dynamic invocations (Closed) Base URL: git@github.com:dart-lang/dart-dev-compiler.git@master
Patch Set: Created 5 years, 7 months 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
« no previous file with comments | « no previous file | lib/src/codegen/js_codegen.dart » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2015, 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 var dart, _js_helper, _js_primitives; 5 var dart, _js_helper, _js_primitives;
6 (function (dart) { 6 (function (dart) {
7 'use strict'; 7 'use strict';
8 8
9 // TODO(vsm): This is referenced (as init.globalState) from 9 // TODO(vsm): This is referenced (as init.globalState) from
10 // isolate_helper.dart. Where should it go? 10 // isolate_helper.dart. Where should it go?
(...skipping 222 matching lines...) Expand 10 before | Expand all | Expand 10 after
233 } 233 }
234 return result; 234 return result;
235 } 235 }
236 dart.realRuntimeType = realRuntimeType; 236 dart.realRuntimeType = realRuntimeType;
237 237
238 function instanceOf(obj, type) { 238 function instanceOf(obj, type) {
239 return isSubtype(realRuntimeType(obj), type); 239 return isSubtype(realRuntimeType(obj), type);
240 } 240 }
241 dart.is = instanceOf; 241 dart.is = instanceOf;
242 242
243 function instanceOfOrNull(obj, type) {
244 return (obj == null) || instanceOf(obj, type);
245 }
246
243 /** 247 /**
244 * Computes the canonical type. 248 * Computes the canonical type.
245 * This maps JS types onto their corresponding Dart Type. 249 * This maps JS types onto their corresponding Dart Type.
246 */ 250 */
247 // TODO(jmesserly): lots more needs to be done here. 251 // TODO(jmesserly): lots more needs to be done here.
248 function canonicalType(t) { 252 function canonicalType(t) {
249 if (t === Object) return core.Object; 253 if (t === Object) return core.Object;
250 if (t === Function) return core.Function; 254 if (t === Function) return core.Function;
251 if (t === Array) return core.List; 255 if (t === Array) return core.List;
252 256
(...skipping 205 matching lines...) Expand 10 before | Expand all | Expand 10 after
458 constructor() { 462 constructor() {
459 this._stringValue = null; 463 this._stringValue = null;
460 } 464 }
461 465
462 /// Check that a function of this type can be applied to 466 /// Check that a function of this type can be applied to
463 /// actuals. 467 /// actuals.
464 checkApply(actuals) { 468 checkApply(actuals) {
465 if (actuals.length < this.args.length) return false; 469 if (actuals.length < this.args.length) return false;
466 var index = 0; 470 var index = 0;
467 for(let i = 0; i < this.args.length; ++i) { 471 for(let i = 0; i < this.args.length; ++i) {
468 let t = realRuntimeType(actuals[i]); 472 if (!instanceOfOrNull(actuals[i], this.args[i])) return false;
469 if (!isSubtype(t, this.args[i])) return false;
470 ++index; 473 ++index;
471 } 474 }
472 if (actuals.length == this.args.length) return true; 475 if (actuals.length == this.args.length) return true;
473 let extras = actuals.length - this.args.length; 476 let extras = actuals.length - this.args.length;
474 if (this.optionals.length > 0) { 477 if (this.optionals.length > 0) {
475 if (extras > this.optionals.length) return false; 478 if (extras > this.optionals.length) return false;
476 for(let i = 0; i < extras; ++i) { 479 for(let i = 0, j=index; i < extras; ++i, ++j) {
477 let t = realRuntimeType(actuals[index + i]); 480 if (!instanceOfOrNull(actuals[j], this.optionals[i])) return false;
478 if (!isSubtype(t, this.optionals[i])) return false;
479 } 481 }
480 return true; 482 return true;
481 } 483 }
482 // TODO(leafp): We can't tell when someone might be calling 484 // TODO(leafp): We can't tell when someone might be calling
483 // something expecting an optional argument with named arguments 485 // something expecting an optional argument with named arguments
484 486
485 if (extras != 1) return false; 487 if (extras != 1) return false;
486 // An empty named list means no named arguments 488 // An empty named list means no named arguments
487 if (getOwnPropertyNames(this.named).length == 0) return false; 489 if (getOwnPropertyNames(this.named).length == 0) return false;
488 let opts = actuals[index]; 490 let opts = actuals[index];
489 let names = getOwnPropertyNames(opts); 491 let names = getOwnPropertyNames(opts);
490 // This is something other than a map 492 // This is something other than a map
491 if (names.length == 0) return false; 493 if (names.length == 0) return false;
492 for (name of names) { 494 for (name of names) {
493 if (!(Object.prototype.hasOwnProperty.call(this.named, name))) { 495 if (!(Object.prototype.hasOwnProperty.call(this.named, name))) {
494 return false; 496 return false;
495 } 497 }
496 let t = realRuntimeType(opts[name]); 498 if (!instanceOfOrNull(opts[name], this.named[name])) return false;
497 if (!isSubtype(t, this.named[name])) return false;
498 } 499 }
499 return true; 500 return true;
500 } 501 }
501 502
502 get name() { 503 get name() {
503 if (this._stringValue) return this._stringValue; 504 if (this._stringValue) return this._stringValue;
504 505
505 var buffer = '('; 506 var buffer = '(';
506 for (let i = 0; i < this.args.length; ++i) { 507 for (let i = 0; i < this.args.length; ++i) {
507 if (i > 0) { 508 if (i > 0) {
(...skipping 776 matching lines...) Expand 10 before | Expand all | Expand 10 after
1284 Number.prototype['>'] = function(arg) { return this.valueOf() > arg; }; 1285 Number.prototype['>'] = function(arg) { return this.valueOf() > arg; };
1285 Number.prototype['+'] = function(arg) { return this.valueOf() + arg; }; 1286 Number.prototype['+'] = function(arg) { return this.valueOf() + arg; };
1286 1287
1287 // TODO(vsm): DOM facades? 1288 // TODO(vsm): DOM facades?
1288 // See: https://github.com/dart-lang/dev_compiler/issues/173 1289 // See: https://github.com/dart-lang/dev_compiler/issues/173
1289 NodeList.prototype.get = function(i) { return this[i]; }; 1290 NodeList.prototype.get = function(i) { return this[i]; };
1290 NamedNodeMap.prototype.get = function(i) { return this[i]; }; 1291 NamedNodeMap.prototype.get = function(i) { return this[i]; };
1291 DOMTokenList.prototype.get = function(i) { return this[i]; }; 1292 DOMTokenList.prototype.get = function(i) { return this[i]; };
1292 1293
1293 })(dart || (dart = {})); 1294 })(dart || (dart = {}));
OLDNEW
« no previous file with comments | « no previous file | lib/src/codegen/js_codegen.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698