summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEric Anholt <eric@anholt.net>2015-07-15 15:37:26 -0700
committerEric Anholt <eric@anholt.net>2015-07-15 16:09:06 -0700
commitb2c00a18af8e3816b77f57092b0d24843a59a8a5 (patch)
treeed8fb081448619625624a3e3d7cd5678043e41c7
parentd4620b7dd30e5cd398e10d8d5fb0e25f4cc65817 (diff)
downloadlibepoxy-b2c00a18af8e3816b77f57092b0d24843a59a8a5.tar.gz
Use a concatenated string for enum descriptions.
Saves another 15kb of compiled code.
-rwxr-xr-xsrc/gen_dispatch.py21
1 files changed, 16 insertions, 5 deletions
diff --git a/src/gen_dispatch.py b/src/gen_dispatch.py
index 2b2fe6f..9372300 100755
--- a/src/gen_dispatch.py
+++ b/src/gen_dispatch.py
@@ -644,13 +644,24 @@ class Generator(object):
# Writes the mapping from enums to the strings describing them
# for epoxy_print_failure_reasons().
- self.outln('static const char *enum_strings[] = {')
-
sorted_providers = sorted(self.provider_enum.keys())
+ self.enum_string_offset = {}
+ offset = 0
+ self.outln('static const char *enum_string =')
+ for human_name in sorted_providers:
+ self.outln(' "{0}\\0"'.format(human_name));
+ self.enum_string_offset[human_name] = offset
+ offset += len(human_name.replace('\\', '')) + 1
+ self.outln(' ;')
+ self.outln('')
+ # We're using uint16_t for the offsets.
+ assert(offset < 65536)
+
+ self.outln('static const uint16_t enum_string_offsets[] = {')
for human_name in sorted_providers:
enum = self.provider_enum[human_name]
- self.outln(' [{0}] = "{1}",'.format(enum, human_name))
+ self.outln(' [{0}] = {1},'.format(enum, self.enum_string_offset[human_name]))
self.outln('};')
self.outln('')
@@ -697,8 +708,8 @@ class Generator(object):
# aborting. (In non-epoxy GL usage, the app developer would
# call into some blank stub function and segfault).
self.outln(' fprintf(stderr, "No provider of %s found. Requires one of:\\n", name);')
- self.outln(' for (i = 0; providers[i] != 0; i++) {')
- self.outln(' fprintf(stderr, " %s\\n", enum_strings[providers[i]]);')
+ self.outln(' for (i = 0; providers[i] != {0}_provider_terminator; i++) {{'.format(self.target))
+ self.outln(' fprintf(stderr, " %s\\n", enum_string + enum_string_offsets[providers[i]]);')
self.outln(' }')
self.outln(' if (providers[0] == {0}_provider_terminator) {{'.format(self.target))
self.outln(' fprintf(stderr, " No known providers. This is likely a bug "')