]> git.tdb.fi Git - libs/gl.git/blobdiff - source/glsl/optimize.cpp
Refactor handling of %, << and >> in ConstantFolder
[libs/gl.git] / source / glsl / optimize.cpp
index 63dfcb5c2823758dc054f92cb4d1960650e05d44..06ea0f49c98a03b4c8186449eaac823d922a4719 100644 (file)
@@ -1,5 +1,6 @@
 #include <msp/core/raii.h>
 #include <msp/strings/format.h>
+#include <msp/strings/utils.h>
 #include "optimize.h"
 #include "reflect.h"
 
@@ -591,6 +592,18 @@ T ConstantFolder::evaluate_arithmetic(char oper, T left, T right)
        }
 }
 
+template<typename T>
+T ConstantFolder::evaluate_int_special_op(char oper, T left, T right)
+{
+       switch(oper)
+       {
+       case '%': return left%right;
+       case '<': return left<<right;
+       case '>': return left>>right;
+       default: return T();
+       }
+}
+
 void ConstantFolder::set_result(const Variant &value, bool literal)
 {
        r_constant_value = value;
@@ -617,7 +630,11 @@ void ConstantFolder::visit(RefPtr<Expression> &expr)
        else if(r_constant_value.check_type<int>())
                literal->token = lexical_cast<string>(r_constant_value.value<int>());
        else if(r_constant_value.check_type<float>())
+       {
                literal->token = lexical_cast<string>(r_constant_value.value<float>());
+               if(isnumrc(literal->token))
+                       literal->token += ".0";
+       }
        else
        {
                r_constant = false;
@@ -740,15 +757,8 @@ void ConstantFolder::visit(BinaryExpression &binary)
        }
        else if(oper=='%' || ((oper=='<' || oper=='>') && oper2==oper))
        {
-               if(!left_value.check_type<int>())
-                       return;
-
-               if(oper=='%')
-                       set_result(left_value.value<int>()%r_constant_value.value<int>());
-               else if(oper=='<')
-                       set_result(left_value.value<int>()<<r_constant_value.value<int>());
-               else if(oper=='>')
-                       set_result(left_value.value<int>()>>r_constant_value.value<int>());
+               if(left_value.check_type<int>())
+                       set_result(evaluate_int_special_op(oper, left_value.value<int>(), r_constant_value.value<int>()));
        }
 }