Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

Q. How does the tool determine how to gmBasic migrate COM ListView.Add to WinForm ListView.Add?

...

Code Block
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
C:\gmTestBed\FileExplorer\proj_csh\usr\Mscomctl.ocx.Winforms.Transform.gmsl
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  110 int IListItems_Add(int subRoot, int iStart, int iRefer)
  111 {
  112    int         icode;
  113    int         nCode;
  114    tCodeBlock  codptr;
  115    int         oper;
  116    int         subc;
  117    tCodeBlock  isOmitted;
  118    int         nOper;
  119    int         omitIndex;
  120    int         omitKey;
  121    int         omitIcon;
  122    int         omitSmallIcon;
  123    int         pattern;
  124    
  125    codptr = Opcode.GetCode();
  126    nCode = Opcode.GetLength()
  127    icode = Opcode.GetNext(codptr,iRefer,nCode);
  128    subc = 0;
  129    oper = Opcode.GetOperation(codptr,icode,subc);
  130    if(oper != OPC.MEM) return 0;
  131    icode = Opcode.GetNext(codptr,icode,nCode);
  132    oper = Opcode.GetOperation(codptr,icode,subc);
  133    if(oper != OPC.LEV) return 0;
  134 //Index
  135    nOper = 0;
  136    isOmitted = CodePattern.Read("LEV,DEF,ARG",nOper);
  137    omitIndex = CodePattern.Match(icode,isOmitted);
  138    icode = Opcode.FindArgumentEnd(codptr,icode,nCode);
  139    oper = Opcode.GetOperation(codptr,icode,subc);
  140    if(oper != OPC.LEV) return 0;
  141 // Key   
  142    omitKey = CodePattern.Match(icode,isOmitted);
  143    icode = Opcode.FindArgumentEnd(codptr,icode,nCode);
  144    oper = Opcode.GetOperation(codptr,icode,subc);
  145    if(oper != OPC.LEV) return 0;
  146 // Text
  147    icode = Opcode.FindArgumentEnd(codptr,icode,nCode);
  148    oper = Opcode.GetOperation(codptr,icode,subc);
  149    if(oper != OPC.LEV) return 0;
  150 // Icon
  151    omitIcon = CodePattern.Match(icode,isOmitted);
  152    icode = Opcode.FindArgumentEnd(codptr,icode,nCode);
  153    oper = Opcode.GetOperation(codptr,icode,subc);
  154    if(oper != OPC.LEV) return 0;
  155 // SmallIcon   
  156    omitSmallIcon = CodePattern.Match(icode,isOmitted);
  157    icode = Opcode.FindArgumentEnd(codptr,icode,nCode);
  158    oper = Opcode.GetOperation(codptr,icode,subc);
  159    if(oper != OPC.CUF) return 0;
  160     
  161    if(!omitIndex && !omitKey && !omitSmallIcon)
  162    {
  163       pattern =  Symbol.FindIdentifier("MsComctlLib.ListViewLogic.Insert_Index_Key_SmallIcon");
  164    }
  165    else if(!omitIndex && !omitKey && !omitIcon)
  166    {
  167       pattern = Symbol.FindIdentifier("MsComctlLib.ListViewLogic.Insert_Index_Key_Icon");
  168    }
  169    else if(!omitIndex && !omitKey)
  170    {
  171       pattern = Symbol.FindIdentifier("MsComctlLib.ListViewLogic.Insert_Index_Key");
  172    }
  173    else if(!omitIndex && omitKey && !omitSmallIcon)
  174    {
  175       pattern = Symbol.FindIdentifier("MsComctlLib.ListViewLogic.Insert_Index_SmallIcon");
  176    }
  177    else if(!omitIndex && omitKey && !omitIcon)
  178    {
  179       pattern = Symbol.FindIdentifier("MsComctlLib.ListViewLogic.Insert_Index_Icon");
  180    }
  181    else if(!omitIndex && omitKey)
  182    {
  183       pattern = Symbol.FindIdentifier("MsComctlLib.ListViewLogic.Insert_Index");
  184    }
  185    else if (omitIndex && !omitKey && !omitSmallIcon)
  186    {
> 187       pattern = Symbol.FindIdentifier("MsComctlLib.ListViewLogic.Add_Key_SmallIcon");
  188    }
  189    else if (omitIndex && !omitKey && !omitIcon)
  190    {
  191       pattern = Symbol.FindIdentifier("MsComctlLib.ListViewLogic.Add_Key_Icon");
  192    }
  193    else if (omitIndex && !omitKey)
  194    {
  195       pattern = Symbol.FindIdentifier("MsComctlLib.ListViewLogic.Add_Key");
  196    }
  197    else if (omitIndex && omitKey && !omitSmallIcon)
  198    {
  199       pattern = Symbol.FindIdentifier("MsComctlLib.ListViewLogic.Add_SmallIcon");
  200    }
  201    else if (omitIndex && omitKey && !omitIcon)
  202    {
  203       pattern = Symbol.FindIdentifier("MsComctlLib.ListViewLogic.Add_Icon");
  204    }
  205    else if (omitIndex && omitKey)
  206    {
  207       pattern = Symbol.FindIdentifier("MsComctlLib.ListViewLogic.Add");
  208    }
  209    else
  210    {
  211       pattern = Symbol.FindIdentifier("MsComctlLib.ListViewLogic.Add");
  212    }
  213    if(pattern == 0) return 0;
  214    Opcode.Replace(icode,OPC.PAT,pattern,1);
  215    Opcode.Delete(iRefer,2);
  216    return 1;
  217 }


