summaryrefslogtreecommitdiffstats
path: root/lldb/source/Expression/ASTResultSynthesizer.cpp
diff options
context:
space:
mode:
authorSean Callanan <scallanan@apple.com>2010-09-13 21:34:21 +0000
committerSean Callanan <scallanan@apple.com>2010-09-13 21:34:21 +0000
commit9e6ed53ea51e66688dcf4d30837c6fbe4ec06f1e (patch)
treec820006abd28b091188967ad931adb82ccf42b40 /lldb/source/Expression/ASTResultSynthesizer.cpp
parent535e8e5f6004865b6c3f1df3ddc603d57d2311b8 (diff)
downloadbcm5719-llvm-9e6ed53ea51e66688dcf4d30837c6fbe4ec06f1e.tar.gz
bcm5719-llvm-9e6ed53ea51e66688dcf4d30837c6fbe4ec06f1e.zip
Bugfixes to the expression parser. Fixes include:
- If you put a semicolon at the end of an expression, this no longer causes the expression parser to error out. This was a two-part fix: first, ClangExpressionDeclMap::Materialize now handles an empty struct (such as when there is no return value); second, ASTResultSynthesizer walks backward from the end of the ASTs until it reaches something that's not a NullStmt. - ClangExpressionVariable now properly byte-swaps when printing itself. - ClangUtilityFunction now cleans up after itself when it's done compiling itself. - Utility functions can now use external functions just like user expressions. - If you end your expression with a statement that does not return a value, the expression now runs correctly anyway. Also, added the beginnings of an Objective-C object validator function, which is neither installed nor used as yet. llvm-svn: 113789
Diffstat (limited to 'lldb/source/Expression/ASTResultSynthesizer.cpp')
-rw-r--r--lldb/source/Expression/ASTResultSynthesizer.cpp21
1 files changed, 21 insertions, 0 deletions
diff --git a/lldb/source/Expression/ASTResultSynthesizer.cpp b/lldb/source/Expression/ASTResultSynthesizer.cpp
index b3790f2cae5..8838fddf8ff 100644
--- a/lldb/source/Expression/ASTResultSynthesizer.cpp
+++ b/lldb/source/Expression/ASTResultSynthesizer.cpp
@@ -113,6 +113,18 @@ ASTResultSynthesizer::SynthesizeResult (FunctionDecl *FunDecl)
if (!function_decl)
return false;
+ if (log)
+ {
+ std::string s;
+ raw_string_ostream os(s);
+
+ function_decl->print(os);
+
+ os.flush();
+
+ log->Printf("Function AST before transforming:\n%s", s.c_str());
+ }
+
Stmt *function_body = function_decl->getBody();
CompoundStmt *compound_stmt = dyn_cast<CompoundStmt>(function_body);
@@ -125,6 +137,15 @@ ASTResultSynthesizer::SynthesizeResult (FunctionDecl *FunDecl)
Stmt **last_stmt_ptr = compound_stmt->body_end() - 1;
Stmt *last_stmt = *last_stmt_ptr;
+ while (dyn_cast<NullStmt>(last_stmt))
+ {
+ if (last_stmt_ptr != compound_stmt->body_begin())
+ {
+ last_stmt_ptr--;
+ last_stmt = *last_stmt_ptr;
+ }
+ }
+
Expr *last_expr = dyn_cast<Expr>(last_stmt);
if (!last_expr)
OpenPOWER on IntegriCloud