in runtime/array-module.cpp [99:216]
static RawObject packObject(Thread* thread, uword address, char typecode,
word index, RawObject value) {
byte* dst = reinterpret_cast<byte*>(address + index);
if (isIntTypecode(typecode)) {
if (!value.isInt()) return Unbound::object();
switch (typecode) {
case 'b': {
OptInt<char> opt_val = RawInt::cast(value).asInt<char>();
if (opt_val.error != CastError::None) {
return raiseOverflowError(thread, opt_val.error);
}
std::memcpy(dst, &opt_val.value, sizeof(opt_val.value));
break;
}
case 'h': {
OptInt<short> opt_val = RawInt::cast(value).asInt<short>();
if (opt_val.error != CastError::None) {
return raiseOverflowError(thread, opt_val.error);
}
std::memcpy(dst, &opt_val.value, sizeof(opt_val.value));
break;
}
case 'i': {
OptInt<int> opt_val = RawInt::cast(value).asInt<int>();
if (opt_val.error != CastError::None) {
return raiseOverflowError(thread, opt_val.error);
}
std::memcpy(dst, &opt_val.value, sizeof(opt_val.value));
break;
}
case 'l': {
OptInt<long> opt_val = RawInt::cast(value).asInt<long>();
if (opt_val.error != CastError::None) {
return raiseOverflowError(thread, opt_val.error);
}
std::memcpy(dst, &opt_val.value, sizeof(opt_val.value));
break;
}
case 'B': {
OptInt<unsigned char> opt_val =
RawInt::cast(value).asInt<unsigned char>();
if (opt_val.error != CastError::None) {
return raiseOverflowError(thread, opt_val.error);
}
std::memcpy(dst, &opt_val.value, sizeof(opt_val.value));
break;
}
case 'H': {
OptInt<unsigned short> opt_val =
RawInt::cast(value).asInt<unsigned short>();
if (opt_val.error != CastError::None) {
return raiseOverflowError(thread, opt_val.error);
}
std::memcpy(dst, &opt_val.value, sizeof(opt_val.value));
break;
}
case 'I': {
OptInt<unsigned int> opt_val =
RawInt::cast(value).asInt<unsigned int>();
if (opt_val.error != CastError::None) {
return raiseOverflowError(thread, opt_val.error);
}
std::memcpy(dst, &opt_val.value, sizeof(opt_val.value));
break;
}
case 'L': {
OptInt<unsigned long> opt_val =
RawInt::cast(value).asInt<unsigned long>();
if (opt_val.error != CastError::None) {
return raiseOverflowError(thread, opt_val.error);
}
std::memcpy(dst, &opt_val.value, sizeof(opt_val.value));
break;
}
case 'q': {
OptInt<long long> opt_val = RawInt::cast(value).asInt<long long>();
if (opt_val.error != CastError::None) {
return raiseOverflowError(thread, opt_val.error);
}
std::memcpy(dst, &opt_val.value, sizeof(opt_val.value));
break;
}
case 'Q': {
OptInt<unsigned long long> opt_val =
RawInt::cast(value).asInt<unsigned long long>();
if (opt_val.error != CastError::None) {
return raiseOverflowError(thread, opt_val.error);
}
std::memcpy(dst, &opt_val.value, sizeof(opt_val.value));
break;
}
}
return NoneType::object();
}
Runtime* runtime = thread->runtime();
switch (typecode) {
case 'f': {
if (!runtime->isInstanceOfFloat(value)) return Unbound::object();
float value_float = Float::cast(floatUnderlying(value)).value();
std::memcpy(dst, &value_float, sizeof(value_float));
return NoneType::object();
}
case 'd': {
if (!runtime->isInstanceOfFloat(value)) return Unbound::object();
double value_double = Float::cast(floatUnderlying(value)).value();
std::memcpy(dst, &value_double, sizeof(value_double));
return NoneType::object();
}
case 'u':
UNIMPLEMENTED("array.__setitem__ with unicode is unimplemented");
default:
UNREACHABLE("invalid typecode");
}
return NoneType::object();
}