inspect.c 812 B

12345678910111213141516171819202122232425262728
  1. #include "pocketpy/pocketpy.h"
  2. #include "pocketpy/common/utils.h"
  3. #include "pocketpy/objects/object.h"
  4. #include "pocketpy/common/sstream.h"
  5. #include "pocketpy/interpreter/vm.h"
  6. static bool inspect_isgeneratorfunction(int argc, py_Ref argv) {
  7. PY_CHECK_ARGC(1);
  8. py_Ref obj = argv;
  9. if(py_istype(argv, tp_boundmethod)) {
  10. py_TValue* slots = PyObject__slots(argv->_obj);
  11. obj = &slots[1]; // callable
  12. }
  13. if(py_istype(obj, tp_function)) {
  14. Function* fn = py_touserdata(obj);
  15. py_newbool(py_retval(), fn->decl->type == FuncType_GENERATOR);
  16. } else {
  17. py_newbool(py_retval(), false);
  18. }
  19. return true;
  20. }
  21. void pk__add_module_inspect() {
  22. py_Ref mod = py_newmodule("inspect");
  23. py_bindfunc(mod, "isgeneratorfunction", inspect_isgeneratorfunction);
  24. }