I'm baffled. How did your compiler generate this line?

IL_0041: // ldind.u2
temp42 = ((UInt16)*(UInt16*)pStr);

Since we talk that the stack contains values and not variables, how did pStr got in this statement? It should be temp38 instead.