| /* Copyright (C) 2021 Free Software Foundation, Inc. | |
| Contributed by Oracle. | |
| This file is part of GNU Binutils. | |
| This program is free software; you can redistribute it and/or modify | |
| it under the terms of the GNU General Public License as published by | |
| the Free Software Foundation; either version 3, or (at your option) | |
| any later version. | |
| This program is distributed in the hope that it will be useful, | |
| but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
| GNU General Public License for more details. | |
| You should have received a copy of the GNU General Public License | |
| along with this program; if not, write to the Free Software | |
| Foundation, 51 Franklin Street - Fifth Floor, Boston, | |
| MA 02110-1301, USA. */ | |
| #ifndef _EXPRESSION_H | |
| #define _EXPRESSION_H | |
| #include <inttypes.h> | |
| class Experiment; | |
| class DataView; | |
| class DbeView; | |
| class Histable; | |
| class Expression | |
| { | |
| public: | |
| class Context | |
| { | |
| public: | |
| Context (DbeView *_dbev, Experiment *_exp = 0); | |
| Context (DbeView *_dbev, Experiment *_exp, DataView *_dview, long _eventId); | |
| ~Context () { }; | |
| void | |
| put (DataView *d, long id) | |
| { | |
| dview = d; | |
| eventId = id; | |
| }; | |
| void | |
| put (Experiment *_exp) | |
| { | |
| exp = _exp; | |
| }; | |
| Experiment *exp; | |
| DataView *dview; | |
| DbeView *dbev; | |
| long eventId; | |
| }; | |
| enum OpCode | |
| { | |
| OP_NONE, | |
| OP_QWE, | |
| OP_COLON, | |
| OP_OR, | |
| OP_AND, | |
| OP_NOT, | |
| OP_EQV, | |
| OP_NEQV, | |
| OP_BITOR, | |
| OP_BITAND, | |
| OP_BITXOR, | |
| OP_BITNOT, | |
| OP_EQ, | |
| OP_NE, | |
| OP_LT, | |
| OP_GT, | |
| OP_LE, | |
| OP_GE, | |
| OP_LS, | |
| OP_RS, | |
| OP_ADD, | |
| OP_MINUS, | |
| OP_MUL, | |
| OP_DIV, | |
| OP_REM, | |
| OP_DEG, | |
| OP_COMMA, | |
| OP_IN, | |
| OP_SOMEIN, | |
| OP_ORDRIN, | |
| OP_NUM, | |
| OP_NAME, | |
| OP_FUNC, | |
| OP_FILE, | |
| OP_JAVA, | |
| OP_HASPROP, | |
| OP_LIBRARY_IN, | |
| OP_LIBRARY_SOMEIN, | |
| OP_LIBRARY_ORDRIN | |
| }; | |
| enum FuncCode | |
| { | |
| FUNC_FNAME, | |
| FUNC_DNAME | |
| }; | |
| enum JavaCode | |
| { | |
| JAVA_JGROUP, | |
| JAVA_JPARENT | |
| }; | |
| Expression (OpCode, const Expression*, const Expression* = 0); | |
| Expression (OpCode, uint64_t); | |
| Expression (const Expression &rhs); | |
| Expression (const Expression *rhs); | |
| Expression &operator= (const Expression &rhs); | |
| ~Expression (); | |
| Expression * | |
| copy () const | |
| { | |
| return new Expression (this); | |
| } | |
| void copy (const Expression *rhs); | |
| uint64_t | |
| eval (Context *ctx) | |
| { | |
| return bEval (ctx) ? v.val : 0; | |
| }; | |
| bool | |
| passes (Context *ctx) | |
| { | |
| return bEval (ctx) ? v.val != 0 : true; | |
| }; | |
| bool | |
| complete () | |
| { | |
| return op == OP_NUM; | |
| }; | |
| bool verifyObjectInExpr (Histable *obj); | |
| Expression * | |
| pEval (Context *ctx); // Partial evaluation to simplify expression | |
| private: | |
| struct Value | |
| { | |
| Value (uint64_t _val = 0, Value *_next = 0) : val (_val), next (_next) | |
| { | |
| fn = 0; | |
| } | |
| uint64_t val; | |
| uint64_t fn; | |
| Value *next; | |
| }; | |
| bool getVal (int propId, Context *ctx); | |
| bool bEval (Context *ctx); | |
| bool hasLoadObject (); | |
| OpCode op; | |
| Value v; | |
| Expression *arg0; | |
| Expression *arg1; | |
| }; | |
| #endif /* _EXPRESSION_H */ |