aboutsummaryrefslogtreecommitdiffstats
path: root/src/libs/glsl/glslast.cpp
diff options
context:
space:
mode:
authorRhys Weatherley <[email protected]>2010-11-12 09:05:48 +1000
committerRhys Weatherley <[email protected]>2010-11-12 09:29:50 +1000
commit73d570c83afb7e7fbcc8a87a2a63c9e3b39ae452 (patch)
tree30be36ca8402ec4495d706f6a35e7ccf33fad1ba /src/libs/glsl/glslast.cpp
parent217699c8ac6a0b326ab4f09238c8ca888bf11c29 (diff)
Convert GLSL AST nodes into managed types
Diffstat (limited to 'src/libs/glsl/glslast.cpp')
-rw-r--r--src/libs/glsl/glslast.cpp225
1 files changed, 15 insertions, 210 deletions
diff --git a/src/libs/glsl/glslast.cpp b/src/libs/glsl/glslast.cpp
index e9784010529..b6ab81930a6 100644
--- a/src/libs/glsl/glslast.cpp
+++ b/src/libs/glsl/glslast.cpp
@@ -32,10 +32,6 @@
using namespace GLSL;
-AST::~AST()
-{
-}
-
void AST::accept(Visitor *visitor)
{
if (visitor->preVisit(this))
@@ -49,23 +45,6 @@ void AST::accept(AST *ast, Visitor *visitor)
ast->accept(visitor);
}
-Statement *AST::makeCompound(Statement *left, Statement *right)
-{
- if (!left)
- return right;
- else if (!right)
- return left;
- CompoundStatement *compound = left->asCompoundStatement();
- if (compound) {
- compound->statements.push_back(right);
- } else {
- compound = new CompoundStatement();
- compound->statements.push_back(left);
- compound->statements.push_back(right);
- }
- return compound;
-}
-
void TranslationUnit::accept0(Visitor *visitor)
{
if (visitor->visit(this)) {
@@ -74,32 +53,18 @@ void TranslationUnit::accept0(Visitor *visitor)
visitor->endVisit(this);
}
-IdentifierExpression::~IdentifierExpression()
-{
-}
-
void IdentifierExpression::accept0(Visitor *visitor)
{
visitor->visit(this);
visitor->endVisit(this);
}
-LiteralExpression::~LiteralExpression()
-{
-}
-
void LiteralExpression::accept0(Visitor *visitor)
{
visitor->visit(this);
visitor->endVisit(this);
}
-BinaryExpression::~BinaryExpression()
-{
- delete left;
- delete right;
-}
-
void BinaryExpression::accept0(Visitor *visitor)
{
if (visitor->visit(this)) {
@@ -109,11 +74,6 @@ void BinaryExpression::accept0(Visitor *visitor)
visitor->endVisit(this);
}
-UnaryExpression::~UnaryExpression()
-{
- delete expr;
-}
-
void UnaryExpression::accept0(Visitor *visitor)
{
if (visitor->visit(this))
@@ -121,13 +81,6 @@ void UnaryExpression::accept0(Visitor *visitor)
visitor->endVisit(this);
}
-TernaryExpression::~TernaryExpression()
-{
- delete first;
- delete second;
- delete third;
-}
-
void TernaryExpression::accept0(Visitor *visitor)
{
if (visitor->visit(this)) {
@@ -138,12 +91,6 @@ void TernaryExpression::accept0(Visitor *visitor)
visitor->endVisit(this);
}
-AssignmentExpression::~AssignmentExpression()
-{
- delete variable;
- delete value;
-}
-
void AssignmentExpression::accept0(Visitor *visitor)
{
if (visitor->visit(this)) {
@@ -153,11 +100,6 @@ void AssignmentExpression::accept0(Visitor *visitor)
visitor->endVisit(this);
}
-MemberAccessExpression::~MemberAccessExpression()
-{
- delete expr;
-}
-
void MemberAccessExpression::accept0(Visitor *visitor)
{
if (visitor->visit(this))
@@ -165,28 +107,15 @@ void MemberAccessExpression::accept0(Visitor *visitor)
visitor->endVisit(this);
}
-FunctionCallExpression::~FunctionCallExpression()
-{
- delete expr;
- for (std::vector<Expression *>::iterator it = arguments.begin(); it != arguments.end(); ++it)
- delete *it;
-}
-
void FunctionCallExpression::accept0(Visitor *visitor)
{
if (visitor->visit(this)) {
accept(expr, visitor);
- for (std::vector<Expression *>::iterator it = arguments.begin(); it != arguments.end(); ++it)
- accept(*it, visitor);
+ accept(arguments, visitor);
}
visitor->endVisit(this);
}
-ExpressionStatement::~ExpressionStatement()
-{
- delete expr;
-}
-
void ExpressionStatement::accept0(Visitor *visitor)
{
if (visitor->visit(this))
@@ -194,28 +123,13 @@ void ExpressionStatement::accept0(Visitor *visitor)
visitor->endVisit(this);
}
-CompoundStatement::~CompoundStatement()
-{
- for (std::vector<Statement *>::iterator it = statements.begin(); it != statements.end(); ++it)
- delete *it;
-}
-
void CompoundStatement::accept0(Visitor *visitor)
{
- if (visitor->visit(this)) {
- for (std::vector<Statement *>::iterator it = statements.begin(); it != statements.end(); ++it)
- accept(*it, visitor);
- }
+ if (visitor->visit(this))
+ accept(statements, visitor);
visitor->endVisit(this);
}
-IfStatement::~IfStatement()
-{
- delete condition;
- delete thenClause;
- delete elseClause;
-}
-
void IfStatement::accept0(Visitor *visitor)
{
if (visitor->visit(this)) {
@@ -226,12 +140,6 @@ void IfStatement::accept0(Visitor *visitor)
visitor->endVisit(this);
}
-WhileStatement::~WhileStatement()
-{
- delete condition;
- delete body;
-}
-
void WhileStatement::accept0(Visitor *visitor)
{
if (visitor->visit(this)) {
@@ -241,12 +149,6 @@ void WhileStatement::accept0(Visitor *visitor)
visitor->endVisit(this);
}
-DoStatement::~DoStatement()
-{
- delete body;
- delete condition;
-}
-
void DoStatement::accept0(Visitor *visitor)
{
if (visitor->visit(this)) {
@@ -256,14 +158,6 @@ void DoStatement::accept0(Visitor *visitor)
visitor->endVisit(this);
}
-ForStatement::~ForStatement()
-{
- delete init;
- delete condition;
- delete increment;
- delete body;
-}
-
void ForStatement::accept0(Visitor *visitor)
{
if (visitor->visit(this)) {
@@ -275,21 +169,12 @@ void ForStatement::accept0(Visitor *visitor)
visitor->endVisit(this);
}
-JumpStatement::~JumpStatement()
-{
-}
-
void JumpStatement::accept0(Visitor *visitor)
{
visitor->visit(this);
visitor->endVisit(this);
}
-ReturnStatement::~ReturnStatement()
-{
- delete expr;
-}
-
void ReturnStatement::accept0(Visitor *visitor)
{
if (visitor->visit(this))
@@ -297,12 +182,6 @@ void ReturnStatement::accept0(Visitor *visitor)
visitor->endVisit(this);
}
-SwitchStatement::~SwitchStatement()
-{
- delete expr;
- delete body;
-}
-
void SwitchStatement::accept0(Visitor *visitor)
{
if (visitor->visit(this)) {
@@ -312,11 +191,6 @@ void SwitchStatement::accept0(Visitor *visitor)
visitor->endVisit(this);
}
-CaseLabelStatement::~CaseLabelStatement()
-{
- delete expr;
-}
-
void CaseLabelStatement::accept0(Visitor *visitor)
{
if (visitor->visit(this))
@@ -324,15 +198,6 @@ void CaseLabelStatement::accept0(Visitor *visitor)
visitor->endVisit(this);
}
-Type *Type::clone(Type *type)
-{
- if (!type)
- return 0;
- Type *c = type->clone();
- c->lineno = type->lineno;
- return c;
-}
-
BasicType::BasicType(int _token)
: Type(Kind_BasicType), token(_token)
{
@@ -350,10 +215,6 @@ BasicType::BasicType(int _token)
}
}
-BasicType::~BasicType()
-{
-}
-
void BasicType::accept0(Visitor *visitor)
{
visitor->visit(this);
@@ -373,15 +234,6 @@ bool BasicType::setPrecision(Precision precision)
return true;
}
-Type *BasicType::clone() const
-{
- return new BasicType(token, prec);
-}
-
-NamedType::~NamedType()
-{
-}
-
void NamedType::accept0(Visitor *visitor)
{
visitor->visit(this);
@@ -399,17 +251,6 @@ bool NamedType::setPrecision(Precision)
return false;
}
-Type *NamedType::clone() const
-{
- return new NamedType(name);
-}
-
-ArrayType::~ArrayType()
-{
- delete elementType;
- delete size;
-}
-
void ArrayType::accept0(Visitor *visitor)
{
if (visitor->visit(this)) {
@@ -432,26 +273,10 @@ bool ArrayType::setPrecision(Precision precision)
return false;
}
-Type *ArrayType::clone() const
-{
- if (kind == Kind_ArrayType)
- return new ArrayType(Type::clone(elementType), size);
- else
- return new ArrayType(Type::clone(elementType));
-}
-
-StructType::~StructType()
-{
- for (std::vector<Field *>::iterator it = fields.begin(); it != fields.end(); ++it)
- delete *it;
-}
-
void StructType::accept0(Visitor *visitor)
{
- if (visitor->visit(this)) {
- for (std::vector<Field *>::iterator it = fields.begin(); it != fields.end(); ++it)
- accept(*it, visitor);
- }
+ if (visitor->visit(this))
+ accept(fields, visitor);
visitor->endVisit(this);
}
@@ -466,25 +291,6 @@ bool StructType::setPrecision(Precision)
return false;
}
-Type *StructType::clone() const
-{
- StructType *stype;
- if (kind == Kind_AnonymousStructType)
- stype = new StructType();
- else
- stype = new StructType(name);
- for (std::vector<Field *>::const_iterator it = fields.begin(); it != fields.end(); ++it) {
- stype->fields.push_back
- (new Field((*it)->name, Type::clone((*it)->type)));
- }
- return stype;
-}
-
-StructType::Field::~Field()
-{
- delete type;
-}
-
void StructType::Field::accept0(Visitor *visitor)
{
if (visitor->visit(this))
@@ -505,18 +311,17 @@ void StructType::Field::setInnerType(Type *innerType)
parent = &(array->elementType);
inner = array->elementType;
}
- *parent = Type::clone(innerType);
-}
-
-void StructType::fixInnerTypes(Type *innerType, std::vector<Field *> &fields)
-{
- for (size_t index = 0; index < fields.size(); ++index)
- fields[index]->setInnerType(innerType);
- delete innerType; // No longer needed - cloned into all fields.
+ *parent = innerType;
}
-void StructType::addFields(const std::vector<Field *> &list)
+void StructType::fixInnerTypes(Type *innerType, List<Field *> *fields)
{
- for (size_t index = 0; index < list.size(); ++index)
- fields.push_back(list[index]);
+ if (!fields)
+ return;
+ List<Field *> *head = fields->next;
+ List<Field *> *current = head;
+ do {
+ current->value->setInnerType(innerType);
+ current = current->next;
+ } while (current && current != head);
}