From 947bb7477205c038aa1804b84452cddd2108550a Mon Sep 17 00:00:00 2001 From: Mikko Rasa Date: Sun, 21 Feb 2021 00:59:07 +0200 Subject: [PATCH] Avoid copying raw pointers in the syntax tree They will potentially point to incorrect nodes and must be resolved again. --- source/glsl/compiler.cpp | 1 + source/glsl/syntax.cpp | 45 +++++++++++++++++++++++++++++++++++++++- source/glsl/syntax.h | 7 +++++++ 3 files changed, 52 insertions(+), 1 deletion(-) diff --git a/source/glsl/compiler.cpp b/source/glsl/compiler.cpp index 35977cb4..02f4ea13 100644 --- a/source/glsl/compiler.cpp +++ b/source/glsl/compiler.cpp @@ -185,6 +185,7 @@ bool Compiler::optimize(Stage &stage) ConstantConditionEliminator().apply(stage); FunctionInliner().apply(stage); + VariableResolver().apply(stage); bool result = UnusedVariableRemover().apply(stage); result |= UnusedFunctionRemover().apply(stage); diff --git a/source/glsl/syntax.cpp b/source/glsl/syntax.cpp index affc09ad..957b49ce 100644 --- a/source/glsl/syntax.cpp +++ b/source/glsl/syntax.cpp @@ -98,12 +98,27 @@ VariableReference::VariableReference(): declaration(0) { } +VariableReference::VariableReference(const VariableReference &other): + name(other.name), + declaration(0) +{ } + void VariableReference::visit(NodeVisitor &visitor) { visitor.visit(*this); } +MemberAccess::MemberAccess(): + declaration(0) +{ } + +MemberAccess::MemberAccess(const MemberAccess &other): + left(other.left), + member(other.member), + declaration(0) +{ } + void MemberAccess::visit(NodeVisitor &visitor) { visitor.visit(*this); @@ -131,6 +146,11 @@ Assignment::Assignment(): target_declaration(0) { } +Assignment::Assignment(const Assignment &other): + self_referencing(other.self_referencing), + target_declaration(0) +{ } + void Assignment::visit(NodeVisitor &visitor) { visitor.visit(*this); @@ -142,6 +162,13 @@ FunctionCall::FunctionCall(): constructor(false) { } +FunctionCall::FunctionCall(const FunctionCall &other): + name(other.name), + declaration(0), + constructor(other.constructor), + arguments(other.arguments) +{ } + void FunctionCall::visit(NodeVisitor &visitor) { visitor.visit(*this); @@ -196,6 +223,22 @@ VariableDeclaration::VariableDeclaration(): linked_declaration(0) { } +VariableDeclaration::VariableDeclaration(const VariableDeclaration &other): + constant(other.constant), + sampling(other.sampling), + interpolation(other.interpolation), + interface(other.interface), + precision(other.precision), + type(other.type), + type_declaration(0), + name(other.name), + array(other.array), + array_size(other.array_size), + init_expression(other.init_expression), + linked_declaration(0), + layout(other.layout) +{ } + void VariableDeclaration::visit(NodeVisitor &visitor) { visitor.visit(*this); @@ -222,7 +265,7 @@ FunctionDeclaration::FunctionDeclaration(const FunctionDeclaration &other): return_type(other.return_type), name(other.name), parameters(other.parameters), - definition(other.definition==&other ? this : other.definition), + definition(other.definition==&other ? this : 0), body(other.body) { } diff --git a/source/glsl/syntax.h b/source/glsl/syntax.h index 77647124..05bcee54 100644 --- a/source/glsl/syntax.h +++ b/source/glsl/syntax.h @@ -143,6 +143,7 @@ struct VariableReference: Expression VariableDeclaration *declaration; VariableReference(); + VariableReference(const VariableReference &); virtual VariableReference *clone() const { return new VariableReference(*this); } virtual void visit(NodeVisitor &); @@ -154,6 +155,9 @@ struct MemberAccess: Expression std::string member; VariableDeclaration *declaration; + MemberAccess(); + MemberAccess(const MemberAccess &); + virtual MemberAccess *clone() const { return new MemberAccess(*this); } virtual void visit(NodeVisitor &); }; @@ -187,6 +191,7 @@ struct Assignment: BinaryExpression VariableDeclaration *target_declaration; Assignment(); + Assignment(const Assignment &); virtual Assignment *clone() const { return new Assignment(*this); } virtual void visit(NodeVisitor &); @@ -200,6 +205,7 @@ struct FunctionCall: Expression NodeArray arguments; FunctionCall(); + FunctionCall(const FunctionCall &); virtual FunctionCall *clone() const { return new FunctionCall(*this); } virtual void visit(NodeVisitor &); @@ -282,6 +288,7 @@ struct VariableDeclaration: Statement NodePtr layout; VariableDeclaration(); + VariableDeclaration(const VariableDeclaration &); virtual VariableDeclaration *clone() const { return new VariableDeclaration(*this); } virtual void visit(NodeVisitor &); -- 2.45.2