From 44c0e223305e295f61fcfe1d52967c19731fbe1f Mon Sep 17 00:00:00 2001 From: Jussi Pakkanen Date: Tue, 30 Jul 2013 22:06:42 +0300 Subject: [PATCH] Can check for members in structures. --- environment.py | 12 ++++++++++++ interpreter.py | 21 +++++++++++++++++++++ test cases/common/44 has member/meson.build | 11 +++++++++++ 3 files changed, 44 insertions(+) create mode 100644 test cases/common/44 has member/meson.build diff --git a/environment.py b/environment.py index 3ccd385d2..68481faa1 100644 --- a/environment.py +++ b/environment.py @@ -201,6 +201,18 @@ int main(int argc, char **argv) { res = self.run(templ % (prefix, funcname)) return res.compiled + def has_member(self, typename, membername, prefix): + # This fails (returns true) if funcname is a ptr or a variable. + # The correct check is a lot more difficult. + # Fix this to do that eventually. + templ = '''%s +void foo() { + %s foo; + foo.%s; +}; +''' + return self.compiles(templ % (prefix, typename, membername)) + class CPPCompiler(CCompiler): def __init__(self, exelist): CCompiler.__init__(self, exelist) diff --git a/interpreter.py b/interpreter.py index 0025ec0d4..db5092236 100644 --- a/interpreter.py +++ b/interpreter.py @@ -651,6 +651,7 @@ class CompilerHolder(InterpreterObject): 'has_header': self.has_header_method, 'run' : self.run_method, 'has_function' : self.has_function_method, + 'has_member' : self.has_member_method, }) def run_method(self, args, kwargs): @@ -667,6 +668,26 @@ class CompilerHolder(InterpreterObject): def get_id_method(self, args, kwargs): return self.compiler.get_id() + def has_member_method(self, args, kwargs): + if len(args) != 2: + raise InterpreterException('Has_member takes exactly two arguments.') + typename = args[0] + if not isinstance(typename, str): + raise InterpreterException('Name of type must be a string.') + membername = args[1] + if not isinstance(membername, str): + raise InterpreterException('Name of member must be a string.') + prefix = kwargs.get('prefix', '') + if not isinstance(prefix, str): + raise InterpreterException('Prefix argument of has_function must be a string.') + had = self.compiler.has_member(typename, membername, prefix) + if had: + hadtxt = mlog.green('YES') + else: + hadtxt = mlog.red('NO') + mlog.log('Checking whether type "', mlog.bold(typename), + '" has member "', mlog.bold(membername), '": ', hadtxt, sep='') + return had def has_function_method(self, args, kwargs): if len(args) != 1: diff --git a/test cases/common/44 has member/meson.build b/test cases/common/44 has member/meson.build new file mode 100644 index 000000000..fa0187730 --- /dev/null +++ b/test cases/common/44 has member/meson.build @@ -0,0 +1,11 @@ +project('has member', 'c') + +cc = meson.get_compiler('c') + +if not cc.has_member('struct tm', 'tm_sec', prefix : '#include') + error('Did not detect member that exists.') +endif + +if cc.has_member('struct tm', 'tm_nonexistent', prefix : '#include') + error('Not existing member found.') +endif