codeobject.c 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. #include "pocketpy/objects/codeobject.h"
  2. #include "pocketpy/common/utils.h"
  3. #include <stdint.h>
  4. void Bytecode__set_signed_arg(Bytecode* self, int arg) {
  5. if(arg < INT16_MIN || arg > INT16_MAX) {
  6. PK_FATAL_ERROR("set_signed_arg: %d is out of range", arg);
  7. }
  8. self->arg = (int16_t)arg;
  9. }
  10. bool Bytecode__is_forward_jump(const Bytecode* self) {
  11. return self->op >= OP_JUMP_FORWARD && self->op <= OP_LOOP_BREAK;
  12. }
  13. FuncDecl_ FuncDecl__rcnew(pk_SourceData_ src, c11_sv name) {
  14. FuncDecl* self = malloc(sizeof(FuncDecl));
  15. self->rc.count = 1;
  16. self->rc.dtor = (void (*)(void*))FuncDecl__dtor;
  17. CodeObject__ctor(&self->code, src, name);
  18. c11_vector__ctor(&self->args, sizeof(int));
  19. c11_vector__ctor(&self->kwargs, sizeof(FuncDeclKwArg));
  20. self->starred_arg = -1;
  21. self->starred_kwarg = -1;
  22. self->nested = false;
  23. self->docstring = NULL;
  24. self->type = FuncType_UNSET;
  25. c11_smallmap_n2i__ctor(&self->kw_to_index);
  26. return self;
  27. }
  28. void FuncDecl__dtor(FuncDecl* self) {
  29. CodeObject__dtor(&self->code);
  30. c11_vector__dtor(&self->args);
  31. c11_vector__dtor(&self->kwargs);
  32. c11_smallmap_n2i__dtor(&self->kw_to_index);
  33. }
  34. void FuncDecl__add_kwarg(FuncDecl* self, int index, uint16_t key, const py_TValue* value) {
  35. c11_smallmap_n2i__set(&self->kw_to_index, key, index);
  36. FuncDeclKwArg item = {index, key, *value};
  37. c11_vector__push(FuncDeclKwArg, &self->kwargs, item);
  38. }
  39. void CodeObject__ctor(CodeObject* self, pk_SourceData_ src, c11_sv name) {
  40. self->src = src;
  41. PK_INCREF(src);
  42. self->name = c11_string__new2(name.data, name.size);
  43. c11_vector__ctor(&self->codes, sizeof(Bytecode));
  44. c11_vector__ctor(&self->codes_ex, sizeof(BytecodeEx));
  45. c11_vector__ctor(&self->consts, sizeof(py_TValue));
  46. c11_vector__ctor(&self->varnames, sizeof(uint16_t));
  47. self->nlocals = 0;
  48. c11_smallmap_n2i__ctor(&self->varnames_inv);
  49. c11_smallmap_n2i__ctor(&self->labels);
  50. c11_vector__ctor(&self->blocks, sizeof(CodeBlock));
  51. c11_vector__ctor(&self->func_decls, sizeof(FuncDecl_));
  52. self->start_line = -1;
  53. self->end_line = -1;
  54. CodeBlock root_block = {CodeBlockType_NO_BLOCK, -1, 0, -1, -1};
  55. c11_vector__push(CodeBlock, &self->blocks, root_block);
  56. }
  57. void CodeObject__dtor(CodeObject* self) {
  58. PK_DECREF(self->src);
  59. c11_string__delete(self->name);
  60. c11_vector__dtor(&self->codes);
  61. c11_vector__dtor(&self->codes_ex);
  62. c11_vector__dtor(&self->consts);
  63. c11_vector__dtor(&self->varnames);
  64. c11_smallmap_n2i__dtor(&self->varnames_inv);
  65. c11_smallmap_n2i__dtor(&self->labels);
  66. c11_vector__dtor(&self->blocks);
  67. for(int i = 0; i < self->func_decls.count; i++) {
  68. FuncDecl_ decl = c11__getitem(FuncDecl_, &self->func_decls, i);
  69. PK_DECREF(decl);
  70. }
  71. c11_vector__dtor(&self->func_decls);
  72. }