| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384 |
- #include "pocketpy/pocketpy.h"
- #include "pocketpy/common/utils.h"
- #include "pocketpy/objects/object.h"
- #include "pocketpy/interpreter/vm.h"
- /* staticmethod */
- static bool staticmethod__new__(int argc, py_Ref argv) {
- PY_CHECK_ARGC(2);
- py_newobject(py_retval(), tp_staticmethod, 1, 0);
- py_setslot(py_retval(), 0, py_arg(1));
- return true;
- }
- py_Type pk_staticmethod__register() {
- py_Type type = pk_newtype("staticmethod", tp_object, NULL, NULL, false, true);
- py_bindmagic(type, __new__, staticmethod__new__);
- return type;
- }
- /* classmethod */
- static bool classmethod__new__(int argc, py_Ref argv) {
- PY_CHECK_ARGC(2);
- py_newobject(py_retval(), tp_classmethod, 1, 0);
- py_setslot(py_retval(), 0, py_arg(1));
- return true;
- }
- py_Type pk_classmethod__register() {
- py_Type type = pk_newtype("classmethod", tp_object, NULL, NULL, false, true);
- py_bindmagic(type, __new__, classmethod__new__);
- return type;
- }
- /* boundmethod */
- static bool boundmethod__self__(int argc, py_Ref argv) {
- PY_CHECK_ARGC(1);
- py_assign(py_retval(), py_getslot(argv, 0));
- return true;
- }
- static bool boundmethod__func__(int argc, py_Ref argv) {
- PY_CHECK_ARGC(1);
- py_assign(py_retval(), py_getslot(argv, 1));
- return true;
- }
- static bool boundmethod__eq__(int argc, py_Ref argv) {
- PY_CHECK_ARGC(2);
- if(!py_istype(py_arg(1), tp_boundmethod)) {
- py_newbool(py_retval(), false);
- return true;
- }
- for(int i = 0; i < 2; i++) {
- int res = py_equal(py_getslot(&argv[0], i), py_getslot(&argv[1], i));
- if(res == -1) return false;
- if(!res) {
- py_newbool(py_retval(), false);
- return true;
- }
- }
- py_newbool(py_retval(), true);
- return true;
- }
- static bool boundmethod__ne__(int argc, py_Ref argv) {
- bool ok = boundmethod__eq__(argc, argv);
- if(!ok) return false;
- bool res = py_tobool(py_retval());
- py_newbool(py_retval(), !res);
- return true;
- }
- py_Type pk_boundmethod__register() {
- py_Type type = pk_newtype("boundmethod", tp_object, NULL, NULL, false, true);
- py_bindproperty(type, "__self__", boundmethod__self__, NULL);
- py_bindproperty(type, "__func__", boundmethod__func__, NULL);
- py_bindmagic(type, __eq__, boundmethod__eq__);
- py_bindmagic(type, __ne__, boundmethod__ne__);
- return type;
- }
|