void asCRestore::TranslateFunction(asCScriptFunction *func) { asDWORD *bc = func->byteCode.AddressOf(); for( asUINT n = 0; n < func->byteCode.GetLength(); ) { int c = bc[n]&0xFF; if( c == BC_TYPEID ) { // Translate the index to the type id int *tid = (int*)&bc[n+1]; *tid = FindTypeId(*tid); } n += asCByteCode::SizeOfType(bcTypes[c]); } }
void asCRestore::TranslateFunction(asCScriptFunction *func) { asDWORD *bc = func->byteCode.AddressOf(); for( asUINT n = 0; n < func->byteCode.GetLength(); ) { int c = *(asBYTE*)&bc[n]; if( c == asBC_FREE || c == asBC_REFCPY || c == asBC_OBJTYPE ) { // Translate the index to the true object type asPTRWORD *ot = (asPTRWORD*)&bc[n+1]; *(asCObjectType**)ot = FindObjectType(*(int*)ot); } else if( c == asBC_TYPEID ) { // Translate the index to the type id int *tid = (int*)&bc[n+1]; *tid = FindTypeId(*tid); } else if( c == asBC_CALL || c == asBC_CALLINTF || c == asBC_CALLSYS ) { // Translate the index to the func id int *fid = (int*)&bc[n+1]; *fid = FindFunction(*fid)->id; } else if( c == asBC_ALLOC ) { // Translate the index to the true object type asPTRWORD *arg = (asPTRWORD*)&bc[n+1]; *(asCObjectType**)arg = FindObjectType(*(int*)arg); // If the object type is a script class then the constructor id must be translated asCObjectType *ot = *(asCObjectType**)arg; if( ot->flags & asOBJ_SCRIPT_OBJECT ) { int *fid = (int*)&bc[n+1+AS_PTR_SIZE]; *fid = FindFunction(*fid)->id; } } n += asBCTypeSize[asBCInfo[c].type]; } }