Re: [Lldb-commits] [PATCH] D17856: Fix expression evaluation with operator new
This revision was automatically updated to reflect the committed changes. Closed by commit rL278670: Fix expression evaluation with operator new (authored by labath). Changed prior to commit: https://reviews.llvm.org/D17856?vs=56252=68036#toc Repository: rL LLVM https://reviews.llvm.org/D17856 Files: lldb/trunk/include/lldb/Symbol/ClangASTContext.h lldb/trunk/packages/Python/lldbsuite/test/lang/cpp/global_operators/TestCppGlobalOperators.py lldb/trunk/packages/Python/lldbsuite/test/lang/cpp/global_operators/main.cpp lldb/trunk/source/Plugins/ExpressionParser/Clang/ClangExpressionDeclMap.cpp lldb/trunk/source/Symbol/ClangASTContext.cpp Index: lldb/trunk/source/Symbol/ClangASTContext.cpp === --- lldb/trunk/source/Symbol/ClangASTContext.cpp +++ lldb/trunk/source/Symbol/ClangASTContext.cpp @@ -131,6 +131,241 @@ return *g_map_ptr; } +static bool +IsOperator(const char *name, clang::OverloadedOperatorKind _kind) +{ +if (name == nullptr || name[0] == '\0') +return false; + +#define OPERATOR_PREFIX "operator" +#define OPERATOR_PREFIX_LENGTH (sizeof(OPERATOR_PREFIX) - 1) + +const char *post_op_name = nullptr; + +bool no_space = true; + +if (::strncmp(name, OPERATOR_PREFIX, OPERATOR_PREFIX_LENGTH)) +return false; + +post_op_name = name + OPERATOR_PREFIX_LENGTH; + +if (post_op_name[0] == ' ') +{ +post_op_name++; +no_space = false; +} + +#undef OPERATOR_PREFIX +#undef OPERATOR_PREFIX_LENGTH + +// This is an operator, set the overloaded operator kind to invalid +// in case this is a conversion operator... +op_kind = clang::NUM_OVERLOADED_OPERATORS; + +switch (post_op_name[0]) +{ +default: +if (no_space) +return false; +break; +case 'n': +if (no_space) +return false; +if (strcmp(post_op_name, "new") == 0) +op_kind = clang::OO_New; +else if (strcmp(post_op_name, "new[]") == 0) +op_kind = clang::OO_Array_New; +break; + +case 'd': +if (no_space) +return false; +if (strcmp(post_op_name, "delete") == 0) +op_kind = clang::OO_Delete; +else if (strcmp(post_op_name, "delete[]") == 0) +op_kind = clang::OO_Array_Delete; +break; + +case '+': +if (post_op_name[1] == '\0') +op_kind = clang::OO_Plus; +else if (post_op_name[2] == '\0') +{ +if (post_op_name[1] == '=') +op_kind = clang::OO_PlusEqual; +else if (post_op_name[1] == '+') +op_kind = clang::OO_PlusPlus; +} +break; + +case '-': +if (post_op_name[1] == '\0') +op_kind = clang::OO_Minus; +else if (post_op_name[2] == '\0') +{ +switch (post_op_name[1]) +{ +case '=': +op_kind = clang::OO_MinusEqual; +break; +case '-': +op_kind = clang::OO_MinusMinus; +break; +case '>': +op_kind = clang::OO_Arrow; +break; +} +} +else if (post_op_name[3] == '\0') +{ +if (post_op_name[2] == '*') +op_kind = clang::OO_ArrowStar; +break; +} +break; + +case '*': +if (post_op_name[1] == '\0') +op_kind = clang::OO_Star; +else if (post_op_name[1] == '=' && post_op_name[2] == '\0') +op_kind = clang::OO_StarEqual; +break; + +case '/': +if (post_op_name[1] == '\0') +op_kind = clang::OO_Slash; +else if (post_op_name[1] == '=' && post_op_name[2] == '\0') +op_kind = clang::OO_SlashEqual; +break; + +case '%': +if (post_op_name[1] == '\0') +op_kind = clang::OO_Percent; +else if (post_op_name[1] == '=' && post_op_name[2] == '\0') +op_kind = clang::OO_PercentEqual; +break; + +case '^': +if (post_op_name[1] == '\0') +op_kind = clang::OO_Caret; +else if (post_op_name[1] == '=' && post_op_name[2] == '\0') +op_kind = clang::OO_CaretEqual; +break; + +case '&': +if (post_op_name[1] == '\0') +op_kind = clang::OO_Amp; +else if (post_op_name[2] == '\0') +{ +switch (post_op_name[1]) +{ +case '=': +
Re: [Lldb-commits] [PATCH] D17856: Fix expression evaluation with operator new
labath added a comment. Sean, if you don't object, I am going to put this in next week. pl https://reviews.llvm.org/D17856 ___ lldb-commits mailing list lldb-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
Re: [Lldb-commits] [PATCH] D17856: Fix expression evaluation with operator new
labath requested a review of this revision. labath added a comment. Sean, could you take a quick look at this one as well? http://reviews.llvm.org/D17856 ___ lldb-commits mailing list lldb-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
Re: [Lldb-commits] [PATCH] D17856: Fix expression evaluation with operator new
clayborg accepted this revision. clayborg added a comment. This revision is now accepted and ready to land. I am OK if Sean is OK with this. http://reviews.llvm.org/D17856 ___ lldb-commits mailing list lldb-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
Re: [Lldb-commits] [PATCH] D17856: Fix expression evaluation with operator new
labath added a comment. Sean, could you find some time to look at this please? http://reviews.llvm.org/D17856 ___ lldb-commits mailing list lldb-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
Re: [Lldb-commits] [PATCH] D17856: Fix expression evaluation with operator new
labath added a reviewer: clayborg. labath added a comment. This has been sitting in the queue for a long time. Greg, could you take a look? http://reviews.llvm.org/D17856 ___ lldb-commits mailing list lldb-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
Re: [Lldb-commits] [PATCH] D17856: Fix expression evaluation with operator new
labath updated this revision to Diff 56252. labath added a comment. Rebase on ToT. http://reviews.llvm.org/D17856 Files: include/lldb/Symbol/ClangASTContext.h packages/Python/lldbsuite/test/lang/cpp/global_operators/TestCppGlobalOperators.py packages/Python/lldbsuite/test/lang/cpp/global_operators/main.cpp source/Plugins/ExpressionParser/Clang/ClangExpressionDeclMap.cpp source/Symbol/ClangASTContext.cpp Index: source/Symbol/ClangASTContext.cpp === --- source/Symbol/ClangASTContext.cpp +++ source/Symbol/ClangASTContext.cpp @@ -130,6 +130,241 @@ return *g_map_ptr; } +static bool +IsOperator(const char *name, clang::OverloadedOperatorKind _kind) +{ +if (name == nullptr || name[0] == '\0') +return false; + +#define OPERATOR_PREFIX "operator" +#define OPERATOR_PREFIX_LENGTH (sizeof(OPERATOR_PREFIX) - 1) + +const char *post_op_name = nullptr; + +bool no_space = true; + +if (::strncmp(name, OPERATOR_PREFIX, OPERATOR_PREFIX_LENGTH)) +return false; + +post_op_name = name + OPERATOR_PREFIX_LENGTH; + +if (post_op_name[0] == ' ') +{ +post_op_name++; +no_space = false; +} + +#undef OPERATOR_PREFIX +#undef OPERATOR_PREFIX_LENGTH + +// This is an operator, set the overloaded operator kind to invalid +// in case this is a conversion operator... +op_kind = clang::NUM_OVERLOADED_OPERATORS; + +switch (post_op_name[0]) +{ +default: +if (no_space) +return false; +break; +case 'n': +if (no_space) +return false; +if (strcmp(post_op_name, "new") == 0) +op_kind = clang::OO_New; +else if (strcmp(post_op_name, "new[]") == 0) +op_kind = clang::OO_Array_New; +break; + +case 'd': +if (no_space) +return false; +if (strcmp(post_op_name, "delete") == 0) +op_kind = clang::OO_Delete; +else if (strcmp(post_op_name, "delete[]") == 0) +op_kind = clang::OO_Array_Delete; +break; + +case '+': +if (post_op_name[1] == '\0') +op_kind = clang::OO_Plus; +else if (post_op_name[2] == '\0') +{ +if (post_op_name[1] == '=') +op_kind = clang::OO_PlusEqual; +else if (post_op_name[1] == '+') +op_kind = clang::OO_PlusPlus; +} +break; + +case '-': +if (post_op_name[1] == '\0') +op_kind = clang::OO_Minus; +else if (post_op_name[2] == '\0') +{ +switch (post_op_name[1]) +{ +case '=': +op_kind = clang::OO_MinusEqual; +break; +case '-': +op_kind = clang::OO_MinusMinus; +break; +case '>': +op_kind = clang::OO_Arrow; +break; +} +} +else if (post_op_name[3] == '\0') +{ +if (post_op_name[2] == '*') +op_kind = clang::OO_ArrowStar; +break; +} +break; + +case '*': +if (post_op_name[1] == '\0') +op_kind = clang::OO_Star; +else if (post_op_name[1] == '=' && post_op_name[2] == '\0') +op_kind = clang::OO_StarEqual; +break; + +case '/': +if (post_op_name[1] == '\0') +op_kind = clang::OO_Slash; +else if (post_op_name[1] == '=' && post_op_name[2] == '\0') +op_kind = clang::OO_SlashEqual; +break; + +case '%': +if (post_op_name[1] == '\0') +op_kind = clang::OO_Percent; +else if (post_op_name[1] == '=' && post_op_name[2] == '\0') +op_kind = clang::OO_PercentEqual; +break; + +case '^': +if (post_op_name[1] == '\0') +op_kind = clang::OO_Caret; +else if (post_op_name[1] == '=' && post_op_name[2] == '\0') +op_kind = clang::OO_CaretEqual; +break; + +case '&': +if (post_op_name[1] == '\0') +op_kind = clang::OO_Amp; +else if (post_op_name[2] == '\0') +{ +switch (post_op_name[1]) +{ +case '=': +op_kind = clang::OO_AmpEqual; +break; +case '&': +op_kind = clang::OO_AmpAmp; +break; +} +} +break; + +case '|': +if
Re: [Lldb-commits] [PATCH] D17856: Fix expression evaluation with operator new
labath added a comment. Any thoughts on this? http://reviews.llvm.org/D17856 ___ lldb-commits mailing list lldb-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits