Skip to content

Commit badb580

Browse files
Don't set shared.Settings from test runners (emscripten-core#6801)
* Don't set shared.Settings from test runners, only serialize modifications * xrange -> range * Fix rebase * Remove re-added skip method * Show error on emcc Settings assertions * Remove redundant (not-actually-used-before) arg parsing code in test setup * Re-add removed code, use json.loads to parse the setting. Turns out we use these overrides from the test runner to get_settings based on default environment. Meaning, running the asm2 test suite would have self.get_setting('WASM') == 1, because wasm is default.
1 parent 0c8c9cd commit badb580

4 files changed

Lines changed: 416 additions & 333 deletions

File tree

emcc.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1009,6 +1009,7 @@ def check(input_file):
10091009
assert shared.Settings.PGO == 0, 'pgo not supported in fastcomp'
10101010
assert shared.Settings.QUANTUM_SIZE == 4, 'altering the QUANTUM_SIZE is not supported'
10111011
except Exception as e:
1012+
logging.error('Compiler settings error: {}'.format(e))
10121013
exit_with_error('Compiler settings are incompatible with fastcomp. You can fall back to the older compiler core, although that is not recommended, see http://kripken.github.io/emscripten-site/docs/building_from_source/LLVM-Backend.html')
10131014

10141015
assert not shared.Settings.PGO, 'cannot run PGO in ASM_JS mode'

tests/runner.py

Lines changed: 25 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import webbrowser, hashlib, threading, platform
1515
import multiprocessing, functools, stat, string, random, fnmatch
1616
import atexit
17+
import json
1718
import operator
1819
import parallel_runner
1920

@@ -134,6 +135,7 @@ class RunnerCore(unittest.TestCase):
134135
# Change this to None to get stderr reporting, for debugging purposes
135136

136137
env = {}
138+
settings_mods = {}
137139

138140
EM_TESTRUNNER_DETECT_TEMPFILE_LEAKS = int(os.getenv('EM_TESTRUNNER_DETECT_TEMPFILE_LEAKS')) if os.getenv('EM_TESTRUNNER_DETECT_TEMPFILE_LEAKS') != None else 0
139141

@@ -143,7 +145,7 @@ def is_emterpreter(self):
143145
return False
144146

145147
def is_wasm_backend(self):
146-
return Settings.WASM_BACKEND
148+
return self.get_setting('WASM_BACKEND')
147149

148150
def uses_memory_init_file(self):
149151
if self.emcc_args is None:
@@ -152,7 +154,8 @@ def uses_memory_init_file(self):
152154
return int(self.emcc_args[self.emcc_args.index('--memory-init-file')+1])
153155
else:
154156
# side modules handle memory differently; binaryen puts the memory in the wasm module
155-
return ('-O2' in self.emcc_args or '-O3' in self.emcc_args or '-Oz' in self.emcc_args) and not (Settings.SIDE_MODULE or Settings.WASM)
157+
opt_supports = any(opt in self.emcc_args for opt in ('-O2', '-O3', '-Oz'))
158+
return opt_supports and not (self.get_setting('SIDE_MODULE') or self.get_setting('WASM'))
156159

157160
def set_temp_dir(self, temp_dir):
158161
self.temp_dir = temp_dir
@@ -161,7 +164,7 @@ def set_temp_dir(self, temp_dir):
161164
os.environ['EMCC_TEMP_DIR'] = self.temp_dir
162165

163166
def setUp(self):
164-
Settings.reset()
167+
self.settings_mods = {}
165168

166169
if self.EM_TESTRUNNER_DETECT_TEMPFILE_LEAKS:
167170
for root, dirnames, filenames in os.walk(self.temp_dir):
@@ -219,6 +222,20 @@ def tearDown(self):
219222
# assert not temp_file.endswith('.ll'), temp_file
220223
# # TODO assert not temp_file.startswith('emscripten_'), temp_file
221224

225+
def get_setting(self, key):
226+
if key in self.settings_mods:
227+
return self.settings_mods[key]
228+
return Settings[key]
229+
230+
def set_setting(self, key, value):
231+
self.settings_mods[key] = value
232+
233+
def serialize_settings(self):
234+
ret = []
235+
for key, value in self.settings_mods.items():
236+
ret += ['-s', '{}={}'.format(key, json.dumps(value))]
237+
return ret
238+
222239
def get_dir(self):
223240
return self.working_dir
224241

