Move all new's to global_arena, and remove ASAN disabling (#690)

Note this changes identifiers from char* to string to avoid malloc.

Fixes #580
This commit is contained in:
Jon Meow
2021-08-02 11:08:22 -07:00
committed by GitHub
parent f1028fcc27
commit 9829f188b7
18 changed files with 130 additions and 120 deletions
+2 -8
View File
@@ -42,10 +42,6 @@ cc_library(
cc_test(
name = "expression_test",
srcs = ["expression_test.cpp"],
env = {
# TODO(#580): Remove this when leaks are fixed.
"ASAN_OPTIONS": "detect_leaks=0",
},
deps = [
":expression",
"//executable_semantics/syntax:paren_contents",
@@ -82,6 +78,7 @@ cc_library(
deps = [
":expression",
"//common:ostream",
"//executable_semantics/common:arena",
"//executable_semantics/common:error",
"@llvm-project//llvm:Support",
],
@@ -90,10 +87,6 @@ cc_library(
cc_test(
name = "pattern_test",
srcs = ["pattern_test.cpp"],
env = {
# TODO(#580): Remove this when leaks are fixed.
"ASAN_OPTIONS": "detect_leaks=0",
},
deps = [
":pattern",
"//executable_semantics/syntax:paren_contents",
@@ -112,6 +105,7 @@ cc_library(
":pattern",
"//common:check",
"//common:ostream",
"//executable_semantics/common:arena",
"@llvm-project//llvm:Support",
],
)
+3 -1
View File
@@ -4,11 +4,13 @@
#include "executable_semantics/ast/member.h"
#include "executable_semantics/common/arena.h"
namespace Carbon {
auto Member::MakeFieldMember(int line_num, const BindingPattern* binding)
-> Member* {
auto m = new Member();
auto m = global_arena->New<Member>();
m->line_num = line_num;
m->value = FieldMember({.binding = binding});
return m;
+6 -3
View File
@@ -8,6 +8,7 @@
#include "common/ostream.h"
#include "executable_semantics/ast/expression.h"
#include "executable_semantics/common/arena.h"
#include "executable_semantics/common/error.h"
#include "llvm/ADT/StringExtras.h"
#include "llvm/Support/Casting.h"
@@ -57,7 +58,8 @@ TuplePattern::TuplePattern(const Expression* tuple_literal)
: Pattern(Kind::TuplePattern, tuple_literal->line_num) {
const auto& tuple = tuple_literal->GetTupleLiteral();
for (const FieldInitializer& init : tuple.fields) {
fields.push_back(Field(init.name, new ExpressionPattern(init.expression)));
fields.push_back(Field(
init.name, global_arena->New<ExpressionPattern>(init.expression)));
}
}
@@ -75,7 +77,7 @@ auto PatternFromParenContents(int line_num,
auto TuplePatternFromParenContents(int line_num,
const ParenContents<Pattern>& paren_contents)
-> const TuplePattern* {
return new TuplePattern(
return global_arena->New<TuplePattern>(
line_num, paren_contents.TupleElements<TuplePattern::Field>(line_num));
}
@@ -98,7 +100,8 @@ auto ParenExpressionToParenPattern(const ParenContents<Expression>& contents)
.elements = {}, .has_trailing_comma = contents.has_trailing_comma};
for (const auto& element : contents.elements) {
result.elements.push_back(
{.name = element.name, .term = new ExpressionPattern(element.term)});
{.name = element.name,
.term = global_arena->New<ExpressionPattern>(element.term)});
}
return result;
}
+9 -8
View File
@@ -5,6 +5,7 @@
#include "executable_semantics/ast/pattern.h"
#include "executable_semantics/ast/expression.h"
#include "executable_semantics/common/arena.h"
#include "executable_semantics/syntax/paren_contents.h"
#include "gmock/gmock.h"
#include "gtest/gtest.h"
@@ -51,7 +52,7 @@ TEST(PatternTest, UnaryNoCommaAsPattern) {
// ```
ParenContents<Pattern> contents = {
.elements = {{.name = std::nullopt,
.term = new AutoPattern(/*line_num=*/2)}},
.term = global_arena->New<AutoPattern>(/*line_num=*/2)}},
.has_trailing_comma = false};
const Pattern* pattern = PatternFromParenContents(/*line_num=*/1, contents);
@@ -62,7 +63,7 @@ TEST(PatternTest, UnaryNoCommaAsPattern) {
TEST(PatternTest, UnaryNoCommaAsTuplePattern) {
ParenContents<Pattern> contents = {
.elements = {{.name = std::nullopt,
.term = new AutoPattern(/*line_num=*/2)}},
.term = global_arena->New<AutoPattern>(/*line_num=*/2)}},
.has_trailing_comma = false};
const TuplePattern* tuple =
@@ -74,7 +75,7 @@ TEST(PatternTest, UnaryNoCommaAsTuplePattern) {
TEST(PatternTest, UnaryWithCommaAsPattern) {
ParenContents<Pattern> contents = {
.elements = {{.name = std::nullopt,
.term = new AutoPattern(/*line_num=*/2)}},
.term = global_arena->New<AutoPattern>(/*line_num=*/2)}},
.has_trailing_comma = true};
const Pattern* pattern = PatternFromParenContents(/*line_num=*/1, contents);
@@ -87,7 +88,7 @@ TEST(PatternTest, UnaryWithCommaAsPattern) {
TEST(PatternTest, UnaryWithCommaAsTuplePattern) {
ParenContents<Pattern> contents = {
.elements = {{.name = std::nullopt,
.term = new AutoPattern(/*line_num=*/2)}},
.term = global_arena->New<AutoPattern>(/*line_num=*/2)}},
.has_trailing_comma = true};
const TuplePattern* tuple =
@@ -99,9 +100,9 @@ TEST(PatternTest, UnaryWithCommaAsTuplePattern) {
TEST(PatternTest, BinaryAsPattern) {
ParenContents<Pattern> contents = {
.elements = {{.name = std::nullopt,
.term = new AutoPattern(/*line_num=*/2)},
.term = global_arena->New<AutoPattern>(/*line_num=*/2)},
{.name = std::nullopt,
.term = new AutoPattern(/*line_num=*/3)}},
.term = global_arena->New<AutoPattern>(/*line_num=*/3)}},
.has_trailing_comma = true};
const Pattern* pattern = PatternFromParenContents(/*line_num=*/1, contents);
@@ -114,9 +115,9 @@ TEST(PatternTest, BinaryAsPattern) {
TEST(PatternTest, BinaryAsTuplePattern) {
ParenContents<Pattern> contents = {
.elements = {{.name = std::nullopt,
.term = new AutoPattern(/*line_num=*/2)},
.term = global_arena->New<AutoPattern>(/*line_num=*/2)},
{.name = std::nullopt,
.term = new AutoPattern(/*line_num=*/3)}},
.term = global_arena->New<AutoPattern>(/*line_num=*/3)}},
.has_trailing_comma = true};
const TuplePattern* tuple =
+15 -14
View File
@@ -5,6 +5,7 @@
#include "executable_semantics/ast/statement.h"
#include "common/check.h"
#include "executable_semantics/common/arena.h"
namespace Carbon {
@@ -62,7 +63,7 @@ auto Statement::GetAwait() const -> const Await& {
auto Statement::MakeExpressionStatement(int line_num, const Expression* exp)
-> const Statement* {
auto* s = new Statement();
auto* s = global_arena->New<Statement>();
s->line_num = line_num;
s->value = ExpressionStatement({.exp = exp});
return s;
@@ -70,7 +71,7 @@ auto Statement::MakeExpressionStatement(int line_num, const Expression* exp)
auto Statement::MakeAssign(int line_num, const Expression* lhs,
const Expression* rhs) -> const Statement* {
auto* s = new Statement();
auto* s = global_arena->New<Statement>();
s->line_num = line_num;
s->value = Assign({.lhs = lhs, .rhs = rhs});
return s;
@@ -79,7 +80,7 @@ auto Statement::MakeAssign(int line_num, const Expression* lhs,
auto Statement::MakeVariableDefinition(int line_num, const Pattern* pat,
const Expression* init)
-> const Statement* {
auto* s = new Statement();
auto* s = global_arena->New<Statement>();
s->line_num = line_num;
s->value = VariableDefinition({.pat = pat, .init = init});
return s;
@@ -88,7 +89,7 @@ auto Statement::MakeVariableDefinition(int line_num, const Pattern* pat,
auto Statement::MakeIf(int line_num, const Expression* cond,
const Statement* then_stmt, const Statement* else_stmt)
-> const Statement* {
auto* s = new Statement();
auto* s = global_arena->New<Statement>();
s->line_num = line_num;
s->value = If({.cond = cond, .then_stmt = then_stmt, .else_stmt = else_stmt});
return s;
@@ -96,21 +97,21 @@ auto Statement::MakeIf(int line_num, const Expression* cond,
auto Statement::MakeWhile(int line_num, const Expression* cond,
const Statement* body) -> const Statement* {
auto* s = new Statement();
auto* s = global_arena->New<Statement>();
s->line_num = line_num;
s->value = While({.cond = cond, .body = body});
return s;
}
auto Statement::MakeBreak(int line_num) -> const Statement* {
auto* s = new Statement();
auto* s = global_arena->New<Statement>();
s->line_num = line_num;
s->value = Break();
return s;
}
auto Statement::MakeContinue(int line_num) -> const Statement* {
auto* s = new Statement();
auto* s = global_arena->New<Statement>();
s->line_num = line_num;
s->value = Continue();
return s;
@@ -118,7 +119,7 @@ auto Statement::MakeContinue(int line_num) -> const Statement* {
auto Statement::MakeReturn(int line_num, const Expression* e)
-> const Statement* {
auto* s = new Statement();
auto* s = global_arena->New<Statement>();
s->line_num = line_num;
s->value = Return({.exp = e});
return s;
@@ -126,7 +127,7 @@ auto Statement::MakeReturn(int line_num, const Expression* e)
auto Statement::MakeSequence(int line_num, const Statement* s1,
const Statement* s2) -> const Statement* {
auto* s = new Statement();
auto* s = global_arena->New<Statement>();
s->line_num = line_num;
s->value = Sequence({.stmt = s1, .next = s2});
return s;
@@ -134,7 +135,7 @@ auto Statement::MakeSequence(int line_num, const Statement* s1,
auto Statement::MakeBlock(int line_num, const Statement* stmt)
-> const Statement* {
auto* s = new Statement();
auto* s = global_arena->New<Statement>();
s->line_num = line_num;
s->value = Block({.stmt = stmt});
return s;
@@ -144,7 +145,7 @@ auto Statement::MakeMatch(
int line_num, const Expression* exp,
std::list<std::pair<const Pattern*, const Statement*>>* clauses)
-> const Statement* {
auto* s = new Statement();
auto* s = global_arena->New<Statement>();
s->line_num = line_num;
s->value = Match({.exp = exp, .clauses = clauses});
return s;
@@ -155,7 +156,7 @@ auto Statement::MakeMatch(
auto Statement::MakeContinuation(int line_num,
std::string continuation_variable,
const Statement* body) -> const Statement* {
auto* s = new Statement();
auto* s = global_arena->New<Statement>();
s->line_num = line_num;
s->value =
Continuation({.continuation_variable = std::move(continuation_variable),
@@ -166,7 +167,7 @@ auto Statement::MakeContinuation(int line_num,
// Returns an AST node for a run statement give its line number and argument.
auto Statement::MakeRun(int line_num, const Expression* argument)
-> const Statement* {
auto* s = new Statement();
auto* s = global_arena->New<Statement>();
s->line_num = line_num;
s->value = Run({.argument = argument});
return s;
@@ -174,7 +175,7 @@ auto Statement::MakeRun(int line_num, const Expression* argument)
// Returns an AST node for an await statement give its line number.
auto Statement::MakeAwait(int line_num) -> const Statement* {
auto* s = new Statement();
auto* s = global_arena->New<Statement>();
s->line_num = line_num;
s->value = Await();
return s;