lldb::ExpressionResults GoUserExpression::DoExecute(DiagnosticManager &diagnostic_manager, ExecutionContext &exe_ctx, const EvaluateExpressionOptions &options, lldb::UserExpressionSP &shared_ptr_to_me, lldb::ExpressionVariableSP &result) { Log *log(lldb_private::GetLogIfAnyCategoriesSet(LIBLLDB_LOG_EXPRESSIONS | LIBLLDB_LOG_STEP)); lldb_private::ExecutionPolicy execution_policy = options.GetExecutionPolicy(); lldb::ExpressionResults execution_results = lldb::eExpressionSetupError; Process *process = exe_ctx.GetProcessPtr(); Target *target = exe_ctx.GetTargetPtr(); if (target == nullptr || process == nullptr || process->GetState() != lldb::eStateStopped) { if (execution_policy == eExecutionPolicyAlways) { if (log) log->Printf("== [GoUserExpression::Evaluate] Expression may not run, " "but is not constant =="); diagnostic_manager.PutCString(eDiagnosticSeverityError, "expression needed to run but couldn't"); return execution_results; } } m_interpreter->set_use_dynamic(options.GetUseDynamic()); ValueObjectSP result_val_sp = m_interpreter->Evaluate(exe_ctx); Error err = m_interpreter->error(); m_interpreter.reset(); if (!result_val_sp) { const char *error_cstr = err.AsCString(); if (error_cstr && error_cstr[0]) diagnostic_manager.PutCString(eDiagnosticSeverityError, error_cstr); else diagnostic_manager.PutCString(eDiagnosticSeverityError, "expression can't be interpreted or run"); return lldb::eExpressionDiscarded; } result.reset(new ExpressionVariable(ExpressionVariable::eKindGo)); result->m_live_sp = result->m_frozen_sp = result_val_sp; result->m_flags |= ExpressionVariable::EVIsProgramReference; PersistentExpressionState *pv = target->GetPersistentExpressionStateForLanguage(eLanguageTypeGo); if (pv != nullptr) { result->SetName(pv->GetNextPersistentVariableName()); pv->AddVariable(result); } return lldb::eExpressionCompleted; }
void ClangPersistentVariables::RemovePersistentVariable (lldb::ExpressionVariableSP variable) { if (!variable) return; RemoveVariable(variable); const char *name = variable->GetName().AsCString(); if (*name != '$') return; name++; bool is_error = false; if (llvm::isa<SwiftASTContext>(variable->GetCompilerType().GetTypeSystem())) { switch (*name) { case 'R': break; case 'E': is_error = true; break; default: return; } name++; } uint32_t value = strtoul(name, NULL, 0); if (is_error) { if (value == m_next_persistent_error_id - 1) m_next_persistent_error_id--; } else { if (value == m_next_persistent_variable_id - 1) m_next_persistent_variable_id--; } }
void ClangPersistentVariables::RemovePersistentVariable( lldb::ExpressionVariableSP variable) { RemoveVariable(variable); const char *name = variable->GetName().AsCString(); if (*name != '$') return; name++; if (strtoul(name, NULL, 0) == m_next_persistent_variable_id - 1) m_next_persistent_variable_id--; }
void GoPersistentExpressionState::RemovePersistentVariable( lldb::ExpressionVariableSP variable) { RemoveVariable(variable); const char *name = variable->GetName().AsCString(); if (*(name++) != '$') return; if (*(name++) != 'g') return; if (*(name++) != 'o') return; if (strtoul(name, nullptr, 0) == m_next_persistent_variable_id - 1) m_next_persistent_variable_id--; }
void SwiftPersistentExpressionState::RemovePersistentVariable (lldb::ExpressionVariableSP variable) { if (!variable) return; RemoveVariable(variable); const char *name = variable->GetName().AsCString(); if (*name != '$') return; name++; bool is_error = false; switch (*name) { case 'R': break; case 'E': is_error = true; break; default: return; } name++; uint32_t value = strtoul(name, NULL, 0); if (is_error) { if (value == m_next_persistent_error_id - 1) m_next_persistent_error_id--; } else { if (value == m_next_persistent_variable_id - 1) m_next_persistent_variable_id--; } }
bool LLVMUserExpression::FinalizeJITExecution( DiagnosticManager &diagnostic_manager, ExecutionContext &exe_ctx, lldb::ExpressionVariableSP &result, lldb::addr_t function_stack_bottom, lldb::addr_t function_stack_top) { Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_EXPRESSIONS)); if (log) log->Printf("-- [UserExpression::FinalizeJITExecution] Dematerializing " "after execution --"); if (!m_dematerializer_sp) { diagnostic_manager.Printf(eDiagnosticSeverityError, "Couldn't apply expression side effects : no " "dematerializer is present"); return false; } Error dematerialize_error; m_dematerializer_sp->Dematerialize(dematerialize_error, function_stack_bottom, function_stack_top); if (!dematerialize_error.Success()) { diagnostic_manager.Printf(eDiagnosticSeverityError, "Couldn't apply expression side effects : %s", dematerialize_error.AsCString("unknown error")); return false; } result = GetResultAfterDematerialization(exe_ctx.GetBestExecutionContextScope()); if (result) result->TransferAddress(); m_dematerializer_sp.reset(); return true; }