rt-activation.h 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. #ifndef AFUN_RT_ACTIVATION_H
  2. #define AFUN_RT_ACTIVATION_H
  3. #include "aFunRuntimeExport.h"
  4. #include "aFuncore.h"
  5. #include "rt-object.h"
  6. namespace aFunrt {
  7. class AFUN_RT_EXPORT NormalActivation : public aFuncore::Activation {
  8. public:
  9. class AFUN_RT_EXPORT VarList {
  10. public:
  11. AFUN_INLINE explicit VarList();
  12. virtual ~VarList();
  13. AFUN_INLINE VarList(VarList &&new_varlist) noexcept ;
  14. AFUN_INLINE VarList &operator=(VarList &&new_varlist) noexcept;
  15. VarList(const VarList &) = delete;
  16. VarList &operator=(const VarList &) = delete;
  17. void clear();
  18. void connect(VarList &new_varlist);
  19. AFUN_INLINE void push(VarSpace *varspace_);
  20. AFUN_INLINE size_t count();
  21. template <typename Callable,typename...T>
  22. void forEach(Callable func, T...arg);
  23. [[nodiscard]] virtual Var *findVar(const std::string &name);
  24. virtual bool defineVar(const std::string &name, aFuncore::Object *data);
  25. virtual bool defineVar(const std::string &name, Var *data);
  26. virtual bool setVar(const std::string &name, aFuncore::Object *data);
  27. virtual bool delVar(const std::string &name);
  28. [[nodiscard]] AFUN_INLINE aFuncore::Object *findObject(const std::string &name);
  29. private:
  30. std::list<VarSpace *> varspace;
  31. };
  32. aFuncore::Inter &inter;
  33. explicit NormalActivation(aFuncore::Inter &inter_);
  34. ~NormalActivation() override;
  35. void runCode(const aFuncode::Code::ByteCode *code) override;
  36. void endRun() override;
  37. [[nodiscard]] AFUN_INLINE VarList &getVarlist();
  38. [[nodiscard]] aFuncore::UpMessageStream &getUpStream() override;
  39. [[nodiscard]] aFuncore::DownMessageStream &getDownStream() override;
  40. [[nodiscard]] aFuntool::FileLine getFileLine() override;
  41. [[nodiscard]] const aFuntool::FilePath &getFilePath() override;
  42. protected:
  43. VarList varlist;
  44. aFuncore::UpMessageStream up;
  45. aFuncore::DownMessageStream down;
  46. aFuntool::FilePath path;
  47. aFuntool::FileLine line;
  48. virtual void runCodeElement(const aFuncode::Code::ByteCode *code);
  49. virtual void runCodeBlockP(const aFuncode::Code::ByteCode *code);
  50. virtual void runCodeBlockC(const aFuncode::Code::ByteCode *code);
  51. virtual void runCodeBlockB(const aFuncode::Code::ByteCode *code);
  52. };
  53. class AFUN_RT_EXPORT ExeActivation : public NormalActivation {
  54. public:
  55. AFUN_INLINE ExeActivation(const aFuncode::Code &code, aFuncore::Inter &inter_);
  56. AFUN_INLINE ExeActivation(const aFuncode::Code::ByteCode *code, aFuncore::Inter &inter_);
  57. ActivationStatus getCode(const aFuncode::Code::ByteCode *&code) override;
  58. [[nodiscard]] AFUN_INLINE const aFuncode::Code::ByteCode *getStart() const;
  59. private:
  60. const aFuncode::Code::ByteCode *start;
  61. const aFuncode::Code::ByteCode *next;
  62. bool first=true;
  63. };
  64. class AFUN_RT_EXPORT TopActivation : public ExeActivation {
  65. public:
  66. explicit TopActivation(const aFuncode::Code &code, aFuncore::Inter &inter_);
  67. ~TopActivation() override = default;
  68. [[nodiscard]] AFUN_INLINE const aFuncode::Code &getBase() const;
  69. private:
  70. const aFuncode::Code &base;
  71. };
  72. class AFUN_RT_EXPORT FuncActivation : public NormalActivation {
  73. public:
  74. AFUN_INLINE explicit FuncActivation(const aFuncode::Code::ByteCode *code, aFuncore::Inter &inter_);
  75. explicit FuncActivation(Function *func, aFuncore::Inter &inter_);
  76. ~FuncActivation() override;
  77. ActivationStatus getCode(const aFuncode::Code::ByteCode *&code) override;
  78. void endRun() override;
  79. private:
  80. enum {
  81. func_first = 0, // 获取函数体前准备
  82. func_get_func = 1, // 获取函数体后,开始获取参数前
  83. func_get_arg = 2, // 获取参数过程
  84. } status = func_first;
  85. bool on_tail = false;
  86. const aFuncode::Code::ByteCode *call;
  87. Function *func = nullptr;
  88. Function::CallFunction *call_func = nullptr;
  89. std::list<Function::CallFunction::ArgCodeList> *acl = nullptr;
  90. std::list<Function::CallFunction::ArgCodeList>::iterator acl_begin;
  91. std::list<Function::CallFunction::ArgCodeList>::iterator acl_end;
  92. };
  93. }
  94. #include "rt-activation.inline.h"
  95. #include "rt-activation.template.h"
  96. #endif //AFUN_RT_ACTIVATION_H