aboutsummaryrefslogtreecommitdiff
path: root/src/library.js
diff options
context:
space:
mode:
Diffstat (limited to 'src/library.js')
-rw-r--r--src/library.js105
1 files changed, 90 insertions, 15 deletions
diff --git a/src/library.js b/src/library.js
index 45c64bc7..6f1f2fe5 100644
--- a/src/library.js
+++ b/src/library.js
@@ -406,7 +406,7 @@ LibraryManager.library = {
// dirent.h
// ==========================================================================
- __dirent_struct_layout: Runtime.generateStructInfo(null, '%struct.dirent'),
+ __dirent_struct_layout: Runtime.generateStructInfo(['d_ino', 'd_name', 'd_off', 'd_reclen', 'd_type'], '%struct.dirent'),
opendir__deps: ['$FS', '__setErrNo', '$ERRNO_CODES', '__dirent_struct_layout'],
opendir: function(dirname) {
// DIR *opendir(const char *dirname);
@@ -561,7 +561,7 @@ LibraryManager.library = {
// utime.h
// ==========================================================================
- __utimbuf_struct_layout: Runtime.generateStructInfo(null, '%struct.utimbuf'),
+ __utimbuf_struct_layout: Runtime.generateStructInfo(['actime', 'modtime'], '%struct.utimbuf'),
utime__deps: ['$FS', '__setErrNo', '$ERRNO_CODES', '__utimbuf_struct_layout'],
utime: function(path, times) {
// int utime(const char *path, const struct utimbuf *times);
@@ -649,7 +649,24 @@ LibraryManager.library = {
// sys/stat.h
// ==========================================================================
- __stat_struct_layout: Runtime.generateStructInfo(null, '%struct.stat'),
+ __stat_struct_layout: Runtime.generateStructInfo([
+ 'st_dev',
+ 'st_ino',
+ 'st_mode',
+ 'st_nlink',
+ 'st_uid',
+ 'st_gid',
+ 'st_rdev',
+ 'st_size',
+ 'st_atime',
+ 'st_spare1',
+ 'st_mtime',
+ 'st_spare2',
+ 'st_ctime',
+ 'st_spare3',
+ 'st_blksize',
+ 'st_blocks',
+ 'st_spare4'], '%struct.stat'),
stat__deps: ['$FS', '__stat_struct_layout'],
stat: function(path, buf, dontResolveLastLink) {
// http://pubs.opengroup.org/onlinepubs/7908799/xsh/stat.html
@@ -818,7 +835,18 @@ LibraryManager.library = {
// sys/statvfs.h
// ==========================================================================
- __statvfs_struct_layout: Runtime.generateStructInfo(null, '%struct.statvfs'),
+ __statvfs_struct_layout: Runtime.generateStructInfo([
+ 'f_bsize',
+ 'f_frsize',
+ 'f_blocks',
+ 'f_bfree',
+ 'f_bavail',
+ 'f_files',
+ 'f_ffree',
+ 'f_favail',
+ 'f_fsid',
+ 'f_flag',
+ 'f_namemax'], '%struct.statvfs'),
statvfs__deps: ['$FS', '__statvfs_struct_layout'],
statvfs: function(path, buf) {
// http://pubs.opengroup.org/onlinepubs/7908799/xsh/stat.html
@@ -852,7 +880,13 @@ LibraryManager.library = {
// fcntl.h
// ==========================================================================
- __flock_struct_layout: Runtime.generateStructInfo(null, '%struct.flock'),
+ __flock_struct_layout: Runtime.generateStructInfo([
+ 'l_type',
+ 'l_whence',
+ 'l_start',
+ 'l_len',
+ 'l_pid',
+ 'l_xxx'], '%struct.flock'),
open__deps: ['$FS', '__setErrNo', '$ERRNO_CODES', '__dirent_struct_layout'],
open: function(path, oflag, varargs) {
// int open(const char *path, int oflag, ...);
@@ -1055,7 +1089,7 @@ LibraryManager.library = {
// poll.h
// ==========================================================================
- __pollfd_struct_layout: Runtime.generateStructInfo(null, '%struct.pollfd'),
+ __pollfd_struct_layout: Runtime.generateStructInfo(['fd', 'events', 'revents'], '%struct.pollfd'),
poll__deps: ['$FS', '__pollfd_struct_layout'],
poll: function(fds, nfds, timeout) {
// int poll(struct pollfd fds[], nfds_t nfds, int timeout);
@@ -2260,7 +2294,6 @@ LibraryManager.library = {
} else if (type == 'i64') {
ret = [{{{ makeGetValue('varargs', 'argIndex', 'i32', undefined, undefined, true) }}},
{{{ makeGetValue('varargs', 'argIndex+4', 'i32', undefined, undefined, true) }}}];
- ret = unSign(ret[0], 32) + unSign(ret[1], 32)*Math.pow(2, 32); // Unsigned in this notation. Signed later if needed. // XXX - loss of precision
#else
} else if (type == 'i64') {
ret = {{{ makeGetValue('varargs', 'argIndex', 'i64', undefined, undefined, true) }}};
@@ -2270,7 +2303,7 @@ LibraryManager.library = {
ret = {{{ makeGetValue('varargs', 'argIndex', 'i32', undefined, undefined, true) }}};
}
argIndex += Runtime.getNativeFieldSize(type);
- return Number(ret);
+ return ret;
}
var ret = [];
@@ -2392,6 +2425,12 @@ LibraryManager.library = {
var signed = next == 'd'.charCodeAt(0) || next == 'i'.charCodeAt(0);
argSize = argSize || 4;
var currArg = getNextArg('i' + (argSize * 8));
+#if I64_MODE == 1
+ // Flatten i64-1 [low, high] into a (slightly rounded) double
+ if (argSize == 8) {
+ currArg = Runtime.makeBigInt(currArg[0], currArg[1], next == 'u'.charCodeAt(0));
+ }
+#endif
// Truncate to requested size.
if (argSize <= 4) {
var limit = Math.pow(256, argSize) - 1;
@@ -3444,7 +3483,7 @@ LibraryManager.library = {
},
strtoll__deps: ['_parseInt'],
strtoll: function(str, endptr, base) {
- return __parseInt(str, endptr, base, -9223372036854775808, 9223372036854775807, 64); // LLONG_MIN, LLONG_MAX; imprecise.
+ return __parseInt(str, endptr, base, -9223372036854775200, 9223372036854775200, 64); // LLONG_MIN, LLONG_MAX; imprecise.
},
strtol__deps: ['_parseInt'],
strtol: function(str, endptr, base) {
@@ -4723,7 +4762,12 @@ LibraryManager.library = {
// sys/utsname.h
// ==========================================================================
- __utsname_struct_layout: Runtime.generateStructInfo(null, '%struct.utsname'),
+ __utsname_struct_layout: Runtime.generateStructInfo([
+ 'sysname',
+ 'nodename',
+ 'release',
+ 'version',
+ 'machine'], '%struct.utsname'),
uname__deps: ['__utsname_struct_layout'],
uname: function(name) {
// int uname(struct utsname *name);
@@ -4922,7 +4966,18 @@ LibraryManager.library = {
return time1 - time0;
},
- __tm_struct_layout: Runtime.generateStructInfo(null, '%struct.tm'),
+ __tm_struct_layout: Runtime.generateStructInfo([
+ 'tm_sec',
+ 'tm_min',
+ 'tm_hour',
+ 'tm_mday',
+ 'tm_mon',
+ 'tm_year',
+ 'tm_wday',
+ 'tm_yday',
+ 'tm_isdst',
+ 'tm_gmtoff',
+ 'tm_zone'], '%struct.tm'),
// Statically allocated time struct.
__tm_current: 0,
// Statically allocated timezone strings.
@@ -5121,7 +5176,7 @@ LibraryManager.library = {
// sys/time.h
// ==========================================================================
- __timespec_struct_layout: Runtime.generateStructInfo(null, '%struct.timespec'),
+ __timespec_struct_layout: Runtime.generateStructInfo(['tv_sec', 'tv_nsec'], '%struct.timespec'),
// TODO: Implement these for real.
clock_gettime__deps: ['__timespec_struct_layout'],
clock_gettime: function(clk_id, tp) {
@@ -5158,7 +5213,11 @@ LibraryManager.library = {
// sys/times.h
// ==========================================================================
- __tms_struct_layout: Runtime.generateStructInfo(null, '%struct.tms'),
+ __tms_struct_layout: Runtime.generateStructInfo([
+ 'tms_utime',
+ 'tms_stime',
+ 'tms_cutime',
+ 'tms_cstime'], '%struct.tms'),
times__deps: ['__tms_struct_layout', 'memset'],
times: function(buffer) {
// clock_t times(struct tms *buffer);
@@ -5655,7 +5714,7 @@ LibraryManager.library = {
// ==========================================================================
// TODO: Implement for real.
- __rlimit_struct_layout: Runtime.generateStructInfo(null, '%struct.rlimit'),
+ __rlimit_struct_layout: Runtime.generateStructInfo(['rlim_cur', 'rlim_max'], '%struct.rlimit'),
getrlimit__deps: ['__rlimit_struct_layout'],
getrlimit: function(resource, rlp) {
// int getrlimit(int resource, struct rlimit *rlp);
@@ -5670,7 +5729,23 @@ LibraryManager.library = {
__01getrlimit64_: 'getrlimit',
// TODO: Implement for real. We just do time used, and no useful data
- __rusage_struct_layout: Runtime.generateStructInfo(null, '%struct.rusage'),
+ __rusage_struct_layout: Runtime.generateStructInfo([
+ 'ru_utime',
+ 'ru_stime',
+ 'ru_maxrss',
+ 'ru_ixrss',
+ 'ru_idrss',
+ 'ru_isrss',
+ 'ru_minflt',
+ 'ru_majflt',
+ 'ru_nswap',
+ 'ru_inblock',
+ 'ru_oublock',
+ 'ru_msgsnd',
+ 'ru_msgrcv',
+ 'ru_nsignals',
+ 'ru_nvcsw',
+ 'ru_nivcsw'], '%struct.rusage'),
getrusage__deps: ['__rusage_struct_layout'],
getrusage: function(resource, rlp) {
// %struct.timeval = type { i32, i32 }