value.h 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  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. struct Value{
  10. struct GCStatus gc_status;
  11. enum ValueType{
  12. none=0,
  13. number=1,
  14. string=2,
  15. function=3,
  16. list=4,
  17. dict=5,
  18. class=6,
  19. object_=7,
  20. } type;
  21. struct {
  22. struct VarList *var;
  23. struct VarList *out_var;
  24. struct FatherValue *father;
  25. } object;
  26. union data{
  27. struct Number{
  28. NUMBER_TYPE num;
  29. } num;
  30. struct String{
  31. char *str;
  32. } str;
  33. struct Function{
  34. struct Statement *function;
  35. struct Parameter *pt;
  36. } function;
  37. struct List{
  38. enum ListType{
  39. value_tuple,
  40. value_list,
  41. } type;
  42. struct LinkValue **list;
  43. long int size;
  44. } list;
  45. struct Dict{
  46. struct HashTable *dict;
  47. NUMBER_TYPE size;
  48. } dict;
  49. }data;
  50. struct Value *gc_next;
  51. struct Value *gc_last;
  52. };
  53. struct LinkValue{
  54. struct GCStatus gc_status;
  55. struct Value *value;
  56. struct LinkValue *father;
  57. struct LinkValue *gc_next;
  58. struct LinkValue *gc_last;
  59. };
  60. struct Result{
  61. enum ResultType{
  62. not_return = 1, // 无返回值
  63. function_return, // 函数返回值
  64. operation_return, // 表达式返回值
  65. error_return, // 错误
  66. break_return,
  67. continue_return,
  68. rego_return,
  69. restart_return,
  70. } type;
  71. struct LinkValue *value;
  72. struct Error *error;
  73. int times;
  74. };
  75. struct Error{
  76. char *type;
  77. char *messgae;
  78. char *file;
  79. long int line;
  80. struct Error *next;
  81. };
  82. struct FatherValue{
  83. struct LinkValue *value;
  84. struct FatherValue *next;
  85. };
  86. typedef struct Inter Inter;
  87. typedef struct Value Value;
  88. typedef struct LinkValue LinkValue;
  89. typedef struct Result Result;
  90. typedef struct Error Error;
  91. typedef struct FatherValue FatherValue;
  92. typedef enum ResultType ResultType;
  93. Value *makeObject(Inter *inter, VarList *object, VarList *out_var, FatherValue *father);
  94. Value * freeValue(Value *value, Inter *inter);
  95. LinkValue *makeLinkValue(Value *value, LinkValue *linkValue,Inter *inter);
  96. LinkValue * freeLinkValue(LinkValue *value, Inter *inter);
  97. Value *makeNoneValue(Inter *inter);
  98. Value *makeNumberValue(long num, Inter *inter);
  99. Value *makeStringValue(char *str, Inter *inter);
  100. Value *makeFunctionValue(struct Statement *st, struct Parameter *pt, struct VarList *var_list, Inter *inter);
  101. Value *makeClassValue(VarList *var_list, Inter *inter, FatherValue *father);
  102. Value *makeListValue(struct Argument **arg_ad, Inter *inter, enum ListType type);
  103. Value *makeDictValue(struct Argument **arg_ad, bool new_hash, INTER_FUNCTIONSIG_NOT_ST);
  104. void setResultCore(Result *ru);
  105. void setResult(Result *ru, Inter *inter, LinkValue *father);
  106. void setResultBase(Result *ru, Inter *inter, LinkValue *father);
  107. void setResultError(Result *ru, Inter *inter, char *error_type, char *error_message, Statement *st, LinkValue *father,
  108. bool new);
  109. void setResultOperationNone(Result *ru, Inter *inter, LinkValue *father);
  110. void setResultOperation(Result *ru, LinkValue *value, Inter *inter);
  111. void setResultOperationBase(Result *ru, LinkValue *value, Inter *inter);
  112. void freeResult(Result *ru);
  113. void freeResultSave(Result *ru);
  114. Error *makeError(char *type, char *message, long int line, char *file);
  115. void freeError(Result *base);
  116. Error *connectError(Error *new, Error *base);
  117. void printError(Result *result, Inter *inter, bool free);
  118. void printValue(Value *value, FILE *debug);
  119. void printLinkValue(LinkValue *value, char *first, char *last, FILE *debug);
  120. bool isType(Value *value, enum ValueType type);
  121. FatherValue *makeFatherValue(LinkValue *value);
  122. FatherValue *copyFatherValue(FatherValue *value);
  123. FatherValue *freeFatherValue(FatherValue *value);
  124. FatherValue *connectFatherValue(FatherValue *base, FatherValue *back);
  125. FatherValue *connectSafeFatherValue(FatherValue *base, FatherValue *back);
  126. #endif //VIRTUALMATH_VALUE_H