bug fixes

This commit is contained in:
Vern Paxson 2024-05-16 13:48:02 -07:00
parent 2befa8d3a9
commit d69738849e
4 changed files with 19 additions and 19 deletions

View file

@ -422,8 +422,6 @@ bool NameExpr::CanDel() const {
return GetType()->Tag() == TYPE_TABLE || GetType()->Tag() == TYPE_VECTOR;
}
TypePtr NameExpr::DelType() const { return GetType(); }
ValPtr NameExpr::Delete(Frame* f) {
auto v = Eval(f);
if ( v ) {
@ -2524,13 +2522,6 @@ bool IndexExpr::CanDel() const {
return op1->GetType()->Tag() == TYPE_TABLE;
}
TypePtr IndexExpr::AddType() const { return op1->GetType(); }
TypePtr IndexExpr::DelType() const {
auto y = op1->GetType()->Yield();
return y ? y : base_type(TYPE_VOID);
}
ValPtr IndexExpr::Add(Frame* f) {
if ( IsError() )
return nullptr;
@ -2791,8 +2782,6 @@ ExprPtr FieldExpr::MakeLvalue() { return with_location_of(make_intrusive<RefExpr
bool FieldExpr::CanDel() const { return td->GetAttr(ATTR_DEFAULT) || td->GetAttr(ATTR_OPTIONAL); }
TypePtr FieldExpr::DelType() const { return GetType(); }
void FieldExpr::Assign(Frame* f, ValPtr v) {
if ( IsError() )
return;
@ -2807,8 +2796,12 @@ void FieldExpr::Assign(ValPtr lhs, ValPtr rhs) {
ValPtr FieldExpr::Delete(Frame* f) {
auto op_v = op->Eval(f);
if ( ! op_v )
return nullptr;
auto former = op_v->AsRecordVal()->GetField(field);
Assign(op_v, nullptr);
return op_v;
return former;
}
ValPtr FieldExpr::Fold(Val* v) const {

View file

@ -427,7 +427,6 @@ public:
explicit NameExpr(IDPtr id, bool const_init = false);
bool CanDel() const override;
TypePtr DelType() const override;
ValPtr Delete(Frame* f) override;
ID* Id() const { return id.get(); }
@ -717,6 +716,7 @@ public:
// Optimization-related:
bool IsReduced(Reducer* c) const override { return HasReducedOps(c); }
bool HasReducedOps(Reducer* c) const override { return op->HasReducedOps(c); }
ExprPtr Reduce(Reducer* c, StmtPtr& red_stmt) override;
};
class AggrAddExpr final : public AggrAddDelExpr {
@ -1017,9 +1017,6 @@ public:
bool CanAdd() const override;
bool CanDel() const override;
TypePtr AddType() const override;
TypePtr DelType() const override;
ValPtr Add(Frame* f) override;
ValPtr Delete(Frame* f) override;
@ -1119,7 +1116,6 @@ public:
const char* FieldName() const { return field_name; }
bool CanDel() const override;
TypePtr DelType() const override;
void Assign(Frame* f, ValPtr v) override;
ValPtr Delete(Frame* f) override;

View file

@ -148,7 +148,7 @@ TraversalCode CSE_ValidityChecker::PreExpr(const Expr* e) {
auto aggr = e->GetOp1();
auto aggr_t = aggr->GetType();
if ( in_aggr_mod_expr ) {
if ( in_aggr_mod_expr > 0 ) {
auto aggr_id = aggr->AsNameExpr()->Id();
if ( CheckID(aggr_id, true) || CheckAggrMod(aggr_t) )
@ -168,7 +168,7 @@ TraversalCode CSE_ValidityChecker::PreExpr(const Expr* e) {
}
TraversalCode CSE_ValidityChecker::PostExpr(const Expr* e) {
if ( e->Tag() == EXPR_AGGR_ADD || e->Tag() == EXPR_AGGR_DEL )
if ( have_start_e && (e->Tag() == EXPR_AGGR_ADD || e->Tag() == EXPR_AGGR_DEL) )
--in_aggr_mod_expr;
return TC_CONTINUE;

View file

@ -723,6 +723,17 @@ ExprPtr AddExpr::BuildSub(const ExprPtr& op1, const ExprPtr& op2) {
return with_location_of(make_intrusive<SubExpr>(op1, rhs), this);
}
ExprPtr AggrAddDelExpr::Reduce(Reducer* c, StmtPtr& red_stmt) {
if ( type )
return UnaryExpr::Reduce(c, red_stmt);
if ( c->Optimizing() )
op = c->UpdateExpr(op);
red_stmt = op->ReduceToSingletons(c);
return ThisPtr();
}
ExprPtr AggrAddExpr::Duplicate() { return SetSucc(new AggrAddExpr(op->Duplicate())); }
ExprPtr AggrDelExpr::Duplicate() { return SetSucc(new AggrDelExpr(op->Duplicate())); }