blob: 4e67b816f58fe0d3bef24c3675e7c7bf655a2e60 [file] [log] [blame]
// Copyright (c) 2011, 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:_js_helper";
import "package:expect/expect.dart";
// Verify that methods are not renamed to clash with native field names
// that are known from the DOM (like x, y, z).
@Native("A")
class A {
int x;
int y;
int z;
int gettersCalled;
}
void setup() native r"""
function getter() {
this.gettersCalled++;
return 42;
}
function A(){
var a = Object.create(
{ constructor: { name: 'A'}},
{ x: { get: getter, configurable: false, writeable: false },
y: { get: getter, configurable: false, writeable: false },
z: { get: getter, configurable: false, writeable: false }
});
a.gettersCalled = 0;
return a;
}
makeA = function() { return new A; };
""";
A makeA() native;
class B {
void a() { }
void a0() { }
void a1() { }
void a2() { }
void a3() { }
void a4() { }
void a5() { }
void a6() { }
void a7() { }
void a8() { }
void a9() { }
void a10() { }
void a11() { }
void a12() { }
void a13() { }
void a14() { }
void a15() { }
void a16() { }
void a17() { }
void a18() { }
void a19() { }
void a20() { }
void a21() { }
void a22() { }
void a23() { }
void a24() { }
void a25() { }
void a26() { }
int z = 0;
}
int inscrutable(int x) => x == 0 ? 0 : x | inscrutable(x & (x - 1));
main() {
setup();
var both = [makeA(), new B()];
var x = both[inscrutable(0)];
// Each of these will throw, because an instance of A doesn't have any of
// these functions. The important thing is that none of them have been
// renamed to be called 'z' by the minifier, because then the getter will be
// hit.
try { x.a(); } catch(e) { }
try { x.a0(); } catch(e) { }
try { x.a1(); } catch(e) { }
try { x.a2(); } catch(e) { }
try { x.a3(); } catch(e) { }
try { x.a4(); } catch(e) { }
try { x.a5(); } catch(e) { }
try { x.a6(); } catch(e) { }
try { x.a7(); } catch(e) { }
try { x.a8(); } catch(e) { }
try { x.a9(); } catch(e) { }
try { x.a10(); } catch(e) { }
try { x.a11(); } catch(e) { }
try { x.a12(); } catch(e) { }
try { x.a13(); } catch(e) { }
try { x.a14(); } catch(e) { }
try { x.a15(); } catch(e) { }
try { x.a16(); } catch(e) { }
try { x.a17(); } catch(e) { }
try { x.a18(); } catch(e) { }
try { x.a19(); } catch(e) { }
try { x.a20(); } catch(e) { }
try { x.a21(); } catch(e) { }
try { x.a12(); } catch(e) { }
try { x.a23(); } catch(e) { }
try { x.a24(); } catch(e) { }
try { x.a25(); } catch(e) { }
try { x.a26(); } catch(e) { }
Expect.equals(0, x.gettersCalled);
Expect.equals(42, x.z);
Expect.equals(1, x.gettersCalled);
}