| 3270 | } |
| 3271 | |
| 3272 | bool CGenerator::containsByrefParamToFree(DataType *dataType, set<DataType *> &dataTypes) |
| 3273 | { |
| 3274 | // For loops from forward declaration detection. |
| 3275 | if (dataTypes.insert(dataType).second) |
| 3276 | { |
| 3277 | DataType *trueDataType = dataType->getTrueContainerDataType(); |
| 3278 | if (trueDataType->isStruct()) |
| 3279 | { |
| 3280 | StructType *structType = dynamic_cast<StructType *>(trueDataType); |
| 3281 | assert(structType != nullptr); |
| 3282 | |
| 3283 | for (StructMember *structMember : structType->getMembers()) |
| 3284 | { |
| 3285 | if ((structMember->isByref() && !findAnnotation(structMember, SHARED_ANNOTATION)) || |
| 3286 | containsByrefParamToFree(structMember->getDataType(), dataTypes)) |
| 3287 | { |
| 3288 | return true; |
| 3289 | } |
| 3290 | } |
| 3291 | } |
| 3292 | else if (trueDataType->isUnion()) |
| 3293 | { |
| 3294 | UnionType *unionType = dynamic_cast<UnionType *>(trueDataType); |
| 3295 | assert(unionType != nullptr); |
| 3296 | |
| 3297 | for (StructMember *structMember : unionType->getUnionMembers().getMembers()) |
| 3298 | { |
| 3299 | if ((structMember->isByref() && !findAnnotation(structMember, SHARED_ANNOTATION)) || |
| 3300 | containsByrefParamToFree(structMember->getDataType(), dataTypes)) |
| 3301 | { |
| 3302 | return true; |
| 3303 | } |
| 3304 | } |
| 3305 | } |
| 3306 | } |
| 3307 | return false; |
| 3308 | } |
| 3309 | |
| 3310 | bool CGenerator::isListStruct(const StructType *structType) |
| 3311 | { |
nothing calls this directly
no test coverage detected