diff options
author | Sean Callanan <scallanan@apple.com> | 2011-11-07 23:35:40 +0000 |
---|---|---|
committer | Sean Callanan <scallanan@apple.com> | 2011-11-07 23:35:40 +0000 |
commit | c7b650670e4c0c8ac87cad2afc8566859f71645c (patch) | |
tree | 6a0f7df9084a1cffc51726f40e0d39bcead5d0e4 /lldb/source/Expression | |
parent | 82695d6259f5767406ce9dd52b920e38a875729e (diff) | |
download | bcm5719-llvm-c7b650670e4c0c8ac87cad2afc8566859f71645c.tar.gz bcm5719-llvm-c7b650670e4c0c8ac87cad2afc8566859f71645c.zip |
Added a language parameter to the expression parser,
which will in the future allow expressions to be
compiled as C, C++, and Objective-C instead of the
current default Objective-C++. This feature requires
some additional support from Clang -- specifically, it
requires reference types in the parser regardless of
language -- so it is not yet exposed to the user.
llvm-svn: 144042
Diffstat (limited to 'lldb/source/Expression')
-rw-r--r-- | lldb/source/Expression/ClangExpressionParser.cpp | 27 | ||||
-rw-r--r-- | lldb/source/Expression/ClangUserExpression.cpp | 31 |
2 files changed, 46 insertions, 12 deletions
diff --git a/lldb/source/Expression/ClangExpressionParser.cpp b/lldb/source/Expression/ClangExpressionParser.cpp index d040cd84891..ae55cadc392 100644 --- a/lldb/source/Expression/ClangExpressionParser.cpp +++ b/lldb/source/Expression/ClangExpressionParser.cpp @@ -204,19 +204,32 @@ ClangExpressionParser::ClangExpressionParser (ExecutionContextScope *exe_scope, // 2. Set options. - // Parse expressions as Objective C++ regardless of context. - // Our hook into Clang's lookup mechanism only works in C++. - m_compiler->getLangOpts().CPlusPlus = true; + lldb::LanguageType language = expr.Language(); - // Setup objective C - m_compiler->getLangOpts().ObjC1 = true; - m_compiler->getLangOpts().ObjC2 = true; + switch (language) + { + case lldb::eLanguageTypeC: + break; + case lldb::eLanguageTypeObjC: + m_compiler->getLangOpts().ObjC1 = true; + m_compiler->getLangOpts().ObjC2 = true; + break; + case lldb::eLanguageTypeC_plus_plus: + m_compiler->getLangOpts().CPlusPlus = true; + break; + case lldb::eLanguageTypeObjC_plus_plus: + default: + m_compiler->getLangOpts().ObjC1 = true; + m_compiler->getLangOpts().ObjC2 = true; + m_compiler->getLangOpts().CPlusPlus = true; + break; + } Process *process = NULL; if (exe_scope) process = exe_scope->CalculateProcess(); - if (process) + if (process && m_compiler->getLangOpts().ObjC1) { if (process->GetObjCLanguageRuntime()) { diff --git a/lldb/source/Expression/ClangUserExpression.cpp b/lldb/source/Expression/ClangUserExpression.cpp index 5b8cf72c8be..eb4be84cfff 100644 --- a/lldb/source/Expression/ClangUserExpression.cpp +++ b/lldb/source/Expression/ClangUserExpression.cpp @@ -44,10 +44,12 @@ using namespace lldb_private; ClangUserExpression::ClangUserExpression (const char *expr, - const char *expr_prefix) : + const char *expr_prefix, + lldb::LanguageType language) : ClangExpression (), m_expr_text (expr), m_expr_prefix (expr_prefix ? expr_prefix : ""), + m_language (language), m_transformed_text (), m_desired_type (NULL, NULL), m_cplusplus (false), @@ -58,6 +60,20 @@ ClangUserExpression::ClangUserExpression (const char *expr, m_evaluated_statically (false), m_const_result () { + switch (m_language) + { + case lldb::eLanguageTypeC_plus_plus: + m_allow_cxx = true; + break; + case lldb::eLanguageTypeObjC: + m_allow_objc = true; + break; + case lldb::eLanguageTypeObjC_plus_plus: + default: + m_allow_cxx = true; + m_allow_objc = true; + break; + } } ClangUserExpression::~ClangUserExpression () @@ -86,6 +102,9 @@ ClangUserExpression::ScanContext(ExecutionContext &exe_ctx, Error &err) { m_target = exe_ctx.GetTargetPtr(); + if (!(m_allow_cxx || m_allow_objc)) + return; + StackFrame *frame = exe_ctx.GetFramePtr(); if (frame == NULL) return; @@ -107,7 +126,7 @@ ClangUserExpression::ScanContext(ExecutionContext &exe_ctx, Error &err) if (clang::CXXMethodDecl *method_decl = llvm::dyn_cast<clang::CXXMethodDecl>(decl_context)) { - if (method_decl->isInstance()) + if (m_allow_cxx && method_decl->isInstance()) { VariableList *vars = frame->GetVariableList(false); @@ -148,7 +167,7 @@ ClangUserExpression::ScanContext(ExecutionContext &exe_ctx, Error &err) } else if (clang::ObjCMethodDecl *method_decl = llvm::dyn_cast<clang::ObjCMethodDecl>(decl_context)) { - if (method_decl->isInstanceMethod()) + if (m_allow_objc && method_decl->isInstanceMethod()) { VariableList *vars = frame->GetVariableList(false); @@ -602,18 +621,20 @@ ClangUserExpression::Execute (Stream &error_stream, ExecutionResults ClangUserExpression::Evaluate (ExecutionContext &exe_ctx, lldb_private::ExecutionPolicy execution_policy, + lldb::LanguageType language, bool discard_on_error, const char *expr_cstr, const char *expr_prefix, lldb::ValueObjectSP &result_valobj_sp) { Error error; - return EvaluateWithError (exe_ctx, execution_policy, discard_on_error, expr_cstr, expr_prefix, result_valobj_sp, error); + return EvaluateWithError (exe_ctx, execution_policy, language, discard_on_error, expr_cstr, expr_prefix, result_valobj_sp, error); } ExecutionResults ClangUserExpression::EvaluateWithError (ExecutionContext &exe_ctx, lldb_private::ExecutionPolicy execution_policy, + lldb::LanguageType language, bool discard_on_error, const char *expr_cstr, const char *expr_prefix, @@ -642,7 +663,7 @@ ClangUserExpression::EvaluateWithError (ExecutionContext &exe_ctx, if (process == NULL || !process->CanJIT()) execution_policy = eExecutionPolicyNever; - ClangUserExpressionSP user_expression_sp (new ClangUserExpression (expr_cstr, expr_prefix)); + ClangUserExpressionSP user_expression_sp (new ClangUserExpression (expr_cstr, expr_prefix, language)); StreamString error_stream; |