From e453c408da14448d3ac8ffabb8010aafe8ee9ac0 Mon Sep 17 00:00:00 2001 From: Jussi Pakkanen Date: Sat, 1 Jun 2013 00:47:29 +0300 Subject: [PATCH] Can add extra #includes to sizeof checks. --- environment.py | 7 +++++-- interpreter.py | 9 ++++++--- test cases/common/35 sizeof/config.h.in | 1 + test cases/common/35 sizeof/meson.build | 2 ++ test cases/common/35 sizeof/prog.c | 5 +++++ 5 files changed, 19 insertions(+), 5 deletions(-) diff --git a/environment.py b/environment.py index 00cc4e4ca..301180ea5 100755 --- a/environment.py +++ b/environment.py @@ -133,8 +133,10 @@ class CCompiler(): pass return p.returncode == 0 - def sizeof(self, element): + def sizeof(self, element, prefix): templ = '''#include +%s + int main(int argc, char **argv) { printf("%%ld\\n", (long)(sizeof(%s))); return 0; @@ -144,7 +146,8 @@ int main(int argc, char **argv) { exename = srcname + '.exe' # Is guaranteed to be executable on every platform. os.close(fd) ofile = open(srcname, 'w') - code = templ % element + code = templ % (prefix, element) + print(code) ofile.write(code) ofile.close() commands = self.get_exelist() diff --git a/interpreter.py b/interpreter.py index fdbeed1db..8b3349179 100755 --- a/interpreter.py +++ b/interpreter.py @@ -546,10 +546,13 @@ class CompilerHolder(InterpreterObject): def sizeof_method(self, args, kwargs): if len(args) != 1: raise InterpreterException('Sizeof takes exactly one argument.') - string = args[0] - if not isinstance(string, str): + element = args[0] + if not isinstance(element, str): raise InterpreterException('Argument to sizeof must be a string.') - return self.compiler.sizeof(string) + prefix = kwargs.get('prefix', '') + if not isinstance(prefix, str): + raise InterpreterException('Prefix argument of sizeof must be a string.') + return self.compiler.sizeof(element, prefix) def compiles_method(self, args, kwargs): if len(args) != 1: diff --git a/test cases/common/35 sizeof/config.h.in b/test cases/common/35 sizeof/config.h.in index b5ed4ca8e..a442e8a4e 100644 --- a/test cases/common/35 sizeof/config.h.in +++ b/test cases/common/35 sizeof/config.h.in @@ -1 +1,2 @@ #define INTSIZE @INTSIZE@ +#define WCHARSIZE @WCHARSIZE@ diff --git a/test cases/common/35 sizeof/meson.build b/test cases/common/35 sizeof/meson.build index af04b4d55..b676fa900 100644 --- a/test cases/common/35 sizeof/meson.build +++ b/test cases/common/35 sizeof/meson.build @@ -2,9 +2,11 @@ project('sizeof', 'c') cc = meson.get_compiler('c') intsize = cc.sizeof('int') +wcharsize = cc.sizeof('wchar_t', prefix : '#include') cd = configuration_data() cd.set('INTSIZE', intsize) +cd.set('WCHARSIZE', wcharsize) configure_file(input : 'config.h.in', output : 'config.h', configuration : cd) e = executable('prog', 'prog.c', include_dirs : include_directories('.')) diff --git a/test cases/common/35 sizeof/prog.c b/test cases/common/35 sizeof/prog.c index 68e346285..9164c18b0 100644 --- a/test cases/common/35 sizeof/prog.c +++ b/test cases/common/35 sizeof/prog.c @@ -1,10 +1,15 @@ #include"config.h" #include +#include int main(int argc, char **argv) { if(INTSIZE != sizeof(int)) { fprintf(stderr, "Mismatch: detected int size %d, actual size %d.\n", INTSIZE, (int)sizeof(int)); return 1; } + if(WCHARSIZE != sizeof(wchar_t)) { + fprintf(stderr, "Mismatch: detected wchar size %d, actual size %d.\n", WCHARSIZE, (int)sizeof(wchar_t)); + return 1; + } return 0; }