diff --git a/executable_semantics/ast/expression.cpp b/executable_semantics/ast/expression.cpp index 32e358e71a09..2ca5cc9d48db 100644 --- a/executable_semantics/ast/expression.cpp +++ b/executable_semantics/ast/expression.cpp @@ -84,11 +84,12 @@ auto Expression::MakeContinuationType(int line_num) -> const Expression* { return type; } -auto Expression::MakeFunType(int line_num, const Expression* param, - const Expression* ret) -> const Expression* { +auto Expression::MakeFunType(int line_num, Expression param, Expression ret) + -> const Expression* { auto* t = new Expression(); t->line_num = line_num; - t->value = FunctionType({.parameter = param, .return_type = ret}); + t->value = FunctionType( + {.parameter = std::move(param), .return_type = std::move(ret)}); return t; } @@ -99,11 +100,11 @@ auto Expression::MakeVar(int line_num, std::string var) -> const Expression* { return v; } -auto Expression::MakeVarPat(int line_num, std::string var, - const Expression* type) -> const Expression* { +auto Expression::MakeVarPat(int line_num, std::string var, Expression type) + -> const Expression* { auto* v = new Expression(); v->line_num = line_num; - v->value = PatternVariable({.name = std::move(var), .type = type}); + v->value = PatternVariable({.name = std::move(var), .type = std::move(type)}); return v; } @@ -146,11 +147,11 @@ auto Expression::MakeBinOp(int line_num, enum Operator op, Expression arg1, return e; } -auto Expression::MakeCall(int line_num, const Expression* fun, - const Expression* arg) -> const Expression* { +auto Expression::MakeCall(int line_num, Expression fun, Expression arg) + -> const Expression* { auto* e = new Expression(); e->line_num = line_num; - e->value = Call({.function = fun, .argument = arg}); + e->value = Call({.function = std::move(fun), .argument = std::move(arg)}); return e; } @@ -186,11 +187,11 @@ auto Expression::MakeTuple(int line_num, std::vector args) return e; } -auto Expression::MakeIndex(int line_num, const Expression* exp, - const Expression* i) -> const Expression* { +auto Expression::MakeIndex(int line_num, Expression exp, Expression i) + -> const Expression* { auto* e = new Expression(); e->line_num = line_num; - e->value = Index({.aggregate = exp, .offset = i}); + e->value = Index({.aggregate = std::move(exp), .offset = std::move(i)}); return e; } @@ -237,9 +238,9 @@ static void PrintFields(const std::vector& fields) { void PrintExp(const Expression* e) { switch (e->tag()) { case ExpressionKind::Index: - PrintExp(e->GetIndex().aggregate); + PrintExp(e->GetIndex().aggregate.GetPointer()); std::cout << "["; - PrintExp(e->GetIndex().offset); + PrintExp(e->GetIndex().offset.GetPointer()); std::cout << "]"; break; case ExpressionKind::GetField: @@ -285,17 +286,17 @@ void PrintExp(const Expression* e) { std::cout << e->GetVariable().name; break; case ExpressionKind::PatternVariable: - PrintExp(e->GetPatternVariable().type); + PrintExp(e->GetPatternVariable().type.GetPointer()); std::cout << ": "; std::cout << e->GetPatternVariable().name; break; case ExpressionKind::Call: - PrintExp(e->GetCall().function); + PrintExp(e->GetCall().function.GetPointer()); if (e->GetCall().argument->tag() == ExpressionKind::Tuple) { - PrintExp(e->GetCall().argument); + PrintExp(e->GetCall().argument.GetPointer()); } else { std::cout << "("; - PrintExp(e->GetCall().argument); + PrintExp(e->GetCall().argument.GetPointer()); std::cout << ")"; } break; @@ -316,9 +317,9 @@ void PrintExp(const Expression* e) { break; case ExpressionKind::FunctionT: std::cout << "fn "; - PrintExp(e->GetFunctionType().parameter); + PrintExp(e->GetFunctionType().parameter.GetPointer()); std::cout << " -> "; - PrintExp(e->GetFunctionType().return_type); + PrintExp(e->GetFunctionType().return_type.GetPointer()); break; } } diff --git a/executable_semantics/ast/expression.h b/executable_semantics/ast/expression.h index 89c4c58b338e..c3ebcb216c78 100644 --- a/executable_semantics/ast/expression.h +++ b/executable_semantics/ast/expression.h @@ -70,14 +70,14 @@ struct FieldAccess { struct Index { static constexpr ExpressionKind Kind = ExpressionKind::Index; - const Expression* aggregate; - const Expression* offset; + IndirectValue aggregate; + IndirectValue offset; }; struct PatternVariable { static constexpr ExpressionKind Kind = ExpressionKind::PatternVariable; std::string name; - const Expression* type; + IndirectValue type; }; struct IntLiteral { @@ -103,14 +103,14 @@ struct PrimitiveOperator { struct Call { static constexpr ExpressionKind Kind = ExpressionKind::Call; - const Expression* function; - const Expression* argument; + IndirectValue function; + IndirectValue argument; }; struct FunctionType { static constexpr ExpressionKind Kind = ExpressionKind::FunctionT; - const Expression* parameter; - const Expression* return_type; + IndirectValue parameter; + IndirectValue return_type; }; struct AutoT { @@ -138,7 +138,7 @@ struct Expression { inline auto tag() const -> ExpressionKind; static auto MakeVar(int line_num, std::string var) -> const Expression*; - static auto MakeVarPat(int line_num, std::string var, const Expression* type) + static auto MakeVarPat(int line_num, std::string var, Expression type) -> const Expression*; static auto MakeInt(int line_num, int i) -> const Expression*; static auto MakeBool(int line_num, bool b) -> const Expression*; @@ -148,19 +148,19 @@ struct Expression { -> const Expression*; static auto MakeBinOp(int line_num, enum Operator op, Expression arg1, Expression arg2) -> const Expression*; - static auto MakeCall(int line_num, const Expression* fun, - const Expression* arg) -> const Expression*; + static auto MakeCall(int line_num, Expression fun, Expression arg) + -> const Expression*; static auto MakeGetField(int line_num, const Expression* exp, std::string field) -> const Expression*; static auto MakeTuple(int line_num, std::vector args) -> const Expression*; - static auto MakeIndex(int line_num, const Expression* exp, - const Expression* i) -> const Expression*; + static auto MakeIndex(int line_num, Expression exp, Expression i) + -> const Expression*; static auto MakeTypeType(int line_num) -> const Expression*; static auto MakeIntType(int line_num) -> const Expression*; static auto MakeBoolType(int line_num) -> const Expression*; - static auto MakeFunType(int line_num, const Expression* param, - const Expression* ret) -> const Expression*; + static auto MakeFunType(int line_num, Expression param, Expression ret) + -> const Expression*; static auto MakeAutoType(int line_num) -> const Expression*; static auto MakeContinuationType(int line_num) -> const Expression*; diff --git a/executable_semantics/interpreter/interpreter.cpp b/executable_semantics/interpreter/interpreter.cpp index d7ce1665e404..8167c72e4436 100644 --- a/executable_semantics/interpreter/interpreter.cpp +++ b/executable_semantics/interpreter/interpreter.cpp @@ -646,7 +646,7 @@ void StepLvalue() { case ExpressionKind::Index: { // { {e[i] :: C, E, F} :: S, H} // -> { e :: [][i] :: C, E, F} :: S, H} - frame->todo.Push(MakeExpAct(exp->GetIndex().aggregate)); + frame->todo.Push(MakeExpAct(exp->GetIndex().aggregate.GetPointer())); act->pos++; break; } @@ -689,14 +689,14 @@ void StepExp() { } switch (exp->tag()) { case ExpressionKind::PatternVariable: { - frame->todo.Push(MakeExpAct(exp->GetPatternVariable().type)); + frame->todo.Push(MakeExpAct(exp->GetPatternVariable().type.GetPointer())); act->pos++; break; } case ExpressionKind::Index: { // { { e[i] :: C, E, F} :: S, H} // -> { { e :: [][i] :: C, E, F} :: S, H} - frame->todo.Push(MakeExpAct(exp->GetIndex().aggregate)); + frame->todo.Push(MakeExpAct(exp->GetIndex().aggregate.GetPointer())); act->pos++; break; } @@ -764,7 +764,7 @@ void StepExp() { case ExpressionKind::Call: // { {e1(e2) :: C, E, F} :: S, H} // -> { {e1 :: [](e2) :: C, E, F} :: S, H} - frame->todo.Push(MakeExpAct(exp->GetCall().function)); + frame->todo.Push(MakeExpAct(exp->GetCall().function.GetPointer())); act->pos++; break; case ExpressionKind::IntT: { @@ -792,7 +792,8 @@ void StepExp() { break; } case ExpressionKind::FunctionT: { - frame->todo.Push(MakeExpAct(exp->GetFunctionType().parameter)); + frame->todo.Push( + MakeExpAct(exp->GetFunctionType().parameter.GetPointer())); act->pos++; break; } @@ -1093,7 +1094,7 @@ void HandleValue() { case ExpressionKind::Index: { if (act->pos == 1) { frame->todo.Pop(1); - frame->todo.Push(MakeExpAct(exp->GetIndex().offset)); + frame->todo.Push(MakeExpAct(exp->GetIndex().offset.GetPointer())); } else if (act->pos == 2) { // { v :: [][i] :: C, E, F} :: S, H} // -> { { &v[i] :: C, E, F} :: S, H } @@ -1163,7 +1164,7 @@ void HandleValue() { case ExpressionKind::Index: { if (act->pos == 1) { frame->todo.Pop(1); - frame->todo.Push(MakeExpAct(exp->GetIndex().offset)); + frame->todo.Push(MakeExpAct(exp->GetIndex().offset.GetPointer())); } else if (act->pos == 2) { auto tuple = act->results[0]; switch (tuple->tag) { @@ -1227,7 +1228,7 @@ void HandleValue() { // { { v :: [](e) :: C, E, F} :: S, H} // -> { { e :: v([]) :: C, E, F} :: S, H} frame->todo.Pop(1); - frame->todo.Push(MakeExpAct(exp->GetCall().argument)); + frame->todo.Push(MakeExpAct(exp->GetCall().argument.GetPointer())); } else if (act->pos == 2) { // { { v2 :: v1([]) :: C, E, F} :: S, H} // -> { {C',E',F'} :: {C, E, F} :: S, H} @@ -1252,7 +1253,8 @@ void HandleValue() { // { { pt :: fn [] -> e :: C, E, F} :: S, H} // -> { { e :: fn pt -> []) :: C, E, F} :: S, H} frame->todo.Pop(1); - frame->todo.Push(MakeExpAct(exp->GetFunctionType().return_type)); + frame->todo.Push( + MakeExpAct(exp->GetFunctionType().return_type.GetPointer())); } break; } @@ -1500,7 +1502,7 @@ auto InterpProgram(std::list* fs) -> int { const Expression* arg = Expression::MakeTuple(0, {}); const Expression* call_main = - Expression::MakeCall(0, Expression::MakeVar(0, "main"), arg); + Expression::MakeCall(0, *Expression::MakeVar(0, "main"), *arg); auto todo = Stack(MakeExpAct(call_main)); auto* scope = new Scope(globals, std::list()); auto* frame = new Frame("top", Stack(scope), todo); diff --git a/executable_semantics/interpreter/typecheck.cpp b/executable_semantics/interpreter/typecheck.cpp index 8b3f3ee90963..07619bb0c4d6 100644 --- a/executable_semantics/interpreter/typecheck.cpp +++ b/executable_semantics/interpreter/typecheck.cpp @@ -67,8 +67,8 @@ auto ReifyType(const Value* t, int line_num) -> const Expression* { return Expression::MakeContinuationType(0); case ValKind::FunctionTV: return Expression::MakeFunType( - 0, ReifyType(t->GetFunctionType().param, line_num), - ReifyType(t->GetFunctionType().ret, line_num)); + 0, *ReifyType(t->GetFunctionType().param, line_num), + *ReifyType(t->GetFunctionType().ret, line_num)); case ValKind::TupleV: { std::vector args; for (const TupleElement& field : *t->GetTuple().elements) { @@ -144,7 +144,7 @@ auto TypeCheckExp(const Expression* e, TypeEnv types, Env values, << std::endl; exit(-1); } - auto t = InterpExp(values, e->GetPatternVariable().type); + auto t = InterpExp(values, e->GetPatternVariable().type.GetPointer()); if (t->tag == ValKind::AutoTV) { if (expected == nullptr) { std::cerr << e->line_num @@ -157,18 +157,20 @@ auto TypeCheckExp(const Expression* e, TypeEnv types, Env values, } else if (expected) { ExpectType(e->line_num, "pattern variable", t, expected); } - auto new_e = Expression::MakeVarPat( - e->line_num, e->GetPatternVariable().name, ReifyType(t, e->line_num)); + auto new_e = + Expression::MakeVarPat(e->line_num, e->GetPatternVariable().name, + *ReifyType(t, e->line_num)); types.Set(e->GetPatternVariable().name, t); return TCResult(new_e, t, types); } case ExpressionKind::Index: { - auto res = TypeCheckExp(e->GetIndex().aggregate, types, values, nullptr, - TCContext::ValueContext); + auto res = TypeCheckExp(e->GetIndex().aggregate.GetPointer(), types, + values, nullptr, TCContext::ValueContext); auto t = res.type; switch (t->tag) { case ValKind::TupleV: { - auto i = ToInteger(InterpExp(values, e->GetIndex().offset)); + auto i = + ToInteger(InterpExp(values, e->GetIndex().offset.GetPointer())); std::string f = std::to_string(i); std::optional
field_address = FindTupleField(f, t); if (field_address == std::nullopt) { @@ -180,7 +182,7 @@ auto TypeCheckExp(const Expression* e, TypeEnv types, Env values, } auto field_t = state->heap.Read(*field_address, e->line_num); auto new_e = Expression::MakeIndex( - e->line_num, res.exp, Expression::MakeInt(e->line_num, i)); + e->line_num, *res.exp, *Expression::MakeInt(e->line_num, i)); return TCResult(new_e, field_t, res.types); } default: @@ -372,18 +374,18 @@ auto TypeCheckExp(const Expression* e, TypeEnv types, Env values, break; } case ExpressionKind::Call: { - auto fun_res = TypeCheckExp(e->GetCall().function, types, values, nullptr, - TCContext::ValueContext); + auto fun_res = TypeCheckExp(e->GetCall().function.GetPointer(), types, + values, nullptr, TCContext::ValueContext); switch (fun_res.type->tag) { case ValKind::FunctionTV: { auto fun_t = fun_res.type; auto arg_res = - TypeCheckExp(e->GetCall().argument, fun_res.types, values, - fun_t->GetFunctionType().param, context); + TypeCheckExp(e->GetCall().argument.GetPointer(), fun_res.types, + values, fun_t->GetFunctionType().param, context); ExpectType(e->line_num, "call", fun_t->GetFunctionType().param, arg_res.type); auto new_e = - Expression::MakeCall(e->line_num, fun_res.exp, arg_res.exp); + Expression::MakeCall(e->line_num, *fun_res.exp, *arg_res.exp); return TCResult(new_e, fun_t->GetFunctionType().ret, arg_res.types); } default: { @@ -401,22 +403,25 @@ auto TypeCheckExp(const Expression* e, TypeEnv types, Env values, switch (context) { case TCContext::ValueContext: case TCContext::TypeContext: { - auto pt = InterpExp(values, e->GetFunctionType().parameter); - auto rt = InterpExp(values, e->GetFunctionType().return_type); + auto pt = + InterpExp(values, e->GetFunctionType().parameter.GetPointer()); + auto rt = + InterpExp(values, e->GetFunctionType().return_type.GetPointer()); auto new_e = - Expression::MakeFunType(e->line_num, ReifyType(pt, e->line_num), - ReifyType(rt, e->line_num)); + Expression::MakeFunType(e->line_num, *ReifyType(pt, e->line_num), + *ReifyType(rt, e->line_num)); return TCResult(new_e, Value::MakeTypeTypeVal(), types); } case TCContext::PatternContext: { - auto param_res = TypeCheckExp(e->GetFunctionType().parameter, types, - values, nullptr, context); - auto ret_res = - TypeCheckExp(e->GetFunctionType().return_type, param_res.types, + auto param_res = + TypeCheckExp(e->GetFunctionType().parameter.GetPointer(), types, values, nullptr, context); + auto ret_res = + TypeCheckExp(e->GetFunctionType().return_type.GetPointer(), + param_res.types, values, nullptr, context); auto new_e = Expression::MakeFunType( - e->line_num, ReifyType(param_res.type, e->line_num), - ReifyType(ret_res.type, e->line_num)); + e->line_num, *ReifyType(param_res.type, e->line_num), + *ReifyType(ret_res.type, e->line_num)); return TCResult(new_e, Value::MakeTypeTypeVal(), ret_res.types); } } diff --git a/executable_semantics/syntax/parser.ypp b/executable_semantics/syntax/parser.ypp index 6ea60414b674..a575788dd234 100644 --- a/executable_semantics/syntax/parser.ypp +++ b/executable_semantics/syntax/parser.ypp @@ -205,9 +205,9 @@ expression: | expression designator { $$ = Carbon::Expression::MakeGetField(yylineno, $1, $2); } | expression "[" expression "]" - { $$ = Carbon::Expression::MakeIndex(yylineno, $1, $3); } + { $$ = Carbon::Expression::MakeIndex(yylineno, *$1, *$3); } | identifier ":" expression - { $$ = Carbon::Expression::MakeVarPat(yylineno, $1, $3); } + { $$ = Carbon::Expression::MakeVarPat(yylineno, $1, *$3); } | integer_literal { $$ = Carbon::Expression::MakeInt(yylineno, $1); } | TRUE @@ -246,13 +246,13 @@ expression: | UNARY_STAR expression %prec PREFIX_STAR { $$ = Carbon::Expression::MakeUnOp(yylineno, Carbon::Operator::Deref, *$2); } | expression tuple - { $$ = Carbon::Expression::MakeCall(yylineno, $1, $2); } + { $$ = Carbon::Expression::MakeCall(yylineno, *$1, *$2); } | expression POSTFIX_STAR { $$ = Carbon::Expression::MakeUnOp(yylineno, Carbon::Operator::Ptr, *$1); } | expression UNARY_STAR { $$ = Carbon::Expression::MakeUnOp(yylineno, Carbon::Operator::Ptr, *$1); } | FNTY tuple return_type - { $$ = Carbon::Expression::MakeFunType(yylineno, $2, $3); } + { $$ = Carbon::Expression::MakeFunType(yylineno, *$2, *$3); } ; designator: "." identifier { $$ = $2; } ; @@ -297,7 +297,7 @@ clause: | DEFAULT DBLARROW statement { auto vp = Carbon::Expression::MakeVarPat(yylineno, "_", - Carbon::Expression::MakeAutoType(yylineno)); + *Carbon::Expression::MakeAutoType(yylineno)); $$ = new std::pair(vp, $3); } ;