ValueObjectSP GoUserExpression::GoInterpreter::VisitIndexExpr(const lldb_private::GoASTIndexExpr *e) { ValueObjectSP target = EvaluateExpr(e->GetX()); if (!target) return nullptr; ValueObjectSP index = EvaluateExpr(e->GetIndex()); if (!index) return nullptr; bool is_signed; if (!index->GetCompilerType().IsIntegerType(is_signed)) { m_error.SetErrorString("Unsupported index"); return nullptr; } size_t idx; if (is_signed) idx = index->GetValueAsSigned(0); else idx = index->GetValueAsUnsigned(0); if (GoASTContext::IsGoSlice(target->GetCompilerType())) { target = target->GetStaticValue(); ValueObjectSP cap = target->GetChildMemberWithName(ConstString("cap"), true); if (cap) { uint64_t capval = cap->GetValueAsUnsigned(0); if (idx >= capval) { m_error.SetErrorStringWithFormat("Invalid index %" PRIu64 " , cap = %" PRIu64, uint64_t(idx), capval); return nullptr; } } target = target->GetChildMemberWithName(ConstString("array"), true); if (target && m_use_dynamic != eNoDynamicValues) { ValueObjectSP dynamic = target->GetDynamicValue(m_use_dynamic); if (dynamic) target = dynamic; } if (!target) return nullptr; return target->GetSyntheticArrayMember(idx, true); } return target->GetChildAtIndex(idx, true); }