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; return GetType()->Tag() == TYPE_TABLE || GetType()->Tag() == TYPE_VECTOR;
} }
TypePtr NameExpr::DelType() const { return GetType(); }
ValPtr NameExpr::Delete(Frame* f) { ValPtr NameExpr::Delete(Frame* f) {
auto v = Eval(f); auto v = Eval(f);
if ( v ) { if ( v ) {
@ -2524,13 +2522,6 @@ bool IndexExpr::CanDel() const {
return op1->GetType()->Tag() == TYPE_TABLE; 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) { ValPtr IndexExpr::Add(Frame* f) {
if ( IsError() ) if ( IsError() )
return nullptr; 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); } 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) { void FieldExpr::Assign(Frame* f, ValPtr v) {
if ( IsError() ) if ( IsError() )
return; return;
@ -2807,8 +2796,12 @@ void FieldExpr::Assign(ValPtr lhs, ValPtr rhs) {
ValPtr FieldExpr::Delete(Frame* f) { ValPtr FieldExpr::Delete(Frame* f) {
auto op_v = op->Eval(f); auto op_v = op->Eval(f);
if ( ! op_v )
return nullptr;
auto former = op_v->AsRecordVal()->GetField(field);
Assign(op_v, nullptr); Assign(op_v, nullptr);
return op_v; return former;
} }
ValPtr FieldExpr::Fold(Val* v) const { ValPtr FieldExpr::Fold(Val* v) const {

View file

@ -427,7 +427,6 @@ public:
explicit NameExpr(IDPtr id, bool const_init = false); explicit NameExpr(IDPtr id, bool const_init = false);
bool CanDel() const override; bool CanDel() const override;
TypePtr DelType() const override;
ValPtr Delete(Frame* f) override; ValPtr Delete(Frame* f) override;
ID* Id() const { return id.get(); } ID* Id() const { return id.get(); }
@ -717,6 +716,7 @@ public:
// Optimization-related: // Optimization-related:
bool IsReduced(Reducer* c) const override { return HasReducedOps(c); } bool IsReduced(Reducer* c) const override { return HasReducedOps(c); }
bool HasReducedOps(Reducer* c) const override { return op->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 { class AggrAddExpr final : public AggrAddDelExpr {
@ -1017,9 +1017,6 @@ public:
bool CanAdd() const override; bool CanAdd() const override;
bool CanDel() const override; bool CanDel() const override;
TypePtr AddType() const override;
TypePtr DelType() const override;
ValPtr Add(Frame* f) override; ValPtr Add(Frame* f) override;
ValPtr Delete(Frame* f) override; ValPtr Delete(Frame* f) override;
@ -1119,7 +1116,6 @@ public:
const char* FieldName() const { return field_name; } const char* FieldName() const { return field_name; }
bool CanDel() const override; bool CanDel() const override;
TypePtr DelType() const override;
void Assign(Frame* f, ValPtr v) override; void Assign(Frame* f, ValPtr v) override;
ValPtr Delete(Frame* f) 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 = e->GetOp1();
auto aggr_t = aggr->GetType(); auto aggr_t = aggr->GetType();
if ( in_aggr_mod_expr ) { if ( in_aggr_mod_expr > 0 ) {
auto aggr_id = aggr->AsNameExpr()->Id(); auto aggr_id = aggr->AsNameExpr()->Id();
if ( CheckID(aggr_id, true) || CheckAggrMod(aggr_t) ) 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) { 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; --in_aggr_mod_expr;
return TC_CONTINUE; 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); 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 AggrAddExpr::Duplicate() { return SetSucc(new AggrAddExpr(op->Duplicate())); }
ExprPtr AggrDelExpr::Duplicate() { return SetSucc(new AggrDelExpr(op->Duplicate())); } ExprPtr AggrDelExpr::Duplicate() { return SetSucc(new AggrDelExpr(op->Duplicate())); }