blob: 1b8c35138749badff32658f8be2ccf05e66a17fb [file] [log] [blame]
// Expectation for test:
// // Method to test: function(test)
// import 'package:expect/expect.dart';
//
// // This example illustrates a case we wish to do better in terms of inlining and
// // code generation.
// //
// // Naively this function would be compiled without inlining Wrapper.[],
// // JSArray.[] and Wrapper.[]= because:
// // JSArray.[] is too big (14 nodes)
// // Wrapper.[] is too big if we force inlining of JSArray (15 nodes)
// // Wrapper.[]= is even bigger (46 nodes)
// //
// // We now do specialization of [] and []= by adding guards and injecting builtin
// // operators. This made it possible to inline []. We still don't see []= inlined
// // yet, that might require that we improve the inlining counting heuristics a
// // bit.
// @NoInline()
// test(data, x) {
// data[x + 1] = data[x];
// }
//
// main() {
// var wrapper = new Wrapper();
// wrapper[33] = wrapper[1]; // make Wrapper.[]= and [] used more than once.
// print(test(new Wrapper(), int.parse('2')));
// }
//
// class Wrapper {
// final List arr = <bool>[true, false, false, true];
// operator[](int i) => this.arr[i];
// operator[]=(int i, v) {
// if (i > arr.length - 1) arr.length = i + 1;
// return arr[i] = v;
// }
// }
function(data, x) {
var v0 = J.$add$ns(x, 1), v1 = data.arr;
if (x >>> 0 !== x || x >= v1.length)
return H.ioore(v1, x);
data.$indexSet(0, v0, v1[x]);
}