1414import webbrowser , hashlib , threading , platform
1515import multiprocessing , functools , stat , string , random , fnmatch
1616import atexit
17+ import json
1718import operator
1819import 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 ('\n process(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'
0 commit comments