codeobject.c 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  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_string 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 PyVar* 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_string name){
  40. self->src = src; PK_INCREF(src);
  41. py_Str__ctor2(&self->name, name.data, name.size);
  42. c11_vector__ctor(&self->codes, sizeof(Bytecode));
  43. c11_vector__ctor(&self->codes_ex, sizeof(BytecodeEx));
  44. c11_vector__ctor(&self->consts, sizeof(PyVar));
  45. c11_vector__ctor(&self->varnames, sizeof(uint16_t));
  46. self->nlocals = 0;
  47. c11_smallmap_n2i__ctor(&self->varnames_inv);
  48. c11_smallmap_n2i__ctor(&self->labels);
  49. c11_vector__ctor(&self->blocks, sizeof(CodeBlock));
  50. c11_vector__ctor(&self->func_decls, sizeof(FuncDecl_));
  51. self->start_line = -1;
  52. self->end_line = -1;
  53. CodeBlock root_block = {CodeBlockType_NO_BLOCK, -1, 0, -1, -1};
  54. c11_vector__push(CodeBlock, &self->blocks, root_block);
  55. }
  56. void CodeObject__dtor(CodeObject* self){
  57. PK_DECREF(self->src);
  58. py_Str__dtor(&self->name);
  59. c11_vector__dtor(&self->codes);
  60. c11_vector__dtor(&self->codes_ex);
  61. c11_vector__dtor(&self->consts);
  62. c11_vector__dtor(&self->varnames);
  63. c11_smallmap_n2i__dtor(&self->varnames_inv);
  64. c11_smallmap_n2i__dtor(&self->labels);
  65. c11_vector__dtor(&self->blocks);
  66. for(int i=0; i<self->func_decls.count; i++){
  67. FuncDecl_ decl = c11__getitem(FuncDecl_, &self->func_decls, i);
  68. PK_DECREF(decl);
  69. }
  70. c11_vector__dtor(&self->func_decls);
  71. }