First the gmBasic compiler processes this VB6:

Code Block
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
C:\gmTestBed\FileExplorer\src\frmExploreLite.frm
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
> 657     Set liListItem = lvListView.ListItems.Add(, , itemText, "genericMedium", "genericSmall")
  658 
  659     With liListItem.ListSubItems

And produces this "gmIL" in the system model:

Code Block
Compiled IL
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
C:\gmTestBed\FileExplorer\proj_csh\report\FileExplorer_csh-CustomSearch.tab
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 4082 Detailed Description of Subprogram FileExplorer.frmExploreLite.AddListItem with root address 266343:
...
 4097 Actual vb7 Codeblock Associated with AddListItem:
 4098 Offset |  Sl.Start |  Ql.Start | Quantity type        | Opcode | Operation support information
 4099 ------ |  -------- |  -------- | -------------        | ------ | -----------------------------
 4100      0 |           |           |                      | REM    | NULL
 4101      5 |           |           |                      | REM    | 57:Add a ListItem, then additional columns as ListSubItems.
 4102     10 |           |           |                      | NEW    | 656 Dim liListItem As ListItem
 4103     13 |           |           |                      | DCL    | Variable:liListItem:266701
>4104     18 |           |           |                      | NEW    | 657 Set liListItem = lvListView.ListItems.Add(, , itemText, "genericMedium", "genericSmall")
 4105     21 |      1.21 |      1.21 | MSComctlLib.ListItem | LDA    | Variable:liListItem:266701
 4106     26 |      1.21 |      1.21 | MSComctlLib.ListItem | LEV    | Nest0
 4107     28 |      2.28 |      2.28 | MSComctlLib.ListView | LDA    | MSComctlLib.ListView:lvListView:262825
 4108     33 |      3.33 |      2.28 | MSComctlLib.ListItem | LLP    | Component:ListItems:157565
 4109     38 |      2.28 |      2.28 | MSComctlLib.ListItem | MEM    | Child
 4110     40 |      3.40 |      2.28 | MSComctlLib.ListItem | LLP    | Component:Add:163224
 4111     45 |      2.28 |      2.28 | MSComctlLib.ListItem | MEM    | Child
 4112     47 |      2.28 |      2.28 | MSComctlLib.ListItem | LEV    | Nest1
 4113     49 |      3.49 |      3.49 | Void                 | DEF    | Overload
 4114     51 |      3.49 |      2.28 | MSComctlLib.ListItem | ARG    | Integer
 4115     53 |      3.49 |      2.28 | MSComctlLib.ListItem | LEV    | Nest1
 4116     55 |      4.55 |      3.55 | Void                 | DEF    | Overload
 4117     57 |      4.55 |      2.28 | MSComctlLib.ListItem | ARG    | String
 4118     59 |      4.55 |      2.28 | MSComctlLib.ListItem | LEV    | Nest1
 4119     61 |      5.61 |      3.61 | String               | LDA    | Variable:itemText:266487
 4120     66 |      5.61 |      2.28 | MSComctlLib.ListItem | ARG    | String
 4121     68 |      5.61 |      2.28 | MSComctlLib.ListItem | LEV    | Nest1
 4122     70 |      6.70 |      3.70 | String               | LSC    | 13:genericMedium
 4123     75 |      6.70 |      2.28 | MSComctlLib.ListItem | ARG    | String
 4124     77 |      6.70 |      2.28 | MSComctlLib.ListItem | LEV    | Nest1
 4125     79 |      7.79 |      3.79 | String               | LSC    | 12:genericSmall
 4126     84 |      7.79 |      2.28 | MSComctlLib.ListItem | ARG    | String
 4127     86 |      2.28 |      2.28 | MSComctlLib.ListItem | CUF    | Args5
