// Copyright 2019 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.

function addBenchmark(name, test) {
  new BenchmarkSuite(name, [1000],
      [
        new Benchmark(name, false, false, 0, test)
      ]);
}

addBenchmark('Smi-Value', smiValue);
addBenchmark('Prototype-Chain-Value', functionOnPrototypeValue);

// TODO(all): might be a good idea to also do with receivers: double, HeapObject
// with map, HeapObject, tagged, empty getter / accessor.
// Also, element keyed loads (in another file, probably?) both with strings and
// numbers for normal, cons,and sliced strings (for named properties).
// Also, monomorphic vs poly vs mega.

function smiValue() {
    function constructSmi() {
        this.smi = 0;
    }
    let o = new constructSmi();

    for (var i = 0; i < 1000; ++i) {
        o.smi; o.smi; o.smi; o.smi; o.smi; o.smi; o.smi; o.smi; o.smi; o.smi;
        o.smi; o.smi; o.smi; o.smi; o.smi; o.smi; o.smi; o.smi; o.smi; o.smi;
        o.smi; o.smi; o.smi; o.smi; o.smi; o.smi; o.smi; o.smi; o.smi; o.smi;
        o.smi; o.smi; o.smi; o.smi; o.smi; o.smi; o.smi; o.smi; o.smi; o.smi;
        o.smi; o.smi; o.smi; o.smi; o.smi; o.smi; o.smi; o.smi; o.smi; o.smi;
        o.smi; o.smi; o.smi; o.smi; o.smi; o.smi; o.smi; o.smi; o.smi; o.smi;
        o.smi; o.smi; o.smi; o.smi; o.smi; o.smi; o.smi; o.smi; o.smi; o.smi;
        o.smi; o.smi; o.smi; o.smi; o.smi; o.smi; o.smi; o.smi; o.smi; o.smi;
        o.smi; o.smi; o.smi; o.smi; o.smi; o.smi; o.smi; o.smi; o.smi; o.smi;
        o.smi; o.smi; o.smi; o.smi; o.smi; o.smi; o.smi; o.smi; o.smi; o.smi;
    }
}

function functionOnPrototypeValue() {
    function objectWithPrototypeChain() {
    }
    objectWithPrototypeChain.prototype.__proto__ =
        {__proto__:{__proto__:{__proto__:{f(){}}}}};
    let o = new objectWithPrototypeChain();

    for (var i = 0; i < 1000; ++i) {
        o.f; o.f; o.f; o.f; o.f; o.f; o.f; o.f; o.f; o.f;
        o.f; o.f; o.f; o.f; o.f; o.f; o.f; o.f; o.f; o.f;
        o.f; o.f; o.f; o.f; o.f; o.f; o.f; o.f; o.f; o.f;
        o.f; o.f; o.f; o.f; o.f; o.f; o.f; o.f; o.f; o.f;
        o.f; o.f; o.f; o.f; o.f; o.f; o.f; o.f; o.f; o.f;
        o.f; o.f; o.f; o.f; o.f; o.f; o.f; o.f; o.f; o.f;
        o.f; o.f; o.f; o.f; o.f; o.f; o.f; o.f; o.f; o.f;
        o.f; o.f; o.f; o.f; o.f; o.f; o.f; o.f; o.f; o.f;
        o.f; o.f; o.f; o.f; o.f; o.f; o.f; o.f; o.f; o.f;
        o.f; o.f; o.f; o.f; o.f; o.f; o.f; o.f; o.f; o.f;
    }
}