~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/_patiencediff_c.c

  • Committer: Robert Collins
  • Date: 2008-09-02 05:28:37 UTC
  • mfrom: (3675 +trunk)
  • mto: This revision was merged to the branch mainline in revision 3677.
  • Revision ID: robertc@robertcollins.net-20080902052837-ec3qlv41q5e7f6fl
Resolve conflicts with NEWS.

Show diffs side-by-side

added added

removed removed

Lines of Context:
541
541
}
542
542
 
543
543
 
 
544
static void
 
545
delete_lines(struct line *lines, Py_ssize_t size)
 
546
{
 
547
    struct line *line = lines;
 
548
    while (size-- > 0) {
 
549
        Py_XDECREF(line->data);
 
550
        line++;
 
551
    }
 
552
    free(lines);
 
553
}
 
554
 
 
555
 
544
556
static Py_ssize_t
545
557
load_lines(PyObject *orig, struct line **lines)
546
558
{
559
571
        return 0;
560
572
    }
561
573
 
562
 
    line = *lines = (struct line *)malloc(sizeof(struct line) * size);
 
574
    /* Allocate a memory block for line data, initialized to 0 */
 
575
    line = *lines = (struct line *)calloc(size, sizeof(struct line));
563
576
    if (line == NULL) {
564
577
        PyErr_NoMemory();
565
578
        Py_DECREF(seq);
568
581
 
569
582
    for (i = 0; i < size; i++) {
570
583
        item = PySequence_Fast_GET_ITEM(seq, i);
 
584
        Py_INCREF(item);
571
585
        line->data = item;
572
586
        line->hash = PyObject_Hash(item);
573
587
        if (line->hash == (-1)) {
581
595
 
582
596
    cleanup:
583
597
    Py_DECREF(seq);
 
598
    if (size == -1) {
 
599
        /* Error -- cleanup unused object references */
 
600
        delete_lines(*lines, i);
 
601
        *lines = NULL;
 
602
    }
584
603
    return size;
585
604
}
586
605
 
633
652
    free(backpointers);
634
653
    free(matches);
635
654
    free(hashtable.table);
636
 
    free(b);
637
 
    free(a);
 
655
    delete_lines(b, bsize);
 
656
    delete_lines(a, asize);
638
657
    return res;
639
658
 
640
659
error:
641
660
    free(backpointers);
642
661
    free(matches);
643
662
    free(hashtable.table);
644
 
    free(b);
645
 
    free(a);
 
663
    delete_lines(b, bsize);
 
664
    delete_lines(a, asize);
646
665
    return NULL;
647
666
}
648
667
 
711
730
    free(backpointers);
712
731
    free(matches.matches);
713
732
    free(hashtable.table);
714
 
    free(b);
715
 
    free(a);
 
733
    delete_lines(b, bsize);
 
734
    delete_lines(a, asize);
716
735
    Py_RETURN_NONE;
717
736
 
718
737
error:
719
738
    free(backpointers);
720
739
    free(matches.matches);
721
740
    free(hashtable.table);
722
 
    free(b);
723
 
    free(a);
 
741
    delete_lines(b, bsize);
 
742
    delete_lines(a, asize);
724
743
    return NULL;
725
744
}
726
745
 
769
788
{
770
789
    free(self->backpointers);
771
790
    free(self->hashtable.table);
772
 
    free(self->b);
773
 
    free(self->a);
 
791
    delete_lines(self->b, self->bsize);
 
792
    delete_lines(self->a, self->asize);
774
793
    self->ob_type->tp_free((PyObject *)self);
775
794
}
776
795