| 3018 | } |
| 3019 | |
| 3020 | void BfSystem::InjectNewRevision(BfTypeDef* typeDef) |
| 3021 | { |
| 3022 | BfLogSys(this, "InjectNewRevision from %p (decl:%p) into %p (decl:%p)\n", typeDef->mNextRevision, typeDef->mNextRevision->mTypeDeclaration, typeDef, typeDef->mTypeDeclaration); |
| 3023 | |
| 3024 | bool setDeclaringType = !typeDef->mIsCombinedPartial; |
| 3025 | |
| 3026 | auto nextTypeDef = typeDef->mNextRevision; |
| 3027 | |
| 3028 | for (auto prevProperty : typeDef->mProperties) |
| 3029 | delete prevProperty; |
| 3030 | typeDef->mProperties = nextTypeDef->mProperties; |
| 3031 | if (setDeclaringType) |
| 3032 | for (auto prop : typeDef->mProperties) |
| 3033 | prop->mDeclaringType = typeDef; |
| 3034 | nextTypeDef->mProperties.Clear(); |
| 3035 | |
| 3036 | if ((typeDef->mDefState != BfTypeDef::DefState_Signature_Changed) && |
| 3037 | (typeDef->mDefState != BfTypeDef::DefState_New)) |
| 3038 | { |
| 3039 | BF_ASSERT(typeDef->mMethods.size() == nextTypeDef->mMethods.size()); |
| 3040 | |
| 3041 | for (auto prop : typeDef->mProperties) |
| 3042 | { |
| 3043 | for (int methodIdx = 0; methodIdx < (int)prop->mMethods.size(); methodIdx++) |
| 3044 | prop->mMethods[methodIdx] = typeDef->mMethods[prop->mMethods[methodIdx]->mIdx]; |
| 3045 | } |
| 3046 | |
| 3047 | for (int opIdx = 0; opIdx < (int)typeDef->mOperators.size(); opIdx++) |
| 3048 | { |
| 3049 | typeDef->mOperators[opIdx] = (BfOperatorDef*)typeDef->mMethods[typeDef->mOperators[opIdx]->mIdx]; |
| 3050 | } |
| 3051 | |
| 3052 | // Remap methods in-place to previous revision's method list |
| 3053 | for (int methodIdx = 0; methodIdx < (int)typeDef->mMethods.size(); methodIdx++) |
| 3054 | { |
| 3055 | auto methodDef = typeDef->mMethods[methodIdx]; |
| 3056 | auto nextMethodDef = nextTypeDef->mMethods[methodIdx]; |
| 3057 | bool codeChanged = nextMethodDef->mFullHash != methodDef->mFullHash; |
| 3058 | |
| 3059 | for (auto genericParam : methodDef->mGenericParams) |
| 3060 | delete genericParam; |
| 3061 | for (auto param : methodDef->mParams) |
| 3062 | delete param; |
| 3063 | |
| 3064 | if (nextMethodDef->mMethodType == BfMethodType_Operator) |
| 3065 | { |
| 3066 | auto operatorDef = (BfOperatorDef*)methodDef; |
| 3067 | auto nextOperatorDef = (BfOperatorDef*)nextMethodDef; |
| 3068 | *operatorDef = *nextOperatorDef; |
| 3069 | if (setDeclaringType) |
| 3070 | operatorDef->mDeclaringType = typeDef; |
| 3071 | } |
| 3072 | else |
| 3073 | { |
| 3074 | *methodDef = *nextMethodDef; |
| 3075 | if (setDeclaringType) |
| 3076 | methodDef->mDeclaringType = typeDef; |
| 3077 | } |
no test coverage detected