--- a/mojoshader_effects.c Tue Oct 25 02:24:45 2011 -0400
+++ b/mojoshader_effects.c Tue Oct 25 12:01:34 2011 -0400
@@ -27,11 +27,11 @@
memset(temps, '\0', sizeof (double) * preshader->temp_count);
} // if
- double dst[4];
- double src[3][4];
- const double *src0 = src[0];
- const double *src1 = src[1];
- const double *src2 = src[2];
+ double dst[4] = { 0, 0, 0, 0 };
+ double src[3][4] = { { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 } };
+ const double *src0 = &src[0][0];
+ const double *src1 = &src[1][0];
+ const double *src2 = &src[2][0];
MOJOSHADER_preshaderInstruction *inst = preshader->instructions;
int instit;
@@ -43,6 +43,9 @@
const int elemsbytes = sizeof (double) * elems;
const int isscalarop = (inst->opcode >= scalarstart);
+ assert(elems >= 0);
+ assert(elems <= 4);
+
// load up our operands...
int opiter, elemiter;
for (opiter = 0; opiter < inst->operand_count-1; opiter++, operand++)
@@ -54,8 +57,9 @@
case MOJOSHADER_PRESHADEROPERAND_LITERAL:
{
const double *lit = &preshader->literals[index];
+ assert((index + elems) <= preshader->literal_count);
if (!isscalar)
- memcpy(src[opiter], lit, elemsbytes);
+ memcpy(&src[opiter][0], lit, elemsbytes);
else
{
const double val = *lit;
@@ -88,15 +92,18 @@
break;
case MOJOSHADER_PRESHADEROPERAND_TEMP:
- if (isscalar)
- src[opiter][0] = temps[index];
- else
- memcpy(src[opiter], temps + index, elemsbytes);
+ if (temps != NULL)
+ {
+ if (isscalar)
+ src[opiter][0] = temps[index];
+ else
+ memcpy(src[opiter], temps + index, elemsbytes);
+ } // if
break;
default:
assert(0 && "unexpected preshader operand type.");
- break;
+ return;
} // switch
} // for
@@ -170,7 +177,11 @@
// Figure out where dst wants to be stored.
if (operand->type == MOJOSHADER_PRESHADEROPERAND_TEMP)
+ {
+ assert(preshader->temp_count >=
+ operand->index + (elemsbytes / sizeof (double)));
memcpy(temps + operand->index, dst, elemsbytes);
+ } // if
else
{
assert(operand->type == MOJOSHADER_PRESHADEROPERAND_OUTPUT);