[Python-checkins] r59948 - python/trunk/Objects/structseq.c

Christian Heimes lists at cheimes.de
Mon Jan 14 07:15:01 CET 2008


Neal Norwitz wrote:
> Christian,
> 
> Can you add some comments to the code?  I'll give more detailed code
> review below.

Done

> It would be nice to limit scope for cname, crepr and any others that
> are only used inside the loop.

Does a local variable cost some CPU cycles to free and alloc space on
the stack? Is there a speed difference between

int i;
for(...) {}

and

for (...) [  int i; }

?

> Is 250 enough?  How did you calculate?  This would be good to doc.
> Also, it seems like it would be better to use either MACRO_SIZE or
> sizeof() calculations so these can't get out of sync.

I chose 250 out of gut feeling. It's more than large enough for os.stat,
time and sys.flags but fits in about 4 lines of output.

> This is a potential buffer overflow.  The addition should be checked.
> Also note that strlen() returns size_t which is unsigned and could be
> larger than an int, eg on 64-bit platforms.

I don't see how the code could overflow. It doesn't add the string if
"key=value, " doesn't fit in the buffer before endofbuf.


> If this is the last element the condition above could be false, even
> though its possible for the data to fit.

Oh right, good catch.

> It took me a long time to figure out why 5.  I don't like that this is
> dependent on the 5 added to the buffer above and that you are copying
> 3 bytes here.  I understood once I saw the -= 2 below.  But this
> should be documented and perhaps refactored to try to prevent breakage
> if one part of the code is modified, but not the rest.

You are right, it's too magic and tricky. The code now uses a variable
removelast which should be self explaining.

> If the tuple is empty, this will print TypeNam) rather than
> TypeName().  While this is an unusual use of structseq, it should
> still work.

Fixed

Christian


More information about the Python-checkins mailing list