mirror of
https://github.com/facebook/zstd.git
synced 2025-08-07 06:23:00 +03:00
[freestanding] Improve macro resolution to handle #if X
This commit is contained in:
@@ -78,7 +78,7 @@ class PartialPreprocessor(object):
|
|||||||
fr"\s*#\s*{ELIF_GROUP}if\s+(?P<not>!)?\s*defined\s*\(\s*{MACRO_GROUP}\s*\)\s*{OP_GROUP}"
|
fr"\s*#\s*{ELIF_GROUP}if\s+(?P<not>!)?\s*defined\s*\(\s*{MACRO_GROUP}\s*\)\s*{OP_GROUP}"
|
||||||
)
|
)
|
||||||
self._if_defined_value = re.compile(
|
self._if_defined_value = re.compile(
|
||||||
fr"\s*#\s*if\s+defined\s*\(\s*{MACRO_GROUP}\s*\)\s*"
|
fr"\s*#\s*{ELIF_GROUP}if\s+defined\s*\(\s*{MACRO_GROUP}\s*\)\s*"
|
||||||
fr"(?P<op>&&)\s*"
|
fr"(?P<op>&&)\s*"
|
||||||
fr"(?P<openp>\()?\s*"
|
fr"(?P<openp>\()?\s*"
|
||||||
fr"(?P<macro2>[a-zA-Z_][a-zA-Z_0-9]*)\s*"
|
fr"(?P<macro2>[a-zA-Z_][a-zA-Z_0-9]*)\s*"
|
||||||
@@ -86,6 +86,9 @@ class PartialPreprocessor(object):
|
|||||||
fr"(?P<value>[0-9]*)\s*"
|
fr"(?P<value>[0-9]*)\s*"
|
||||||
fr"(?P<closep>\))?\s*"
|
fr"(?P<closep>\))?\s*"
|
||||||
)
|
)
|
||||||
|
self._if_true = re.compile(
|
||||||
|
fr"\s*#\s*{ELIF_GROUP}if\s+{MACRO_GROUP}\s*{OP_GROUP}"
|
||||||
|
)
|
||||||
|
|
||||||
self._c_comment = re.compile(r"/\*.*?\*/")
|
self._c_comment = re.compile(r"/\*.*?\*/")
|
||||||
self._cpp_comment = re.compile(r"//")
|
self._cpp_comment = re.compile(r"//")
|
||||||
@@ -262,10 +265,14 @@ class PartialPreprocessor(object):
|
|||||||
line = self._inlines[idx]
|
line = self._inlines[idx]
|
||||||
sline = self._strip_comments(line)
|
sline = self._strip_comments(line)
|
||||||
m = self._ifdef.fullmatch(sline)
|
m = self._ifdef.fullmatch(sline)
|
||||||
|
if_true = False
|
||||||
if m is None:
|
if m is None:
|
||||||
m = self._if_defined_value.fullmatch(sline)
|
m = self._if_defined_value.fullmatch(sline)
|
||||||
if m is None:
|
if m is None:
|
||||||
m = self._if_defined.match(sline)
|
m = self._if_defined.match(sline)
|
||||||
|
if m is None:
|
||||||
|
m = self._if_true.match(sline)
|
||||||
|
if_true = (m is not None)
|
||||||
if m is None:
|
if m is None:
|
||||||
outlines.append(line)
|
outlines.append(line)
|
||||||
idx += 1
|
idx += 1
|
||||||
@@ -273,22 +280,54 @@ class PartialPreprocessor(object):
|
|||||||
|
|
||||||
groups = m.groupdict()
|
groups = m.groupdict()
|
||||||
macro = groups['macro']
|
macro = groups['macro']
|
||||||
ifdef = groups.get('not') is None
|
|
||||||
elseif = groups.get('elif') is not None
|
|
||||||
op = groups.get('op')
|
op = groups.get('op')
|
||||||
|
|
||||||
macro2 = groups.get('macro2')
|
|
||||||
cmp = groups.get('cmp')
|
|
||||||
value = groups.get('value')
|
|
||||||
openp = groups.get('openp')
|
|
||||||
closep = groups.get('closep')
|
|
||||||
|
|
||||||
if not (macro in self._defs or macro in self._undefs):
|
if not (macro in self._defs or macro in self._undefs):
|
||||||
outlines.append(line)
|
outlines.append(line)
|
||||||
idx += 1
|
idx += 1
|
||||||
continue
|
continue
|
||||||
|
|
||||||
defined = macro in self._defs
|
defined = macro in self._defs
|
||||||
|
|
||||||
|
# Needed variables set:
|
||||||
|
# resolved: Is the statement fully resolved?
|
||||||
|
# is_true: If resolved, is the statement true?
|
||||||
|
ifdef = False
|
||||||
|
if if_true:
|
||||||
|
if not defined:
|
||||||
|
outlines.append(line)
|
||||||
|
idx += 1
|
||||||
|
continue
|
||||||
|
|
||||||
|
defined_value = self._defs[macro]
|
||||||
|
is_int = True
|
||||||
|
try:
|
||||||
|
defined_value = int(defined_value)
|
||||||
|
except TypeError:
|
||||||
|
is_int = False
|
||||||
|
except ValueError:
|
||||||
|
is_int = False
|
||||||
|
|
||||||
|
resolved = is_int
|
||||||
|
is_true = (defined_value != 0)
|
||||||
|
|
||||||
|
if resolved and op is not None:
|
||||||
|
if op == '&&':
|
||||||
|
resolved = not is_true
|
||||||
|
else:
|
||||||
|
assert op == '||'
|
||||||
|
resolved = is_true
|
||||||
|
|
||||||
|
else:
|
||||||
|
ifdef = groups.get('not') is None
|
||||||
|
elseif = groups.get('elif') is not None
|
||||||
|
|
||||||
|
macro2 = groups.get('macro2')
|
||||||
|
cmp = groups.get('cmp')
|
||||||
|
value = groups.get('value')
|
||||||
|
openp = groups.get('openp')
|
||||||
|
closep = groups.get('closep')
|
||||||
|
|
||||||
is_true = (ifdef == defined)
|
is_true = (ifdef == defined)
|
||||||
resolved = True
|
resolved = True
|
||||||
if op is not None:
|
if op is not None:
|
||||||
|
@@ -1902,7 +1902,7 @@ ZSTD_reduceTable_internal (U32* const table, U32 const size, U32 const reducerVa
|
|||||||
assert((size & (ZSTD_ROWSIZE-1)) == 0); /* multiple of ZSTD_ROWSIZE */
|
assert((size & (ZSTD_ROWSIZE-1)) == 0); /* multiple of ZSTD_ROWSIZE */
|
||||||
assert(size < (1U<<31)); /* can be casted to int */
|
assert(size < (1U<<31)); /* can be casted to int */
|
||||||
|
|
||||||
#if defined (MEMORY_SANITIZER) && !defined (ZSTD_MSAN_DONT_POISON_WORKSPACE)
|
#if ZSTD_MEMORY_SANITIZER && !defined (ZSTD_MSAN_DONT_POISON_WORKSPACE)
|
||||||
/* To validate that the table re-use logic is sound, and that we don't
|
/* To validate that the table re-use logic is sound, and that we don't
|
||||||
* access table space that we haven't cleaned, we re-"poison" the table
|
* access table space that we haven't cleaned, we re-"poison" the table
|
||||||
* space every time we mark it dirty.
|
* space every time we mark it dirty.
|
||||||
|
Reference in New Issue
Block a user