diff --git a/executable_semantics/ast/expression.cpp b/executable_semantics/ast/expression.cpp index f5e3fb4430f5..ddb8f838d425 100644 --- a/executable_semantics/ast/expression.cpp +++ b/executable_semantics/ast/expression.cpp @@ -30,7 +30,7 @@ auto ExpressionFromParenContents( auto TupleExpressionFromParenContents( int line_num, const ParenContents& paren_contents) -> const Expression* { - return global_arena->New( + return global_arena->RawNew( line_num, paren_contents.TupleElements(line_num)); } diff --git a/executable_semantics/ast/expression_test.cpp b/executable_semantics/ast/expression_test.cpp index a0139a49655f..a404484968be 100644 --- a/executable_semantics/ast/expression_test.cpp +++ b/executable_semantics/ast/expression_test.cpp @@ -55,7 +55,8 @@ TEST(ExpressionTest, UnaryNoCommaAsExpression) { // ``` ParenContents contents = { .elements = {{.name = std::nullopt, - .term = global_arena->New(/*line_num=*/2, 42)}}, + .term = + global_arena->RawNew(/*line_num=*/2, 42)}}, .has_trailing_comma = false}; const Expression* expression = @@ -67,7 +68,8 @@ TEST(ExpressionTest, UnaryNoCommaAsExpression) { TEST(ExpressionTest, UnaryNoCommaAsTuple) { ParenContents contents = { .elements = {{.name = std::nullopt, - .term = global_arena->New(/*line_num=*/2, 42)}}, + .term = + global_arena->RawNew(/*line_num=*/2, 42)}}, .has_trailing_comma = false}; const Expression* tuple = @@ -81,7 +83,8 @@ TEST(ExpressionTest, UnaryNoCommaAsTuple) { TEST(ExpressionTest, UnaryWithCommaAsExpression) { ParenContents contents = { .elements = {{.name = std::nullopt, - .term = global_arena->New(/*line_num=*/2, 42)}}, + .term = + global_arena->RawNew(/*line_num=*/2, 42)}}, .has_trailing_comma = true}; const Expression* expression = @@ -95,7 +98,8 @@ TEST(ExpressionTest, UnaryWithCommaAsExpression) { TEST(ExpressionTest, UnaryWithCommaAsTuple) { ParenContents contents = { .elements = {{.name = std::nullopt, - .term = global_arena->New(/*line_num=*/2, 42)}}, + .term = + global_arena->RawNew(/*line_num=*/2, 42)}}, .has_trailing_comma = true}; const Expression* tuple = @@ -109,9 +113,11 @@ TEST(ExpressionTest, UnaryWithCommaAsTuple) { TEST(ExpressionTest, BinaryAsExpression) { ParenContents contents = { .elements = {{.name = std::nullopt, - .term = global_arena->New(/*line_num=*/2, 42)}, + .term = + global_arena->RawNew(/*line_num=*/2, 42)}, {.name = std::nullopt, - .term = global_arena->New(/*line_num=*/3, 42)}}, + .term = + global_arena->RawNew(/*line_num=*/3, 42)}}, .has_trailing_comma = true}; const Expression* expression = @@ -125,9 +131,11 @@ TEST(ExpressionTest, BinaryAsExpression) { TEST(ExpressionTest, BinaryAsTuple) { ParenContents contents = { .elements = {{.name = std::nullopt, - .term = global_arena->New(/*line_num=*/2, 42)}, + .term = + global_arena->RawNew(/*line_num=*/2, 42)}, {.name = std::nullopt, - .term = global_arena->New(/*line_num=*/3, 42)}}, + .term = + global_arena->RawNew(/*line_num=*/3, 42)}}, .has_trailing_comma = true}; const Expression* tuple = diff --git a/executable_semantics/ast/pattern.cpp b/executable_semantics/ast/pattern.cpp index 23d7c06b3306..4c3b99902450 100644 --- a/executable_semantics/ast/pattern.cpp +++ b/executable_semantics/ast/pattern.cpp @@ -59,7 +59,7 @@ TuplePattern::TuplePattern(const Expression* tuple_literal) const auto& tuple = cast(*tuple_literal); for (const FieldInitializer& init : tuple.Fields()) { fields.push_back(Field( - init.name, global_arena->New(init.expression))); + init.name, global_arena->RawNew(init.expression))); } } @@ -77,7 +77,7 @@ auto PatternFromParenContents(int line_num, auto TuplePatternFromParenContents(int line_num, const ParenContents& paren_contents) -> const TuplePattern* { - return global_arena->New( + return global_arena->RawNew( line_num, paren_contents.TupleElements(line_num)); } @@ -101,7 +101,7 @@ auto ParenExpressionToParenPattern(const ParenContents& contents) for (const auto& element : contents.elements) { result.elements.push_back( {.name = element.name, - .term = global_arena->New(element.term)}); + .term = global_arena->RawNew(element.term)}); } return result; } diff --git a/executable_semantics/ast/pattern_test.cpp b/executable_semantics/ast/pattern_test.cpp index 76a20a94c0ac..ff6e74fbd741 100644 --- a/executable_semantics/ast/pattern_test.cpp +++ b/executable_semantics/ast/pattern_test.cpp @@ -52,7 +52,7 @@ TEST(PatternTest, UnaryNoCommaAsPattern) { // ``` ParenContents contents = { .elements = {{.name = std::nullopt, - .term = global_arena->New(/*line_num=*/2)}}, + .term = global_arena->RawNew(/*line_num=*/2)}}, .has_trailing_comma = false}; const Pattern* pattern = PatternFromParenContents(/*line_num=*/1, contents); @@ -63,7 +63,7 @@ TEST(PatternTest, UnaryNoCommaAsPattern) { TEST(PatternTest, UnaryNoCommaAsTuplePattern) { ParenContents contents = { .elements = {{.name = std::nullopt, - .term = global_arena->New(/*line_num=*/2)}}, + .term = global_arena->RawNew(/*line_num=*/2)}}, .has_trailing_comma = false}; const TuplePattern* tuple = @@ -75,7 +75,7 @@ TEST(PatternTest, UnaryNoCommaAsTuplePattern) { TEST(PatternTest, UnaryWithCommaAsPattern) { ParenContents contents = { .elements = {{.name = std::nullopt, - .term = global_arena->New(/*line_num=*/2)}}, + .term = global_arena->RawNew(/*line_num=*/2)}}, .has_trailing_comma = true}; const Pattern* pattern = PatternFromParenContents(/*line_num=*/1, contents); @@ -88,7 +88,7 @@ TEST(PatternTest, UnaryWithCommaAsPattern) { TEST(PatternTest, UnaryWithCommaAsTuplePattern) { ParenContents contents = { .elements = {{.name = std::nullopt, - .term = global_arena->New(/*line_num=*/2)}}, + .term = global_arena->RawNew(/*line_num=*/2)}}, .has_trailing_comma = true}; const TuplePattern* tuple = @@ -100,9 +100,9 @@ TEST(PatternTest, UnaryWithCommaAsTuplePattern) { TEST(PatternTest, BinaryAsPattern) { ParenContents contents = { .elements = {{.name = std::nullopt, - .term = global_arena->New(/*line_num=*/2)}, + .term = global_arena->RawNew(/*line_num=*/2)}, {.name = std::nullopt, - .term = global_arena->New(/*line_num=*/3)}}, + .term = global_arena->RawNew(/*line_num=*/3)}}, .has_trailing_comma = true}; const Pattern* pattern = PatternFromParenContents(/*line_num=*/1, contents); @@ -115,9 +115,9 @@ TEST(PatternTest, BinaryAsPattern) { TEST(PatternTest, BinaryAsTuplePattern) { ParenContents contents = { .elements = {{.name = std::nullopt, - .term = global_arena->New(/*line_num=*/2)}, + .term = global_arena->RawNew(/*line_num=*/2)}, {.name = std::nullopt, - .term = global_arena->New(/*line_num=*/3)}}, + .term = global_arena->RawNew(/*line_num=*/3)}}, .has_trailing_comma = true}; const TuplePattern* tuple = diff --git a/executable_semantics/ast/statement.cpp b/executable_semantics/ast/statement.cpp index 6c5234fa54f4..7c2639176ebb 100644 --- a/executable_semantics/ast/statement.cpp +++ b/executable_semantics/ast/statement.cpp @@ -132,7 +132,7 @@ void Statement::PrintDepth(int depth, llvm::raw_ostream& out) const { Return::Return(int line_num, const Expression* exp, bool is_omitted_exp) : Statement(Kind::Return, line_num), - exp(exp != nullptr ? exp : global_arena->New(line_num)), + exp(exp != nullptr ? exp : global_arena->RawNew(line_num)), is_omitted_exp(is_omitted_exp) { CHECK(exp != nullptr || is_omitted_exp); } diff --git a/executable_semantics/common/BUILD b/executable_semantics/common/BUILD index d9bfc1afc657..d7e11fe48ced 100644 --- a/executable_semantics/common/BUILD +++ b/executable_semantics/common/BUILD @@ -9,6 +9,7 @@ cc_library( srcs = ["arena.cpp"], hdrs = ["arena.h"], deps = [ + ":ptr", "@llvm-project//llvm:Support", ], ) @@ -31,6 +32,15 @@ cc_test( ], ) +cc_library( + name = "ptr", + hdrs = ["ptr.h"], + deps = [ + "//common:check", + "@llvm-project//llvm:Support", + ], +) + cc_library( name = "tracing_flag", srcs = ["tracing_flag.cpp"], diff --git a/executable_semantics/common/arena.h b/executable_semantics/common/arena.h index b42e4b02c7d8..8c9e0b799452 100644 --- a/executable_semantics/common/arena.h +++ b/executable_semantics/common/arena.h @@ -8,6 +8,7 @@ #include #include +#include "executable_semantics/common/ptr.h" #include "llvm/Support/ManagedStatic.h" namespace Carbon { @@ -16,10 +17,20 @@ class Arena { public: // Allocates an object in the arena, returning a pointer to it. template - auto New(Args&&... args) -> T* { + auto New(Args&&... args) -> Ptr { auto smart_ptr = std::make_unique>(std::forward(args)...); - T* raw_ptr = smart_ptr->Instance(); + Ptr ptr = smart_ptr->Instance(); + arena.push_back(std::move(smart_ptr)); + return ptr; + } + + // TODO: Remove. This is only to help findability during migration. + template + auto RawNew(Args&&... args) -> T* { + auto smart_ptr = + std::make_unique>(std::forward(args)...); + T* raw_ptr = smart_ptr->Instance().Get(); arena.push_back(std::move(smart_ptr)); return raw_ptr; } @@ -40,7 +51,7 @@ class Arena { explicit ArenaEntryTyped(Args&&... args) : instance(std::forward(args)...) {} - auto Instance() -> T* { return &instance; } + auto Instance() -> Ptr { return Ptr(&instance); } private: T instance; diff --git a/executable_semantics/common/ptr.h b/executable_semantics/common/ptr.h new file mode 100644 index 000000000000..044458f63d1e --- /dev/null +++ b/executable_semantics/common/ptr.h @@ -0,0 +1,43 @@ +// Part of the Carbon Language project, under the Apache License v2.0 with LLVM +// Exceptions. See /LICENSE for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception + +#ifndef EXECUTABLE_SEMANTICS_COMMON_PTR_H_ +#define EXECUTABLE_SEMANTICS_COMMON_PTR_H_ + +#include +#include + +#include "common/check.h" + +namespace Carbon { + +// A non-nullable pointer. Written as `Ptr` instead of `T*`. +template +class Ptr { + public: + explicit Ptr(T* ptr) : ptr(ptr) { CHECK(ptr != nullptr); } + + template >* = nullptr> + Ptr(Ptr other) { + return Ptr(other.ptr); + } + + Ptr(std::nullptr_t) = delete; + + Ptr(const Ptr& other) = default; + Ptr& operator=(const Ptr& rhs) = default; + + auto operator*() const -> T& { return *ptr; } + auto operator->() const -> T* { return ptr; } + + T* Get() const { return ptr; } + + private: + T* ptr; +}; + +} // namespace Carbon + +#endif // EXECUTABLE_SEMANTICS_COMMON_PTR_H_ diff --git a/executable_semantics/interpreter/dictionary.h b/executable_semantics/interpreter/dictionary.h index cc1063c55c68..95058b780148 100644 --- a/executable_semantics/interpreter/dictionary.h +++ b/executable_semantics/interpreter/dictionary.h @@ -37,8 +37,8 @@ class Dictionary { // Associate the value v with key k in the dictionary. // Time complexity: O(1). auto Set(const K& k, const V& v) -> void { - head = global_arena->New>>(std::make_pair(k, v), - head); + head = global_arena->RawNew>>(std::make_pair(k, v), + head); } typedef ListNodeIterator> Iterator; diff --git a/executable_semantics/interpreter/interpreter.cpp b/executable_semantics/interpreter/interpreter.cpp index 33b34324ef85..017a0ce0643c 100644 --- a/executable_semantics/interpreter/interpreter.cpp +++ b/executable_semantics/interpreter/interpreter.cpp @@ -84,29 +84,29 @@ auto EvalPrim(Operator op, const std::vector& args, int line_num) -> const Value* { switch (op) { case Operator::Neg: - return global_arena->New(-cast(*args[0]).Val()); + return global_arena->RawNew(-cast(*args[0]).Val()); case Operator::Add: - return global_arena->New(cast(*args[0]).Val() + - cast(*args[1]).Val()); + return global_arena->RawNew(cast(*args[0]).Val() + + cast(*args[1]).Val()); case Operator::Sub: - return global_arena->New(cast(*args[0]).Val() - - cast(*args[1]).Val()); + return global_arena->RawNew(cast(*args[0]).Val() - + cast(*args[1]).Val()); case Operator::Mul: - return global_arena->New(cast(*args[0]).Val() * - cast(*args[1]).Val()); + return global_arena->RawNew(cast(*args[0]).Val() * + cast(*args[1]).Val()); case Operator::Not: - return global_arena->New(!cast(*args[0]).Val()); + return global_arena->RawNew(!cast(*args[0]).Val()); case Operator::And: - return global_arena->New(cast(*args[0]).Val() && - cast(*args[1]).Val()); + return global_arena->RawNew(cast(*args[0]).Val() && + cast(*args[1]).Val()); case Operator::Or: - return global_arena->New(cast(*args[0]).Val() || - cast(*args[1]).Val()); + return global_arena->RawNew(cast(*args[0]).Val() || + cast(*args[1]).Val()); case Operator::Eq: - return global_arena->New( + return global_arena->RawNew( ValueEqual(args[0], args[1], line_num)); case Operator::Ptr: - return global_arena->New(args[0]); + return global_arena->RawNew(args[0]); case Operator::Deref: FATAL() << "dereference not implemented yet"; } @@ -124,12 +124,12 @@ void InitEnv(const Declaration& d, Env* env) { // Bring the deduced parameters into scope. for (const auto& deduced : func_def.deduced_parameters) { Address a = state->heap.AllocateValue( - global_arena->New(deduced.name)); + global_arena->RawNew(deduced.name)); new_env.Set(deduced.name, a); } auto pt = InterpPattern(new_env, func_def.param_pattern); auto f = - global_arena->New(func_def.name, pt, func_def.body); + global_arena->RawNew(func_def.name, pt, func_def.body); Address a = state->heap.AllocateValue(f); env->Set(func_def.name, a); break; @@ -152,7 +152,7 @@ void InitEnv(const Declaration& d, Env* env) { } } } - auto st = global_arena->New( + auto st = global_arena->RawNew( struct_def.name, std::move(fields), std::move(methods)); auto a = state->heap.AllocateValue(st); env->Set(struct_def.name, a); @@ -166,7 +166,8 @@ void InitEnv(const Declaration& d, Env* env) { auto t = InterpExp(Env(), signature); alts.push_back(make_pair(name, t)); } - auto ct = global_arena->New(choice.Name(), std::move(alts)); + auto ct = + global_arena->RawNew(choice.Name(), std::move(alts)); auto a = state->heap.AllocateValue(ct); env->Set(choice.Name(), a); break; @@ -205,27 +206,27 @@ void CallFunction(int line_num, std::vector operas, PatternMatch(fn.Param(), operas[1], globals, ¶ms, line_num); CHECK(matches) << "internal error in call_function, pattern match failed"; // Create the new frame and push it on the stack - auto* scope = global_arena->New(*matches, params); - auto* frame = global_arena->New( + auto* scope = global_arena->RawNew(*matches, params); + auto* frame = global_arena->RawNew( fn.Name(), Stack(scope), - Stack(global_arena->New(fn.Body()))); + Stack(global_arena->RawNew(fn.Body()))); state->stack.Push(frame); break; } case Value::Kind::StructType: { const Value* arg = CopyVal(operas[1], line_num); - const Value* sv = global_arena->New(operas[0], arg); + const Value* sv = global_arena->RawNew(operas[0], arg); Frame* frame = state->stack.Top(); - frame->todo.Push(global_arena->New(sv)); + frame->todo.Push(global_arena->RawNew(sv)); break; } case Value::Kind::AlternativeConstructorValue: { const auto& alt = cast(*operas[0]); const Value* arg = CopyVal(operas[1], line_num); - const Value* av = global_arena->New( + const Value* av = global_arena->RawNew( alt.AltName(), alt.ChoiceName(), arg); Frame* frame = state->stack.Top(); - frame->todo.Push(global_arena->New(av)); + frame->todo.Push(global_arena->RawNew(av)); break; } default: @@ -260,9 +261,9 @@ void CreateTuple(Frame* frame, Action* act, const Expression* exp) { {.name = tup_lit.Fields()[i].name, .value = act->Results()[i]}); } - const Value* tv = global_arena->New(std::move(elements)); + const Value* tv = global_arena->RawNew(std::move(elements)); frame->todo.Pop(1); - frame->todo.Push(global_arena->New(tv)); + frame->todo.Push(global_arena->RawNew(tv)); } // Returns an updated environment that includes the bindings of @@ -422,16 +423,16 @@ void StepLvalue() { // -> { {E(x) :: C, E, F} :: S, H} Address pointer = GetFromEnv(exp->LineNumber(), cast(*exp).Name()); - const Value* v = global_arena->New(pointer); + const Value* v = global_arena->RawNew(pointer); frame->todo.Pop(); - frame->todo.Push(global_arena->New(v)); + frame->todo.Push(global_arena->RawNew(v)); break; } case Expression::Kind::FieldAccessExpression: { if (act->Pos() == 0) { // { {e.f :: C, E, F} :: S, H} // -> { e :: [].f :: C, E, F} :: S, H} - frame->todo.Push(global_arena->New( + frame->todo.Push(global_arena->RawNew( cast(*exp).Aggregate())); act->IncrementPos(); } else { @@ -441,8 +442,8 @@ void StepLvalue() { Address field = aggregate.SubobjectAddress( cast(*exp).Field()); frame->todo.Pop(1); - frame->todo.Push(global_arena->New( - global_arena->New(field))); + frame->todo.Push(global_arena->RawNew( + global_arena->RawNew(field))); } break; } @@ -450,11 +451,11 @@ void StepLvalue() { if (act->Pos() == 0) { // { {e[i] :: C, E, F} :: S, H} // -> { e :: [][i] :: C, E, F} :: S, H} - frame->todo.Push(global_arena->New( + frame->todo.Push(global_arena->RawNew( cast(*exp).Aggregate())); act->IncrementPos(); } else if (act->Pos() == 1) { - frame->todo.Push(global_arena->New( + frame->todo.Push(global_arena->RawNew( cast(*exp).Offset())); act->IncrementPos(); } else if (act->Pos() == 2) { @@ -465,8 +466,8 @@ void StepLvalue() { std::to_string(cast(*act->Results()[1]).Val()); Address field = aggregate.SubobjectAddress(f); frame->todo.Pop(1); - frame->todo.Push(global_arena->New( - global_arena->New(field))); + frame->todo.Push(global_arena->RawNew( + global_arena->RawNew(field))); } break; } @@ -475,7 +476,7 @@ void StepLvalue() { // { {(f1=e1,...) :: C, E, F} :: S, H} // -> { {e1 :: (f1=[],...) :: C, E, F} :: S, H} const Expression* e1 = cast(*exp).Fields()[0].expression; - frame->todo.Push(global_arena->New(e1)); + frame->todo.Push(global_arena->RawNew(e1)); act->IncrementPos(); } else if (act->Pos() != static_cast(cast(*exp).Fields().size())) { @@ -485,7 +486,7 @@ void StepLvalue() { // H} const Expression* elt = cast(*exp).Fields()[act->Pos()].expression; - frame->todo.Push(global_arena->New(elt)); + frame->todo.Push(global_arena->RawNew(elt)); act->IncrementPos(); } else { CreateTuple(frame, act, exp); @@ -523,11 +524,11 @@ void StepExp() { if (act->Pos() == 0) { // { { e[i] :: C, E, F} :: S, H} // -> { { e :: [][i] :: C, E, F} :: S, H} - frame->todo.Push(global_arena->New( + frame->todo.Push(global_arena->RawNew( cast(*exp).Aggregate())); act->IncrementPos(); } else if (act->Pos() == 1) { - frame->todo.Push(global_arena->New( + frame->todo.Push(global_arena->RawNew( cast(*exp).Offset())); act->IncrementPos(); } else if (act->Pos() == 2) { @@ -544,7 +545,7 @@ void StepExp() { << "field " << f << " not in " << *tuple; } frame->todo.Pop(1); - frame->todo.Push(global_arena->New(field)); + frame->todo.Push(global_arena->RawNew(field)); break; } default: @@ -561,7 +562,7 @@ void StepExp() { // -> { {e1 :: (f1=[],...) :: C, E, F} :: S, H} const Expression* e1 = cast(*exp).Fields()[0].expression; - frame->todo.Push(global_arena->New(e1)); + frame->todo.Push(global_arena->RawNew(e1)); act->IncrementPos(); } else { CreateTuple(frame, act, exp); @@ -574,7 +575,7 @@ void StepExp() { // H} const Expression* elt = cast(*exp).Fields()[act->Pos()].expression; - frame->todo.Push(global_arena->New(elt)); + frame->todo.Push(global_arena->RawNew(elt)); act->IncrementPos(); } else { CreateTuple(frame, act, exp); @@ -587,7 +588,7 @@ void StepExp() { // { { e.f :: C, E, F} :: S, H} // -> { { e :: [].f :: C, E, F} :: S, H} frame->todo.Push( - global_arena->New(access.Aggregate())); + global_arena->RawNew(access.Aggregate())); act->IncrementPos(); } else { // { { v :: [].f :: C, E, F} :: S, H} @@ -595,7 +596,7 @@ void StepExp() { const Value* element = act->Results()[0]->GetField( FieldPath(access.Field()), exp->LineNumber()); frame->todo.Pop(1); - frame->todo.Push(global_arena->New(element)); + frame->todo.Push(global_arena->RawNew(element)); } break; } @@ -606,22 +607,22 @@ void StepExp() { Address pointer = GetFromEnv(exp->LineNumber(), ident.Name()); const Value* pointee = state->heap.Read(pointer, exp->LineNumber()); frame->todo.Pop(1); - frame->todo.Push(global_arena->New(pointee)); + frame->todo.Push(global_arena->RawNew(pointee)); break; } case Expression::Kind::IntLiteral: CHECK(act->Pos() == 0); // { {n :: C, E, F} :: S, H} -> { {n' :: C, E, F} :: S, H} frame->todo.Pop(1); - frame->todo.Push(global_arena->New( - global_arena->New(cast(*exp).Val()))); + frame->todo.Push(global_arena->RawNew( + global_arena->RawNew(cast(*exp).Val()))); break; case Expression::Kind::BoolLiteral: CHECK(act->Pos() == 0); // { {n :: C, E, F} :: S, H} -> { {n' :: C, E, F} :: S, H} frame->todo.Pop(1); - frame->todo.Push(global_arena->New( - global_arena->New(cast(*exp).Val()))); + frame->todo.Push(global_arena->RawNew( + global_arena->RawNew(cast(*exp).Val()))); break; case Expression::Kind::PrimitiveOperatorExpression: { const auto& op = cast(*exp); @@ -629,14 +630,14 @@ void StepExp() { // { {v :: op(vs,[],e,es) :: C, E, F} :: S, H} // -> { {e :: op(vs,v,[],es) :: C, E, F} :: S, H} const Expression* arg = op.Arguments()[act->Pos()]; - frame->todo.Push(global_arena->New(arg)); + frame->todo.Push(global_arena->RawNew(arg)); act->IncrementPos(); } else { // { {v :: op(vs,[]) :: C, E, F} :: S, H} // -> { {eval_prim(op, (vs,v)) :: C, E, F} :: S, H} const Value* v = EvalPrim(op.Op(), act->Results(), exp->LineNumber()); frame->todo.Pop(1); - frame->todo.Push(global_arena->New(v)); + frame->todo.Push(global_arena->RawNew(v)); } break; } @@ -644,13 +645,13 @@ void StepExp() { if (act->Pos() == 0) { // { {e1(e2) :: C, E, F} :: S, H} // -> { {e1 :: [](e2) :: C, E, F} :: S, H} - frame->todo.Push(global_arena->New( + frame->todo.Push(global_arena->RawNew( cast(*exp).Function())); act->IncrementPos(); } else if (act->Pos() == 1) { // { { v :: [](e) :: C, E, F} :: S, H} // -> { { e :: v([]) :: C, E, F} :: S, H} - frame->todo.Push(global_arena->New( + frame->todo.Push(global_arena->RawNew( cast(*exp).Argument())); act->IncrementPos(); } else if (act->Pos() == 2) { @@ -673,73 +674,74 @@ void StepExp() { CHECK(pointee->Tag() == Value::Kind::StringValue); // TODO: This could eventually use something like llvm::formatv. llvm::outs() << cast(*pointee).Val(); - frame->todo.Push(global_arena->New(&TupleValue::Empty())); + frame->todo.Push( + global_arena->RawNew(&TupleValue::Empty())); break; } break; case Expression::Kind::IntTypeLiteral: { CHECK(act->Pos() == 0); - const Value* v = global_arena->New(); + const Value* v = global_arena->RawNew(); frame->todo.Pop(1); - frame->todo.Push(global_arena->New(v)); + frame->todo.Push(global_arena->RawNew(v)); break; } case Expression::Kind::BoolTypeLiteral: { CHECK(act->Pos() == 0); - const Value* v = global_arena->New(); + const Value* v = global_arena->RawNew(); frame->todo.Pop(1); - frame->todo.Push(global_arena->New(v)); + frame->todo.Push(global_arena->RawNew(v)); break; } case Expression::Kind::TypeTypeLiteral: { CHECK(act->Pos() == 0); - const Value* v = global_arena->New(); + const Value* v = global_arena->RawNew(); frame->todo.Pop(1); - frame->todo.Push(global_arena->New(v)); + frame->todo.Push(global_arena->RawNew(v)); break; } case Expression::Kind::FunctionTypeLiteral: { if (act->Pos() == 0) { - frame->todo.Push(global_arena->New( + frame->todo.Push(global_arena->RawNew( cast(*exp).Parameter())); act->IncrementPos(); } else if (act->Pos() == 1) { // { { pt :: fn [] -> e :: C, E, F} :: S, H} // -> { { e :: fn pt -> []) :: C, E, F} :: S, H} - frame->todo.Push(global_arena->New( + frame->todo.Push(global_arena->RawNew( cast(*exp).ReturnType())); act->IncrementPos(); } else if (act->Pos() == 2) { // { { rt :: fn pt -> [] :: C, E, F} :: S, H} // -> { fn pt -> rt :: {C, E, F} :: S, H} - const Value* v = global_arena->New( + const Value* v = global_arena->RawNew( std::vector(), act->Results()[0], act->Results()[1]); frame->todo.Pop(1); - frame->todo.Push(global_arena->New(v)); + frame->todo.Push(global_arena->RawNew(v)); } break; } case Expression::Kind::ContinuationTypeLiteral: { CHECK(act->Pos() == 0); - const Value* v = global_arena->New(); + const Value* v = global_arena->RawNew(); frame->todo.Pop(1); - frame->todo.Push(global_arena->New(v)); + frame->todo.Push(global_arena->RawNew(v)); break; } case Expression::Kind::StringLiteral: CHECK(act->Pos() == 0); // { {n :: C, E, F} :: S, H} -> { {n' :: C, E, F} :: S, H} frame->todo.Pop(1); - frame->todo.Push(global_arena->New( - global_arena->New(cast(*exp).Val()))); + frame->todo.Push(global_arena->RawNew( + global_arena->RawNew(cast(*exp).Val()))); break; case Expression::Kind::StringTypeLiteral: { CHECK(act->Pos() == 0); - const Value* v = global_arena->New(); + const Value* v = global_arena->RawNew(); frame->todo.Pop(1); - frame->todo.Push(global_arena->New(v)); + frame->todo.Push(global_arena->RawNew(v)); break; } } // switch (exp->Tag) @@ -755,21 +757,21 @@ void StepPattern() { switch (pattern->Tag()) { case Pattern::Kind::AutoPattern: { CHECK(act->Pos() == 0); - const Value* v = global_arena->New(); + const Value* v = global_arena->RawNew(); frame->todo.Pop(1); - frame->todo.Push(global_arena->New(v)); + frame->todo.Push(global_arena->RawNew(v)); break; } case Pattern::Kind::BindingPattern: { const auto& binding = cast(*pattern); if (act->Pos() == 0) { - frame->todo.Push(global_arena->New(binding.Type())); + frame->todo.Push(global_arena->RawNew(binding.Type())); act->IncrementPos(); } else { - auto v = global_arena->New(binding.Name(), - act->Results()[0]); + auto v = global_arena->RawNew( + binding.Name(), act->Results()[0]); frame->todo.Pop(1); - frame->todo.Push(global_arena->New(v)); + frame->todo.Push(global_arena->RawNew(v)); } break; } @@ -778,10 +780,11 @@ void StepPattern() { if (act->Pos() == 0) { if (tuple.Fields().empty()) { frame->todo.Pop(1); - frame->todo.Push(global_arena->New(&TupleValue::Empty())); + frame->todo.Push( + global_arena->RawNew(&TupleValue::Empty())); } else { const Pattern* p1 = tuple.Fields()[0].pattern; - frame->todo.Push(global_arena->New(p1)); + frame->todo.Push(global_arena->RawNew(p1)); act->IncrementPos(); } } else if (act->Pos() != static_cast(tuple.Fields().size())) { @@ -790,7 +793,7 @@ void StepPattern() { // -> { { ek+1 :: (f1=v1,..., fk=vk, fk+1=[],...) :: C, E, F} :: S, // H} const Pattern* elt = tuple.Fields()[act->Pos()].pattern; - frame->todo.Push(global_arena->New(elt)); + frame->todo.Push(global_arena->RawNew(elt)); act->IncrementPos(); } else { std::vector elements; @@ -799,9 +802,9 @@ void StepPattern() { {.name = tuple.Fields()[i].name, .value = act->Results()[i]}); } const Value* tuple_value = - global_arena->New(std::move(elements)); + global_arena->RawNew(std::move(elements)); frame->todo.Pop(1); - frame->todo.Push(global_arena->New(tuple_value)); + frame->todo.Push(global_arena->RawNew(tuple_value)); } break; } @@ -809,18 +812,18 @@ void StepPattern() { const auto& alternative = cast(*pattern); if (act->Pos() == 0) { frame->todo.Push( - global_arena->New(alternative.ChoiceType())); + global_arena->RawNew(alternative.ChoiceType())); act->IncrementPos(); } else if (act->Pos() == 1) { frame->todo.Push( - global_arena->New(alternative.Arguments())); + global_arena->RawNew(alternative.Arguments())); act->IncrementPos(); } else { CHECK(act->Pos() == 2); const auto& choice_type = cast(*act->Results()[0]); frame->todo.Pop(1); - frame->todo.Push( - global_arena->New(global_arena->New( + frame->todo.Push(global_arena->RawNew( + global_arena->RawNew( alternative.AlternativeName(), choice_type.Name(), act->Results()[1]))); } @@ -828,7 +831,7 @@ void StepPattern() { } case Pattern::Kind::ExpressionPattern: frame->todo.Pop(1); - frame->todo.Push(global_arena->New( + frame->todo.Push(global_arena->RawNew( cast(pattern)->Expression())); break; } @@ -880,7 +883,7 @@ void StepStmt() { // { { (match (e) ...) :: C, E, F} :: S, H} // -> { { e :: (match ([]) ...) :: C, E, F} :: S, H} frame->todo.Push( - global_arena->New(cast(*stmt).Exp())); + global_arena->RawNew(cast(*stmt).Exp())); act->IncrementPos(); } else { // Regarding act->Pos(): @@ -905,7 +908,7 @@ void StepStmt() { // start interpreting the pattern of the clause // { {v :: (match ([]) ...) :: C, E, F} :: S, H} // -> { {pi :: (match ([]) ...) :: C, E, F} :: S, H} - frame->todo.Push(global_arena->New(c->first)); + frame->todo.Push(global_arena->RawNew(c->first)); act->IncrementPos(); } else { // try to match auto v = act->Results()[0]; @@ -915,15 +918,16 @@ void StepStmt() { std::optional matches = PatternMatch(pat, v, values, &vars, stmt->LineNumber()); if (matches) { // we have a match, start the body - auto* new_scope = global_arena->New(*matches, vars); + auto* new_scope = global_arena->RawNew(*matches, vars); frame->scopes.Push(new_scope); const Statement* body_block = - global_arena->New(stmt->LineNumber(), c->second); - Action* body_act = global_arena->New(body_block); + global_arena->RawNew(stmt->LineNumber(), c->second); + Action* body_act = + global_arena->RawNew(body_block); body_act->IncrementPos(); frame->todo.Pop(1); frame->todo.Push(body_act); - frame->todo.Push(global_arena->New(c->second)); + frame->todo.Push(global_arena->RawNew(c->second)); } else { // this case did not match, moving on act->IncrementPos(); @@ -941,14 +945,14 @@ void StepStmt() { // { { (while (e) s) :: C, E, F} :: S, H} // -> { { e :: (while ([]) s) :: C, E, F} :: S, H} frame->todo.Push( - global_arena->New(cast(*stmt).Cond())); + global_arena->RawNew(cast(*stmt).Cond())); act->IncrementPos(); } else if (cast(*act->Results()[0]).Val()) { // { {true :: (while ([]) s) :: C, E, F} :: S, H} // -> { { s :: (while (e) s) :: C, E, F } :: S, H} frame->todo.Top()->Clear(); frame->todo.Push( - global_arena->New(cast(*stmt).Body())); + global_arena->RawNew(cast(*stmt).Body())); } else { // { {false :: (while ([]) s) :: C, E, F} :: S, H} // -> { { C, E, F } :: S, H} @@ -986,11 +990,11 @@ void StepStmt() { case Statement::Kind::Block: { if (act->Pos() == 0) { if (cast(*stmt).Stmt()) { - auto* scope = global_arena->New(CurrentEnv(state), - std::list()); + auto* scope = global_arena->RawNew(CurrentEnv(state), + std::list()); frame->scopes.Push(scope); frame->todo.Push( - global_arena->New(cast(*stmt).Stmt())); + global_arena->RawNew(cast(*stmt).Stmt())); act->IncrementPos(); act->IncrementPos(); } else { @@ -1008,11 +1012,11 @@ void StepStmt() { if (act->Pos() == 0) { // { {(var x = e) :: C, E, F} :: S, H} // -> { {e :: (var x = []) :: C, E, F} :: S, H} - frame->todo.Push(global_arena->New( + frame->todo.Push(global_arena->RawNew( cast(*stmt).Init())); act->IncrementPos(); } else if (act->Pos() == 1) { - frame->todo.Push(global_arena->New( + frame->todo.Push(global_arena->RawNew( cast(*stmt).Pat())); act->IncrementPos(); } else if (act->Pos() == 2) { @@ -1035,7 +1039,7 @@ void StepStmt() { if (act->Pos() == 0) { // { {e :: C, E, F} :: S, H} // -> { {e :: C, E, F} :: S, H} - frame->todo.Push(global_arena->New( + frame->todo.Push(global_arena->RawNew( cast(*stmt).Exp())); act->IncrementPos(); } else { @@ -1047,13 +1051,13 @@ void StepStmt() { // { {(lv = e) :: C, E, F} :: S, H} // -> { {lv :: ([] = e) :: C, E, F} :: S, H} frame->todo.Push( - global_arena->New(cast(*stmt).Lhs())); + global_arena->RawNew(cast(*stmt).Lhs())); act->IncrementPos(); } else if (act->Pos() == 1) { // { { a :: ([] = e) :: C, E, F} :: S, H} // -> { { e :: (a = []) :: C, E, F} :: S, H} frame->todo.Push( - global_arena->New(cast(*stmt).Rhs())); + global_arena->RawNew(cast(*stmt).Rhs())); act->IncrementPos(); } else if (act->Pos() == 2) { // { { v :: (a = []) :: C, E, F} :: S, H} @@ -1069,7 +1073,7 @@ void StepStmt() { // { {(if (e) then_stmt else else_stmt) :: C, E, F} :: S, H} // -> { { e :: (if ([]) then_stmt else else_stmt) :: C, E, F} :: S, H} frame->todo.Push( - global_arena->New(cast(*stmt).Cond())); + global_arena->RawNew(cast(*stmt).Cond())); act->IncrementPos(); } else if (cast(*act->Results()[0]).Val()) { // { {true :: if ([]) then_stmt else else_stmt :: C, E, F} :: @@ -1077,14 +1081,14 @@ void StepStmt() { // -> { { then_stmt :: C, E, F } :: S, H} frame->todo.Pop(1); frame->todo.Push( - global_arena->New(cast(*stmt).ThenStmt())); + global_arena->RawNew(cast(*stmt).ThenStmt())); } else if (cast(*stmt).ElseStmt()) { // { {false :: if ([]) then_stmt else else_stmt :: C, E, F} :: // S, H} // -> { { else_stmt :: C, E, F } :: S, H} frame->todo.Pop(1); frame->todo.Push( - global_arena->New(cast(*stmt).ElseStmt())); + global_arena->RawNew(cast(*stmt).ElseStmt())); } else { frame->todo.Pop(1); } @@ -1094,7 +1098,7 @@ void StepStmt() { // { {return e :: C, E, F} :: S, H} // -> { {e :: return [] :: C, E, F} :: S, H} frame->todo.Push( - global_arena->New(cast(*stmt).Exp())); + global_arena->RawNew(cast(*stmt).Exp())); act->IncrementPos(); } else { // { {v :: return [] :: C, E, F} :: {C', E', F'} :: S, H} @@ -1103,7 +1107,7 @@ void StepStmt() { DeallocateLocals(stmt->LineNumber(), frame); state->stack.Pop(1); frame = state->stack.Top(); - frame->todo.Push(global_arena->New(ret_val)); + frame->todo.Push(global_arena->RawNew(ret_val)); } break; case Statement::Kind::Sequence: @@ -1112,30 +1116,30 @@ void StepStmt() { // -> { { s1 :: s2 :: C, E, F} :: S, H} frame->todo.Pop(1); if (cast(*stmt).Next()) { - frame->todo.Push( - global_arena->New(cast(*stmt).Next())); + frame->todo.Push(global_arena->RawNew( + cast(*stmt).Next())); } frame->todo.Push( - global_arena->New(cast(*stmt).Stmt())); + global_arena->RawNew(cast(*stmt).Stmt())); break; case Statement::Kind::Continuation: { CHECK(act->Pos() == 0); // Create a continuation object by creating a frame similar the // way one is created in a function call. - Scope* scope = - global_arena->New(CurrentEnv(state), std::list()); + Scope* scope = global_arena->RawNew(CurrentEnv(state), + std::list()); Stack scopes; scopes.Push(scope); Stack todo; - todo.Push(global_arena->New( - global_arena->New(stmt->LineNumber(), nullptr, - /*is_omitted_exp=*/true))); - todo.Push( - global_arena->New(cast(*stmt).Body())); + todo.Push(global_arena->RawNew( + global_arena->RawNew(stmt->LineNumber(), nullptr, + /*is_omitted_exp=*/true))); + todo.Push(global_arena->RawNew( + cast(*stmt).Body())); Frame* continuation_frame = - global_arena->New("__continuation", scopes, todo); + global_arena->RawNew("__continuation", scopes, todo); Address continuation_address = - state->heap.AllocateValue(global_arena->New( + state->heap.AllocateValue(global_arena->RawNew( std::vector({continuation_frame}))); // Store the continuation's address in the frame. continuation_frame->continuation = continuation_address; @@ -1150,17 +1154,17 @@ void StepStmt() { case Statement::Kind::Run: if (act->Pos() == 0) { // Evaluate the argument of the run statement. - frame->todo.Push( - global_arena->New(cast(*stmt).Argument())); + frame->todo.Push(global_arena->RawNew( + cast(*stmt).Argument())); act->IncrementPos(); } else { frame->todo.Pop(1); // Push an expression statement action to ignore the result // value from the continuation. - Action* ignore_result = global_arena->New( - global_arena->New( + Action* ignore_result = global_arena->RawNew( + global_arena->RawNew( stmt->LineNumber(), - global_arena->New(stmt->LineNumber()))); + global_arena->RawNew(stmt->LineNumber()))); frame->todo.Push(ignore_result); // Push the continuation onto the current stack. const std::vector& continuation_vector = @@ -1181,7 +1185,7 @@ void StepStmt() { } while (paused.back()->continuation == std::nullopt); // Update the continuation with the paused stack. state->heap.Write(*paused.back()->continuation, - global_arena->New(paused), + global_arena->RawNew(paused), stmt->LineNumber()); break; } @@ -1220,18 +1224,18 @@ void Step() { // Interpret the whole porogram. auto InterpProgram(const std::list& fs) -> int { - state = global_arena->New(); // Runtime state. + state = global_arena->RawNew(); // Runtime state. if (tracing_output) { llvm::outs() << "********** initializing globals **********\n"; } InitGlobals(fs); - const Expression* arg = global_arena->New(0); - const Expression* call_main = global_arena->New( - 0, global_arena->New(0, "main"), arg); - auto todo = Stack(global_arena->New(call_main)); - auto* scope = global_arena->New(globals, std::list()); - auto* frame = global_arena->New("top", Stack(scope), todo); + const Expression* arg = global_arena->RawNew(0); + const Expression* call_main = global_arena->RawNew( + 0, global_arena->RawNew(0, "main"), arg); + auto todo = Stack(global_arena->RawNew(call_main)); + auto* scope = global_arena->RawNew(globals, std::list()); + auto* frame = global_arena->RawNew("top", Stack(scope), todo); state->stack = Stack(frame); if (tracing_output) { @@ -1252,9 +1256,9 @@ auto InterpProgram(const std::list& fs) -> int { // Interpret an expression at compile-time. auto InterpExp(Env values, const Expression* e) -> const Value* { - auto todo = Stack(global_arena->New(e)); - auto* scope = global_arena->New(values, std::list()); - auto* frame = global_arena->New("InterpExp", Stack(scope), todo); + auto todo = Stack(global_arena->RawNew(e)); + auto* scope = global_arena->RawNew(values, std::list()); + auto* frame = global_arena->RawNew("InterpExp", Stack(scope), todo); state->stack = Stack(frame); while (state->stack.Count() > 1 || state->stack.Top()->todo.Count() > 1 || @@ -1266,9 +1270,10 @@ auto InterpExp(Env values, const Expression* e) -> const Value* { // Interpret a pattern at compile-time. auto InterpPattern(Env values, const Pattern* p) -> const Value* { - auto todo = Stack(global_arena->New(p)); - auto* scope = global_arena->New(values, std::list()); - auto* frame = global_arena->New("InterpPattern", Stack(scope), todo); + auto todo = Stack(global_arena->RawNew(p)); + auto* scope = global_arena->RawNew(values, std::list()); + auto* frame = + global_arena->RawNew("InterpPattern", Stack(scope), todo); state->stack = Stack(frame); while (state->stack.Count() > 1 || state->stack.Top()->todo.Count() > 1 || diff --git a/executable_semantics/interpreter/typecheck.cpp b/executable_semantics/interpreter/typecheck.cpp index aa1684005075..ed3a9ebbe2cb 100644 --- a/executable_semantics/interpreter/typecheck.cpp +++ b/executable_semantics/interpreter/typecheck.cpp @@ -46,16 +46,16 @@ static void ExpectPointerType(int line_num, const std::string& context, static auto ReifyType(const Value* t, int line_num) -> const Expression* { switch (t->Tag()) { case Value::Kind::IntType: - return global_arena->New(0); + return global_arena->RawNew(0); case Value::Kind::BoolType: - return global_arena->New(0); + return global_arena->RawNew(0); case Value::Kind::TypeType: - return global_arena->New(0); + return global_arena->RawNew(0); case Value::Kind::ContinuationType: - return global_arena->New(0); + return global_arena->RawNew(0); case Value::Kind::FunctionType: { const auto& fn_type = cast(*t); - return global_arena->New( + return global_arena->RawNew( 0, ReifyType(fn_type.Param(), line_num), ReifyType(fn_type.Ret(), line_num), /*is_omitted_return_type=*/false); @@ -66,24 +66,24 @@ static auto ReifyType(const Value* t, int line_num) -> const Expression* { args.push_back( FieldInitializer(field.name, ReifyType(field.value, line_num))); } - return global_arena->New(0, args); + return global_arena->RawNew(0, args); } case Value::Kind::StructType: - return global_arena->New( + return global_arena->RawNew( 0, cast(*t).Name()); case Value::Kind::ChoiceType: - return global_arena->New( + return global_arena->RawNew( 0, cast(*t).Name()); case Value::Kind::PointerType: - return global_arena->New( + return global_arena->RawNew( 0, Operator::Ptr, std::vector( {ReifyType(cast(*t).Type(), line_num)})); case Value::Kind::VariableType: - return global_arena->New( + return global_arena->RawNew( 0, cast(*t).Name()); case Value::Kind::StringType: - return global_arena->New(0); + return global_arena->RawNew(0); case Value::Kind::AlternativeConstructorValue: case Value::Kind::AlternativeValue: case Value::Kind::AutoType: @@ -206,17 +206,17 @@ static auto Substitute(TypeEnv dict, const Value* type) -> const Value* { auto t = Substitute(dict, elt.value); elts.push_back({.name = elt.name, .value = t}); } - return global_arena->New(elts); + return global_arena->RawNew(elts); } case Value::Kind::FunctionType: { const auto& fn_type = cast(*type); auto param = Substitute(dict, fn_type.Param()); auto ret = Substitute(dict, fn_type.Ret()); - return global_arena->New(std::vector(), - param, ret); + return global_arena->RawNew(std::vector(), + param, ret); } case Value::Kind::PointerType: { - return global_arena->New( + return global_arena->RawNew( Substitute(dict, cast(*type).Type())); } case Value::Kind::AutoType: @@ -275,9 +275,9 @@ auto TypeCheckExp(const Expression* e, TypeEnv types, Env values) FATAL_COMPILATION_ERROR(e->LineNumber()) << "field " << f << " is not in the tuple " << *t; } - auto new_e = global_arena->New( + auto new_e = global_arena->RawNew( e->LineNumber(), res.exp, - global_arena->New(e->LineNumber(), i)); + global_arena->RawNew(e->LineNumber(), i)); return TCExpression(new_e, field_t, res.types); } default: @@ -294,8 +294,9 @@ auto TypeCheckExp(const Expression* e, TypeEnv types, Env values) new_args.push_back(FieldInitializer(arg.name, arg_res.exp)); arg_types.push_back({.name = arg.name, .value = arg_res.type}); } - auto tuple_e = global_arena->New(e->LineNumber(), new_args); - auto tuple_t = global_arena->New(std::move(arg_types)); + auto tuple_e = + global_arena->RawNew(e->LineNumber(), new_args); + auto tuple_t = global_arena->RawNew(std::move(arg_types)); return TCExpression(tuple_e, tuple_t, new_types); } case Expression::Kind::FieldAccessExpression: { @@ -309,7 +310,7 @@ auto TypeCheckExp(const Expression* e, TypeEnv types, Env values) for (auto& field : t_struct.Fields()) { if (access.Field() == field.first) { const Expression* new_e = - global_arena->New( + global_arena->RawNew( e->LineNumber(), res.exp, access.Field()); return TCExpression(new_e, field.second, res.types); } @@ -318,7 +319,7 @@ auto TypeCheckExp(const Expression* e, TypeEnv types, Env values) for (auto& method : t_struct.Methods()) { if (access.Field() == method.first) { const Expression* new_e = - global_arena->New( + global_arena->RawNew( e->LineNumber(), res.exp, access.Field()); return TCExpression(new_e, method.second, res.types); } @@ -331,7 +332,7 @@ auto TypeCheckExp(const Expression* e, TypeEnv types, Env values) const auto& tup = cast(*t); for (const TupleElement& field : tup.Elements()) { if (access.Field() == field.name) { - auto new_e = global_arena->New( + auto new_e = global_arena->RawNew( e->LineNumber(), res.exp, access.Field()); return TCExpression(new_e, field.value, res.types); } @@ -345,9 +346,9 @@ auto TypeCheckExp(const Expression* e, TypeEnv types, Env values) for (const auto& vt : choice.Alternatives()) { if (access.Field() == vt.first) { const Expression* new_e = - global_arena->New( + global_arena->RawNew( e->LineNumber(), res.exp, access.Field()); - auto fun_ty = global_arena->New( + auto fun_ty = global_arena->RawNew( std::vector(), vt.second, t); return TCExpression(new_e, fun_ty, res.types); } @@ -373,9 +374,9 @@ auto TypeCheckExp(const Expression* e, TypeEnv types, Env values) } } case Expression::Kind::IntLiteral: - return TCExpression(e, global_arena->New(), types); + return TCExpression(e, global_arena->RawNew(), types); case Expression::Kind::BoolLiteral: - return TCExpression(e, global_arena->New(), types); + return TCExpression(e, global_arena->RawNew(), types); case Expression::Kind::PrimitiveOperatorExpression: { const auto& op = cast(*e); std::vector es; @@ -387,58 +388,67 @@ auto TypeCheckExp(const Expression* e, TypeEnv types, Env values) es.push_back(res.exp); ts.push_back(res.type); } - auto new_e = global_arena->New( + auto new_e = global_arena->RawNew( e->LineNumber(), op.Op(), es); switch (op.Op()) { case Operator::Neg: - ExpectType(e->LineNumber(), "negation", global_arena->New(), - ts[0]); - return TCExpression(new_e, global_arena->New(), new_types); + ExpectType(e->LineNumber(), "negation", + global_arena->RawNew(), ts[0]); + return TCExpression(new_e, global_arena->RawNew(), + new_types); case Operator::Add: ExpectType(e->LineNumber(), "addition(1)", - global_arena->New(), ts[0]); + global_arena->RawNew(), ts[0]); ExpectType(e->LineNumber(), "addition(2)", - global_arena->New(), ts[1]); - return TCExpression(new_e, global_arena->New(), new_types); + global_arena->RawNew(), ts[1]); + return TCExpression(new_e, global_arena->RawNew(), + new_types); case Operator::Sub: ExpectType(e->LineNumber(), "subtraction(1)", - global_arena->New(), ts[0]); + global_arena->RawNew(), ts[0]); ExpectType(e->LineNumber(), "subtraction(2)", - global_arena->New(), ts[1]); - return TCExpression(new_e, global_arena->New(), new_types); + global_arena->RawNew(), ts[1]); + return TCExpression(new_e, global_arena->RawNew(), + new_types); case Operator::Mul: ExpectType(e->LineNumber(), "multiplication(1)", - global_arena->New(), ts[0]); + global_arena->RawNew(), ts[0]); ExpectType(e->LineNumber(), "multiplication(2)", - global_arena->New(), ts[1]); - return TCExpression(new_e, global_arena->New(), new_types); + global_arena->RawNew(), ts[1]); + return TCExpression(new_e, global_arena->RawNew(), + new_types); case Operator::And: - ExpectType(e->LineNumber(), "&&(1)", global_arena->New(), + ExpectType(e->LineNumber(), "&&(1)", global_arena->RawNew(), ts[0]); - ExpectType(e->LineNumber(), "&&(2)", global_arena->New(), + ExpectType(e->LineNumber(), "&&(2)", global_arena->RawNew(), ts[1]); - return TCExpression(new_e, global_arena->New(), new_types); + return TCExpression(new_e, global_arena->RawNew(), + new_types); case Operator::Or: - ExpectType(e->LineNumber(), "||(1)", global_arena->New(), + ExpectType(e->LineNumber(), "||(1)", global_arena->RawNew(), ts[0]); - ExpectType(e->LineNumber(), "||(2)", global_arena->New(), + ExpectType(e->LineNumber(), "||(2)", global_arena->RawNew(), ts[1]); - return TCExpression(new_e, global_arena->New(), new_types); + return TCExpression(new_e, global_arena->RawNew(), + new_types); case Operator::Not: - ExpectType(e->LineNumber(), "!", global_arena->New(), + ExpectType(e->LineNumber(), "!", global_arena->RawNew(), ts[0]); - return TCExpression(new_e, global_arena->New(), new_types); + return TCExpression(new_e, global_arena->RawNew(), + new_types); case Operator::Eq: ExpectType(e->LineNumber(), "==", ts[0], ts[1]); - return TCExpression(new_e, global_arena->New(), new_types); + return TCExpression(new_e, global_arena->RawNew(), + new_types); case Operator::Deref: ExpectPointerType(e->LineNumber(), "*", ts[0]); return TCExpression(new_e, cast(*ts[0]).Type(), new_types); case Operator::Ptr: - ExpectType(e->LineNumber(), "*", global_arena->New(), + ExpectType(e->LineNumber(), "*", global_arena->RawNew(), ts[0]); - return TCExpression(new_e, global_arena->New(), new_types); + return TCExpression(new_e, global_arena->RawNew(), + new_types); } break; } @@ -468,7 +478,7 @@ auto TypeCheckExp(const Expression* e, TypeEnv types, Env values) } else { ExpectType(e->LineNumber(), "call", parameter_type, arg_res.type); } - auto new_e = global_arena->New( + auto new_e = global_arena->RawNew( e->LineNumber(), fun_res.exp, arg_res.exp); return TCExpression(new_e, return_type, arg_res.types); } @@ -484,14 +494,14 @@ auto TypeCheckExp(const Expression* e, TypeEnv types, Env values) const auto& fn = cast(*e); auto pt = InterpExp(values, fn.Parameter()); auto rt = InterpExp(values, fn.ReturnType()); - auto new_e = global_arena->New( + auto new_e = global_arena->RawNew( e->LineNumber(), ReifyType(pt, e->LineNumber()), ReifyType(rt, e->LineNumber()), /*is_omitted_return_type=*/false); - return TCExpression(new_e, global_arena->New(), types); + return TCExpression(new_e, global_arena->RawNew(), types); } case Expression::Kind::StringLiteral: - return TCExpression(e, global_arena->New(), types); + return TCExpression(e, global_arena->RawNew(), types); case Expression::Kind::IntrinsicExpression: switch (cast(*e).Intrinsic()) { case IntrinsicExpression::IntrinsicKind::Print: @@ -502,7 +512,7 @@ auto TypeCheckExp(const Expression* e, TypeEnv types, Env values) case Expression::Kind::StringTypeLiteral: case Expression::Kind::TypeTypeLiteral: case Expression::Kind::ContinuationTypeLiteral: - return TCExpression(e, global_arena->New(), types); + return TCExpression(e, global_arena->RawNew(), types); } } @@ -520,8 +530,9 @@ auto TypeCheckPattern(const Pattern* p, TypeEnv types, Env values, } switch (p->Tag()) { case Pattern::Kind::AutoPattern: { - return { - .pattern = p, .type = global_arena->New(), .types = types}; + return {.pattern = p, + .type = global_arena->RawNew(), + .types = types}; } case Pattern::Kind::BindingPattern: { const auto& binding = cast(*p); @@ -552,9 +563,9 @@ auto TypeCheckPattern(const Pattern* p, TypeEnv types, Env values, FATAL_COMPILATION_ERROR(binding.LineNumber()) << "Unsupported type pattern"; } - auto new_p = global_arena->New( + auto new_p = global_arena->RawNew( binding.LineNumber(), binding.Name(), - global_arena->New( + global_arena->RawNew( ReifyType(type, binding.LineNumber()))); if (binding.Name().has_value()) { types.Set(*binding.Name(), type); @@ -595,8 +606,8 @@ auto TypeCheckPattern(const Pattern* p, TypeEnv types, Env values, field_types.push_back({.name = field.name, .value = field_result.type}); } auto new_tuple = - global_arena->New(tuple.LineNumber(), new_fields); - auto tuple_t = global_arena->New(std::move(field_types)); + global_arena->RawNew(tuple.LineNumber(), new_fields); + auto tuple_t = global_arena->RawNew(std::move(field_types)); return {.pattern = new_tuple, .type = tuple_t, .types = new_types}; } case Pattern::Kind::AlternativePattern: { @@ -620,7 +631,7 @@ auto TypeCheckPattern(const Pattern* p, TypeEnv types, Env values, } TCPattern arg_results = TypeCheckPattern(alternative.Arguments(), types, values, parameter_types); - return {.pattern = global_arena->New( + return {.pattern = global_arena->RawNew( alternative.LineNumber(), ReifyType(choice_type, alternative.LineNumber()), alternative.AlternativeName(), @@ -631,7 +642,7 @@ auto TypeCheckPattern(const Pattern* p, TypeEnv types, Env values, case Pattern::Kind::ExpressionPattern: { TCExpression result = TypeCheckExp(cast(p)->Expression(), types, values); - return {.pattern = global_arena->New(result.exp), + return {.pattern = global_arena->RawNew(result.exp), .type = result.type, .types = result.types}; } @@ -666,27 +677,26 @@ auto TypeCheckStmt(const Statement* s, TypeEnv types, Env values, const auto& match = cast(*s); auto res = TypeCheckExp(match.Exp(), types, values); auto res_type = res.type; - auto new_clauses = - global_arena - ->New>>(); + auto new_clauses = global_arena->RawNew< + std::list>>(); for (auto& clause : *match.Clauses()) { new_clauses->push_back(TypecheckCase(res_type, clause.first, clause.second, types, values, ret_type, is_omitted_ret_type)); } const Statement* new_s = - global_arena->New(s->LineNumber(), res.exp, new_clauses); + global_arena->RawNew(s->LineNumber(), res.exp, new_clauses); return TCStatement(new_s, types); } case Statement::Kind::While: { const auto& while_stmt = cast(*s); auto cnd_res = TypeCheckExp(while_stmt.Cond(), types, values); ExpectType(s->LineNumber(), "condition of `while`", - global_arena->New(), cnd_res.type); + global_arena->RawNew(), cnd_res.type); auto body_res = TypeCheckStmt(while_stmt.Body(), types, values, ret_type, is_omitted_ret_type); - auto new_s = - global_arena->New(s->LineNumber(), cnd_res.exp, body_res.stmt); + auto new_s = global_arena->RawNew(s->LineNumber(), cnd_res.exp, + body_res.stmt); return TCStatement(new_s, types); } case Statement::Kind::Break: @@ -696,14 +706,14 @@ auto TypeCheckStmt(const Statement* s, TypeEnv types, Env values, auto stmt_res = TypeCheckStmt(cast(*s).Stmt(), types, values, ret_type, is_omitted_ret_type); return TCStatement( - global_arena->New(s->LineNumber(), stmt_res.stmt), types); + global_arena->RawNew(s->LineNumber(), stmt_res.stmt), types); } case Statement::Kind::VariableDefinition: { const auto& var = cast(*s); auto res = TypeCheckExp(var.Init(), types, values); const Value* rhs_ty = res.type; auto lhs_res = TypeCheckPattern(var.Pat(), types, values, rhs_ty); - const Statement* new_s = global_arena->New( + const Statement* new_s = global_arena->RawNew( s->LineNumber(), var.Pat(), res.exp); return TCStatement(new_s, lhs_res.types); } @@ -715,7 +725,7 @@ auto TypeCheckStmt(const Statement* s, TypeEnv types, Env values, auto next_res = TypeCheckStmt(seq.Next(), types2, values, ret_type, is_omitted_ret_type); auto types3 = next_res.types; - return TCStatement(global_arena->New( + return TCStatement(global_arena->RawNew( s->LineNumber(), stmt_res.stmt, next_res.stmt), types3); } @@ -726,28 +736,28 @@ auto TypeCheckStmt(const Statement* s, TypeEnv types, Env values, auto lhs_res = TypeCheckExp(assign.Lhs(), types, values); auto lhs_t = lhs_res.type; ExpectType(s->LineNumber(), "assign", lhs_t, rhs_t); - auto new_s = - global_arena->New(s->LineNumber(), lhs_res.exp, rhs_res.exp); + auto new_s = global_arena->RawNew(s->LineNumber(), lhs_res.exp, + rhs_res.exp); return TCStatement(new_s, lhs_res.types); } case Statement::Kind::ExpressionStatement: { auto res = TypeCheckExp(cast(*s).Exp(), types, values); auto new_s = - global_arena->New(s->LineNumber(), res.exp); + global_arena->RawNew(s->LineNumber(), res.exp); return TCStatement(new_s, types); } case Statement::Kind::If: { const auto& if_stmt = cast(*s); auto cnd_res = TypeCheckExp(if_stmt.Cond(), types, values); ExpectType(s->LineNumber(), "condition of `if`", - global_arena->New(), cnd_res.type); + global_arena->RawNew(), cnd_res.type); auto then_res = TypeCheckStmt(if_stmt.ThenStmt(), types, values, ret_type, is_omitted_ret_type); auto else_res = TypeCheckStmt(if_stmt.ElseStmt(), types, values, ret_type, is_omitted_ret_type); - auto new_s = global_arena->New(s->LineNumber(), cnd_res.exp, - then_res.stmt, else_res.stmt); + auto new_s = global_arena->RawNew(s->LineNumber(), cnd_res.exp, + then_res.stmt, else_res.stmt); return TCStatement(new_s, types); } case Statement::Kind::Return: { @@ -766,27 +776,28 @@ auto TypeCheckStmt(const Statement* s, TypeEnv types, Env values, << *s << " should" << (is_omitted_ret_type ? " not" : "") << " provide a return value, to match the function's signature."; } - return TCStatement(global_arena->New(s->LineNumber(), res.exp, - ret.IsOmittedExp()), + return TCStatement(global_arena->RawNew(s->LineNumber(), res.exp, + ret.IsOmittedExp()), types); } case Statement::Kind::Continuation: { const auto& cont = cast(*s); TCStatement body_result = TypeCheckStmt(cont.Body(), types, values, ret_type, is_omitted_ret_type); - const Statement* new_continuation = global_arena->New( + const Statement* new_continuation = global_arena->RawNew( s->LineNumber(), cont.ContinuationVariable(), body_result.stmt); types.Set(cont.ContinuationVariable(), - global_arena->New()); + global_arena->RawNew()); return TCStatement(new_continuation, types); } case Statement::Kind::Run: { TCExpression argument_result = TypeCheckExp(cast(*s).Argument(), types, values); ExpectType(s->LineNumber(), "argument of `run`", - global_arena->New(), argument_result.type); + global_arena->RawNew(), + argument_result.type); const Statement* new_run = - global_arena->New(s->LineNumber(), argument_result.exp); + global_arena->RawNew(s->LineNumber(), argument_result.exp); return TCStatement(new_run, types); } case Statement::Kind::Await: { @@ -800,8 +811,8 @@ static auto CheckOrEnsureReturn(const Statement* stmt, bool omitted_ret_type, int line_num) -> const Statement* { if (!stmt) { if (omitted_ret_type) { - return global_arena->New(line_num, nullptr, - /*is_omitted_exp=*/true); + return global_arena->RawNew(line_num, nullptr, + /*is_omitted_exp=*/true); } else { FATAL_COMPILATION_ERROR(line_num) << "control-flow reaches end of function that provides a `->` return " @@ -811,25 +822,24 @@ static auto CheckOrEnsureReturn(const Statement* stmt, bool omitted_ret_type, switch (stmt->Tag()) { case Statement::Kind::Match: { const auto& match = cast(*stmt); - auto new_clauses = - global_arena - ->New>>(); + auto new_clauses = global_arena->RawNew< + std::list>>(); for (const auto& clause : *match.Clauses()) { auto s = CheckOrEnsureReturn(clause.second, omitted_ret_type, stmt->LineNumber()); new_clauses->push_back(std::make_pair(clause.first, s)); } - return global_arena->New(stmt->LineNumber(), match.Exp(), - new_clauses); + return global_arena->RawNew(stmt->LineNumber(), match.Exp(), + new_clauses); } case Statement::Kind::Block: - return global_arena->New( + return global_arena->RawNew( stmt->LineNumber(), CheckOrEnsureReturn(cast(*stmt).Stmt(), omitted_ret_type, stmt->LineNumber())); case Statement::Kind::If: { const auto& if_stmt = cast(*stmt); - return global_arena->New( + return global_arena->RawNew( stmt->LineNumber(), if_stmt.Cond(), CheckOrEnsureReturn(if_stmt.ThenStmt(), omitted_ret_type, stmt->LineNumber()), @@ -841,7 +851,7 @@ static auto CheckOrEnsureReturn(const Statement* stmt, bool omitted_ret_type, case Statement::Kind::Sequence: { const auto& seq = cast(*stmt); if (seq.Next()) { - return global_arena->New( + return global_arena->RawNew( stmt->LineNumber(), seq.Stmt(), CheckOrEnsureReturn(seq.Next(), omitted_ret_type, stmt->LineNumber())); @@ -861,10 +871,10 @@ static auto CheckOrEnsureReturn(const Statement* stmt, bool omitted_ret_type, case Statement::Kind::Continue: case Statement::Kind::VariableDefinition: if (omitted_ret_type) { - return global_arena->New( + return global_arena->RawNew( stmt->LineNumber(), stmt, - global_arena->New(line_num, nullptr, - /*is_omitted_exp=*/true)); + global_arena->RawNew(line_num, nullptr, + /*is_omitted_exp=*/true)); } else { FATAL_COMPILATION_ERROR(stmt->LineNumber()) << "control-flow reaches end of function that provides a `->` " @@ -883,7 +893,7 @@ static auto TypeCheckFunDef(const FunctionDefinition* f, TypeEnv types, for (const auto& deduced : f->deduced_parameters) { // auto t = InterpExp(values, deduced.type); Address a = state->heap.AllocateValue( - global_arena->New(deduced.name)); + global_arena->RawNew(deduced.name)); values.Set(deduced.name, a); } // Type check the parameter pattern @@ -892,16 +902,17 @@ static auto TypeCheckFunDef(const FunctionDefinition* f, TypeEnv types, auto return_type = InterpPattern(values, f->return_type); if (f->name == "main") { ExpectType(f->line_num, "return type of `main`", - global_arena->New(), return_type); + global_arena->RawNew(), return_type); // TODO: Check that main doesn't have any parameters. } auto res = TypeCheckStmt(f->body, param_res.types, values, return_type, f->is_omitted_return_type); auto body = CheckOrEnsureReturn(res.stmt, f->is_omitted_return_type, f->line_num); - return global_arena->New( + return global_arena->RawNew( f->line_num, f->name, f->deduced_parameters, f->param_pattern, - global_arena->New(ReifyType(return_type, f->line_num)), + global_arena->RawNew( + ReifyType(return_type, f->line_num)), /*is_omitted_return_type=*/false, body); } @@ -911,7 +922,7 @@ static auto TypeOfFunDef(TypeEnv types, Env values, for (const auto& deduced : fun_def->deduced_parameters) { // auto t = InterpExp(values, deduced.type); Address a = state->heap.AllocateValue( - global_arena->New(deduced.name)); + global_arena->RawNew(deduced.name)); values.Set(deduced.name, a); } // Type check the parameter pattern @@ -923,8 +934,8 @@ static auto TypeOfFunDef(TypeEnv types, Env values, auto f = TypeCheckFunDef(fun_def, types, values); ret = InterpPattern(values, f->return_type); } - return global_arena->New(fun_def->deduced_parameters, - param_res.type, ret); + return global_arena->RawNew(fun_def->deduced_parameters, + param_res.type, ret); } static auto TypeOfStructDef(const StructDefinition* sd, TypeEnv /*types*/, @@ -951,8 +962,8 @@ static auto TypeOfStructDef(const StructDefinition* sd, TypeEnv /*types*/, } } } - return global_arena->New(sd->name, std::move(fields), - std::move(methods)); + return global_arena->RawNew(sd->name, std::move(fields), + std::move(methods)); } static auto GetName(const Declaration& d) -> const std::string& { @@ -978,7 +989,7 @@ auto MakeTypeChecked(const Declaration& d, const TypeEnv& types, const Env& values) -> const Declaration* { switch (d.Tag()) { case Declaration::Kind::FunctionDeclaration: - return global_arena->New(TypeCheckFunDef( + return global_arena->RawNew(TypeCheckFunDef( &cast(d).Definition(), types, values)); case Declaration::Kind::StructDeclaration: { @@ -993,7 +1004,7 @@ auto MakeTypeChecked(const Declaration& d, const TypeEnv& types, break; } } - return global_arena->New( + return global_arena->RawNew( struct_def.line_num, struct_def.name, std::move(fields)); } @@ -1045,9 +1056,9 @@ static void TopLevel(const Declaration& d, TypeCheckContext* tops) { cast(*st).Fields()) { field_types.push_back({.name = field_name, .value = field_value}); } - auto fun_ty = global_arena->New( + auto fun_ty = global_arena->RawNew( std::vector(), - global_arena->New(std::move(field_types)), st); + global_arena->RawNew(std::move(field_types)), st); tops->types.Set(struct_def.name, fun_ty); break; } @@ -1059,7 +1070,8 @@ static void TopLevel(const Declaration& d, TypeCheckContext* tops) { auto t = InterpExp(tops->values, signature); alts.push_back(std::make_pair(name, t)); } - auto ct = global_arena->New(choice.Name(), std::move(alts)); + auto ct = + global_arena->RawNew(choice.Name(), std::move(alts)); Address a = state->heap.AllocateValue(ct); tops->values.Set(choice.Name(), a); // Is this obsolete? tops->types.Set(choice.Name(), ct); diff --git a/executable_semantics/interpreter/value.cpp b/executable_semantics/interpreter/value.cpp index caab69b3e6e8..d08cbc304dda 100644 --- a/executable_semantics/interpreter/value.cpp +++ b/executable_semantics/interpreter/value.cpp @@ -78,7 +78,8 @@ auto GetMember(const Value* v, const std::string& f, int line_num) FATAL_RUNTIME_ERROR(line_num) << "alternative " << f << " not in " << *v; } - return global_arena->New(f, choice.Name()); + return global_arena->RawNew(f, + choice.Name()); } default: FATAL() << "field access not allowed for value " << *v; @@ -122,7 +123,7 @@ auto SetFieldImpl(const Value* value, } it->value = SetFieldImpl(it->value, path_begin + 1, path_end, field_value, line_num); - return global_arena->New(elements); + return global_arena->RawNew(elements); } default: FATAL() << "field access not allowed for value " << *value; @@ -255,56 +256,56 @@ auto CopyVal(const Value* val, int line_num) -> const Value* { elements.push_back( {.name = element.name, .value = CopyVal(element.value, line_num)}); } - return global_arena->New(std::move(elements)); + return global_arena->RawNew(std::move(elements)); } case Value::Kind::AlternativeValue: { const auto& alt = cast(*val); const Value* arg = CopyVal(alt.Argument(), line_num); - return global_arena->New(alt.AltName(), - alt.ChoiceName(), arg); + return global_arena->RawNew(alt.AltName(), + alt.ChoiceName(), arg); } case Value::Kind::StructValue: { const auto& s = cast(*val); const Value* inits = CopyVal(s.Inits(), line_num); - return global_arena->New(s.Type(), inits); + return global_arena->RawNew(s.Type(), inits); } case Value::Kind::IntValue: - return global_arena->New(cast(*val).Val()); + return global_arena->RawNew(cast(*val).Val()); case Value::Kind::BoolValue: - return global_arena->New(cast(*val).Val()); + return global_arena->RawNew(cast(*val).Val()); case Value::Kind::FunctionValue: { const auto& fn_value = cast(*val); - return global_arena->New(fn_value.Name(), fn_value.Param(), - fn_value.Body()); + return global_arena->RawNew( + fn_value.Name(), fn_value.Param(), fn_value.Body()); } case Value::Kind::PointerValue: - return global_arena->New(cast(*val).Val()); + return global_arena->RawNew(cast(*val).Val()); case Value::Kind::ContinuationValue: // Copying a continuation is "shallow". return val; case Value::Kind::FunctionType: { const auto& fn_type = cast(*val); - return global_arena->New(fn_type.Deduced(), - CopyVal(fn_type.Param(), line_num), - CopyVal(fn_type.Ret(), line_num)); + return global_arena->RawNew( + fn_type.Deduced(), CopyVal(fn_type.Param(), line_num), + CopyVal(fn_type.Ret(), line_num)); } case Value::Kind::PointerType: - return global_arena->New( + return global_arena->RawNew( CopyVal(cast(*val).Type(), line_num)); case Value::Kind::IntType: - return global_arena->New(); + return global_arena->RawNew(); case Value::Kind::BoolType: - return global_arena->New(); + return global_arena->RawNew(); case Value::Kind::TypeType: - return global_arena->New(); + return global_arena->RawNew(); case Value::Kind::AutoType: - return global_arena->New(); + return global_arena->RawNew(); case Value::Kind::ContinuationType: - return global_arena->New(); + return global_arena->RawNew(); case Value::Kind::StringType: - return global_arena->New(); + return global_arena->RawNew(); case Value::Kind::StringValue: - return global_arena->New(cast(*val).Val()); + return global_arena->RawNew(cast(*val).Val()); case Value::Kind::VariableType: case Value::Kind::StructType: case Value::Kind::ChoiceType: diff --git a/executable_semantics/syntax/parser.ypp b/executable_semantics/syntax/parser.ypp index fab87935a4cf..1e96da9a5aad 100644 --- a/executable_semantics/syntax/parser.ypp +++ b/executable_semantics/syntax/parser.ypp @@ -213,75 +213,75 @@ input: declaration_list ; expression: identifier - { $$ = global_arena->New(yylineno, $1); } + { $$ = global_arena->RawNew(yylineno, $1); } | expression designator - { $$ = global_arena->New(yylineno, $1, $2); } + { $$ = global_arena->RawNew(yylineno, $1, $2); } | expression "[" expression "]" - { $$ = global_arena->New(yylineno, $1, $3); } + { $$ = global_arena->RawNew(yylineno, $1, $3); } | integer_literal - { $$ = global_arena->New(yylineno, $1); } + { $$ = global_arena->RawNew(yylineno, $1); } | string_literal - { $$ = global_arena->New(yylineno, $1); } + { $$ = global_arena->RawNew(yylineno, $1); } | TRUE - { $$ = global_arena->New(yylineno, true); } + { $$ = global_arena->RawNew(yylineno, true); } | FALSE - { $$ = global_arena->New(yylineno, false); } + { $$ = global_arena->RawNew(yylineno, false); } | sized_type_literal { int val; CHECK(llvm::to_integer(llvm::StringRef($1).substr(1), val)); CHECK($1[0] == 'i' && val == 32) << "Only i32 is supported for now: " << $1; - $$ = global_arena->New(yylineno); + $$ = global_arena->RawNew(yylineno); } | STRING - { $$ = global_arena->New(yylineno); } + { $$ = global_arena->RawNew(yylineno); } | BOOL - { $$ = global_arena->New(yylineno); } + { $$ = global_arena->RawNew(yylineno); } | TYPE - { $$ = global_arena->New(yylineno); } + { $$ = global_arena->RawNew(yylineno); } | CONTINUATION_TYPE - { $$ = global_arena->New(yylineno); } + { $$ = global_arena->RawNew(yylineno); } | paren_expression { $$ = $1; } | expression EQUAL_EQUAL expression - { $$ = global_arena->New( + { $$ = global_arena->RawNew( yylineno, Operator::Eq, std::vector({$1, $3})); } | expression "+" expression - { $$ = global_arena->New( + { $$ = global_arena->RawNew( yylineno, Operator::Add, std::vector({$1, $3})); } | expression "-" expression - { $$ = global_arena->New( + { $$ = global_arena->RawNew( yylineno, Operator::Sub, std::vector({$1, $3})); } | expression BINARY_STAR expression - { $$ = global_arena->New( + { $$ = global_arena->RawNew( yylineno, Operator::Mul, std::vector({$1, $3})); } | expression AND expression - { $$ = global_arena->New( + { $$ = global_arena->RawNew( yylineno, Operator::And, std::vector({$1, $3})); } | expression OR expression - { $$ = global_arena->New( + { $$ = global_arena->RawNew( yylineno, Operator::Or, std::vector({$1, $3})); } | NOT expression - { $$ = global_arena->New( + { $$ = global_arena->RawNew( yylineno, Operator::Not, std::vector({$2})); } | "-" expression %prec UNARY_MINUS - { $$ = global_arena->New( + { $$ = global_arena->RawNew( yylineno, Operator::Neg, std::vector({$2})); } | PREFIX_STAR expression - { $$ = global_arena->New( + { $$ = global_arena->RawNew( yylineno, Operator::Deref, std::vector({$2})); } | UNARY_STAR expression %prec PREFIX_STAR - { $$ = global_arena->New( + { $$ = global_arena->RawNew( yylineno, Operator::Deref, std::vector({$2})); } | expression tuple - { $$ = global_arena->New(yylineno, $1, $2); } + { $$ = global_arena->RawNew(yylineno, $1, $2); } | expression POSTFIX_STAR - { $$ = global_arena->New( + { $$ = global_arena->RawNew( yylineno, Operator::Ptr, std::vector({$1})); } | expression UNARY_STAR - { $$ = global_arena->New( + { $$ = global_arena->RawNew( yylineno, Operator::Ptr, std::vector({$1})); } | FNTY tuple return_type - { $$ = global_arena->New( + { $$ = global_arena->RawNew( yylineno, $2, $3.first, $3.second); } ; designator: "." identifier { $$ = $2; } @@ -329,17 +329,17 @@ pattern: non_expression_pattern { $$ = $1; } | expression - { $$ = global_arena->New($1); } + { $$ = global_arena->RawNew($1); } ; non_expression_pattern: AUTO - { $$ = global_arena->New(yylineno); } + { $$ = global_arena->RawNew(yylineno); } | binding_lhs ":" pattern - { $$ = global_arena->New(yylineno, $1, $3); } + { $$ = global_arena->RawNew(yylineno, $1, $3); } | paren_pattern { $$ = $1; } | expression tuple_pattern - { $$ = global_arena->New(yylineno, $1, $2); } + { $$ = global_arena->RawNew(yylineno, $1, $2); } ; binding_lhs: identifier { $$ = $1; } @@ -373,7 +373,7 @@ paren_pattern_contents: | paren_pattern_contents "," paren_expression_element { $$ = $1; - $$.elements.push_back({.name = $3.name, .term = global_arena->New($3.term)}); + $$.elements.push_back({.name = $3.name, .term = global_arena->RawNew($3.term)}); } | paren_pattern_contents "," paren_pattern_element { @@ -395,24 +395,24 @@ tuple_pattern: paren_pattern_base // rules out the possibility of an `expression` at this point. maybe_empty_tuple_pattern: "(" ")" - { $$ = global_arena->New(yylineno, std::vector()); } + { $$ = global_arena->RawNew(yylineno, std::vector()); } | tuple_pattern { $$ = $1; } ; clause: CASE pattern DBLARROW statement - { $$ = global_arena->New>($2, $4); } + { $$ = global_arena->RawNew>($2, $4); } | DEFAULT DBLARROW statement { - auto vp = global_arena->New( - yylineno, std::nullopt, global_arena->New(yylineno)); - $$ = global_arena->New>(vp, $3); + auto vp = global_arena->RawNew( + yylineno, std::nullopt, global_arena->RawNew(yylineno)); + $$ = global_arena->RawNew>(vp, $3); } ; clause_list: // Empty { - $$ = global_arena->NewRawNew>>(); } | clause clause_list @@ -420,35 +420,35 @@ clause_list: ; statement: expression "=" expression ";" - { $$ = global_arena->New(yylineno, $1, $3); } + { $$ = global_arena->RawNew(yylineno, $1, $3); } | VAR pattern "=" expression ";" - { $$ = global_arena->New(yylineno, $2, $4); } + { $$ = global_arena->RawNew(yylineno, $2, $4); } | expression ";" - { $$ = global_arena->New(yylineno, $1); } + { $$ = global_arena->RawNew(yylineno, $1); } | if_statement { $$ = $1; } | WHILE "(" expression ")" block - { $$ = global_arena->New(yylineno, $3, $5); } + { $$ = global_arena->RawNew(yylineno, $3, $5); } | BREAK ";" - { $$ = global_arena->New(yylineno); } + { $$ = global_arena->RawNew(yylineno); } | CONTINUE ";" - { $$ = global_arena->New(yylineno); } + { $$ = global_arena->RawNew(yylineno); } | RETURN return_expression ";" - { $$ = global_arena->New(yylineno, $2.first, $2.second); } + { $$ = global_arena->RawNew(yylineno, $2.first, $2.second); } | block { $$ = $1; } | MATCH "(" expression ")" "{" clause_list "}" - { $$ = global_arena->New(yylineno, $3, $6); } + { $$ = global_arena->RawNew(yylineno, $3, $6); } | CONTINUATION identifier statement - { $$ = global_arena->New(yylineno, $2, $3); } + { $$ = global_arena->RawNew(yylineno, $2, $3); } | RUN expression ";" - { $$ = global_arena->New(yylineno, $2); } + { $$ = global_arena->RawNew(yylineno, $2); } | AWAIT ";" - { $$ = global_arena->New(yylineno); } + { $$ = global_arena->RawNew(yylineno); } ; if_statement: IF "(" expression ")" block optional_else - { $$ = global_arena->New(yylineno, $3, $5, $6); } + { $$ = global_arena->RawNew(yylineno, $3, $5, $6); } ; optional_else: // Empty @@ -460,7 +460,7 @@ optional_else: ; return_expression: // Empty - { $$ = {global_arena->New(yylineno), true}; } + { $$ = {global_arena->RawNew(yylineno), true}; } | expression { $$ = {$1, false}; } ; @@ -468,15 +468,15 @@ statement_list: // Empty { $$ = 0; } | statement statement_list - { $$ = global_arena->New(yylineno, $1, $2); } + { $$ = global_arena->RawNew(yylineno, $1, $2); } ; block: "{" statement_list "}" - { $$ = global_arena->New(yylineno, $2); } + { $$ = global_arena->RawNew(yylineno, $2); } ; return_type: // Empty - { $$ = {global_arena->New(yylineno), true}; } + { $$ = {global_arena->RawNew(yylineno), true}; } | ARROW expression %prec FNARROW { $$ = {$2, false}; } ; @@ -509,34 +509,34 @@ deduced_params: function_definition: FN identifier deduced_params maybe_empty_tuple_pattern return_type block { - $$ = global_arena->New( + $$ = global_arena->RawNew( yylineno, $2, $3, $4, - global_arena->New($5.first), + global_arena->RawNew($5.first), $5.second, $6); } | FN identifier deduced_params maybe_empty_tuple_pattern DBLARROW expression ";" { // The return type is not considered "omitted" because it's automatic from // the expression. - $$ = global_arena->New( + $$ = global_arena->RawNew( yylineno, $2, $3, $4, - global_arena->New(yylineno), true, - global_arena->New(yylineno, $6, true)); + global_arena->RawNew(yylineno), true, + global_arena->RawNew(yylineno, $6, true)); } ; function_declaration: FN identifier deduced_params maybe_empty_tuple_pattern return_type ";" { - $$ = global_arena->New( + $$ = global_arena->RawNew( yylineno, $2, $3, $4, - global_arena->New($5.first), + global_arena->RawNew($5.first), $5.second, nullptr); } ; variable_declaration: identifier ":" pattern - { $$ = global_arena->New(yylineno, $1, $3); } + { $$ = global_arena->RawNew(yylineno, $1, $3); } ; member: VAR variable_declaration ";" - { $$ = global_arena->New(yylineno, $2); } + { $$ = global_arena->RawNew(yylineno, $2); } ; member_list: // Empty @@ -550,7 +550,7 @@ alternative: | identifier { $$ = std::pair( - $1, global_arena->New(yylineno)); + $1, global_arena->RawNew(yylineno)); } ; alternative_list: @@ -566,20 +566,20 @@ alternative_list: ; declaration: function_definition - { $$ = global_arena->New($1); } + { $$ = global_arena->RawNew($1); } | function_declaration - { $$ = global_arena->New($1); } + { $$ = global_arena->RawNew($1); } | STRUCT identifier "{" member_list "}" { - $$ = global_arena->New(yylineno, $2, $4); + $$ = global_arena->RawNew(yylineno, $2, $4); } | CHOICE identifier "{" alternative_list "}" { - $$ = global_arena->New(yylineno, $2, $4); + $$ = global_arena->RawNew(yylineno, $2, $4); } | VAR variable_declaration "=" expression ";" { - $$ = global_arena->New(yylineno, $2, $4); + $$ = global_arena->RawNew(yylineno, $2, $4); } ; declaration_list: diff --git a/executable_semantics/syntax/syntax_helpers.cpp b/executable_semantics/syntax/syntax_helpers.cpp index 47ccfce1d51f..260f41b4b202 100644 --- a/executable_semantics/syntax/syntax_helpers.cpp +++ b/executable_semantics/syntax/syntax_helpers.cpp @@ -17,21 +17,21 @@ namespace Carbon { // standardized, but is made available for printing state in tests. static void AddIntrinsics(std::list* fs) { std::vector print_fields = {TuplePattern::Field( - "0", global_arena->New( + "0", global_arena->RawNew( -1, "format_str", - global_arena->New( - global_arena->New(-1))))}; - auto* print_return = - global_arena->New(-1, - global_arena->New( - IntrinsicExpression::IntrinsicKind::Print), - false); - auto* print = global_arena->New( - global_arena->New( + global_arena->RawNew( + global_arena->RawNew(-1))))}; + auto* print_return = global_arena->RawNew( + -1, + global_arena->RawNew( + IntrinsicExpression::IntrinsicKind::Print), + false); + auto* print = global_arena->RawNew( + global_arena->RawNew( -1, "Print", std::vector(), - global_arena->New(-1, print_fields), - global_arena->New( - global_arena->New(-1)), + global_arena->RawNew(-1, print_fields), + global_arena->RawNew( + global_arena->RawNew(-1)), /*is_omitted_return_type=*/false, print_return)); fs->insert(fs->begin(), print); } @@ -45,7 +45,7 @@ void ExecProgram(std::list fs) { } llvm::outs() << "********** type checking **********\n"; } - state = global_arena->New(); // Compile-time state. + state = global_arena->RawNew(); // Compile-time state. TypeCheckContext p = TopLevel(fs); TypeEnv top = p.types; Env ct_top = p.values;