| OLD | NEW |
| 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 /// This library defines the operations that define and manipulate Dart | 5 /// This library defines the operations that define and manipulate Dart |
| 6 /// classes. Included in this are: | 6 /// classes. Included in this are: |
| 7 /// - Generics | 7 /// - Generics |
| 8 /// - Class metadata | 8 /// - Class metadata |
| 9 /// - Extension methods | 9 /// - Extension methods |
| 10 /// | 10 /// |
| (...skipping 319 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 330 // symbol name. | 330 // symbol name. |
| 331 var names = getOwnPropertyNames(coreObjProto); | 331 var names = getOwnPropertyNames(coreObjProto); |
| 332 for (int i = 0; i < JS('int', '#.length', names); ++i) { | 332 for (int i = 0; i < JS('int', '#.length', names); ++i) { |
| 333 var name = JS('', '#[#]', names, i); | 333 var name = JS('', '#[#]', names, i); |
| 334 var desc = getOwnPropertyDescriptor(coreObjProto, name); | 334 var desc = getOwnPropertyDescriptor(coreObjProto, name); |
| 335 defineProperty(jsProto, getExtensionSymbol(name), desc); | 335 defineProperty(jsProto, getExtensionSymbol(name), desc); |
| 336 } | 336 } |
| 337 return; | 337 return; |
| 338 } | 338 } |
| 339 | 339 |
| 340 | |
| 341 /// | |
| 342 /// Copy symbols from the prototype of the source to destination. | 340 /// Copy symbols from the prototype of the source to destination. |
| 343 /// These are the only properties safe to copy onto an existing public | 341 /// These are the only properties safe to copy onto an existing public |
| 344 /// JavaScript class. | 342 /// JavaScript class. |
| 345 /// | |
| 346 registerExtension(jsType, dartExtType) => JS('', '''(() => { | 343 registerExtension(jsType, dartExtType) => JS('', '''(() => { |
| 347 // TODO(vsm): Not all registered js types are real. | 344 // TODO(vsm): Not all registered js types are real. |
| 348 if (!jsType) return; | 345 if (!jsType) return; |
| 349 | 346 |
| 350 let extProto = $dartExtType.prototype; | 347 let extProto = $dartExtType.prototype; |
| 351 let jsProto = $jsType.prototype; | 348 let jsProto = $jsType.prototype; |
| 352 | 349 |
| 353 // Mark the JS type's instances so we can easily check for extensions. | 350 // Mark the JS type's instances so we can easily check for extensions. |
| 354 jsProto[$_extensionType] = $dartExtType; | 351 jsProto[$_extensionType] = $dartExtType; |
| 355 $_installProperties(jsProto, extProto); | 352 $_installProperties(jsProto, extProto); |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 397 let originalSigFn = $getOwnPropertyDescriptor($type, $_methodSig).get; | 394 let originalSigFn = $getOwnPropertyDescriptor($type, $_methodSig).get; |
| 398 $defineMemoizedGetter(type, $_methodSig, function() { | 395 $defineMemoizedGetter(type, $_methodSig, function() { |
| 399 let sig = originalSigFn(); | 396 let sig = originalSigFn(); |
| 400 for (let name of $methodNames) { | 397 for (let name of $methodNames) { |
| 401 sig[$getExtensionSymbol(name)] = sig[name]; | 398 sig[$getExtensionSymbol(name)] = sig[name]; |
| 402 } | 399 } |
| 403 return sig; | 400 return sig; |
| 404 }); | 401 }); |
| 405 })()'''); | 402 })()'''); |
| 406 | 403 |
| 407 canonicalMember(obj, name) => JS('', '''(() => { | |
| 408 // Private names are symbols and are already canonical. | |
| 409 if (typeof name === 'symbol') return name; | |
| 410 | |
| 411 if ($obj != null && $obj[$_extensionType]) return $dartx[$name]; | |
| 412 // Check for certain names that we can't use in JS | |
| 413 if ($name == 'constructor' || $name == 'prototype') { | |
| 414 $name = '+' + $name; | |
| 415 } | |
| 416 return $name; | |
| 417 })()'''); | |
| 418 | |
| 419 /// Sets the type of `obj` to be `type` | 404 /// Sets the type of `obj` to be `type` |
| 420 setType(obj, type) { | 405 setType(obj, type) { |
| 421 JS('', '#.__proto__ = #.prototype', obj, type); | 406 JS('', '#.__proto__ = #.prototype', obj, type); |
| 422 return obj; | 407 return obj; |
| 423 } | 408 } |
| 424 | 409 |
| 425 /// Sets the element type of a list literal. | 410 /// Sets the element type of a list literal. |
| 426 list(obj, elementType) => | 411 list(obj, elementType) => |
| 427 JS('', '$setType($obj, ${getGenericClass(JSArray)}($elementType))'); | 412 JS('', '$setType($obj, ${getGenericClass(JSArray)}($elementType))'); |
| 428 | 413 |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 467 /// | 452 /// |
| 468 /// For example it can be called with `new SomeClass.name(args)`. | 453 /// For example it can be called with `new SomeClass.name(args)`. |
| 469 /// | 454 /// |
| 470 /// The constructor | 455 /// The constructor |
| 471 defineNamedConstructorCallable(clazz, name, ctor) => JS('', '''(() => { | 456 defineNamedConstructorCallable(clazz, name, ctor) => JS('', '''(() => { |
| 472 ctor.prototype = $clazz.prototype; | 457 ctor.prototype = $clazz.prototype; |
| 473 // Use defineProperty so we don't hit a property defined on Function, | 458 // Use defineProperty so we don't hit a property defined on Function, |
| 474 // like `caller` and `arguments`. | 459 // like `caller` and `arguments`. |
| 475 $defineProperty($clazz, $name, { value: ctor, configurable: true }); | 460 $defineProperty($clazz, $name, { value: ctor, configurable: true }); |
| 476 })()'''); | 461 })()'''); |
| OLD | NEW |