diff options
author | Alon Zakai <alonzakai@gmail.com> | 2013-09-24 18:25:09 -0700 |
---|---|---|
committer | Alon Zakai <alonzakai@gmail.com> | 2013-09-24 18:25:09 -0700 |
commit | 05b6aa32a5f1633797f7eae390b3a8048b29ca69 (patch) | |
tree | 43543261bb5485b1c109e0e9f93dcb2f7bcd227d /src/library.js | |
parent | 6010666be99cd0322babba1174cfbc65c776deb5 (diff) | |
parent | 8e2d812b49f7de9487e1c816229106af0cf39d0d (diff) |
Merge branch 'incoming'
Diffstat (limited to 'src/library.js')
-rw-r--r-- | src/library.js | 178 |
1 files changed, 125 insertions, 53 deletions
diff --git a/src/library.js b/src/library.js index f3c3c1ec..5c2c858d 100644 --- a/src/library.js +++ b/src/library.js @@ -30,10 +30,10 @@ LibraryManager.library = { __dirent_struct_layout: Runtime.generateStructInfo([ ['i32', 'd_ino'], - ['b1024', 'd_name'], ['i32', 'd_off'], - ['i32', 'd_reclen'], - ['i32', 'd_type']]), + ['i16', 'd_reclen'], + ['i8', 'd_type'], + ['b256', 'd_name']]), opendir__deps: ['$FS', '__setErrNo', '$ERRNO_CODES', '__dirent_struct_layout', 'open'], opendir: function(dirname) { // DIR *opendir(const char *dirname); @@ -255,22 +255,24 @@ LibraryManager.library = { __stat_struct_layout: Runtime.generateStructInfo([ ['i32', 'st_dev'], - ['i32', 'st_ino'], + ['i32', '__st_dev_padding'], + ['i32', '__st_ino_truncated'], ['i32', 'st_mode'], ['i32', 'st_nlink'], ['i32', 'st_uid'], ['i32', 'st_gid'], ['i32', 'st_rdev'], + ['i32', '__st_rdev_padding'], ['i32', 'st_size'], - ['i32', 'st_atime'], - ['i32', 'st_spare1'], - ['i32', 'st_mtime'], - ['i32', 'st_spare2'], - ['i32', 'st_ctime'], - ['i32', 'st_spare3'], ['i32', 'st_blksize'], ['i32', 'st_blocks'], - ['i32', 'st_spare4']]), + ['i32', 'st_atim_secs'], + ['i32', 'st_atim_nsecs'], + ['i32', 'st_mtim_secs'], + ['i32', 'st_mtim_nsecs'], + ['i32', 'st_ctim_secs'], + ['i32', 'st_ctim_nsecs'], + ['i32', 'st_ino']]), stat__deps: ['$FS', '__stat_struct_layout'], stat: function(path, buf, dontResolveLastLink) { // http://pubs.opengroup.org/onlinepubs/7908799/xsh/stat.html @@ -281,18 +283,24 @@ LibraryManager.library = { try { var stat = dontResolveLastLink ? FS.lstat(path) : FS.stat(path); {{{ makeSetValue('buf', '___stat_struct_layout.st_dev', 'stat.dev', 'i32') }}}; - {{{ makeSetValue('buf', '___stat_struct_layout.st_ino', 'stat.ino', 'i32') }}} + {{{ makeSetValue('buf', '___stat_struct_layout.__st_dev_padding', '0', 'i32') }}}; + {{{ makeSetValue('buf', '___stat_struct_layout.__st_ino_truncated', 'stat.ino', 'i32') }}}; {{{ makeSetValue('buf', '___stat_struct_layout.st_mode', 'stat.mode', 'i32') }}} {{{ makeSetValue('buf', '___stat_struct_layout.st_nlink', 'stat.nlink', 'i32') }}} {{{ makeSetValue('buf', '___stat_struct_layout.st_uid', 'stat.uid', 'i32') }}} {{{ makeSetValue('buf', '___stat_struct_layout.st_gid', 'stat.gid', 'i32') }}} {{{ makeSetValue('buf', '___stat_struct_layout.st_rdev', 'stat.rdev', 'i32') }}} + {{{ makeSetValue('buf', '___stat_struct_layout.__st_rdev_padding', '0', 'i32') }}}; {{{ makeSetValue('buf', '___stat_struct_layout.st_size', 'stat.size', 'i32') }}} - {{{ makeSetValue('buf', '___stat_struct_layout.st_atime', 'Math.floor(stat.atime.getTime() / 1000)', 'i32') }}} - {{{ makeSetValue('buf', '___stat_struct_layout.st_mtime', 'Math.floor(stat.mtime.getTime() / 1000)', 'i32') }}} - {{{ makeSetValue('buf', '___stat_struct_layout.st_ctime', 'Math.floor(stat.ctime.getTime() / 1000)', 'i32') }}} {{{ makeSetValue('buf', '___stat_struct_layout.st_blksize', '4096', 'i32') }}} {{{ makeSetValue('buf', '___stat_struct_layout.st_blocks', 'stat.blocks', 'i32') }}} + {{{ makeSetValue('buf', '___stat_struct_layout.st_atim_secs', 'Math.floor(stat.atime.getTime() / 1000)', 'i32') }}} + {{{ makeSetValue('buf', '___stat_struct_layout.st_atim_nsecs', '0', 'i32') }}} + {{{ makeSetValue('buf', '___stat_struct_layout.st_mtim_secs', 'Math.floor(stat.mtime.getTime() / 1000)', 'i32') }}} + {{{ makeSetValue('buf', '___stat_struct_layout.st_mtim_nsecs', '0', 'i32') }}} + {{{ makeSetValue('buf', '___stat_struct_layout.st_ctim_secs', 'Math.floor(stat.ctime.getTime() / 1000)', 'i32') }}} + {{{ makeSetValue('buf', '___stat_struct_layout.st_ctim_nsecs', '0', 'i32') }}} + {{{ makeSetValue('buf', '___stat_struct_layout.st_ino', 'stat.ino', 'i32') }}} return 0; } catch (e) { FS.handleFSError(e); @@ -438,8 +446,15 @@ LibraryManager.library = { ['i32', 'f_ffree'], ['i32', 'f_favail'], ['i32', 'f_fsid'], + ['i32', '__padding'], ['i32', 'f_flag'], - ['i32', 'f_namemax']]), + ['i32', 'f_namemax'], + ['i32', '__reserved_1'], + ['i32', '__reserved_2'], + ['i32', '__reserved_3'], + ['i32', '__reserved_4'], + ['i32', '__reserved_5'], + ['i32', '__reserved_6']]), statvfs__deps: ['$FS', '__statvfs_struct_layout'], statvfs: function(path, buf) { // http://pubs.opengroup.org/onlinepubs/009695399/functions/statvfs.html @@ -478,8 +493,7 @@ LibraryManager.library = { ['i16', 'l_whence'], ['i32', 'l_start'], ['i32', 'l_len'], - ['i16', 'l_pid'], - ['i16', 'l_xxx']]), + ['i16', 'l_pid']]), open__deps: ['$FS', '__setErrNo', '$ERRNO_CODES', '__dirent_struct_layout'], open: function(path, oflag, varargs) { // int open(const char *path, int oflag, ...); @@ -1691,7 +1705,7 @@ LibraryManager.library = { if (nextC > 0) { var maxx = 1; if (nextC > formatIndex+1) { - var sub = format.substring(formatIndex+1, nextC) + var sub = format.substring(formatIndex+1, nextC); maxx = parseInt(sub); if (maxx != sub) maxx = 0; } @@ -1709,6 +1723,53 @@ LibraryManager.library = { } } + // handle %[...] + if (format[formatIndex] === '%' && format.indexOf('[', formatIndex+1) > 0) { + var match = /\%([0-9]*)\[(\^)?(\]?[^\]]*)\]/.exec(format.substring(formatIndex)); + if (match) { + var maxNumCharacters = parseInt(match[1]) || Infinity; + var negateScanList = (match[2] === '^'); + var scanList = match[3]; + + // expand "middle" dashs into character sets + var middleDashMatch; + while ((middleDashMatch = /([^\-])\-([^\-])/.exec(scanList))) { + var rangeStartCharCode = middleDashMatch[1].charCodeAt(0); + var rangeEndCharCode = middleDashMatch[2].charCodeAt(0); + for (var expanded = ''; rangeStartCharCode <= rangeEndCharCode; expanded += String.fromCharCode(rangeStartCharCode++)); + scanList = scanList.replace(middleDashMatch[1] + '-' + middleDashMatch[2], expanded); + } + + var argPtr = {{{ makeGetValue('varargs', 'argIndex', 'void*') }}}; + argIndex += Runtime.getAlignSize('void*', null, true); + fields++; + + for (var i = 0; i < maxNumCharacters; i++) { + next = get(); + if (negateScanList) { + if (scanList.indexOf(String.fromCharCode(next)) < 0) { + {{{ makeSetValue('argPtr++', 0, 'next', 'i8') }}}; + } else { + unget(); + break; + } + } else { + if (scanList.indexOf(String.fromCharCode(next)) >= 0) { + {{{ makeSetValue('argPtr++', 0, 'next', 'i8') }}}; + } else { + unget(); + break; + } + } + } + + // write out null-terminating character + {{{ makeSetValue('argPtr++', 0, '0', 'i8') }}}; + formatIndex += match[0].length; + + continue; + } + } // remove whitespace while (1) { next = get(); @@ -1770,6 +1831,17 @@ LibraryManager.library = { } else { next = get(); var first = true; + + // Strip the optional 0x prefix for %x. + if ((type == 'x' || type == 'X') && (next == {{{ charCode('0') }}})) { + var peek = get(); + if (peek == {{{ charCode('x') }}} || peek == {{{ charCode('X') }}}) { + next = get(); + } else { + unget(); + } + } + while ((curr < max_ || isNaN(max_)) && next > 0) { if (!(next in __scanString.whiteSpace) && // stop on whitespace (type == 's' || @@ -4260,9 +4332,9 @@ LibraryManager.library = { throw 'trap! ' + new Error().stack; }, - __assert_fail: function(condition, file, line) { + __assert_fail: function(condition, filename, line, func) { ABORT = true; - throw 'Assertion failed: ' + Pointer_stringify(condition) + ' at ' + new Error().stack; + throw 'Assertion failed: ' + Pointer_stringify(condition) + ', at: ' + [filename ? Pointer_stringify(filename) : 'unknown filename', line, func ? Pointer_stringify(func) : 'unknown function'] + ' at ' + new Error().stack; }, __assert_func: function(filename, line, func, condition) { @@ -4843,8 +4915,9 @@ LibraryManager.library = { // for negative zero (once copysign supports that). return _copysign(1.0, x) < 0; }, - __signbitf: '__signbit', __signbitd: '__signbit', + __signbitf: '__signbit', + __signbitl: '__signbit', hypot: function(a, b) { return Math.sqrt(a*a + b*b); }, @@ -5009,25 +5082,28 @@ LibraryManager.library = { return divt; }, - __fpclassifyf: function(x) { + __fpclassify: function(x) { if (isNaN(x)) return {{{ cDefine('FP_NAN') }}}; if (!isFinite(x)) return {{{ cDefine('FP_INFINITE') }}}; if (x == 0) return {{{ cDefine('FP_ZERO') }}}; // FP_SUBNORMAL..? return {{{ cDefine('FP_NORMAL') }}}; }, - __fpclassifyd: '__fpclassifyf', + __fpclassifyd: '__fpclassify', // Needed by tests/python/python.le32.bc + __fpclassifyf: '__fpclassify', + __fpclassifyl: '__fpclassify', // ========================================================================== // sys/utsname.h // ========================================================================== __utsname_struct_layout: Runtime.generateStructInfo([ - ['b32', 'sysname'], - ['b32', 'nodename'], - ['b32', 'release'], - ['b32', 'version'], - ['b32', 'machine']]), + ['b65', 'sysname'], + ['b65', 'nodename'], + ['b65', 'release'], + ['b65', 'version'], + ['b65', 'machine'], + ['b65', 'domainname']]), uname__deps: ['__utsname_struct_layout'], uname: function(name) { // int uname(struct utsname *name); @@ -5340,7 +5416,7 @@ LibraryManager.library = { ['i32', 'tm_yday'], ['i32', 'tm_isdst'], ['i32', 'tm_gmtoff'], - ['i32', 'tm_zone']]), + ['i8*', 'tm_zone']]), // Statically allocated time struct. __tm_current: 'allocate({{{ Runtime.QUANTUM_SIZE }}}*26, "i8", ALLOC_STATIC)', // Statically allocated timezone string. We only use GMT as a timezone. @@ -5401,8 +5477,8 @@ LibraryManager.library = { timegm__deps: ['mktime'], timegm: function(tmPtr) { _tzset(); - var offset = {{{ makeGetValue(makeGlobalUse('__timezone'), 0, 'i32') }}}; - var daylight = {{{ makeGetValue(makeGlobalUse('__daylight'), 0, 'i32') }}}; + var offset = {{{ makeGetValue(makeGlobalUse('_timezone'), 0, 'i32') }}}; + var daylight = {{{ makeGetValue(makeGlobalUse('_daylight'), 0, 'i32') }}}; daylight = (daylight == 1) ? 60 * 60 : 0; var ret = _mktime(tmPtr) + offset - daylight; return ret; @@ -5475,27 +5551,27 @@ LibraryManager.library = { // TODO: Initialize these to defaults on startup from system settings. // Note: glibc has one fewer underscore for all of these. Also used in other related functions (timegm) - _tzname: 'allocate({{{ 2*Runtime.QUANTUM_SIZE }}}, "i32*", ALLOC_STATIC)', - _daylight: 'allocate(1, "i32*", ALLOC_STATIC)', - _timezone: 'allocate(1, "i32*", ALLOC_STATIC)', - tzset__deps: ['_tzname', '_daylight', '_timezone'], + tzname: 'allocate({{{ 2*Runtime.QUANTUM_SIZE }}}, "i32*", ALLOC_STATIC)', + daylight: 'allocate(1, "i32*", ALLOC_STATIC)', + timezone: 'allocate(1, "i32*", ALLOC_STATIC)', + tzset__deps: ['tzname', 'daylight', 'timezone'], tzset: function() { // TODO: Use (malleable) environment variables instead of system settings. if (_tzset.called) return; _tzset.called = true; - {{{ makeSetValue(makeGlobalUse('__timezone'), '0', '-(new Date()).getTimezoneOffset() * 60', 'i32') }}} + {{{ makeSetValue(makeGlobalUse('_timezone'), '0', '-(new Date()).getTimezoneOffset() * 60', 'i32') }}} var winter = new Date(2000, 0, 1); var summer = new Date(2000, 6, 1); - {{{ makeSetValue(makeGlobalUse('__daylight'), '0', 'Number(winter.getTimezoneOffset() != summer.getTimezoneOffset())', 'i32') }}} + {{{ makeSetValue(makeGlobalUse('_daylight'), '0', 'Number(winter.getTimezoneOffset() != summer.getTimezoneOffset())', 'i32') }}} var winterName = 'GMT'; // XXX do not rely on browser timezone info, it is very unpredictable | winter.toString().match(/\(([A-Z]+)\)/)[1]; var summerName = 'GMT'; // XXX do not rely on browser timezone info, it is very unpredictable | summer.toString().match(/\(([A-Z]+)\)/)[1]; var winterNamePtr = allocate(intArrayFromString(winterName), 'i8', ALLOC_NORMAL); var summerNamePtr = allocate(intArrayFromString(summerName), 'i8', ALLOC_NORMAL); - {{{ makeSetValue(makeGlobalUse('__tzname'), '0', 'winterNamePtr', 'i32') }}} - {{{ makeSetValue(makeGlobalUse('__tzname'), Runtime.QUANTUM_SIZE, 'summerNamePtr', 'i32') }}} + {{{ makeSetValue(makeGlobalUse('_tzname'), '0', 'winterNamePtr', 'i32') }}} + {{{ makeSetValue(makeGlobalUse('_tzname'), Runtime.QUANTUM_SIZE, 'summerNamePtr', 'i32') }}} }, stime__deps: ['$ERRNO_CODES', '__setErrNo'], @@ -6566,10 +6642,6 @@ LibraryManager.library = { return me.ret; }, - _Z7catopenPKci: function() { throw 'catopen not implemented' }, - _Z7catgetsP8_nl_catdiiPKc: function() { throw 'catgets not implemented' }, - _Z8catcloseP8_nl_catd: function() { throw 'catclose not implemented' }, - // ========================================================================== // errno.h // ========================================================================== @@ -7449,12 +7521,13 @@ LibraryManager.library = { }, gethostbyname_r__deps: ['gethostbyname'], - gethostbyname_r: function(name, ret, buf, buflen, err) { + gethostbyname_r: function(name, ret, buf, buflen, out, err) { var data = _gethostbyname(name); _memcpy(ret, data, ___hostent_struct_layout.__size__); _free(data); {{{ makeSetValue('err', '0', '0', 'i32') }}}; - return ret; + {{{ makeSetValue('out', '0', 'ret', '*') }}}; + return 0; }, getaddrinfo__deps: ['$Sockets', '$DNS', '_addrinfo_layout', '_inet_pton4_raw', '_inet_ntop4_raw', '_inet_pton6_raw', '_inet_ntop6_raw', '_write_sockaddr', 'htonl'], @@ -7692,14 +7765,13 @@ LibraryManager.library = { 0x0600000a, 0x0700000a, 0x0800000a, 0x0900000a, 0x0a00000a, 0x0b00000a, 0x0c00000a, 0x0d00000a, 0x0e00000a], /* 0x0100000a is reserved */ sockaddr_in_layout: Runtime.generateStructInfo([ - ['i32', 'sin_family'], + ['i16', 'sin_family'], ['i16', 'sin_port'], ['i32', 'sin_addr'], - ['i32', 'sin_zero'], - ['i16', 'sin_zero_b'], + ['b8', 'sin_zero'], ]), sockaddr_in6_layout: Runtime.generateStructInfo([ - ['i32', 'sin6_family'], + ['i16', 'sin6_family'], ['i16', 'sin6_port'], ['i32', 'sin6_flowinfo'], ['b16', 'sin6_addr'], @@ -8108,7 +8180,7 @@ LibraryManager.library = { _read_sockaddr__deps: ['$Sockets', '_inet_ntop4_raw', '_inet_ntop6_raw'], _read_sockaddr: function (sa, salen) { // family / port offsets are common to both sockaddr_in and sockaddr_in6 - var family = {{{ makeGetValue('sa', 'Sockets.sockaddr_in_layout.sin_family', 'i32') }}}; + var family = {{{ makeGetValue('sa', 'Sockets.sockaddr_in_layout.sin_family', 'i16') }}}; var port = _ntohs({{{ makeGetValue('sa', 'Sockets.sockaddr_in_layout.sin_port', 'i16') }}}); var addr; @@ -8143,7 +8215,7 @@ LibraryManager.library = { switch (family) { case {{{ cDefine('AF_INET') }}}: addr = __inet_pton4_raw(addr); - {{{ makeSetValue('sa', 'Sockets.sockaddr_in_layout.sin_family', 'family', 'i32') }}}; + {{{ makeSetValue('sa', 'Sockets.sockaddr_in_layout.sin_family', 'family', 'i16') }}}; {{{ makeSetValue('sa', 'Sockets.sockaddr_in_layout.sin_addr', 'addr', 'i32') }}}; {{{ makeSetValue('sa', 'Sockets.sockaddr_in_layout.sin_port', '_htons(port)', 'i16') }}}; break; @@ -8782,7 +8854,7 @@ function autoAddDeps(object, name) { } // Add aborting stubs for various libc stuff needed by libc++ -['pthread_cond_signal', 'pthread_equal', 'wcstol', 'wcstoll', 'wcstoul', 'wcstoull', 'wcstof', 'wcstod', 'wcstold', 'swprintf', 'pthread_join', 'pthread_detach', 'strcoll_l', 'strxfrm_l', 'wcscoll_l', 'toupper_l', 'tolower_l', 'iswspace_l', 'iswprint_l', 'iswcntrl_l', 'iswupper_l', 'iswlower_l', 'iswalpha_l', 'iswdigit_l', 'iswpunct_l', 'iswxdigit_l', 'iswblank_l', 'wcsxfrm_l', 'towupper_l', 'towlower_l'].forEach(function(aborter) { +['pthread_cond_signal', 'pthread_equal', 'wcstol', 'wcstoll', 'wcstoul', 'wcstoull', 'wcstof', 'wcstod', 'wcstold', 'swprintf', 'pthread_join', 'pthread_detach', 'strcoll_l', 'strxfrm_l', 'wcscoll_l', 'toupper_l', 'tolower_l', 'iswspace_l', 'iswprint_l', 'iswcntrl_l', 'iswupper_l', 'iswlower_l', 'iswalpha_l', 'iswdigit_l', 'iswpunct_l', 'iswxdigit_l', 'iswblank_l', 'wcsxfrm_l', 'towupper_l', 'towlower_l', 'catgets', 'catopen', 'catclose'].forEach(function(aborter) { LibraryManager.library[aborter] = function() { throw 'TODO: ' + aborter }; }); |