Skip to content

Commit

Permalink
Revert "Remove unnecessary class BoolExp"
Browse files Browse the repository at this point in the history
This reverts commit eb1158e.
  • Loading branch information
yebblies committed Dec 23, 2013
1 parent 1f1e4b0 commit 2aaf5eb
Show file tree
Hide file tree
Showing 5 changed files with 63 additions and 2 deletions.
6 changes: 6 additions & 0 deletions src/e2ir.c
Expand Up @@ -3754,6 +3754,12 @@ elem *PtrExp::toElem(IRState *irs)
return e;
}

elem *BoolExp::toElem(IRState *irs)
{
elem *e1 = this->e1->toElem(irs);
return el_una(OPbool,type->totym(),e1);
}

elem *DeleteExp::toElem(IRState *irs)
{ elem *e;
int rtl;
Expand Down
22 changes: 22 additions & 0 deletions src/expression.c
Expand Up @@ -9615,6 +9615,28 @@ Expression *NotExp::semantic(Scope *sc)

/************************************************************/

BoolExp::BoolExp(Loc loc, Expression *e, Type *t)
: UnaExp(loc, TOKtobool, sizeof(BoolExp), e)
{
type = t;
}

Expression *BoolExp::semantic(Scope *sc)
{
if (!type)
{ // Note there is no operator overload
UnaExp::semantic(sc);
e1 = resolveProperties(sc, e1);
e1 = e1->checkToBoolean(sc);
if (e1->type == Type::terror)
return e1;
type = Type::tboolean;
}
return this;
}

/************************************************************/

DeleteExp::DeleteExp(Loc loc, Expression *e)
: UnaExp(loc, TOKdelete, sizeof(DeleteExp), e)
{
Expand Down
9 changes: 9 additions & 0 deletions src/expression.h
Expand Up @@ -1171,6 +1171,15 @@ class NotExp : public UnaExp
elem *toElem(IRState *irs);
};

class BoolExp : public UnaExp
{
public:
BoolExp(Loc loc, Expression *e, Type *type);
Expression *semantic(Scope *sc);
Expression *optimize(int result, bool keepLvalue = false);
elem *toElem(IRState *irs);
};

class DeleteExp : public UnaExp
{
public:
Expand Down
6 changes: 6 additions & 0 deletions src/gluestub.c
Expand Up @@ -889,6 +889,12 @@ elem *PtrExp::toElem(IRState *irs)
return NULL;
}

elem *BoolExp::toElem(IRState *irs)
{
assert(0);
return NULL;
}

elem *DeleteExp::toElem(IRState *irs)
{
assert(0);
Expand Down
22 changes: 20 additions & 2 deletions src/optimize.c
Expand Up @@ -291,6 +291,19 @@ Expression *NotExp::optimize(int result, bool keepLvalue)
return e;
}

Expression *BoolExp::optimize(int result, bool keepLvalue)
{ Expression *e;

e1 = e1->optimize(result);
if (e1->isConst() == 1)
{
e = Bool(type, e1);
}
else
e = this;
return e;
}

Expression *SymOffExp::optimize(int result, bool keepLvalue)
{
assert(var);
Expand Down Expand Up @@ -1110,7 +1123,9 @@ Expression *AndAndExp::optimize(int result, bool keepLvalue)
}
else if (e1->isBool(true))
{
e = e2;
if (type->toBasetype()->ty == Tvoid)
e = e2;
else e = new BoolExp(loc, e2, type);
}
}
}
Expand Down Expand Up @@ -1148,7 +1163,10 @@ Expression *OrOrExp::optimize(int result, bool keepLvalue)
}
else if (e1->isBool(false))
{
e = e2;
if (type->toBasetype()->ty == Tvoid)
e = e2;
else
e = new BoolExp(loc, e2, type);
}
}
}
Expand Down

0 comments on commit 2aaf5eb

Please sign in to comment.