This commit is contained in:
blueloveTH 2023-02-27 18:22:41 +08:00
parent f67861b24e
commit 2d26f836ae
2 changed files with 45 additions and 53 deletions

View File

@ -164,22 +164,14 @@ union __8B {
__8B(f64 val) : _float(val) {} __8B(f64 val) : _float(val) {}
}; };
// Create a new object with the native type `T` and return a PyVar
template<typename T>
PyVar object(VM* vm, T&) { UNREACHABLE(); }
template<typename T>
PyVar object(VM* vm, T&&) { UNREACHABLE(); }
template<typename T>
PyVar object(VM* vm, T) { UNREACHABLE(); }
// Cast a PyVar to a native type `T` by reference // Cast a PyVar to a native type `T` by reference
template<typename T> template<typename T>
T& cast(VM* vm, const PyVar& var) { UNREACHABLE(); } T& py_cast(VM* vm, const PyVar& var) { UNREACHABLE(); }
template<typename T> template<typename T>
T cast(VM* vm, const PyVar& var) { UNREACHABLE(); } T py_cast(VM* vm, const PyVar& var) { UNREACHABLE(); }
template<typename T> template<typename T>
T& _cast(VM* vm, const PyVar& var) { UNREACHABLE(); } T& _py_cast(VM* vm, const PyVar& var) { UNREACHABLE(); }
template<typename T> template<typename T>
T _cast(VM* vm, const PyVar& var) { UNREACHABLE(); } T _py_cast(VM* vm, const PyVar& var) { UNREACHABLE(); }
} // namespace pkpy } // namespace pkpy

View File

@ -955,48 +955,48 @@ void CodeObject::optimize(VM* vm){
} }
} }
template<> PyVar object<i64>(VM* vm, i64 val){ PyVar py_object(VM* vm, i64 val){
if(((val << 2) >> 2) != val){ if(((val << 2) >> 2) != val){
vm->_error("OverflowError", std::to_string(val) + " is out of range"); vm->_error("OverflowError", std::to_string(val) + " is out of range");
}
val = (val << 2) | 0b01;
return PyVar(reinterpret_cast<int*>(val));
}
template<> i64 cast<i64>(VM* vm, const PyVar& obj){
vm->check_type(obj, vm->tp_int);
return obj.bits >> 2;
}
template<> i64 _cast<i64>(VM* vm, const PyVar& obj){
return obj.bits >> 2;
}
template<> PyVar object<f64>(VM* vm, f64 val){
i64 bits = __8B(val)._int;
bits = (bits >> 2) << 2;
bits |= 0b10;
return PyVar(reinterpret_cast<int*>(bits));
}
template<> f64 cast<f64>(VM* vm, const PyVar& obj){
vm->check_type(obj, vm->tp_float);
i64 bits = obj.bits;
bits = (bits >> 2) << 2;
return __8B(bits)._float;
}
template<> f64 _cast<f64>(VM* vm, const PyVar& obj){
i64 bits = obj.bits;
bits = (bits >> 2) << 2;
return __8B(bits)._float;
} }
val = (val << 2) | 0b01;
return PyVar(reinterpret_cast<int*>(val));
}
template<> i64 py_cast<i64>(VM* vm, const PyVar& obj){
vm->check_type(obj, vm->tp_int);
return obj.bits >> 2;
}
template<> i64 _py_cast<i64>(VM* vm, const PyVar& obj){
return obj.bits >> 2;
}
template<> PyVar object<bool>(VM* vm, bool val){ PyVar py_object(VM* vm, f64 val){
return val ? vm->True : vm->False; i64 bits = __8B(val)._int;
} bits = (bits >> 2) << 2;
template<> bool cast<bool>(VM* vm, const PyVar& obj){ bits |= 0b10;
vm->check_type(obj, vm->tp_bool); return PyVar(reinterpret_cast<int*>(bits));
return obj == vm->True; }
} template<> f64 py_cast<f64>(VM* vm, const PyVar& obj){
template<> bool _cast<bool>(VM* vm, const PyVar& obj){ vm->check_type(obj, vm->tp_float);
return obj == vm->True; i64 bits = obj.bits;
} bits = (bits >> 2) << 2;
return __8B(bits)._float;
}
template<> f64 _py_cast<f64>(VM* vm, const PyVar& obj){
i64 bits = obj.bits;
bits = (bits >> 2) << 2;
return __8B(bits)._float;
}
PyVar py_object(VM* vm, bool val){
return val ? vm->True : vm->False;
}
template<> bool py_cast<bool>(VM* vm, const PyVar& obj){
vm->check_type(obj, vm->tp_bool);
return obj == vm->True;
}
template<> bool _py_cast<bool>(VM* vm, const PyVar& obj){
return obj == vm->True;
}
} // namespace pkpy } // namespace pkpy