value.h 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239
  1. // Part of the Carbon Language project, under the Apache License v2.0 with LLVM
  2. // Exceptions. See /LICENSE for license information.
  3. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  4. #ifndef EXECUTABLE_SEMANTICS_INTERPRETER_VALUE_H_
  5. #define EXECUTABLE_SEMANTICS_INTERPRETER_VALUE_H_
  6. #include <list>
  7. #include <optional>
  8. #include <variant>
  9. #include <vector>
  10. #include "executable_semantics/ast/statement.h"
  11. #include "executable_semantics/interpreter/stack.h"
  12. namespace Carbon {
  13. struct Value;
  14. using Address = unsigned int;
  15. using VarValues = std::list<std::pair<std::string, const Value*>>;
  16. auto FindInVarValues(const std::string& field, const VarValues& inits)
  17. -> const Value*;
  18. auto FieldsEqual(const VarValues& ts1, const VarValues& ts2) -> bool;
  19. // Finds the field in `*tuple` named `name`, and returns its address, or
  20. // nullopt if there is no such field. `*tuple` must be a tuple value.
  21. auto FindTupleField(const std::string& name, const Value* tuple)
  22. -> std::optional<Address>;
  23. // A TupleElement represents the value of a single tuple field.
  24. struct TupleElement {
  25. // The field name.
  26. std::string name;
  27. // Location of the field's value.
  28. Address address;
  29. };
  30. enum class ValKind {
  31. IntValue,
  32. FunctionValue,
  33. PointerValue,
  34. BoolValue,
  35. StructValue,
  36. AlternativeValue,
  37. TupleValue,
  38. IntType,
  39. BoolType,
  40. TypeType,
  41. FunctionType,
  42. PointerType,
  43. AutoType,
  44. StructType,
  45. ChoiceType,
  46. ContinuationType, // The type of a continuation.
  47. BindingPlaceholderValue,
  48. AlternativeConstructorValue,
  49. ContinuationValue // A first-class continuation value.
  50. };
  51. struct Frame; // used by continuation
  52. struct IntValue {
  53. static constexpr ValKind Kind = ValKind::IntValue;
  54. int value;
  55. };
  56. struct FunctionValue {
  57. static constexpr ValKind Kind = ValKind::FunctionValue;
  58. std::string name;
  59. const Value* param;
  60. const Statement* body;
  61. };
  62. struct PointerValue {
  63. static constexpr ValKind Kind = ValKind::PointerValue;
  64. Address value;
  65. };
  66. struct BoolValue {
  67. static constexpr ValKind Kind = ValKind::BoolValue;
  68. bool value;
  69. };
  70. struct StructValue {
  71. static constexpr ValKind Kind = ValKind::StructValue;
  72. const Value* type;
  73. const Value* inits;
  74. };
  75. struct AlternativeConstructorValue {
  76. static constexpr ValKind Kind = ValKind::AlternativeConstructorValue;
  77. std::string alt_name;
  78. std::string choice_name;
  79. };
  80. struct AlternativeValue {
  81. static constexpr ValKind Kind = ValKind::AlternativeValue;
  82. std::string alt_name;
  83. std::string choice_name;
  84. Address argument;
  85. };
  86. struct TupleValue {
  87. static constexpr ValKind Kind = ValKind::TupleValue;
  88. std::vector<TupleElement> elements;
  89. };
  90. struct BindingPlaceholderValue {
  91. static constexpr ValKind Kind = ValKind::BindingPlaceholderValue;
  92. std::string name;
  93. const Value* type;
  94. };
  95. struct IntType {
  96. static constexpr ValKind Kind = ValKind::IntType;
  97. };
  98. struct BoolType {
  99. static constexpr ValKind Kind = ValKind::BoolType;
  100. };
  101. struct TypeType {
  102. static constexpr ValKind Kind = ValKind::TypeType;
  103. };
  104. struct FunctionType {
  105. static constexpr ValKind Kind = ValKind::FunctionType;
  106. const Value* param;
  107. const Value* ret;
  108. };
  109. struct PointerType {
  110. static constexpr ValKind Kind = ValKind::PointerType;
  111. const Value* type;
  112. };
  113. struct AutoType {
  114. static constexpr ValKind Kind = ValKind::AutoType;
  115. };
  116. struct StructType {
  117. static constexpr ValKind Kind = ValKind::StructType;
  118. std::string name;
  119. VarValues fields;
  120. VarValues methods;
  121. };
  122. struct ChoiceType {
  123. static constexpr ValKind Kind = ValKind::ChoiceType;
  124. std::string name;
  125. VarValues alternatives;
  126. };
  127. struct ContinuationType {
  128. static constexpr ValKind Kind = ValKind::ContinuationType;
  129. };
  130. struct ContinuationValue {
  131. static constexpr ValKind Kind = ValKind::ContinuationValue;
  132. std::vector<Frame*> stack;
  133. };
  134. struct Value {
  135. // Constructors
  136. // Return a first-class continuation represented by the
  137. // given stack, down to the nearest enclosing `__continuation`.
  138. static auto MakeContinuationValue(std::vector<Frame*> stack) -> Value*;
  139. static auto MakeIntValue(int i) -> const Value*;
  140. static auto MakeBoolValue(bool b) -> const Value*;
  141. static auto MakeFunctionValue(std::string name, const Value* param,
  142. const Statement* body) -> const Value*;
  143. static auto MakePointerValue(Address addr) -> const Value*;
  144. static auto MakeStructValue(const Value* type, const Value* inits)
  145. -> const Value*;
  146. static auto MakeTupleValue(std::vector<TupleElement> elts) -> const Value*;
  147. static auto MakeAlternativeValue(std::string alt_name,
  148. std::string choice_name, Address argument)
  149. -> const Value*;
  150. static auto MakeAlternativeConstructorValue(std::string alt_name,
  151. std::string choice_name)
  152. -> const Value*;
  153. static auto MakeBindingPlaceholderValue(std::string name, const Value* type)
  154. -> const Value*;
  155. static auto MakeIntType() -> const Value*;
  156. static auto MakeContinuationType() -> const Value*;
  157. static auto MakeAutoType() -> const Value*;
  158. static auto MakeBoolType() -> const Value*;
  159. static auto MakeTypeType() -> const Value*;
  160. static auto MakeFunctionType(const Value* param, const Value* ret)
  161. -> const Value*;
  162. static auto MakePointerType(const Value* type) -> const Value*;
  163. static auto MakeStructType(std::string name, VarValues fields,
  164. VarValues methods) -> const Value*;
  165. static auto MakeUnitTypeVal() -> const Value*;
  166. static auto MakeChoiceType(std::string name, VarValues alts) -> const Value*;
  167. // Access to alternatives
  168. auto GetIntValue() const -> int;
  169. auto GetBoolValue() const -> bool;
  170. auto GetFunctionValue() const -> const FunctionValue&;
  171. auto GetStructValue() const -> const StructValue&;
  172. auto GetAlternativeConstructorValue() const
  173. -> const AlternativeConstructorValue&;
  174. auto GetAlternativeValue() const -> const AlternativeValue&;
  175. auto GetTupleValue() const -> const TupleValue&;
  176. auto GetPointerValue() const -> Address;
  177. auto GetBindingPlaceholderValue() const -> const BindingPlaceholderValue&;
  178. auto GetFunctionType() const -> const FunctionType&;
  179. auto GetPointerType() const -> const PointerType&;
  180. auto GetStructType() const -> const StructType&;
  181. auto GetChoiceType() const -> const ChoiceType&;
  182. auto GetContinuationValue() const -> const ContinuationValue&;
  183. inline auto tag() const -> ValKind {
  184. return std::visit([](const auto& t) { return t.Kind; }, value);
  185. }
  186. private:
  187. std::variant<IntValue, FunctionValue, PointerValue, BoolValue, StructValue,
  188. AlternativeValue, TupleValue, IntType, BoolType, TypeType,
  189. FunctionType, PointerType, AutoType, StructType, ChoiceType,
  190. ContinuationType, BindingPlaceholderValue,
  191. AlternativeConstructorValue, ContinuationValue>
  192. value;
  193. };
  194. void PrintValue(const Value* val, std::ostream& out);
  195. auto TypeEqual(const Value* t1, const Value* t2) -> bool;
  196. auto ValueEqual(const Value* v1, const Value* v2, int line_num) -> bool;
  197. auto ToInteger(const Value* v) -> int;
  198. } // namespace Carbon
  199. #endif // EXECUTABLE_SEMANTICS_INTERPRETER_VALUE_H_