| OLD | NEW |
| 1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2016, 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 import 'package:analyzer/dart/element/type.dart'; | 5 import 'package:analyzer/dart/element/type.dart'; |
| 6 import 'package:analyzer/src/dart/element/element.dart'; | 6 import 'package:analyzer/src/dart/element/element.dart'; |
| 7 import 'package:analyzer/src/summary/format.dart'; | 7 import 'package:analyzer/src/summary/format.dart'; |
| 8 import 'package:analyzer/src/summary/idl.dart'; | 8 import 'package:analyzer/src/summary/idl.dart'; |
| 9 import 'package:analyzer/src/summary/link.dart'; | 9 import 'package:analyzer/src/summary/link.dart'; |
| 10 import 'package:test/test.dart'; | 10 import 'package:test/test.dart'; |
| (...skipping 181 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 192 class C extends B { | 192 class C extends B { |
| 193 var c; | 193 var c; |
| 194 } | 194 } |
| 195 '''); | 195 '''); |
| 196 LibraryElementForLink library = linker.getLibrary(linkerInputs.testDartUri); | 196 LibraryElementForLink library = linker.getLibrary(linkerInputs.testDartUri); |
| 197 library.libraryCycleForLink.ensureLinked(); | 197 library.libraryCycleForLink.ensureLinked(); |
| 198 // No assertions--just make sure it doesn't crash. | 198 // No assertions--just make sure it doesn't crash. |
| 199 } | 199 } |
| 200 | 200 |
| 201 void test_bundle_refers_to_bundle() { | 201 void test_bundle_refers_to_bundle() { |
| 202 var bundle1 = createPackageBundle( | 202 var bundle1 = createPackageBundle(''' |
| 203 ''' | |
| 204 var x = 0; | 203 var x = 0; |
| 205 ''', | 204 ''', path: '/a.dart'); |
| 206 path: '/a.dart'); | |
| 207 addBundle('/a.ds', bundle1); | 205 addBundle('/a.ds', bundle1); |
| 208 var bundle2 = createPackageBundle( | 206 var bundle2 = createPackageBundle(''' |
| 209 ''' | |
| 210 import "a.dart"; | 207 import "a.dart"; |
| 211 var y = x; | 208 var y = x; |
| 212 ''', | 209 ''', path: '/b.dart'); |
| 213 path: '/b.dart'); | |
| 214 expect(bundle2.dependencies, hasLength(1)); | 210 expect(bundle2.dependencies, hasLength(1)); |
| 215 expect(bundle2.dependencies[0].summaryPath, '/a.ds'); | 211 expect(bundle2.dependencies[0].summaryPath, '/a.ds'); |
| 216 expect(bundle2.dependencies[0].apiSignature, bundle1.apiSignature); | 212 expect(bundle2.dependencies[0].apiSignature, bundle1.apiSignature); |
| 217 addBundle('/a.ds', bundle1); | 213 addBundle('/a.ds', bundle1); |
| 218 addBundle('/b.ds', bundle2); | 214 addBundle('/b.ds', bundle2); |
| 219 createLinker(''' | 215 createLinker(''' |
| 220 import "b.dart"; | 216 import "b.dart"; |
| 221 var z = y; | 217 var z = y; |
| 222 '''); | 218 '''); |
| 223 LibraryElementForLink library = linker.getLibrary(linkerInputs.testDartUri); | 219 LibraryElementForLink library = linker.getLibrary(linkerInputs.testDartUri); |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 259 expect(parameterAFT.isCovariant, isTrue); | 255 expect(parameterAFT.isCovariant, isTrue); |
| 260 expect(parameterAFT.inheritsCovariant, isFalse); | 256 expect(parameterAFT.inheritsCovariant, isFalse); |
| 261 ClassElementForLink classB = testLibrary.getContainedName('B'); | 257 ClassElementForLink classB = testLibrary.getContainedName('B'); |
| 262 MethodElementForLink methodBF = classB.getContainedName('f'); | 258 MethodElementForLink methodBF = classB.getContainedName('f'); |
| 263 ParameterElementForLink parameterBFT = methodBF.parameters[0]; | 259 ParameterElementForLink parameterBFT = methodBF.parameters[0]; |
| 264 expect(parameterAFT.isCovariant, isTrue); | 260 expect(parameterAFT.isCovariant, isTrue); |
| 265 expect(parameterBFT.inheritsCovariant, isTrue); | 261 expect(parameterBFT.inheritsCovariant, isTrue); |
| 266 } | 262 } |
| 267 | 263 |
| 268 void test_createPackageBundle_withPackageUri() { | 264 void test_createPackageBundle_withPackageUri() { |
| 269 PackageBundle bundle = createPackageBundle( | 265 PackageBundle bundle = createPackageBundle(''' |
| 270 ''' | |
| 271 class B { | 266 class B { |
| 272 void f(int i) {} | 267 void f(int i) {} |
| 273 } | 268 } |
| 274 class C extends B { | 269 class C extends B { |
| 275 f(i) {} // Inferred param type: int | 270 f(i) {} // Inferred param type: int |
| 276 } | 271 } |
| 277 ''', | 272 ''', uri: 'package:foo/bar.dart'); |
| 278 uri: 'package:foo/bar.dart'); | |
| 279 UnlinkedExecutable cf = bundle.unlinkedUnits[0].classes[1].executables[0]; | 273 UnlinkedExecutable cf = bundle.unlinkedUnits[0].classes[1].executables[0]; |
| 280 UnlinkedParam cfi = cf.parameters[0]; | 274 UnlinkedParam cfi = cf.parameters[0]; |
| 281 expect(cfi.inferredTypeSlot, isNot(0)); | 275 expect(cfi.inferredTypeSlot, isNot(0)); |
| 282 EntityRef typeRef = _lookupInferredType( | 276 EntityRef typeRef = _lookupInferredType( |
| 283 bundle.linkedLibraries[0].units[0], cfi.inferredTypeSlot); | 277 bundle.linkedLibraries[0].units[0], cfi.inferredTypeSlot); |
| 284 expect(typeRef, isNotNull); | 278 expect(typeRef, isNotNull); |
| 285 expect(bundle.unlinkedUnits[0].references[typeRef.reference].name, 'int'); | 279 expect(bundle.unlinkedUnits[0].references[typeRef.reference].name, 'int'); |
| 286 } | 280 } |
| 287 | 281 |
| 288 void test_getContainedName_nonStaticField() { | 282 void test_getContainedName_nonStaticField() { |
| (...skipping 18 matching lines...) Expand all Loading... |
| 307 } | 301 } |
| 308 | 302 |
| 309 void test_getContainedName_nonStaticSetter() { | 303 void test_getContainedName_nonStaticSetter() { |
| 310 createLinker('class C { void set s(value) {} }'); | 304 createLinker('class C { void set s(value) {} }'); |
| 311 LibraryElementForLink library = linker.getLibrary(linkerInputs.testDartUri); | 305 LibraryElementForLink library = linker.getLibrary(linkerInputs.testDartUri); |
| 312 ClassElementForLink_Class c = library.getContainedName('C'); | 306 ClassElementForLink_Class c = library.getContainedName('C'); |
| 313 expect(c.getContainedName('s='), isNot(isUndefined)); | 307 expect(c.getContainedName('s='), isNot(isUndefined)); |
| 314 } | 308 } |
| 315 | 309 |
| 316 void test_inferredType_closure_fromBundle() { | 310 void test_inferredType_closure_fromBundle() { |
| 317 var bundle = createPackageBundle( | 311 var bundle = createPackageBundle(''' |
| 318 ''' | |
| 319 var x = () {}; | 312 var x = () {}; |
| 320 ''', | 313 ''', path: '/a.dart'); |
| 321 path: '/a.dart'); | |
| 322 addBundle('/a.ds', bundle); | 314 addBundle('/a.ds', bundle); |
| 323 createLinker(''' | 315 createLinker(''' |
| 324 import 'a.dart'; | 316 import 'a.dart'; |
| 325 var y = x; | 317 var y = x; |
| 326 '''); | 318 '''); |
| 327 LibraryElementForLink library = linker.getLibrary(linkerInputs.testDartUri); | 319 LibraryElementForLink library = linker.getLibrary(linkerInputs.testDartUri); |
| 328 expect(_getVariable(library.getContainedName('y')).inferredType.toString(), | 320 expect(_getVariable(library.getContainedName('y')).inferredType.toString(), |
| 329 '() → dynamic'); | 321 '() → dynamic'); |
| 330 } | 322 } |
| 331 | 323 |
| 332 void test_inferredType_closure_fromBundle_identifierSequence() { | 324 void test_inferredType_closure_fromBundle_identifierSequence() { |
| 333 var bundle = createPackageBundle( | 325 var bundle = createPackageBundle(''' |
| 334 ''' | |
| 335 class C { | 326 class C { |
| 336 static final x = (D d) => d.e; | 327 static final x = (D d) => d.e; |
| 337 } | 328 } |
| 338 class D { | 329 class D { |
| 339 E e; | 330 E e; |
| 340 } | 331 } |
| 341 class E {} | 332 class E {} |
| 342 ''', | 333 ''', path: '/a.dart'); |
| 343 path: '/a.dart'); | |
| 344 addBundle('/a.ds', bundle); | 334 addBundle('/a.ds', bundle); |
| 345 createLinker(''' | 335 createLinker(''' |
| 346 import 'a.dart'; | 336 import 'a.dart'; |
| 347 var y = C.x; | 337 var y = C.x; |
| 348 '''); | 338 '''); |
| 349 LibraryElementForLink library = linker.getLibrary(linkerInputs.testDartUri); | 339 LibraryElementForLink library = linker.getLibrary(linkerInputs.testDartUri); |
| 350 expect(_getVariable(library.getContainedName('y')).inferredType.toString(), | 340 expect(_getVariable(library.getContainedName('y')).inferredType.toString(), |
| 351 '(D) → dynamic'); | 341 '(D) → dynamic'); |
| 352 } | 342 } |
| 353 | 343 |
| 354 void test_inferredType_implicitFunctionTypeIndices() { | 344 void test_inferredType_implicitFunctionTypeIndices() { |
| 355 var bundle = createPackageBundle( | 345 var bundle = createPackageBundle(''' |
| 356 ''' | |
| 357 class A { | 346 class A { |
| 358 void foo(void bar(int arg)) {} | 347 void foo(void bar(int arg)) {} |
| 359 } | 348 } |
| 360 class B extends A { | 349 class B extends A { |
| 361 void foo(bar) {} | 350 void foo(bar) {} |
| 362 } | 351 } |
| 363 ''', | 352 ''', path: '/a.dart'); |
| 364 path: '/a.dart'); | |
| 365 addBundle('/a.ds', bundle); | 353 addBundle('/a.ds', bundle); |
| 366 createLinker(''' | 354 createLinker(''' |
| 367 import 'a.dart'; | 355 import 'a.dart'; |
| 368 class C extends B { | 356 class C extends B { |
| 369 void foo(bar) {} | 357 void foo(bar) {} |
| 370 } | 358 } |
| 371 '''); | 359 '''); |
| 372 LibraryElementForLink library = linker.getLibrary(linkerInputs.testDartUri); | 360 LibraryElementForLink library = linker.getLibrary(linkerInputs.testDartUri); |
| 373 library.libraryCycleForLink.ensureLinked(); | 361 library.libraryCycleForLink.ensureLinked(); |
| 374 ClassElementForLink_Class cls = library.getContainedName('C'); | 362 ClassElementForLink_Class cls = library.getContainedName('C'); |
| (...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 452 } | 440 } |
| 453 '''); | 441 '''); |
| 454 LibraryElementForLink library = linker.getLibrary(linkerInputs.testDartUri); | 442 LibraryElementForLink library = linker.getLibrary(linkerInputs.testDartUri); |
| 455 library.libraryCycleForLink.ensureLinked(); | 443 library.libraryCycleForLink.ensureLinked(); |
| 456 ClassElementForLink_Class cls = library.getContainedName('C'); | 444 ClassElementForLink_Class cls = library.getContainedName('C'); |
| 457 expect(cls.methods, hasLength(1)); | 445 expect(cls.methods, hasLength(1)); |
| 458 expect(cls.methods[0].returnType.toString(), 'void'); | 446 expect(cls.methods[0].returnType.toString(), 'void'); |
| 459 } | 447 } |
| 460 | 448 |
| 461 void test_inferredType_parameter_genericFunctionType() { | 449 void test_inferredType_parameter_genericFunctionType() { |
| 462 var bundle = createPackageBundle( | 450 var bundle = createPackageBundle(''' |
| 463 ''' | |
| 464 class A<T> { | 451 class A<T> { |
| 465 A<R> map<R>(R Function(T) f) => null; | 452 A<R> map<R>(R Function(T) f) => null; |
| 466 } | 453 } |
| 467 ''', | 454 ''', path: '/a.dart'); |
| 468 path: '/a.dart'); | |
| 469 addBundle('/a.ds', bundle); | 455 addBundle('/a.ds', bundle); |
| 470 createLinker(''' | 456 createLinker(''' |
| 471 import 'a.dart'; | 457 import 'a.dart'; |
| 472 class C extends A<int> { | 458 class C extends A<int> { |
| 473 map<R2>(f) => null; | 459 map<R2>(f) => null; |
| 474 } | 460 } |
| 475 '''); | 461 '''); |
| 476 LibraryElementForLink library = linker.getLibrary(linkerInputs.testDartUri); | 462 LibraryElementForLink library = linker.getLibrary(linkerInputs.testDartUri); |
| 477 library.libraryCycleForLink.ensureLinked(); | 463 library.libraryCycleForLink.ensureLinked(); |
| 478 ClassElementForLink_Class c = library.getContainedName('C'); | 464 ClassElementForLink_Class c = library.getContainedName('C'); |
| (...skipping 30 matching lines...) Expand all Loading... |
| 509 expect( | 495 expect( |
| 510 _getVariable(linker | 496 _getVariable(linker |
| 511 .getLibrary(linkerInputs.testDartUri) | 497 .getLibrary(linkerInputs.testDartUri) |
| 512 .getContainedName('y')) | 498 .getContainedName('y')) |
| 513 .inferredType | 499 .inferredType |
| 514 .toString(), | 500 .toString(), |
| 515 'dynamic'); | 501 'dynamic'); |
| 516 } | 502 } |
| 517 | 503 |
| 518 void test_inferredTypeFromOutsideBuildUnit_dynamic() { | 504 void test_inferredTypeFromOutsideBuildUnit_dynamic() { |
| 519 var bundle = createPackageBundle( | 505 var bundle = createPackageBundle(''' |
| 520 ''' | |
| 521 var x; | 506 var x; |
| 522 var y = x; // Inferred type: dynamic | 507 var y = x; // Inferred type: dynamic |
| 523 ''', | 508 ''', path: '/a.dart'); |
| 524 path: '/a.dart'); | |
| 525 addBundle('/a.ds', bundle); | 509 addBundle('/a.ds', bundle); |
| 526 createLinker(''' | 510 createLinker(''' |
| 527 import 'a.dart'; | 511 import 'a.dart'; |
| 528 var z = y; // Inferred type: dynamic | 512 var z = y; // Inferred type: dynamic |
| 529 '''); | 513 '''); |
| 530 LibraryElementForLink library = linker.getLibrary(linkerInputs.testDartUri); | 514 LibraryElementForLink library = linker.getLibrary(linkerInputs.testDartUri); |
| 531 expect(_getVariable(library.getContainedName('z')).inferredType.toString(), | 515 expect(_getVariable(library.getContainedName('z')).inferredType.toString(), |
| 532 'dynamic'); | 516 'dynamic'); |
| 533 } | 517 } |
| 534 | 518 |
| 535 void test_inferredTypeFromOutsideBuildUnit_instanceField() { | 519 void test_inferredTypeFromOutsideBuildUnit_instanceField() { |
| 536 var bundle = createPackageBundle( | 520 var bundle = createPackageBundle(''' |
| 537 ''' | |
| 538 class C { | 521 class C { |
| 539 var f = 0; // Inferred type: int | 522 var f = 0; // Inferred type: int |
| 540 } | 523 } |
| 541 ''', | 524 ''', path: '/a.dart'); |
| 542 path: '/a.dart'); | |
| 543 addBundle('/a.ds', bundle); | 525 addBundle('/a.ds', bundle); |
| 544 createLinker(''' | 526 createLinker(''' |
| 545 import 'a.dart'; | 527 import 'a.dart'; |
| 546 var x = new C().f; // Inferred type: dynamic | 528 var x = new C().f; // Inferred type: dynamic |
| 547 '''); | 529 '''); |
| 548 LibraryElementForLink library = linker.getLibrary(linkerInputs.testDartUri); | 530 LibraryElementForLink library = linker.getLibrary(linkerInputs.testDartUri); |
| 549 expect(_getVariable(library.getContainedName('x')).inferredType.toString(), | 531 expect(_getVariable(library.getContainedName('x')).inferredType.toString(), |
| 550 'dynamic'); | 532 'dynamic'); |
| 551 } | 533 } |
| 552 | 534 |
| 553 void test_inferredTypeFromOutsideBuildUnit_instanceField_toInstanceField() { | 535 void test_inferredTypeFromOutsideBuildUnit_instanceField_toInstanceField() { |
| 554 var bundle = createPackageBundle( | 536 var bundle = createPackageBundle(''' |
| 555 ''' | |
| 556 class C { | 537 class C { |
| 557 var f = 0; // Inferred type: int | 538 var f = 0; // Inferred type: int |
| 558 } | 539 } |
| 559 ''', | 540 ''', path: '/a.dart'); |
| 560 path: '/a.dart'); | |
| 561 addBundle('/a.ds', bundle); | 541 addBundle('/a.ds', bundle); |
| 562 createLinker(''' | 542 createLinker(''' |
| 563 import 'a.dart'; | 543 import 'a.dart'; |
| 564 class D { | 544 class D { |
| 565 var g = new C().f; // Inferred type: dynamic | 545 var g = new C().f; // Inferred type: dynamic |
| 566 } | 546 } |
| 567 '''); | 547 '''); |
| 568 LibraryElementForLink library = linker.getLibrary(linkerInputs.testDartUri); | 548 LibraryElementForLink library = linker.getLibrary(linkerInputs.testDartUri); |
| 569 ClassElementForLink_Class classD = library.getContainedName('D'); | 549 ClassElementForLink_Class classD = library.getContainedName('D'); |
| 570 expect(classD.fields[0].inferredType.toString(), 'dynamic'); | 550 expect(classD.fields[0].inferredType.toString(), 'dynamic'); |
| 571 } | 551 } |
| 572 | 552 |
| 573 void test_inferredTypeFromOutsideBuildUnit_methodParamType_viaInheritance() { | 553 void test_inferredTypeFromOutsideBuildUnit_methodParamType_viaInheritance() { |
| 574 var bundle = createPackageBundle( | 554 var bundle = createPackageBundle(''' |
| 575 ''' | |
| 576 class B { | 555 class B { |
| 577 void f(int i) {} | 556 void f(int i) {} |
| 578 } | 557 } |
| 579 class C extends B { | 558 class C extends B { |
| 580 f(i) {} // Inferred param type: int | 559 f(i) {} // Inferred param type: int |
| 581 } | 560 } |
| 582 ''', | 561 ''', path: '/a.dart'); |
| 583 path: '/a.dart'); | |
| 584 addBundle('/a.ds', bundle); | 562 addBundle('/a.ds', bundle); |
| 585 createLinker(''' | 563 createLinker(''' |
| 586 import 'a.dart'; | 564 import 'a.dart'; |
| 587 class D extends C { | 565 class D extends C { |
| 588 f(i) {} // Inferred param type: int | 566 f(i) {} // Inferred param type: int |
| 589 } | 567 } |
| 590 '''); | 568 '''); |
| 591 LibraryElementForLink library = linker.getLibrary(linkerInputs.testDartUri); | 569 LibraryElementForLink library = linker.getLibrary(linkerInputs.testDartUri); |
| 592 library.libraryCycleForLink.ensureLinked(); | 570 library.libraryCycleForLink.ensureLinked(); |
| 593 ClassElementForLink_Class cls = library.getContainedName('D'); | 571 ClassElementForLink_Class cls = library.getContainedName('D'); |
| 594 expect(cls.methods, hasLength(1)); | 572 expect(cls.methods, hasLength(1)); |
| 595 var method = cls.methods[0]; | 573 var method = cls.methods[0]; |
| 596 expect(method.parameters, hasLength(1)); | 574 expect(method.parameters, hasLength(1)); |
| 597 expect(method.parameters[0].type.toString(), 'int'); | 575 expect(method.parameters[0].type.toString(), 'int'); |
| 598 } | 576 } |
| 599 | 577 |
| 600 void test_inferredTypeFromOutsideBuildUnit_methodReturnType_viaCall() { | 578 void test_inferredTypeFromOutsideBuildUnit_methodReturnType_viaCall() { |
| 601 var bundle = createPackageBundle( | 579 var bundle = createPackageBundle(''' |
| 602 ''' | |
| 603 class B { | 580 class B { |
| 604 int f() => 0; | 581 int f() => 0; |
| 605 } | 582 } |
| 606 class C extends B { | 583 class C extends B { |
| 607 f() => 1; // Inferred return type: int | 584 f() => 1; // Inferred return type: int |
| 608 } | 585 } |
| 609 ''', | 586 ''', path: '/a.dart'); |
| 610 path: '/a.dart'); | |
| 611 addBundle('/a.ds', bundle); | 587 addBundle('/a.ds', bundle); |
| 612 createLinker(''' | 588 createLinker(''' |
| 613 import 'a.dart'; | 589 import 'a.dart'; |
| 614 var x = new C().f(); // Inferred type: int | 590 var x = new C().f(); // Inferred type: int |
| 615 '''); | 591 '''); |
| 616 LibraryElementForLink library = linker.getLibrary(linkerInputs.testDartUri); | 592 LibraryElementForLink library = linker.getLibrary(linkerInputs.testDartUri); |
| 617 expect(_getVariable(library.getContainedName('x')).inferredType.toString(), | 593 expect(_getVariable(library.getContainedName('x')).inferredType.toString(), |
| 618 'int'); | 594 'int'); |
| 619 } | 595 } |
| 620 | 596 |
| 621 void test_inferredTypeFromOutsideBuildUnit_methodReturnType_viaInheritance() { | 597 void test_inferredTypeFromOutsideBuildUnit_methodReturnType_viaInheritance() { |
| 622 var bundle = createPackageBundle( | 598 var bundle = createPackageBundle(''' |
| 623 ''' | |
| 624 class B { | 599 class B { |
| 625 int f() => 0; | 600 int f() => 0; |
| 626 } | 601 } |
| 627 class C extends B { | 602 class C extends B { |
| 628 f() => 1; // Inferred return type: int | 603 f() => 1; // Inferred return type: int |
| 629 } | 604 } |
| 630 ''', | 605 ''', path: '/a.dart'); |
| 631 path: '/a.dart'); | |
| 632 addBundle('/a.ds', bundle); | 606 addBundle('/a.ds', bundle); |
| 633 createLinker(''' | 607 createLinker(''' |
| 634 import 'a.dart'; | 608 import 'a.dart'; |
| 635 class D extends C { | 609 class D extends C { |
| 636 f() => 2; //Inferred return type: int | 610 f() => 2; //Inferred return type: int |
| 637 } | 611 } |
| 638 '''); | 612 '''); |
| 639 LibraryElementForLink library = linker.getLibrary(linkerInputs.testDartUri); | 613 LibraryElementForLink library = linker.getLibrary(linkerInputs.testDartUri); |
| 640 library.libraryCycleForLink.ensureLinked(); | 614 library.libraryCycleForLink.ensureLinked(); |
| 641 ClassElementForLink_Class cls = library.getContainedName('D'); | 615 ClassElementForLink_Class cls = library.getContainedName('D'); |
| (...skipping 347 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 989 */ | 963 */ |
| 990 EntityRef _lookupInferredType(LinkedUnit unit, int slot) { | 964 EntityRef _lookupInferredType(LinkedUnit unit, int slot) { |
| 991 for (EntityRef ref in unit.types) { | 965 for (EntityRef ref in unit.types) { |
| 992 if (ref.slot == slot) { | 966 if (ref.slot == slot) { |
| 993 return ref; | 967 return ref; |
| 994 } | 968 } |
| 995 } | 969 } |
| 996 return null; | 970 return null; |
| 997 } | 971 } |
| 998 } | 972 } |
| OLD | NEW |