From e63ba11af2b9177bce2237b6f03788b904efe5cf Mon Sep 17 00:00:00 2001 From: rdb Date: Thu, 28 Mar 2024 01:18:19 +0100 Subject: [PATCH] cppparser: Fix expansion of function macro used without parentheses --- dtool/src/cppparser/cppPreprocessor.cxx | 25 ++++++++----------------- dtool/src/cppparser/cppPreprocessor.h | 2 -- 2 files changed, 8 insertions(+), 19 deletions(-) diff --git a/dtool/src/cppparser/cppPreprocessor.cxx b/dtool/src/cppparser/cppPreprocessor.cxx index 56dd906faf..bd8934427c 100644 --- a/dtool/src/cppparser/cppPreprocessor.cxx +++ b/dtool/src/cppparser/cppPreprocessor.cxx @@ -2233,6 +2233,14 @@ r_expand_manifests(string &expr, bool expand_undefined, if (expanded.count(manifest) == 0) { vector_string args; if (manifest->_has_parameters) { + // If it's not followed by a parenthesis, don't expand it. + while (p < expr.size() && isspace(expr[p])) { + p++; + } + if (p >= expr.size() || expr[p] != '(') { + continue; + } + extract_manifest_args_inline(manifest->_name, manifest->_num_parameters, manifest->_variadic_param, args, expr, p); } @@ -2502,23 +2510,6 @@ expand_has_include_function(string &expr, size_t q, size_t &p, YYLTYPE loc) { p = q + result.size(); } -/** - * - */ -void CPPPreprocessor:: -expand_manifest_inline(string &expr, size_t q, size_t &p, - const CPPManifest *manifest) { - vector_string args; - if (manifest->_has_parameters) { - extract_manifest_args_inline(manifest->_name, manifest->_num_parameters, - manifest->_variadic_param, args, expr, p); - } - string result = manifest->expand(args); - - expr = expr.substr(0, q) + result + expr.substr(p); - p = q + result.size(); -} - /** * */ diff --git a/dtool/src/cppparser/cppPreprocessor.h b/dtool/src/cppparser/cppPreprocessor.h index 110e429e7a..be395f9a08 100644 --- a/dtool/src/cppparser/cppPreprocessor.h +++ b/dtool/src/cppparser/cppPreprocessor.h @@ -160,8 +160,6 @@ private: int va_arg, vector_string &args); void expand_defined_function(std::string &expr, size_t q, size_t &p); void expand_has_include_function(std::string &expr, size_t q, size_t &p, YYLTYPE loc); - void expand_manifest_inline(std::string &expr, size_t q, size_t &p, - const CPPManifest *manifest); void extract_manifest_args_inline(const std::string &name, int num_args, int va_arg, vector_string &args, const std::string &expr, size_t &p);