value.h 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. #ifndef VIRTUALMATH_VALUE_H
  2. #define VIRTUALMATH_VALUE_H
  3. #include "__macro.h"
  4. #include "gc.h"
  5. #include "run.h"
  6. struct VarList;
  7. struct Argument;
  8. struct FatherValue;
  9. enum ValueAuthority{
  10. auto_aut,
  11. public_aut,
  12. protect_aut,
  13. private_aut
  14. };
  15. struct Value{
  16. struct GCStatus gc_status;
  17. enum ValueType{
  18. none=0,
  19. number=1,
  20. string=2,
  21. function=3,
  22. list=4,
  23. dict=5,
  24. class=6,
  25. object_=7,
  26. bool_=8,
  27. pass_=9,
  28. } type;
  29. struct {
  30. struct VarList *var;
  31. struct VarList *out_var;
  32. struct FatherValue *father;
  33. } object;
  34. union data{
  35. struct Number{
  36. NUMBER_TYPE num;
  37. } num;
  38. struct String{
  39. char *str;
  40. } str;
  41. struct Function{
  42. enum{
  43. c_function,
  44. vm_function,
  45. } type;
  46. struct Statement *function;
  47. struct Parameter *pt;
  48. OfficialFunction of;
  49. struct {
  50. enum {
  51. static_,
  52. object_static_,
  53. class_static_,
  54. } pt_type;
  55. } function_data;
  56. } function;
  57. struct List{
  58. enum ListType{
  59. value_tuple,
  60. value_list,
  61. } type;
  62. struct LinkValue **list;
  63. NUMBER_TYPE size; // TODO-szh typedef NUMBER_TYPE
  64. } list;
  65. struct Dict{
  66. struct HashTable *dict;
  67. NUMBER_TYPE size;
  68. } dict;
  69. struct Bool{
  70. bool bool_;
  71. } bool_;
  72. }data;
  73. struct Value *gc_next;
  74. struct Value *gc_last;
  75. };
  76. struct LinkValue{
  77. struct GCStatus gc_status;
  78. enum ValueAuthority aut;
  79. struct Value *value;
  80. struct LinkValue *father;
  81. struct LinkValue *gc_next;
  82. struct LinkValue *gc_last;
  83. };
  84. struct Result{
  85. enum ResultType{
  86. not_return = 1, // 无返回值
  87. function_return=2, // 函数返回值
  88. operation_return=3, // 表达式返回值
  89. error_return=4, // 错误
  90. break_return=5,
  91. continue_return=6,
  92. rego_return=7,
  93. restart_return=8,
  94. goto_return=9,
  95. yield_return=10,
  96. } type;
  97. char *label;
  98. struct LinkValue *value;
  99. struct Error *error;
  100. int times;
  101. struct Statement *node;
  102. };
  103. struct Error{
  104. char *type;
  105. char *messgae;
  106. char *file;
  107. long int line;
  108. struct Error *next;
  109. };
  110. struct FatherValue{
  111. struct LinkValue *value;
  112. struct FatherValue *next;
  113. };
  114. typedef struct Inter Inter;
  115. typedef struct Value Value;
  116. typedef struct LinkValue LinkValue;
  117. typedef struct Result Result;
  118. typedef struct Error Error;
  119. typedef struct FatherValue FatherValue;
  120. typedef enum ResultType ResultType;
  121. Value *makeObject(Inter *inter, VarList *object, VarList *out_var, FatherValue *father);
  122. void freeValue(Value **Value);
  123. LinkValue *makeLinkValue(Value *value, LinkValue *linkValue,Inter *inter);
  124. void freeLinkValue(LinkValue **value);
  125. LinkValue *copyLinkValue(LinkValue *value, Inter *inter);
  126. Value *makeNoneValue(Inter *inter);
  127. Value *makeBoolValue(bool bool_num, Inter *inter);
  128. Value *makePassValue(Inter *inter);
  129. Value *makeNumberValue(long num, Inter *inter);
  130. Value *makeStringValue(char *str, Inter *inter);
  131. Value *makeVMFunctionValue(struct Statement *st, struct Parameter *pt, struct VarList *var_list, Inter *inter);
  132. Value *makeCFunctionValue(OfficialFunction of, VarList *var_list, Inter *inter);
  133. Value *makeClassValue(VarList *var_list, Inter *inter, FatherValue *father);
  134. Value *makeListValue(struct Argument **arg_ad, Inter *inter, enum ListType type);
  135. Value *makeDictValue(struct Argument **arg_ad, bool new_hash, INTER_FUNCTIONSIG_NOT_ST);
  136. void setResultCore(Result *ru);
  137. void setResult(Result *ru, Inter *inter, LinkValue *father);
  138. void setResultBase(Result *ru, Inter *inter, LinkValue *father);
  139. void setResultErrorSt(Result *ru, Inter *inter, char *error_type, char *error_message, Statement *st, LinkValue *father, bool new);
  140. void setResultError(Result *ru, Inter *inter, char *error_type, char *error_message, long int line, char *file, LinkValue *father, bool new);
  141. void setResultOperationNone(Result *ru, Inter *inter, LinkValue *father);
  142. void setResultOperation(Result *ru, LinkValue *value);
  143. void setResultOperationBase(Result *ru, LinkValue *value);
  144. void freeResult(Result *ru);
  145. void freeResultSafe(Result *ru);
  146. Error *makeError(char *type, char *message, long int line, char *file);
  147. void freeError(Result *base);
  148. Error *connectError(Error *new, Error *base);
  149. void printError(Result *result, Inter *inter, bool free);
  150. void printValue(Value *value, FILE *debug, bool print_father);
  151. void printLinkValue(LinkValue *value, char *first, char *last, FILE *debug);
  152. bool isType(Value *value, enum ValueType type);
  153. FatherValue *makeFatherValue(LinkValue *value);
  154. FatherValue *copyFatherValue(FatherValue *value);
  155. FatherValue *freeFatherValue(FatherValue *value);
  156. FatherValue *connectFatherValue(FatherValue *base, FatherValue *back);
  157. FatherValue *connectSafeFatherValue(FatherValue *base, FatherValue *back);
  158. bool checkAttribution(Value *self, Value *father);
  159. #endif //VIRTUALMATH_VALUE_H