[Piglit] [PATCH] generated_tests: work around bug in Windows numpy implementation.

Paul Berry stereotype441 at gmail.com
Wed Sep 7 16:53:38 PDT 2011


The windows implementation of numpy seems to have multiple independent
copies of the int32 and uint32 types, as illustrated by this
interactive session:

Python 2.7.2 (default, Jun 12 2011, 15:08:59) [MSC v.1500 32 bit (Intel)] on
win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import numpy
>>> x = numpy.int32(5)
>>> y = numpy.abs(x)
>>> print type(x)
<type 'numpy.int32'>
>>> print type(y)
<type 'numpy.int32'>
>>> print type(x) == type(y)
False
>>> exit()

On Linux, the last "print" yields True, which is clearly the correct
behavior.

This duplication of int32 and uint32 classes was preventing
builtin_function.py's glsl_type_of() function from being able to
reliably determine the type of its argument, causing an assertion
failure while building piglit.

This patch works around the problem by creating tuples INT32_TYPES and
UINT32_TYPES which contain the duplicate types.  These tuples are used
instead of referring directly to numpy.int32 and numpy.uint32.

On platforms that do not have this bug, the tuples are "oneples" (one
element each) so there is no change in behavior.

I've verified that on Linux, this change does not affect the generated
tests.

Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=40697
---
 generated_tests/builtin_function.py |   27 ++++++++++++++++++---------
 1 files changed, 18 insertions(+), 9 deletions(-)

diff --git a/generated_tests/builtin_function.py b/generated_tests/builtin_function.py
index f08ce9e..9c79cfc 100644
--- a/generated_tests/builtin_function.py
+++ b/generated_tests/builtin_function.py
@@ -57,6 +57,15 @@ import numpy as np
 # Floating point types used by Python and numpy
 FLOATING_TYPES = (float, np.float64, np.float32)
 
+# Due to a bug in the Windows implementation of numpy, there are
+# multiple int32 types (and multiple uint32 types).  So we have to
+# find them all when doing isinstance checks.  The following code will
+# create two-element tuples on numpy implementations that have the
+# bug, and one-element tuples on numpy implementations that don't.
+INT32_TYPES = tuple(set([np.int32, type(np.abs(np.int32(1)))]))
+UINT32_TYPES = tuple(set([np.uint32,
+			  type(np.dot(np.uint32(0), np.uint32(0)))]))
+
 
 
 class GlslBuiltinType(object):
@@ -212,9 +221,9 @@ def glsl_type_of(value):
 	return glsl_float
     elif isinstance(value, (bool, np.bool_)):
 	return glsl_bool
-    elif isinstance(value, np.int32):
+    elif isinstance(value, INT32_TYPES):
 	return glsl_int
-    elif isinstance(value, np.uint32):
+    elif isinstance(value, UINT32_TYPES):
 	return glsl_uint
     else:
 	assert isinstance(value, np.ndarray)
@@ -226,9 +235,9 @@ def glsl_type_of(value):
 		return (glsl_vec2, glsl_vec3, glsl_vec4)[vector_length - 2]
 	    elif value.dtype == bool:
 		return (glsl_bvec2, glsl_bvec3, glsl_bvec4)[vector_length - 2]
-	    elif value.dtype == np.int32:
+	    elif value.dtype in INT32_TYPES:
 		return (glsl_ivec2, glsl_ivec3, glsl_ivec4)[vector_length - 2]
-	    elif value.dtype == np.uint32:
+	    elif value.dtype in UINT32_TYPES:
 		return (glsl_uvec2, glsl_uvec3, glsl_uvec4)[vector_length - 2]
 	    else:
 		raise Exception(
@@ -264,7 +273,7 @@ def glsl_constant(value):
     column_major = np.reshape(np.array(value), -1, 'F')
     if column_major.dtype == bool:
 	values = ['true' if x else 'false' for x in column_major]
-    elif column_major.dtype == np.uint32:
+    elif column_major.dtype in UINT32_TYPES:
 	values = [repr(x) + 'u' for x in column_major]
     else:
 	values = [repr(x) for x in column_major]
@@ -457,14 +466,14 @@ def _refract(I, N, eta):
 def _change_signedness(x):
     """Change signed integer types to unsigned integer types and vice
     versa."""
-    if isinstance(x, np.int32):
+    if isinstance(x, INT32_TYPES):
 	return np.uint32(x)
-    elif isinstance(x, np.uint32):
+    elif isinstance(x, UINT32_TYPES):
 	return np.int32(x)
     elif isinstance(x, np.ndarray):
-	if (x.dtype == np.int32):
+	if (x.dtype in INT32_TYPES):
 	    return np.array(x, dtype=np.uint32)
-	elif (x.dtype == np.uint32):
+	elif (x.dtype in UINT32_TYPES):
 	    return np.array(x, dtype=np.int32)
     raise Exception('Unexpected type passed to _change_signedness')
 
-- 
1.7.6



More information about the Piglit mailing list