Example #1
0
/* code to create classes C and D */
static void setup_classes()
{
#ifdef TAGGING
  pyobj zero = inject_int(0);
  pyobj one = inject_int(1);
#else
  pyobj zero = create_int(0);
  pyobj one = create_int(1);
#endif
  pyobj list0 = create_list(zero);
  pyobj list1 = create_list(one);

  // class C:
  //   def m(self):
  //     return self.f
  C = create_class(list0);

  // Add method m to the class.
  set_attr(C, "m", create_closure(C_m, list0));

  // class D(C):
  //   def m(self):
  //     return self.f + 1
  set_subscript(list1, zero, C); // list1[0] = C
  D = create_class(list1);

  pyobj D_m_closure = create_closure(D_m, list0);
  set_attr(D, "m", create_closure(D_m, list0));

  pyobj D_n_closure = create_closure(D_n, list0);
  set_attr(D, "n", create_closure(D_n, list0));
}
Example #2
0
int main (int argc, char *argv[])
{
    big_pyobj *A, *B, *C;
    big_pyobj *A_parents, *B_parents, *C_parents;
    big_pyobj *list;
    int i;

    /**
     * test1: simple class with no superclasses
     * class A:
     */
    pymem_init();
    A_parents = create_list(inject_int(0));
    incref(A_parents);

    A = create_class(inject_big(A_parents));
    incref(A);
    assert (A_parents->ref_ctr == 2);

    decref(A);
    assert (A_parents->ref_ctr == 1);

    decref(A_parents);

    pymem_print_stats();
    pymem_shutdown();

    /**
     * test2: class with one superclass
     * class A:
     * class B(A):
     * B -> B_parents -> A -> A_parents
     */
    pymem_init();
    A_parents = create_list(inject_int(0));
    incref(A_parents);

    A = create_class(inject_big(A_parents));
    incref(A);
    assert (A_parents->ref_ctr == 2);

    B_parents = create_list(inject_int(1));
    incref(B_parents);
    set_subscript(inject_big(B_parents), inject_int(0), inject_big(A));
    assert (A->ref_ctr == 2);

    B = create_class(inject_big(B_parents));
    incref(B);
    assert (B_parents->ref_ctr == 2);

    decref(A_parents);
    assert (A_parents->ref_ctr == 1);

    decref(A);
    assert (A->ref_ctr == 1);

    decref(B_parents);
    assert (B_parents->ref_ctr == 1);

    pymem_print_stats();
    decref(B);  // everything should go away at this point.
    pymem_print_stats();
    pymem_shutdown();

    /**
     * test3: simple class with attribute.
     * list = []
     * class A:
     *     a = list
     */
    pymem_init();
    list = create_list(inject_int(0));
    incref(list);

    A_parents = create_list(inject_int(0));
    incref(A_parents);

    A = create_class(inject_big(A_parents));
    incref(A);
    assert (A_parents->ref_ctr == 2);

    set_attr(inject_big(A), "a", inject_big(list));
    decref(list);                   // the list should not go away here.
    assert (list->ref_ctr == 1);

    decref(A_parents);
    assert (A_parents->ref_ctr == 1);

    pymem_print_stats();
    decref(A);                      // now everything should be de-allocated.
    pymem_print_stats();
    pymem_shutdown();
}
Example #3
0
int main (int argc, char *argv[])
{
    big_pyobj *list, *list2;
    int i;


    /**
     * test1: simple list creation
     * list = []
     * decref(list)
     */
    pymem_init();
    list = create_list(inject_int(0));
    incref(list);
    decref(list);
    pymem_print_stats();
    pymem_shutdown();

    /**
     * test2: list with primitive (int) elements
     * list = [99,88,77,66,55]
     * decref(list)
     */
    pymem_init();
    list = create_list(inject_int(5));
    incref(list);
    set_subscript(inject_big(list), inject_int(0), inject_int(99));
    set_subscript(inject_big(list), inject_int(1), inject_int(88));
    set_subscript(inject_big(list), inject_int(2), inject_int(77));
    set_subscript(inject_big(list), inject_int(3), inject_int(66));
    set_subscript(inject_big(list), inject_int(4), inject_int(55));
    decref(list);
    pymem_print_stats();
    pymem_shutdown();

    /**
     * test3: list with another list (int) element
     * list = [99]
     * list2 = [list]  // increments list's ref count by one...
     * decref(list2)   // decrements list's ref count by one (in addition to list2)
     *                 // list2 should be deallocated completely.
     * decref(list)    // list should be deallocated completely.
     */
    pymem_init();

    list = create_list(inject_int(1));
    incref(list);
    set_subscript(inject_big(list), inject_int(0), inject_int(99));

    list2 = create_list(inject_int(1));
    incref(list2);
    set_subscript(inject_big(list2), inject_int(0), inject_big(list));
    assert (list->ref_ctr == 2);

    decref(list2);
    assert (list->ref_ctr == 1);

    decref(list);
    pymem_print_stats();
    pymem_shutdown();
}