// 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. // @dart = 2.7 import "native_testing.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() { JS('', r""" (function(){ function getter() { this.gettersCalled++; return 42; } function A(){ var a = Object.create( { constructor: 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; } self.makeA = function() { return new A(); }; self.nativeConstructor(A); })()"""); applyTestExtensions(['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() { nativeTesting(); setup(); confuse(new B()).a(); var x = confuse(makeA()); // 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); }