Review: fix bug where optimize and closure assign collide (issue737041)


larry...@...
 

Reviewers: ,

Description:
OK, trying to explain this.

Ci *= color_C is legal
Ci = 0 is legal as a special case (clear the closure)

but

X *= (zero valued thing)

gets optimized to

X = (zero valued thing)

So, we were turning

color_C = ...;
Ci *= color_C;

into

color_const = 0;
Ci = color_const;

and were hitting a runtime assertion. Oops. No worries, just fix the
runtime.


Please review this at http://codereview.appspot.com/737041/show

Affected files:
src/liboslexec/opassign.cpp


Index: src/liboslexec/opassign.cpp
===================================================================
--- src/liboslexec/opassign.cpp (revision 606)
+++ src/liboslexec/opassign.cpp (working copy)
@@ -191,7 +191,8 @@
if (Result.typespec().is_closure() && Src.typespec().is_closure())
impl = assign_closure;
else if (Result.typespec().is_closure() &&
- (Src.typespec().is_int() || Src.typespec().is_float())) {
+ (Src.typespec().is_int() || Src.typespec().is_float() ||
+ Src.typespec().is_color())) {
// Special case: closure = 0 -> clear it
impl = clear_closure;
}


cku...@...