Quellcodebibliothek Statistik Leitseite products/sources/formale Sprachen/C/Firefox/js/src/jit-test/tests/ion/   (Browser von der Mozilla Stiftung Version 136.0.1©)  Datei vom 10.2.2025 mit Größe 6 kB image not shown  

Quelle  recover-bigint.js   Sprache: JAVA

 
// |jit-test| --ion-limit-script-size=off

setJitCompilerOption("baseline.warmup.trigger", 9);
setJitCompilerOption("ion.warmup.trigger", 20);

// Prevent the GC from cancelling Ion compilations, when we expect them to succeed
gczeal(0);

// Keep in sync with BigInt::MaxBitLength.
const maxBitLength = 1024 * 1024;

const maxBigInt = BigInt.asUintN(maxBitLength, -1n);
const minBigInt = -maxBigInt;

function resumeHere() {}

function bigIntAddBail(i) {
  var x = [0n, maxBigInt][0 + (i >= 99)];

  var a = x + 1n;

  // Add a function call to capture a resumepoint at the end of the call or
  // inside the inlined block, such as the bailout does not rewind to the
  // beginning of the function.
  resumeHere();

  if (i >= 99) {
    bailout();
    // Flag the computation as having removed uses to check that we properly
    // report the error while executing the BigInt operation on bailout.
    return a;
  }
}

function bigIntSubBail(i) {
  var x = [0n, minBigInt][0 + (i >= 99)];

  var a = x - 1n;

  // Add a function call to capture a resumepoint at the end of the call or
  // inside the inlined block, such as the bailout does not rewind to the
  // beginning of the function.
  resumeHere();

  if (i >= 99) {
    bailout();
    // Flag the computation as having removed uses to check that we properly
    // report the error while executing the BigInt operation on bailout.
    return a;
  }
}

function bigIntMulBail(i) {
  var x = [0n, maxBigInt][0 + (i >= 99)];

  var a = x * 2n;

  // Add a function call to capture a resumepoint at the end of the call or
  // inside the inlined block, such as the bailout does not rewind to the
  // beginning of the function.
  resumeHere();

  if (i >= 99) {
    bailout();
    // Flag the computation as having removed uses to check that we properly
    // report the error while executing the BigInt operation on bailout.
    return a;
  }
}

function bigIntIncBail(i) {
  var x = [0n, maxBigInt][0 + (i >= 99)];

  var a = x++;

  // Add a function call to capture a resumepoint at the end of the call or
  // inside the inlined block, such as the bailout does not rewind to the
  // beginning of the function.
  resumeHere();

  if (i >= 99) {
    bailout();
    // Flag the computation as having removed uses to check that we properly
    // report the error while executing the BigInt operation on bailout.
    return x;
  }
}

function bigIntDecBail(i) {
  var x = [0n, minBigInt][0 + (i >= 99)];

  var a = x--;

  // Add a function call to capture a resumepoint at the end of the call or
  // inside the inlined block, such as the bailout does not rewind to the
  // beginning of the function.
  resumeHere();

  if (i >= 99) {
    bailout();
    // Flag the computation as having removed uses to check that we properly
    // report the error while executing the BigInt operation on bailout.
    return x;
  }
}

function bigIntBitNotBail(i) {
  var x = [0n, maxBigInt][0 + (i >= 99)];

  var a = ~x;

  // Add a function call to capture a resumepoint at the end of the call or
  // inside the inlined block, such as the bailout does not rewind to the
  // beginning of the function.
  resumeHere();

  if (i >= 99) {
    bailout();
    // Flag the computation as having removed uses to check that we properly
    // report the error while executing the BigInt operation on bailout.
    return a;
  }
}

function bigIntLshBail(i) {
  var shift = [0n, BigInt(maxBitLength)][0 + (i >= 99)];

  var a = 1n << shift;

  // Add a function call to capture a resumepoint at the end of the call or
  // inside the inlined block, such as the bailout does not rewind to the
  // beginning of the function.
  resumeHere();

  if (i >= 99) {
    bailout();
    // Flag the computation as having removed uses to check that we properly
    // report the error while executing the BigInt operation on bailout.
    return a;
  }
}