@@ -307,7 +324,7 @@ def ll_to_js(self, filename, post_build):
307324
transform.write('\nprocess(sys.argv[1])\n')
308325
transform.close()
309326
transform_args = ['--js-transform', "%s '%s'" % (PYTHON, transform_filename)]
310-
Building.emcc(filename + '.o', Settings.serialize() + emcc_args + transform_args + Building.COMPILER_TEST_OPTS, filename + '.o.js')
327+
Building.emcc(filename + '.o', self.serialize_settings() + emcc_args + transform_args + Building.COMPILER_TEST_OPTS, filename + '.o.js')
311328
if post2: post2(filename + '.o.js')
312329

313330
# Build JavaScript code from source code
@@ -348,7 +365,7 @@ def build(self, src, dirname, filename, output_processor=None, main_file=None, a
348365
os.remove(f + '.o')
349366
except:
350367
pass
351-
args = [PYTHON, EMCC] + Building.COMPILER_TEST_OPTS + Settings.serialize() + \
368+
args = [PYTHON, EMCC] + Building.COMPILER_TEST_OPTS + self.serialize_settings() + \
352369
['-I', dirname, '-I', os.path.join(dirname, 'include')] + \
353370
['-I' + include for include in includes] + \
354371
['-c', f, '-o', f + '.o']
@@ -376,7 +393,7 @@ def build(self, src, dirname, filename, output_processor=None, main_file=None, a
376393
if '.' not in all_files[i]:
377394
shutil.move(all_files[i], all_files[i] + '.bc')
378395
all_files[i] += '.bc'
379-
args = [PYTHON, EMCC] + Building.COMPILER_TEST_OPTS + Settings.serialize() + \
396+
args = [PYTHON, EMCC] + Building.COMPILER_TEST_OPTS + self.serialize_settings() + \
380397
self.emcc_args + \
381398
['-I', dirname, '-I', os.path.join(dirname, 'include')] + \
382399
['-I' + include for include in includes] + \
@@ -477,7 +494,7 @@ def run_generated_code(self, engine, filename, args=[], check_timeout=True, outp
477494
os.chdir(cwd)
478495
out = open(stdout, 'r').read()
479496
err = open(stderr, 'r').read()
480-
if engine == SPIDERMONKEY_ENGINE and Settings.ASM_JS == 1:
497+
if engine == SPIDERMONKEY_ENGINE and self.get_setting('ASM_JS') == 1:
481498
err = self.validate_asmjs(err)
482499
if output_nicerizer:
483500
ret = output_nicerizer(out, err)
@@ -664,7 +681,7 @@ def do_run(self, src, expected_output, args=[], output_nicerizer=None,
664681
js_engines=None, post_build=None, basename='src.cpp', libraries=[],
665682
includes=[], force_c=False, build_ll_hook=None,
666683
assert_returncode=None, assert_identical=False):
667-
if Settings.ASYNCIFY == 1 and self.is_wasm_backend():
684+
if self.get_setting('ASYNCIFY') == 1 and self.is_wasm_backend():
668685
self.skipTest("wasm backend doesn't support ASYNCIFY yet")
669686
if force_c or (main_file is not None and main_file[-2:]) == '.c':
670687
basename = 'src.c'

tests/test_browser.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2011,7 +2011,7 @@ def test_aniso(self):
20112011
if SPIDERMONKEY_ENGINE in JS_ENGINES:
20122012
# asm.js-ification check
20132013
Popen([PYTHON, EMCC, path_from_root('tests', 'aniso.c'), '-O2', '-g2', '-s', 'LEGACY_GL_EMULATION=1', '-lGL', '-lSDL', '-Wno-incompatible-pointer-types']).communicate()
2014-
Settings.ASM_JS = 1
2014+
self.set_setting('ASM_JS', 1)
20152015
self.run_generated_code(SPIDERMONKEY_ENGINE, 'a.out.js', assert_returncode=None)
20162016
print('passed asm test')
20172017

0 commit comments

Comments
 (0)