diff options
author | Sean Callanan <scallanan@apple.com> | 2011-08-23 21:20:51 +0000 |
---|---|---|
committer | Sean Callanan <scallanan@apple.com> | 2011-08-23 21:20:51 +0000 |
commit | bccce81340ce87a89df0cf8eabc7389d4a563976 (patch) | |
tree | c52c2847ba8cefcdf2227e0d9fe43812737139d9 /lldb/source/Commands/CommandObjectExpression.cpp | |
parent | fd13f6f56aa36951fdd971ea97973e8e3446a4b6 (diff) | |
download | bcm5719-llvm-bccce81340ce87a89df0cf8eabc7389d4a563976.tar.gz bcm5719-llvm-bccce81340ce87a89df0cf8eabc7389d4a563976.zip |
Added support for persistent types to the
expression parser. You can use a persistent
type like this:
(lldb) expr struct $foo { int a; int b; };
(lldb) struct $foo i; i.a = 2; i.b = 3; i
($foo) $0 = {
(int) a = 2
(int) b = 3
}
typedefs work similarly.
This patch affects the following files:
test/expression_command/persistent_types/*
A test case for persistent types,
in particular structs and typedefs.
ClangForward.h
Added TypeDecl, needed to declare some
functions in ASTResultSynthesizer.h
ClangPersistentVariables.[h,cpp]
Added a list of persistent types to the
persistent variable store.
ASTResultSynthesizer.[h,cpp]
Made the AST result synthesizer iterate
across TypeDecls in the expression, and
record any persistent types found. Also
made a minor documentation fix.
ClangUserExpression.[h,cpp]
Extended the user expression class to
keep the state needed to report the
persistent variable store for the target
to the AST result synthesizers.
Also introduced a new error code for
expressions that executed normally but
did not return a result.
CommandObjectExpression.cpp
Improved output for expressions (like
declarations of new persistent types) that
don't return a result. This is no longer
treated as an error.
llvm-svn: 138383
Diffstat (limited to 'lldb/source/Commands/CommandObjectExpression.cpp')
-rw-r--r-- | lldb/source/Commands/CommandObjectExpression.cpp | 36 |
1 files changed, 23 insertions, 13 deletions
diff --git a/lldb/source/Commands/CommandObjectExpression.cpp b/lldb/source/Commands/CommandObjectExpression.cpp index ca5ca1520f1..694c904391e 100644 --- a/lldb/source/Commands/CommandObjectExpression.cpp +++ b/lldb/source/Commands/CommandObjectExpression.cpp @@ -347,24 +347,34 @@ CommandObjectExpression::EvaluateExpression } else { - const char *error_cstr = result_valobj_sp->GetError().AsCString(); - if (error_cstr && error_cstr[0]) + if (result_valobj_sp->GetError().GetError() == ClangUserExpression::kNoResult) { - int error_cstr_len = strlen (error_cstr); - const bool ends_with_newline = error_cstr[error_cstr_len - 1] == '\n'; - if (strstr(error_cstr, "error:") != error_cstr) - error_stream->PutCString ("error: "); - error_stream->Write(error_cstr, error_cstr_len); - if (!ends_with_newline) - error_stream->EOL(); + error_stream->PutCString("<no result>\n"); + + if (result) + result->SetStatus (eReturnStatusSuccessFinishResult); } else { - error_stream->PutCString ("error: unknown error\n"); + const char *error_cstr = result_valobj_sp->GetError().AsCString(); + if (error_cstr && error_cstr[0]) + { + int error_cstr_len = strlen (error_cstr); + const bool ends_with_newline = error_cstr[error_cstr_len - 1] == '\n'; + if (strstr(error_cstr, "error:") != error_cstr) + error_stream->PutCString ("error: "); + error_stream->Write(error_cstr, error_cstr_len); + if (!ends_with_newline) + error_stream->EOL(); + } + else + { + error_stream->PutCString ("error: unknown error\n"); + } + + if (result) + result->SetStatus (eReturnStatusFailed); } - - if (result) - result->SetStatus (eReturnStatusFailed); } } } |