forked from qt-creator/qt-creator
		
	Fixed possible crash in dangling pointers in namespaces.
Patch by: Bill King
This commit is contained in:
		@@ -81,11 +81,11 @@ public:
 | 
			
		||||
    virtual ~Binding() {}
 | 
			
		||||
 | 
			
		||||
    virtual QByteArray qualifiedId() const = 0;
 | 
			
		||||
    virtual NamespaceBinding *asNamespaceBinding() { return 0; }
 | 
			
		||||
    virtual ClassBinding *asClassBinding() { return 0; }
 | 
			
		||||
    virtual NamespaceBinding *asNamespaceBinding() const { return 0; }
 | 
			
		||||
    virtual ClassBinding *asClassBinding() const { return 0; }
 | 
			
		||||
 | 
			
		||||
    virtual ClassBinding *findClassBinding(const Name *name, QSet<Binding *> *processed) = 0;
 | 
			
		||||
    virtual Binding *findClassOrNamespaceBinding(const Identifier *id, QSet<Binding *> *processed) = 0;
 | 
			
		||||
    virtual ClassBinding *findClassBinding(const Name *name, QSet<const Binding *> *processed) const = 0;
 | 
			
		||||
    virtual Binding *findClassOrNamespaceBinding(const Identifier *id, QSet<const Binding *> *processed) const = 0;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
class CPLUSPLUS_EXPORT NamespaceBinding: public Binding
 | 
			
		||||
@@ -104,20 +104,20 @@ public:
 | 
			
		||||
    const Identifier *identifier() const;
 | 
			
		||||
 | 
			
		||||
    /// Returns the binding for the global namespace (aka ::).
 | 
			
		||||
    NamespaceBinding *globalNamespaceBinding();
 | 
			
		||||
    NamespaceBinding *globalNamespaceBinding() const;
 | 
			
		||||
 | 
			
		||||
    /// Returns the binding for the given namespace symbol.
 | 
			
		||||
    NamespaceBinding *findNamespaceBinding(const Name *name);
 | 
			
		||||
    NamespaceBinding *findNamespaceBinding(const Name *name) const;
 | 
			
		||||
 | 
			
		||||
    /// Returns the binding associated with the given symbol.
 | 
			
		||||
    NamespaceBinding *findOrCreateNamespaceBinding(Namespace *symbol);
 | 
			
		||||
 | 
			
		||||
    NamespaceBinding *resolveNamespace(const Location &loc,
 | 
			
		||||
                                       const Name *name,
 | 
			
		||||
                                       bool lookAtParent = true);
 | 
			
		||||
                                       bool lookAtParent = true) const;
 | 
			
		||||
 | 
			
		||||
    virtual ClassBinding *findClassBinding(const Name *name, QSet<Binding *> *processed);
 | 
			
		||||
    virtual Binding *findClassOrNamespaceBinding(const Identifier *id, QSet<Binding *> *processed);
 | 
			
		||||
    virtual ClassBinding *findClassBinding(const Name *name, QSet<const Binding *> *processed) const;
 | 
			
		||||
    virtual Binding *findClassOrNamespaceBinding(const Identifier *id, QSet<const Binding *> *processed) const;
 | 
			
		||||
 | 
			
		||||
    /// Helpers.
 | 
			
		||||
    virtual QByteArray qualifiedId() const;
 | 
			
		||||
@@ -128,31 +128,46 @@ public:
 | 
			
		||||
    static NamespaceBinding *find(Namespace *symbol, NamespaceBinding *binding);
 | 
			
		||||
    static ClassBinding *find(Class *symbol, NamespaceBinding *binding);
 | 
			
		||||
 | 
			
		||||
    NamespaceBinding *parent() const {return parent_;}
 | 
			
		||||
    NamespaceBinding *anonymousNamespaceBinding() const {return anonymousNamespaceBinding_;}
 | 
			
		||||
    void setAnonymousNamespaceBinding(NamespaceBinding *binding) { anonymousNamespaceBinding_ = binding; }
 | 
			
		||||
    const QList<NamespaceBinding *> &children() const {return children_;}
 | 
			
		||||
    void addChild(NamespaceBinding *);
 | 
			
		||||
    void removeChild(NamespaceBinding *);
 | 
			
		||||
    const QList<NamespaceBinding *> &usings() const {return usings_;}
 | 
			
		||||
    void addUsing(NamespaceBinding *);
 | 
			
		||||
    void removeUsing(NamespaceBinding *);
 | 
			
		||||
    const QList<Namespace *> &symbols() const {return symbols_;}
 | 
			
		||||
    void addSymbol(Namespace *);
 | 
			
		||||
    void removeSymbol(Namespace *);
 | 
			
		||||
    const QList<ClassBinding *> &classBindings() const {return classBindings_;}
 | 
			
		||||
    void addClassBinding(ClassBinding *);
 | 
			
		||||
    void removeClassBinding(ClassBinding *);
 | 
			
		||||
