Analysis: infer when a refcount is required and add colors in DebugVisitor
[scilab.git] / scilab / modules / ast / includes / analysis / data / Info.hxx
index f986394..0844034 100644 (file)
 
 namespace ast
 {
-    class Exp;
+class Exp;
 }
 
 namespace analysis
 {
 
-    struct Info
+struct Info
+{
+    enum Local
     {
-        enum Local
-        {
-            INFO_TRUE, INFO_FALSE, INFO_UNKNOWN
-        };
+        INFO_TRUE, INFO_FALSE, INFO_UNKNOWN
+    };
 
-        bool R;
-        bool W;
-        bool O;
-        bool isint;
-        Local local;
-        bool cleared;
-        bool exists;
-        TIType type;
-        Data * data;
-        ast::Exp * exp;
-        ConstantValue constant;
-        SymbolicRange range;
-        SymbolicDimension maxIndex;
+    bool R;
+    bool W;
+    bool O;
+    bool isint;
+    Local local;
+    bool cleared;
+    bool exists;
+    TIType type;
+    Data * data;
+    ast::Exp * exp;
+    ConstantValue constant;
+    SymbolicRange range;
+    SymbolicDimension maxIndex;
 
-        Info(Data * _data = nullptr) : R(false), W(false), O(false), isint(false), local(Local::INFO_TRUE), cleared(false), exists(true), data(_data), exp(nullptr) { }
-        Info(const Info & i) : R(i.R), W(i.W), O(i.O), isint(i.isint), local(i.local), cleared(i.cleared), exists(i.exists), constant(i.constant), range(i.range), maxIndex(i.maxIndex), type(i.type), data(i.data ? new Data(*i.data) : nullptr), exp(i.exp) { }
+    Info(Data * _data = nullptr) : R(false), W(false), O(false), isint(false), local(Local::INFO_TRUE), cleared(false), exists(true), data(_data), exp(nullptr) { }
+    Info(const Info & i) : R(i.R), W(i.W), O(i.O), isint(i.isint), local(i.local), cleared(i.cleared), exists(i.exists), constant(i.constant), range(i.range), maxIndex(i.maxIndex), type(i.type), data(i.data ? new Data(*i.data) : nullptr), exp(i.exp) { }
 
-        void merge(Info & info);
-        void addData(const bool known, const symbol::Symbol & sym);
-        void addData(Data * _data, const symbol::Symbol & sym);
-        SymbolicRange & getRange();
-        const SymbolicRange & getRange() const;
-        SymbolicDimension & getMaxIndex();
-        const SymbolicDimension & getMaxIndex() const;
-        SymbolicRange & setRange(SymbolicRange & _range);
-        ConstantValue & getConstant();
-        const ConstantValue & getConstant() const;
-        ConstantValue & setConstant(ConstantValue & val);
-        bool isknown() const;
-        static const symbol::Symbol & getRightSym(ast::Exp * exp);
-        const TIType & getType() const;
-        friend std::wostream & operator<<(std::wostream & out, const Info & info);
-    };
+    void merge(const Info & info, bool & isSameData);
+    void addData(const bool known, const symbol::Symbol & sym);
+    void addData(Data * _data, const symbol::Symbol & sym);
+    SymbolicRange & getRange();
+    const SymbolicRange & getRange() const;
+    SymbolicDimension & getMaxIndex();
+    const SymbolicDimension & getMaxIndex() const;
+    SymbolicRange & setRange(SymbolicRange & _range);
+    ConstantValue & getConstant();
+    const ConstantValue & getConstant() const;
+    ConstantValue & setConstant(ConstantValue & val);
+    bool isknown() const;
+    static const symbol::Symbol & getRightSym(ast::Exp * exp);
+    const TIType & getType() const;
+    friend std::wostream & operator<<(std::wostream & out, const Info & info);
+};
 
 } // namespace analysis