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

Side by Side Diff: lib/runtime/dart/core.js

Issue 1117793002: add checks needed for covariant generics, and List<E> (Closed) Base URL: git@github.com:dart-lang/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
OLDNEW
1 var core; 1 var core;
2 (function(exports) { 2 (function(exports) {
3 'use strict'; 3 'use strict';
4 class Object { 4 class Object {
5 constructor() { 5 constructor() {
6 let name = this.constructor.name; 6 let name = this.constructor.name;
7 let init = this[name]; 7 let init = this[name];
8 let result = void 0; 8 let result = void 0;
9 if (init) 9 if (init)
10 result = init.apply(this, arguments); 10 result = init.apply(this, arguments);
(...skipping 1005 matching lines...) Expand 10 before | Expand all | Expand 10 after
1016 this.name = name; 1016 this.name = name;
1017 } 1017 }
1018 toString() { 1018 toString() {
1019 return `Expando:${this.name}`; 1019 return `Expando:${this.name}`;
1020 } 1020 }
1021 get(object) { 1021 get(object) {
1022 let values = _js_helper.Primitives.getProperty(object, Expando._EXPANDO_ PROPERTY_NAME); 1022 let values = _js_helper.Primitives.getProperty(object, Expando._EXPANDO_ PROPERTY_NAME);
1023 return dart.as(values == null ? null : _js_helper.Primitives.getProperty (values, this[_getKey]()), T); 1023 return dart.as(values == null ? null : _js_helper.Primitives.getProperty (values, this[_getKey]()), T);
1024 } 1024 }
1025 set(object, value) { 1025 set(object, value) {
1026 dart.as(value, T);
1026 let values = _js_helper.Primitives.getProperty(object, Expando._EXPANDO_ PROPERTY_NAME); 1027 let values = _js_helper.Primitives.getProperty(object, Expando._EXPANDO_ PROPERTY_NAME);
1027 if (values == null) { 1028 if (values == null) {
1028 values = new Object(); 1029 values = new Object();
1029 _js_helper.Primitives.setProperty(object, Expando._EXPANDO_PROPERTY_NA ME, values); 1030 _js_helper.Primitives.setProperty(object, Expando._EXPANDO_PROPERTY_NA ME, values);
1030 } 1031 }
1031 _js_helper.Primitives.setProperty(values, this[_getKey](), value); 1032 _js_helper.Primitives.setProperty(values, this[_getKey](), value);
1032 } 1033 }
1033 [_getKey]() { 1034 [_getKey]() {
1034 let key = dart.as(_js_helper.Primitives.getProperty(this, Expando._KEY_P ROPERTY_NAME), String); 1035 let key = dart.as(_js_helper.Primitives.getProperty(this, Expando._KEY_P ROPERTY_NAME), String);
1035 if (key == null) { 1036 if (key == null) {
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
1075 } 1076 }
1076 } 1077 }
1077 let $join = dart.JsSymbol('$join'); 1078 let $join = dart.JsSymbol('$join');
1078 let Iterable$ = dart.generic(function(E) { 1079 let Iterable$ = dart.generic(function(E) {
1079 class Iterable extends Object { 1080 class Iterable extends Object {
1080 Iterable() { 1081 Iterable() {
1081 } 1082 }
1082 generate(count, generator) { 1083 generate(count, generator) {
1083 if (generator === void 0) 1084 if (generator === void 0)
1084 generator = null; 1085 generator = null;
1086 dart.as(generator, dart.functionType(E, [int]));
1085 if (dart.notNull(count) <= 0) 1087 if (dart.notNull(count) <= 0)
1086 return new (_internal.EmptyIterable$(E))(); 1088 return new (_internal.EmptyIterable$(E))();
1087 return new (exports._GeneratorIterable$(E))(count, generator); 1089 return new (exports._GeneratorIterable$(E))(count, generator);
1088 } 1090 }
1089 [$join](separator) { 1091 [$join](separator) {
1090 if (separator === void 0) 1092 if (separator === void 0)
1091 separator = ""; 1093 separator = "";
1092 let buffer = new StringBuffer(); 1094 let buffer = new StringBuffer();
1093 buffer.writeAll(this, separator); 1095 buffer.writeAll(this, separator);
1094 return dart.toString(buffer); 1096 return dart.toString(buffer);
(...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after
1252 let $setRange = dart.JsSymbol('$setRange'); 1254 let $setRange = dart.JsSymbol('$setRange');
1253 let $removeRange = dart.JsSymbol('$removeRange'); 1255 let $removeRange = dart.JsSymbol('$removeRange');
1254 let $fillRange = dart.JsSymbol('$fillRange'); 1256 let $fillRange = dart.JsSymbol('$fillRange');
1255 let $replaceRange = dart.JsSymbol('$replaceRange'); 1257 let $replaceRange = dart.JsSymbol('$replaceRange');
1256 let $asMap = dart.JsSymbol('$asMap'); 1258 let $asMap = dart.JsSymbol('$asMap');
1257 let List$ = dart.generic(function(E) { 1259 let List$ = dart.generic(function(E) {
1258 class List extends Object { 1260 class List extends Object {
1259 List(length) { 1261 List(length) {
1260 if (length === void 0) 1262 if (length === void 0)
1261 length = null; 1263 length = null;
1264 let list = null;
1262 if (length == null) { 1265 if (length == null) {
1263 return dart.as([], List$(E)); 1266 list = [];
1267 } else {
1268 if (!(typeof length == 'number') || dart.notNull(length) < 0) {
1269 throw new ArgumentError(`Length must be a non-negative integer: ${le ngth}`);
1270 }
1271 list = new Array(length);
1272 list.fixed$length = Array;
1264 } 1273 }
1265 if (!(typeof length == 'number') || dart.notNull(length) < 0) { 1274 dart.setType(list, List$(E));
1266 throw new ArgumentError(`Length must be a non-negative integer: ${leng th}`);
1267 }
1268 let list = new Array(length);
1269 list.fixed$length = Array;
1270 return dart.as(list, List$(E)); 1275 return dart.as(list, List$(E));
1271 } 1276 }
1272 filled(length, fill) { 1277 filled(length, fill) {
1273 let result = new _interceptors.JSArray$(E).fixed(length); 1278 dart.as(fill, E);
1279 let result = new (List$(E))(length);
1274 if (length != 0 && dart.notNull(fill != null)) { 1280 if (length != 0 && dart.notNull(fill != null)) {
1275 for (let i = 0; dart.notNull(i) < dart.notNull(result[$length]); i = d art.notNull(i) + 1) { 1281 for (let i = 0; dart.notNull(i) < dart.notNull(result[$length]); i = d art.notNull(i) + 1) {
1276 result[$set](i, fill); 1282 result[$set](i, fill);
1277 } 1283 }
1278 } 1284 }
1279 return dart.as(result, List$(E)); 1285 return dart.as(result, List$(E));
1280 } 1286 }
1281 from(elements, opts) { 1287 from(elements, opts) {
1282 let growable = opts && 'growable' in opts ? opts.growable : true; 1288 let growable = opts && 'growable' in opts ? opts.growable : true;
1283 let list = new (List$(E))(); 1289 let list = new (List$(E))();
1284 for (let e of dart.as(elements, Iterable$(E))) { 1290 for (let e of dart.as(elements, Iterable$(E))) {
1285 list[$add](e); 1291 list[$add](e);
1286 } 1292 }
1287 if (growable) 1293 if (growable)
1288 return list; 1294 return list;
1289 return dart.as(_internal.makeListFixedLength(list), List$(E)); 1295 return dart.as(_internal.makeListFixedLength(list), List$(E));
1290 } 1296 }
1291 generate(length, generator, opts) { 1297 generate(length, generator, opts) {
1298 dart.as(generator, dart.functionType(E, [int]));
1292 let growable = opts && 'growable' in opts ? opts.growable : true; 1299 let growable = opts && 'growable' in opts ? opts.growable : true;
1293 let result = null; 1300 let result = null;
1294 if (growable) { 1301 if (growable) {
1295 result = dart.setType([], List$(E)); 1302 result = dart.setType([], List$(E));
1296 result[$length] = length; 1303 result[$length] = length;
1297 } else { 1304 } else {
1298 result = new (List$(E))(length); 1305 result = new (List$(E))(length);
1299 } 1306 }
1300 for (let i = 0; dart.notNull(i) < dart.notNull(length); i = dart.notNull (i) + 1) { 1307 for (let i = 0; dart.notNull(i) < dart.notNull(length); i = dart.notNull (i) + 1) {
1301 result[$set](i, generator(i)); 1308 result[$set](i, generator(i));
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
1343 [$skipWhile](test) { 1350 [$skipWhile](test) {
1344 return new (_internal.IterableMixinWorkaround$(E))().skipWhile(this, tes t); 1351 return new (_internal.IterableMixinWorkaround$(E))().skipWhile(this, tes t);
1345 } 1352 }
1346 [$reduce](combine) { 1353 [$reduce](combine) {
1347 return dart.as(_internal.IterableMixinWorkaround.reduce(this, combine), E); 1354 return dart.as(_internal.IterableMixinWorkaround.reduce(this, combine), E);
1348 } 1355 }
1349 [$fold](initialValue, combine) { 1356 [$fold](initialValue, combine) {
1350 return _internal.IterableMixinWorkaround.fold(this, initialValue, combin e); 1357 return _internal.IterableMixinWorkaround.fold(this, initialValue, combin e);
1351 } 1358 }
1352 [$firstWhere](test, opts) { 1359 [$firstWhere](test, opts) {
1360 dart.as(test, dart.functionType(bool, [E]));
1353 let orElse = opts && 'orElse' in opts ? opts.orElse : null; 1361 let orElse = opts && 'orElse' in opts ? opts.orElse : null;
1362 dart.as(orElse, dart.functionType(E, []));
1354 return dart.as(_internal.IterableMixinWorkaround.firstWhere(this, test, orElse), E); 1363 return dart.as(_internal.IterableMixinWorkaround.firstWhere(this, test, orElse), E);
1355 } 1364 }
1356 [$lastWhere](test, opts) { 1365 [$lastWhere](test, opts) {
1366 dart.as(test, dart.functionType(bool, [E]));
1357 let orElse = opts && 'orElse' in opts ? opts.orElse : null; 1367 let orElse = opts && 'orElse' in opts ? opts.orElse : null;
1368 dart.as(orElse, dart.functionType(E, []));
1358 return dart.as(_internal.IterableMixinWorkaround.lastWhereList(this, tes t, orElse), E); 1369 return dart.as(_internal.IterableMixinWorkaround.lastWhereList(this, tes t, orElse), E);
1359 } 1370 }
1360 [$singleWhere](test) { 1371 [$singleWhere](test) {
1361 return dart.as(_internal.IterableMixinWorkaround.singleWhere(this, test) , E); 1372 return dart.as(_internal.IterableMixinWorkaround.singleWhere(this, test) , E);
1362 } 1373 }
1363 [$elementAt](index) { 1374 [$elementAt](index) {
1364 return this[$get](index); 1375 return this[$get](index);
1365 } 1376 }
1366 get [$first]() { 1377 get [$first]() {
1367 if (dart.notNull(this[$length]) > 0) 1378 if (dart.notNull(this[$length]) > 0)
(...skipping 14 matching lines...) Expand all
1382 } 1393 }
1383 [$any](f) { 1394 [$any](f) {
1384 return _internal.IterableMixinWorkaround.any(this, f); 1395 return _internal.IterableMixinWorkaround.any(this, f);
1385 } 1396 }
1386 [$every](f) { 1397 [$every](f) {
1387 return _internal.IterableMixinWorkaround.every(this, f); 1398 return _internal.IterableMixinWorkaround.every(this, f);
1388 } 1399 }
1389 [$sort](compare) { 1400 [$sort](compare) {
1390 if (compare === void 0) 1401 if (compare === void 0)
1391 compare = null; 1402 compare = null;
1403 dart.as(compare, dart.functionType(int, [E, E]));
1392 this[$checkMutable]('sort'); 1404 this[$checkMutable]('sort');
1393 _internal.IterableMixinWorkaround.sortList(this, compare); 1405 _internal.IterableMixinWorkaround.sortList(this, compare);
1394 } 1406 }
1395 [$contains](other) { 1407 [$contains](other) {
1396 for (let i = 0; dart.notNull(i) < dart.notNull(this[$length]); i = dart. notNull(i) + 1) { 1408 for (let i = 0; dart.notNull(i) < dart.notNull(this[$length]); i = dart. notNull(i) + 1) {
1397 if (dart.equals(this[$get](i), other)) 1409 if (dart.equals(this[$get](i), other))
1398 return true; 1410 return true;
1399 } 1411 }
1400 return false; 1412 return false;
1401 } 1413 }
(...skipping 24 matching lines...) Expand all
1426 return _js_helper.Primitives.objectHashCode(this); 1438 return _js_helper.Primitives.objectHashCode(this);
1427 } 1439 }
1428 [$get](index) { 1440 [$get](index) {
1429 if (!(typeof index == 'number')) 1441 if (!(typeof index == 'number'))
1430 throw new ArgumentError(index); 1442 throw new ArgumentError(index);
1431 if (dart.notNull(index) >= dart.notNull(this[$length]) || dart.notNull(i ndex) < 0) 1443 if (dart.notNull(index) >= dart.notNull(this[$length]) || dart.notNull(i ndex) < 0)
1432 throw new RangeError.value(index); 1444 throw new RangeError.value(index);
1433 return dart.as(this[index], E); 1445 return dart.as(this[index], E);
1434 } 1446 }
1435 [$set](index, value) { 1447 [$set](index, value) {
1448 dart.as(value, E);
1436 this[$checkMutable]('indexed set'); 1449 this[$checkMutable]('indexed set');
1437 if (!(typeof index == 'number')) 1450 if (!(typeof index == 'number'))
1438 throw new ArgumentError(index); 1451 throw new ArgumentError(index);
1439 if (dart.notNull(index) >= dart.notNull(this[$length]) || dart.notNull(i ndex) < 0) 1452 if (dart.notNull(index) >= dart.notNull(this[$length]) || dart.notNull(i ndex) < 0)
1440 throw new RangeError.value(index); 1453 throw new RangeError.value(index);
1441 this[index] = value; 1454 this[index] = value;
1442 } 1455 }
1443 get [$length]() { 1456 get [$length]() {
1444 return dart.as(this.length, int); 1457 return dart.as(this.length, int);
1445 } 1458 }
1446 set [$length](newLength) { 1459 set [$length](newLength) {
1447 if (!(typeof newLength == 'number')) 1460 if (!(typeof newLength == 'number'))
1448 throw new ArgumentError(newLength); 1461 throw new ArgumentError(newLength);
1449 if (dart.notNull(newLength) < 0) 1462 if (dart.notNull(newLength) < 0)
1450 throw new RangeError.value(newLength); 1463 throw new RangeError.value(newLength);
1451 this[$checkGrowable]('set length'); 1464 this[$checkGrowable]('set length');
1452 this.length = newLength; 1465 this.length = newLength;
1453 } 1466 }
1454 [$add](value) { 1467 [$add](value) {
1468 dart.as(value, E);
1455 this[$checkGrowable]('add'); 1469 this[$checkGrowable]('add');
1456 this.push(value); 1470 this.push(value);
1457 } 1471 }
1458 [$addAll](iterable) { 1472 [$addAll](iterable) {
1459 for (let e of iterable) { 1473 for (let e of iterable) {
1460 this[$add](e); 1474 this[$add](e);
1461 } 1475 }
1462 } 1476 }
1463 get [$reversed]() { 1477 get [$reversed]() {
1464 return new (_internal.IterableMixinWorkaround$(E))().reversedList(this); 1478 return new (_internal.IterableMixinWorkaround$(E))().reversedList(this);
1465 } 1479 }
1466 [$sort](compare) { 1480 [$sort](compare) {
1467 if (compare === void 0) 1481 if (compare === void 0)
1468 compare = null; 1482 compare = null;
1483 dart.as(compare, dart.functionType(int, [E, E]));
1469 _internal.IterableMixinWorkaround.sortList(this, compare); 1484 _internal.IterableMixinWorkaround.sortList(this, compare);
1470 } 1485 }
1471 [$shuffle](random) { 1486 [$shuffle](random) {
1472 if (random === void 0) 1487 if (random === void 0)
1473 random = null; 1488 random = null;
1474 _internal.IterableMixinWorkaround.shuffleList(this, random); 1489 _internal.IterableMixinWorkaround.shuffleList(this, random);
1475 } 1490 }
1476 [$indexOf](element, start) { 1491 [$indexOf](element, start) {
1492 dart.as(element, E);
1477 if (start === void 0) 1493 if (start === void 0)
1478 start = 0; 1494 start = 0;
1479 return _internal.IterableMixinWorkaround.indexOfList(this, element, star t); 1495 return _internal.IterableMixinWorkaround.indexOfList(this, element, star t);
1480 } 1496 }
1481 [$lastIndexOf](element, start) { 1497 [$lastIndexOf](element, start) {
1498 dart.as(element, E);
1482 if (start === void 0) 1499 if (start === void 0)
1483 start = null; 1500 start = null;
1484 return _internal.IterableMixinWorkaround.lastIndexOfList(this, element, start); 1501 return _internal.IterableMixinWorkaround.lastIndexOfList(this, element, start);
1485 } 1502 }
1486 [$clear]() { 1503 [$clear]() {
1487 this[$length] = 0; 1504 this[$length] = 0;
1488 } 1505 }
1489 [$insert](index, element) { 1506 [$insert](index, element) {
1507 dart.as(element, E);
1490 if (!(typeof index == 'number')) 1508 if (!(typeof index == 'number'))
1491 throw new ArgumentError(index); 1509 throw new ArgumentError(index);
1492 if (dart.notNull(index) < 0 || dart.notNull(index) > dart.notNull(this[$ length])) { 1510 if (dart.notNull(index) < 0 || dart.notNull(index) > dart.notNull(this[$ length])) {
1493 throw new RangeError.value(index); 1511 throw new RangeError.value(index);
1494 } 1512 }
1495 this[$checkGrowable]('insert'); 1513 this[$checkGrowable]('insert');
1496 this.splice(index, 0, element); 1514 this.splice(index, 0, element);
1497 } 1515 }
1498 [$insertAll](index, iterable) { 1516 [$insertAll](index, iterable) {
1499 this[$checkGrowable]('insertAll'); 1517 this[$checkGrowable]('insertAll');
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
1553 } 1571 }
1554 } 1572 }
1555 if (start == end) 1573 if (start == end)
1556 return dart.setType([], List$(E)); 1574 return dart.setType([], List$(E));
1557 return new _interceptors.JSArray$(E).markGrowable(this.slice(start, end) ); 1575 return new _interceptors.JSArray$(E).markGrowable(this.slice(start, end) );
1558 } 1576 }
1559 [$getRange](start, end) { 1577 [$getRange](start, end) {
1560 return new (_internal.IterableMixinWorkaround$(E))().getRangeList(this, start, end); 1578 return new (_internal.IterableMixinWorkaround$(E))().getRangeList(this, start, end);
1561 } 1579 }
1562 [$setRange](start, end, iterable, skipCount) { 1580 [$setRange](start, end, iterable, skipCount) {
1581 dart.as(iterable, Iterable$(E));
1563 if (skipCount === void 0) 1582 if (skipCount === void 0)
1564 skipCount = 0; 1583 skipCount = 0;
1565 this[$checkMutable]('set range'); 1584 this[$checkMutable]('set range');
1566 _internal.IterableMixinWorkaround.setRangeList(this, start, end, iterabl e, skipCount); 1585 _internal.IterableMixinWorkaround.setRangeList(this, start, end, iterabl e, skipCount);
1567 } 1586 }
1568 [$removeRange](start, end) { 1587 [$removeRange](start, end) {
1569 this[$checkGrowable]('removeRange'); 1588 this[$checkGrowable]('removeRange');
1570 let receiverLength = this[$length]; 1589 let receiverLength = this[$length];
1571 if (dart.notNull(start) < 0 || dart.notNull(start) > dart.notNull(receiv erLength)) { 1590 if (dart.notNull(start) < 0 || dart.notNull(start) > dart.notNull(receiv erLength)) {
1572 throw new RangeError.range(start, 0, receiverLength); 1591 throw new RangeError.range(start, 0, receiverLength);
1573 } 1592 }
1574 if (dart.notNull(end) < dart.notNull(start) || dart.notNull(end) > dart. notNull(receiverLength)) { 1593 if (dart.notNull(end) < dart.notNull(start) || dart.notNull(end) > dart. notNull(receiverLength)) {
1575 throw new RangeError.range(end, start, receiverLength); 1594 throw new RangeError.range(end, start, receiverLength);
1576 } 1595 }
1577 _internal.Lists.copy(this, end, this, start, dart.notNull(receiverLength ) - dart.notNull(end)); 1596 _internal.Lists.copy(this, end, this, start, dart.notNull(receiverLength ) - dart.notNull(end));
1578 this[$length] = dart.notNull(receiverLength) - (dart.notNull(end) - dart .notNull(start)); 1597 this[$length] = dart.notNull(receiverLength) - (dart.notNull(end) - dart .notNull(start));
1579 } 1598 }
1580 [$fillRange](start, end, fillValue) { 1599 [$fillRange](start, end, fillValue) {
1581 if (fillValue === void 0) 1600 if (fillValue === void 0)
1582 fillValue = null; 1601 fillValue = null;
1602 dart.as(fillValue, E);
1583 this[$checkMutable]('fill range'); 1603 this[$checkMutable]('fill range');
1584 _internal.IterableMixinWorkaround.fillRangeList(this, start, end, fillVa lue); 1604 _internal.IterableMixinWorkaround.fillRangeList(this, start, end, fillVa lue);
1585 } 1605 }
1586 [$replaceRange](start, end, replacement) { 1606 [$replaceRange](start, end, replacement) {
1587 this[$checkGrowable]('removeRange'); 1607 this[$checkGrowable]('removeRange');
1588 _internal.IterableMixinWorkaround.replaceRangeList(this, start, end, rep lacement); 1608 _internal.IterableMixinWorkaround.replaceRangeList(this, start, end, rep lacement);
1589 } 1609 }
1590 [$asMap]() { 1610 [$asMap]() {
1591 return new (_internal.IterableMixinWorkaround$(E))().asMapList(this); 1611 return new (_internal.IterableMixinWorkaround$(E))().asMapList(this);
1592 } 1612 }
1593 } 1613 }
1614 dart.setBaseClass(List, dart.global.Array);
1594 List[dart.implements] = () => [Iterable$(E), _internal.EfficientLength]; 1615 List[dart.implements] = () => [Iterable$(E), _internal.EfficientLength];
1595 dart.defineNamedConstructor(List, 'filled'); 1616 dart.defineNamedConstructor(List, 'filled');
1596 dart.defineNamedConstructor(List, 'from'); 1617 dart.defineNamedConstructor(List, 'from');
1597 dart.defineNamedConstructor(List, 'generate'); 1618 dart.defineNamedConstructor(List, 'generate');
1598 return List; 1619 return List;
1599 }); 1620 });
1600 let List = List$(); 1621 let List = List$();
1601 dart.registerExtension(dart.global.Array, List); 1622 dart.registerExtension(dart.global.Array, List);
1602 let Map$ = dart.generic(function(K, V) { 1623 let Map$ = dart.generic(function(K, V) {
1603 class Map extends Object { 1624 class Map extends Object {
(...skipping 1839 matching lines...) Expand 10 before | Expand all | Expand 10 after
3443 exports.StackTrace = StackTrace; 3464 exports.StackTrace = StackTrace;
3444 exports.Stopwatch = Stopwatch; 3465 exports.Stopwatch = Stopwatch;
3445 exports.String = String; 3466 exports.String = String;
3446 exports.RuneIterator = RuneIterator; 3467 exports.RuneIterator = RuneIterator;
3447 exports.StringBuffer = StringBuffer; 3468 exports.StringBuffer = StringBuffer;
3448 exports.StringSink = StringSink; 3469 exports.StringSink = StringSink;
3449 exports.Symbol = Symbol; 3470 exports.Symbol = Symbol;
3450 exports.Type = Type; 3471 exports.Type = Type;
3451 exports.Uri = Uri; 3472 exports.Uri = Uri;
3452 })(core || (core = {})); 3473 })(core || (core = {}));
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698