Support Statement: gmSL to move a variable declaration
The following gmSL routine moves a declaration to the top of a function. This may be required when a translated method uses a variable before it is initialized. (See C# Compiler Error CS0165).
Beginning with gmBasic v40.75 is now a Migrate MoveToTop attribute for moving declarations to the top. See gmplMigrateStatement.
Note, a simpler temporary workaround is to translate the method to a "Conditional Stub" using Refactor/Remove with migStatus="Conditional".
<gmBasic>
<Storage Action="Create" Identifier="App" />
... options etc. ...
<gmSL class="Refactoring">
void MoveDeclToTop(string identifier)
{
/// moves the declaration of the specified identifier to the top of the declaring subprogram
int iRoot; // address of identifier to move
int subRoot; // subroutine containing the identifier to move
tVbSub subInfo; // information vector for subroutine
tCodeBlock codPtr; // code stream
int nCode; // length of code stream
int lastNew; // last Statement start
int iCode; // code pointer for code scan
int opcd; // opcode for code scan
int subc; // subcode for code scan
int subLen; // length of subroutine
int topAddr;
iRoot = Symbol.FindIdentifier(identifier,0);
if(iRoot == 0)
{
System.LogMessage("MoveDeclToTop failed: could not locate " + identifier);
return;
}
subRoot = Store.GetParent(iRoot);
nCode = Store.GetLength(subRoot);
subInfo = Store.DeltaVector(subRoot);
codPtr = Opcode.GetCode();
nCode = Store.ReadInfo(codPtr,subInfo.anaCodeStart);
Opcode.SetLength(nCode);
subLen = nCode;
lastNew = 0;
topAddr = 0;
for(iCode = 0; iCode >= 0; iCode = Opcode.GetNext(codPtr,iCode,nCode))
{
opcd = Opcode.GetOperation(codPtr,iCode,subc);
if(opcd == OPC.NEW)
{
lastNew = iCode;
continue;
}
if(opcd == OPC.DCL)
{
if(subc == iRoot)
{
if((icode - lastNew) != 3)
{
System.LogMessage("MoveDeclToTop failed:" + identifier + " Declaration at " + icode + " Not immediately preceded by a NEW" );
Opcode.DumpCode(lastNew,lastNew+20);
break;
}
topAddr = 0;
Opcode.MoveCode(topAddr,lastNew,nCode,8);
subInfo.anaCodeStart = Store.WriteInfo(codPtr,subLen);
System.LogMessage("Reauthored: " + identifier + " by moving declaration to " + topAddr);
break;
}
else
{
topAddr = iCode;
}
}
}
}
</gmSL>
<Compile Project="\fkgtest\App\src\TOM-Trunk.vbp" />
<Analyse />
<!-- this RunCommand element invokes the gmSL method above and moves the specified local variable declaration -->
<RunCommand id="Refactoring.MoveDeclToTop" Prams="App.frmDDProcessingList.delete.xTemp"/>
, multiple selections available,