@@ -1169,90 +1169,58 @@ bool DbgEngTTDAdapter::ParseTTDCallObjects(const std::string& expression, std::v
11691169 ComPtr<IModelObject> timeStartObj;
11701170 if (SUCCEEDED (callObject->GetKeyValue (L" TimeStart" , &timeStartObj, nullptr )))
11711171 {
1172- // TTD Position is typically in format "sequence:step"
1173- VARIANT vtTimeStart;
1174- VariantInit (&vtTimeStart);
1175- if (SUCCEEDED (timeStartObj->GetIntrinsicValueAs (VT_BSTR, &vtTimeStart)))
1172+ // TimeStart is typically a TTD position object with Sequence and Steps
1173+ ComPtr<IModelObject> sequenceObj, stepsObj;
1174+ if (SUCCEEDED (timeStartObj->GetKeyValue (L" Sequence" , &sequenceObj, nullptr )))
11761175 {
1177- _bstr_t bstr (vtTimeStart.bstrVal );
1178- std::string timeStartStr = std::string (bstr);
1179-
1180- // Parse "sequence:step" format
1181- size_t colonPos = timeStartStr.find (' :' );
1182- if (colonPos != std::string::npos)
1176+ VARIANT vtSequence;
1177+ VariantInit (&vtSequence);
1178+ if (SUCCEEDED (sequenceObj->GetIntrinsicValueAs (VT_UI8, &vtSequence)))
11831179 {
1184- try
1185- {
1186- std::string sequenceStr = timeStartStr.substr (0 , colonPos);
1187- std::string stepStr = timeStartStr.substr (colonPos + 1 );
1188-
1189- // Handle hex format if present
1190- if (sequenceStr.find (" 0x" ) == 0 || sequenceStr.find (" 0X" ) == 0 )
1191- event.timeStart .sequence = std::stoull (sequenceStr, nullptr , 16 );
1192- else
1193- event.timeStart .sequence = std::stoull (sequenceStr, nullptr , 16 ); // TTD positions are typically hex
1194-
1195- if (stepStr.find (" 0x" ) == 0 || stepStr.find (" 0X" ) == 0 )
1196- event.timeStart .step = std::stoull (stepStr, nullptr , 16 );
1197- else
1198- event.timeStart .step = std::stoull (stepStr, nullptr , 16 ); // TTD positions are typically hex
1199- }
1200- catch (const std::exception& e)
1201- {
1202- LogWarn (" Failed to parse TimeStart position: %s" , timeStartStr.c_str ());
1203- }
1180+ event.timeStart .sequence = vtSequence.ullVal ;
12041181 }
1182+ VariantClear (&vtSequence);
1183+ }
1184+
1185+ if (SUCCEEDED (timeStartObj->GetKeyValue (L" Steps" , &stepsObj, nullptr )))
1186+ {
1187+ VARIANT vtSteps;
1188+ VariantInit (&vtSteps);
1189+ if (SUCCEEDED (stepsObj->GetIntrinsicValueAs (VT_UI8, &vtSteps)))
1190+ {
1191+ event.timeStart .step = vtSteps.ullVal ;
1192+ }
1193+ VariantClear (&vtSteps);
12051194 }
1206- VariantClear (&vtTimeStart);
12071195 }
12081196
12091197 // Parse TimeEnd
12101198 ComPtr<IModelObject> timeEndObj;
12111199 if (SUCCEEDED (callObject->GetKeyValue (L" TimeEnd" , &timeEndObj, nullptr )))
12121200 {
1213- VARIANT vtTimeEnd;
1214- VariantInit (&vtTimeEnd) ;
1215- if (SUCCEEDED (timeEndObj->GetIntrinsicValueAs (VT_BSTR , &vtTimeEnd )))
1201+ // TimeEnd is typically a TTD position object with Sequence and Steps
1202+ ComPtr<IModelObject> sequenceObj, stepsObj ;
1203+ if (SUCCEEDED (timeEndObj->GetKeyValue ( L" Sequence " , &sequenceObj, nullptr )))
12161204 {
1217- _bstr_t bstr (vtTimeEnd.bstrVal );
1218- std::string timeEndStr = std::string (bstr);
1219-
1220- // Handle "Max Position" case
1221- if (timeEndStr.find (" Max Position" ) != std::string::npos)
1205+ VARIANT vtSequence;
1206+ VariantInit (&vtSequence);
1207+ if (SUCCEEDED (sequenceObj->GetIntrinsicValueAs (VT_UI8, &vtSequence)))
12221208 {
1223- event.timeEnd .sequence = UINT64_MAX;
1224- event.timeEnd .step = UINT64_MAX;
1209+ event.timeEnd .sequence = vtSequence.ullVal ;
12251210 }
1226- else
1211+ VariantClear (&vtSequence);
1212+ }
1213+
1214+ if (SUCCEEDED (timeEndObj->GetKeyValue (L" Steps" , &stepsObj, nullptr )))
1215+ {
1216+ VARIANT vtSteps;
1217+ VariantInit (&vtSteps);
1218+ if (SUCCEEDED (stepsObj->GetIntrinsicValueAs (VT_UI8, &vtSteps)))
12271219 {
1228- // Parse "sequence:step" format
1229- size_t colonPos = timeEndStr.find (' :' );
1230- if (colonPos != std::string::npos)
1231- {
1232- try
1233- {
1234- std::string sequenceStr = timeEndStr.substr (0 , colonPos);
1235- std::string stepStr = timeEndStr.substr (colonPos + 1 );
1236-
1237- // Handle hex format if present
1238- if (sequenceStr.find (" 0x" ) == 0 || sequenceStr.find (" 0X" ) == 0 )
1239- event.timeEnd .sequence = std::stoull (sequenceStr, nullptr , 16 );
1240- else
1241- event.timeEnd .sequence = std::stoull (sequenceStr, nullptr , 16 ); // TTD positions are typically hex
1242-
1243- if (stepStr.find (" 0x" ) == 0 || stepStr.find (" 0X" ) == 0 )
1244- event.timeEnd .step = std::stoull (stepStr, nullptr , 16 );
1245- else
1246- event.timeEnd .step = std::stoull (stepStr, nullptr , 16 ); // TTD positions are typically hex
1247- }
1248- catch (const std::exception& e)
1249- {
1250- LogWarn (" Failed to parse TimeEnd position: %s" , timeEndStr.c_str ());
1251- }
1252- }
1220+ event.timeEnd .step = vtSteps.ullVal ;
12531221 }
1222+ VariantClear (&vtSteps);
12541223 }
1255- VariantClear (&vtTimeEnd);
12561224 }
12571225
12581226 events.push_back (event);
0 commit comments