Anforderungen  |   Konzepte  |   Entwurf  |   Entwicklung  |   Qualitätssicherung  |   Lebenszyklus  |   Steuerung
 
 
 
 


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.11 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.






                                                                                                                                                                                                                                                                                                                                                                                                     


Neuigkeiten

     Aktuelles
     Motto des Tages

Software

     Produkte
     Quellcodebibliothek

Aktivitäten

     Artikel über Sicherheit
     Anleitung zur Aktivierung von SSL

Muße

     Gedichte
     Musik
     Bilder

Jenseits des Üblichen ....
    

Besucherstatistik

Besucherstatistik

Monitoring

Montastic status badge