Blame tests/run/cpp_call_stack_allocated.srctree

Packit 562c7a
# tag: cpp
Packit 562c7a
Packit 562c7a
"""
Packit 562c7a
PYTHON setup.py build_ext --inplace
Packit 562c7a
PYTHON -c "from call_stack_allocated import test; test()"
Packit 562c7a
"""
Packit 562c7a
Packit 562c7a
######## setup.py ########
Packit 562c7a
Packit 562c7a
from distutils.core import setup
Packit 562c7a
from Cython.Build import cythonize
Packit 562c7a
setup(ext_modules=cythonize('*.pyx', language='c++'))
Packit 562c7a
Packit 562c7a
######## call.cpp ########
Packit 562c7a
Packit 562c7a
class wint {
Packit 562c7a
public:
Packit 562c7a
  long long val;
Packit 562c7a
  wint() { val = 0; }
Packit 562c7a
  wint(long long val) { this->val = val; }
Packit 562c7a
  long long &operator()() { return this->val; }
Packit 562c7a
  long long operator()(long long i) { return this->val + i; }
Packit 562c7a
  long long operator()(long long i, long long j) { return this->val + i + j; }
Packit 562c7a
};
Packit 562c7a
Packit 562c7a
######## call.pxd ########
Packit 562c7a
Packit 562c7a
cdef extern from "call.cpp" nogil:
Packit 562c7a
    cppclass wint:
Packit 562c7a
        long long val
Packit 562c7a
        wint()
Packit 562c7a
        wint(long long val)
Packit 562c7a
        long long& operator()()
Packit 562c7a
        long long operator()(long long i)
Packit 562c7a
        long long operator()(long long i, long long j)
Packit 562c7a
Packit 562c7a
Packit 562c7a
######## call_stack_allocated.pyx ########
Packit 562c7a
Packit 562c7a
from call cimport wint
Packit 562c7a
def test():
Packit 562c7a
    cdef wint a = wint(4)
Packit 562c7a
    cdef long long b = 3
Packit 562c7a
    b = a()
Packit 562c7a
    assert b == 4
Packit 562c7a
    b = a(1ll)
Packit 562c7a
    assert b == 5
Packit 562c7a
    b = a(1ll, 1ll)
Packit 562c7a
    assert b == 6
Packit 562c7a