aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormax99x <max99x@gmail.com>2011-07-21 22:15:54 +0300
committermax99x <max99x@gmail.com>2011-07-22 00:36:42 +0300
commit12cc157d6e84c74b2291496b3dd0ed1c1f1d24a4 (patch)
treef1035bb04ff6dc8f51400a1854179d2f65444f55
parent50face8e644709e140ffa4dcba2be6d42e088c64 (diff)
Refactored the new struct layouter to work with QUANTUM_SIZE != 4.
-rw-r--r--src/library.js190
-rw-r--r--src/modules.js52
-rw-r--r--src/runtime.js1
3 files changed, 121 insertions, 122 deletions
diff --git a/src/library.js b/src/library.js
index 3088fb3c..ad858c3f 100644
--- a/src/library.js
+++ b/src/library.js
@@ -237,7 +237,7 @@ LibraryManager.library = {
// dirent.h
// ==========================================================================
- __dirent_struct_layout: Types.structDefinitions.dirent,
+ __dirent_struct_layout: Runtime.generateStructInfo(null, '%struct.dirent'),
opendir__deps: ['$FS', '__setErrNo', '$ERRNO_CODES', '__dirent_struct_layout'],
opendir: function(dirname) {
// DIR *opendir(const char *dirname);
@@ -271,7 +271,7 @@ LibraryManager.library = {
// An index into contents. Special values: -2 is ".", -1 is "..".
position: -2,
// Each stream has its own area for readdir() returns.
- currentEntry: _malloc(___dirent_struct_layout.size)
+ currentEntry: _malloc(___dirent_struct_layout.__size__)
};
return id;
},
@@ -345,19 +345,19 @@ LibraryManager.library = {
inode = stream.object.contents[name].inodeNumber;
}
stream.position++;
- var members = ___dirent_struct_layout.members;
- {{{ makeSetValue('entry', 'members.d_ino.offset', 'inode', 'i32') }}}
- {{{ makeSetValue('entry', 'members.d_off.offset', 'stream.position', 'i32') }}}
- {{{ makeSetValue('entry', 'members.d_reclen.offset', 'name.length + 1', 'i32') }}}
+ var offsets = ___dirent_struct_layout;
+ {{{ makeSetValue('entry', 'offsets.d_ino', 'inode', 'i32') }}}
+ {{{ makeSetValue('entry', 'offsets.d_off', 'stream.position', 'i32') }}}
+ {{{ makeSetValue('entry', 'offsets.d_reclen', 'name.length + 1', 'i32') }}}
for (var i = 0; i < name.length; i++) {
- {{{ makeSetValue('entry', 'members.d_name.offset + i', 'name.charCodeAt(i)', 'i8') }}}
+ {{{ makeSetValue('entry + offsets.d_name', 'i', 'name.charCodeAt(i)', 'i8') }}}
}
- {{{ makeSetValue('entry', 'members.d_name.offset + i', '0', 'i8') }}}
+ {{{ makeSetValue('entry + offsets.d_name', 'i', '0', 'i8') }}}
var type = stream.isDevice ? 2 // DT_CHR, character device.
: stream.isFolder ? 4 // DT_DIR, directory.
: stream.link !== undefined ? 10 // DT_LNK, symbolic link.
: 8; // DT_REG, regular file.
- {{{ makeSetValue('entry', 'members.d_type.offset', 'type', 'i8') }}}
+ {{{ makeSetValue('entry', 'offsets.d_type', 'type', 'i8') }}}
{{{ makeSetValue('result', '0', 'entry', 'i8*') }}}
}
return 0;
@@ -385,7 +385,7 @@ LibraryManager.library = {
// utime.h
// ==========================================================================
- __utimbuf_struct_layout: Types.structDefinitions.utimbuf,
+ __utimbuf_struct_layout: Runtime.generateStructInfo(null, '%struct.utimbuf'),
utime__deps: ['$FS', '__setErrNo', '$ERRNO_CODES', '__utimbuf_struct_layout'],
utime: function(path, times) {
// int utime(const char *path, const struct utimbuf *times);
@@ -393,7 +393,7 @@ LibraryManager.library = {
var time;
if (times) {
// NOTE: We don't keep track of access timestamps.
- var offset = ___utimbuf_struct_layout.members.modtime.offset;
+ var offset = ___utimbuf_struct_layout.modtime;
time = {{{ makeGetValue('times', 'offset', 'i32') }}}
time = new Date(time * 1000);
} else {
@@ -473,41 +473,39 @@ LibraryManager.library = {
// sys/stat.h
// ==========================================================================
- __stat_struct_layout: Types.structDefinitions.stat,
+ __stat_struct_layout: Runtime.generateStructInfo(null, '%struct.stat'),
stat__deps: ['$FS', '__stat_struct_layout'],
stat: function(path, buf, dontResolveLastLink) {
// http://pubs.opengroup.org/onlinepubs/7908799/xsh/stat.html
// int stat(const char *path, struct stat *buf);
- // dontResolveLastLink is a shortcut for lstat(). It should never be used in
- // client code.
+ // NOTE: dontResolveLastLink is a shortcut for lstat(). It should never be
+ // used in client code.
var obj = FS.findObject(Pointer_stringify(path), dontResolveLastLink);
if (obj === null || !FS.forceLoadFile(obj)) return -1;
- var members = ___stat_struct_layout.members;
+ var offsets = ___stat_struct_layout;
// Constants.
- {{{ makeSetValue('buf', 'members.st_nlink.offset', '1', 'i32') }}}
- {{{ makeSetValue('buf', 'members.st_uid.offset', '0', 'i32') }}}
- {{{ makeSetValue('buf', 'members.st_gid.offset', '0', 'i32') }}}
- {{{ makeSetValue('buf', 'members.st_blksize.offset', '4096', 'i32') }}}
+ {{{ makeSetValue('buf', 'offsets.st_nlink', '1', 'i32') }}}
+ {{{ makeSetValue('buf', 'offsets.st_uid', '0', 'i32') }}}
+ {{{ makeSetValue('buf', 'offsets.st_gid', '0', 'i32') }}}
+ {{{ makeSetValue('buf', 'offsets.st_blksize', '4096', 'i32') }}}
// Variables.
- {{{ makeSetValue('buf', 'members.st_ino.offset', 'obj.inodeNumber', 'i32') }}}
+ {{{ makeSetValue('buf', 'offsets.st_ino', 'obj.inodeNumber', 'i32') }}}
var time = Math.floor(obj.timestamp.getTime() / 1000);
- if (members.st_atime === undefined) {
- var tvSecOffset = members.st_atim.members.tv_sec.offset;
- members.st_atime = {offset: members.st_atim.offset + tvSecOffset};
- members.st_mtime = {offset: members.st_mtim.offset + tvSecOffset};
- members.st_ctime = {offset: members.st_ctim.offset + tvSecOffset};
- var tvNSecOffset = members.st_atim.members.tv_nsec.offset;
+ if (offsets.st_atime === undefined) {
+ offsets.st_atime = offsets.st_atim.tv_sec;
+ offsets.st_mtime = offsets.st_mtim.tv_sec;
+ offsets.st_ctime = offsets.st_ctim.tv_sec;
var nanosec = (obj.timestamp.getTime() % 1000) * 1000;
- {{{ makeSetValue('buf', 'members.st_atim.offset + tvNSecOffset', 'nanosec', 'i32') }}}
- {{{ makeSetValue('buf', 'members.st_mtim.offset + tvNSecOffset', 'nanosec', 'i32') }}}
- {{{ makeSetValue('buf', 'members.st_ctim.offset + tvNSecOffset', 'nanosec', 'i32') }}}
+ {{{ makeSetValue('buf', 'offsets.st_atim.tv_nsec', 'nanosec', 'i32') }}}
+ {{{ makeSetValue('buf', 'offsets.st_mtim.tv_nsec', 'nanosec', 'i32') }}}
+ {{{ makeSetValue('buf', 'offsets.st_ctim.tv_nsec', 'nanosec', 'i32') }}}
}
- {{{ makeSetValue('buf', 'members.st_atime.offset', 'time', 'i32') }}}
- {{{ makeSetValue('buf', 'members.st_mtime.offset', 'time', 'i32') }}}
- {{{ makeSetValue('buf', 'members.st_ctime.offset', 'time', 'i32') }}}
+ {{{ makeSetValue('buf', 'offsets.st_atime', 'time', 'i32') }}}
+ {{{ makeSetValue('buf', 'offsets.st_mtime', 'time', 'i32') }}}
+ {{{ makeSetValue('buf', 'offsets.st_ctime', 'time', 'i32') }}}
var mode = 0;
var size = 0;
var blocks = 0;
@@ -534,14 +532,14 @@ LibraryManager.library = {
mode = obj.link === undefined ? 0x8000 : 0xA000; // S_IFREG, S_IFLNK.
}
}
- {{{ makeSetValue('buf', 'members.st_dev.offset', 'dev', 'i64') }}}
- {{{ makeSetValue('buf', 'members.st_rdev.offset', 'rdev', 'i64') }}}
+ {{{ makeSetValue('buf', 'offsets.st_dev', 'dev', 'i64') }}}
+ {{{ makeSetValue('buf', 'offsets.st_rdev', 'rdev', 'i64') }}}
// NOTE: These two may be i64, depending on compilation options.
- {{{ makeSetValue('buf', 'members.st_size.offset', 'size', 'i32') }}}
- {{{ makeSetValue('buf', 'members.st_blocks.offset', 'blocks', 'i32') }}}
+ {{{ makeSetValue('buf', 'offsets.st_size', 'size', 'i32') }}}
+ {{{ makeSetValue('buf', 'offsets.st_blocks', 'blocks', 'i32') }}}
if (obj.read) mode |= 0x16D; // S_IRUSR | S_IXUSR | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH.
if (obj.write) mode |= 0x92; // S_IWUSR | S_IWGRP | S_IWOTH.
- {{{ makeSetValue('buf', 'members.st_mode.offset', 'mode', 'i32') }}}
+ {{{ makeSetValue('buf', 'offsets.st_mode', 'mode', 'i32') }}}
return 0;
},
@@ -650,25 +648,25 @@ LibraryManager.library = {
// sys/statvfs.h
// ==========================================================================
- __statvfs_struct_layout: Types.structDefinitions.statvfs,
+ __statvfs_struct_layout: Runtime.generateStructInfo(null, '%struct.statvfs'),
statvfs__deps: ['$FS', '__statvfs_struct_layout'],
statvfs: function(path, buf) {
// http://pubs.opengroup.org/onlinepubs/7908799/xsh/stat.html
// int statvfs(const char *restrict path, struct statvfs *restrict buf);
- var members = ___statvfs_struct_layout.members;
+ var offsets = ___statvfs_struct_layout;
// NOTE: None of the constants here are true. We're just returning safe and
// sane values.
- {{{ makeSetValue('buf', 'members.f_bsize.offset', '4096', 'i32') }}}
- {{{ makeSetValue('buf', 'members.f_frsize.offset', '4096', 'i32') }}}
- {{{ makeSetValue('buf', 'members.f_blocks.offset', '1000000', 'i32') }}}
- {{{ makeSetValue('buf', 'members.f_bfree.offset', '500000', 'i32') }}}
- {{{ makeSetValue('buf', 'members.f_bavail.offset', '500000', 'i32') }}}
- {{{ makeSetValue('buf', 'members.f_files.offset', 'FS.nextInode', 'i32') }}}
- {{{ makeSetValue('buf', 'members.f_ffree.offset', '1000000', 'i32') }}}
- {{{ makeSetValue('buf', 'members.f_favail.offset', '1000000', 'i32') }}}
- {{{ makeSetValue('buf', 'members.f_fsid.offset', '42', 'i32') }}}
- {{{ makeSetValue('buf', 'members.f_flag.offset', '2', 'i32') }}} // ST_NOSUID
- {{{ makeSetValue('buf', 'members.f_namemax.offset', '255', 'i32') }}}
+ {{{ makeSetValue('buf', 'offsets.f_bsize', '4096', 'i32') }}}
+ {{{ makeSetValue('buf', 'offsets.f_frsize', '4096', 'i32') }}}
+ {{{ makeSetValue('buf', 'offsets.f_blocks', '1000000', 'i32') }}}
+ {{{ makeSetValue('buf', 'offsets.f_bfree', '500000', 'i32') }}}
+ {{{ makeSetValue('buf', 'offsets.f_bavail', '500000', 'i32') }}}
+ {{{ makeSetValue('buf', 'offsets.f_files', 'FS.nextInode', 'i32') }}}
+ {{{ makeSetValue('buf', 'offsets.f_ffree', '1000000', 'i32') }}}
+ {{{ makeSetValue('buf', 'offsets.f_favail', '1000000', 'i32') }}}
+ {{{ makeSetValue('buf', 'offsets.f_fsid', '42', 'i32') }}}
+ {{{ makeSetValue('buf', 'offsets.f_flag', '2', 'i32') }}} // ST_NOSUID
+ {{{ makeSetValue('buf', 'offsets.f_namemax', '255', 'i32') }}}
return 0;
},
fstatvfs__deps: ['statvfs'],
@@ -682,7 +680,7 @@ LibraryManager.library = {
// fcntl.h
// ==========================================================================
- __flock_struct_layout: Types.structDefinitions.flock,
+ __flock_struct_layout: Runtime.generateStructInfo(null, '%struct.flock'),
open__deps: ['$FS', '__setErrNo', '$ERRNO_CODES',
'strlen', 'strcpy', 'dirname', 'basename'],
open: function(path, oflag, mode) {
@@ -814,7 +812,7 @@ LibraryManager.library = {
// Synchronization and blocking flags are irrelevant to us.
return 0;
case 5: // F_GETLK.
- var offset = ___flock_struct_layout.members.l_type.offset;
+ var offset = ___flock_struct_layout.l_type;
// We're always unlocked.
{{{ makeSetValue('arg', 'offset', '2', 'i16') }}} // F_UNLCK.
return 0;
@@ -860,18 +858,18 @@ LibraryManager.library = {
// poll.h
// ==========================================================================
- __pollfd_struct_layout: Types.structDefinitions.pollfd,
- poll__deps: ['$FS', '__setErrNo', '$ERRNO_CODES', '__pollfd_struct_layout'],
+ __pollfd_struct_layout: Runtime.generateStructInfo(null, '%struct.pollfd'),
+ poll__deps: ['$FS', '__pollfd_struct_layout'],
poll: function(fds, nfds, timeout) {
// int poll(struct pollfd fds[], nfds_t nfds, int timeout);
// http://pubs.opengroup.org/onlinepubs/009695399/functions/poll.html
// NOTE: This is pretty much a no-op mimicing glibc.
- var members = ___pollfd_struct_layout.members;
+ var offsets = ___pollfd_struct_layout;
var nonzero = 0;
for (var i = 0; i < nfds; i++) {
- var pollfd = fds + ___pollfd_struct_layout.size * i;
- var fd = {{{ makeGetValue('pollfd', 'members.fd.offset', 'i32') }}};
- var events = {{{ makeGetValue('pollfd', 'members.events.offset', 'i16') }}};
+ var pollfd = fds + ___pollfd_struct_layout.__size__ * i;
+ var fd = {{{ makeGetValue('pollfd', 'offsets.fd', 'i32') }}};
+ var events = {{{ makeGetValue('pollfd', 'offsets.events', 'i16') }}};
var revents = 0;
if (fd in FS.streams) {
var stream = FS.streams[fd];
@@ -881,7 +879,7 @@ LibraryManager.library = {
if (events & 0x20) revents |= 0x20; // POLLNVAL.
}
if (revents) nonzero++;
- {{{ makeSetValue('pollfd', 'members.revents.offset', 'revents', 'i16') }}}
+ {{{ makeSetValue('pollfd', 'offsets.revents', 'revents', 'i16') }}}
}
return nonzero;
},
@@ -2632,7 +2630,7 @@ LibraryManager.library = {
return time1 - time0;
},
- __tm_struct_layout: Types.structDefinitions.tm,
+ __tm_struct_layout: Runtime.generateStructInfo(null, '%struct.tm'),
// Statically allocated time struct.
__tm_current: 0,
// Statically allocated timezone strings.
@@ -2643,56 +2641,56 @@ LibraryManager.library = {
mktime__deps: ['__tm_struct_layout', 'tzset'],
mktime: function(tmPtr) {
_tzset();
- var members = ___tm_struct_layout.members;
- var year = {{{ makeGetValue('tmPtr', 'members.tm_year.offset', 'i32') }}};
+ var offsets = ___tm_struct_layout;
+ var year = {{{ makeGetValue('tmPtr', 'offsets.tm_year', 'i32') }}};
var timestamp = new Date(year >= 1900 ? year : year + 1900,
- {{{ makeGetValue('tmPtr', 'members.tm_mon.offset', 'i32') }}},
- {{{ makeGetValue('tmPtr', 'members.tm_mday.offset', 'i32') }}},
- {{{ makeGetValue('tmPtr', 'members.tm_hour.offset', 'i32') }}},
- {{{ makeGetValue('tmPtr', 'members.tm_min.offset', 'i32') }}},
- {{{ makeGetValue('tmPtr', 'members.tm_sec.offset', 'i32') }}},
+ {{{ makeGetValue('tmPtr', 'offsets.tm_mon', 'i32') }}},
+ {{{ makeGetValue('tmPtr', 'offsets.tm_mday', 'i32') }}},
+ {{{ makeGetValue('tmPtr', 'offsets.tm_hour', 'i32') }}},
+ {{{ makeGetValue('tmPtr', 'offsets.tm_min', 'i32') }}},
+ {{{ makeGetValue('tmPtr', 'offsets.tm_sec', 'i32') }}},
0).getTime() / 1000;
- {{{ makeSetValue('tmPtr', 'members.tm_wday.offset', 'new Date(timestamp).getDay()', 'i32') }}}
+ {{{ makeSetValue('tmPtr', 'offsets.tm_wday', 'new Date(timestamp).getDay()', 'i32') }}}
var yday = Math.round((timestamp - (new Date(year, 0, 1)).getTime()) / (1000 * 60 * 60 * 24));
- {{{ makeSetValue('tmPtr', 'members.tm_yday.offset', 'yday', 'i32') }}}
+ {{{ makeSetValue('tmPtr', 'offsets.tm_yday', 'yday', 'i32') }}}
return timestamp;
},
timelocal: 'mktime',
gmtime__deps: ['malloc', '__tm_struct_layout', '__tm_current', 'gmtime_r'],
gmtime: function(time) {
- if (!___tm_current) ___tm_current = _malloc(___tm_struct_layout.size);
+ if (!___tm_current) ___tm_current = _malloc(___tm_struct_layout.__size__);
return _gmtime_r(time, ___tm_current);
},
gmtime_r__deps: ['__tm_struct_layout', '__tm_timezones'],
gmtime_r: function(time, tmPtr) {
var date = new Date({{{ makeGetValue('time', 0, 'i32') }}}*1000);
- var members = ___tm_struct_layout.members;
- {{{ makeSetValue('tmPtr', 'members.tm_sec.offset', 'date.getUTCSeconds()', 'i32') }}}
- {{{ makeSetValue('tmPtr', 'members.tm_min.offset', 'date.getUTCMinutes()', 'i32') }}}
- {{{ makeSetValue('tmPtr', 'members.tm_hour.offset', 'date.getUTCHours()', 'i32') }}}
- {{{ makeSetValue('tmPtr', 'members.tm_mday.offset', 'date.getUTCDate()', 'i32') }}}
- {{{ makeSetValue('tmPtr', 'members.tm_mon.offset', 'date.getUTCMonth()', 'i32') }}}
- {{{ makeSetValue('tmPtr', 'members.tm_year.offset', 'date.getUTCFullYear()-1900', 'i32') }}}
- {{{ makeSetValue('tmPtr', 'members.tm_wday.offset', 'date.getUTCDay()', 'i32') }}}
- {{{ makeSetValue('tmPtr', 'members.tm_gmtoff.offset', '0', 'i32') }}}
- {{{ makeSetValue('tmPtr', 'members.tm_isdst.offset', '0', 'i32') }}}
+ var offsets = ___tm_struct_layout;
+ {{{ makeSetValue('tmPtr', 'offsets.tm_sec', 'date.getUTCSeconds()', 'i32') }}}
+ {{{ makeSetValue('tmPtr', 'offsets.tm_min', 'date.getUTCMinutes()', 'i32') }}}
+ {{{ makeSetValue('tmPtr', 'offsets.tm_hour', 'date.getUTCHours()', 'i32') }}}
+ {{{ makeSetValue('tmPtr', 'offsets.tm_mday', 'date.getUTCDate()', 'i32') }}}
+ {{{ makeSetValue('tmPtr', 'offsets.tm_mon', 'date.getUTCMonth()', 'i32') }}}
+ {{{ makeSetValue('tmPtr', 'offsets.tm_year', 'date.getUTCFullYear()-1900', 'i32') }}}
+ {{{ makeSetValue('tmPtr', 'offsets.tm_wday', 'date.getUTCDay()', 'i32') }}}
+ {{{ makeSetValue('tmPtr', 'offsets.tm_gmtoff', '0', 'i32') }}}
+ {{{ makeSetValue('tmPtr', 'offsets.tm_isdst', '0', 'i32') }}}
var start = new Date(date.getFullYear(), 0, 1);
var yday = Math.round((date.getTime() - start.getTime()) / (1000 * 60 * 60 * 24));
- {{{ makeSetValue('tmPtr', 'members.tm_yday.offset', 'yday', 'i32') }}}
+ {{{ makeSetValue('tmPtr', 'offsets.tm_yday', 'yday', 'i32') }}}
var timezone = "GMT";
if (!(timezone in ___tm_timezones)) {
___tm_timezones[timezone] = allocate(intArrayFromString(timezone), 'i8', ALLOC_NORMAL);
}
- {{{ makeSetValue('tmPtr', 'members.tm_zone.offset', '___tm_timezones[timezone]', 'i32') }}}
+ {{{ makeSetValue('tmPtr', 'offsets.tm_zone', '___tm_timezones[timezone]', 'i32') }}}
return tmPtr;
},
- timegm__deps: ['__tm_struct_layout', 'mktime'],
+ timegm__deps: ['mktime'],
timegm: function(tmPtr) {
_tzset();
var offset = {{{ makeGetValue('_timezone', 0, 'i32') }}};
@@ -2704,36 +2702,36 @@ LibraryManager.library = {
localtime__deps: ['malloc', '__tm_struct_layout', '__tm_current', 'localtime_r'],
localtime: function(time) {
- if (!___tm_current) ___tm_current = _malloc(___tm_struct_layout.size);
+ if (!___tm_current) ___tm_current = _malloc(___tm_struct_layout.__size__);
return _localtime_r(time, ___tm_current);
},
localtime_r__deps: ['__tm_struct_layout', '__tm_timezones', 'tzset'],
localtime_r: function(time, tmPtr) {
_tzset();
- var members = ___tm_struct_layout.members;
+ var offsets = ___tm_struct_layout;
var date = new Date({{{ makeGetValue('time', 0, 'i32') }}}*1000);
- {{{ makeSetValue('tmPtr', 'members.tm_sec.offset', 'date.getSeconds()', 'i32') }}}
- {{{ makeSetValue('tmPtr', 'members.tm_min.offset', 'date.getMinutes()', 'i32') }}}
- {{{ makeSetValue('tmPtr', 'members.tm_hour.offset', 'date.getHours()', 'i32') }}}
- {{{ makeSetValue('tmPtr', 'members.tm_mday.offset', 'date.getDate()', 'i32') }}}
- {{{ makeSetValue('tmPtr', 'members.tm_mon.offset', 'date.getMonth()', 'i32') }}}
- {{{ makeSetValue('tmPtr', 'members.tm_year.offset', 'date.getFullYear()-1900', 'i32') }}}
- {{{ makeSetValue('tmPtr', 'members.tm_wday.offset', 'date.getDay()', 'i32') }}}
+ {{{ makeSetValue('tmPtr', 'offsets.tm_sec', 'date.getSeconds()', 'i32') }}}
+ {{{ makeSetValue('tmPtr', 'offsets.tm_min', 'date.getMinutes()', 'i32') }}}
+ {{{ makeSetValue('tmPtr', 'offsets.tm_hour', 'date.getHours()', 'i32') }}}
+ {{{ makeSetValue('tmPtr', 'offsets.tm_mday', 'date.getDate()', 'i32') }}}
+ {{{ makeSetValue('tmPtr', 'offsets.tm_mon', 'date.getMonth()', 'i32') }}}
+ {{{ makeSetValue('tmPtr', 'offsets.tm_year', 'date.getFullYear()-1900', 'i32') }}}
+ {{{ makeSetValue('tmPtr', 'offsets.tm_wday', 'date.getDay()', 'i32') }}}
var start = new Date(date.getFullYear(), 0, 1);
var yday = Math.floor((date.getTime() - start.getTime()) / (1000 * 60 * 60 * 24));
- {{{ makeSetValue('tmPtr', 'members.tm_yday.offset', 'yday', 'i32') }}}
- {{{ makeSetValue('tmPtr', 'members.tm_gmtoff.offset', 'start.getTimezoneOffset() * 60', 'i32') }}}
+ {{{ makeSetValue('tmPtr', 'offsets.tm_yday', 'yday', 'i32') }}}
+ {{{ makeSetValue('tmPtr', 'offsets.tm_gmtoff', 'start.getTimezoneOffset() * 60', 'i32') }}}
var dst = Number(start.getTimezoneOffset() != date.getTimezoneOffset());
- {{{ makeSetValue('tmPtr', 'members.tm_isdst.offset', 'dst', 'i32') }}}
+ {{{ makeSetValue('tmPtr', 'offsets.tm_isdst', 'dst', 'i32') }}}
var timezone = date.toString().match(/\(([A-Z]+)\)/)[1];
if (!(timezone in ___tm_timezones)) {
___tm_timezones[timezone] = allocate(intArrayFromString(timezone), 'i8', ALLOC_NORMAL);
}
- {{{ makeSetValue('tmPtr', 'members.tm_zone.offset', '___tm_timezones[timezone]', 'i32') }}}
+ {{{ makeSetValue('tmPtr', 'offsets.tm_zone', '___tm_timezones[timezone]', 'i32') }}}
return tmPtr;
},
diff --git a/src/modules.js b/src/modules.js
index 243fed69..982d1b8c 100644
--- a/src/modules.js
+++ b/src/modules.js
@@ -39,7 +39,7 @@ var Debugging = {
var form6 = new RegExp(/^ (tail )?call void \@llvm.dbg.\w+\(metadata .*$/);
var formStruct = /^!(\d+) = metadata !\{i32 \d+, metadata !\d+, metadata !"([^"]+)", metadata !\d+, i32 \d+, i64 (\d+), [^,]*, [^,]*, [^,]*, [^,]*, metadata !(\d+), .*} ; \[ DW_TAG_(?:structure|class)_type \]$/;
var formStructMembers = /^!(\d+) = metadata !\{(.*)\}$/;
- var formMember = /^!(\d+) = metadata !\{i32 \d+, metadata !\d+, metadata !"([^"]+)", metadata !\d+, i32 \d+, i64 (\d+), i64 \d+, i64 (\d+), .+?, metadata !(\d+)} ; \[ DW_TAG_member \]$/;
+ var formMember = /^!(\d+) = metadata !\{i32 \d+, metadata !\d+, metadata !"([^"]+)", metadata !\d+, i32 \d+, i64 \d+, i64 \d+, i64 \d+, .+?, metadata !(\d+)} ; \[ DW_TAG_member \]$/;
var debugComment = new RegExp(/; +\[debug line = \d+:\d+\]/);
@@ -117,33 +117,33 @@ var Debugging = {
this.llvmLineToSourceFile[l] = metadataToFilename[m];
}
- // Create base struct definitions.
- for (var structName in structToMemberMeta) {
- // TODO: Account for bitfields.
- Types.structDefinitions[structName] = {
- size: parseInt(structToSize[structName]) / 8,
- members: {}
- }
- }
- // Fill struct members.
- for (var structName in structToMemberMeta) {
- var struct = Types.structDefinitions[structName];
- var memberMetaId = structToMemberMeta[structName];
- var memberIds = memberMetaToMembers[memberMetaId];
- for (var i = 0; i < memberIds.length; i++) {
- if (memberIds[i] in metadataToMember) {
- var member = metadataToMember[memberIds[i]];
- var memberObj = {
- size: parseInt(member[1]) / 8,
- offset: parseInt(member[2]) / 8
+ // Create struct definitions.
+ // TODO: Account for bitfields.
+ function generateStructDefinition(name) {
+ if (!Types.structMetadata.hasOwnProperty(name)) {
+ var struct = [];
+ var membersMetaId = structToMemberMeta[name];
+ var memberIds = memberMetaToMembers[membersMetaId];
+ for (var i = 0; i < memberIds.length; i++) {
+ var memberId = memberIds[i];
+ if (memberId in metadataToMember) {
+ var member = metadataToMember[memberId];
+ if (member[1] in structMetaToStruct) {
+ var def = generateStructDefinition(structMetaToStruct[member[1]]);
+ var record = {};
+ record[member[0]] = def;
+ struct.push(record);
+ } else {
+ struct.push(member[0]);
+ }
}
- if (member[3] in structMetaToStruct) {
- var subStruct = Types.structDefinitions[structMetaToStruct[member[3]]];
- memberObj.members = subStruct.members;
- }
- struct.members[member[0]] = memberObj;
}
+ Types.structMetadata[name] = struct;
}
+ return Types.structMetadata[name];
+ }
+ for (var name in structToMemberMeta) {
+ generateStructDefinition(name);
}
this.on = true;
@@ -179,7 +179,7 @@ var Types = {
this.fatTypes = this.types;
this.types = temp;
},
- structDefinitions: {},
+ structMetadata: {},
// Remove all data not needed during runtime (like line numbers, JS, etc.)
cleanForRuntime: function() {
diff --git a/src/runtime.js b/src/runtime.js
index 06638fa3..5b09a16b 100644
--- a/src/runtime.js
+++ b/src/runtime.js
@@ -179,6 +179,7 @@ Runtime = {
offset = offset || 0;
type = typeof Types === 'undefined' ? Runtime.typeInfo[typeName] : Types.types[typeName];
if (!type) return null;
+ if (!struct) struct = Types.structMetadata[typeName.replace(/.*\./, '')];
assert(type.fields.length === struct.length, 'Number of named fields must match the type for ' + typeName);
alignment = type.flatIndexes;
} else {