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

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

Issue 1988683004: Use _extensionType for detecting prototype inheritance. (Closed) Base URL: https://github.com/dart-lang/dev_compiler@master
Patch Set: Created 4 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 | « lib/runtime/dart_sdk.js ('k') | no next file » | 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 /// 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 262 matching lines...) Expand 10 before | Expand all | Expand 10 after
273 sym = JS('', 'Symbol("dartx." + #.toString())', name); 273 sym = JS('', 'Symbol("dartx." + #.toString())', name);
274 JS('', 'dartx[#] = #', name, sym); 274 JS('', 'dartx[#] = #', name, sym);
275 } 275 }
276 return sym; 276 return sym;
277 } 277 }
278 278
279 defineExtensionNames(names) => 279 defineExtensionNames(names) =>
280 JS('', '#.forEach(#)', names, getExtensionSymbol); 280 JS('', '#.forEach(#)', names, getExtensionSymbol);
281 281
282 282
283 /// A map from peer class prototypes to the Dart class prototype. This is used
284 /// to recognize when Dart subclass inheritance corresponds to JavaScript
285 /// prototype inheritance.
286 final _installedDartPeers = JS('', 'new Map()');
287
288 /// Install properties in prototype-first order. Properties / descriptors from 283 /// Install properties in prototype-first order. Properties / descriptors from
289 /// more specific types should overwrite ones from less specific types. 284 /// more specific types should overwrite ones from less specific types.
290 void _installProperties(jsProto, extProto) { 285 void _installProperties(jsProto, extProto) {
291 286
292 // This relies on the Dart type literal evaluating to the JavaScript 287 // This relies on the Dart type literal evaluating to the JavaScript
293 // constructor. 288 // constructor.
294 var coreObjProto = JS('', '#.prototype', Object); 289 var coreObjProto = JS('', '#.prototype', Object);
295 290
291 var parentsExtension =
292 JS('', '(#.__proto__)[#]', jsProto, _extensionType);
296 var installedParent = 293 var installedParent =
297 JS('', '#.get(#.__proto__)', _installedDartPeers, jsProto); 294 JS('', '# && #.prototype', parentsExtension, parentsExtension);
298 295
299 _installProperties2(jsProto, extProto, coreObjProto, installedParent); 296 _installProperties2(jsProto, extProto, coreObjProto, installedParent);
300
301 // Mark this jsProto as being the prototype for the extension class.
302 JS('', '#.set(#, #)', _installedDartPeers, jsProto, extProto);
303 } 297 }
304 298
305 void _installProperties2(jsProto, extProto, coreObjProto, installedParent) { 299 void _installProperties2(jsProto, extProto, coreObjProto, installedParent) {
306 if (JS('bool', '# === #', extProto, coreObjProto)) { 300 if (JS('bool', '# === #', extProto, coreObjProto)) {
307 _installPropertiesForObject(jsProto, coreObjProto); 301 _installPropertiesForObject(jsProto, coreObjProto);
308 return; 302 return;
309 } 303 }
310 if (JS('bool', '# !== #', jsProto, extProto)) { 304 if (JS('bool', '# !== #', jsProto, extProto)) {
311 var extParent = JS('', '#.__proto__', extProto); 305 var extParent = JS('', '#.__proto__', extProto);
312 306
(...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after
421 })()'''); 415 })()''');
422 416
423 /// Sets the element type of a list literal. 417 /// Sets the element type of a list literal.
424 list(obj, elementType) => 418 list(obj, elementType) =>
425 JS('', '$setType($obj, ${getGenericClass(JSArray)}($elementType))'); 419 JS('', '$setType($obj, ${getGenericClass(JSArray)}($elementType))');
426 420
427 setBaseClass(derived, base) => JS('', '''(() => { 421 setBaseClass(derived, base) => JS('', '''(() => {
428 // Link the extension to the type it's extending as a base class. 422 // Link the extension to the type it's extending as a base class.
429 $derived.prototype.__proto__ = $base.prototype; 423 $derived.prototype.__proto__ = $base.prototype;
430 })()'''); 424 })()''');
OLDNEW
« no previous file with comments | « lib/runtime/dart_sdk.js ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698