summaryrefslogtreecommitdiffstats
path: root/lldb/source/Expression/ClangUserExpression.cpp
diff options
context:
space:
mode:
authorSean Callanan <scallanan@apple.com>2011-09-26 18:45:31 +0000
committerSean Callanan <scallanan@apple.com>2011-09-26 18:45:31 +0000
commit9bc838415e4b48f9c06bc2077de98e2826141149 (patch)
tree13ba88e597f8235ce63362804b391c80b39b5b1f /lldb/source/Expression/ClangUserExpression.cpp
parent2f9ca7b1f548312155c00d3361fd082840c5a2fe (diff)
downloadbcm5719-llvm-9bc838415e4b48f9c06bc2077de98e2826141149.tar.gz
bcm5719-llvm-9bc838415e4b48f9c06bc2077de98e2826141149.zip
Factored out handling of the source code for an
expression into a separate class. This class encapsulates wrapping the function as needed. I am also moving from using booleans to indicate what the expression's language should be to using lldb::LanguageType instead. llvm-svn: 140545
Diffstat (limited to 'lldb/source/Expression/ClangUserExpression.cpp')
-rw-r--r--lldb/source/Expression/ClangUserExpression.cpp67
1 files changed, 17 insertions, 50 deletions
diff --git a/lldb/source/Expression/ClangUserExpression.cpp b/lldb/source/Expression/ClangUserExpression.cpp
index 73ed043c26a..b4f4901a197 100644
--- a/lldb/source/Expression/ClangUserExpression.cpp
+++ b/lldb/source/Expression/ClangUserExpression.cpp
@@ -28,6 +28,7 @@
#include "lldb/Expression/ClangExpressionParser.h"
#include "lldb/Expression/ClangFunction.h"
#include "lldb/Expression/ClangUserExpression.h"
+#include "lldb/Expression/ExpressionSourceCode.h"
#include "lldb/Host/Host.h"
#include "lldb/Symbol/VariableList.h"
#include "lldb/Target/ExecutionContext.h"
@@ -106,6 +107,7 @@ ClangUserExpression::ScanContext(ExecutionContext &exe_ctx)
if (method_decl->isInstance())
{
m_cplusplus = true;
+ m_needs_object_ptr = true;
do {
clang::QualType this_type = method_decl->getThisType(decl_context->getParentASTContext());
@@ -122,7 +124,10 @@ ClangUserExpression::ScanContext(ExecutionContext &exe_ctx)
else if (clang::ObjCMethodDecl *method_decl = llvm::dyn_cast<clang::ObjCMethodDecl>(decl_context))
{
if (method_decl->isInstanceMethod())
+ {
m_objectivec = true;
+ m_needs_object_ptr = true;
+ }
}
}
@@ -185,61 +190,23 @@ ClangUserExpression::Parse (Stream &error_stream,
ApplyObjcCastHack(m_expr_text);
//ApplyUnicharHack(m_expr_text);
+ std::auto_ptr <ExpressionSourceCode> source_code (ExpressionSourceCode::CreateWrapped(m_expr_prefix.c_str(), m_expr_text.c_str()));
+
+ lldb::LanguageType lang_type;
+
if (m_cplusplus)
- {
- m_transformed_stream.Printf("%s \n"
- "typedef unsigned short unichar; \n"
- "void \n"
- "$__lldb_class::%s(void *$__lldb_arg) %s\n"
- "{ \n"
- " %s; \n"
- "} \n",
- m_expr_prefix.c_str(),
- FunctionName(),
- (m_const_object ? "const" : ""),
- m_expr_text.c_str());
-
- m_needs_object_ptr = true;
- }
- else if (m_objectivec)
- {
- const char *function_name = FunctionName();
-
- m_transformed_stream.Printf("%s \n"
- "typedef unsigned short unichar; \n"
- "@interface $__lldb_objc_class ($__lldb_category) \n"
- "-(void)%s:(void *)$__lldb_arg; \n"
- "@end \n"
- "@implementation $__lldb_objc_class ($__lldb_category) \n"
- "-(void)%s:(void *)$__lldb_arg \n"
- "{ \n"
- " %s; \n"
- "} \n"
- "@end \n",
- m_expr_prefix.c_str(),
- function_name,
- function_name,
- m_expr_text.c_str());
-
- m_needs_object_ptr = true;
- }
+ lang_type = lldb::eLanguageTypeC_plus_plus;
+ else if(m_objectivec)
+ lang_type = lldb::eLanguageTypeObjC;
else
+ lang_type = lldb::eLanguageTypeC;
+
+ if (!source_code->GetText(m_transformed_text, lang_type, m_const_object))
{
- m_transformed_stream.Printf("%s \n"
- "typedef unsigned short unichar;\n"
- "void \n"
- "%s(void *$__lldb_arg) \n"
- "{ \n"
- " %s; \n"
- "} \n",
- m_expr_prefix.c_str(),
- FunctionName(),
- m_expr_text.c_str());
+ error_stream.PutCString ("error: couldn't construct expression body");
+ return false;
}
- m_transformed_text = m_transformed_stream.GetData();
-
-
if (log)
log->Printf("Parsing the following code:\n%s", m_transformed_text.c_str());
OpenPOWER on IntegriCloud