value.h 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235
  1. #ifndef VIRTUALMATH_VALUE_H
  2. #define VIRTUALMATH_VALUE_H
  3. #include "__macro.h"
  4. // 标准错误信息定义
  5. #define INSTANCE_ERROR(class) "Instance error when calling function, call non-"#class" "#class" method"
  6. #define VALUE_ERROR(value, acc) #value" value is not a "#acc" (may be modified by an external program)"
  7. #define ONLY_ACC(var, value) #var" only accepts "#value
  8. #define ERROR_INIT(class) #class" get wrong initialization parameters"
  9. #define MANY_ARG "Too many parameters"
  10. #define FEW_ARG "Too few parameters"
  11. #define CUL_ERROR(opt) #opt" operation gets incorrect value"
  12. #define OBJ_NOTSUPPORT(opt) "Object does not support "#opt" operation"
  13. #define RETURN_ERROR(func, type) #func" function should return "#type" type data"
  14. #define KEY_INTERRUPT "KeyInterrupt"
  15. typedef struct Value Value;
  16. typedef struct Argument Argument;
  17. typedef struct Inter Inter;
  18. typedef struct LinkValue LinkValue;
  19. typedef struct Result Result;
  20. typedef struct Error Error;
  21. typedef struct Inherit Inherit;
  22. typedef struct VarList VarList;
  23. typedef enum ResultType ResultType;
  24. typedef enum BaseErrorType BaseErrorType;
  25. typedef enum ResultType (*OfficialFunction)(OFFICAL_FUNCTIONSIG);
  26. typedef void (*Registered)(REGISTERED_FUNCTIONSIG);
  27. enum ValueAuthority{
  28. auto_aut,
  29. public_aut,
  30. protect_aut,
  31. private_aut
  32. };
  33. enum ValueType{
  34. none=0,
  35. number=1,
  36. string=2,
  37. function=3,
  38. list=4,
  39. dict=5,
  40. class=6,
  41. object_=7,
  42. bool_=8,
  43. pass_=9,
  44. };
  45. struct Number{
  46. vnum num;
  47. };
  48. struct String{
  49. char *str;
  50. };
  51. struct Function{
  52. enum{
  53. c_function,
  54. vm_function,
  55. } type;
  56. struct Statement *function;
  57. struct Parameter *pt;
  58. OfficialFunction of;
  59. struct {
  60. enum FunctionPtType{
  61. free_, // 不包含任何隐式传递的参数
  62. static_, // 不包含self参数
  63. object_static_, // self参数不允许class
  64. class_static_, // self参数允许一切,但转换为类
  65. all_static_, // self参数允许一切
  66. object_free_, // 同object_static_但不包含func参数
  67. class_free_, // 同object_static_但不包含func参数
  68. all_free_, // 允许class或者object
  69. } pt_type;
  70. } function_data;
  71. };
  72. struct List{
  73. enum ListType{
  74. value_tuple,
  75. value_list,
  76. } type;
  77. struct LinkValue **list;
  78. vnum size;
  79. };
  80. struct Dict{
  81. struct HashTable *dict;
  82. vnum size;
  83. };
  84. struct Bool{
  85. bool bool_;
  86. };
  87. struct Value{
  88. struct GCStatus gc_status;
  89. enum ValueType type;
  90. struct {
  91. struct VarList *var;
  92. struct VarList *out_var;
  93. struct Inherit *inherit;
  94. } object;
  95. union data{
  96. struct Number num;
  97. struct String str;
  98. struct Function function;
  99. struct List list;
  100. struct Dict dict;
  101. struct Bool bool_;
  102. }data;
  103. struct Value *gc_next;
  104. struct Value *gc_last;
  105. };
  106. struct LinkValue{
  107. struct GCStatus gc_status;
  108. enum ValueAuthority aut;
  109. struct Value *value;
  110. struct LinkValue *belong;
  111. struct LinkValue *gc_next;
  112. struct LinkValue *gc_last;
  113. };
  114. struct Result{
  115. enum ResultType{
  116. not_return = 1, // 无返回值
  117. function_return=2, // 函数返回值
  118. operation_return=3, // 表达式返回值
  119. error_return=4, // 错误
  120. break_return=5,
  121. continue_return=6,
  122. rego_return=7,
  123. restart_return=8,
  124. goto_return=9,
  125. yield_return=10,
  126. } type;
  127. char *label;
  128. struct LinkValue *value;
  129. struct Error *error;
  130. vnum times;
  131. struct Statement *node;
  132. };
  133. struct Error{
  134. char *type;
  135. char *messgae;
  136. char *file;
  137. fline line;
  138. struct Error *next;
  139. };
  140. struct Inherit{
  141. struct LinkValue *value;
  142. struct Inherit *next;
  143. };
  144. enum BaseErrorType{
  145. E_BaseException,
  146. E_Exception,
  147. E_TypeException,
  148. E_ArgumentException,
  149. E_PermissionsException,
  150. E_GotoException,
  151. E_ResultException,
  152. E_NameExceptiom,
  153. E_AssertException,
  154. E_KeyException,
  155. E_IndexException,
  156. E_StrideException,
  157. E_StopIterException,
  158. E_SuperException,
  159. E_ImportException,
  160. E_IncludeException,
  161. E_SystemException,
  162. E_KeyInterrupt,
  163. E_QuitException,
  164. };
  165. Value *makeObject(Inter *inter, VarList *object, VarList *out_var, Inherit *inherit);
  166. void freeValue(Value **Value);
  167. LinkValue *makeLinkValue(Value *value, LinkValue *belong, Inter *inter);
  168. void freeLinkValue(LinkValue **value);
  169. LinkValue *copyLinkValue(LinkValue *value, Inter *inter);
  170. Value *useNoneValue(Inter *inter, Result *result);
  171. Value *makeBoolValue(bool bool_num, fline line, char *file, INTER_FUNCTIONSIG_NOT_ST);
  172. Value *makePassValue(fline line, char *file, INTER_FUNCTIONSIG_NOT_ST);
  173. Value *makeNumberValue(vnum num, fline line, char *file, INTER_FUNCTIONSIG_NOT_ST);
  174. Value *makeStringValue(char *str, fline line, char *file, INTER_FUNCTIONSIG_NOT_ST);
  175. Value *makeVMFunctionValue(struct Statement *st, struct Parameter *pt, INTER_FUNCTIONSIG_NOT_ST);
  176. Value *makeCFunctionValue(OfficialFunction of, fline line, char *file, INTER_FUNCTIONSIG_NOT_ST);
  177. LinkValue *makeCFunctionFromOf(OfficialFunction of, LinkValue *func, OfficialFunction function_new, OfficialFunction function_init, LinkValue *belong, VarList *var_list, Inter *inter);
  178. Value *makeClassValue(VarList *var_list, Inter *inter, Inherit *father);
  179. Value *makeListValue(Argument *arg, fline line, char *file, enum ListType type, INTER_FUNCTIONSIG_NOT_ST);
  180. Value *makeDictValue(Argument *arg, bool new_hash, fline line, char *file, INTER_FUNCTIONSIG_NOT_ST);
  181. void setResultCore(Result *ru);
  182. void setResult(Result *ru, Inter *inter, LinkValue *belong);
  183. void setResultBase(Result *ru, Inter *inter);
  184. void setResultErrorSt(BaseErrorType type, char *error_message, bool new, INTER_FUNCTIONSIG);
  185. void setResultError(BaseErrorType type, char *error_message, fline line, char *file, bool new, INTER_FUNCTIONSIG_NOT_ST);
  186. void setResultOperationNone(Result *ru, Inter *inter, LinkValue *belong);
  187. void setResultOperation(Result *ru, LinkValue *value);
  188. void setResultOperationBase(Result *ru, LinkValue *value);
  189. void freeResult(Result *ru);
  190. void freeResultSafe(Result *ru);
  191. Error *makeError(char *type, char *message, fline line, char *file);
  192. void freeError(Result *base);
  193. Error *connectError(Error *new, Error *base);
  194. void printError(Result *result, Inter *inter, bool free);
  195. void printValue(Value *value, FILE *debug, bool print_father, bool print_in);
  196. void printLinkValue(LinkValue *value, char *first, char *last, FILE *debug);
  197. bool isType(Value *value, enum ValueType type);
  198. Inherit *makeInherit(LinkValue *value);
  199. Inherit *copyInherit(Inherit *value);
  200. Inherit *freeInherit(Inherit *value);
  201. Inherit *connectInherit(Inherit *base, Inherit *back);
  202. Inherit *connectSafeInherit(Inherit *base, Inherit *back);
  203. bool checkAttribution(Value *self, Value *father);
  204. Inherit *getInheritFromValueCore(LinkValue *num_father);
  205. bool callDel(Value *object_value, Result *result, Inter *inter, VarList *var_list);
  206. bool needDel(Value *object_value, Inter *inter);
  207. #endif //VIRTUALMATH_VALUE_H