That's right. Try this (if you're on Windows): compile an application that
references a constant (like Math.PI), and open that compiled application in
Reflector. The call the Math.PI will have been replaced by a constant value.

2010/1/10 Wee Li Yen <[email protected]>

>  Tommy, so what u mean is there is no way I can detect field read and
> write in this case?
>
> But how come Jb said "So if you want to detect where PI is used, you have
> to check for the `ldc.r8 Math.PI` pattern."? My previous post was trying
> to say that I can't find this.
>
>
>  *From:* Tommy Carlier <[email protected]>
> *Sent:* Sunday, January 10, 2010 8:21 PM
> *To:* [email protected]
> *Subject:* Re: [mono-cecil] Field read and write
>
> Because Math.PI is a constant, the compiler will just copy its value to the
> location of where it's used. So, if your code says "double pi = Math.PI;",
> the compiler will translate it to "double pi = 3.1415926...;". That's why
> there are no references to Math.PI.
>
> 2010/1/10 Wee Li Yen <[email protected]>
>
>> Sorry to bother you on this issue again.
>>
>> I print out all the instructions from VisitInstruction (BaseCodeVisitor)
>> in this way:
>>
>>           OpCode opCode = instr.OpCode;
>>           object operand = instr.Operand;
>>           Console.Write("###" + opCode + " " + ((operand != null)?
>> operand.ToString() : "") + "###");
>>           Console.WriteLine();
>>
>> But I don't see ldc.r8 Math.PI...
>>
>> Do you know why? Thanks...
>> --------------------------------------------------
>> From: "Jb Evain" <[email protected]>
>> Sent: Friday, January 08, 2010 5:58 PM
>> To: <[email protected]>
>> Subject: Re: [mono-cecil] Field read and write
>>
>> 2010/1/8 Li Yen Wee <[email protected]>:
>>>
>>>> But how has it got to do with me not being able to detect the field
>>>> PIValue
>>>> as written and Math.PI as read?
>>>>
>>>
>>> Again, if you had bothered to investigate a little bit you would know.
>>> PI is defined as a constant, so the compiler will inline its value
>>> everywhere it's used
>>>
>>> var pi = Math.PI is compiled as:
>>>
>>> ldc.r8 3.1415926535897931
>>> stloc pi
>>>
>>> So if you want to detect where PI is used, you have to check for the
>>> `ldc.r8 Math.PI` pattern.
>>>
>>> --
>>> Jb Evain  <[email protected]>
>>>
>>
-- 
--
mono-cecil

Reply via email to