| 124 | }*/ |
| 125 | |
| 126 | void DwMethodMatcher::CompareMethods(DbgSubprogram* prevMethodInstance, DwTypeVector* prevGenericArgumentsSubstitute, |
| 127 | DbgSubprogram* newMethodInstance, DwTypeVector* genericArgumentsSubstitute, |
| 128 | bool* outNewIsBetter, bool* outNewIsWorse, bool allowSpecializeFail) |
| 129 | { |
| 130 | int numUsedParams = 0; |
| 131 | int prevNumUsedParams = 0; |
| 132 | bool usedExtendedForm = false; |
| 133 | bool prevUsedExtendedForm = false; |
| 134 | |
| 135 | bool isBetter = false; |
| 136 | bool isWorse = false; |
| 137 | int argIdx = 0; |
| 138 | |
| 139 | DbgSubprogram* prevMethodDef = prevMethodInstance; |
| 140 | DbgSubprogram* newMethodDef = newMethodInstance; |
| 141 | |
| 142 | #define SET_BETTER_OR_WORSE(lhs, rhs) \ |
| 143 | if ((lhs) && !(rhs)) isBetter = true; \ |
| 144 | if (!(lhs) && (rhs)) isWorse = true; |
| 145 | |
| 146 | int newArgOffset = newMethodInstance->mHasThis ? 1 : 0; |
| 147 | int prevArgOffset = prevMethodInstance->mHasThis ? 1 : 0; |
| 148 | |
| 149 | DbgVariable* param = newMethodInstance->mParams.mHead; |
| 150 | if (newMethodInstance->mHasThis) |
| 151 | param = param->mNext; |
| 152 | DbgVariable* prevParam = prevMethodInstance->mParams.mHead; |
| 153 | if (prevMethodInstance->mHasThis) |
| 154 | prevParam = prevParam->mNext; |
| 155 | |
| 156 | for (argIdx = 0; argIdx < (int) mArguments.size(); argIdx++) |
| 157 | { |
| 158 | DbgTypedValue arg = mArguments[argIdx]; |
| 159 | DbgType* paramType = param->mType; |
| 160 | DbgType* prevParamType = prevParam->mType; |
| 161 | |
| 162 | numUsedParams++; |
| 163 | prevNumUsedParams++; |
| 164 | |
| 165 | /*if ((genericArgumentsSubstitute != NULL) && (paramType->IsUnspecializedType())) |
| 166 | paramType = mModule->SpecializeMethodType(paramType, *genericArgumentsSubstitute, allowSpecializeFail); |
| 167 | if (prevParamType->IsUnspecializedType()) |
| 168 | prevParamType = mModule->SpecializeMethodType(prevParamType, *prevGenericArgumentsSubstitute, allowSpecializeFail);*/ |
| 169 | |
| 170 | //paramType = paramType->RemoveModifiers(); |
| 171 | //prevParamType = prevParamType->RemoveModifiers(); |
| 172 | |
| 173 | if (paramType != prevParamType) |
| 174 | { |
| 175 | /*if ((paramType->IsGenericParam()) || (prevParamType->IsGenericParam())) |
| 176 | { |
| 177 | BF_ASSERT(allowSpecializeFail); |
| 178 | if (!prevParamType->IsGenericParam()) |
| 179 | isBetter = true; |
| 180 | else if (!paramType->IsGenericParam()) |
| 181 | isWorse = true; |
| 182 | } |
| 183 | else*/ if ((paramType->IsInteger()) && (prevParamType->IsInteger())) |