rt_object.h 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. #ifndef AFUN_RT_OBJECT_H
  2. #define AFUN_RT_OBJECT_H
  3. #include <list>
  4. #include <mutex>
  5. #include "aFunRuntimeExport.h"
  6. #include "aFuncore.h"
  7. namespace aFunrt {
  8. class AFUN_RT_EXPORT Var : public aFuncore::Object {
  9. public:
  10. aFuncore::Environment &env;
  11. Var(Object *data_, aFuncore::Inter &inter);
  12. Var(Object *data_, aFuncore::Environment &env_);
  13. ~Var() override = default;
  14. [[nodiscard]] virtual Object *getData();
  15. virtual void setData(Object *data_);
  16. void linkObject(std::queue<Object *> &queue) override;
  17. private:
  18. Object *data;
  19. };
  20. class AFUN_RT_EXPORT VarSpace : public aFuncore::Object {
  21. public:
  22. typedef enum VarOperationFlat {
  23. vof_success = 0, // 成功
  24. vof_not_var = 1, // 变量不存在
  25. vof_redefine_var = 2, // 变量重复定义
  26. vof_fail = 3, // 存在其他错误
  27. } VarOperationFlat;
  28. aFuncore::Environment &env;
  29. explicit VarSpace(aFuncore::Inter &inter);
  30. explicit VarSpace(aFuncore::Environment &env_);
  31. ~VarSpace() override = default;
  32. template <typename Callable,typename...T>
  33. void forEach(Callable func, T...arg);
  34. template <typename Callable,typename...T>
  35. void forEachLock(Callable func, T...arg);
  36. [[nodiscard]] AFUN_INLINE size_t getCount();
  37. [[nodiscard]] virtual Var *findVar(const std::string &name);
  38. virtual VarOperationFlat defineVar(const std::string &name, aFuncore::Object *data);
  39. virtual VarOperationFlat defineVar(const std::string &name, Var *data);
  40. virtual VarOperationFlat setVar(const std::string &name, aFuncore::Object *data);
  41. virtual VarOperationFlat delVar(const std::string &name);
  42. [[nodiscard]] AFUN_INLINE aFuncore::Object *findObject(const std::string &name);
  43. void linkObject(std::queue<aFuncore::Object *> &queue) override;
  44. AFUN_STATIC const size_t VAR_HASH_SIZE = 100; // 环境变量哈希表大小
  45. private:
  46. std::unordered_map<std::string, Var *> var;
  47. };
  48. class AFUN_RT_EXPORT Function : public virtual aFuncore::Object {
  49. public:
  50. class AFUN_RT_EXPORT CallFunction;
  51. virtual CallFunction *getCallFunction(const aFuncode::Code::ByteCode *code, aFuncore::Inter &inter) = 0;
  52. virtual bool isInfix();
  53. };
  54. class AFUN_RT_EXPORT Function::CallFunction {
  55. public:
  56. class ArgCodeList;
  57. CallFunction() = default;
  58. virtual ~CallFunction() = default;
  59. CallFunction(const CallFunction &)=delete;
  60. CallFunction &operator=(const CallFunction &)=delete;
  61. virtual std::list<ArgCodeList> *getArgCodeList(aFuncore::Inter &inter, aFuncore::Activation &activation, const aFuncode::Code::ByteCode *call) = 0;
  62. virtual void runFunction() = 0;
  63. };
  64. class Function::CallFunction::ArgCodeList {
  65. public:
  66. const aFuncode::Code::ByteCode *code = nullptr;
  67. AFUN_INLINE explicit ArgCodeList(const aFuncode::Code::ByteCode *code = nullptr);
  68. AFUN_INLINE ~ArgCodeList();
  69. AFUN_INLINE aFuncore::Object *setObject(aFuncore::Object *res);
  70. AFUN_INLINE aFuncore::Object *getObject();
  71. private:
  72. aFuncore::Object *ret;
  73. };
  74. class AFUN_RT_EXPORT Literaler : public virtual aFuncore::Object {
  75. public:
  76. virtual void getObject(const std::string &literal, char prefix, aFuncore::Inter &inter, aFuncore::Activation &activation) = 0;
  77. };
  78. class AFUN_RT_EXPORT CallBackVar : public virtual aFuncore::Object {
  79. public:
  80. virtual bool isCallBack(aFuncore::Inter &inter, aFuncore::Activation &activation);
  81. virtual void callBack(aFuncore::Inter &inter, aFuncore::Activation &activation) = 0;
  82. };
  83. };
  84. #include "rt_object.inline.h"
  85. #include "rt_object.template.h"
  86. #endif //AFUN_RT_OBJECT_H