3 #include "ast/AstNode.h"
4 #include "ast/ExprEvaluator.h"
5 #include "codegen/CodeGen.h"
6 #include "tir/Constant.h"
7 #include "tir/Context.h"
26 ast::
Type const* astType;
32 ast::
Decl const* decl;
38 enum class Kind { StaticFn, MemberFn, AstType, AstDecl, L, R };
46 : kind_{Kind::AstType},
data_{
aty} {}
58 explicit ValueWrapper(Kind kind, TirWrapped wrappedIr)
59 : kind_{kind}, data_{wrappedIr} {}
61 explicit ValueWrapper(Kind kind, FnWrapped wrappedFn)
62 : kind_{kind}, data_{wrappedFn} {}
75 return ValueWrapper{Kind::L, TirWrapped{aty, elemTy, value}};
86 assert(!value->type()->isPointerType() || isAstTypeReference(aty));
87 return ValueWrapper{Kind::R, TirWrapped{aty, value->type(), value}};
97 tir::
Value* refThis =
nullptr) {
98 assert(kind == Kind::StaticFn || kind == Kind::MemberFn);
99 return ValueWrapper{kind, FnWrapped{fn, refThis, value}};
105 tir::
Value* asLValue()
const;
107 tir::
Value* asFn()
const;
109 ast::
Type const* astType()
const;
111 tir::
Type* irType()
const;
113 Kind kind()
const {
return kind_; }
117 ast::
Decl const* asDecl()
const;
119 tir::
Value* thisRef()
const {
120 assert(kind_ == Kind::MemberFn);
121 return std::get<FnWrapped>(data_).refThis;
128 std::variant<TirWrapped, FnWrapped, ast::
Type const*, ast::
Decl const*> data_;
137 class CGExprEvaluator
final :
public ast::ExprEvaluator<details::ValueWrapper> {
143 T mapValue(ast::exprnode::
ExprValue& node)
const override;
144 T evalBinaryOp(ast::exprnode::BinaryOp& op, T lhs, T rhs)
const override;
145 T evalUnaryOp(ast::exprnode::UnaryOp& op, T rhs)
const override;
146 T evalMemberAccess(ast::exprnode::MemberAccess& op, T lhs,
147 T field)
const override;
148 T evalMethodCall(ast::exprnode::MethodInvocation& op, T method,
149 const op_array& args)
const override;
150 T evalNewObject(ast::exprnode::ClassInstanceCreation& op, T object,
151 const op_array& args)
const override;
152 T evalNewArray(ast::exprnode::ArrayInstanceCreation& op, T type,
153 T size)
const override;
154 T evalArrayAccess(ast::exprnode::ArrayAccess& op, T array,
155 T index)
const override;
156 T evalCast(ast::exprnode::Cast& op, T type, T value)
const override;
157 bool validate(T
const& v)
const override {
return v.validate(cg); }
158 T castIntegerType(ast::
Type const*, tir::
Type*, T value)
const;
164 tir::Function& curFn{*cg.curFn};