| 2386 | } |
| 2387 | |
| 2388 | SimNode * SimulateVisitor::sv_trySimulate_Field(const ExprField * expr, uint32_t extraOffset, const TypeDeclPtr & r2vType) { |
| 2389 | const auto &at = expr->at; |
| 2390 | if ( expr->value->type->isBitfield() ) { |
| 2391 | return nullptr; |
| 2392 | } |
| 2393 | int fieldOffset = -1; |
| 2394 | if ( !expr->fieldRef && expr->fieldIndex==-1 ) { |
| 2395 | fieldOffset = (int) expr->annotation->getFieldOffset(expr->name); |
| 2396 | } else if ( expr->fieldIndex != - 1 ) { |
| 2397 | if ( expr->value->type->isPointer() ) { |
| 2398 | if ( expr->value->type->firstType->isVariant() ) { |
| 2399 | fieldOffset = expr->value->type->firstType->getVariantFieldOffset(expr->fieldIndex); |
| 2400 | } else { |
| 2401 | fieldOffset = expr->value->type->firstType->getTupleFieldOffset(expr->fieldIndex); |
| 2402 | } |
| 2403 | } else { |
| 2404 | if ( expr->value->type->isVariant() ) { |
| 2405 | fieldOffset = expr->value->type->getVariantFieldOffset(expr->fieldIndex); |
| 2406 | } else { |
| 2407 | fieldOffset = expr->value->type->getTupleFieldOffset(expr->fieldIndex); |
| 2408 | } |
| 2409 | } |
| 2410 | } else { |
| 2411 | DAS_ASSERTF(expr->fieldRef, "field can't be null"); |
| 2412 | if (!expr->fieldRef) return nullptr; |
| 2413 | fieldOffset = expr->fieldRef->offset; |
| 2414 | } |
| 2415 | DAS_ASSERTF(fieldOffset>=0,"field offset is somehow not there"); |
| 2416 | if (expr->value->type->isPointer()) { |
| 2417 | if ( expr->unsafeDeref ) { |
| 2418 | auto simV = simulateExpression(expr->value); |
| 2419 | if ( r2vType->baseType!=Type::none ) { |
| 2420 | return context.code->makeValueNode<SimNode_FieldDerefR2V>(r2vType->getR2VType(), at, simV, fieldOffset + extraOffset); |
| 2421 | } else { |
| 2422 | return context.code->makeNode<SimNode_FieldDeref>(at, simV, fieldOffset + extraOffset); |
| 2423 | } |
| 2424 | } else { |
| 2425 | auto simV = simulateExpression(expr->value); |
| 2426 | auto errorMessage = context.code->allocateName(", "+expr->value->describe()+" is null"); |
| 2427 | if ( r2vType->baseType!=Type::none ) { |
| 2428 | return context.code->makeValueNode<SimNode_PtrFieldDerefR2V>(r2vType->getR2VType(), at, simV, fieldOffset + extraOffset, errorMessage); |
| 2429 | } else { |
| 2430 | return context.code->makeNode<SimNode_PtrFieldDeref>(at, simV, fieldOffset + extraOffset, errorMessage); |
| 2431 | } |
| 2432 | } |
| 2433 | } else { |
| 2434 | if ( auto chain = sv_trySimulate(expr->value, extraOffset + fieldOffset, r2vType) ) { |
| 2435 | return chain; |
| 2436 | } |
| 2437 | auto simV = simulateExpression(expr->value); |
| 2438 | if ( r2vType->baseType!=Type::none ) { |
| 2439 | return context.code->makeValueNode<SimNode_FieldDerefR2V>(r2vType->getR2VType(), at, simV, extraOffset + fieldOffset); |
| 2440 | } else { |
| 2441 | return context.code->makeNode<SimNode_FieldDeref>(at, simV, extraOffset + fieldOffset); |
| 2442 | } |
| 2443 | } |
| 2444 | } |
| 2445 |
nothing calls this directly
no test coverage detected