Files
sdk/tests/compiler/dart2js/optimization/data/index.dart
T
Johnni Winther 440b4cd84e Insert implicit casts when setting interface targets
This preserves the invariant that method invocations and property sets
with an interface target handle static types at the call site.

This is a prerequisite to improving dart2js with implicit checks.
With this we can mark dynamic invocations a statically safe and
discover when instance methods don't need to check parameter types.

Change-Id: Ife7a3f947952b3c1f73316b922b2aa107343068e
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/95400
Commit-Queue: Johnni Winther <johnniwinther@google.com>
Reviewed-by: Sigmund Cherem <sigmund@google.com>
2019-03-11 13:08:34 +00:00

69 lines
1.9 KiB
Dart

// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
import 'dart:collection';
/*element: dynamicIndex:Specializer=[!Index]*/
@pragma('dart2js:noInline')
dynamicIndex(var list) {
return list[0]; // This not known to be an indexable primitive.
}
/*element: unknownListIndex:Specializer=[!Index]*/
@pragma('dart2js:noInline')
unknownListIndex(List list) {
return list[0]; // This not known to be an indexable primitive.
}
/*element: possiblyNullMutableListIndex:Specializer=[Index]*/
@pragma('dart2js:noInline')
possiblyNullMutableListIndex(bool b) {
var list = b ? [0] : null;
return list[0];
}
/*element: mutableListIndex:Specializer=[Index]*/
@pragma('dart2js:noInline')
mutableListIndex() {
var list = [0];
return list[0];
}
/*element: mutableListDynamicIndex:Specializer=[Index]*/
@pragma('dart2js:noInline')
mutableListDynamicIndex(dynamic index) {
var list = [0];
return list[index]; // CFE inserts an implicit cast of the index.
}
/*strong.element: mutableDynamicListDynamicIndex:Specializer=[!Index]*/
/*omit.element: mutableDynamicListDynamicIndex:Specializer=[Index]*/
@pragma('dart2js:noInline')
@pragma('dart2js:disableFinal')
mutableDynamicListDynamicIndex(dynamic index) {
dynamic list = [0];
return list[index];
}
main() {
dynamicIndex([]);
dynamicIndex({});
unknownListIndex([]);
unknownListIndex(new MyList());
possiblyNullMutableListIndex(true);
possiblyNullMutableListIndex(false);
mutableListIndex();
mutableListDynamicIndex(0);
mutableListDynamicIndex('');
mutableDynamicListDynamicIndex(0);
mutableDynamicListDynamicIndex('');
}
class MyList<E> extends ListBase<E> {
E operator [](int index) => null;
void operator []=(int index, E value) {}
int get length => 0;
void set length(int value) {}
}