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); }
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); }
// 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; }
oop as_float_prim(smiOop x) { if (!x->is_smi()) return ErrorCodes::vmString_prim_error(BADTYPEERROR); return as_floatOop(x->as_float_prim()); }