void asCRestore::ReadByteCode(asDWORD *bc, int length) { while( length ) { asDWORD c; READ_NUM(c); *bc = asDWORD(c); bc += 1; c &= 0xFF; if( c == BC_ALLOC || c == BC_FREE || c == BC_REFCPY || c == BC_OBJTYPE ) { // Translate the index to the true object type asDWORD tmp[MAX_DATA_SIZE]; int n; for( n = 0; n < asCByteCode::SizeOfType(bcTypes[c])-1; n++ ) READ_NUM(tmp[n]); *(asCObjectType**)tmp = FindObjectType(*(int*)tmp); for( n = 0; n < asCByteCode::SizeOfType(bcTypes[c])-1; n++ ) *bc++ = tmp[n]; } else { // Read the bc as is for( int n = 1; n < asCByteCode::SizeOfType(bcTypes[c]); n++ ) READ_NUM(*bc++); } length -= 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]; } }