Note that there are some explanatory texts on larger screens.

plurals
  1. POGenerating IL for double arrays
    text
    copied!<p>I’m writing some IL institutions for creating <code>int</code> and <code>double</code> arrays using System.Reflection.Emit name space.</p> <p>For creating <code>int</code> array I’m using following code.</p> <pre><code>LocalBuilder arr = gen.DeclareLocal(typeof(int)); gen.Emit(OpCodes.Ldc_I4_1); gen.Emit(OpCodes.Newarr, typeof(int)); gen.Emit(OpCodes.Stloc, arr); gen.Emit(OpCodes.Ldloc, arr); gen.Emit(OpCodes.Ldc_I4_0); gen.Emit(OpCodes.Ldc_I4, 500); gen.Emit(OpCodes.Stelem_I4); gen.Emit(OpCodes.Ldloc, arr); gen.Emit(OpCodes.Ldc_I4_0); gen.Emit(OpCodes.Ldelem_I4); gen.Emit(OpCodes.Call,typeof(Console).GetMethod("WriteLine",new Type[]{typeof(int)})); </code></pre> <p>It’s working as expected and prints 500 on the Console.</p> <p>Same way I tried to create <code>double</code> array as shown below.</p> <pre><code>LocalBuilder arr = gen.DeclareLocal(typeof(double)); gen.Emit(OpCodes.Ldc_I4_1); gen.Emit(OpCodes.Newarr, typeof(double)); gen.Emit(OpCodes.Stloc, arr); gen.Emit(OpCodes.Ldloc, arr); gen.Emit(OpCodes.Ldc_I4_0); gen.Emit(OpCodes.Ldc_R8, 500D); gen.Emit(OpCodes.Stelem_R8); gen.Emit(OpCodes.Ldloc, arr); gen.Emit(OpCodes.Ldc_I4_0); gen.Emit(OpCodes.Ldelem_I8); gen.Emit(OpCodes.Call,typeof(Console).GetMethod("WriteLine",new Type[]{typeof(double)})); </code></pre> <p>Unfortunately this doesn’t work and when I inspect generated assembly using <code>pereview</code> it gave me following error.</p> <pre><code>Microsoft (R) .NET Framework PE Verifier. Version 4.0.30319.1 Copyright (c) Microsoft Corporation. All rights reserved. [IL]: Error: [C:\temp\Research\Research\bin\Debug\MyMod.exe : Foo::Main][offset 0x00000006][found ref array md array 'System.Double[]'][expected Double] Unexpected type on the stack. [IL]: Error: [C:\temp\Research\Research\bin\Debug\MyMod.exe : Foo::Main][offset 0x00000012] Expected single di mension array. 2 Error(s) Verifying MyMod.exe </code></pre> <p>Furthermore, I inspected generated assembly using <code>ildasm</code></p> <pre><code>.method privatescope static void Main$PST06000001() cil managed { .entrypoint // Code size 28 (0x1c) .maxstack 3 .locals init (float64 V_0) IL_0000: ldc.i4.1 IL_0001: newarr [mscorlib]System.Double IL_0006: stloc.0 IL_0007: ldloc.0 IL_0008: ldc.i4.0 IL_0009: ldc.r8 500. IL_0012: stelem.r8 IL_0013: ldloc.0 IL_0014: ldc.i4.0 IL_0015: ldelem.i8 IL_0016: call void [mscorlib]System.Console::WriteLine(float64) IL_001b: ret } // end of method Foo::Main </code></pre> <p>Do you have any idea?</p>
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload