Dear all,
I need to compile the scripts into bytecode, and load and execute them in a completely different environment.
I compile the scripts with a slightly modified version of the asbuild.
The the other environment I implemente the corresponding slightly modified version of asrun.
The problem is when the script references a cdecl external function declared in the environment.
I boiled down the issue to this script:
void main(void)
{
SystemFunc(0, 123);
}
I succesfully register this function in the engine both when I succesfully compile the script and when I try to execute it, with:
engine->RegisterGlobalFunction("void SystemFunc(uint, int)", asFUNCTION(SystemFunc), asCALL_CDECL);
But then the LoadByteCode function fails apparently because it does not find the function.
Further analysis led me to the call sequence into the asCReader object:
Read -> ReadInner -> ReadUsedFunctions -> IsSignatureEqual.
After few nested calls it end up into asCScriptFunction::IsSignatureExceptNameAndReturnTypeEqual where there is the following code:
if(this->isReadOnly != readOnly) return false;
if(this->inOutFlags != paramInOut) return false;
if(this->parameterTypes != paramTypes) return false;
if((this->objectType != 0) != (objType != 0)) return false;
return true;
Where everything matches but the pointer to parameterType. I am quite sure that the contents of the parameters type are pretty the same, but simply they are two different copies of the same thing. And they do not match.
I need some suggestion about the way out of this issue.
Maybe I have made something wrong, and any help is appreciated. Note that if I compile the script in the same environment everything works as aexpected.
The best way, I think to solve is to mach the parameters when they are created and make only one copy, but I donìt know where to look.
The other way is to match the contents of the parameters, rather than pointers ...
Any suggestion?
Thanks.
Mau.