From: Markus Date: 2004-10-26T14:39:47+09:00 Subject: Re: Errors in line numbers reported? On Mon, 2004-10-25 at 20:54, Ara.T.Howard@noaa.gov wrote: > On Tue, 26 Oct 2004, Yukihiro Matsumoto wrote: > > > Hi, > > > > In message "Re: Errors in line numbers reported?" > > on Tue, 26 Oct 2004 11:34:05 +0900, Ara.T.Howard@noaa.gov writes: > > > > |> Send me, unless the source file is larger than 8191 lines. > > |> It's implementation restriction. > > > > |you mean __LINE__ cannot go > that that? > > > > Unfortunately yes. It's balance between performance and my > > intelligence. Maybe someone wiser than me can enlighten me. > > > > matz. > > with a lead in like that you can't expect many patches can you? ;-) > I agree with Ara; so instead I will sign up under the always implicit "more foolhardy" clause in the hopes of learning a little by claiming less. I have a patch (attached). It removes the 8k line limit on error tracking but increases the size of the RNODE to 36 bytes (if I calculate correctly) from the easier to align 32 bytes. I suspect that this is where the performance hit would come from, but I have been unable to measure any consistent speed difference between the patched and unpatched versions, so I may not be testing the right cases. It may also be that the savings of not having to shift the bits around makes up for the alignment hit somewhat, but I have not tested this idea. -- Markus diff -u ruby-1.8.2/eval.c ruby-1.8.2-8klines/eval.c --- ruby-1.8.2/eval.c 2004-07-27 23:32:37.000000000 -0700 +++ ruby-1.8.2-8klines/eval.c 2004-10-25 22:13:13.000000000 -0700 @@ -8296,7 +8296,7 @@ Data_Get_Struct(self, struct BLOCK, data); if ((node = data->frame.node) || (node = data->body)) { - len += strlen(node->nd_file) + 2 + (SIZEOF_LONG*CHAR_BIT-NODE_LSHIFT)/3; + len += strlen(node->nd_file) + 2 + (SIZEOF_LONG*CHAR_BIT)/3; str = rb_str_new(0, len); sprintf(RSTRING(str)->ptr, "#<%s:0x%.*lx@%s:%d>", cname, w, (VALUE)data->body, node->nd_file, nd_line(node)); diff -u ruby-1.8.2/node.h ruby-1.8.2-8klines/node.h --- ruby-1.8.2/node.h 2004-10-25 22:05:16.000000000 -0700 +++ ruby-1.8.2-8klines/node.h 2004-10-25 22:20:04.000000000 -0700 @@ -130,6 +130,7 @@ typedef struct RNode { unsigned long flags; char *nd_file; + unsigned long nd_line; union { struct RNode *node; ID id; @@ -159,11 +160,8 @@ #define nd_set_type(n,t) \ RNODE(n)->flags=((RNODE(n)->flags&~FL_UMASK)|(((t)<flags>>NODE_LSHIFT)&NODE_LMASK)) -#define nd_set_line(n,l) \ - RNODE(n)->flags=((RNODE(n)->flags&~(-1<nd_line)) +#define nd_set_line(n,l) (RNODE(n)->nd_line=(l)) #define nd_head u1.node #define nd_alen u2.argc