Keep the kernel header scrubber's data structures in sync.

If you rewrite the tokens of a #if you need to rewrite the expression to match
because either might be used later. This was showing up as SIGRTMAX being
rewritten in a #define but not in the #ifndef that guarded it, for which case
I've added a unit test.

Change-Id: I6929675461a1afe272edd667594529fd84a3dc4d
This commit is contained in:
Elliott Hughes
2014-05-01 10:17:27 -07:00
parent 9fb53dd4db
commit fddbafdc0a
3 changed files with 24 additions and 10 deletions

View File

@@ -685,9 +685,9 @@ class CppExpr:
# we have the defined keyword, check the rest # we have the defined keyword, check the rest
self.i += 1 self.i += 1
self.skip_spaces() self.skip_spaces()
use_parens = 0 used_parens = 0
if self.i < self.n and self.tok[self.i].id == tokLPAREN: if self.i < self.n and self.tok[self.i].id == tokLPAREN:
use_parens = 1 used_parens = 1
self.i += 1 self.i += 1
self.skip_spaces() self.skip_spaces()
@@ -699,7 +699,7 @@ class CppExpr:
self.throw(CppConstantExpected,i,"### 'defined' must be followed by macro name") self.throw(CppConstantExpected,i,"### 'defined' must be followed by macro name")
self.i += 1 self.i += 1
if use_parens: if used_parens:
self.expectId(tokRPAREN) self.expectId(tokRPAREN)
return ("defined", t.value) return ("defined", t.value)
@@ -1162,7 +1162,7 @@ class Block:
return self.directive in ["if","ifdef","ifndef","elif"] return self.directive in ["if","ifdef","ifndef","elif"]
def isInclude(self): def isInclude(self):
"""checks wether this is a #include directive. if true, then returns the """checks whether this is a #include directive. if true, then returns the
corresponding file name (with brackets or double-qoutes). None otherwise""" corresponding file name (with brackets or double-qoutes). None otherwise"""
if self.directive != "include": if self.directive != "include":
return None return None
@@ -1517,15 +1517,20 @@ class BlockList:
tokens = tokens[:-1] # remove trailing tokLN tokens = tokens[:-1] # remove trailing tokLN
self.blocks = [ Block(tokens) ] + self.blocks self.blocks = [ Block(tokens) ] + self.blocks
def replaceTokens(self,replacements=dict()): def replaceTokens(self,replacements):
"""replace tokens according to the given dict """replace tokens according to the given dict"""
"""
for b in self.blocks: for b in self.blocks:
if (not b.isDirective()) or b.isDefine(): made_change = False
if b.isInclude() == None:
for tok in b.tokens: for tok in b.tokens:
if tok.id == tokIDENT: if tok.id == tokIDENT:
if tok.value in replacements: if tok.value in replacements:
tok.value = replacements[tok.value] tok.value = replacements[tok.value]
made_change = True
if made_change and b.isIf():
# Keep 'expr' in sync with 'tokens'.
b.expr = CppExpr(b.tokens)
class BlockParser: class BlockParser:
"""a class used to convert an input source file into a BlockList object""" """a class used to convert an input source file into a BlockList object"""
@@ -1798,6 +1803,10 @@ def test_optimizeAll():
#define X #define X
#endif #endif
#ifndef SIGRTMAX
#define SIGRTMAX 123
#endif /* SIGRTMAX */
#if 0 #if 0
#if 1 #if 1
#define BAD_6 #define BAD_6
@@ -1817,12 +1826,17 @@ def test_optimizeAll():
#define X #define X
#endif #endif
#ifndef __SIGRTMAX
#define __SIGRTMAX 123
#endif
""" """
out = StringOutput() out = StringOutput()
lines = string.split(text, '\n') lines = string.split(text, '\n')
list = BlockParser().parse( CppLinesTokenizer(lines) ) list = BlockParser().parse( CppLinesTokenizer(lines) )
#D_setlevel(2) #D_setlevel(2)
list.replaceTokens( kernel_token_replacements )
list.optimizeAll( {"__KERNEL__":kCppUndefinedMacro} ) list.optimizeAll( {"__KERNEL__":kCppUndefinedMacro} )
list.write(out) list.write(out)
if out.get() != expected: if out.get() != expected:

View File

@@ -67,7 +67,7 @@
#define SIGUNUSED 31 #define SIGUNUSED 31
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ /* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define __SIGRTMIN 32 #define __SIGRTMIN 32
#ifndef SIGRTMAX #ifndef __SIGRTMAX
#define __SIGRTMAX _KERNEL__NSIG #define __SIGRTMAX _KERNEL__NSIG
#endif #endif
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ /* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */