mirror of
https://github.com/carbon-language/carbon-lang.git
synced 2026-10-01 22:02:45 +01:00
* Make tuple/struct fields mutable. * Avoid ExpectType when we know it will fail.
This commit is contained in:
@@ -201,11 +201,11 @@ auto Interpreter::CreateTuple(Nonnull<Action*> act,
|
||||
// { { (v1,...,vn) :: C, E, F} :: S, H}
|
||||
// -> { { `(v1,...,vn) :: C, E, F} :: S, H}
|
||||
const auto& tup_lit = cast<TupleLiteral>(*exp);
|
||||
CHECK(act->results().size() == tup_lit.Fields().size());
|
||||
CHECK(act->results().size() == tup_lit.fields().size());
|
||||
std::vector<TupleElement> elements;
|
||||
for (size_t i = 0; i < act->results().size(); ++i) {
|
||||
elements.push_back(
|
||||
{.name = tup_lit.Fields()[i].name, .value = act->results()[i]});
|
||||
{.name = tup_lit.fields()[i].name(), .value = act->results()[i]});
|
||||
}
|
||||
|
||||
return arena->New<TupleValue>(std::move(elements));
|
||||
@@ -217,7 +217,7 @@ auto Interpreter::CreateStruct(const std::vector<FieldInitializer>& fields,
|
||||
CHECK(fields.size() == values.size());
|
||||
std::vector<TupleElement> elements;
|
||||
for (size_t i = 0; i < fields.size(); ++i) {
|
||||
elements.push_back({.name = fields[i].name, .value = values[i]});
|
||||
elements.push_back({.name = fields[i].name(), .value = values[i]});
|
||||
}
|
||||
|
||||
return arena->New<StructValue>(std::move(elements));
|
||||
@@ -448,13 +448,13 @@ auto Interpreter::StepLvalue() -> Transition {
|
||||
}
|
||||
case Expression::Kind::TupleLiteral: {
|
||||
if (act->pos() <
|
||||
static_cast<int>(cast<TupleLiteral>(*exp).Fields().size())) {
|
||||
static_cast<int>(cast<TupleLiteral>(*exp).fields().size())) {
|
||||
// { { vk :: (f1=v1,..., fk=[],fk+1=ek+1,...) :: C, E, F} :: S,
|
||||
// H}
|
||||
// -> { { ek+1 :: (f1=v1,..., fk=vk, fk+1=[],...) :: C, E, F} :: S,
|
||||
// H}
|
||||
Nonnull<const Expression*> elt =
|
||||
cast<TupleLiteral>(*exp).Fields()[act->pos()].expression;
|
||||
cast<TupleLiteral>(*exp).fields()[act->pos()].expression();
|
||||
return Spawn{arena->New<LValAction>(elt)};
|
||||
} else {
|
||||
return Done{CreateTuple(act, exp)};
|
||||
@@ -516,13 +516,13 @@ auto Interpreter::StepExp() -> Transition {
|
||||
}
|
||||
case Expression::Kind::TupleLiteral: {
|
||||
if (act->pos() <
|
||||
static_cast<int>(cast<TupleLiteral>(*exp).Fields().size())) {
|
||||
static_cast<int>(cast<TupleLiteral>(*exp).fields().size())) {
|
||||
// { { vk :: (f1=v1,..., fk=[],fk+1=ek+1,...) :: C, E, F} :: S,
|
||||
// H}
|
||||
// -> { { ek+1 :: (f1=v1,..., fk=vk, fk+1=[],...) :: C, E, F} :: S,
|
||||
// H}
|
||||
Nonnull<const Expression*> elt =
|
||||
cast<TupleLiteral>(*exp).Fields()[act->pos()].expression;
|
||||
cast<TupleLiteral>(*exp).fields()[act->pos()].expression();
|
||||
return Spawn{arena->New<ExpressionAction>(elt)};
|
||||
} else {
|
||||
return Done{CreateTuple(act, exp)};
|
||||
@@ -532,7 +532,7 @@ auto Interpreter::StepExp() -> Transition {
|
||||
const auto& literal = cast<StructLiteral>(*exp);
|
||||
if (act->pos() < static_cast<int>(literal.fields().size())) {
|
||||
Nonnull<const Expression*> elt =
|
||||
literal.fields()[act->pos()].expression;
|
||||
literal.fields()[act->pos()].expression();
|
||||
return Spawn{arena->New<ExpressionAction>(elt)};
|
||||
} else {
|
||||
return Done{CreateStruct(literal.fields(), act->results())};
|
||||
@@ -542,11 +542,11 @@ auto Interpreter::StepExp() -> Transition {
|
||||
const auto& struct_type = cast<StructTypeLiteral>(*exp);
|
||||
if (act->pos() < static_cast<int>(struct_type.fields().size())) {
|
||||
return Spawn{arena->New<ExpressionAction>(
|
||||
struct_type.fields()[act->pos()].expression)};
|
||||
struct_type.fields()[act->pos()].expression())};
|
||||
} else {
|
||||
VarValues fields;
|
||||
for (size_t i = 0; i < struct_type.fields().size(); ++i) {
|
||||
fields.push_back({struct_type.fields()[i].name, act->results()[i]});
|
||||
fields.push_back({struct_type.fields()[i].name(), act->results()[i]});
|
||||
}
|
||||
return Done{arena->New<StructType>(std::move(fields))};
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user