private:
 | 
			
		||||
    NamespaceBinding *findNamespaceBindingForNameId(const NameId *name,
 | 
			
		||||
                                                    bool lookAtParentNamespace);
 | 
			
		||||
                                                    bool lookAtParentNamespace) const;
 | 
			
		||||
 | 
			
		||||
    NamespaceBinding *findNamespaceBindingForNameId_helper(const NameId *name,
 | 
			
		||||
                                                           bool lookAtParentNamespace,
 | 
			
		||||
                                                           QSet<NamespaceBinding *> *processed);
 | 
			
		||||
                                                           QSet<const NamespaceBinding *> *processed) const;
 | 
			
		||||
 | 
			
		||||
public: // attributes
 | 
			
		||||
private: // attributes
 | 
			
		||||
    /// This binding's parent.
 | 
			
		||||
    NamespaceBinding *parent;
 | 
			
		||||
    NamespaceBinding *parent_;
 | 
			
		||||
 | 
			
		||||
    /// Binding for anonymous namespace symbols.
 | 
			
		||||
    NamespaceBinding *anonymousNamespaceBinding;
 | 
			
		||||
    NamespaceBinding *anonymousNamespaceBinding_;
 | 
			
		||||
 | 
			
		||||
    /// This binding's connections.
 | 
			
		||||
    QList<NamespaceBinding *> children;
 | 
			
		||||
    QList<NamespaceBinding *> children_;
 | 
			
		||||
 | 
			
		||||
    /// This binding's list of using namespaces.
 | 
			
		||||
    QList<NamespaceBinding *> usings;
 | 
			
		||||
    QList<NamespaceBinding *> usings_;
 | 
			
		||||
 | 
			
		||||
    /// This binding's namespace symbols.
 | 
			
		||||
    QList<Namespace *> symbols;
 | 
			
		||||
    QList<Namespace *> symbols_;
 | 
			
		||||
 | 
			
		||||
    QList<ClassBinding *> classBindings;
 | 
			
		||||
    QList<ClassBinding *> classBindings_;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
class CPLUSPLUS_EXPORT ClassBinding: public Binding
 | 
			
		||||
@@ -171,21 +186,32 @@ public:
 | 
			
		||||
    const Identifier *identifier() const;
 | 
			
		||||
    virtual QByteArray qualifiedId() const;
 | 
			
		||||
 | 
			
		||||
    virtual ClassBinding *findClassBinding(const Name *name, QSet<Binding *> *processed);
 | 
			
		||||
    virtual Binding *findClassOrNamespaceBinding(const Identifier *id, QSet<Binding *> *processed);
 | 
			
		||||
    virtual ClassBinding *findClassBinding(const Name *name, QSet<const Binding *> *processed) const;
 | 
			
		||||
    virtual Binding *findClassOrNamespaceBinding(const Identifier *id, QSet<const Binding *> *processed) const;
 | 
			
		||||
 | 
			
		||||
    void dump();
 | 
			
		||||
 | 
			
		||||
public: // attributes
 | 
			
		||||
    Binding *parent;
 | 
			
		||||
    Binding *parent() const { return parent_; }
 | 
			
		||||
    const QList<ClassBinding *> &children() const { return children_; }
 | 
			
		||||
    void addChild(ClassBinding *);
 | 
			
		||||
    void removeChild(ClassBinding *);
 | 
			
		||||
    const QList<Class *> &symbols() const { return symbols_; }
 | 
			
		||||
    void addSymbol(Class *symbol);
 | 
			
		||||
    void removeSymbol(Class *symbol);
 | 
			
		||||
    const QList<ClassBinding *> &baseClassBindings() const { return baseClassBindings_; }
 | 
			
		||||
    void addBaseClassBinding(ClassBinding *);
 | 
			
		||||
    void removeBaseClassBinding(ClassBinding *);
 | 
			
		||||
 | 
			
		||||
    QList<ClassBinding *> children;
 | 
			
		||||
private: // attributes
 | 
			
		||||
    Binding *parent_;
 | 
			
		||||
 | 
			
		||||
    QList<ClassBinding *> children_;
 | 
			
		||||
 | 
			
		||||
    /// This binding's class symbols.
 | 
			
		||||
    QList<Class *> symbols;
 | 
			
		||||
    QList<Class *> symbols_;
 | 
			
		||||
 | 
			
		||||
    /// Bindings for the base classes.
 | 
			
		||||
    QList<ClassBinding *> baseClassBindings;
 | 
			
		||||
    QList<ClassBinding *> baseClassBindings_;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
CPLUSPLUS_EXPORT NamespaceBindingPtr bind(Document::Ptr doc, Snapshot snapshot);
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user