Hi,

Wolfgang Lux wrote:
Nevertheless the debugger seems confused. The self argument of the -addObject: 
method, which should be the leftLineRangesArray, is 0x4817058 while debugger 
says leftLineRangesArray is (class NSMutableArray *) 0x184b9849. This sort of 
thing usually happens when optimization is turned on. But anyway, given this 
discrepancy there's no alternative to Adam's advice: single-step through the 
program, probably from the start of DiffWrapper -initWithFilename:andFilename:.

I rebuilt with debug=yes to disable optimization and aid debuggin:

#0  -[NSException raise] (self=0x57a06ca0, _cmd=0x66ff04a8)
    at NSException.m:955
#1  0x66e705d3 in +[NSException raise:format:] (self=0x66ff02c0,
_cmd=0x67041180, name=0x66feffe4, format=0x67041018) at NSException.m:835
#2  0x66f6156c in default_realloc (zone=0x67040fc0, ptr=0x401e0020,
    size=161441860) at NSZone.m:150
#3  0x66dc33f3 in -[GSMutableArray addObject:] (self=0x3b403a0,
    _cmd=0x415d10, anObject=0x57a06558) at GSArray.m:461
#4  0x0040836b in -[DiffWrapper initWithFilename:andFilename:] (
    self=0x3b56920, _cmd=0x416960, file1=0x3b0bb08, file2=0x279ec20)
    at DiffWrapper.m:70
#5  0x004097ca in -[DiffWindowController _initWithFilename:andFilename:] (
self=0x28f8398, _cmd=0x4168f8, filename1=0x3b0bb08, filename2=0x279ec20)
    at DiffWindowController.m:130
#6  0x00409486 in -[DiffWindowController initWithFilename:andFilename:] (
self=0x28f8398, _cmd=0x418dd0, filename1=0x3b0bb08, filename2=0x279ec20)
    at DiffWindowController.m:88

and then:
(gdb) p anObject
$1 = (id) 0x57a06558
(gdb) po anObject
89

and the array:
No symbol "leftLneRagnesArray" in current context.
(gdb) p leftLineRangesArray
$2 = (class NSMutableArray *) 0x3b403a0
(gdb) po leftLineRangesArray
[New thread 4112.0x122c]
[New thread 4112.0xe9c]
[New thread 4112.0x106c]
Program received signal SIGSEGV, Segmentation fault.

0x3b403a0 now looks consistent, right?

I put two breakpoints in DiffWrapper: one at line 53 (just after the allocation of the array) and one at line 70, where the exception happens.
at line 53, I get:
(gdb) p leftLineRangesArray
$1 = (class NSMutableArray *) 0x3ddae90
(gdb) po leftLineRangesArray
()

gradually, I see in line 70 the array growing. After the third iteration I have:
(gdb) po leftLineRangesArray
("-1", 89)
(gdb) po leftLineRangesArray
("-1", 89, 89)
(gdb) po leftLineRangesArray
("-1", 89, 89)
(gdb) p end
$3 = 89
(gdb) p length
$4 = 3258

if I print out leftString, I get the whole file. Somehow it looks stuck, doesn't it? I iterated manually for a dozen of times: 89.... probably at some point something corrupts.

If I print out "end" on Unix I get an increasing progression towards the whole size of the file. If I try on Windows, it gets to 89 and remains stuck there for infinity.
Is there a but in our getLineStart ?

I understand the code wants to progressively find all line endings by looking in a larger and larger range. Although I find the code strange, since it uses a Range of 0 length,


I rewrote the code and now it appears to work on both unix and windows... what do you think? I tlooks much simpler to me... "inspired" from the net :) It doesn't have the exceptions and it looks only in a specified range, it might be more efficient. Should i commit?

However, I smell an NSString bug and you?

Riccardo

Index: DiffWrapper.m
===================================================================
--- DiffWrapper.m       (revision 35384)
+++ DiffWrapper.m       (working copy)
@@ -48,58 +48,45 @@
       {
        NSUInteger length = [leftString length];
        NSUInteger end;
+       NSUInteger contEnd;
 
        leftLineRangesArray = [[NSMutableArray alloc] init];
        [leftLineRangesArray addObject:
               [NSNumber numberWithInt: -1]];
 
+       contEnd = 0;
        end = 0;
-       while ((length > 0) && (end < length - 1))
+       while ((length > 0) && (contEnd < length))
          {
            [leftString getLineStart: NULL
-                                end: NULL
-                        contentsEnd: &end
-                           forRange: NSMakeRange(end + 1, 0)];
-           if (end >= length)
-             {
-               [leftLineRangesArray addObject: 
-                      [NSNumber numberWithUnsignedInt: length - 1]];
-             }
-           else
-             {
-               [leftLineRangesArray addObject: 
-                      [NSNumber numberWithUnsignedInt: end]];
-             }
+                                end: &end
+                        contentsEnd: &contEnd
+                           forRange: NSMakeRange(end, 0)];
+           [leftLineRangesArray addObject: 
+                                  [NSNumber numberWithUnsignedInt: end]];
          }
       }
 
       {
        NSUInteger length = [rightString length];
        NSUInteger end;
+       NSUInteger contEnd;
        rightLineRangesArray = [[NSMutableArray alloc] init];
        [rightLineRangesArray addObject:
                [NSNumber numberWithInt: -1]];
-
+       
+       contEnd = 0;
        end = 0;
-       while ((length > 0) && (end < length - 1))
+       while ((length > 0) && (contEnd < length - 1))
          {
            [rightString getLineStart: NULL
-                                 end: NULL
-                         contentsEnd: &end
-                            forRange: NSMakeRange(end + 1, 0)];
-           if (end >= length)
-             {
-               [rightLineRangesArray addObject: 
-                       [NSNumber numberWithUnsignedInt: length - 1]];
-             }
-           else
-             {
-               [rightLineRangesArray addObject: 
-                       [NSNumber numberWithUnsignedInt: end]];
-             }
+                                 end: &end
+                         contentsEnd: &contEnd
+                            forRange: NSMakeRange(end, 0)];
+           [rightLineRangesArray addObject: 
+                                   [NSNumber numberWithUnsignedInt: end]];
          }
       }
-
     }
 
   return self;
_______________________________________________
Discuss-gnustep mailing list
[email protected]
https://lists.gnu.org/mailman/listinfo/discuss-gnustep

Reply via email to