codeobject.c 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187
  1. #include "pocketpy/objects/codeobject.h"
  2. #include "pocketpy/common/utils.h"
  3. #include "pocketpy/pocketpy.h"
  4. #include <stdint.h>
  5. void Bytecode__set_signed_arg(Bytecode* self, int arg) {
  6. self->arg = (int16_t)arg;
  7. if((int16_t)self->arg != arg) {
  8. c11__abort("Bytecode__set_signed_arg(): %d is not representable in int16_t", arg);
  9. }
  10. }
  11. bool Bytecode__is_forward_jump(const Bytecode* self) {
  12. Opcode op = self->op;
  13. return (op >= OP_JUMP_FORWARD && op <= OP_LOOP_BREAK) ||
  14. (op == OP_FOR_ITER || op == OP_FOR_ITER_YIELD_VALUE);
  15. }
  16. static void FuncDecl__dtor(FuncDecl* self) {
  17. CodeObject__dtor(&self->code);
  18. c11_vector__dtor(&self->args);
  19. c11_vector__dtor(&self->kwargs);
  20. c11_smallmap_n2i__dtor(&self->kw_to_index);
  21. }
  22. FuncDecl_ FuncDecl__rcnew(SourceData_ src, c11_sv name) {
  23. FuncDecl* self = PK_MALLOC(sizeof(FuncDecl));
  24. self->rc.count = 1;
  25. self->rc.dtor = (void (*)(void*))FuncDecl__dtor;
  26. CodeObject__ctor(&self->code, src, name);
  27. c11_vector__ctor(&self->args, sizeof(int));
  28. c11_vector__ctor(&self->kwargs, sizeof(FuncDeclKwArg));
  29. self->starred_arg = -1;
  30. self->starred_kwarg = -1;
  31. self->nested = false;
  32. self->docstring = NULL;
  33. self->type = FuncType_UNSET;
  34. c11_smallmap_n2i__ctor(&self->kw_to_index);
  35. return self;
  36. }
  37. bool FuncDecl__is_duplicated_arg(const FuncDecl* decl, py_Name name) {
  38. py_Name tmp_name;
  39. c11__foreach(int, &decl->args, j) {
  40. tmp_name = c11__getitem(py_Name, &decl->args, *j);
  41. if(tmp_name == name) return true;
  42. }
  43. c11__foreach(FuncDeclKwArg, &decl->kwargs, kv) {
  44. tmp_name = c11__getitem(py_Name, &decl->code.varnames, kv->index);
  45. if(tmp_name == name) return true;
  46. }
  47. if(decl->starred_arg != -1) {
  48. tmp_name = c11__getitem(py_Name, &decl->code.varnames, decl->starred_arg);
  49. if(tmp_name == name) return true;
  50. }
  51. if(decl->starred_kwarg != -1) {
  52. tmp_name = c11__getitem(py_Name, &decl->code.varnames, decl->starred_kwarg);
  53. if(tmp_name == name) return true;
  54. }
  55. return false;
  56. }
  57. void FuncDecl__add_arg(FuncDecl* self, py_Name name) {
  58. int index = CodeObject__add_varname(&self->code, name);
  59. c11_vector__push(int, &self->args, index);
  60. }
  61. void FuncDecl__add_kwarg(FuncDecl* self, py_Name name, const py_TValue* value) {
  62. int index = CodeObject__add_varname(&self->code, name);
  63. c11_smallmap_n2i__set(&self->kw_to_index, name, index);
  64. FuncDeclKwArg* item = c11_vector__emplace(&self->kwargs);
  65. item->index = index;
  66. item->key = name;
  67. item->value = *value;
  68. }
  69. void FuncDecl__add_starred_arg(FuncDecl* self, py_Name name) {
  70. int index = CodeObject__add_varname(&self->code, name);
  71. self->starred_arg = index;
  72. }
  73. void FuncDecl__add_starred_kwarg(FuncDecl* self, py_Name name) {
  74. int index = CodeObject__add_varname(&self->code, name);
  75. self->starred_kwarg = index;
  76. }
  77. FuncDecl_ FuncDecl__build(c11_sv name,
  78. c11_sv* args,
  79. int argc,
  80. c11_sv starred_arg,
  81. c11_sv* kwargs,
  82. int kwargc,
  83. py_Ref kwdefaults, // a tuple contains default values
  84. c11_sv starred_kwarg,
  85. const char* docstring) {
  86. SourceData_ source = SourceData__rcnew("pass", "<bind>", EXEC_MODE, false);
  87. FuncDecl_ decl = FuncDecl__rcnew(source, name);
  88. for(int i = 0; i < argc; i++) {
  89. FuncDecl__add_arg(decl, py_namev(args[i]));
  90. }
  91. if(starred_arg.size) { FuncDecl__add_starred_arg(decl, py_namev(starred_arg)); }
  92. assert(py_istype(kwdefaults, tp_tuple));
  93. assert(py_tuple_len(kwdefaults) == kwargc);
  94. for(int i = 0; i < kwargc; i++) {
  95. FuncDecl__add_kwarg(decl, py_namev(kwargs[i]), py_tuple_getitem(kwdefaults, i));
  96. }
  97. if(starred_kwarg.size) FuncDecl__add_starred_kwarg(decl, py_namev(starred_kwarg));
  98. decl->docstring = docstring;
  99. PK_DECREF(source);
  100. return decl;
  101. }
  102. void CodeObject__ctor(CodeObject* self, SourceData_ src, c11_sv name) {
  103. self->src = src;
  104. PK_INCREF(src);
  105. self->name = c11_string__new2(name.data, name.size);
  106. c11_vector__ctor(&self->codes, sizeof(Bytecode));
  107. c11_vector__ctor(&self->codes_ex, sizeof(BytecodeEx));
  108. c11_vector__ctor(&self->consts, sizeof(py_TValue));
  109. c11_vector__ctor(&self->varnames, sizeof(uint16_t));
  110. self->nlocals = 0;
  111. c11_smallmap_n2i__ctor(&self->varnames_inv);
  112. c11_vector__ctor(&self->blocks, sizeof(CodeBlock));
  113. c11_vector__ctor(&self->func_decls, sizeof(FuncDecl_));
  114. self->start_line = -1;
  115. self->end_line = -1;
  116. CodeBlock root_block = {CodeBlockType_NO_BLOCK, -1, 0, -1, -1};
  117. c11_vector__push(CodeBlock, &self->blocks, root_block);
  118. }
  119. void CodeObject__dtor(CodeObject* self) {
  120. PK_DECREF(self->src);
  121. c11_string__delete(self->name);
  122. c11_vector__dtor(&self->codes);
  123. c11_vector__dtor(&self->codes_ex);
  124. c11_vector__dtor(&self->consts);
  125. c11_vector__dtor(&self->varnames);
  126. c11_smallmap_n2i__dtor(&self->varnames_inv);
  127. c11_vector__dtor(&self->blocks);
  128. for(int i = 0; i < self->func_decls.length; i++) {
  129. FuncDecl_ decl = c11__getitem(FuncDecl_, &self->func_decls, i);
  130. PK_DECREF(decl);
  131. }
  132. c11_vector__dtor(&self->func_decls);
  133. }
  134. void Function__ctor(Function* self, FuncDecl_ decl, py_GlobalRef module, py_Ref globals) {
  135. PK_INCREF(decl);
  136. self->decl = decl;
  137. self->module = module;
  138. self->globals = globals;
  139. self->closure = NULL;
  140. self->clazz = NULL;
  141. self->cfunc = NULL;
  142. }
  143. int CodeObject__add_varname(CodeObject* self, py_Name name) {
  144. int index = c11_smallmap_n2i__get(&self->varnames_inv, name, -1);
  145. if(index >= 0) return index;
  146. c11_vector__push(uint16_t, &self->varnames, name);
  147. self->nlocals++;
  148. index = self->varnames.length - 1;
  149. c11_smallmap_n2i__set(&self->varnames_inv, name, index);
  150. return index;
  151. }
  152. void Function__dtor(Function* self) {
  153. // printf("%s() in %s freed!\n", self->decl->code.name->data,
  154. // self->decl->code.src->filename->data);
  155. PK_DECREF(self->decl);
  156. if(self->closure) NameDict__delete(self->closure);
  157. }