forked from qt-creator/qt-creator
Fix possible crash when parsing layout qualifiers nodes.
Task-number: QTCREATORBUG-4563 Reviewed-by: Leandro Melo <leandro.melo@nokia.com>
This commit is contained in:
@@ -290,11 +290,11 @@ public:
|
|||||||
List<ExpressionAST *> *arguments;
|
List<ExpressionAST *> *arguments;
|
||||||
} function;
|
} function;
|
||||||
int qualifier;
|
int qualifier;
|
||||||
LayoutQualifier *layout;
|
LayoutQualifierAST *layout;
|
||||||
List<LayoutQualifier *> *layout_list;
|
List<LayoutQualifierAST *> *layout_list;
|
||||||
struct {
|
struct {
|
||||||
int qualifier;
|
int qualifier;
|
||||||
List<LayoutQualifier *> *layout_list;
|
List<LayoutQualifierAST *> *layout_list;
|
||||||
} type_qualifier;
|
} type_qualifier;
|
||||||
struct {
|
struct {
|
||||||
TypeAST *type;
|
TypeAST *type;
|
||||||
@@ -1394,7 +1394,7 @@ case $rule_number: {
|
|||||||
ast(1) = makeAstNode<ParameterDeclarationAST>
|
ast(1) = makeAstNode<ParameterDeclarationAST>
|
||||||
(makeAstNode<QualifiedTypeAST>
|
(makeAstNode<QualifiedTypeAST>
|
||||||
(sym(1).qualifier, sym(3).param_declarator.type,
|
(sym(1).qualifier, sym(3).param_declarator.type,
|
||||||
(List<LayoutQualifier *> *)0),
|
(List<LayoutQualifierAST *> *)0),
|
||||||
ParameterDeclarationAST::Qualifier(sym(2).qualifier),
|
ParameterDeclarationAST::Qualifier(sym(2).qualifier),
|
||||||
sym(3).param_declarator.name);
|
sym(3).param_declarator.name);
|
||||||
} break;
|
} break;
|
||||||
@@ -1415,7 +1415,7 @@ parameter_declaration ::= parameter_type_qualifier parameter_qualifier parameter
|
|||||||
case $rule_number: {
|
case $rule_number: {
|
||||||
ast(1) = makeAstNode<ParameterDeclarationAST>
|
ast(1) = makeAstNode<ParameterDeclarationAST>
|
||||||
(makeAstNode<QualifiedTypeAST>
|
(makeAstNode<QualifiedTypeAST>
|
||||||
(sym(1).qualifier, type(3), (List<LayoutQualifier *> *)0),
|
(sym(1).qualifier, type(3), (List<LayoutQualifierAST *> *)0),
|
||||||
ParameterDeclarationAST::Qualifier(sym(2).qualifier),
|
ParameterDeclarationAST::Qualifier(sym(2).qualifier),
|
||||||
(const QString *)0);
|
(const QString *)0);
|
||||||
} break;
|
} break;
|
||||||
@@ -1605,7 +1605,7 @@ case $rule_number: {
|
|||||||
fully_specified_type ::= type_specifier ;
|
fully_specified_type ::= type_specifier ;
|
||||||
/.
|
/.
|
||||||
case $rule_number: {
|
case $rule_number: {
|
||||||
ast(1) = makeAstNode<QualifiedTypeAST>(0, type(1), (List<LayoutQualifier *> *)0);
|
ast(1) = makeAstNode<QualifiedTypeAST>(0, type(1), (List<LayoutQualifierAST *> *)0);
|
||||||
} break;
|
} break;
|
||||||
./
|
./
|
||||||
|
|
||||||
@@ -1656,28 +1656,28 @@ case $rule_number: {
|
|||||||
layout_qualifier_id_list ::= layout_qualifier_id ;
|
layout_qualifier_id_list ::= layout_qualifier_id ;
|
||||||
/.
|
/.
|
||||||
case $rule_number: {
|
case $rule_number: {
|
||||||
sym(1).layout_list = makeAstNode< List<LayoutQualifier *> >(sym(1).layout);
|
sym(1).layout_list = makeAstNode< List<LayoutQualifierAST *> >(sym(1).layout);
|
||||||
} break;
|
} break;
|
||||||
./
|
./
|
||||||
|
|
||||||
layout_qualifier_id_list ::= layout_qualifier_id_list COMMA layout_qualifier_id ;
|
layout_qualifier_id_list ::= layout_qualifier_id_list COMMA layout_qualifier_id ;
|
||||||
/.
|
/.
|
||||||
case $rule_number: {
|
case $rule_number: {
|
||||||
sym(1).layout_list = makeAstNode< List<LayoutQualifier *> >(sym(1).layout_list, sym(3).layout);
|
sym(1).layout_list = makeAstNode< List<LayoutQualifierAST *> >(sym(1).layout_list, sym(3).layout);
|
||||||
} break;
|
} break;
|
||||||
./
|
./
|
||||||
|
|
||||||
layout_qualifier_id ::= IDENTIFIER ;
|
layout_qualifier_id ::= IDENTIFIER ;
|
||||||
/.
|
/.
|
||||||
case $rule_number: {
|
case $rule_number: {
|
||||||
sym(1).layout = makeAstNode<LayoutQualifier>(string(1), (const QString *)0);
|
sym(1).layout = makeAstNode<LayoutQualifierAST>(string(1), (const QString *)0);
|
||||||
} break;
|
} break;
|
||||||
./
|
./
|
||||||
|
|
||||||
layout_qualifier_id ::= IDENTIFIER EQUAL NUMBER ;
|
layout_qualifier_id ::= IDENTIFIER EQUAL NUMBER ;
|
||||||
/.
|
/.
|
||||||
case $rule_number: {
|
case $rule_number: {
|
||||||
sym(1).layout = makeAstNode<LayoutQualifier>(string(1), string(3));
|
sym(1).layout = makeAstNode<LayoutQualifierAST>(string(1), string(3));
|
||||||
} break;
|
} break;
|
||||||
./
|
./
|
||||||
|
|
||||||
|
@@ -354,6 +354,13 @@ List<StructTypeAST::Field *> *StructTypeAST::fixInnerTypes(TypeAST *innerType, L
|
|||||||
return fields;
|
return fields;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void LayoutQualifierAST::accept0(Visitor *visitor)
|
||||||
|
{
|
||||||
|
if (visitor->visit(this)) {
|
||||||
|
}
|
||||||
|
visitor->endVisit(this);
|
||||||
|
}
|
||||||
|
|
||||||
void QualifiedTypeAST::accept0(Visitor *visitor)
|
void QualifiedTypeAST::accept0(Visitor *visitor)
|
||||||
{
|
{
|
||||||
if (visitor->visit(this))
|
if (visitor->visit(this))
|
||||||
|
@@ -69,6 +69,7 @@ class BasicTypeAST;
|
|||||||
class NamedTypeAST;
|
class NamedTypeAST;
|
||||||
class ArrayTypeAST;
|
class ArrayTypeAST;
|
||||||
class StructTypeAST;
|
class StructTypeAST;
|
||||||
|
class LayoutQualifierAST;
|
||||||
class QualifiedTypeAST;
|
class QualifiedTypeAST;
|
||||||
class DeclarationAST;
|
class DeclarationAST;
|
||||||
class PrecisionDeclarationAST;
|
class PrecisionDeclarationAST;
|
||||||
@@ -214,6 +215,7 @@ public:
|
|||||||
Kind_StructType,
|
Kind_StructType,
|
||||||
Kind_AnonymousStructType,
|
Kind_AnonymousStructType,
|
||||||
Kind_StructField,
|
Kind_StructField,
|
||||||
|
Kind_LayoutQualifier,
|
||||||
Kind_QualifiedType,
|
Kind_QualifiedType,
|
||||||
|
|
||||||
// Declarations
|
// Declarations
|
||||||
@@ -260,6 +262,7 @@ public:
|
|||||||
virtual ArrayTypeAST *asArrayType() { return 0; }
|
virtual ArrayTypeAST *asArrayType() { return 0; }
|
||||||
virtual StructTypeAST *asStructType() { return 0; }
|
virtual StructTypeAST *asStructType() { return 0; }
|
||||||
virtual QualifiedTypeAST *asQualifiedType() { return 0; }
|
virtual QualifiedTypeAST *asQualifiedType() { return 0; }
|
||||||
|
virtual LayoutQualifierAST *asLayoutQualifier() { return 0; }
|
||||||
|
|
||||||
virtual DeclarationAST *asDeclaration() { return 0; }
|
virtual DeclarationAST *asDeclaration() { return 0; }
|
||||||
virtual PrecisionDeclarationAST *asPrecisionDeclaration() { return 0; }
|
virtual PrecisionDeclarationAST *asPrecisionDeclaration() { return 0; }
|
||||||
@@ -785,22 +788,24 @@ public: // attributes
|
|||||||
List<Field *> *fields;
|
List<Field *> *fields;
|
||||||
};
|
};
|
||||||
|
|
||||||
class GLSL_EXPORT LayoutQualifier
|
class GLSL_EXPORT LayoutQualifierAST: public AST
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
LayoutQualifier(const QString *_name, const QString *_number)
|
LayoutQualifierAST(const QString *_name, const QString *_number)
|
||||||
: name(_name), number(_number), lineno(0) {}
|
: AST(Kind_LayoutQualifier), name(_name), number(_number) {}
|
||||||
|
|
||||||
|
virtual LayoutQualifierAST *asLayoutQualifier() { return this; }
|
||||||
|
virtual void accept0(Visitor *visitor);
|
||||||
|
|
||||||
public: // attributes
|
public: // attributes
|
||||||
const QString *name;
|
const QString *name;
|
||||||
const QString *number;
|
const QString *number;
|
||||||
int lineno;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
class GLSL_EXPORT QualifiedTypeAST: public TypeAST
|
class GLSL_EXPORT QualifiedTypeAST: public TypeAST
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
QualifiedTypeAST(int _qualifiers, TypeAST *_type, List<LayoutQualifier *> *_layout_list)
|
QualifiedTypeAST(int _qualifiers, TypeAST *_type, List<LayoutQualifierAST *> *_layout_list)
|
||||||
: TypeAST(Kind_QualifiedType), qualifiers(_qualifiers), type(_type)
|
: TypeAST(Kind_QualifiedType), qualifiers(_qualifiers), type(_type)
|
||||||
, layout_list(finish(_layout_list)) {}
|
, layout_list(finish(_layout_list)) {}
|
||||||
|
|
||||||
@@ -840,7 +845,7 @@ public:
|
|||||||
public: // attributes
|
public: // attributes
|
||||||
int qualifiers;
|
int qualifiers;
|
||||||
TypeAST *type;
|
TypeAST *type;
|
||||||
List<LayoutQualifier *> *layout_list;
|
List<LayoutQualifierAST *> *layout_list;
|
||||||
};
|
};
|
||||||
|
|
||||||
class GLSL_EXPORT DeclarationAST: public AST
|
class GLSL_EXPORT DeclarationAST: public AST
|
||||||
|
@@ -129,6 +129,9 @@ public:
|
|||||||
virtual bool visit(StructTypeAST::Field *) { return true; }
|
virtual bool visit(StructTypeAST::Field *) { return true; }
|
||||||
virtual void endVisit(StructTypeAST::Field *) {}
|
virtual void endVisit(StructTypeAST::Field *) {}
|
||||||
|
|
||||||
|
virtual bool visit(LayoutQualifierAST *) { return true; }
|
||||||
|
virtual void endVisit(LayoutQualifierAST *) {}
|
||||||
|
|
||||||
virtual bool visit(QualifiedTypeAST *) { return true; }
|
virtual bool visit(QualifiedTypeAST *) { return true; }
|
||||||
virtual void endVisit(QualifiedTypeAST *) {}
|
virtual void endVisit(QualifiedTypeAST *) {}
|
||||||
|
|
||||||
|
File diff suppressed because it is too large
Load Diff
@@ -1,5 +1,5 @@
|
|||||||
|
|
||||||
#line 218 "./glsl.g"
|
#line 217 "./glsl.g"
|
||||||
|
|
||||||
/**************************************************************************
|
/**************************************************************************
|
||||||
**
|
**
|
||||||
@@ -76,11 +76,11 @@ public:
|
|||||||
List<ExpressionAST *> *arguments;
|
List<ExpressionAST *> *arguments;
|
||||||
} function;
|
} function;
|
||||||
int qualifier;
|
int qualifier;
|
||||||
LayoutQualifier *layout;
|
LayoutQualifierAST *layout;
|
||||||
List<LayoutQualifier *> *layout_list;
|
List<LayoutQualifierAST *> *layout_list;
|
||||||
struct {
|
struct {
|
||||||
int qualifier;
|
int qualifier;
|
||||||
List<LayoutQualifier *> *layout_list;
|
List<LayoutQualifierAST *> *layout_list;
|
||||||
} type_qualifier;
|
} type_qualifier;
|
||||||
struct {
|
struct {
|
||||||
TypeAST *type;
|
TypeAST *type;
|
||||||
|
@@ -6,6 +6,7 @@
|
|||||||
**
|
**
|
||||||
** Contact: Nokia Corporation (info@qt.nokia.com)
|
** Contact: Nokia Corporation (info@qt.nokia.com)
|
||||||
**
|
**
|
||||||
|
**
|
||||||
** GNU Lesser General Public License Usage
|
** GNU Lesser General Public License Usage
|
||||||
**
|
**
|
||||||
** This file may be used under the terms of the GNU Lesser General Public
|
** This file may be used under the terms of the GNU Lesser General Public
|
||||||
@@ -29,7 +30,6 @@
|
|||||||
**
|
**
|
||||||
**************************************************************************/
|
**************************************************************************/
|
||||||
|
|
||||||
|
|
||||||
// This file was generated by qlalr - DO NOT EDIT!
|
// This file was generated by qlalr - DO NOT EDIT!
|
||||||
#include "glslparsertable_p.h"
|
#include "glslparsertable_p.h"
|
||||||
|
|
||||||
|
@@ -6,6 +6,7 @@
|
|||||||
**
|
**
|
||||||
** Contact: Nokia Corporation (info@qt.nokia.com)
|
** Contact: Nokia Corporation (info@qt.nokia.com)
|
||||||
**
|
**
|
||||||
|
**
|
||||||
** GNU Lesser General Public License Usage
|
** GNU Lesser General Public License Usage
|
||||||
**
|
**
|
||||||
** This file may be used under the terms of the GNU Lesser General Public
|
** This file may be used under the terms of the GNU Lesser General Public
|
||||||
|
@@ -786,8 +786,8 @@ bool Semantic::visit(StructTypeAST *ast)
|
|||||||
bool Semantic::visit(QualifiedTypeAST *ast)
|
bool Semantic::visit(QualifiedTypeAST *ast)
|
||||||
{
|
{
|
||||||
_type = type(ast->type);
|
_type = type(ast->type);
|
||||||
for (List<LayoutQualifier *> *it = ast->layout_list; it; it = it->next) {
|
for (List<LayoutQualifierAST *> *it = ast->layout_list; it; it = it->next) {
|
||||||
LayoutQualifier *q = it->value;
|
LayoutQualifierAST *q = it->value;
|
||||||
// q->name;
|
// q->name;
|
||||||
// q->number;
|
// q->number;
|
||||||
Q_UNUSED(q);
|
Q_UNUSED(q);
|
||||||
|
Reference in New Issue
Block a user