Skip to content

Commit e8ea347

Browse files
committed
CPreProcessor: don't use isTagExtra() to pick up tags for adding them to a signature string
The original code scanned corkQueue to pick up tags for making signature string. To avoid adding unwanted tags to the signature string, isTagExtra was used (522de3f). However, filtering with isTagExtra was too aggressive; tags extracted by the CPreProcessor parser running as a part of guest parser were rejected. This change uses an intArray. Instead of filtering candidate items in the corkQueue, the CPreProcessor collects tags for parameters to the intArray. The parameters are parts of a signature, not candidates. Therefore we don't need "filtering" anymore. Signed-off-by: Masatake YAMATO <[email protected]>
1 parent 07c8b54 commit e8ea347

File tree

1 file changed

+11
-6
lines changed

1 file changed

+11
-6
lines changed

parsers/cpreprocessor.c

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -871,7 +871,7 @@ static void makeIncludeTag (const char *const name, bool systemHeader)
871871
}
872872
}
873873

874-
static void makeParamTag (vString *name, short nth, bool placeholder)
874+
static int makeParamTag (vString *name, short nth, bool placeholder)
875875
{
876876
bool standing_alone = doesCPreProRunAsStandaloneParser(CPREPRO_MACRO);
877877

@@ -890,15 +890,17 @@ static void makeParamTag (vString *name, short nth, bool placeholder)
890890
if (placeholder)
891891
markTagAsPlaceholder (e, placeholder);
892892
}
893+
return r;
893894
}
894895

895-
static void regenreateSignatureFromParameters (vString * buffer, int from, int to)
896+
static void makeSignatureStringFromParameters (vString * buffer, intArray *parameters)
896897
{
897898
vStringPut(buffer, '(');
898-
for (int pindex = from; pindex < to; pindex++)
899+
for (size_t i = 0; i < intArrayCount (parameters); i++)
899900
{
901+
int pindex = intArrayItem (parameters, i);
900902
tagEntryInfo *e = getEntryInCorkQueue (pindex);
901-
if (e && !isTagExtra (e))
903+
if (e)
902904
{
903905
vStringCatS (buffer, e->name);
904906
vStringPut (buffer, ',');
@@ -939,6 +941,7 @@ static int directiveDefine (const int c, bool undef)
939941

940942
if (p == '(')
941943
{
944+
intArray *params = intArrayNew ();
942945
vString *param = vStringNew ();
943946
int param_start = (int)countEntryInCorkQueue();
944947
do {
@@ -953,7 +956,8 @@ static int directiveDefine (const int c, bool undef)
953956

954957
if (vStringLength (param) > 0)
955958
{
956-
makeParamTag (param, nth++, vStringChar(param, 0) == '.');
959+
int r = makeParamTag (param, nth++, vStringChar(param, 0) == '.');
960+
intArrayAdd (params, r);
957961
vStringClear (param);
958962
}
959963
if (p == '\\')
@@ -965,12 +969,13 @@ static int directiveDefine (const int c, bool undef)
965969
if (p == ')')
966970
{
967971
vString *signature = vStringNew ();
968-
regenreateSignatureFromParameters (signature, param_start, param_end);
972+
makeSignatureStringFromParameters (signature, params);
969973
r = makeDefineTag (vStringValue (Cpp.directive.name), vStringValue (signature), undef);
970974
vStringDelete (signature);
971975
}
972976
else
973977
r = makeDefineTag (vStringValue (Cpp.directive.name), NULL, undef);
978+
intArrayDelete (params);
974979

975980
tagEntryInfo *e = getEntryInCorkQueue (r);
976981
if (e)

0 commit comments

Comments
 (0)