| 439 | //----------------------------------------------------------------------------- |
| 440 | |
| 441 | static void InsertVtblPtr(const CXXMethodDecl* stmt, const CXXRecordDecl* cur, StmtsContainer& bodyStmts) |
| 442 | { |
| 443 | if(cur->isPolymorphic() and (0 == cur->getNumBases())) { |
| 444 | auto* fieldDecl = CfrontCodeGenerator::VtableData().VtblPtrField(cur); |
| 445 | auto* lhsMemberExpr = AccessMember(kwInternalThis, fieldDecl, Ptr(GetRecordDeclType(cur))); |
| 446 | |
| 447 | // struct __mptr *__ptbl_vec__c___src_C_[] |
| 448 | auto* vtablAr = CfrontCodeGenerator::VtableData().VtblArrayVar(1); |
| 449 | auto* vtblArrayPos = |
| 450 | ArraySubscript(mkDeclRefExpr(vtablAr), GetGlobalVtablePos(stmt->getParent(), cur), fieldDecl->getType()); |
| 451 | |
| 452 | bodyStmts.AddBodyStmts(Assign(lhsMemberExpr, fieldDecl, vtblArrayPos)); |
| 453 | |
| 454 | } else if(cur->isPolymorphic() and (0 < cur->getNumBases()) and (cur != stmt->getParent())) { |
| 455 | for(const auto& base : cur->bases()) { |
| 456 | InsertVtblPtr(stmt, base.getType()->getAsCXXRecordDecl(), bodyStmts); |
| 457 | } |
| 458 | } |
| 459 | } |
| 460 | //----------------------------------------------------------------------------- |
| 461 | |
| 462 | void CfrontCodeGenerator::InsertCXXMethodDecl(const CXXMethodDecl* stmt, SkipBody) |
no test coverage detected