| 3365 | } |
| 3366 | |
| 3367 | bool CGenerator::setDiscriminatorTemp(UnionType *unionType, StructType *structType, StructMember *structMember, |
| 3368 | bool isFunctionParam, data_map &templateData) |
| 3369 | { |
| 3370 | bool needTempVariableI32 = false; |
| 3371 | if (structType) |
| 3372 | { |
| 3373 | string discriminatorName; |
| 3374 | Symbol *disSymbol; |
| 3375 | |
| 3376 | if (unionType->isNonEncapsulatedUnion()) |
| 3377 | { |
| 3378 | discriminatorName = getAnnStringValue(structMember, DISCRIMINATOR_ANNOTATION); |
| 3379 | disSymbol = m_globals->getSymbol(discriminatorName, false); |
| 3380 | if (isFunctionParam || disSymbol) |
| 3381 | { |
| 3382 | templateData["dataLiteral"] = ""; |
| 3383 | } |
| 3384 | else |
| 3385 | { |
| 3386 | templateData["dataLiteral"] = "data->"; |
| 3387 | } |
| 3388 | } |
| 3389 | else |
| 3390 | { |
| 3391 | disSymbol = nullptr; |
| 3392 | templateData["dataLiteral"] = "data->"; |
| 3393 | discriminatorName = unionType->getDiscriminatorName(); |
| 3394 | } |
| 3395 | |
| 3396 | DataType *disType; |
| 3397 | if (disSymbol) |
| 3398 | { |
| 3399 | templateData["isConstant"] = true; |
| 3400 | ConstType *constType = dynamic_cast<ConstType *>(disSymbol); |
| 3401 | assert(constType); |
| 3402 | disType = constType->getDataType(); |
| 3403 | } |
| 3404 | else |
| 3405 | { |
| 3406 | templateData["isConstant"] = false; |
| 3407 | disSymbol = structType->getScope().getSymbol(discriminatorName); |
| 3408 | assert(disSymbol); |
| 3409 | StructMember *disMember = dynamic_cast<StructMember *>(disSymbol); |
| 3410 | assert(disMember); |
| 3411 | disType = disMember->getDataType(); |
| 3412 | } |
| 3413 | |
| 3414 | BuiltinType *disBuiltin = dynamic_cast<BuiltinType *>(disType->getTrueDataType()); |
| 3415 | if (disBuiltin && disBuiltin->getBuiltinType() == BuiltinType::builtin_type_t::kInt32Type) |
| 3416 | { |
| 3417 | templateData["castDiscriminator"] = false; |
| 3418 | } |
| 3419 | else |
| 3420 | { |
| 3421 | needTempVariableI32 = true; |
| 3422 | templateData["castDiscriminator"] = true; |
| 3423 | templateData["discriminatorType"] = disType->getName(); |
| 3424 | } |
nothing calls this directly
no test coverage detected