error.h 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. #pragma once
  2. #include "namedict.h"
  3. #include "str.h"
  4. #include "tuplelist.h"
  5. namespace pkpy{
  6. struct NeedMoreLines {
  7. NeedMoreLines(bool is_compiling_class) : is_compiling_class(is_compiling_class) {}
  8. bool is_compiling_class;
  9. };
  10. struct HandledException {};
  11. struct UnhandledException {};
  12. struct ToBeRaisedException {};
  13. enum CompileMode {
  14. EXEC_MODE,
  15. EVAL_MODE,
  16. REPL_MODE,
  17. JSON_MODE,
  18. CELL_MODE
  19. };
  20. struct SourceData {
  21. PK_ALWAYS_PASS_BY_POINTER(SourceData)
  22. Str filename;
  23. CompileMode mode;
  24. Str source;
  25. pod_vector<const char*> line_starts;
  26. SourceData(std::string_view source, const Str& filename, CompileMode mode);
  27. SourceData(const Str& filename, CompileMode mode);
  28. std::pair<const char*,const char*> _get_line(int lineno) const;
  29. Str snapshot(int lineno, const char* cursor, std::string_view name) const;
  30. };
  31. struct ExceptionLine{
  32. std::shared_ptr<SourceData> src;
  33. int lineno;
  34. const char* cursor;
  35. std::string name;
  36. Str snapshot() const { return src->snapshot(lineno, cursor, name); }
  37. ExceptionLine(std::shared_ptr<SourceData> src, int lineno, const char* cursor, std::string_view name):
  38. src(src), lineno(lineno), cursor(cursor), name(name) {}
  39. };
  40. struct Exception {
  41. StrName type;
  42. Str msg;
  43. bool is_re;
  44. int _ip_on_error;
  45. void* _code_on_error;
  46. PyObject* _self; // weak reference
  47. stack<ExceptionLine> stacktrace;
  48. Exception(StrName type): type(type), is_re(true), _ip_on_error(-1), _code_on_error(nullptr), _self(nullptr) {}
  49. PyObject* self() const{
  50. PK_ASSERT(_self != nullptr);
  51. return _self;
  52. }
  53. template<typename... Args>
  54. void st_push(Args&&... args){
  55. if(stacktrace.size() >= 7) return;
  56. stacktrace.emplace(std::forward<Args>(args)...);
  57. }
  58. Str summary() const;
  59. };
  60. } // namespace pkpy