values.c 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. #include "pocketpy/pocketpy.h"
  2. #include "pocketpy/common/utils.h"
  3. #include "pocketpy/objects/object.h"
  4. #include "pocketpy/interpreter/vm.h"
  5. void py_newint(py_Ref out, int64_t val) {
  6. out->type = tp_int;
  7. out->is_ptr = false;
  8. out->_i64 = val;
  9. }
  10. void py_newfloat(py_Ref out, double val) {
  11. out->type = tp_float;
  12. out->is_ptr = false;
  13. out->_f64 = val;
  14. }
  15. void py_newbool(py_Ref out, bool val) {
  16. pk_VM* vm = pk_current_vm;
  17. *out = val ? vm->True : vm->False;
  18. }
  19. void py_newstr(py_Ref out, const char* data) {
  20. pk_ManagedHeap* heap = &pk_current_vm->heap;
  21. PyObject* obj = pk_ManagedHeap__gcnew(heap, tp_str, 0, sizeof(py_Str));
  22. py_Str__ctor(PyObject__value(obj), data);
  23. out->type = tp_str;
  24. out->is_ptr = true;
  25. out->_obj = obj;
  26. }
  27. void py_newstrn(py_Ref out, const char* data, int size) {
  28. pk_ManagedHeap* heap = &pk_current_vm->heap;
  29. PyObject* obj = pk_ManagedHeap__gcnew(heap, tp_str, 0, sizeof(py_Str));
  30. py_Str__ctor2((py_Str*)PyObject__value(obj), data, size);
  31. out->type = tp_str;
  32. out->is_ptr = true;
  33. out->_obj = obj;
  34. }
  35. void py_newbytes(py_Ref out, const unsigned char* data, int size) {
  36. pk_ManagedHeap* heap = &pk_current_vm->heap;
  37. // 4 bytes size + data
  38. PyObject* obj = pk_ManagedHeap__gcnew(heap, tp_bytes, 0, sizeof(int) + size);
  39. int* psize = (int*)PyObject__value(obj);
  40. *psize = size;
  41. memcpy(psize + 1, data, size);
  42. out->type = tp_bytes;
  43. out->is_ptr = true;
  44. out->_obj = obj;
  45. }
  46. void py_newnone(py_Ref out) {
  47. pk_VM* vm = pk_current_vm;
  48. *out = vm->None;
  49. }
  50. void py_newnull(py_Ref out) { out->type = 0; }
  51. void py_newfunction(py_Ref out, py_CFunction f, const char* sig) {
  52. py_newfunction2(out, f, sig, BindType_FUNCTION, NULL, NULL);
  53. }
  54. void py_newfunction2(py_Ref out,
  55. py_CFunction f,
  56. const char* sig,
  57. BindType bt,
  58. const char* docstring,
  59. const py_Ref upvalue) {}
  60. void py_newnativefunc(py_Ref out, py_CFunction f, int argc) {
  61. py_newnativefunc2(out, f, argc, BindType_FUNCTION, NULL, NULL);
  62. }
  63. void py_newnativefunc2(py_Ref out,
  64. py_CFunction f,
  65. int argc,
  66. BindType bt,
  67. const char* docstring,
  68. const py_Ref upvalue) {}
  69. void py_newobject(py_Ref out, py_Type type, int slots, int udsize){
  70. pk_ManagedHeap* heap = &pk_current_vm->heap;
  71. PyObject* obj = pk_ManagedHeap__gcnew(heap, type, slots, udsize);
  72. out->type = type;
  73. out->is_ptr = true;
  74. out->_obj = obj;
  75. }
  76. void py_pushint(int64_t val) { py_newint(pk_current_vm->stack.sp++, val); }
  77. void py_pushfloat(double val) { py_newfloat(pk_current_vm->stack.sp++, val); }
  78. void py_pushbool(bool val) { py_newbool(pk_current_vm->stack.sp++, val); }
  79. void py_pushstr(const char* val) { py_newstr(pk_current_vm->stack.sp++, val); }
  80. void py_pushstrn(const char* val, int size) { py_newstrn(pk_current_vm->stack.sp++, val, size); }
  81. void py_pushnone() { py_newnone(pk_current_vm->stack.sp++); }
  82. void py_pushnull() { py_newnull(pk_current_vm->stack.sp++); }
  83. void py_push_notimplemented() {
  84. pk_VM* vm = pk_current_vm;
  85. *vm->stack.sp++ = vm->NotImplemented;
  86. }