1# ticket: 258
2
3cdef extern from "Python.h":
4
5    ctypedef class __builtin__.list  [object PyListObject]:
6        cdef Py_ssize_t allocated
7
8    ctypedef class __builtin__.dict  [object PyDictObject]:
9        pass
10
11    cdef Py_ssize_t Py_SIZE(object o)
12
13cdef list L = [1,2,4]
14cdef dict d = {'A': 'a'}
15
16
17def test_list(list L):
18    """
19    >>> test_list(list(range(10)))
20    True
21    >>> class list_subclass(list): pass
22    >>> test_list(list_subclass([1,2,3]))
23    True
24    """
25    return Py_SIZE(L) <= L.allocated
26
27def test_tuple(tuple t):
28    """
29    Actual builtin types are restrictive wrt subclassing so optimizations can be safely performed.
30
31    >>> test_tuple((1,2))
32    2
33    >>> class tuple_subclass(tuple): pass
34    >>> test_tuple(tuple_subclass((1,2)))
35    Traceback (most recent call last):
36    ...
37    TypeError: Argument 't' has incorrect type (expected tuple, got tuple_subclass)
38    """
39    return len(t)
40
41