Exemplo n.º 1
0
oop smi_div_prim(smiOop rcvr,  smiOop arg) {
  if (!rcvr->is_smi())   return ErrorCodes::vmString_prim_error(BADTYPEERROR);
  if (! arg->is_smi())   return ErrorCodes::vmString_prim_error(BADTYPEERROR);
  smi r = rcvr->value();
  smi a = arg->value();
  if ((r == smiOop_min->value()) &&  a == -1) return ErrorCodes::vmString_prim_error(OVERFLOWERROR);
  if (a == 0)                                 return ErrorCodes::vmString_prim_error(DIVISIONBYZEROERROR);
  smi quo = (r / a);
  assert( abs(quo) == abs(r) / abs(a), "smi_div_prim is wrong on this platform");
  return as_smiOop(quo);
}
Exemplo n.º 2
0
oop smi_mod_prim(smiOop rcvr,  smiOop arg) {
  if (!rcvr->is_smi())   return ErrorCodes::vmString_prim_error(BADTYPEERROR);
  if (! arg->is_smi())   return ErrorCodes::vmString_prim_error(BADTYPEERROR);
  smi r = rcvr->value();
  smi a = arg->value();
  smi aa = a >= 0  ?  a  :  -a;
  if (a == 0) return ErrorCodes::vmString_prim_error(DIVISIONBYZEROERROR);
  int32 res = r % a;
  assert( smiOop(smi_div_prim(rcvr, arg))->value() * a   +  res  ==  r,
          "smi_mod_prim incorrect on this platform");
  return as_smiOop(res);
}
Exemplo n.º 3
0
// TODO: Implement the following function (gri)
extern "C" blockClosureOop allocateBlock(smiOop nofArgs) {
  PROLOGUE_1("allocateBlock", nofArgs);
  blockClosureOop blk =
    as_blockClosureOop(Universe::allocate(sizeof(blockClosureOopDesc)/oopSize));
  blk->init_mark();
  blk->set_klass_field(blockClosureKlass::blockKlassFor(nofArgs->value()));
  inc_block_counter();
  return blk;
}
Exemplo n.º 4
0
oop as_float_prim(smiOop x) {
  if (!x->is_smi()) return ErrorCodes::vmString_prim_error(BADTYPEERROR);
  return as_floatOop(x->as_float_prim());
}