PRIM_DECL_3(doubleByteArrayPrimitives::atPut, oop receiver, oop index, oop value) { PROLOGUE_3("atPut", receiver, index, value); ASSERT_RECEIVER; // check index type if (!index->is_smi()) return markSymbol(vmSymbols::first_argument_has_wrong_type()); // check value type if (!value->is_smi()) return markSymbol(vmSymbols::second_argument_has_wrong_type()); // check index value if (!doubleByteArrayOop(receiver)->is_within_bounds(smiOop(index)->value())) return markSymbol(vmSymbols::out_of_bounds()); // check value as double byte unsigned int v = (unsigned int) smiOop(value)->value(); if (v >= (1<<16)) return markSymbol(vmSymbols::value_out_of_range()); // do the operation doubleByteArrayOop(receiver)->doubleByte_at_put(smiOop(index)->value(), v); return receiver; }
void checkSmallInteger(oop result, int expected) { char message[200]; ASSERT_TRUE_M(result->is_smi(), "Should be small integer"); int actual = smiOop(result)->value(); sprintf(message, "wrong value. expected: %d, was: %d", expected, actual); ASSERT_EQUALS_M(expected, actual, message); }
PRIM_DECL_2(doubleByteArrayPrimitives::allocateSize, oop receiver, oop argument) { PROLOGUE_2("allocateSize", receiver, argument) assert(receiver->is_klass() && klassOop(receiver)->klass_part()->oop_is_doubleByteArray(), "receiver must double byte array class"); if (!argument->is_smi()) markSymbol(vmSymbols::first_argument_has_wrong_type()); if (smiOop(argument)->value() < 0) return markSymbol(vmSymbols::negative_size()); klassOop k = klassOop(receiver); int ni_size = k->klass_part()->non_indexable_size(); int obj_size = ni_size + 1 + roundTo(smiOop(argument)->value() * 2, oopSize) / oopSize; // allocate doubleByteArrayOop obj = as_doubleByteArrayOop(Universe::allocate(obj_size, (memOop*)&k)); // header memOop(obj)->initialize_header(true, k); // instance variables memOop(obj)->initialize_body(memOopDesc::header_size(), ni_size); // indexables oop* base = (oop*) obj->addr(); oop* end = base + obj_size; // %optimized 'obj->set_length(size)' base[ni_size] = argument; // %optimized 'for (int index = 1; index <= size; index++) // obj->doubleByte_at_put(index, 0)' base = &base[ni_size+1]; while (base < end) *base++ = (oop) 0; return obj; }
PRIM_DECL_2(doubleValueArrayPrimitives::allocateSize, oop receiver, oop argument) { PROLOGUE_2("allocateSize", receiver, argument) assert(receiver->is_klass() && klassOop(receiver)->klass_part()->oop_is_doubleValueArray(), "receiver must double byte array class"); if (!argument->is_smi()) markSymbol(vmSymbols::first_argument_has_wrong_type()); if (smiOop(argument)->value() < 0) return markSymbol(vmSymbols::negative_size()); int length = smiOop(argument)->value(); klassOop k = klassOop(receiver); int ni_size = k->klass_part()->non_indexable_size(); int obj_size = ni_size + 1 + roundTo(length * sizeof(double), oopSize) / oopSize; // allocate doubleValueArrayOop obj = as_doubleValueArrayOop(Universe::allocate(obj_size, (memOop*)&k)); // header memOop(obj)->initialize_header(true, k); // instance variables memOop(obj)->initialize_body(memOopDesc::header_size(), ni_size); obj->set_length(length); for (int index = 1; index <= length; index++) { obj->double_at_put(index, 0.0); } return obj; }
oop objVectorOopClass::ov_at_put_prim(oop rcvr, oop indexOop, oop contents) { if (!rcvr->is_objVector()) return ErrorCodes::vmString_prim_error(BADTYPEERROR); if (!indexOop->is_smi()) return ErrorCodes::vmString_prim_error(BADTYPEERROR); smi index = smiOop(indexOop)->value(); if (unsigned(index) >= unsigned(objVectorOop(rcvr)->length())) return ErrorCodes::vmString_prim_error(BADINDEXERROR); objVectorOop(rcvr)->obj_at_put(index, contents); return rcvr; }
int asInt(bool &ok, oop intOop) { ok = true; if (intOop->is_smi()) return smiOop(intOop)->value(); if (!intOop->is_byteArray()) { ok = false; return 0; } return byteArrayOop(intOop)->number().as_int(ok); }
PRIM_DECL_2(behaviorPrimitives::classVariableAt, oop behavior, oop index) { PROLOGUE_2("classVariableAt", behavior, index); if (!behavior->is_klass()) return markSymbol(vmSymbols::first_argument_has_wrong_type()); if (!index->is_smi()) return markSymbol(vmSymbols::second_argument_has_wrong_type()); int i = smiOop(index)->value(); if (i > 0 && i <= klassOop(behavior)->klass_part()->number_of_classVars()) return klassOop(behavior)->klass_part()->classVar_at(i); return markSymbol(vmSymbols::out_of_bounds()); }
PRIM_DECL_2(doubleByteArrayPrimitives::at, oop receiver, oop index) { PROLOGUE_2("at", receiver, index); ASSERT_RECEIVER; // check index type if (!index->is_smi()) return markSymbol(vmSymbols::first_argument_has_wrong_type()); // check index value if (!doubleByteArrayOop(receiver)->is_within_bounds(smiOop(index)->value())) return markSymbol(vmSymbols::out_of_bounds()); return as_smiOop(doubleByteArrayOop(receiver)->doubleByte_at(smiOop(index)->value())); }
PRIM_DECL_2(doubleByteArrayPrimitives::characterAt, oop receiver, oop index) { PROLOGUE_2("characterAt", receiver, index); ASSERT_RECEIVER; // check index type if (!index->is_smi()) return markSymbol(vmSymbols::first_argument_has_wrong_type()); // range check if (!doubleByteArrayOop(receiver)->is_within_bounds(smiOop(index)->value())) return markSymbol(vmSymbols::out_of_bounds()); // fetch double byte doubleByte byte = doubleByteArrayOop(receiver)->doubleByte_at(smiOop(index)->value()); if (byte < 256) { // return the byte+1'th element in asciiCharacter return Universe::asciiCharacters()->obj_at(byte+1); } else return markSymbol(vmSymbols::out_of_bounds()); }
PRIM_DECL_3(doubleValueArrayPrimitives::atPut, oop receiver, oop index, oop value) { PROLOGUE_3("atPut", receiver, index, value); ASSERT_RECEIVER; // check index type if (!index->is_smi()) return markSymbol(vmSymbols::first_argument_has_wrong_type()); // check value type if (!value->is_double()) return markSymbol(vmSymbols::second_argument_has_wrong_type()); // check index value if (!doubleValueArrayOop(receiver)->is_within_bounds(smiOop(index)->value())) return markSymbol(vmSymbols::out_of_bounds()); // do the operation doubleValueArrayOop(receiver)->double_at_put(smiOop(index)->value(), doubleOop(value)->value()); return receiver; }
oop printEvent_prim(oop rcvr, oop arg) { if (!arg->is_smi()) return VMString[BADTYPEERROR]; eventLog->printPartial(smiOop(arg)->value()); return rcvr; }