// we need to return list of children for a variable // we stashed the variables we got so far inside a map void CodeLiteLLDBApp::ExpandVariable(const LLDBCommand& command) { int variableId = command.GetLldbId(); if(variableId == wxNOT_FOUND) { return; } LLDBVariable::Vect_t children; std::map<int, VariableWrapper>::iterator iter = m_variables.find(variableId); if(iter != m_variables.end()) { lldb::SBValue* pvalue = &(iter->second.value); lldb::SBValue deReferencedValue; int size = pvalue->GetNumChildren(); lldb::TypeClass typeClass = pvalue->GetType().GetTypeClass(); if(typeClass & lldb::eTypeClassArray) { size > (int)m_settings.GetMaxArrayElements() ? size = m_settings.GetMaxArrayElements() : size = size; wxPrintf("codelite-lldb: value %s is an array. Limiting its size\n", pvalue->GetName()); } /*else if ( typeClass & lldb::eTypeClassPointer ) { // dereference is needed wxPrintf("codelite-lldb: value '%s' is a class pointer, dereferecning it\n", pvalue->GetName()); deReferencedValue = pvalue->Dereference(); // and update the number of children pvalue = &deReferencedValue; wxPrintf("codelite-lldb: new number of children is set to %d\n", size); size = pvalue->GetNumChildren(); }*/ for(int i = 0; i < size; ++i) { lldb::SBValue child = pvalue->GetChildAtIndex(i); if(child.IsValid()) { LLDBVariable::Ptr_t var(new LLDBVariable(child)); children.push_back(var); VariableWrapper wrapper; wrapper.value = child; m_variables.insert(std::make_pair(child.GetID(), wrapper)); } } LLDBReply reply; reply.SetReplyType(kReplyTypeVariableExpanded); reply.SetVariables(children); reply.SetLldbId(variableId); SendReply(reply); } }
void CodeLiteLLDBApp::DeleteWatch(const LLDBCommand& command) { // Remove it from the m_variables table int lldbID = command.GetLldbId(); wxString expression; std::map<int, VariableWrapper>::iterator iter = m_variables.find(lldbID); if(iter != m_variables.end()) { expression = iter->second.expression; wxPrintf("codelite-lldb: deleting watch '%s'\n", expression); m_variables.erase(iter); } // remove it from the watch list int where = m_watches.Index(expression); if(where != wxNOT_FOUND) { m_watches.RemoveAt(where); } }