Files
sdk/tests/language/fast_method_extraction_test.dart
T
vegorov@google.com a77fc9701c When requested to extract a method M from class C inject a method extractor (consisting of a single AST node CreateClosure) as a getter get:M into C.
This allows to cache and optimize method extraction requests as normal method invocations and at hot method extraction sites that significantly decreases overhead of method extraction which previously required two trips into runtime system and was not cached at all.

BUG=

Review URL: https://codereview.chromium.org//11642003

git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@17261 260f80e4-7a28-3924-810f-c04153c831b5
2013-01-18 11:54:45 +00:00

105 lines
1.6 KiB
Dart

// Copyright (c) 2012, 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.
// Test that fast method extraction returns correct closure.
class A {
var f;
A(this.f);
foo() => 40 + f;
}
class B {
var f;
B(this.f);
foo() => -40 - f;
}
class X { }
class C<T> {
foo(v) => v is T;
}
class ChaA {
final magic;
ChaA(magic) : this.magic = magic;
foo() {
Expect.isTrue(this is ChaA);
Expect.equals("magicA", magic);
return "A";
}
bar() => foo;
}
class ChaB extends ChaA {
ChaB(magic) : super(magic);
foo() {
Expect.isTrue(this is ChaB);
Expect.equals("magicB", magic);
return "B";
}
}
mono(a) {
var f = a.foo;
return f();
}
poly(a) {
var f = a.foo;
return f();
}
types(a, b) {
var f = a.foo;
Expect.isTrue(f(b));
}
cha(a) {
var f = a.bar();
return f();
}
extractFromNull() {
var f = (null).toString;
Expect.equals("null", f());
}
main() {
var a = new A(2);
var b = new B(2);
for (var i = 0; i < 10000; i++) {
Expect.equals(42, mono(a));
}
for (var i = 0; i < 10000; i++) {
Expect.equals(42, poly(a));
Expect.equals(-42, poly(b));
}
var c = new C<X>();
var x = new X();
for (var i = 0; i < 10000; i++) {
types(c, x);
}
var chaA = new ChaA("magicA");
for (var i = 0; i < 10000; i++) {
Expect.equals("A", cha(chaA));
}
var chaB = new ChaB("magicB");
for (var i = 0; i < 10000; i++) {
Expect.equals("B", cha(chaB));
}
for (var i = 0; i < 10000; i++) {
extractFromNull();
}
}