@@ -593,8 +593,9 @@ void KTestObjectParser::addToOrder(const std::vector<UTBotKTestObject> &objects,
593593 if (it != objects.end ()) {
594594 size_t jsonInd = it - objects.begin ();
595595 visited[jsonInd] = true ;
596- Tests::MethodParam param = {paramType.isObjectPointer () ? paramType.baseTypeObj ()
597- : paramType,
596+ Tests::MethodParam param = { paramType.isObjectPointer () && !paramType.isPointerToPointer ()
597+ ? paramType.baseTypeObj ()
598+ : paramType,
598599 paramName, std::nullopt };
599600 order.emplace (jsonInd, param, paramValue);
600601 return ;
@@ -653,8 +654,9 @@ void KTestObjectParser::assignTypeUnnamedVar(
653654 if (indexOffset != 0 ) {
654655 continue ;
655656 }
656- types::Type fieldType =
657- traverseLazyInStruct (paramType, SizeUtils::bytesToBits (offset)).type ;
657+ Tests::TypeAndVarName typeAndName = { paramType, " " };
658+ size_t offsetInStruct = getOffsetInStruct (typeAndName, SizeUtils::bytesToBits (offset));
659+ types::Type fieldType = traverseLazyInStruct (typeAndName.type , offsetInStruct).type ;
658660 if (!pointToStruct (fieldType, testCase.objects [indObj])) {
659661 continue ;
660662 }
@@ -698,6 +700,26 @@ Tests::TypeAndVarName KTestObjectParser::traverseLazyInStruct(const types::Type
698700 }
699701}
700702
703+ size_t KTestObjectParser::getOffsetInStruct (Tests::TypeAndVarName &objTypeAndName, size_t offsetInBits) const {
704+ if (!objTypeAndName.type .isPointerToPointer ()) {
705+ return offsetInBits;
706+ }
707+ std::vector<size_t > sizes = objTypeAndName.type .arraysSizes (types::PointerUsage::PARAMETER);
708+ size_t dimension = sizes.size ();
709+ objTypeAndName.type = objTypeAndName.type .baseTypeObj ();
710+ size_t sizeInBits = typesHandler.typeSize (objTypeAndName.type );
711+ size_t offset = offsetInBits / sizeInBits;
712+ std::string indices;
713+ while (dimension != 0 ) {
714+ size_t index = offset % sizes[--dimension];
715+ offset /= sizes[dimension];
716+ indices = StringUtils::stringFormat (" [%d]%s" , index, indices);
717+ }
718+ objTypeAndName.varName += indices;
719+ offsetInBits %= sizeInBits;
720+ return offsetInBits;
721+ }
722+
701723void KTestObjectParser::assignTypeStubVar (Tests::MethodTestCase &testCase,
702724 const Tests::MethodDescription &methodDescription) {
703725 for (auto const &obj : testCase.objects ) {
@@ -724,21 +746,25 @@ void KTestObjectParser::assignAllLazyPointers(
724746 continue ;
725747 }
726748 for (const auto &pointer : object.pointers ) {
727- Tests::TypeAndVarName fromPtr = traverseLazyInStruct (
728- objTypeAndName[ind]->type , SizeUtils::bytesToBits (pointer.offset ),
729- objTypeAndName[ind]->varName );
749+ Tests::TypeAndVarName typeAndName = objTypeAndName[ind].value ();
750+ size_t offset =
751+ getOffsetInStruct (typeAndName, SizeUtils::bytesToBits (pointer.offset ));
752+ Tests::TypeAndVarName fromPtr =
753+ traverseLazyInStruct (typeAndName.type , offset, typeAndName.varName );
730754 if (!objTypeAndName[pointer.index ].has_value ()) {
731755 continue ;
732756 }
733757
734758 std::string toPtrName;
735- if (pointer.indexOffset == 0 &&
759+ Tests::TypeAndVarName pointerTypeAndName = objTypeAndName[pointer.index ].value ();
760+ size_t indexOffset =
761+ getOffsetInStruct (pointerTypeAndName, SizeUtils::bytesToBits (pointer.indexOffset ));
762+ if (indexOffset == 0 &&
736763 pointToStruct (fromPtr.type , testCase.objects [pointer.index ])) {
737- toPtrName = objTypeAndName[pointer. index ]-> varName ;
764+ toPtrName = pointerTypeAndName. varName ;
738765 } else {
739- toPtrName = traverseLazyInStruct (objTypeAndName[pointer.index ]->type ,
740- SizeUtils::bytesToBits (pointer.indexOffset ),
741- objTypeAndName[pointer.index ]->varName ).varName ;
766+ toPtrName = traverseLazyInStruct (pointerTypeAndName.type , indexOffset,
767+ pointerTypeAndName.varName ).varName ;
742768 }
743769
744770 testCase.lazyReferences .emplace_back (
0 commit comments