value.h 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262
  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 <string>
  9. #include <variant>
  10. #include <vector>
  11. #include "common/ostream.h"
  12. #include "executable_semantics/ast/function_definition.h"
  13. #include "executable_semantics/ast/statement.h"
  14. #include "executable_semantics/interpreter/address.h"
  15. #include "executable_semantics/interpreter/field_path.h"
  16. #include "executable_semantics/interpreter/stack.h"
  17. namespace Carbon {
  18. struct Value;
  19. using VarValues = std::list<std::pair<std::string, const Value*>>;
  20. auto FindInVarValues(const std::string& field, const VarValues& inits)
  21. -> const Value*;
  22. auto FieldsEqual(const VarValues& ts1, const VarValues& ts2) -> bool;
  23. // A TupleElement represents the value of a single tuple field.
  24. struct TupleElement {
  25. // The field name.
  26. std::string name;
  27. // The field's value.
  28. const Value* value;
  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. VariableType, // e.g. generic type parameters
  48. BindingPlaceholderValue,
  49. AlternativeConstructorValue,
  50. ContinuationValue // A first-class continuation value.
  51. };
  52. struct Frame; // used by continuation
  53. struct IntValue {
  54. static constexpr ValKind Kind = ValKind::IntValue;
  55. int value;
  56. };
  57. struct FunctionValue {
  58. static constexpr ValKind Kind = ValKind::FunctionValue;
  59. std::string name;
  60. const Value* param;
  61. const Statement* body;
  62. };
  63. struct PointerValue {
  64. static constexpr ValKind Kind = ValKind::PointerValue;
  65. Address value;
  66. };
  67. struct BoolValue {
  68. static constexpr ValKind Kind = ValKind::BoolValue;
  69. bool value;
  70. };
  71. struct StructValue {
  72. static constexpr ValKind Kind = ValKind::StructValue;
  73. const Value* type;
  74. const Value* inits;
  75. };
  76. struct AlternativeConstructorValue {
  77. static constexpr ValKind Kind = ValKind::AlternativeConstructorValue;
  78. std::string alt_name;
  79. std::string choice_name;
  80. };
  81. struct AlternativeValue {
  82. static constexpr ValKind Kind = ValKind::AlternativeValue;
  83. std::string alt_name;
  84. std::string choice_name;
  85. const Value* argument;
  86. };
  87. struct TupleValue {
  88. static constexpr ValKind Kind = ValKind::TupleValue;
  89. std::vector<TupleElement> elements;
  90. // Returns the value of the field named `name` in this tuple, or
  91. // null if there is no such field.
  92. auto FindField(const std::string& name) const -> const Value*;
  93. };
  94. struct BindingPlaceholderValue {
  95. static constexpr ValKind Kind = ValKind::BindingPlaceholderValue;
  96. // nullopt represents the `_` placeholder
  97. std::optional<std::string> name;
  98. const Value* type;
  99. };
  100. struct IntType {
  101. static constexpr ValKind Kind = ValKind::IntType;
  102. };
  103. struct BoolType {
  104. static constexpr ValKind Kind = ValKind::BoolType;
  105. };
  106. struct TypeType {
  107. static constexpr ValKind Kind = ValKind::TypeType;
  108. };
  109. struct FunctionType {
  110. static constexpr ValKind Kind = ValKind::FunctionType;
  111. std::vector<GenericBinding> deduced;
  112. const Value* param;
  113. const Value* ret;
  114. };
  115. struct PointerType {
  116. static constexpr ValKind Kind = ValKind::PointerType;
  117. const Value* type;
  118. };
  119. struct AutoType {
  120. static constexpr ValKind Kind = ValKind::AutoType;
  121. };
  122. struct StructType {
  123. static constexpr ValKind Kind = ValKind::StructType;
  124. std::string name;
  125. VarValues fields;
  126. VarValues methods;
  127. };
  128. struct ChoiceType {
  129. static constexpr ValKind Kind = ValKind::ChoiceType;
  130. std::string name;
  131. VarValues alternatives;
  132. };
  133. struct ContinuationType {
  134. static constexpr ValKind Kind = ValKind::ContinuationType;
  135. };
  136. struct VariableType {
  137. static constexpr ValKind Kind = ValKind::VariableType;
  138. std::string name;
  139. };
  140. struct ContinuationValue {
  141. static constexpr ValKind Kind = ValKind::ContinuationValue;
  142. std::vector<Frame*> stack;
  143. };
  144. struct Value {
  145. // Constructors
  146. // Return a first-class continuation represented by the
  147. // given stack, down to the nearest enclosing `__continuation`.
  148. static auto MakeContinuationValue(std::vector<Frame*> stack) -> Value*;
  149. static auto MakeIntValue(int i) -> const Value*;
  150. static auto MakeBoolValue(bool b) -> const Value*;
  151. static auto MakeFunctionValue(std::string name, const Value* param,
  152. const Statement* body) -> const Value*;
  153. static auto MakePointerValue(Address addr) -> const Value*;
  154. static auto MakeStructValue(const Value* type, const Value* inits)
  155. -> const Value*;
  156. static auto MakeTupleValue(std::vector<TupleElement> elts) -> const Value*;
  157. static auto MakeAlternativeValue(std::string alt_name,
  158. std::string choice_name,
  159. const Value* argument) -> const Value*;
  160. static auto MakeAlternativeConstructorValue(std::string alt_name,
  161. std::string choice_name)
  162. -> const Value*;
  163. static auto MakeBindingPlaceholderValue(std::optional<std::string> name,
  164. const Value* type) -> const Value*;
  165. static auto MakeIntType() -> const Value*;
  166. static auto MakeContinuationType() -> const Value*;
  167. static auto MakeAutoType() -> const Value*;
  168. static auto MakeBoolType() -> const Value*;
  169. static auto MakeTypeType() -> const Value*;
  170. static auto MakeFunctionType(std::vector<GenericBinding> deduced_params,
  171. const Value* param, const Value* ret)
  172. -> const Value*;
  173. static auto MakePointerType(const Value* type) -> const Value*;
  174. static auto MakeStructType(std::string name, VarValues fields,
  175. VarValues methods) -> const Value*;
  176. static auto MakeUnitTypeVal() -> const Value*;
  177. static auto MakeChoiceType(std::string name, VarValues alts) -> const Value*;
  178. static auto MakeVariableType(std::string name) -> const Value*;
  179. // Access to alternatives
  180. auto GetIntValue() const -> int;
  181. auto GetBoolValue() const -> bool;
  182. auto GetFunctionValue() const -> const FunctionValue&;
  183. auto GetStructValue() const -> const StructValue&;
  184. auto GetAlternativeConstructorValue() const
  185. -> const AlternativeConstructorValue&;
  186. auto GetAlternativeValue() const -> const AlternativeValue&;
  187. auto GetTupleValue() const -> const TupleValue&;
  188. auto GetPointerValue() const -> Address;
  189. auto GetBindingPlaceholderValue() const -> const BindingPlaceholderValue&;
  190. auto GetFunctionType() const -> const FunctionType&;
  191. auto GetPointerType() const -> const PointerType&;
  192. auto GetStructType() const -> const StructType&;
  193. auto GetChoiceType() const -> const ChoiceType&;
  194. auto GetVariableType() const -> const VariableType&;
  195. auto GetContinuationValue() const -> const ContinuationValue&;
  196. inline auto tag() const -> ValKind {
  197. return std::visit([](const auto& t) { return t.Kind; }, value);
  198. }
  199. // Returns the sub-Value specified by `path`, which must be a valid field
  200. // path for *this.
  201. auto GetField(const FieldPath& path, int line_num) const -> const Value*;
  202. // Returns a copy of *this, but with the sub-Value specified by `path`
  203. // set to `field_value`. `path` must be a valid field path for *this.
  204. auto SetField(const FieldPath& path, const Value* field_value,
  205. int line_num) const -> const Value*;
  206. void Print(llvm::raw_ostream& out) const;
  207. private:
  208. std::variant<IntValue, FunctionValue, PointerValue, BoolValue, StructValue,
  209. AlternativeValue, TupleValue, IntType, BoolType, TypeType,
  210. FunctionType, PointerType, AutoType, StructType, ChoiceType,
  211. ContinuationType, VariableType, BindingPlaceholderValue,
  212. AlternativeConstructorValue, ContinuationValue>
  213. value;
  214. };
  215. auto CopyVal(const Value* val, int line_num) -> const Value*;
  216. auto TypeEqual(const Value* t1, const Value* t2) -> bool;
  217. auto ValueEqual(const Value* v1, const Value* v2, int line_num) -> bool;
  218. } // namespace Carbon
  219. #endif // EXECUTABLE_SEMANTICS_INTERPRETER_VALUE_H_