blob: 993e270267b2d8c74177a5e5753ccd27b6163ab3 [file] [log] [blame] [edit]
# Copyright 2015 The Emscripten Authors. All rights reserved.
# Emscripten is available under two separate licenses, the MIT license and the
# University of Illinois/NCSA Open Source License. Both these licenses can be
# found in the LICENSE file.
class PreciseF32(object):
name = 'PRECISE_F32 == 2'
@staticmethod
def get(settings, minified):
if settings.PRECISE_F32 == 2:
# Potentially-modifiable code, load as text, modify, then execute. This lets you
# patch the code on the client machine right before it is executed, perhaps based
# on information about the client.
mod = '''
console.log('optimizing out Math.fround calls');
code = code.replace("'use asm'", "'almost asm'").replace('"use asm"', '"almost asm"');
'''
if not minified:
# simple dumb replace
mod += "code = code.replace(/Math_fround\\(/g, '(')\n"
else:
# minified, not quite so simple
mod += '''
try {
console.log('optimizing out Math.fround calls');
var m = /var ([^=]+)=global\\.Math\\.fround;/.exec(code);
var minified = m[1];
if (!minified) throw 'fail';
// The minified JS variable for Math.fround might contain the '$' sign, so this must be escaped to \\$ to be used as a search pattern.
minified = minified.replace(/\\$/g, "\\\\$$");
do {
var moar = false; // we need to re-do, as x(x( will not be fixed
code = code.replace(new RegExp('[^a-zA-Z0-9\\\\$\\\\_]' + minified + '\\\\(', 'g'), function(s) { moar = true; return s[0] + '(' });
} while (moar);
} catch(e) { console.log('failed to optimize out Math.fround calls ' + e) }
'''
return ['if (!Math.fround) { ' + mod + ' }']
return []
# Handlers
handlers = [PreciseF32]
# client-side asm code modification
def get_mods(settings, minified, separate_asm):
ret = []
for handler in handlers:
curr = handler.get(settings, minified)
if curr:
assert separate_asm, 'options that modify code on the client, like ' + handler.name + ', require --separate-asm'
ret = ret + curr
return ret