summaryrefslogtreecommitdiffstats
path: root/lldb/source/Expression
diff options
context:
space:
mode:
authorSean Callanan <scallanan@apple.com>2011-11-07 23:35:40 +0000
committerSean Callanan <scallanan@apple.com>2011-11-07 23:35:40 +0000
commitc7b650670e4c0c8ac87cad2afc8566859f71645c (patch)
tree6a0f7df9084a1cffc51726f40e0d39bcead5d0e4 /lldb/source/Expression
parent82695d6259f5767406ce9dd52b920e38a875729e (diff)
downloadbcm5719-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.cpp27
-rw-r--r--lldb/source/Expression/ClangUserExpression.cpp31
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;
OpenPOWER on IntegriCloud