Javascript  |  103行  |  1.6 KB

// Copyright 2015 the V8 project authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// Flags: --strong-mode

"use strong";

function testSuper(object) {
  assertEquals(0, object.validLoad());
  assertThrows(function(){ return object.propertyLoad() }, TypeError);
  assertThrows(function(){ return object.elementLoad()  }, TypeError);
  assertThrows(function(){ return object.accessorLoad() }, TypeError);
}

class A {
  constructor() {}
  foo() {
    return 0;
  }
  get bar() {
    return 0;
  }
  set baz(_) {
    return;
  }
}

class B extends A {
  constructor() {
    super();
  }
  validLoad() {
    return super.foo() + super.bar;
  }
  propertyLoad() {
    return super.x;
  }
  elementLoad() {
    return super[1];
  }
  accessorLoad() {
    return super.baz;
  }
}

class C extends A {
  constructor() {
    super();
    this[1] = 0;
    this.x = 0;
  }
  get baz() {
    return 0;
  }
  validLoad() {
    return super.foo() + super.bar;
  }
  propertyLoad() {
    return super.x;
  }
  elementLoad() {
    return super[1];
  }
  accessorLoad() {
    return super.baz;
  }
}

let b = new B();
let c = new C();
testSuper(b);
testSuper(c);

let d = {
  "0": 0,
  foo: 0,
  bar: (function(){return 0}),
  get baz(){return 0},
  set qux(_){return}
}

let e = {
  __proto__: d,
  "1": 0,
  x: 0,
  get baz(){return 0},
  validLoad() {
    return super[0] + super.foo + super.bar() + super.baz;
  },
  propertyLoad() {
    return super.x;
  },
  elementLoad() {
    return super[1];
  },
  accessorLoad() {
    return super.qux;
  }
}

testSuper(e);