| 4172 | } |
| 4173 | |
| 4174 | DbgType* COFF::CvGetTypeOrNamespace(char* name, DbgLanguage language) |
| 4175 | { |
| 4176 | if (language == DbgLanguage_Unknown) |
| 4177 | { |
| 4178 | if (strncmp(name, "_bf::", 5) == 0) |
| 4179 | { |
| 4180 | language = DbgLanguage_Beef; |
| 4181 | name += 5; |
| 4182 | } |
| 4183 | else if ((name[0] == 'G') && (name[1] == '$')) |
| 4184 | { |
| 4185 | language = DbgLanguage_Beef; |
| 4186 | } |
| 4187 | else |
| 4188 | { |
| 4189 | language = DbgLanguage_C; |
| 4190 | |
| 4191 | // Check for a primitive array type like 'double[]' |
| 4192 | for (int i = 0; i < 10; i++) |
| 4193 | { |
| 4194 | char c = name[i]; |
| 4195 | if (c == 0) |
| 4196 | break; |
| 4197 | if (c == '[') |
| 4198 | language = DbgLanguage_Beef; |
| 4199 | } |
| 4200 | } |
| 4201 | } |
| 4202 | |
| 4203 | auto linkedModule = GetLinkedModule(); |
| 4204 | |
| 4205 | auto dbgTypeEntry = linkedModule->mTypeMap.Find(name, language); |
| 4206 | if (dbgTypeEntry != NULL) |
| 4207 | { |
| 4208 | auto dbgType = dbgTypeEntry->mValue; |
| 4209 | if (dbgType->mHotNewType != NULL) |
| 4210 | return dbgType->mHotNewType; |
| 4211 | return dbgType; |
| 4212 | } |
| 4213 | |
| 4214 | // It's possible that we get a reference to a template name that isn't actually in our type database |
| 4215 | // These may indicate VS compiler bugs or anonymous namespaces |
| 4216 | bool isValidName = true; |
| 4217 | for (const char* cPtr = name; *cPtr != '\0'; cPtr++) |
| 4218 | if ((*cPtr == '<') || (*cPtr == '`') || (*cPtr == '$')) |
| 4219 | isValidName = false; |
| 4220 | if (!isValidName) |
| 4221 | return NULL; |
| 4222 | |
| 4223 | //OutputDebugStrF("CvGetTypeOrNamespace Creating: %s\n", name); |
| 4224 | |
| 4225 | char* lastDblColon = (char*)GetLastDoubleColon(name); |
| 4226 | |
| 4227 | DbgType* dbgType = CvCreateType(); |
| 4228 | |
| 4229 | DbgType* parentType = mMasterCompileUnit->mGlobalType; |
| 4230 | if (lastDblColon != NULL) |
| 4231 | { |
nothing calls this directly
no test coverage detected