mirror of
https://github.com/pocketpy/pocketpy
synced 2025-10-20 11:30:18 +00:00
up
This commit is contained in:
parent
f67861b24e
commit
2d26f836ae
16
src/obj.h
16
src/obj.h
@ -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
|
82
src/vm.h
82
src/vm.h
@ -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
|
Loading…
x
Reference in New Issue
Block a user