~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/_patiencediff_c.c

  • Committer: John Arbash Meinel
  • Date: 2008-10-30 00:55:00 UTC
  • mto: (3815.2.5 prepare-1.9)
  • mto: This revision was merged to the branch mainline in revision 3811.
  • Revision ID: john@arbash-meinel.com-20081030005500-r5cej1cxflqhs3io
Switch so that we are using a simple timestamp as the first action.

Show diffs side-by-side

added added

removed removed

Lines of Context:
27
27
#include <string.h>
28
28
#include <Python.h>
29
29
 
30
 
 
31
 
/* http://www.python.org/dev/peps/pep-0353/ */
32
 
#if PY_VERSION_HEX < 0x02050000 && !defined(PY_SSIZE_T_MIN)
33
 
typedef int Py_ssize_t;
34
 
#define PY_SSIZE_T_MAX INT_MAX
35
 
#define PY_SSIZE_T_MIN INT_MIN
36
 
#endif
 
30
#include "python-compat.h"
37
31
 
38
32
 
39
33
#if defined(__GNUC__)
541
535
}
542
536
 
543
537
 
 
538
static void
 
539
delete_lines(struct line *lines, Py_ssize_t size)
 
540
{
 
541
    struct line *line = lines;
 
542
    while (size-- > 0) {
 
543
        Py_XDECREF(line->data);
 
544
        line++;
 
545
    }
 
546
    free(lines);
 
547
}
 
548
 
 
549
 
544
550
static Py_ssize_t
545
551
load_lines(PyObject *orig, struct line **lines)
546
552
{
559
565
        return 0;
560
566
    }
561
567
 
562
 
    line = *lines = (struct line *)malloc(sizeof(struct line) * size);
 
568
    /* Allocate a memory block for line data, initialized to 0 */
 
569
    line = *lines = (struct line *)calloc(size, sizeof(struct line));
563
570
    if (line == NULL) {
564
571
        PyErr_NoMemory();
565
572
        Py_DECREF(seq);
568
575
 
569
576
    for (i = 0; i < size; i++) {
570
577
        item = PySequence_Fast_GET_ITEM(seq, i);
 
578
        Py_INCREF(item);
571
579
        line->data = item;
572
580
        line->hash = PyObject_Hash(item);
573
581
        if (line->hash == (-1)) {
581
589
 
582
590
    cleanup:
583
591
    Py_DECREF(seq);
 
592
    if (size == -1) {
 
593
        /* Error -- cleanup unused object references */
 
594
        delete_lines(*lines, i);
 
595
        *lines = NULL;
 
596
    }
584
597
    return size;
585
598
}
586
599
 
633
646
    free(backpointers);
634
647
    free(matches);
635
648
    free(hashtable.table);
636
 
    free(b);
637
 
    free(a);
 
649
    delete_lines(b, bsize);
 
650
    delete_lines(a, asize);
638
651
    return res;
639
652
 
640
653
error:
641
654
    free(backpointers);
642
655
    free(matches);
643
656
    free(hashtable.table);
644
 
    free(b);
645
 
    free(a);
 
657
    delete_lines(b, bsize);
 
658
    delete_lines(a, asize);
646
659
    return NULL;
647
660
}
648
661
 
711
724
    free(backpointers);
712
725
    free(matches.matches);
713
726
    free(hashtable.table);
714
 
    free(b);
715
 
    free(a);
 
727
    delete_lines(b, bsize);
 
728
    delete_lines(a, asize);
716
729
    Py_RETURN_NONE;
717
730
 
718
731
error:
719
732
    free(backpointers);
720
733
    free(matches.matches);
721
734
    free(hashtable.table);
722
 
    free(b);
723
 
    free(a);
 
735
    delete_lines(b, bsize);
 
736
    delete_lines(a, asize);
724
737
    return NULL;
725
738
}
726
739
 
769
782
{
770
783
    free(self->backpointers);
771
784
    free(self->hashtable.table);
772
 
    free(self->b);
773
 
    free(self->a);
 
785
    delete_lines(self->b, self->bsize);
 
786
    delete_lines(self->a, self->asize);
774
787
    self->ob_type->tp_free((PyObject *)self);
775
788
}
776
789