aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xenvironment.py7
-rwxr-xr-xinterpreter.py9
-rw-r--r--test cases/common/35 sizeof/config.h.in1
-rw-r--r--test cases/common/35 sizeof/meson.build2
-rw-r--r--test cases/common/35 sizeof/prog.c5
5 files changed, 19 insertions, 5 deletions
diff --git a/environment.py b/environment.py
index 00cc4e4..301180e 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<stdio.h>
+%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 fdbeed1..8b33491 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 b5ed4ca..a442e8a 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 af04b4d..b676fa9 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<wchar.h>')
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 68e3462..9164c18 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<stdio.h>
+#include<wchar.h>
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;
}