public static ERational RandomERational(RandomGenerator rand) {
   EInteger bigintA = RandomEInteger(rand);
   EInteger bigintB = RandomEInteger(rand);
   if (bigintB.isZero()) {
     bigintB = EInteger.FromInt32(1);
   }
   return ERational.Create(bigintA, bigintB);
 }
Exemple #2
0
  /** wait for howlong, for one more message to be available */
  public static boolean wait_timeout(EProc proc, EObject howlong) throws Pausable {
    try {
      proc.check_exit();

      if (ipclog.isLoggable(Level.FINE))
        ipclog.fine("WAIT| " + proc + " waits for messages for " + howlong + " ms");
      if (howlong == am_infinity) {
        proc.mbox.untilHasMessages(proc.midx + 1);
        proc.check_exit();
        if (ipclog.isLoggable(Level.FINE)) ipclog.fine("WAIT| " + proc + " wakes up on message");
        return true;
      } else {
        long now = System.currentTimeMillis();
        if (proc.midx == 0 || proc.timeout_start == 0L) {
          proc.timeout_start = now;
        }

        EInteger ei;
        if ((ei = howlong.testInteger()) == null)
          throw new ErlangError(EAtom.intern("timeout_value"));

        long end = proc.timeout_start + ei.longValue();
        long left = end - now;

        if (left < 0) {
          return false;
        }

        if (!proc.in_receive) {
          Task.sleep(left);
          return false;
        } else {

          if (ipclog.isLoggable(Level.FINE))
            ipclog.fine(
                "WAIT| " + proc + " waiting for " + left + "ms for msg #" + (proc.midx + 1));
          boolean res = proc.mbox.untilHasMessages(proc.midx + 1, left);
          proc.check_exit();
          if (ipclog.isLoggable(Level.FINE))
            ipclog.fine("WAIT| " + proc + " wakes up " + (res ? "on message" : "after timeout"));

          return res;
        }
      }
    } finally {
      proc.in_receive = false;
    }
  }
Exemple #3
0
  @BIF
  public static EObject start_timer(EObject time, final EObject rcv, final EObject msg) {
    // check arguments
    EInteger when = time.testInteger();
    final EInternalPID rcv_pid = rcv.testInternalPID();
    EAtom rcv_atom = rcv.testAtom();

    if (when == null
        || gt(when, max_send_time)
        || lt(when, zero)
        || (rcv_pid == null && rcv_atom == null)) {
      throw ERT.badarg(time, rcv, msg);
    }

    ETimerTask send_task =
        new ETimerTask(rcv_pid) {
          @Override
          public void on_timeout() throws Pausable {

            ETuple3 timeout_msg = new ETuple3();
            timeout_msg.elem1 = am_timeout;
            timeout_msg.elem2 = this.ref;
            timeout_msg.elem3 = msg;

            EHandle p;
            if ((p = rcv.testHandle()) != null) {
              p.sendb(timeout_msg);
              return;
            }

            p = register.get(rcv);
            if (p != null) {
              p.sendb(timeout_msg);
            }
          }
        };

    send_task.schedule(when.longValue());

    return send_task.ref;
  }
