Re: my hacking notes

"Llewellyn Pritchard" <[email protected]>
Newsgroups gmane.comp.gnu.dotgnu.developer
Message-ID <001201c41819$3b6ee970$0200a8c0@uber>
Thanks, that sounds great, I am for starters lost! but would love to know
more.

----- Original Message ----- 
From: "Gomi Kapoor" <gomikapoor-/[email protected]>
To: "pnet" <[email protected]>
Sent: Thursday, April 01, 2004 7:59 PM
Subject: [DotGNU]my hacking notes


> Hi all,
> While I am trying to understand the code of Portable
> .NET, I am attempting to write down a few things. I
> feel these notes would be helpful to other beginners
> like me. (the first one of them, please find attached
> with this mail.  It contains a small description of
> how the switch-case loop is split across different
> files).
>
> If you feel it is good, is there a place where I can
> host such small write
> ups? (or make it part of pnet/doc)
>
> Regards,
> Gomi Kapoor
>
> ________________________________________________________________________
> Yahoo! India Insurance Special: Be informed on the best policies,
services, tools and more.
> Go to: http://in.insurance.yahoo.com/licspecial/index.html


----------------------------------------------------------------------------
----


> Splitting a huge switch-case loop across mutiple files:
> ========= = ==== =========== ==== ====== ======= =====
> The Portable .NET's CIL (Common Intermediate Language) Verifier,
> CVM interpreter and the Unroller are implemented in the
> pnet/engine directory.
>
> The verifier is implemented in verify_* files, the CVM interpreter
> in cvm_* files and the unroller in unroll_* files.
>
> Interestingly all of them, involve implementing a huge switch-case
> loop and hence follow a similar coding style, which we discuss here.
>
> Instead of writing the whole huge switch-case loop in just a single
> file, it is split across many files as follows.
>
> Let's say we have a  file(loop.c), which has the actual switch-loop
> implemented and other files like loop_part1.c, loop_part2.c, where
> the relavent cases are implemented in those files. The whole loop is
> built by including those part files in the main file as follows:
>
> In file loop_part1.c, we have
> case LOOP_PART1_INST1:
> //...
> break;
> case LOOP_PART1_INST2:
> //...
> break;
> case LOOP_PART1_INST3:
> //...
> break;
>
> In the loop_part2.c, we have
> case LOOP_PART2_INST1:
> //...
> break;
> case LOOP_PART2_INST2:
> //...
> break;
> case LOOP_PART2_INST3:
> //...
> break;
>
> and finally in the file loop.c, we have
> void loop()
> {
> switch(...)
> {
> case LOOP_INST1:
> //...
> break;
> case LOOP_INST2:
> //...
> break;
> #include "loop_part1.c"
> #include "loop_part2.c"
> }
> }
>
> But one potential problem with the above implementation is, it is not
> possible to declare any local variables in the ``part'' files. All of
> them have to be in the main file and it becomes a bit difficult to
> manage in such a situation. Similar is the case if we need to have
> helper functions in the part files.
>
> These issues are addressed by using macros as shown below.
>
> In the part files, write the code can be written as follows:
> loop_part1.c:
> #if LOOP_GLOBALS
> //here goes the global variables and the helper functions
> #endif
>
> #if LOOP_LOCALS
> // Here goes the local varibales of the loop function
> // needed by the case
> #endif
>
> #if LOOP_MAIN
> //Here goes the actual code for the cases
> #endif
>
> And in the main file, loop.c we can have:
>
> #define LOOP_GLOBALS
> #include "loop_part1.c"
> #include "loop_part2.c"
> #undef LOOP_GLOBALS
>
> void loop(...)
> {
> #define LOOP_LOCALS
> #include "loop_part1.c"
> #include "loop_part2.c"
> #undef LOOP_LOCALS
>
> switch(...)
> {
> case LOOP_INST1:
> //.....
> break;
> .....
> #define LOOP_MAIN
> #include "loop_part1.c"
> #include "loop_part2.c"
> #undef LOOP_MAIN
> }
> }
> In the case of verifier:
>  Main file : verify.c (and the function is _ILVerify)
>  Part files : verify_ann.c
> verify_arith.c
> verify_branch.c
> verify_call.c
> verify_const.c
> verify_conv.c
> verify_except.c
> verify_obj.c
> verify_ptr.c
> verify_stack.c
> verify_var.c
>  Global Macro: IL_VERIFY_GLOBALS
>  Local Macro : IL_VERIFY_LOCALS
>  Cases Macro : IL_VERIFY_CODE
>
>
> In the case of CVM interpreter:
>  Main file : cvm.c (and the function is _ILCVMInterpreter)
>  Part files : cvm_var.c
>   cvm_ptr.c
> cvm_stack.c
> cvm_arith.c
> cvm_conv.c
> cvm_const.c
> cvm_branch.c
> cvm_call.c
> cvm_except.c
> cvm_compare.c
> cvm_inline.c
>  Global Macro: IL_CVM_GLOBALS
>  Local Macro : IL_CVM_LOCALS
>  Cases Macro : IL_CVM_MAIN, IL_CVM_WIDE, IL_CVM_PREFIX
>
> In the case of unroller:
>  Main file : unroll.c (and the function is _ILCVMUnrollMethod)
>  Part files : unroll_arith.c
>   unroll_branch.c
>   unroll_const.c
>   unroll_conv.c
>   unroll_ptr.c
>   unroll_var.c
>  Global Macro: IL_UNROLL_GLOBAL
>  Local Macro : -
>  Cases Macro : IL_UNROLL_CASES
>
>                               -*-*-*
>
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.