diff options
-rw-r--r-- | environment.py | 35 | ||||
-rw-r--r-- | interpreter.py | 2 | ||||
-rw-r--r-- | test cases/common/39 tryrun/meson.build | 4 |
3 files changed, 23 insertions, 18 deletions
diff --git a/environment.py b/environment.py index 309a1e3..03fa21b 100644 --- a/environment.py +++ b/environment.py @@ -152,22 +152,13 @@ class CCompiler(): pass return p.returncode == 0 - def sizeof(self, element, prefix): - templ = '''#include<stdio.h> -%s - -int main(int argc, char **argv) { - printf("%%ld\\n", (long)(sizeof(%s))); - return 0; -}; -''' + def run(self, code): (fd, srcname) = tempfile.mkstemp(suffix='.'+self.default_suffix) - exename = srcname + '.exe' # Is guaranteed to be executable on every platform. os.close(fd) ofile = open(srcname, 'w') - code = templ % (prefix, element) ofile.write(code) ofile.close() + exename = srcname + '.exe' # Is guaranteed to be executable on every platform. commands = self.get_exelist() commands.append(srcname) commands += self.get_output_flags(exename) @@ -175,13 +166,27 @@ int main(int argc, char **argv) { p.communicate() os.remove(srcname) if p.returncode != 0: - raise EnvironmentException('Could not compile sizeof test.') + return RunResult(False) pe = subprocess.Popen(exename, stdout=subprocess.PIPE, stderr=subprocess.PIPE) - so = pe.communicate()[0] + (so, se) = pe.communicate() os.remove(exename) - if pe.returncode != 0: + return RunResult(True, pe.returncode, so.decode(), se.decode()) + + def sizeof(self, element, prefix): + templ = '''#include<stdio.h> +%s + +int main(int argc, char **argv) { + printf("%%ld\\n", (long)(sizeof(%s))); + return 0; +}; +''' + res = self.run(templ % (prefix, element)) + if not res.compiled: + raise EnvironmentException('Could not compile sizeof test.') + if res.returncode != 0: raise EnvironmentException('Could not run sizeof test binary.') - return int(so.decode()) + return int(res.stdout) class CPPCompiler(CCompiler): def __init__(self, exelist): diff --git a/interpreter.py b/interpreter.py index 834f7f8..ebd29e5 100644 --- a/interpreter.py +++ b/interpreter.py @@ -660,7 +660,7 @@ class CompilerHolder(InterpreterObject): code = code.get_value() if not isinstance(code, str): raise InterpreterException('First argument is not a string.') - result = environment.RunResult(True, 0, 'stdout', 'stderr') + result = self.compiler.run(code) return TryRunResultHolder(result) def get_id_method(self, args, kwargs): diff --git a/test cases/common/39 tryrun/meson.build b/test cases/common/39 tryrun/meson.build index 7f4cdad..212f9fa 100644 --- a/test cases/common/39 tryrun/meson.build +++ b/test cases/common/39 tryrun/meson.build @@ -23,9 +23,9 @@ err = cc.run(error_code) noc = cc.run(no_compile_code) if noc.compiled() - message('Compilation fail test failed.') + error('Compilation fail test failed.') else - error('Fail detected.') + message('Fail detected properly.') endif if ok.compiled() |