diff options
author | Jussi Pakkanen <jpakkane@gmail.com> | 2013-07-30 22:06:42 +0300 |
---|---|---|
committer | Jussi Pakkanen <jpakkane@gmail.com> | 2013-07-30 22:06:42 +0300 |
commit | 44c0e223305e295f61fcfe1d52967c19731fbe1f (patch) | |
tree | ca3bf14c770f6844ce69b651bdd61fe42b1d67b1 | |
parent | 6ba724c5c792b1683aeee5f42ea9d836d2d75d84 (diff) | |
download | meson-44c0e223305e295f61fcfe1d52967c19731fbe1f.zip meson-44c0e223305e295f61fcfe1d52967c19731fbe1f.tar.gz meson-44c0e223305e295f61fcfe1d52967c19731fbe1f.tar.bz2 |
Can check for members in structures.
-rw-r--r-- | environment.py | 12 | ||||
-rw-r--r-- | interpreter.py | 21 | ||||
-rw-r--r-- | test cases/common/44 has member/meson.build | 11 |
3 files changed, 44 insertions, 0 deletions
diff --git a/environment.py b/environment.py index 3ccd385..68481fa 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 0025ec0..db50922 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 0000000..fa01877 --- /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<time.h>') + error('Did not detect member that exists.') +endif + +if cc.has_member('struct tm', 'tm_nonexistent', prefix : '#include<time.h>') + error('Not existing member found.') +endif |