Exemple #4
0
  @BIF
  public static EObject send_after(
      final EProc proc, EObject time, final EObject rcv, final EObject msg) {
    // check arguments
    EInteger when = time.testInteger();
    final EInternalPID rcv_pid = rcv.testInternalPID();
    EAtom rcv_atom = rcv.testAtom();

    if (when == null
        || gt(when, max_send_time)
        || lt(when, zero)
        || (rcv_pid == null && rcv_atom == null)) {
      throw ERT.badarg(time, rcv, msg);
    }

    ETimerTask send_task =
        new ETimerTask(rcv_pid) {
          @Override
          public void on_timeout() throws Pausable {

            EHandle p;
            if ((p = rcv.testHandle()) != null) {
              p.send(proc.self_handle(), msg);
              return;
            }

            p = register.get(rcv);
            if (p != null) {
              p.send(proc.self_handle(), msg);
            }
          }
        };

    send_task.schedule(when.longValue());

    return send_task.ref;
  }
 public static EInteger RandomSmallIntegral(RandomGenerator r) {
   int count = r.UniformInt(20) + 1;
   StringBuilder sb = new StringBuilder();
   if (r.UniformInt(2) == 0) {
     sb.append('-');
   }
   for (int i = 0; i < count; ++i) {
     if (i == 0) {
       sb.append((char) ('1' + r.UniformInt(9)));
     } else {
       sb.append((char) ('0' + r.UniformInt(10)));
     }
   }
   return EInteger.FromString(sb.toString());
 }
 public static EFloat RandomEFloat(RandomGenerator r) {
   if (r.UniformInt(100) == 0) {
     int x = r.UniformInt(3);
     if (x == 0) {
       return EFloat.PositiveInfinity;
     }
     if (x == 1) {
       return EFloat.NegativeInfinity;
     }
     if (x == 2) {
       return EFloat.NaN;
     }
   }
   return EFloat.Create(RandomEInteger(r), EInteger.FromInt64(r.UniformInt(400) - 200));
 }
 public static EInteger RandomEInteger(RandomGenerator r) {
   int selection = r.UniformInt(100);
   if (selection < 40) {
     StringAndBigInt sabi = StringAndBigInt.Generate(r, 16);
     return sabi.getBigIntValue();
   }
   if (selection < 50) {
     StringAndBigInt sabi = StringAndBigInt.Generate(r, 2 + r.UniformInt(35));
     return sabi.getBigIntValue();
   } else {
     int count = r.UniformInt(400) + 1;
     byte[] bytes = new byte[count];
     for (int i = 0; i < count; ++i) {
       bytes[i] = (byte) ((int) r.UniformInt(256));
     }
     return EInteger.FromBytes(bytes, true);
   }
 }
Exemple #8
0
 public static double unboxToDouble(EInteger i) {
   return i.doubleValue();
 }
Exemple #9
0
 public static int unboxToInt(EInteger i) {
   return i.intValue();
 }
Exemple #10
0
 public static final boolean lt(EInteger v1, EInteger v2) {
   return v1.erlangCompareTo(v2) < 0;
 }
Exemple #11
0
  /**
   * Read an arbitrary Erlang term from the stream.
   *
   * @return the Erlang term.
   * @exception IOException if the stream does not contain a known Erlang type at the next position.
   */
  public EObject read_any() throws IOException {
    // calls one of the above functions, depending on o
    final int tag = peek1skip_version();

    switch (tag) {
      case EExternal.smallIntTag:
      case EExternal.intTag:
      case EExternal.smallBigTag:
      case EExternal.largeBigTag:
        return EInteger.read(this);

      case EExternal.atomCacheRef:
      case EExternal.atomTag:
      case EExternal.smallAtomTag:
        return EAtom.read(this);

      case EExternal.floatTag:
      case EExternal.newFloatTag:
        return EDouble.read(this);

      case EExternal.refTag:
      case EExternal.newRefTag:
        return ERef.read(this);

      case EExternal.portTag:
        return EPort.read(this);

      case EExternal.pidTag:
        return EPID.read(this);

      case EExternal.stringTag:
        return EString.read(this);

      case EExternal.listTag:
      case EExternal.nilTag:
        if ((flags & DECODE_INT_LISTS_AS_STRINGS) != 0) {
          final int savePos = getPos();
          try {
            return EString.read(this);
          } catch (final IOException e) {
          }
          setPos(savePos);
        }
        return EList.read(this);

      case EExternal.smallTupleTag:
      case EExternal.largeTupleTag:
        return ETuple.read(this);

      case EExternal.binTag:
        return EBinary.read(this);

      case EExternal.bitBinTag:
        return EBitString.read(this);

      case EExternal.compressedTag:
        return read_compressed();

      case EExternal.newFunTag:
      case EExternal.funTag:
        return EFun.read(this);

      case EExternal.externalFunTag:
        return read_external_fun();

      default:
        throw new IOException("Unknown data type: " + tag + " at position " + getPos());
    }
  }