| OLD | NEW |
| 1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2014, 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 part of service; | 5 part of service; |
| 6 | 6 |
| 7 // Some value smaller than the object ring, so requesting a large array | 7 // Some value smaller than the object ring, so requesting a large array |
| 8 // doesn't result in an expired ref because the elements lapped it in the | 8 // doesn't result in an expired ref because the elements lapped it in the |
| 9 // object ring. | 9 // object ring. |
| 10 const int kDefaultFieldLimit = 100; | 10 const int kDefaultFieldLimit = 100; |
| (...skipping 2586 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2597 | 2597 |
| 2598 variables = map['variables']; | 2598 variables = map['variables']; |
| 2599 | 2599 |
| 2600 // We are fully loaded. | 2600 // We are fully loaded. |
| 2601 _loaded = true; | 2601 _loaded = true; |
| 2602 } | 2602 } |
| 2603 | 2603 |
| 2604 String toString() => 'Context($length)'; | 2604 String toString() => 'Context($length)'; |
| 2605 } | 2605 } |
| 2606 | 2606 |
| 2607 | 2607 M.FunctionKind stringToFunctionKind(String value) { |
| 2608 // TODO(koda): Sync this with VM. | 2608 switch(value) { |
| 2609 class FunctionKind { | 2609 case 'RegularFunction': return M.FunctionKind.regular; |
| 2610 final String _strValue; | 2610 case 'ClosureFunction': return M.FunctionKind.closure; |
| 2611 FunctionKind._internal(this._strValue); | 2611 case 'GetterFunction': return M.FunctionKind.getter; |
| 2612 toString() => _strValue; | 2612 case 'SetterFunction': return M.FunctionKind.setter; |
| 2613 bool isSynthetic() => [kCollected, kNative, kStub, kTag].contains(this); | 2613 case 'Constructor': return M.FunctionKind.constructor; |
| 2614 bool isDart() => !isSynthetic(); | 2614 case 'ImplicitGetter': return M.FunctionKind.implicitGetter; |
| 2615 bool isStub() => (this == kStub); | 2615 case 'ImplicitSetter': return M.FunctionKind.implicitSetter; |
| 2616 bool hasDartCode() => isDart() || isStub(); | 2616 case 'ImplicitStaticFinalGetter': |
| 2617 static FunctionKind fromJSON(String value) { | 2617 return M.FunctionKind.implicitStaticFinalGetter; |
| 2618 switch(value) { | 2618 case 'IrregexpFunction': return M.FunctionKind.irregexpFunction; |
| 2619 case 'RegularFunction': return kRegularFunction; | 2619 case 'StaticInitializer': return M.FunctionKind.staticInitializer; |
| 2620 case 'ClosureFunction': return kClosureFunction; | 2620 case 'MethodExtractor': return M.FunctionKind.methodExtractor; |
| 2621 case 'GetterFunction': return kGetterFunction; | 2621 case 'NoSuchMethodDispatcher': return M.FunctionKind.noSuchMethodDispatcher; |
| 2622 case 'SetterFunction': return kSetterFunction; | 2622 case 'InvokeFieldDispatcher': return M.FunctionKind.invokeFieldDispatcher; |
| 2623 case 'Constructor': return kConstructor; | 2623 case 'Collected': return M.FunctionKind.collected; |
| 2624 case 'ImplicitGetter': return kImplicitGetterFunction; | 2624 case 'Native': return M.FunctionKind.native; |
| 2625 case 'ImplicitSetter': return kImplicitSetterFunction; | 2625 case 'Stub': return M.FunctionKind.stub; |
| 2626 case 'ImplicitStaticFinalGetter': return kImplicitStaticFinalGetter; | 2626 case 'Tag': return M.FunctionKind.tag; |
| 2627 case 'IrregexpFunction': return kIrregexpFunction; | 2627 case 'SignatureFunction': return M.FunctionKind.signatureFunction; |
| 2628 case 'StaticInitializer': return kStaticInitializer; | |
| 2629 case 'MethodExtractor': return kMethodExtractor; | |
| 2630 case 'NoSuchMethodDispatcher': return kNoSuchMethodDispatcher; | |
| 2631 case 'InvokeFieldDispatcher': return kInvokeFieldDispatcher; | |
| 2632 case 'Collected': return kCollected; | |
| 2633 case 'Native': return kNative; | |
| 2634 case 'Stub': return kStub; | |
| 2635 case 'Tag': return kTag; | |
| 2636 case 'SignatureFunction': return kSignatureFunction; | |
| 2637 } | |
| 2638 Logger.root.severe('Unrecognized function kind: $value'); | |
| 2639 throw new FallThroughError(); | |
| 2640 } | 2628 } |
| 2641 | 2629 Logger.root.severe('Unrecognized function kind: $value'); |
| 2642 static FunctionKind kRegularFunction = new FunctionKind._internal('function'); | 2630 throw new FallThroughError(); |
| 2643 static FunctionKind kClosureFunction = new FunctionKind._internal('closure fun
ction'); | |
| 2644 static FunctionKind kGetterFunction = new FunctionKind._internal('getter funct
ion'); | |
| 2645 static FunctionKind kSetterFunction = new FunctionKind._internal('setter funct
ion'); | |
| 2646 static FunctionKind kConstructor = new FunctionKind._internal('constructor'); | |
| 2647 static FunctionKind kImplicitGetterFunction = new FunctionKind._internal('impl
icit getter function'); | |
| 2648 static FunctionKind kImplicitSetterFunction = new FunctionKind._internal('impl
icit setter function'); | |
| 2649 static FunctionKind kImplicitStaticFinalGetter = new FunctionKind._internal('i
mplicit static final getter'); | |
| 2650 static FunctionKind kIrregexpFunction = new FunctionKind._internal('ir regexp
function'); | |
| 2651 static FunctionKind kStaticInitializer = new FunctionKind._internal('static in
itializer'); | |
| 2652 static FunctionKind kMethodExtractor = new FunctionKind._internal('method extr
actor'); | |
| 2653 static FunctionKind kNoSuchMethodDispatcher = new FunctionKind._internal('noSu
chMethod dispatcher'); | |
| 2654 static FunctionKind kInvokeFieldDispatcher = new FunctionKind._internal('invok
e field dispatcher'); | |
| 2655 static FunctionKind kCollected = new FunctionKind._internal('Collected'); | |
| 2656 static FunctionKind kNative = new FunctionKind._internal('Native'); | |
| 2657 static FunctionKind kTag = new FunctionKind._internal('Tag'); | |
| 2658 static FunctionKind kStub = new FunctionKind._internal('Stub'); | |
| 2659 static FunctionKind kSignatureFunction = new FunctionKind._internal('Signature
Function'); | |
| 2660 static FunctionKind kUNKNOWN = new FunctionKind._internal('UNKNOWN'); | |
| 2661 } | 2631 } |
| 2662 | 2632 |
| 2663 class ServiceFunction extends HeapObject { | 2633 class ServiceFunction extends HeapObject implements M.Function { |
| 2664 // owner is a Library, Class, or ServiceFunction. | 2634 // owner is a Library, Class, or ServiceFunction. |
| 2665 @observable ServiceObject dartOwner; | 2635 @observable M.ObjectRef dartOwner; |
| 2666 @observable Library library; | 2636 @observable Library library; |
| 2667 @observable bool isStatic; | 2637 @observable bool isStatic; |
| 2668 @observable bool isConst; | 2638 @observable bool isConst; |
| 2669 @observable SourceLocation location; | 2639 @observable SourceLocation location; |
| 2670 @observable Code code; | 2640 @observable Code code; |
| 2671 @observable Code unoptimizedCode; | 2641 @observable Code unoptimizedCode; |
| 2672 @observable bool isOptimizable; | 2642 @observable bool isOptimizable; |
| 2673 @observable bool isInlinable; | 2643 @observable bool isInlinable; |
| 2674 @observable bool hasIntrinsic; | 2644 @observable bool hasIntrinsic; |
| 2675 @observable bool isRecognized; | 2645 @observable bool isRecognized; |
| 2676 @observable bool isNative; | 2646 @observable bool isNative; |
| 2677 @observable FunctionKind kind; | 2647 @observable M.FunctionKind kind; |
| 2678 @observable int deoptimizations; | 2648 @observable int deoptimizations; |
| 2679 @observable String qualifiedName; | 2649 @observable String qualifiedName; |
| 2680 @observable int usageCounter; | 2650 @observable int usageCounter; |
| 2681 @observable bool isDart; | 2651 @observable bool isDart; |
| 2682 @observable ProfileFunction profile; | 2652 @observable ProfileFunction profile; |
| 2683 @observable Instance icDataArray; | 2653 @observable Instance icDataArray; |
| 2684 @observable Field field; | 2654 @observable Field field; |
| 2685 | 2655 |
| 2686 bool get canCache => true; | 2656 bool get canCache => true; |
| 2687 bool get immutable => false; | 2657 bool get immutable => false; |
| 2688 | 2658 |
| 2689 ServiceFunction._empty(ServiceObject owner) : super._empty(owner); | 2659 ServiceFunction._empty(ServiceObject owner) : super._empty(owner); |
| 2690 | 2660 |
| 2691 void _update(ObservableMap map, bool mapIsRef) { | 2661 void _update(ObservableMap map, bool mapIsRef) { |
| 2692 _upgradeCollection(map, isolate); | 2662 _upgradeCollection(map, isolate); |
| 2693 super._update(map, mapIsRef); | 2663 super._update(map, mapIsRef); |
| 2694 | 2664 |
| 2695 name = map['name']; | 2665 name = map['name']; |
| 2696 vmName = (map.containsKey('_vmName') ? map['_vmName'] : name); | 2666 vmName = (map.containsKey('_vmName') ? map['_vmName'] : name); |
| 2697 | 2667 |
| 2698 dartOwner = map['owner']; | 2668 dartOwner = map['owner']; |
| 2699 kind = FunctionKind.fromJSON(map['_kind']); | 2669 kind = stringToFunctionKind(map['_kind']); |
| 2700 isDart = kind.isDart(); | 2670 isDart = M.isDartFunction(kind); |
| 2701 | 2671 |
| 2702 if (dartOwner is ServiceFunction) { | 2672 if (dartOwner is ServiceFunction) { |
| 2703 ServiceFunction ownerFunction = dartOwner; | 2673 ServiceFunction ownerFunction = dartOwner; |
| 2704 library = ownerFunction.library; | 2674 library = ownerFunction.library; |
| 2705 qualifiedName = "${ownerFunction.qualifiedName}.${name}"; | 2675 qualifiedName = "${ownerFunction.qualifiedName}.${name}"; |
| 2706 | 2676 |
| 2707 } else if (dartOwner is Class) { | 2677 } else if (dartOwner is Class) { |
| 2708 Class ownerClass = dartOwner; | 2678 Class ownerClass = dartOwner; |
| 2709 library = ownerClass.library; | 2679 library = ownerClass.library; |
| 2710 qualifiedName = "${ownerClass.name}.${name}"; | 2680 qualifiedName = "${ownerClass.name}.${name}"; |
| (...skipping 832 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3543 return; | 3513 return; |
| 3544 } | 3514 } |
| 3545 if (relativeAddress >= instructionsByAddressOffset.length) { | 3515 if (relativeAddress >= instructionsByAddressOffset.length) { |
| 3546 Logger.root.warning('Bad address resolving jump target $relativeAddress'); | 3516 Logger.root.warning('Bad address resolving jump target $relativeAddress'); |
| 3547 return; | 3517 return; |
| 3548 } | 3518 } |
| 3549 jumpTarget = instructionsByAddressOffset[relativeAddress]; | 3519 jumpTarget = instructionsByAddressOffset[relativeAddress]; |
| 3550 } | 3520 } |
| 3551 } | 3521 } |
| 3552 | 3522 |
| 3553 class CodeKind { | 3523 M.CodeKind stringToCodeKind(String s) { |
| 3554 final _value; | 3524 if (s == 'Native') { |
| 3555 const CodeKind._internal(this._value); | 3525 return M.CodeKind.native; |
| 3556 String toString() => '$_value'; | 3526 } else if (s == 'Dart') { |
| 3557 bool isSynthetic() => [Collected, Native, Tag].contains(this); | 3527 return M.CodeKind.dart; |
| 3558 bool isDart() => !isSynthetic(); | 3528 } else if (s == 'Collected') { |
| 3559 static CodeKind fromString(String s) { | 3529 return M.CodeKind.collected; |
| 3560 if (s == 'Native') { | 3530 } else if (s == 'Tag') { |
| 3561 return Native; | 3531 return M.CodeKind.tag; |
| 3562 } else if (s == 'Dart') { | 3532 } else if (s == 'Stub') { |
| 3563 return Dart; | 3533 return M.CodeKind.stub; |
| 3564 } else if (s == 'Collected') { | |
| 3565 return Collected; | |
| 3566 } else if (s == 'Tag') { | |
| 3567 return Tag; | |
| 3568 } else if (s == 'Stub') { | |
| 3569 return Stub; | |
| 3570 } | |
| 3571 Logger.root.severe("Unrecognized code kind: '$s'"); | |
| 3572 throw new FallThroughError(); | |
| 3573 } | 3534 } |
| 3574 static const Collected = const CodeKind._internal('Collected'); | 3535 Logger.root.severe("Unrecognized code kind: '$s'"); |
| 3575 static const Dart = const CodeKind._internal('Dart'); | 3536 throw new FallThroughError(); |
| 3576 static const Native = const CodeKind._internal('Native'); | |
| 3577 static const Stub = const CodeKind._internal('Stub'); | |
| 3578 static const Tag = const CodeKind._internal('Tag'); | |
| 3579 } | 3537 } |
| 3580 | 3538 |
| 3581 class CodeInlineInterval { | 3539 class CodeInlineInterval { |
| 3582 final int start; | 3540 final int start; |
| 3583 final int end; | 3541 final int end; |
| 3584 final List<ServiceFunction> functions = new List<ServiceFunction>(); | 3542 final List<ServiceFunction> functions = new List<ServiceFunction>(); |
| 3585 bool contains(int pc) => (pc >= start) && (pc < end); | 3543 bool contains(int pc) => (pc >= start) && (pc < end); |
| 3586 CodeInlineInterval(this.start, this.end); | 3544 CodeInlineInterval(this.start, this.end); |
| 3587 } | 3545 } |
| 3588 | 3546 |
| 3589 class Code extends HeapObject { | 3547 class Code extends HeapObject implements M.Code { |
| 3590 @observable CodeKind kind; | 3548 @observable M.CodeKind kind; |
| 3591 @observable ServiceObject objectPool; | 3549 @observable ServiceObject objectPool; |
| 3592 @observable ServiceFunction function; | 3550 @observable ServiceFunction function; |
| 3593 @observable Script script; | 3551 @observable Script script; |
| 3594 @observable bool isOptimized; | 3552 @observable bool isOptimized; |
| 3595 @observable bool hasIntrinsic; | 3553 @observable bool hasIntrinsic; |
| 3596 @observable bool isNative; | 3554 @observable bool isNative; |
| 3597 | 3555 |
| 3598 @reflectable int startAddress = 0; | 3556 @reflectable int startAddress = 0; |
| 3599 @reflectable int endAddress = 0; | 3557 @reflectable int endAddress = 0; |
| 3600 @reflectable final instructions = new ObservableList<CodeInstruction>(); | 3558 @reflectable final instructions = new ObservableList<CodeInstruction>(); |
| (...skipping 16 matching lines...) Expand all Loading... |
| 3617 descriptor.processScript(script); | 3575 descriptor.processScript(script); |
| 3618 } | 3576 } |
| 3619 } | 3577 } |
| 3620 } | 3578 } |
| 3621 | 3579 |
| 3622 void loadScript() { | 3580 void loadScript() { |
| 3623 if (script != null) { | 3581 if (script != null) { |
| 3624 // Already done. | 3582 // Already done. |
| 3625 return; | 3583 return; |
| 3626 } | 3584 } |
| 3627 if (kind != CodeKind.Dart){ | 3585 if (kind != M.CodeKind.dart){ |
| 3628 return; | 3586 return; |
| 3629 } | 3587 } |
| 3630 if (function == null) { | 3588 if (function == null) { |
| 3631 return; | 3589 return; |
| 3632 } | 3590 } |
| 3633 if ((function.location == null) || | 3591 if ((function.location == null) || |
| 3634 (function.location.script == null)) { | 3592 (function.location.script == null)) { |
| 3635 // Attempt to load the function. | 3593 // Attempt to load the function. |
| 3636 function.load().then((func) { | 3594 function.load().then((func) { |
| 3637 var script = function.location.script; | 3595 var script = function.location.script; |
| (...skipping 18 matching lines...) Expand all Loading... |
| 3656 // We only reload Dart code. | 3614 // We only reload Dart code. |
| 3657 return super.reload(count: count); | 3615 return super.reload(count: count); |
| 3658 } | 3616 } |
| 3659 return new Future.value(this); | 3617 return new Future.value(this); |
| 3660 } | 3618 } |
| 3661 | 3619 |
| 3662 void _update(ObservableMap m, bool mapIsRef) { | 3620 void _update(ObservableMap m, bool mapIsRef) { |
| 3663 name = m['name']; | 3621 name = m['name']; |
| 3664 vmName = (m.containsKey('_vmName') ? m['_vmName'] : name); | 3622 vmName = (m.containsKey('_vmName') ? m['_vmName'] : name); |
| 3665 isOptimized = m['_optimized']; | 3623 isOptimized = m['_optimized']; |
| 3666 kind = CodeKind.fromString(m['kind']); | 3624 kind = stringToCodeKind(m['kind']); |
| 3667 hasIntrinsic = m['_intrinsic']; | 3625 hasIntrinsic = m['_intrinsic']; |
| 3668 isNative = m['_native']; | 3626 isNative = m['_native']; |
| 3669 if (mapIsRef) { | 3627 if (mapIsRef) { |
| 3670 return; | 3628 return; |
| 3671 } | 3629 } |
| 3672 _loaded = true; | 3630 _loaded = true; |
| 3673 startAddress = int.parse(m['_startAddress'], radix:16); | 3631 startAddress = int.parse(m['_startAddress'], radix:16); |
| 3674 endAddress = int.parse(m['_endAddress'], radix:16); | 3632 endAddress = int.parse(m['_endAddress'], radix:16); |
| 3675 function = isolate.getFromMap(m['function']); | 3633 function = isolate.getFromMap(m['function']); |
| 3676 objectPool = isolate.getFromMap(m['_objectPool']); | 3634 objectPool = isolate.getFromMap(m['_objectPool']); |
| 3677 var disassembly = m['_disassembly']; | 3635 var disassembly = m['_disassembly']; |
| 3678 if (disassembly != null) { | 3636 if (disassembly != null) { |
| 3679 _processDisassembly(disassembly); | 3637 _processDisassembly(disassembly); |
| 3680 } | 3638 } |
| 3681 var descriptors = m['_descriptors']; | 3639 var descriptors = m['_descriptors']; |
| 3682 if (descriptors != null) { | 3640 if (descriptors != null) { |
| 3683 descriptors = descriptors['members']; | 3641 descriptors = descriptors['members']; |
| 3684 _processDescriptors(descriptors); | 3642 _processDescriptors(descriptors); |
| 3685 } | 3643 } |
| 3686 hasDisassembly = (instructions.length != 0) && (kind == CodeKind.Dart); | 3644 hasDisassembly = (instructions.length != 0) && (kind == M.CodeKind.dart); |
| 3687 inlinedFunctions.clear(); | 3645 inlinedFunctions.clear(); |
| 3688 var inlinedFunctionsTable = m['_inlinedFunctions']; | 3646 var inlinedFunctionsTable = m['_inlinedFunctions']; |
| 3689 var inlinedIntervals = m['_inlinedIntervals']; | 3647 var inlinedIntervals = m['_inlinedIntervals']; |
| 3690 if (inlinedFunctionsTable != null) { | 3648 if (inlinedFunctionsTable != null) { |
| 3691 // Iterate and upgrade each ServiceFunction. | 3649 // Iterate and upgrade each ServiceFunction. |
| 3692 for (var i = 0; i < inlinedFunctionsTable.length; i++) { | 3650 for (var i = 0; i < inlinedFunctionsTable.length; i++) { |
| 3693 // Upgrade each function and set it back in the list. | 3651 // Upgrade each function and set it back in the list. |
| 3694 var func = isolate.getFromMap(inlinedFunctionsTable[i]); | 3652 var func = isolate.getFromMap(inlinedFunctionsTable[i]); |
| 3695 inlinedFunctionsTable[i] = func; | 3653 inlinedFunctionsTable[i] = func; |
| 3696 if (!inlinedFunctions.contains(func)) { | 3654 if (!inlinedFunctions.contains(func)) { |
| (...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3794 'Could not find instruction with pc descriptor address: $address'); | 3752 'Could not find instruction with pc descriptor address: $address'); |
| 3795 } | 3753 } |
| 3796 } | 3754 } |
| 3797 } | 3755 } |
| 3798 | 3756 |
| 3799 /// Returns true if [address] is contained inside [this]. | 3757 /// Returns true if [address] is contained inside [this]. |
| 3800 bool contains(int address) { | 3758 bool contains(int address) { |
| 3801 return (address >= startAddress) && (address < endAddress); | 3759 return (address >= startAddress) && (address < endAddress); |
| 3802 } | 3760 } |
| 3803 | 3761 |
| 3804 @reflectable bool get isDartCode => (kind == CodeKind.Dart) || | 3762 @reflectable bool get isDartCode => (kind == M.CodeKind.dart) || |
| 3805 (kind == CodeKind.Stub); | 3763 (kind == M.CodeKind.stub); |
| 3806 | 3764 |
| 3807 String toString() => 'Code($kind, $name)'; | 3765 String toString() => 'Code($kind, $name)'; |
| 3808 } | 3766 } |
| 3809 | 3767 |
| 3810 | 3768 |
| 3811 class SocketKind { | 3769 class SocketKind { |
| 3812 final _value; | 3770 final _value; |
| 3813 const SocketKind._internal(this._value); | 3771 const SocketKind._internal(this._value); |
| 3814 String toString() => '$_value'; | 3772 String toString() => '$_value'; |
| 3815 | 3773 |
| (...skipping 319 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4135 var v = list[i]; | 4093 var v = list[i]; |
| 4136 if ((v is ObservableMap) && _isServiceMap(v)) { | 4094 if ((v is ObservableMap) && _isServiceMap(v)) { |
| 4137 list[i] = owner.getFromMap(v); | 4095 list[i] = owner.getFromMap(v); |
| 4138 } else if (v is ObservableList) { | 4096 } else if (v is ObservableList) { |
| 4139 _upgradeObservableList(v, owner); | 4097 _upgradeObservableList(v, owner); |
| 4140 } else if (v is ObservableMap) { | 4098 } else if (v is ObservableMap) { |
| 4141 _upgradeObservableMap(v, owner); | 4099 _upgradeObservableMap(v, owner); |
| 4142 } | 4100 } |
| 4143 } | 4101 } |
| 4144 } | 4102 } |
| OLD | NEW |