blueloveTH 1 год назад
Родитель
Сommit
c5ab28d75b
3 измененных файлов с 73 добавлено и 169 удалено
  1. 3 56
      include/pocketpy/common/strname.h
  2. 62 0
      include/pocketpy/xmacros/magics.h
  3. 8 113
      src/common/strname.c

+ 3 - 56
include/pocketpy/common/strname.h

@@ -29,62 +29,9 @@ extern "C" {
 namespace pkpy {
 #endif
 
-// unary operators
-extern uint16_t __repr__;
-extern uint16_t __str__;
-extern uint16_t __hash__;
-extern uint16_t __len__;
-extern uint16_t __iter__;
-extern uint16_t __next__;
-extern uint16_t __neg__;
-// logical operators
-extern uint16_t __eq__;
-extern uint16_t __ne__;
-extern uint16_t __lt__;
-extern uint16_t __le__;
-extern uint16_t __gt__;
-extern uint16_t __ge__;
-extern uint16_t __contains__;
-// binary operators
-extern uint16_t __add__;
-extern uint16_t __radd__;
-extern uint16_t __sub__;
-extern uint16_t __rsub__;
-extern uint16_t __mul__;
-extern uint16_t __rmul__;
-extern uint16_t __truediv__;
-extern uint16_t __rtruediv__;
-extern uint16_t __floordiv__;
-extern uint16_t __rfloordiv__;
-extern uint16_t __mod__;
-extern uint16_t __rmod__;
-extern uint16_t __pow__;
-extern uint16_t __rpow__;
-extern uint16_t __matmul__;
-extern uint16_t __lshift__;
-extern uint16_t __rshift__;
-extern uint16_t __and__;
-extern uint16_t __or__;
-extern uint16_t __xor__;
-extern uint16_t __invert__;
-// indexer
-extern uint16_t __getitem__;
-extern uint16_t __setitem__;
-extern uint16_t __delitem__;
-
-// specials
-extern uint16_t __new__;
-extern uint16_t __init__;
-extern uint16_t __call__;
-extern uint16_t __divmod__;
-extern uint16_t __enter__;
-extern uint16_t __exit__;
-extern uint16_t __name__;
-extern uint16_t __all__;
-extern uint16_t __package__;
-extern uint16_t __path__;
-extern uint16_t __class__;
-extern uint16_t __missing__;
+#define MAGIC_METHOD(x) extern uint16_t x;
+#include "pocketpy/xmacros/magics.h"
+#undef MAGIC_METHOD
 
 extern uint16_t pk_id_add;
 extern uint16_t pk_id_set;

+ 62 - 0
include/pocketpy/xmacros/magics.h

@@ -0,0 +1,62 @@
+#ifdef MAGIC_METHOD
+
+// unary operators
+MAGIC_METHOD(__repr__)
+MAGIC_METHOD(__str__)
+MAGIC_METHOD(__hash__)
+MAGIC_METHOD(__len__)
+MAGIC_METHOD(__iter__)
+MAGIC_METHOD(__next__)
+MAGIC_METHOD(__neg__)
+MAGIC_METHOD(__invert__)
+// logical operators
+MAGIC_METHOD(__contains__)
+/////////////////////////////
+MAGIC_METHOD(__eq__)
+MAGIC_METHOD(__ne__)
+MAGIC_METHOD(__lt__)
+MAGIC_METHOD(__le__)
+MAGIC_METHOD(__gt__)
+MAGIC_METHOD(__ge__)
+// binary operators
+MAGIC_METHOD(__add__)
+MAGIC_METHOD(__radd__)
+MAGIC_METHOD(__sub__)
+MAGIC_METHOD(__rsub__)
+MAGIC_METHOD(__mul__)
+MAGIC_METHOD(__rmul__)
+MAGIC_METHOD(__truediv__)
+MAGIC_METHOD(__rtruediv__)
+MAGIC_METHOD(__floordiv__)
+MAGIC_METHOD(__rfloordiv__)
+MAGIC_METHOD(__mod__)
+MAGIC_METHOD(__rmod__)
+MAGIC_METHOD(__pow__)
+MAGIC_METHOD(__rpow__)
+MAGIC_METHOD(__matmul__)
+MAGIC_METHOD(__lshift__)
+MAGIC_METHOD(__rshift__)
+MAGIC_METHOD(__and__)
+MAGIC_METHOD(__or__)
+MAGIC_METHOD(__xor__)
+/////////////////////////////
+// indexer
+MAGIC_METHOD(__getitem__)
+MAGIC_METHOD(__setitem__)
+MAGIC_METHOD(__delitem__)
+
+// specials
+MAGIC_METHOD(__new__)
+MAGIC_METHOD(__init__)
+MAGIC_METHOD(__call__)
+MAGIC_METHOD(__divmod__)
+MAGIC_METHOD(__enter__)
+MAGIC_METHOD(__exit__)
+MAGIC_METHOD(__name__)
+MAGIC_METHOD(__all__)
+MAGIC_METHOD(__package__)
+MAGIC_METHOD(__path__)
+MAGIC_METHOD(__class__)
+MAGIC_METHOD(__missing__)
+
+#endif

+ 8 - 113
src/common/strname.c

@@ -19,66 +19,13 @@ void pk_StrName__initialize() {
     c11_vector__ctor(&_r_interned, sizeof(c11_string));
     _initialized = true;
 
-    // unary operators
-    __repr__ = pk_StrName__map("__repr__");
-    __str__ = pk_StrName__map("__str__");
-    __hash__ = pk_StrName__map("__hash__");
-    __len__ = pk_StrName__map("__len__");
-    __iter__ = pk_StrName__map("__iter__");
-    __next__ = pk_StrName__map("__next__");
-    __neg__ = pk_StrName__map("__neg__");
-    // logical operators
-    __eq__ = pk_StrName__map("__eq__");
-    __ne__ = pk_StrName__map("__ne__");
-    __lt__ = pk_StrName__map("__lt__");
-    __le__ = pk_StrName__map("__le__");
-    __gt__ = pk_StrName__map("__gt__");
-    __ge__ = pk_StrName__map("__ge__");
-    __contains__ = pk_StrName__map("__contains__");
-    // binary operators
-    __add__ = pk_StrName__map("__add__");
-    __radd__ = pk_StrName__map("__radd__");
-    __sub__ = pk_StrName__map("__sub__");
-    __rsub__ = pk_StrName__map("__rsub__");
-    __mul__ = pk_StrName__map("__mul__");
-    __rmul__ = pk_StrName__map("__rmul__");
-    __truediv__ = pk_StrName__map("__truediv__");
-    __rtruediv__ = pk_StrName__map("__rtruediv__");
-    __floordiv__ = pk_StrName__map("__floordiv__");
-    __rfloordiv__ = pk_StrName__map("__rfloordiv__");
-    __mod__ = pk_StrName__map("__mod__");
-    __rmod__ = pk_StrName__map("__rmod__");
-    __pow__ = pk_StrName__map("__pow__");
-    __rpow__ = pk_StrName__map("__rpow__");
-    __matmul__ = pk_StrName__map("__matmul__");
-    __lshift__ = pk_StrName__map("__lshift__");
-    __rshift__ = pk_StrName__map("__rshift__");
-    __and__ = pk_StrName__map("__and__");
-    __or__ = pk_StrName__map("__or__");
-    __xor__ = pk_StrName__map("__xor__");
-    __invert__ = pk_StrName__map("__invert__");
-    // indexer
-    __getitem__ = pk_StrName__map("__getitem__");
-    __setitem__ = pk_StrName__map("__setitem__");
-    __delitem__ = pk_StrName__map("__delitem__");
-
-    // specials
-    __new__ = pk_StrName__map("__new__");
-    __init__ = pk_StrName__map("__init__");
-    __call__ = pk_StrName__map("__call__");
-    __divmod__ = pk_StrName__map("__divmod__");
-    __enter__ = pk_StrName__map("__enter__");
-    __exit__ = pk_StrName__map("__exit__");
-    __name__ = pk_StrName__map("__name__");
-    __all__ = pk_StrName__map("__all__");
-    __package__ = pk_StrName__map("__package__");
-    __path__ = pk_StrName__map("__path__");
-    __class__ = pk_StrName__map("__class__");
-    __missing__ = pk_StrName__map("__missing__");
+#define MAGIC_METHOD(x) x = pk_StrName__map(#x);
+#include "pocketpy/xmacros/magics.h"
+#undef MAGIC_METHOD
 
     // print all names
     for(int i = 0; i < _interned.count; i++) {
-        printf("%d: %s\n", i+1, c11__getitem(char*, &_r_interned, i));
+        printf("%d: %s\n", i + 1, c11__getitem(char*, &_r_interned, i));
     }
 
     pk_id_add = pk_StrName__map("add");
@@ -133,62 +80,10 @@ c11_string pk_StrName__rmap2(uint16_t index) {
     return (c11_string){p, strlen(p)};
 }
 
-// unary operators
-uint16_t __repr__;
-uint16_t __str__;
-uint16_t __hash__;
-uint16_t __len__;
-uint16_t __iter__;
-uint16_t __next__;
-uint16_t __neg__;
-// logical operators
-uint16_t __eq__;
-uint16_t __ne__;
-uint16_t __lt__;
-uint16_t __le__;
-uint16_t __gt__;
-uint16_t __ge__;
-uint16_t __contains__;
-// binary operators
-uint16_t __add__;
-uint16_t __radd__;
-uint16_t __sub__;
-uint16_t __rsub__;
-uint16_t __mul__;
-uint16_t __rmul__;
-uint16_t __truediv__;
-uint16_t __rtruediv__;
-uint16_t __floordiv__;
-uint16_t __rfloordiv__;
-uint16_t __mod__;
-uint16_t __rmod__;
-uint16_t __pow__;
-uint16_t __rpow__;
-uint16_t __matmul__;
-uint16_t __lshift__;
-uint16_t __rshift__;
-uint16_t __and__;
-uint16_t __or__;
-uint16_t __xor__;
-uint16_t __invert__;
-// indexer
-uint16_t __getitem__;
-uint16_t __setitem__;
-uint16_t __delitem__;
-
-// specials
-uint16_t __new__;
-uint16_t __init__;
-uint16_t __call__;
-uint16_t __divmod__;
-uint16_t __enter__;
-uint16_t __exit__;
-uint16_t __name__;
-uint16_t __all__;
-uint16_t __package__;
-uint16_t __path__;
-uint16_t __class__;
-uint16_t __missing__;
+///////////////////////////////////
+#define MAGIC_METHOD(x) uint16_t x;
+#include "pocketpy/xmacros/magics.h"
+#undef MAGIC_METHOD
 
 uint16_t pk_id_add;
 uint16_t pk_id_set;