@@ -269,12 +269,13 @@ class FunctionParameter: public LocalVariable {
269269
270270class Expression : public AstNode {
271271public:
272- Expression (const Type *type): type(type) {}
272+ Expression (const Type *type, bool is_constant ): type(type), is_constant(is_constant ) {}
273273
274274 virtual const VariableReference *get_reference () const { return nullptr ; }
275275 virtual void generate (Emitter &emitter) const = 0;
276276
277277 const Type *type;
278+ const bool is_constant;
278279private:
279280 Expression (const Expression &);
280281 Expression &operator =(const Expression &);
@@ -294,7 +295,7 @@ class Constant: public Name {
294295
295296class ConstantBooleanExpression : public Expression {
296297public:
297- ConstantBooleanExpression (bool value): Expression(TYPE_BOOLEAN), value(value) {}
298+ ConstantBooleanExpression (bool value): Expression(TYPE_BOOLEAN, true ), value(value) {}
298299
299300 const bool value;
300301
@@ -305,7 +306,7 @@ class ConstantBooleanExpression: public Expression {
305306
306307class ConstantNumberExpression : public Expression {
307308public:
308- ConstantNumberExpression (Number value): Expression(TYPE_NUMBER), value(value) {}
309+ ConstantNumberExpression (Number value): Expression(TYPE_NUMBER, true ), value(value) {}
309310
310311 const Number value;
311312
@@ -316,7 +317,7 @@ class ConstantNumberExpression: public Expression {
316317
317318class ConstantStringExpression : public Expression {
318319public:
319- ConstantStringExpression (const std::string &value): Expression(TYPE_STRING), value(value) {}
320+ ConstantStringExpression (const std::string &value): Expression(TYPE_STRING, true ), value(value) {}
320321
321322 const std::string value;
322323
@@ -327,7 +328,7 @@ class ConstantStringExpression: public Expression {
327328
328329class ConstantEnumExpression : public Expression {
329330public:
330- ConstantEnumExpression (const TypeEnum *type, int value): Expression(type), value(value) {}
331+ ConstantEnumExpression (const TypeEnum *type, int value): Expression(type, true ), value(value) {}
331332
332333 const int value;
333334
@@ -338,7 +339,7 @@ class ConstantEnumExpression: public Expression {
338339
339340class UnaryMinusExpression : public Expression {
340341public:
341- UnaryMinusExpression (const Expression *value): Expression(value->type), value(value) {
342+ UnaryMinusExpression (const Expression *value): Expression(value->type, value->is_constant ), value(value) {
342343 assert (type == TYPE_NUMBER);
343344 }
344345
@@ -356,7 +357,7 @@ class UnaryMinusExpression: public Expression {
356357
357358class LogicalNotExpression : public Expression {
358359public:
359- LogicalNotExpression (const Expression *value): Expression(value->type), value(value) {
360+ LogicalNotExpression (const Expression *value): Expression(value->type, value->is_constant ), value(value) {
360361 assert (type == TYPE_BOOLEAN);
361362 }
362363
@@ -374,7 +375,7 @@ class LogicalNotExpression: public Expression {
374375
375376class ConditionalExpression : public Expression {
376377public:
377- ConditionalExpression (const Expression *condition, const Expression *left, const Expression *right): Expression(left->type), condition(condition), left(left), right(right) {
378+ ConditionalExpression (const Expression *condition, const Expression *left, const Expression *right): Expression(left->type, left->is_constant && right->is_constant ), condition(condition), left(left), right(right) {
378379 assert (left->type == right->type );
379380 }
380381
@@ -394,7 +395,7 @@ class ConditionalExpression: public Expression {
394395
395396class DisjunctionExpression : public Expression {
396397public:
397- DisjunctionExpression (const Expression *left, const Expression *right): Expression(left->type), left(left), right(right) {
398+ DisjunctionExpression (const Expression *left, const Expression *right): Expression(left->type, left->is_constant && right->is_constant ), left(left), right(right) {
398399 assert (left->type == TYPE_BOOLEAN);
399400 assert (right->type == TYPE_BOOLEAN);
400401 }
@@ -414,7 +415,7 @@ class DisjunctionExpression: public Expression {
414415
415416class ConjunctionExpression : public Expression {
416417public:
417- ConjunctionExpression (const Expression *left, const Expression *right): Expression(left->type), left(left), right(right) {
418+ ConjunctionExpression (const Expression *left, const Expression *right): Expression(left->type, left->is_constant && right->is_constant ), left(left), right(right) {
418419 assert (left->type == TYPE_BOOLEAN);
419420 assert (right->type == TYPE_BOOLEAN);
420421 }
@@ -437,7 +438,7 @@ class ComparisonExpression: public Expression {
437438 enum Comparison {
438439 EQ, NE, LT, GT, LE, GE
439440 };
440- ComparisonExpression (const Expression *left, const Expression *right, Comparison comp): Expression(TYPE_BOOLEAN), left(left), right(right), comp(comp) {}
441+ ComparisonExpression (const Expression *left, const Expression *right, Comparison comp): Expression(TYPE_BOOLEAN, left->is_constant && right->is_constant ), left(left), right(right), comp(comp) {}
441442
442443 const Expression *const left;
443444 const Expression *const right;
@@ -504,7 +505,7 @@ class DictionaryComparisonExpression: public ComparisonExpression {
504505
505506class AdditionExpression : public Expression {
506507public:
507- AdditionExpression (const Expression *left, const Expression *right): Expression(left->type), left(left), right(right) {
508+ AdditionExpression (const Expression *left, const Expression *right): Expression(left->type, left->is_constant && right->is_constant ), left(left), right(right) {
508509 assert (left->type == TYPE_NUMBER);
509510 assert (right->type == TYPE_NUMBER);
510511 }
@@ -524,7 +525,7 @@ class AdditionExpression: public Expression {
524525
525526class SubtractionExpression : public Expression {
526527public:
527- SubtractionExpression (const Expression *left, const Expression *right): Expression(left->type), left(left), right(right) {
528+ SubtractionExpression (const Expression *left, const Expression *right): Expression(left->type, left->is_constant && right->is_constant ), left(left), right(right) {
528529 assert (left->type == TYPE_NUMBER);
529530 assert (right->type == TYPE_NUMBER);
530531 }
@@ -544,7 +545,7 @@ class SubtractionExpression: public Expression {
544545
545546class MultiplicationExpression : public Expression {
546547public:
547- MultiplicationExpression (const Expression *left, const Expression *right): Expression(left->type), left(left), right(right) {
548+ MultiplicationExpression (const Expression *left, const Expression *right): Expression(left->type, left->is_constant && right->is_constant ), left(left), right(right) {
548549 assert (left->type == TYPE_NUMBER);
549550 assert (right->type == TYPE_NUMBER);
550551 }
@@ -564,7 +565,7 @@ class MultiplicationExpression: public Expression {
564565
565566class DivisionExpression : public Expression {
566567public:
567- DivisionExpression (const Expression *left, const Expression *right): Expression(left->type), left(left), right(right) {
568+ DivisionExpression (const Expression *left, const Expression *right): Expression(left->type, left->is_constant && right->is_constant ), left(left), right(right) {
568569 assert (left->type == TYPE_NUMBER);
569570 assert (right->type == TYPE_NUMBER);
570571 }
@@ -584,7 +585,7 @@ class DivisionExpression: public Expression {
584585
585586class ModuloExpression : public Expression {
586587public:
587- ModuloExpression (const Expression *left, const Expression *right): Expression(left->type), left(left), right(right) {
588+ ModuloExpression (const Expression *left, const Expression *right): Expression(left->type, left->is_constant && right->is_constant ), left(left), right(right) {
588589 assert (left->type == TYPE_NUMBER);
589590 assert (right->type == TYPE_NUMBER);
590591 }
@@ -604,7 +605,7 @@ class ModuloExpression: public Expression {
604605
605606class ExponentiationExpression : public Expression {
606607public:
607- ExponentiationExpression (const Expression *left, const Expression *right): Expression(left->type), left(left), right(right) {
608+ ExponentiationExpression (const Expression *left, const Expression *right): Expression(left->type, left->is_constant && right->is_constant ), left(left), right(right) {
608609 assert (left->type == TYPE_NUMBER);
609610 assert (right->type == TYPE_NUMBER);
610611 }
@@ -624,9 +625,10 @@ class ExponentiationExpression: public Expression {
624625
625626class VariableReference : public AstNode {
626627public:
627- VariableReference (const Type *type): type(type) {}
628+ VariableReference (const Type *type, bool is_constant ): type(type), is_constant(is_constant ) {}
628629
629630 const Type *type;
631+ const bool is_constant;
630632
631633 virtual void generate_address (Emitter &emitter) const = 0;
632634 virtual void generate_load (Emitter &emitter) const ;
@@ -641,7 +643,7 @@ class VariableReference: public AstNode {
641643
642644class ConstantReference : public VariableReference {
643645public:
644- ConstantReference (const Constant *cons): VariableReference(cons->type), cons(cons) {}
646+ ConstantReference (const Constant *cons): VariableReference(cons->type, true ), cons(cons) {}
645647
646648 const Constant *cons;
647649
@@ -658,7 +660,7 @@ class ConstantReference: public VariableReference {
658660
659661class ScalarVariableReference : public VariableReference {
660662public:
661- ScalarVariableReference (const Variable *var): VariableReference(var->type), var(var) {}
663+ ScalarVariableReference (const Variable *var): VariableReference(var->type, false ), var(var) {}
662664
663665 const Variable *var;
664666
@@ -695,7 +697,7 @@ class StringReference: public VariableReference {
695697
696698class ArrayReference : public VariableReference {
697699public:
698- ArrayReference (const Type *type, const VariableReference *array, const Expression *index): VariableReference(type), array(array), index(index) {}
700+ ArrayReference (const Type *type, const VariableReference *array, const Expression *index): VariableReference(type, array->is_constant ), array(array), index(index) {}
699701
700702 const VariableReference *array;
701703 const Expression *index;
@@ -710,7 +712,7 @@ class ArrayReference: public VariableReference {
710712
711713class DictionaryReference : public VariableReference {
712714public:
713- DictionaryReference (const Type *type, const VariableReference *dict, const Expression *index): VariableReference(type), dict(dict), index(index) {}
715+ DictionaryReference (const Type *type, const VariableReference *dict, const Expression *index): VariableReference(type, dict->is_constant ), dict(dict), index(index) {}
714716
715717 const VariableReference *dict;
716718 const Expression *index;
@@ -725,7 +727,7 @@ class DictionaryReference: public VariableReference {
725727
726728class VariableExpression : public Expression {
727729public:
728- VariableExpression (const VariableReference *var): Expression(var->type), var(var) {}
730+ VariableExpression (const VariableReference *var): Expression(var->type, var->is_constant ), var(var) {}
729731
730732 const VariableReference *var;
731733
@@ -742,7 +744,7 @@ class VariableExpression: public Expression {
742744
743745class FunctionCall : public Expression {
744746public:
745- FunctionCall (const VariableReference *func, const std::vector<const Expression *> &args): Expression(dynamic_cast <const TypeFunction *>(func->type)->returntype), func(func), args(args) {}
747+ FunctionCall (const VariableReference *func, const std::vector<const Expression *> &args): Expression(dynamic_cast <const TypeFunction *>(func->type)->returntype, false ), func(func), args(args) {}
746748
747749 const VariableReference *const func;
748750 const std::vector<const Expression *> args;
0 commit comments