| OLD | NEW |
| 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 library dart2js.constants.values; | 5 library dart2js.constants.values; |
| 6 | 6 |
| 7 import '../common.dart'; | 7 import '../common.dart'; |
| 8 import '../core_types.dart'; | 8 import '../core_types.dart'; |
| 9 import '../dart_types.dart'; | 9 import '../dart_types.dart'; |
| 10 import '../elements/elements.dart' | 10 import '../elements/elements.dart' |
| 11 show ClassElement, | 11 show ClassElement, Element, FieldElement, FunctionElement, PrefixElement; |
| 12 Element, | |
| 13 FieldElement, | |
| 14 FunctionElement, | |
| 15 PrefixElement; | |
| 16 import '../tree/tree.dart' hide unparse; | 12 import '../tree/tree.dart' hide unparse; |
| 17 import '../util/util.dart' show Hashing; | 13 import '../util/util.dart' show Hashing; |
| 18 | 14 |
| 19 abstract class ConstantValueVisitor<R, A> { | 15 abstract class ConstantValueVisitor<R, A> { |
| 20 const ConstantValueVisitor(); | 16 const ConstantValueVisitor(); |
| 21 | 17 |
| 22 R visitFunction(FunctionConstantValue constant, A arg); | 18 R visitFunction(FunctionConstantValue constant, A arg); |
| 23 R visitNull(NullConstantValue constant, A arg); | 19 R visitNull(NullConstantValue constant, A arg); |
| 24 R visitInt(IntConstantValue constant, A arg); | 20 R visitInt(IntConstantValue constant, A arg); |
| 25 R visitDouble(DoubleConstantValue constant, A arg); | 21 R visitDouble(DoubleConstantValue constant, A arg); |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 82 /// For the synthetic constants, [DeferredConstantValue], | 78 /// For the synthetic constants, [DeferredConstantValue], |
| 83 /// [SyntheticConstantValue], [InterceptorConstantValue] the unparse is | 79 /// [SyntheticConstantValue], [InterceptorConstantValue] the unparse is |
| 84 /// descriptive only. | 80 /// descriptive only. |
| 85 String unparse(); | 81 String unparse(); |
| 86 | 82 |
| 87 /// Returns a structured representation of this constant suited for debugging. | 83 /// Returns a structured representation of this constant suited for debugging. |
| 88 String toStructuredString(); | 84 String toStructuredString(); |
| 89 | 85 |
| 90 String toString() { | 86 String toString() { |
| 91 assertDebugMode("Use Constant.unparse() or Constant.toStructuredString() " | 87 assertDebugMode("Use Constant.unparse() or Constant.toStructuredString() " |
| 92 "instead of Constant.toString()."); | 88 "instead of Constant.toString()."); |
| 93 return toStructuredString(); | 89 return toStructuredString(); |
| 94 } | 90 } |
| 95 } | 91 } |
| 96 | 92 |
| 97 class FunctionConstantValue extends ConstantValue { | 93 class FunctionConstantValue extends ConstantValue { |
| 98 FunctionElement element; | 94 FunctionElement element; |
| 99 | 95 |
| 100 FunctionConstantValue(this.element) { | 96 FunctionConstantValue(this.element) { |
| 101 assert(element.type != null); | 97 assert(element.type != null); |
| 102 } | 98 } |
| 103 | 99 |
| 104 bool get isFunction => true; | 100 bool get isFunction => true; |
| 105 | 101 |
| 106 bool operator ==(var other) { | 102 bool operator ==(var other) { |
| 107 if (other is !FunctionConstantValue) return false; | 103 if (other is! FunctionConstantValue) return false; |
| 108 return identical(other.element, element); | 104 return identical(other.element, element); |
| 109 } | 105 } |
| 110 | 106 |
| 111 List<ConstantValue> getDependencies() => const <ConstantValue>[]; | 107 List<ConstantValue> getDependencies() => const <ConstantValue>[]; |
| 112 | 108 |
| 113 DartString toDartString() { | 109 DartString toDartString() { |
| 114 return new DartString.literal(element.name); | 110 return new DartString.literal(element.name); |
| 115 } | 111 } |
| 116 | 112 |
| 117 DartType getType(CoreTypes types) => element.type; | 113 DartType getType(CoreTypes types) => element.type; |
| (...skipping 16 matching lines...) Expand all Loading... |
| 134 } | 130 } |
| 135 | 131 |
| 136 abstract class PrimitiveConstantValue extends ConstantValue { | 132 abstract class PrimitiveConstantValue extends ConstantValue { |
| 137 get primitiveValue; | 133 get primitiveValue; |
| 138 | 134 |
| 139 const PrimitiveConstantValue(); | 135 const PrimitiveConstantValue(); |
| 140 | 136 |
| 141 bool get isPrimitive => true; | 137 bool get isPrimitive => true; |
| 142 | 138 |
| 143 bool operator ==(var other) { | 139 bool operator ==(var other) { |
| 144 if (other is !PrimitiveConstantValue) return false; | 140 if (other is! PrimitiveConstantValue) return false; |
| 145 PrimitiveConstantValue otherPrimitive = other; | 141 PrimitiveConstantValue otherPrimitive = other; |
| 146 // We use == instead of 'identical' so that DartStrings compare correctly. | 142 // We use == instead of 'identical' so that DartStrings compare correctly. |
| 147 return primitiveValue == otherPrimitive.primitiveValue; | 143 return primitiveValue == otherPrimitive.primitiveValue; |
| 148 } | 144 } |
| 149 | 145 |
| 150 int get hashCode => throw new UnsupportedError('PrimitiveConstant.hashCode'); | 146 int get hashCode => throw new UnsupportedError('PrimitiveConstant.hashCode'); |
| 151 | 147 |
| 152 // Primitive constants don't have dependencies. | 148 // Primitive constants don't have dependencies. |
| 153 List<ConstantValue> getDependencies() => const <ConstantValue>[]; | 149 List<ConstantValue> getDependencies() => const <ConstantValue>[]; |
| 154 | 150 |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 188 num get primitiveValue; | 184 num get primitiveValue; |
| 189 | 185 |
| 190 bool get isNum => true; | 186 bool get isNum => true; |
| 191 } | 187 } |
| 192 | 188 |
| 193 class IntConstantValue extends NumConstantValue { | 189 class IntConstantValue extends NumConstantValue { |
| 194 final int primitiveValue; | 190 final int primitiveValue; |
| 195 | 191 |
| 196 factory IntConstantValue(int value) { | 192 factory IntConstantValue(int value) { |
| 197 switch (value) { | 193 switch (value) { |
| 198 case 0: return const IntConstantValue._internal(0); | 194 case 0: |
| 199 case 1: return const IntConstantValue._internal(1); | 195 return const IntConstantValue._internal(0); |
| 200 case 2: return const IntConstantValue._internal(2); | 196 case 1: |
| 201 case 3: return const IntConstantValue._internal(3); | 197 return const IntConstantValue._internal(1); |
| 202 case 4: return const IntConstantValue._internal(4); | 198 case 2: |
| 203 case 5: return const IntConstantValue._internal(5); | 199 return const IntConstantValue._internal(2); |
| 204 case 6: return const IntConstantValue._internal(6); | 200 case 3: |
| 205 case 7: return const IntConstantValue._internal(7); | 201 return const IntConstantValue._internal(3); |
| 206 case 8: return const IntConstantValue._internal(8); | 202 case 4: |
| 207 case 9: return const IntConstantValue._internal(9); | 203 return const IntConstantValue._internal(4); |
| 208 case 10: return const IntConstantValue._internal(10); | 204 case 5: |
| 209 case -1: return const IntConstantValue._internal(-1); | 205 return const IntConstantValue._internal(5); |
| 210 case -2: return const IntConstantValue._internal(-2); | 206 case 6: |
| 211 default: return new IntConstantValue._internal(value); | 207 return const IntConstantValue._internal(6); |
| 208 case 7: |
| 209 return const IntConstantValue._internal(7); |
| 210 case 8: |
| 211 return const IntConstantValue._internal(8); |
| 212 case 9: |
| 213 return const IntConstantValue._internal(9); |
| 214 case 10: |
| 215 return const IntConstantValue._internal(10); |
| 216 case -1: |
| 217 return const IntConstantValue._internal(-1); |
| 218 case -2: |
| 219 return const IntConstantValue._internal(-2); |
| 220 default: |
| 221 return new IntConstantValue._internal(value); |
| 212 } | 222 } |
| 213 } | 223 } |
| 214 | 224 |
| 215 const IntConstantValue._internal(this.primitiveValue); | 225 const IntConstantValue._internal(this.primitiveValue); |
| 216 | 226 |
| 217 bool get isInt => true; | 227 bool get isInt => true; |
| 218 | 228 |
| 219 bool isUInt31() => primitiveValue >= 0 && primitiveValue < (1 << 31); | 229 bool isUInt31() => primitiveValue >= 0 && primitiveValue < (1 << 31); |
| 220 | 230 |
| 221 bool isUInt32() => primitiveValue >= 0 && primitiveValue < (1 << 32); | 231 bool isUInt32() => primitiveValue >= 0 && primitiveValue < (1 << 32); |
| 222 | 232 |
| 223 bool isPositive() => primitiveValue >= 0; | 233 bool isPositive() => primitiveValue >= 0; |
| 224 | 234 |
| 225 bool get isZero => primitiveValue == 0; | 235 bool get isZero => primitiveValue == 0; |
| 226 | 236 |
| 227 bool get isOne => primitiveValue == 1; | 237 bool get isOne => primitiveValue == 1; |
| 228 | 238 |
| 229 DartType getType(CoreTypes types) => types.intType; | 239 DartType getType(CoreTypes types) => types.intType; |
| 230 | 240 |
| 231 // We have to override the equality operator so that ints and doubles are | 241 // We have to override the equality operator so that ints and doubles are |
| 232 // treated as separate constants. | 242 // treated as separate constants. |
| 233 // The is [:!IntConstant:] check at the beginning of the function makes sure | 243 // The is [:!IntConstant:] check at the beginning of the function makes sure |
| 234 // that we compare only equal to integer constants. | 244 // that we compare only equal to integer constants. |
| 235 bool operator ==(var other) { | 245 bool operator ==(var other) { |
| 236 if (other is !IntConstantValue) return false; | 246 if (other is! IntConstantValue) return false; |
| 237 IntConstantValue otherInt = other; | 247 IntConstantValue otherInt = other; |
| 238 return primitiveValue == otherInt.primitiveValue; | 248 return primitiveValue == otherInt.primitiveValue; |
| 239 } | 249 } |
| 240 | 250 |
| 241 int get hashCode => primitiveValue & Hashing.SMI_MASK; | 251 int get hashCode => primitiveValue & Hashing.SMI_MASK; |
| 242 | 252 |
| 243 DartString toDartString() { | 253 DartString toDartString() { |
| 244 return new DartString.literal(primitiveValue.toString()); | 254 return new DartString.literal(primitiveValue.toString()); |
| 245 } | 255 } |
| 246 | 256 |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 281 | 291 |
| 282 bool get isOne => primitiveValue == 1.0; | 292 bool get isOne => primitiveValue == 1.0; |
| 283 | 293 |
| 284 bool get isPositiveInfinity => primitiveValue == double.INFINITY; | 294 bool get isPositiveInfinity => primitiveValue == double.INFINITY; |
| 285 | 295 |
| 286 bool get isNegativeInfinity => primitiveValue == -double.INFINITY; | 296 bool get isNegativeInfinity => primitiveValue == -double.INFINITY; |
| 287 | 297 |
| 288 DartType getType(CoreTypes types) => types.doubleType; | 298 DartType getType(CoreTypes types) => types.doubleType; |
| 289 | 299 |
| 290 bool operator ==(var other) { | 300 bool operator ==(var other) { |
| 291 if (other is !DoubleConstantValue) return false; | 301 if (other is! DoubleConstantValue) return false; |
| 292 DoubleConstantValue otherDouble = other; | 302 DoubleConstantValue otherDouble = other; |
| 293 double otherValue = otherDouble.primitiveValue; | 303 double otherValue = otherDouble.primitiveValue; |
| 294 if (primitiveValue == 0.0 && otherValue == 0.0) { | 304 if (primitiveValue == 0.0 && otherValue == 0.0) { |
| 295 return primitiveValue.isNegative == otherValue.isNegative; | 305 return primitiveValue.isNegative == otherValue.isNegative; |
| 296 } else if (primitiveValue.isNaN) { | 306 } else if (primitiveValue.isNaN) { |
| 297 return otherValue.isNaN; | 307 return otherValue.isNaN; |
| 298 } else { | 308 } else { |
| 299 return primitiveValue == otherValue; | 309 return primitiveValue == otherValue; |
| 300 } | 310 } |
| 301 } | 311 } |
| (...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 383 | 393 |
| 384 StringConstantValue.fromString(String value) | 394 StringConstantValue.fromString(String value) |
| 385 : this(new DartString.literal(value)); | 395 : this(new DartString.literal(value)); |
| 386 | 396 |
| 387 bool get isString => true; | 397 bool get isString => true; |
| 388 | 398 |
| 389 DartType getType(CoreTypes types) => types.stringType; | 399 DartType getType(CoreTypes types) => types.stringType; |
| 390 | 400 |
| 391 bool operator ==(var other) { | 401 bool operator ==(var other) { |
| 392 if (identical(this, other)) return true; | 402 if (identical(this, other)) return true; |
| 393 if (other is !StringConstantValue) return false; | 403 if (other is! StringConstantValue) return false; |
| 394 StringConstantValue otherString = other; | 404 StringConstantValue otherString = other; |
| 395 return hashCode == otherString.hashCode && | 405 return hashCode == otherString.hashCode && |
| 396 primitiveValue == otherString.primitiveValue; | 406 primitiveValue == otherString.primitiveValue; |
| 397 } | 407 } |
| 398 | 408 |
| 399 DartString toDartString() => primitiveValue; | 409 DartString toDartString() => primitiveValue; |
| 400 | 410 |
| 401 int get length => primitiveValue.length; | 411 int get length => primitiveValue.length; |
| 402 | 412 |
| 403 accept(ConstantValueVisitor visitor, arg) => visitor.visitString(this, arg); | 413 accept(ConstantValueVisitor visitor, arg) => visitor.visitString(this, arg); |
| 404 | 414 |
| 405 // TODO(johnniwinther): Ensure correct escaping. | 415 // TODO(johnniwinther): Ensure correct escaping. |
| 406 String unparse() => '"${primitiveValue.slowToString()}"'; | 416 String unparse() => '"${primitiveValue.slowToString()}"'; |
| (...skipping 22 matching lines...) Expand all Loading... |
| 429 class TypeConstantValue extends ObjectConstantValue { | 439 class TypeConstantValue extends ObjectConstantValue { |
| 430 /// The user type that this constant represents. | 440 /// The user type that this constant represents. |
| 431 final DartType representedType; | 441 final DartType representedType; |
| 432 | 442 |
| 433 TypeConstantValue(this.representedType, InterfaceType type) : super(type); | 443 TypeConstantValue(this.representedType, InterfaceType type) : super(type); |
| 434 | 444 |
| 435 bool get isType => true; | 445 bool get isType => true; |
| 436 | 446 |
| 437 bool operator ==(other) { | 447 bool operator ==(other) { |
| 438 return other is TypeConstantValue && | 448 return other is TypeConstantValue && |
| 439 representedType == other.representedType; | 449 representedType == other.representedType; |
| 440 } | 450 } |
| 441 | 451 |
| 442 int get hashCode => representedType.hashCode * 13; | 452 int get hashCode => representedType.hashCode * 13; |
| 443 | 453 |
| 444 List<ConstantValue> getDependencies() => const <ConstantValue>[]; | 454 List<ConstantValue> getDependencies() => const <ConstantValue>[]; |
| 445 | 455 |
| 446 accept(ConstantValueVisitor visitor, arg) => visitor.visitType(this, arg); | 456 accept(ConstantValueVisitor visitor, arg) => visitor.visitType(this, arg); |
| 447 | 457 |
| 448 String unparse() => '$representedType'; | 458 String unparse() => '$representedType'; |
| 449 | 459 |
| 450 String toStructuredString() => 'TypeConstant(${representedType})'; | 460 String toStructuredString() => 'TypeConstant(${representedType})'; |
| 451 } | 461 } |
| 452 | 462 |
| 453 class ListConstantValue extends ObjectConstantValue { | 463 class ListConstantValue extends ObjectConstantValue { |
| 454 final List<ConstantValue> entries; | 464 final List<ConstantValue> entries; |
| 455 final int hashCode; | 465 final int hashCode; |
| 456 | 466 |
| 457 ListConstantValue(InterfaceType type, List<ConstantValue> entries) | 467 ListConstantValue(InterfaceType type, List<ConstantValue> entries) |
| 458 : this.entries = entries, | 468 : this.entries = entries, |
| 459 hashCode = Hashing.listHash(entries, Hashing.objectHash(type)), | 469 hashCode = Hashing.listHash(entries, Hashing.objectHash(type)), |
| 460 super(type); | 470 super(type); |
| 461 | 471 |
| 462 bool get isList => true; | 472 bool get isList => true; |
| 463 | 473 |
| 464 bool operator ==(var other) { | 474 bool operator ==(var other) { |
| 465 if (identical(this, other)) return true; | 475 if (identical(this, other)) return true; |
| 466 if (other is !ListConstantValue) return false; | 476 if (other is! ListConstantValue) return false; |
| 467 ListConstantValue otherList = other; | 477 ListConstantValue otherList = other; |
| 468 if (hashCode != otherList.hashCode) return false; | 478 if (hashCode != otherList.hashCode) return false; |
| 469 if (type != otherList.type) return false; | 479 if (type != otherList.type) return false; |
| 470 if (entries.length != otherList.entries.length) return false; | 480 if (entries.length != otherList.entries.length) return false; |
| 471 for (int i = 0; i < entries.length; i++) { | 481 for (int i = 0; i < entries.length; i++) { |
| 472 if (entries[i] != otherList.entries[i]) return false; | 482 if (entries[i] != otherList.entries[i]) return false; |
| 473 } | 483 } |
| 474 return true; | 484 return true; |
| 475 } | 485 } |
| 476 | 486 |
| 477 List<ConstantValue> getDependencies() => entries; | 487 List<ConstantValue> getDependencies() => entries; |
| 478 | 488 |
| 479 int get length => entries.length; | 489 int get length => entries.length; |
| 480 | 490 |
| 481 accept(ConstantValueVisitor visitor, arg) => visitor.visitList(this, arg); | 491 accept(ConstantValueVisitor visitor, arg) => visitor.visitList(this, arg); |
| 482 | 492 |
| 483 String unparse() { | 493 String unparse() { |
| 484 StringBuffer sb = new StringBuffer(); | 494 StringBuffer sb = new StringBuffer(); |
| 485 _unparseTypeArguments(sb); | 495 _unparseTypeArguments(sb); |
| 486 sb.write('['); | 496 sb.write('['); |
| 487 for (int i = 0 ; i < length ; i++) { | 497 for (int i = 0; i < length; i++) { |
| 488 if (i > 0) sb.write(','); | 498 if (i > 0) sb.write(','); |
| 489 sb.write(entries[i].unparse()); | 499 sb.write(entries[i].unparse()); |
| 490 } | 500 } |
| 491 sb.write(']'); | 501 sb.write(']'); |
| 492 return sb.toString(); | 502 return sb.toString(); |
| 493 } | 503 } |
| 494 | 504 |
| 495 String toStructuredString() { | 505 String toStructuredString() { |
| 496 StringBuffer sb = new StringBuffer(); | 506 StringBuffer sb = new StringBuffer(); |
| 497 sb.write('ListConstant('); | 507 sb.write('ListConstant('); |
| 498 _unparseTypeArguments(sb); | 508 _unparseTypeArguments(sb); |
| 499 sb.write('['); | 509 sb.write('['); |
| 500 for (int i = 0 ; i < length ; i++) { | 510 for (int i = 0; i < length; i++) { |
| 501 if (i > 0) sb.write(', '); | 511 if (i > 0) sb.write(', '); |
| 502 sb.write(entries[i].toStructuredString()); | 512 sb.write(entries[i].toStructuredString()); |
| 503 } | 513 } |
| 504 sb.write('])'); | 514 sb.write('])'); |
| 505 return sb.toString(); | 515 return sb.toString(); |
| 506 } | 516 } |
| 507 } | 517 } |
| 508 | 518 |
| 509 class MapConstantValue extends ObjectConstantValue { | 519 class MapConstantValue extends ObjectConstantValue { |
| 510 final List<ConstantValue> keys; | 520 final List<ConstantValue> keys; |
| 511 final List<ConstantValue> values; | 521 final List<ConstantValue> values; |
| 512 final int hashCode; | 522 final int hashCode; |
| 513 Map<ConstantValue, ConstantValue> _lookupMap; | 523 Map<ConstantValue, ConstantValue> _lookupMap; |
| 514 | 524 |
| 515 MapConstantValue(InterfaceType type, | 525 MapConstantValue( |
| 516 List<ConstantValue> keys, | 526 InterfaceType type, List<ConstantValue> keys, List<ConstantValue> values) |
| 517 List<ConstantValue> values) | |
| 518 : this.keys = keys, | 527 : this.keys = keys, |
| 519 this.values = values, | 528 this.values = values, |
| 520 this.hashCode = Hashing.listHash(values, | 529 this.hashCode = Hashing.listHash( |
| 521 Hashing.listHash(keys, | 530 values, Hashing.listHash(keys, Hashing.objectHash(type))), |
| 522 Hashing.objectHash(type))), | |
| 523 super(type) { | 531 super(type) { |
| 524 assert(keys.length == values.length); | 532 assert(keys.length == values.length); |
| 525 } | 533 } |
| 526 | 534 |
| 527 bool get isMap => true; | 535 bool get isMap => true; |
| 528 | 536 |
| 529 bool operator ==(var other) { | 537 bool operator ==(var other) { |
| 530 if (identical(this, other)) return true; | 538 if (identical(this, other)) return true; |
| 531 if (other is !MapConstantValue) return false; | 539 if (other is! MapConstantValue) return false; |
| 532 MapConstantValue otherMap = other; | 540 MapConstantValue otherMap = other; |
| 533 if (hashCode != otherMap.hashCode) return false; | 541 if (hashCode != otherMap.hashCode) return false; |
| 534 if (type != other.type) return false; | 542 if (type != other.type) return false; |
| 535 if (length != other.length) return false; | 543 if (length != other.length) return false; |
| 536 for (int i = 0; i < length; i++) { | 544 for (int i = 0; i < length; i++) { |
| 537 if (keys[i] != otherMap.keys[i]) return false; | 545 if (keys[i] != otherMap.keys[i]) return false; |
| 538 if (values[i] != otherMap.values[i]) return false; | 546 if (values[i] != otherMap.values[i]) return false; |
| 539 } | 547 } |
| 540 return true; | 548 return true; |
| 541 } | 549 } |
| (...skipping 12 matching lines...) Expand all Loading... |
| 554 new Map<ConstantValue, ConstantValue>.fromIterables(keys, values); | 562 new Map<ConstantValue, ConstantValue>.fromIterables(keys, values); |
| 555 return lookupMap[key]; | 563 return lookupMap[key]; |
| 556 } | 564 } |
| 557 | 565 |
| 558 accept(ConstantValueVisitor visitor, arg) => visitor.visitMap(this, arg); | 566 accept(ConstantValueVisitor visitor, arg) => visitor.visitMap(this, arg); |
| 559 | 567 |
| 560 String unparse() { | 568 String unparse() { |
| 561 StringBuffer sb = new StringBuffer(); | 569 StringBuffer sb = new StringBuffer(); |
| 562 _unparseTypeArguments(sb); | 570 _unparseTypeArguments(sb); |
| 563 sb.write('{'); | 571 sb.write('{'); |
| 564 for (int i = 0 ; i < length ; i++) { | 572 for (int i = 0; i < length; i++) { |
| 565 if (i > 0) sb.write(','); | 573 if (i > 0) sb.write(','); |
| 566 sb.write(keys[i].unparse()); | 574 sb.write(keys[i].unparse()); |
| 567 sb.write(':'); | 575 sb.write(':'); |
| 568 sb.write(values[i].unparse()); | 576 sb.write(values[i].unparse()); |
| 569 } | 577 } |
| 570 sb.write('}'); | 578 sb.write('}'); |
| 571 return sb.toString(); | 579 return sb.toString(); |
| 572 } | 580 } |
| 573 | 581 |
| 574 String toStructuredString() { | 582 String toStructuredString() { |
| (...skipping 15 matching lines...) Expand all Loading... |
| 590 class InterceptorConstantValue extends ConstantValue { | 598 class InterceptorConstantValue extends ConstantValue { |
| 591 /// The type for which this interceptor holds the methods. The constant | 599 /// The type for which this interceptor holds the methods. The constant |
| 592 /// is a dispatch table for this type. | 600 /// is a dispatch table for this type. |
| 593 final DartType dispatchedType; | 601 final DartType dispatchedType; |
| 594 | 602 |
| 595 InterceptorConstantValue(this.dispatchedType); | 603 InterceptorConstantValue(this.dispatchedType); |
| 596 | 604 |
| 597 bool get isInterceptor => true; | 605 bool get isInterceptor => true; |
| 598 | 606 |
| 599 bool operator ==(other) { | 607 bool operator ==(other) { |
| 600 return other is InterceptorConstantValue | 608 return other is InterceptorConstantValue && |
| 601 && dispatchedType == other.dispatchedType; | 609 dispatchedType == other.dispatchedType; |
| 602 } | 610 } |
| 603 | 611 |
| 604 int get hashCode => dispatchedType.hashCode * 43; | 612 int get hashCode => dispatchedType.hashCode * 43; |
| 605 | 613 |
| 606 List<ConstantValue> getDependencies() => const <ConstantValue>[]; | 614 List<ConstantValue> getDependencies() => const <ConstantValue>[]; |
| 607 | 615 |
| 608 accept(ConstantValueVisitor visitor, arg) { | 616 accept(ConstantValueVisitor visitor, arg) { |
| 609 return visitor.visitInterceptor(this, arg); | 617 return visitor.visitInterceptor(this, arg); |
| 610 } | 618 } |
| 611 | 619 |
| (...skipping 10 matching lines...) Expand all Loading... |
| 622 | 630 |
| 623 class SyntheticConstantValue extends ConstantValue { | 631 class SyntheticConstantValue extends ConstantValue { |
| 624 final payload; | 632 final payload; |
| 625 final kind; | 633 final kind; |
| 626 | 634 |
| 627 SyntheticConstantValue(this.kind, this.payload); | 635 SyntheticConstantValue(this.kind, this.payload); |
| 628 | 636 |
| 629 bool get isDummy => true; | 637 bool get isDummy => true; |
| 630 | 638 |
| 631 bool operator ==(other) { | 639 bool operator ==(other) { |
| 632 return other is SyntheticConstantValue | 640 return other is SyntheticConstantValue && payload == other.payload; |
| 633 && payload == other.payload; | |
| 634 } | 641 } |
| 635 | 642 |
| 636 get hashCode => payload.hashCode * 17 + kind.hashCode; | 643 get hashCode => payload.hashCode * 17 + kind.hashCode; |
| 637 | 644 |
| 638 List<ConstantValue> getDependencies() => const <ConstantValue>[]; | 645 List<ConstantValue> getDependencies() => const <ConstantValue>[]; |
| 639 | 646 |
| 640 accept(ConstantValueVisitor visitor, arg) { | 647 accept(ConstantValueVisitor visitor, arg) { |
| 641 return visitor.visitSynthetic(this, arg); | 648 return visitor.visitSynthetic(this, arg); |
| 642 } | 649 } |
| 643 | 650 |
| 644 DartType getType(CoreTypes types) => const DynamicType(); | 651 DartType getType(CoreTypes types) => const DynamicType(); |
| 645 | 652 |
| 646 String unparse() => 'synthetic($kind, $payload)'; | 653 String unparse() => 'synthetic($kind, $payload)'; |
| 647 | 654 |
| 648 String toStructuredString() => 'SyntheticConstant($kind, $payload)'; | 655 String toStructuredString() => 'SyntheticConstant($kind, $payload)'; |
| 649 } | 656 } |
| 650 | 657 |
| 651 class ConstructedConstantValue extends ObjectConstantValue { | 658 class ConstructedConstantValue extends ObjectConstantValue { |
| 652 final Map<FieldElement, ConstantValue> fields; | 659 final Map<FieldElement, ConstantValue> fields; |
| 653 final int hashCode; | 660 final int hashCode; |
| 654 | 661 |
| 655 ConstructedConstantValue(InterfaceType type, | 662 ConstructedConstantValue( |
| 656 Map<FieldElement, ConstantValue> fields) | 663 InterfaceType type, Map<FieldElement, ConstantValue> fields) |
| 657 : this.fields = fields, | 664 : this.fields = fields, |
| 658 hashCode = Hashing.mapHash(fields, Hashing.objectHash(type)), | 665 hashCode = Hashing.mapHash(fields, Hashing.objectHash(type)), |
| 659 super(type) { | 666 super(type) { |
| 660 assert(type != null); | 667 assert(type != null); |
| 661 assert(!fields.containsValue(null)); | 668 assert(!fields.containsValue(null)); |
| 662 } | 669 } |
| 663 | 670 |
| 664 bool get isConstructedObject => true; | 671 bool get isConstructedObject => true; |
| 665 | 672 |
| 666 bool operator ==(var otherVar) { | 673 bool operator ==(var otherVar) { |
| 667 if (identical(this, otherVar)) return true; | 674 if (identical(this, otherVar)) return true; |
| 668 if (otherVar is !ConstructedConstantValue) return false; | 675 if (otherVar is! ConstructedConstantValue) return false; |
| 669 ConstructedConstantValue other = otherVar; | 676 ConstructedConstantValue other = otherVar; |
| 670 if (hashCode != other.hashCode) return false; | 677 if (hashCode != other.hashCode) return false; |
| 671 if (type != other.type) return false; | 678 if (type != other.type) return false; |
| 672 if (fields.length != other.fields.length) return false; | 679 if (fields.length != other.fields.length) return false; |
| 673 for (FieldElement field in fields.keys) { | 680 for (FieldElement field in fields.keys) { |
| 674 if (fields[field] != other.fields[field]) return false; | 681 if (fields[field] != other.fields[field]) return false; |
| 675 } | 682 } |
| 676 return true; | 683 return true; |
| 677 } | 684 } |
| 678 | 685 |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 721 /// Used for referring to deferred constants. | 728 /// Used for referring to deferred constants. |
| 722 class DeferredConstantValue extends ConstantValue { | 729 class DeferredConstantValue extends ConstantValue { |
| 723 DeferredConstantValue(this.referenced, this.prefix); | 730 DeferredConstantValue(this.referenced, this.prefix); |
| 724 | 731 |
| 725 final ConstantValue referenced; | 732 final ConstantValue referenced; |
| 726 final PrefixElement prefix; | 733 final PrefixElement prefix; |
| 727 | 734 |
| 728 bool get isReference => true; | 735 bool get isReference => true; |
| 729 | 736 |
| 730 bool operator ==(other) { | 737 bool operator ==(other) { |
| 731 return other is DeferredConstantValue | 738 return other is DeferredConstantValue && |
| 732 && referenced == other.referenced | 739 referenced == other.referenced && |
| 733 && prefix == other.prefix; | 740 prefix == other.prefix; |
| 734 } | 741 } |
| 735 | 742 |
| 736 get hashCode => (referenced.hashCode * 17 + prefix.hashCode) & 0x3fffffff; | 743 get hashCode => (referenced.hashCode * 17 + prefix.hashCode) & 0x3fffffff; |
| 737 | 744 |
| 738 List<ConstantValue> getDependencies() => <ConstantValue>[referenced]; | 745 List<ConstantValue> getDependencies() => <ConstantValue>[referenced]; |
| 739 | 746 |
| 740 accept(ConstantValueVisitor visitor, arg) => visitor.visitDeferred(this, arg); | 747 accept(ConstantValueVisitor visitor, arg) => visitor.visitDeferred(this, arg); |
| 741 | 748 |
| 742 DartType getType(CoreTypes types) => referenced.getType(types); | 749 DartType getType(CoreTypes types) => referenced.getType(types); |
| 743 | 750 |
| (...skipping 18 matching lines...) Expand all Loading... |
| 762 | 769 |
| 763 @override | 770 @override |
| 764 DartType getType(CoreTypes types) => const DynamicType(); | 771 DartType getType(CoreTypes types) => const DynamicType(); |
| 765 | 772 |
| 766 @override | 773 @override |
| 767 String toStructuredString() => 'NonConstant'; | 774 String toStructuredString() => 'NonConstant'; |
| 768 | 775 |
| 769 @override | 776 @override |
| 770 String unparse() => '>>non-constant<<'; | 777 String unparse() => '>>non-constant<<'; |
| 771 } | 778 } |
| OLD | NEW |