function bigIntRshBail(i) {
  var shift = [0n, -BigInt(maxBitLength)][0 + (i >= 99)];

  var a = 1n >> shift;

  // Add a function call to capture a resumepoint at the end of the call or
  // inside the inlined block, such as the bailout does not rewind to the
  // beginning of the function.
  resumeHere();

  if (i >= 99) {
    bailout();
    // Flag the computation as having removed uses to check that we properly
    // report the error while executing the BigInt operation on bailout.
    return a;
  }
}

function bigIntAsUintBail(i) {
  var x = [0, maxBitLength + 1][0 + (i >= 99)];

  var a = BigInt.asUintN(x, -1n);

  // Add a function call to capture a resumepoint at the end of the call or
  // inside the inlined block, such as the bailout does not rewind to the
  // beginning of the function.
  resumeHere();

  if (i >= 99) {
    bailout();
    // Flag the computation as having removed uses to check that we properly
    // report the error while executing the BigInt operation on bailout.
    return a;
  }
}

// Prevent compilation of the top-level
eval(`(${resumeHere})`);

// The bigIntXBail() functions create a BigInt which exceeds the maximum
// representable BigInt. This results in either throwing a RangeError or an
// out-of-memory error when the operation is recovered during a bailout.

try {
  for (let i = 0; i < 100; i++) {
    bigIntAddBail(i);
  }
  throw new Error("missing exception");
catch (e) {
  assertEq(e instanceof RangeError || e === "out of memory"true, String(e));
}

try {
  for (let i = 0; i < 100; i++) {
    bigIntSubBail(i);
  }
  throw new Error("missing exception");
catch (e) {
  assertEq(e instanceof RangeError || e === "out of memory"true, String(e));
}

try {
  for (let i = 0; i < 100; i++) {
    bigIntMulBail(i);
  }
  throw new Error("missing exception");
catch (e) {
  assertEq(e instanceof RangeError || e === "out of memory"true, String(e));
}

try {
  for (let i = 0; i < 100; i++) {
    bigIntIncBail(i);
  }
  throw new Error("missing exception");
catch (e) {
  assertEq(e instanceof RangeError || e === "out of memory"true, String(e));
}

try {
  for (let i = 0; i < 100; i++) {
    bigIntDecBail(i);
  }
  throw new Error("missing exception");
catch (e) {
  assertEq(e instanceof RangeError || e === "out of memory"true, String(e));
}

try {
  for (let i = 0; i < 100; i++) {
    bigIntBitNotBail(i);
  }
  throw new Error("missing exception");
catch (e) {
  assertEq(e instanceof RangeError || e === "out of memory"true, String(e));
}

try {
  for (let i = 0; i < 100; i++) {
    bigIntLshBail(i);
  }
  throw new Error("missing exception");
catch (e) {
  assertEq(e instanceof RangeError || e === "out of memory"true, String(e));
}

try {
  for (let i = 0; i < 100; i++) {
    bigIntRshBail(i);
  }
  throw new Error("missing exception");
catch (e) {
  assertEq(e instanceof RangeError || e === "out of memory"true, String(e));
}

try {
  for (let i = 0; i < 100; i++) {
    bigIntAsUintBail(i);
  }
  throw new Error("missing exception");
catch (e) {
  assertEq(e instanceof RangeError || e === "out of memory"true, String(e));
}

Messung V0.5
C=81 H=84 G=82

¤ Dauer der Verarbeitung: 0.13 Sekunden  (vorverarbeitet)  ¤

*© Formatika GbR, Deutschland






Wurzel

Suchen

Beweissystem der NASA

Beweissystem Isabelle

NIST Cobol Testsuite

Cephes Mathematical Library

Wiener Entwicklungsmethode

Haftungshinweis

Die Informationen auf dieser Webseite wurden nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit, noch Qualität der bereit gestellten Informationen zugesichert.

Bemerkung:

Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.