| 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 /// An RpcException represents an exceptional event that happened | 7 /// An RpcException represents an exceptional event that happened |
| 8 /// while invoking an rpc. | 8 /// while invoking an rpc. |
| 9 abstract class RpcException implements Exception { | 9 abstract class RpcException implements Exception { |
| 10 RpcException(this.message); | 10 RpcException(this.message); |
| (...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 95 String _id; | 95 String _id; |
| 96 | 96 |
| 97 /// The user-level type of this object. | 97 /// The user-level type of this object. |
| 98 @reflectable String get type => _type; | 98 @reflectable String get type => _type; |
| 99 String _type; | 99 String _type; |
| 100 | 100 |
| 101 /// The vm type of this object. | 101 /// The vm type of this object. |
| 102 @reflectable String get vmType => _vmType; | 102 @reflectable String get vmType => _vmType; |
| 103 String _vmType; | 103 String _vmType; |
| 104 | 104 |
| 105 bool get isICData => vmType == 'ICData'; |
| 106 bool get isInstructions => vmType == 'Instructions'; |
| 107 bool get isObjectPool => vmType == 'ObjectPool'; |
| 105 bool get isContext => type == 'Context'; | 108 bool get isContext => type == 'Context'; |
| 106 bool get isError => type == 'Error'; | 109 bool get isError => type == 'Error'; |
| 107 bool get isInstance => type == 'Instance'; | 110 bool get isInstance => type == 'Instance'; |
| 108 bool get isSentinel => type == 'Sentinel'; | 111 bool get isSentinel => type == 'Sentinel'; |
| 109 bool get isMessage => type == 'Message'; | 112 bool get isMessage => type == 'Message'; |
| 110 | 113 |
| 111 // Kinds of Instance. | 114 // Kinds of Instance. |
| 112 bool get isAbstractType => false; | 115 bool get isAbstractType => false; |
| 113 bool get isNull => false; | 116 bool get isNull => false; |
| 114 bool get isBool => false; | 117 bool get isBool => false; |
| (...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 196 obj = new Library._empty(owner); | 199 obj = new Library._empty(owner); |
| 197 break; | 200 break; |
| 198 case 'Message': | 201 case 'Message': |
| 199 obj = new ServiceMessage._empty(owner); | 202 obj = new ServiceMessage._empty(owner); |
| 200 break; | 203 break; |
| 201 case 'SourceLocation': | 204 case 'SourceLocation': |
| 202 obj = new SourceLocation._empty(owner); | 205 obj = new SourceLocation._empty(owner); |
| 203 break; | 206 break; |
| 204 case 'Object': | 207 case 'Object': |
| 205 switch (vmType) { | 208 switch (vmType) { |
| 206 case 'PcDescriptors': | 209 case 'ICData': |
| 207 obj = new PcDescriptors._empty(owner); | 210 obj = new ICData._empty(owner); |
| 211 break; |
| 212 case 'Instructions': |
| 213 obj = new Instructions._empty(owner); |
| 208 break; | 214 break; |
| 209 case 'LocalVarDescriptors': | 215 case 'LocalVarDescriptors': |
| 210 obj = new LocalVarDescriptors._empty(owner); | 216 obj = new LocalVarDescriptors._empty(owner); |
| 211 break; | 217 break; |
| 218 case 'ObjectPool': |
| 219 obj = new ObjectPool._empty(owner); |
| 220 break; |
| 221 case 'PcDescriptors': |
| 222 obj = new PcDescriptors._empty(owner); |
| 223 break; |
| 212 case 'TokenStream': | 224 case 'TokenStream': |
| 213 obj = new TokenStream._empty(owner); | 225 obj = new TokenStream._empty(owner); |
| 214 break; | 226 break; |
| 215 } | 227 } |
| 216 break; | 228 break; |
| 217 case 'Event': | 229 case 'Event': |
| 218 obj = new ServiceEvent._empty(owner); | 230 obj = new ServiceEvent._empty(owner); |
| 219 break; | 231 break; |
| 220 case 'Script': | 232 case 'Script': |
| 221 obj = new Script._empty(owner); | 233 obj = new Script._empty(owner); |
| (...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 329 | 341 |
| 330 // Updates internal state from [map]. [map] can be a reference. | 342 // Updates internal state from [map]. [map] can be a reference. |
| 331 void _update(ObservableMap map, bool mapIsRef); | 343 void _update(ObservableMap map, bool mapIsRef); |
| 332 | 344 |
| 333 // Helper that can be passed to .catchError that ignores the error. | 345 // Helper that can be passed to .catchError that ignores the error. |
| 334 _ignoreError(error, stackTrace) { | 346 _ignoreError(error, stackTrace) { |
| 335 // do nothing. | 347 // do nothing. |
| 336 } | 348 } |
| 337 } | 349 } |
| 338 | 350 |
| 351 abstract class HeapObject extends ServiceObject { |
| 352 @observable Class clazz; |
| 353 @observable int size; |
| 354 @observable int retainedSize; |
| 355 |
| 356 HeapObject._empty(ServiceObjectOwner owner) : super._empty(owner); |
| 357 } |
| 358 |
| 339 abstract class Coverage { | 359 abstract class Coverage { |
| 340 // Following getters and functions will be provided by [ServiceObject]. | 360 // Following getters and functions will be provided by [ServiceObject]. |
| 341 String get id; | 361 String get id; |
| 342 Isolate get isolate; | 362 Isolate get isolate; |
| 343 | 363 |
| 344 Future refreshCoverage() { | 364 Future refreshCoverage() { |
| 345 return refreshCallSiteData(); | 365 return refreshCallSiteData(); |
| 346 } | 366 } |
| 347 | 367 |
| 348 /// Default handler for coverage data. | 368 /// Default handler for coverage data. |
| (...skipping 1581 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1930 bool get isPlainInstance => kind == 'PlainInstance'; | 1950 bool get isPlainInstance => kind == 'PlainInstance'; |
| 1931 | 1951 |
| 1932 Instance._empty(ServiceObjectOwner owner) : super._empty(owner); | 1952 Instance._empty(ServiceObjectOwner owner) : super._empty(owner); |
| 1933 | 1953 |
| 1934 void _update(ObservableMap map, bool mapIsRef) { | 1954 void _update(ObservableMap map, bool mapIsRef) { |
| 1935 // Extract full properties. | 1955 // Extract full properties. |
| 1936 _upgradeCollection(map, isolate); | 1956 _upgradeCollection(map, isolate); |
| 1937 | 1957 |
| 1938 kind = map['kind']; | 1958 kind = map['kind']; |
| 1939 clazz = map['class']; | 1959 clazz = map['class']; |
| 1940 size = map['size']; | |
| 1941 valueAsString = map['valueAsString']; | 1960 valueAsString = map['valueAsString']; |
| 1942 // Coerce absence to false. | 1961 // Coerce absence to false. |
| 1943 valueAsStringIsTruncated = map['valueAsStringIsTruncated'] == true; | 1962 valueAsStringIsTruncated = map['valueAsStringIsTruncated'] == true; |
| 1944 function = map['closureFunction']; | 1963 function = map['closureFunction']; |
| 1945 context = map['closureContext']; | 1964 context = map['closureContext']; |
| 1946 name = map['name']; | 1965 name = map['name']; |
| 1947 length = map['length']; | 1966 length = map['length']; |
| 1948 pattern = map['pattern']; | 1967 pattern = map['pattern']; |
| 1949 | 1968 |
| 1950 if (mapIsRef) { | 1969 if (mapIsRef) { |
| 1951 return; | 1970 return; |
| 1952 } | 1971 } |
| 1953 | 1972 |
| 1973 size = map['size']; |
| 1974 |
| 1954 oneByteFunction = map['_oneByteFunction']; | 1975 oneByteFunction = map['_oneByteFunction']; |
| 1955 twoByteFunction = map['_twoByteFunction']; | 1976 twoByteFunction = map['_twoByteFunction']; |
| 1956 externalOneByteFunction = map['_externalOneByteFunction']; | 1977 externalOneByteFunction = map['_externalOneByteFunction']; |
| 1957 externalTwoByteFunction = map['_externalTwoByteFunction']; | 1978 externalTwoByteFunction = map['_externalTwoByteFunction']; |
| 1958 | 1979 |
| 1959 nativeFields = map['_nativeFields']; | 1980 nativeFields = map['_nativeFields']; |
| 1960 fields = map['fields']; | 1981 fields = map['fields']; |
| 1961 elements = map['elements']; | 1982 elements = map['elements']; |
| 1962 associations = map['associations']; | 1983 associations = map['associations']; |
| 1963 if (map['bytes'] != null) { | 1984 if (map['bytes'] != null) { |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2028 @observable var parentContext; | 2049 @observable var parentContext; |
| 2029 @observable int length; | 2050 @observable int length; |
| 2030 @observable var variables; | 2051 @observable var variables; |
| 2031 | 2052 |
| 2032 Context._empty(ServiceObjectOwner owner) : super._empty(owner); | 2053 Context._empty(ServiceObjectOwner owner) : super._empty(owner); |
| 2033 | 2054 |
| 2034 void _update(ObservableMap map, bool mapIsRef) { | 2055 void _update(ObservableMap map, bool mapIsRef) { |
| 2035 // Extract full properties. | 2056 // Extract full properties. |
| 2036 _upgradeCollection(map, isolate); | 2057 _upgradeCollection(map, isolate); |
| 2037 | 2058 |
| 2038 size = map['size']; | |
| 2039 length = map['length']; | 2059 length = map['length']; |
| 2040 parentContext = map['parent']; | 2060 parentContext = map['parent']; |
| 2041 | 2061 |
| 2042 if (mapIsRef) { | 2062 if (mapIsRef) { |
| 2043 return; | 2063 return; |
| 2044 } | 2064 } |
| 2045 | 2065 |
| 2066 size = map['size']; |
| 2046 clazz = map['class']; | 2067 clazz = map['class']; |
| 2047 variables = map['variables']; | 2068 variables = map['variables']; |
| 2048 | 2069 |
| 2049 // We are fully loaded. | 2070 // We are fully loaded. |
| 2050 _loaded = true; | 2071 _loaded = true; |
| 2051 } | 2072 } |
| 2052 | 2073 |
| 2053 String toString() => 'Context($length)'; | 2074 String toString() => 'Context($length)'; |
| 2054 } | 2075 } |
| 2055 | 2076 |
| (...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2117 @observable Code code; | 2138 @observable Code code; |
| 2118 @observable Code unoptimizedCode; | 2139 @observable Code unoptimizedCode; |
| 2119 @observable bool isOptimizable; | 2140 @observable bool isOptimizable; |
| 2120 @observable bool isInlinable; | 2141 @observable bool isInlinable; |
| 2121 @observable FunctionKind kind; | 2142 @observable FunctionKind kind; |
| 2122 @observable int deoptimizations; | 2143 @observable int deoptimizations; |
| 2123 @observable String qualifiedName; | 2144 @observable String qualifiedName; |
| 2124 @observable int usageCounter; | 2145 @observable int usageCounter; |
| 2125 @observable bool isDart; | 2146 @observable bool isDart; |
| 2126 @observable ProfileFunction profile; | 2147 @observable ProfileFunction profile; |
| 2148 @observable Instance icDataArray; |
| 2127 | 2149 |
| 2128 bool get immutable => false; | 2150 bool get immutable => false; |
| 2129 | 2151 |
| 2130 ServiceFunction._empty(ServiceObject owner) : super._empty(owner); | 2152 ServiceFunction._empty(ServiceObject owner) : super._empty(owner); |
| 2131 | 2153 |
| 2132 void _update(ObservableMap map, bool mapIsRef) { | 2154 void _update(ObservableMap map, bool mapIsRef) { |
| 2133 name = map['name']; | 2155 name = map['name']; |
| 2134 vmName = (map.containsKey('vmName') ? map['vmName'] : name); | 2156 vmName = (map.containsKey('vmName') ? map['vmName'] : name); |
| 2135 | 2157 |
| 2136 _upgradeCollection(map, isolate); | 2158 _upgradeCollection(map, isolate); |
| 2137 | 2159 |
| 2138 dartOwner = map['owner']; | 2160 dartOwner = map['owner']; |
| 2139 kind = FunctionKind.fromJSON(map['_kind']); | 2161 kind = FunctionKind.fromJSON(map['_kind']); |
| 2140 isDart = !kind.isSynthetic(); | 2162 isDart = kind.isDart(); |
| 2141 | 2163 |
| 2142 if (dartOwner is ServiceFunction) { | 2164 if (dartOwner is ServiceFunction) { |
| 2143 ServiceFunction ownerFunction = dartOwner; | 2165 ServiceFunction ownerFunction = dartOwner; |
| 2144 library = ownerFunction.library; | 2166 library = ownerFunction.library; |
| 2145 qualifiedName = "${ownerFunction.qualifiedName}.${name}"; | 2167 qualifiedName = "${ownerFunction.qualifiedName}.${name}"; |
| 2146 | 2168 |
| 2147 } else if (dartOwner is Class) { | 2169 } else if (dartOwner is Class) { |
| 2148 Class ownerClass = dartOwner; | 2170 Class ownerClass = dartOwner; |
| 2149 library = ownerClass.library; | 2171 library = ownerClass.library; |
| 2150 qualifiedName = "${ownerClass.name}.${name}"; | 2172 qualifiedName = "${ownerClass.name}.${name}"; |
| (...skipping 10 matching lines...) Expand all Loading... |
| 2161 _loaded = true; | 2183 _loaded = true; |
| 2162 isStatic = map['static']; | 2184 isStatic = map['static']; |
| 2163 isConst = map['const']; | 2185 isConst = map['const']; |
| 2164 location = map['location']; | 2186 location = map['location']; |
| 2165 code = map['code']; | 2187 code = map['code']; |
| 2166 isOptimizable = map['_optimizable']; | 2188 isOptimizable = map['_optimizable']; |
| 2167 isInlinable = map['_inlinable']; | 2189 isInlinable = map['_inlinable']; |
| 2168 unoptimizedCode = map['_unoptimizedCode']; | 2190 unoptimizedCode = map['_unoptimizedCode']; |
| 2169 deoptimizations = map['_deoptimizations']; | 2191 deoptimizations = map['_deoptimizations']; |
| 2170 usageCounter = map['_usageCounter']; | 2192 usageCounter = map['_usageCounter']; |
| 2193 icDataArray = map['_icDataArray']; |
| 2171 } | 2194 } |
| 2172 } | 2195 } |
| 2173 | 2196 |
| 2174 | 2197 |
| 2175 class Field extends ServiceObject { | 2198 class Field extends ServiceObject { |
| 2176 // Library or Class. | 2199 // Library or Class. |
| 2177 @observable ServiceObject dartOwner; | 2200 @observable ServiceObject dartOwner; |
| 2178 @observable Library library; | 2201 @observable Library library; |
| 2179 @observable Instance declaredType; | 2202 @observable Instance declaredType; |
| 2180 @observable bool isStatic; | 2203 @observable bool isStatic; |
| (...skipping 574 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2755 var beginPos = descriptor['beginPos']; | 2778 var beginPos = descriptor['beginPos']; |
| 2756 var endPos = descriptor['endPos']; | 2779 var endPos = descriptor['endPos']; |
| 2757 var scopeId = descriptor['scopeId']; | 2780 var scopeId = descriptor['scopeId']; |
| 2758 var kind = descriptor['kind'].trim(); | 2781 var kind = descriptor['kind'].trim(); |
| 2759 descriptors.add( | 2782 descriptors.add( |
| 2760 new LocalVarDescriptor(name, index, beginPos, endPos, scopeId, kind)); | 2783 new LocalVarDescriptor(name, index, beginPos, endPos, scopeId, kind)); |
| 2761 } | 2784 } |
| 2762 } | 2785 } |
| 2763 } | 2786 } |
| 2764 | 2787 |
| 2765 class TokenStream extends ServiceObject { | 2788 class ObjectPool extends HeapObject { |
| 2766 @observable Class clazz; | 2789 bool get canCache => false; |
| 2767 @observable int size; | 2790 bool get immutable => false; |
| 2791 |
| 2792 @observable int length; |
| 2793 @observable List entries; |
| 2794 |
| 2795 ObjectPool._empty(ServiceObjectOwner owner) : super._empty(owner); |
| 2796 |
| 2797 void _update(ObservableMap m, bool mapIsRef) { |
| 2798 _upgradeCollection(m, isolate); |
| 2799 clazz = m['class']; |
| 2800 length = m['length']; |
| 2801 if (mapIsRef) { |
| 2802 return; |
| 2803 } |
| 2804 size = m['size']; |
| 2805 entries = m['_entries']; |
| 2806 } |
| 2807 } |
| 2808 |
| 2809 class ICData extends HeapObject { |
| 2810 @observable ServiceObject dartOwner; |
| 2811 @observable String selector; |
| 2812 @observable Instance argumentsDescriptor; |
| 2813 @observable Instance entries; |
| 2814 |
| 2815 bool get canCache => false; |
| 2816 bool get immutable => false; |
| 2817 |
| 2818 ICData._empty(ServiceObjectOwner owner) : super._empty(owner); |
| 2819 |
| 2820 void _update(ObservableMap m, bool mapIsRef) { |
| 2821 _upgradeCollection(m, isolate); |
| 2822 clazz = m['class']; |
| 2823 dartOwner = m['_owner']; |
| 2824 selector = m['_selector']; |
| 2825 if (mapIsRef) { |
| 2826 return; |
| 2827 } |
| 2828 size = m['size']; |
| 2829 argumentsDescriptor = m['_argumentsDescriptor']; |
| 2830 entries = m['_entries']; |
| 2831 } |
| 2832 } |
| 2833 |
| 2834 class Instructions extends HeapObject { |
| 2768 bool get canCache => false; | 2835 bool get canCache => false; |
| 2769 bool get immutable => true; | 2836 bool get immutable => true; |
| 2770 | 2837 |
| 2838 @observable Code code; |
| 2839 @observable ObjectPool objectPool; |
| 2840 |
| 2841 Instructions._empty(ServiceObjectOwner owner) : super._empty(owner); |
| 2842 |
| 2843 void _update(ObservableMap m, bool mapIsRef) { |
| 2844 _upgradeCollection(m, isolate); |
| 2845 clazz = m['class']; |
| 2846 code = m['_code']; |
| 2847 if (mapIsRef) { |
| 2848 return; |
| 2849 } |
| 2850 size = m['size']; |
| 2851 objectPool = m['_objectPool']; |
| 2852 } |
| 2853 } |
| 2854 |
| 2855 class TokenStream extends HeapObject { |
| 2856 bool get canCache => false; |
| 2857 bool get immutable => true; |
| 2858 |
| 2771 @observable String privateKey; | 2859 @observable String privateKey; |
| 2772 | 2860 |
| 2773 TokenStream._empty(ServiceObjectOwner owner) : super._empty(owner); | 2861 TokenStream._empty(ServiceObjectOwner owner) : super._empty(owner); |
| 2774 | 2862 |
| 2775 void _update(ObservableMap m, bool mapIsRef) { | 2863 void _update(ObservableMap m, bool mapIsRef) { |
| 2776 if (mapIsRef) { | 2864 if (mapIsRef) { |
| 2777 return; | 2865 return; |
| 2778 } | 2866 } |
| 2779 _upgradeCollection(m, isolate); | 2867 _upgradeCollection(m, isolate); |
| 2780 clazz = m['class']; | 2868 clazz = m['class']; |
| (...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2863 } | 2951 } |
| 2864 | 2952 |
| 2865 class CodeInlineInterval { | 2953 class CodeInlineInterval { |
| 2866 final int start; | 2954 final int start; |
| 2867 final int end; | 2955 final int end; |
| 2868 final List<ServiceFunction> functions = new List<ServiceFunction>(); | 2956 final List<ServiceFunction> functions = new List<ServiceFunction>(); |
| 2869 bool contains(int pc) => (pc >= start) && (pc < end); | 2957 bool contains(int pc) => (pc >= start) && (pc < end); |
| 2870 CodeInlineInterval(this.start, this.end); | 2958 CodeInlineInterval(this.start, this.end); |
| 2871 } | 2959 } |
| 2872 | 2960 |
| 2873 class Code extends ServiceObject { | 2961 class Code extends HeapObject { |
| 2874 @observable CodeKind kind; | 2962 @observable CodeKind kind; |
| 2875 @observable ServiceObject objectPool; | 2963 @observable ServiceObject objectPool; |
| 2876 @observable ServiceFunction function; | 2964 @observable ServiceFunction function; |
| 2877 @observable Script script; | 2965 @observable Script script; |
| 2878 @observable bool isOptimized = false; | 2966 @observable bool isOptimized = false; |
| 2879 @reflectable int startAddress = 0; | 2967 @reflectable int startAddress = 0; |
| 2880 @reflectable int endAddress = 0; | 2968 @reflectable int endAddress = 0; |
| 2881 @reflectable final instructions = new ObservableList<CodeInstruction>(); | 2969 @reflectable final instructions = new ObservableList<CodeInstruction>(); |
| 2882 List<CodeInstruction> instructionsByAddressOffset; | 2970 List<CodeInstruction> instructionsByAddressOffset; |
| 2883 | 2971 |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2942 | 3030 |
| 2943 void _update(ObservableMap m, bool mapIsRef) { | 3031 void _update(ObservableMap m, bool mapIsRef) { |
| 2944 name = m['name']; | 3032 name = m['name']; |
| 2945 vmName = (m.containsKey('vmName') ? m['vmName'] : name); | 3033 vmName = (m.containsKey('vmName') ? m['vmName'] : name); |
| 2946 isOptimized = m['_optimized']; | 3034 isOptimized = m['_optimized']; |
| 2947 kind = CodeKind.fromString(m['kind']); | 3035 kind = CodeKind.fromString(m['kind']); |
| 2948 if (mapIsRef) { | 3036 if (mapIsRef) { |
| 2949 return; | 3037 return; |
| 2950 } | 3038 } |
| 2951 _loaded = true; | 3039 _loaded = true; |
| 3040 size = m['size']; |
| 2952 startAddress = int.parse(m['_startAddress'], radix:16); | 3041 startAddress = int.parse(m['_startAddress'], radix:16); |
| 2953 endAddress = int.parse(m['_endAddress'], radix:16); | 3042 endAddress = int.parse(m['_endAddress'], radix:16); |
| 2954 function = isolate.getFromMap(m['function']); | 3043 function = isolate.getFromMap(m['function']); |
| 2955 objectPool = isolate.getFromMap(m['_objectPool']); | 3044 objectPool = isolate.getFromMap(m['_objectPool']); |
| 2956 var disassembly = m['_disassembly']; | 3045 var disassembly = m['_disassembly']; |
| 2957 if (disassembly != null) { | 3046 if (disassembly != null) { |
| 2958 _processDisassembly(disassembly); | 3047 _processDisassembly(disassembly); |
| 2959 } | 3048 } |
| 2960 var descriptors = m['_descriptors']; | 3049 var descriptors = m['_descriptors']; |
| 2961 if (descriptors != null) { | 3050 if (descriptors != null) { |
| (...skipping 402 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3364 var v = list[i]; | 3453 var v = list[i]; |
| 3365 if ((v is ObservableMap) && _isServiceMap(v)) { | 3454 if ((v is ObservableMap) && _isServiceMap(v)) { |
| 3366 list[i] = owner.getFromMap(v); | 3455 list[i] = owner.getFromMap(v); |
| 3367 } else if (v is ObservableList) { | 3456 } else if (v is ObservableList) { |
| 3368 _upgradeObservableList(v, owner); | 3457 _upgradeObservableList(v, owner); |
| 3369 } else if (v is ObservableMap) { | 3458 } else if (v is ObservableMap) { |
| 3370 _upgradeObservableMap(v, owner); | 3459 _upgradeObservableMap(v, owner); |
| 3371 } | 3460 } |
| 3372 } | 3461 } |
| 3373 } | 3462 } |
| OLD | NEW |