MCPcopy Create free account
hub / github.com/GaijinEntertainment/daScript / sv_trySimulate_Field

Method sv_trySimulate_Field

src/ast/ast_simulate.cpp:2388–2444  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

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

Callers

nothing calls this directly

Calls 10

simulateExpressionFunction · 0.85
isBitfieldMethod · 0.80
isPointerMethod · 0.80
isVariantMethod · 0.80
getVariantFieldOffsetMethod · 0.80
getTupleFieldOffsetMethod · 0.80
getR2VTypeMethod · 0.80
getFieldOffsetMethod · 0.45
allocateNameMethod · 0.45
describeMethod · 0.45

Tested by

no test coverage detected