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

Side by Side Diff: pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/classes.dart

Issue 2430953006: fix #27532, implementing a native type with fields (Closed)
Patch Set: Created 4 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
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 /// 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 441 matching lines...) Expand 10 before | Expand all | Expand 10 after
452 // TODO(jmesserly): essentially this gives two names to the same method. 452 // TODO(jmesserly): essentially this gives two names to the same method.
453 // This benefit is roughly equivalent call performance either way, but the 453 // This benefit is roughly equivalent call performance either way, but the
454 // cost is we need to call defineExtensionMembers any time a subclass 454 // cost is we need to call defineExtensionMembers any time a subclass
455 // overrides one of these methods. 455 // overrides one of these methods.
456 defineExtensionMembers(type, methodNames) => JS( 456 defineExtensionMembers(type, methodNames) => JS(
457 '', 457 '',
458 '''(() => { 458 '''(() => {
459 let proto = $type.prototype; 459 let proto = $type.prototype;
460 for (let name of $methodNames) { 460 for (let name of $methodNames) {
461 let method = $getOwnPropertyDescriptor(proto, name); 461 let method = $getOwnPropertyDescriptor(proto, name);
462 // TODO(vsm): We should be able to generate code to avoid this case.
463 // The method may be null if this type implements a potentially native
464 // interface but isn't native itself. For a field on this type, we're not
465 // generating a corresponding getter/setter method - it's just a field.
466 if (!method) continue;
467 $defineProperty(proto, $getExtensionSymbol(name), method); 462 $defineProperty(proto, $getExtensionSymbol(name), method);
468 } 463 }
469 // Ensure the signature is available too. 464 // Ensure the signature is available too.
470 // TODO(jmesserly): not sure if we can do this in a cleaner way. Essentially 465 // TODO(jmesserly): not sure if we can do this in a cleaner way. Essentially
471 // we need to copy the signature (and in the future, other data like 466 // we need to copy the signature (and in the future, other data like
472 // annotations) any time we copy a method as part of our metaprogramming. 467 // annotations) any time we copy a method as part of our metaprogramming.
473 // It might be more friendly to JS metaprogramming if we include this info 468 // It might be more friendly to JS metaprogramming if we include this info
474 // on the function. 469 // on the function.
475 let originalSigFn = $getOwnPropertyDescriptor($type, $_methodSig).get; 470 let originalSigFn = $getOwnPropertyDescriptor($type, $_methodSig).get;
476 $defineMemoizedGetter(type, $_methodSig, function() { 471 $defineMemoizedGetter(type, $_methodSig, function() {
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
538 /// 533 ///
539 /// The constructor 534 /// The constructor
540 defineNamedConstructorCallable(clazz, name, ctor) => JS( 535 defineNamedConstructorCallable(clazz, name, ctor) => JS(
541 '', 536 '',
542 '''(() => { 537 '''(() => {
543 ctor.prototype = $clazz.prototype; 538 ctor.prototype = $clazz.prototype;
544 // Use defineProperty so we don't hit a property defined on Function, 539 // Use defineProperty so we don't hit a property defined on Function,
545 // like `caller` and `arguments`. 540 // like `caller` and `arguments`.
546 $defineProperty($clazz, $name, { value: ctor, configurable: true }); 541 $defineProperty($clazz, $name, { value: ctor, configurable: true });
547 })()'''); 542 })()''');
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698