From O.Chitil at kent.ac.uk Mon Jun 2 10:13:08 2008 From: O.Chitil at kent.ac.uk (Olaf Chitil) Date: Mon Jun 2 10:05:51 2008 Subject: [Hat] Visualising Program Traces With Hat In-Reply-To: <59759.165.82.168.36.1212164088.squirrel@165.82.168.36> References: <59759.165.82.168.36.1212164088.squirrel@165.82.168.36> Message-ID: <4843FFF4.20806@kent.ac.uk> Hello Noah, it is great to hear that Hat inspired you to transfer it to Python. I'm not familiar with Python, but it differs from Haskell in several ways which you will have to take into account. Haskell has a simple graph rewriting semantics and uses algebraic data types. The first is essential for the definition of the Hat trace structure, the second substantially influences the trace structure and the program transformation. So you have to see whether the Hat trace structure fits Python. Our program transformation also uses the fact that Haskell is a non-strict language. It may be easier to first build a system for a tiny subset of Python that is inspired by Hat but doesn't actually use it. Ciao, Olaf nlavine@haverford.edu wrote: >Hello, > >I am writing to let you know that I am working on a project to use Hat >ARTs to trace programs written in a pure functional subset of Python. The >goal is to let students in the introductory computer science classes at my >school (Haverford College) generate traces of their programs to help with >debugging and, hopefully, understanding what the programs do. This >introductory course uses Python first with a functional style and then >with an imperative style, and debugging/visualization tools are sadly >lacking in the first half. My plan is to first write a program to >transform a subset of Python for tracing, as hat-trans does, and then >perhaps work on new GUI tools for viewing traces and perhaps add Eclipse >integration, since the classes here use Eclipse. > >Thanks to all of you who have done work on Hat and made it available to >us. I would appreciate any ideas or suggestions you might have, or any >information you have on other projects like this. If you're interested, I >will hopefully have some GUI trace-viewing tools to contribute to Hat in a >few months. > >Noah Lavine >_______________________________________________ >Hat mailing list >Hat@haskell.org >http://www.haskell.org/mailman/listinfo/hat > > From nlavine at haverford.edu Thu Jun 19 09:05:28 2008 From: nlavine at haverford.edu (nlavine@haverford.edu) Date: Thu Jun 19 08:57:34 2008 Subject: [Hat] Fix for Debug Prints in hat-c.c Message-ID: <49605.165.82.168.35.1213880728.squirrel@165.82.168.35> A few of the print statements that are turned on in hat-c.c when DEBUG is defined don't print all of their arguments, potentially resulting in strange output if they were used. This patch fixes that. Noah Lavine --- hat-c.c 2006-11-15 05:45:17.000000000 -0500 +++ hat-c.c 2008-06-15 18:18:14.247202914 -0400 @@ -749,7 +749,7 @@ writeFileOffset(arg1); writeFileOffset(arg2); writeFileOffset(arg3); - HIDE(fprintf(stderr,"\tmkValueApp3 0x%x 0x%x 0x%x 0x%x 0x%x -> 0x%x\n",parent,use,fun,arg1,arg2,arg3,fo);) + HIDE(fprintf(stderr,"\tmkValueApp3 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x -> 0x%x\n",parent,use,fun,arg1,arg2,arg3,fo);) return fo; } @@ -1019,7 +1019,7 @@ writeFileOffset(arg11); writeFileOffset(arg12); writeFileOffset(arg13); - HIDE(fprintf(stderr,"\tmkValueApp13 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x -> 0x%x\n",parent,use,fun,arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8,arg9,arg10,arg11,arg12,arg13,LastExp);) + HIDE(fprintf(stderr,"\tmkValueApp13 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x -> 0x%x\n",parent,use,fun,arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8,arg9,arg10,arg11,arg12,arg13,LastExp);) return fo; } @@ -1053,7 +1053,7 @@ writeFileOffset(arg12); writeFileOffset(arg13); writeFileOffset(arg14); - HIDE(fprintf(stderr,"\tmkValueApp14 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x -> 0x%x\n",parent,use,fun,arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8,arg9,arg10,arg11,arg12,arg13,arg14,LastExp);) + HIDE(fprintf(stderr,"\tmkValueApp14 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x -> 0x%x\n",parent,use,fun,arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8,arg9,arg10,arg11,arg12,arg13,arg14,LastExp);) return fo; } @@ -1088,7 +1088,7 @@ writeFileOffset(arg13); writeFileOffset(arg14); writeFileOffset(arg15); - HIDE(fprintf(stderr,"\tmkValueApp15 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x -> 0x%x\n",parent,use,fun,arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8,arg9,arg10,arg11,arg12,arg13,arg14,arg15,LastExp);) + HIDE(fprintf(stderr,"\tmkValueApp15 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x -> 0x%x\n",parent,use,fun,arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8,arg9,arg10,arg11,arg12,arg13,arg14,arg15,LastExp);) return fo; } @@ -1187,7 +1187,7 @@ writeFileOffset(use); writeFileOffset(parent); writeFloat(f); - HIDE(fprintf(stderr,"\tmkFloat 0x%x 0x%x %f -> 0x%x\n",parent,use,f,fp);) + HIDE(fprintf(stderr,"\tmkFloat 0x%x 0x%x %f -> 0x%x\n",parent,use,f,fo);) return fo; } @@ -1315,7 +1315,7 @@ writeByte(1); writeFileOffset(binder1); writeFileOffset(bindee1); - HIDE(fprintf(stderr,"\tmkFieldUpdate1 0x%x 0x%x 0x%x 0x%x -> 0x%x\n",parent,use,Unevaluated,arg,binder1,bindee1,fo);) + HIDE(fprintf(stderr,"\tmkFieldUpdate1 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x -> 0x%x\n",parent,use,Unevaluated,arg,binder1,bindee1,fo);) return fo; } @@ -1339,7 +1339,7 @@ writeFileOffset(bindee1); writeFileOffset(binder2); writeFileOffset(bindee2); - HIDE(fprintf(stderr,"\tmkFieldUpdate2 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x -> 0x%x\n",parent,use,Unevaluated,arg,binder1,bindee1,binder2,bindee2,fo);) + HIDE(fprintf(stderr,"\tmkFieldUpdate2 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x -> 0x%x\n",parent,use,Unevaluated,arg,binder1,bindee1,binder2,bindee2,fo);) return fo; } @@ -1365,7 +1365,7 @@ writeFileOffset(bindee2); writeFileOffset(binder3); writeFileOffset(bindee3); - HIDE(fprintf(stderr,"\tmkFieldUpdate3 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x -> 0x%x\n",parent,use,Unevaluated,arg,binder1,bindee1,binder2,bindee2,binder3,bindee3,fo);) + HIDE(fprintf(stderr,"\tmkFieldUpdate3 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x -> 0x%x\n",parent,use,Unevaluated,arg,binder1,bindee1,binder2,bindee2,binder3,bindee3,fo);) return fo; } @@ -1394,7 +1394,7 @@ writeFileOffset(bindee3); writeFileOffset(binder4); writeFileOffset(bindee4); - HIDE(fprintf(stderr,"\tmkFieldUpdate4 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x -> 0x%x\n",parent,use,Unevaluated,arg,binder1,bindee1,binder2,bindee2,binder3,bindee3,binder4,bindee4,fo);) + HIDE(fprintf(stderr,"\tmkFieldUpdate4 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x -> 0x%x\n",parent,use,Unevaluated,arg,binder1,bindee1,binder2,bindee2,binder3,bindee3,binder4,bindee4,fo);) return fo; } @@ -1426,7 +1426,7 @@ writeFileOffset(bindee4); writeFileOffset(binder5); writeFileOffset(bindee5); - HIDE(fprintf(stderr,"\tmkFieldUpdate5 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x -> 0x%x\n",parent,use,Unevaluated,arg,binder1,bindee1,binder2,bindee2,binder3,bindee3,binder4,bindee4,binder5,bindee5,fo);) + HIDE(fprintf(stderr,"\tmkFieldUpdate5 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x -> 0x%x\n",parent,use,Unevaluated,arg,binder1,bindee1,binder2,bindee2,binder3,bindee3,binder4,bindee4,binder5,bindee5,fo);) return fo; } @@ -1461,7 +1461,7 @@ writeFileOffset(bindee5); writeFileOffset(binder6); writeFileOffset(bindee6); - HIDE(fprintf(stderr,"\tmkFieldUpdate6 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x -> 0x%x\n",parent,use,Unevaluated,arg,binder1,bindee1,binder2,bindee2,binder3,bindee3,binder4,bindee4,binder5,bindee5,binder6,bindee6,fo);) + HIDE(fprintf(stderr,"\tmkFieldUpdate6 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x -> 0x%x\n",parent,use,Unevaluated,arg,binder1,bindee1,binder2,bindee2,binder3,bindee3,binder4,bindee4,binder5,bindee5,binder6,bindee6,fo);) return fo; } @@ -1499,7 +1499,7 @@ writeFileOffset(bindee6); writeFileOffset(binder7); writeFileOffset(bindee7); - HIDE(fprintf(stderr,"\tmkFieldUpdate7 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x -> 0x%x\n",parent,use,Unevaluated,arg,binder1,bindee1,binder2,bindee2,binder3,bindee3,binder4,bindee4,binder5,bindee5,binder6,bindee6,binder7,bindee7,fo);) + HIDE(fprintf(stderr,"\tmkFieldUpdate7 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x -> 0x%x\n",parent,use,Unevaluated,arg,binder1,bindee1,binder2,bindee2,binder3,bindee3,binder4,bindee4,binder5,bindee5,binder6,bindee6,binder7,bindee7,fo);) return fo; } @@ -1540,7 +1540,7 @@ writeFileOffset(bindee7); writeFileOffset(binder8); writeFileOffset(bindee8); - HIDE(fprintf(stderr,"\tmkFieldUpdate8 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x -> 0x%x\n",parent,use,Unevaluated,arg,binder1,bindee1,binder2,bindee2,binder3,bindee3,binder4,bindee4,binder5,bindee5,binder6,bindee6,binder7,bindee7,binder8,bindee8,fo);) + HIDE(fprintf(stderr,"\tmkFieldUpdate8 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x -> 0x%x\n",parent,use,Unevaluated,arg,binder1,bindee1,binder2,bindee2,binder3,bindee3,binder4,bindee4,binder5,bindee5,binder6,bindee6,binder7,bindee7,binder8,bindee8,fo);) return fo; } @@ -1584,7 +1584,7 @@ writeFileOffset(bindee8); writeFileOffset(binder9); writeFileOffset(bindee9); - HIDE(fprintf(stderr,"\tmkFieldUpdate9 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x -> 0x%x\n",parent,use,Unevaluated,arg,binder1,bindee1,binder2,bindee2,binder3,bindee3,binder4,bindee4,binder5,bindee5,binder6,bindee6,binder7,bindee7,binder8,bindee8,binder9,bindee9,fo);) + HIDE(fprintf(stderr,"\tmkFieldUpdate9 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x -> 0x%x\n",parent,use,Unevaluated,arg,binder1,bindee1,binder2,bindee2,binder3,bindee3,binder4,bindee4,binder5,bindee5,binder6,bindee6,binder7,bindee7,binder8,bindee8,binder9,bindee9,fo);) return fo; } @@ -1631,7 +1631,7 @@ writeFileOffset(bindee9); writeFileOffset(binder10); writeFileOffset(bindee10); - HIDE(fprintf(stderr,"\tmkFieldUpdate10 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x -> 0x%x\n",parent,use,Unevaluated,arg,binder1,bindee1,binder2,bindee2,binder3,bindee3,binder4,bindee4,binder5,bindee5,binder6,bindee6,binder7,bindee7,binder8,bindee8,binder9,bindee9,binder10,bindee10,fo);) + HIDE(fprintf(stderr,"\tmkFieldUpdate10 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x -> 0x%x\n",parent,use,Unevaluated,arg,binder1,bindee1,binder2,bindee2,binder3,bindee3,binder4,bindee4,binder5,bindee5,binder6,bindee6,binder7,bindee7,binder8,bindee8,binder9,bindee9,binder10,bindee10,fo);) return fo; } @@ -1727,7 +1727,7 @@ writeByte(fixity); writeByte(arity); writeString(name); - HIDE(fprintf(stderr,"\tmkConstructor 0x%x %d %d %d %d %s %d -> 0x%x\n",module,begin,end,fixity,arity,name,fo);) + HIDE(fprintf(stderr,"\tmkConstructor 0x%x %d %d %d %d %s -> 0x%x\n",module,begin,end,fixity,arity,name,fo);) return fo; } From nlavine at haverford.edu Thu Jun 19 09:10:42 2008 From: nlavine at haverford.edu (nlavine@haverford.edu) Date: Thu Jun 19 09:02:44 2008 Subject: [Hat] Add debug printing for resResult in hat-c.c Message-ID: <41768.165.82.168.35.1213881042.squirrel@165.82.168.35> I found it somewhat disconcerting when I looked at the debugging output from hat-c.c that it showed many entResults and no resResults. This may be an issue of personal style, but this patch was useful for me. It adds a print in resResult to match the one in entResult. Noah Lavine --- hat-c.c 2006-11-15 05:45:17.000000000 -0500 +++ hat-c.c 2008-06-15 18:18:14.247202914 -0400 @@ -1805,6 +1805,7 @@ LastExp = node; node &= hiddenMask; result &= hiddenMask; + HIDE(fprintf(stderr,"\tresResult 0x%x 0x%x 0x%x 0x%x\n", node, result, use, ntohl(node)+1+sizeof(FileOffset)+(use?sizeof(FileOffset):0));) hat_reduce(ntohl(node),1+sizeof(FileOffset)+(use?sizeof(FileOffset):0), result); } From nlavine at haverford.edu Thu Jun 19 09:19:03 2008 From: nlavine at haverford.edu (nlavine@haverford.edu) Date: Thu Jun 19 09:11:13 2008 Subject: [Hat] Update hat-check for 64 bits Message-ID: <48043.165.82.168.35.1213881543.squirrel@165.82.168.35> Hat-check assumes that sizeof(unsigned long) is 32 bits, with the result that it can't read trace files correctly on 64 bit machines. This patch changes unsigned longs to FileOffsets. Experimentally, it now works in 64 bits, although there are still some assumptions about sizeof(float) and sizeof(double) that might make files unportable - I don't know how much those change across architectures. Noah Lavine --- hat-check.c 2006-10-10 09:57:51.000000000 -0400 +++ hat-check.c 2008-06-19 09:14:03.694050843 -0400 @@ -20,6 +20,17 @@ * Added -g option to generate dot-code for graph diagram. * 4 August 2004 - Olaf * Update to extended position format (begin and end location). + * 18 June 2008 - Noah Lavine + * Change (unsigned long) to (FileOffset) for compatibility with 64-bit + * system. + * / + +/* Further changes that would be good - remove assumption that sizeof(char) + * is one byte. Add range checks (for -n , the file size, maybe other + * things too). Look at readfloat() and readdouble(), maybe set definitive + * size (right now hat files are not portable across platforms with different + * sizeof(float) and sizeof(double)). make sure (unsigned long) is at least + * as big as both (FileOffset) and (unsigned int), for function pc(). */ /* #include */ @@ -27,6 +38,7 @@ #include #include #include +#include #include #include @@ -48,9 +60,9 @@ void header (void); void nodes (void); void nextnode (void); -void markfromheader (unsigned long *buf); -void markfromoutput (char *bridgefile, unsigned long *buf); -void markfrom (unsigned long root, unsigned long *buf); +void markfromheader (FileOffset *buf); +void markfromoutput (char *bridgefile, FileOffset *buf); +void markfrom (FileOffset root, FileOffset *buf); /* strings for symbolic constants */ char* @@ -112,7 +124,7 @@ */ FILE* f; /* file descriptor for archive */ -unsigned long nextoffset=0; /* current position in file */ +FileOffset nextoffset=0; /* current position in file */ int vmode = 0; /* verify -- check tag-types of pointer destinations */ int smode = 0; /* statistics -- counts and space usage for node types */ @@ -122,7 +134,7 @@ int rmode = 0; /* reachable -- show how many nodes are reachable */ int xmode = 0; /* exit mode -- cleanup after signal to halt */ -unsigned filesize = 0; /* used in precondition for seeks ... */ +FileOffset filesize = 0; /* used in precondition for seeks ... */ struct stat statbuf; /* ... to catch seek beyond EOF */ #define FILENAMESIZE 200 @@ -130,7 +142,7 @@ /* byte buffer for use in reachability mark-phase */ #define BUFFERSIZE 100000 -unsigned long buffer[BUFFERSIZE]; +FileOffset buffer[BUFFERSIZE]; /* signal handler -- only installed for -r */ void @@ -139,8 +151,8 @@ fprintf(stderr, "hat-check cleaning up -- please wait\n"); amode = 0; rmode = 0; smode = 0; vmode = 0; xmode = 1; - fseek(f,0,SEEK_SET); - nextoffset = 0; + fseek(f,(long int)(FileOffset)0,SEEK_SET); + nextoffset = (FileOffset)0; header(); nodes(); exit(1); @@ -199,7 +211,7 @@ fprintf(stderr," but this tool deals with format version %s\n",FILEVERSION); fprintf(stderr," I'm continuing, but there may be unexpected errors.\n"); } - fseek(f,0,SEEK_SET); /* reset to beginning of file */ + fseek(f,(long int)(FileOffset)0,SEEK_SET); /* reset to beginning of file */ free(header); } @@ -210,7 +222,7 @@ } amode = 1; rmode = 0; smode = 0; } else { - nextoffset = 0L; + nextoffset = (FileOffset)0; } if (rmode) { signal(SIGINT, restoretags); @@ -220,9 +232,9 @@ markfromheader(buffer); strcat(filename, ".bridge"); markfromoutput(filename,buffer); - fseek(f,0,SEEK_SET); + fseek(f,(long int)(FileOffset)0,SEEK_SET); } - fseek(f,nextoffset,SEEK_SET); + fseek(f,(long int)nextoffset,SEEK_SET); if (nmode) { nextnode(); } else { @@ -258,8 +270,8 @@ #define MAX_TAG 32 unsigned int count[MAX_TAG]; /* indexed by tag byte: Module, SrcPos, etc */ -unsigned long space[MAX_TAG];/* ditto */ -unsigned long headspace; /* space oocupied by header */ +FileOffset space[MAX_TAG];/* ditto */ +FileOffset headspace; /* space oocupied by header */ unsigned int reachcount[MAX_TAG]; void @@ -284,7 +296,7 @@ { unsigned int grandcount = 1; unsigned int grandreachcount = 1; - unsigned long grandspace = headspace; + FileOffset grandspace = headspace; int k; for (k=0; k 8 && root < filesize) { /* First read the tag byte. If it is marked, return. * If it is not marked, then mark it now. */ - fseek(f,root,SEEK_SET); + fseek(f,(long int)root,SEEK_SET); fread(&tag,sizeof(char),1,f); if (ismarked(tag)) return; marktag(&tag); - fseek(f,root,SEEK_SET); + fseek(f,(long int)root,SEEK_SET); fwrite(&tag,sizeof(char),1,f); cleartag(&tag); /* Examine the tag to determine the kind of node. @@ -956,7 +972,7 @@ } switch (k) { case ListCons: - fread(buf,sizeof(unsigned long),2,f); /* two pointers */ + fread(buf,sizeof(FileOffset),2,f); /* two pointers */ markfrom(getpointer(buf+1),buf+1); markfrom(getpointer(buf),buf); break; @@ -966,41 +982,41 @@ case SrcPos: case AtomVariable: case AtomConstructor: /* ignore fieldnames for now */ - fread(buf,sizeof(unsigned long),1,f); /* points to module mode */ + fread(buf,sizeof(FileOffset),1,f); /* points to module mode */ markfrom(getpointer(buf),buf); break; default: { int pos = 0; if (hasSrcPos(tag)) { - fread(buf+pos,sizeof(unsigned long),1,f); + fread(buf+pos,sizeof(FileOffset),1,f); pos++; } - fread(buf+pos,sizeof(unsigned long),1,f); /* parent pointer */ + fread(buf+pos,sizeof(FileOffset),1,f); /* parent pointer */ pos++; switch (k) { case ExpApp: - fread(buf+pos,sizeof(unsigned long),2,f); /* result+fun */ + fread(buf+pos,sizeof(FileOffset),2,f); /* result+fun */ pos += 2; { unsigned char arity; fread(&arity,sizeof(unsigned char),1,f); - fread(buf+pos,sizeof(unsigned long),(unsigned int)arity,f); + fread(buf+pos,sizeof(FileOffset),(unsigned int)arity,f); pos += (int)arity; } break; case ExpValueApp: - fread(buf+pos,sizeof(unsigned long),1,f); /* fun */ + fread(buf+pos,sizeof(FileOffset),1,f); /* fun */ pos += 1; { unsigned char arity; fread(&arity,sizeof(unsigned char),1,f); - fread(buf+pos,sizeof(unsigned long),(unsigned int)arity,f); + fread(buf+pos,sizeof(FileOffset),(unsigned int)arity,f); pos += (int)arity; } break; case ExpValueUse: case ExpConstUse: case ExpProjection: - fread(buf+pos,sizeof(unsigned long),1,f); /* one extra pointer */ + fread(buf+pos,sizeof(FileOffset),1,f); /* one extra pointer */ pos++; break; case ExpHidden: @@ -1009,7 +1025,7 @@ case ExpGuard: case ExpCase: case ExpIf: - fread(buf+pos,sizeof(unsigned long),2,f); /* two pointers */ + fread(buf+pos,sizeof(FileOffset),2,f); /* two pointers */ pos+=2; break; default: break; /* no pointers */