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

Side by Side Diff: runtime/lib/mirrors_impl.dart

Issue 1273983002: Hoist InstanceMirror.delegate to ObjectMirror. (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Created 5 years, 4 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 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2012, 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 // VM-specific implementation of the dart:mirrors library. 5 // VM-specific implementation of the dart:mirrors library.
6 6
7 import "dart:collection" show UnmodifiableListView, UnmodifiableMapView; 7 import "dart:collection" show UnmodifiableListView, UnmodifiableMapView;
8 import "dart:async" show Future; 8 import "dart:async" show Future;
9 9
10 var dirty = false; 10 var dirty = false;
(...skipping 353 matching lines...) Expand 10 before | Expand all | Expand 10 after
364 } 364 }
365 365
366 InstanceMirror getField(Symbol memberName) { 366 InstanceMirror getField(Symbol memberName) {
367 return reflect(this._invokeGetter(_reflectee, _n(memberName))); 367 return reflect(this._invokeGetter(_reflectee, _n(memberName)));
368 } 368 }
369 369
370 InstanceMirror setField(Symbol memberName, Object value) { 370 InstanceMirror setField(Symbol memberName, Object value) {
371 this._invokeSetter(_reflectee, _n(memberName), value); 371 this._invokeSetter(_reflectee, _n(memberName), value);
372 return reflect(value); 372 return reflect(value);
373 } 373 }
374
375 delegate(Invocation invocation) {
376 if (invocation.isMethod) {
377 return this.invoke(invocation.memberName,
378 invocation.positionalArguments,
379 invocation.namedArguments).reflectee;
380 }
381 if (invocation.isGetter) {
382 return this.getField(invocation.memberName).reflectee;
383 }
384 if (invocation.isSetter) {
385 var unwrapped = _n(invocation.memberName);
386 var withoutEqual = _s(unwrapped.substring(0, unwrapped.length - 1));
387 var arg = invocation.positionalArguments[0];
388 this.setField(withoutEqual, arg).reflectee;
389 return arg;
390 }
391 throw "UNREACHABLE";
392 }
374 } 393 }
375 394
376 class _LocalInstanceMirror extends _LocalObjectMirror 395 class _LocalInstanceMirror extends _LocalObjectMirror
377 implements InstanceMirror { 396 implements InstanceMirror {
378 397
379 _LocalInstanceMirror(reflectee) : super(reflectee); 398 _LocalInstanceMirror(reflectee) : super(reflectee);
380 399
381 ClassMirror _type; 400 ClassMirror _type;
382 ClassMirror get type { 401 ClassMirror get type {
383 if (_type == null) { 402 if (_type == null) {
384 // Note it not safe to use reflectee.runtimeType because runtimeType may 403 // Note it not safe to use reflectee.runtimeType because runtimeType may
385 // be overridden. 404 // be overridden.
386 _type = reflectType(_computeType(reflectee)); 405 _type = reflectType(_computeType(reflectee));
387 } 406 }
388 return _type; 407 return _type;
389 } 408 }
390 409
391 // LocalInstanceMirrors always reflect local instances 410 // LocalInstanceMirrors always reflect local instances
392 bool get hasReflectee => true; 411 bool get hasReflectee => true;
393 412
394 get reflectee => _reflectee; 413 get reflectee => _reflectee;
395 414
396 delegate(Invocation invocation) {
397 if (invocation.isMethod) {
398 return this.invoke(invocation.memberName,
399 invocation.positionalArguments,
400 invocation.namedArguments).reflectee;
401 }
402 if (invocation.isGetter) {
403 return this.getField(invocation.memberName).reflectee;
404 }
405 if (invocation.isSetter) {
406 var unwrapped = _n(invocation.memberName);
407 var withoutEqual = _s(unwrapped.substring(0, unwrapped.length - 1));
408 var arg = invocation.positionalArguments[0];
409 this.setField(withoutEqual, arg).reflectee;
410 return arg;
411 }
412 throw "UNREACHABLE";
413 }
414
415 String toString() => 'InstanceMirror on ${Error.safeToString(_reflectee)}'; 415 String toString() => 'InstanceMirror on ${Error.safeToString(_reflectee)}';
416 416
417 bool operator ==(other) { 417 bool operator ==(other) {
418 return other is _LocalInstanceMirror && 418 return other is _LocalInstanceMirror &&
419 identical(_reflectee, other._reflectee); 419 identical(_reflectee, other._reflectee);
420 } 420 }
421 421
422 int get hashCode { 422 int get hashCode {
423 // Avoid hash collisions with the reflectee. This constant is in Smi range 423 // Avoid hash collisions with the reflectee. This constant is in Smi range
424 // and happens to be the inner padding from RFC 2104. 424 // and happens to be the inner padding from RFC 2104.
(...skipping 1239 matching lines...) Expand 10 before | Expand all | Expand 10 after
1664 if (typeMirror == null) { 1664 if (typeMirror == null) {
1665 typeMirror = makeLocalTypeMirror(key); 1665 typeMirror = makeLocalTypeMirror(key);
1666 _instanitationCache[key] = typeMirror; 1666 _instanitationCache[key] = typeMirror;
1667 if (typeMirror is ClassMirror && !typeMirror._isGeneric) { 1667 if (typeMirror is ClassMirror && !typeMirror._isGeneric) {
1668 _declarationCache[key] = typeMirror; 1668 _declarationCache[key] = typeMirror;
1669 } 1669 }
1670 } 1670 }
1671 return typeMirror; 1671 return typeMirror;
1672 } 1672 }
1673 } 1673 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698