>4128     88 |      2.28 |      2.28 | MSComctlLib.ListItem | REF    | Component:Add:163224
 4129     93 |      2.28 |      1.21 | MSComctlLib.ListItem | ARG    | Object
 4130     95 |           |      2.95 | Void                 | CMD    | Set
 4131     97 |           |           |                      | REM    | NULL
 4132    102 |           |           |                      | NEW    | 659 With liListItem.ListSubItems

During translation, the gmBasic engine calls the gmSL IListItems_Add method that examines the REF to IListItems.Add operation and modifies repalces it with the selected pattern operation, PAT.Add_SmallIcon, instead of the IListItem.Add method:

Code Block
Modified IL 
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
C:\gmTestBed\FileExplorer\proj_csh\report\FileExplorer_csh-CustomSearch.tab
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 4067 Detailed Description of Subprogram FileExplorer.frmExploreLite.AddListItem with root address 266343:
...
 4082 Actual csh Codeblock Associated with AddListItem:
 4083 Offset |  Sl.Start |  Ql.Start | Quantity type        | Opcode | Operation support information
 4084 ------ |  -------- |  -------- | -------------        | ------ | -----------------------------
 4085      0 |           |           |                      | REM    | NULL
 4086      5 |           |           |                      | REM    | 57:Add a ListItem, then additional columns as ListSubItems.
 4087     10 |           |           |                      | NEW    | 656 Dim liListItem As ListItem
 4088     13 |           |           |                      | DCL    | Variable:liListItem:266701
 4089     18 |           |           |                      | NEW    | 657 Set liListItem = lvListView.ListItems.Add(, , itemText, "genericMedium", "genericSmall")
 4090     21 |      1.21 |      1.21 | MSComctlLib.ListItem | LDA    | Variable:liListItem:266701
 4091     26 |      1.21 |      1.21 | MSComctlLib.ListItem | LEV    | Nest0
 4092     28 |      2.28 |      2.28 | MSComctlLib.ListView | LDA    | MSComctlLib.ListView:lvListView:262825
 4093     33 |      3.33 |      2.28 | MSComctlLib.ListItem | LLP    | Component:ListItems:157565
 4094     38 |      2.28 |      2.28 | MSComctlLib.ListItem | MEM    | Child
 4095     40 |      2.28 |      2.28 | MSComctlLib.ListItem | LEV    | Nest1
 4096     42 |      3.42 |      3.42 | Integer              | DEF    | MissingZero
 4097     44 |      3.42 |      2.28 | MSComctlLib.ListItem | ARG    | Integer
 4098     46 |      3.42 |      2.28 | MSComctlLib.ListItem | LEV    | Nest1
 4099     48 |      4.48 |      3.48 | String               | DEF    | EmptyString
 4100     50 |      4.48 |      2.28 | MSComctlLib.ListItem | ARG    | String
 4101     52 |      4.48 |      2.28 | MSComctlLib.ListItem | LEV    | Nest1
 4102     54 |      5.54 |      3.54 | String               | LDA    | Variable:itemText:266487
 4103     59 |      5.54 |      2.28 | MSComctlLib.ListItem | ARG    | String
 4104     61 |      5.54 |      2.28 | MSComctlLib.ListItem | LEV    | Nest1
 4105     63 |      6.63 |      3.63 | String               | LSC    | 13:genericMedium
 4106     68 |      6.63 |      2.28 | MSComctlLib.ListItem | ARG    | String
 4107     70 |      6.63 |      2.28 | MSComctlLib.ListItem | LEV    | Nest1
 4108     72 |      7.72 |      3.72 | String               | LSC    | 12:genericSmall
 4109     77 |      7.72 |      2.28 | MSComctlLib.ListItem | ARG    | String
>4110     79 |      2.28 |      2.28 | MSComctlLib.ListItem | PAT    | Component:Add_SmallIcon:182799
 4111     84 |      2.28 |      2.28 | MSComctlLib.ListItem | REF    | Component:Add:163224
 4112     89 |      2.28 |      1.21 | MSComctlLib.ListItem | ARG    | Object
 4113     91 |           |      2.91 | Void                 | CMD    | Set
 4114     93 |           |           |                      | REM    | NULL
 4115     98 |           |           |                      | NEW    | 659 With liListItem.ListSubItems

Finally, the Author "executes" the modified IL to emit the surface form of the selected pattern with arguments:

Code Block
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
\gmTestBed\FileExplorer\proj_csh\deploy\FileExplorer\frmExploreLite.cs
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  378       private void AddListItem(string itemKey,string itemText,string itemSize,string itemType,DateTime itemModified)
  379       {
...
> 383          liListItem = lvListView.Items.Add(itemText,"genericSmall");
...





See also 

FileExplorer sample