![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
python
Fork of pymite by
platform/mbed/NativeClassInterface.h@12:d27ad05214e3, 2014-08-28 (annotated)
- Committer:
- kausdev
- Date:
- Thu Aug 28 19:35:16 2014 +0000
- Revision:
- 12:d27ad05214e3
- Parent:
- 3:559c4bd38111
pymte
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
va009039 | 3:559c4bd38111 | 1 | // NativeClassInterface.h 2013/3/13 |
va009039 | 2:a2bea117e22e | 2 | #pragma once |
va009039 | 2:a2bea117e22e | 3 | #include <stdarg.h> |
va009039 | 2:a2bea117e22e | 4 | class NativeClassInterface { |
va009039 | 2:a2bea117e22e | 5 | public: |
va009039 | 2:a2bea117e22e | 6 | template<class T> |
va009039 | 2:a2bea117e22e | 7 | PmReturn_t init() |
va009039 | 2:a2bea117e22e | 8 | { |
va009039 | 2:a2bea117e22e | 9 | PmReturn_t retval = check_argv_type(0); |
va009039 | 2:a2bea117e22e | 10 | PM_RETURN_IF_ERROR(retval); |
va009039 | 2:a2bea117e22e | 11 | T* obj = new T(); |
va009039 | 2:a2bea117e22e | 12 | return _save_obj<T>(obj); |
va009039 | 2:a2bea117e22e | 13 | } |
va009039 | 2:a2bea117e22e | 14 | |
va009039 | 2:a2bea117e22e | 15 | template<class T, typename A1> |
va009039 | 2:a2bea117e22e | 16 | PmReturn_t init(PmType_t a1_type) |
va009039 | 2:a2bea117e22e | 17 | { |
va009039 | 2:a2bea117e22e | 18 | PmReturn_t retval = check_argv_type(1, a1_type); |
va009039 | 2:a2bea117e22e | 19 | PM_RETURN_IF_ERROR(retval); |
va009039 | 2:a2bea117e22e | 20 | T* obj = new T(argv<A1>(1)); |
va009039 | 2:a2bea117e22e | 21 | return _save_obj<T>(obj); |
va009039 | 2:a2bea117e22e | 22 | } |
va009039 | 2:a2bea117e22e | 23 | |
va009039 | 2:a2bea117e22e | 24 | template<class T, typename A1, typename A2> |
va009039 | 2:a2bea117e22e | 25 | PmReturn_t init(PmType_t a1_type, PmType_t a2_type) |
va009039 | 2:a2bea117e22e | 26 | { |
va009039 | 2:a2bea117e22e | 27 | PmReturn_t retval = check_argv_type(2, a1_type, a2_type); |
va009039 | 2:a2bea117e22e | 28 | PM_RETURN_IF_ERROR(retval); |
va009039 | 2:a2bea117e22e | 29 | T* obj = new T(argv<A1>(1), argv<A2>(2)); |
va009039 | 2:a2bea117e22e | 30 | return _save_obj<T>(obj); |
va009039 | 2:a2bea117e22e | 31 | } |
va009039 | 2:a2bea117e22e | 32 | |
va009039 | 2:a2bea117e22e | 33 | template<class T, typename A1, typename A2, typename A3> |
va009039 | 2:a2bea117e22e | 34 | PmReturn_t init(PmType_t a1_type, PmType_t a2_type, PmType_t a3_type) |
va009039 | 2:a2bea117e22e | 35 | { |
va009039 | 2:a2bea117e22e | 36 | PmReturn_t retval = check_argv_type(3, a1_type, a2_type, a3_type); |
va009039 | 2:a2bea117e22e | 37 | PM_RETURN_IF_ERROR(retval); |
va009039 | 2:a2bea117e22e | 38 | T* obj = new T(argv<A1>(1), argv<A2>(2), argv<A3>(3)); |
va009039 | 2:a2bea117e22e | 39 | return _save_obj<T>(obj); |
va009039 | 2:a2bea117e22e | 40 | } |
va009039 | 2:a2bea117e22e | 41 | |
va009039 | 2:a2bea117e22e | 42 | template<class T, void(T::*member)()> |
va009039 | 2:a2bea117e22e | 43 | PmReturn_t method(PmType_t ret_type) |
va009039 | 2:a2bea117e22e | 44 | { |
va009039 | 2:a2bea117e22e | 45 | PmReturn_t retval = check_argv_type(0); |
va009039 | 2:a2bea117e22e | 46 | PM_RETURN_IF_ERROR(retval); |
va009039 | 2:a2bea117e22e | 47 | T* obj; |
va009039 | 2:a2bea117e22e | 48 | retval = _load_obj<T>(&obj); |
va009039 | 2:a2bea117e22e | 49 | PM_RETURN_IF_ERROR(retval); |
va009039 | 2:a2bea117e22e | 50 | (obj->*member)(); |
va009039 | 2:a2bea117e22e | 51 | NATIVE_SET_TOS(PM_NONE); |
va009039 | 2:a2bea117e22e | 52 | return retval; |
va009039 | 2:a2bea117e22e | 53 | } |
va009039 | 2:a2bea117e22e | 54 | |
va009039 | 2:a2bea117e22e | 55 | template<class T, typename A1, void(T::*member)(A1)> |
va009039 | 2:a2bea117e22e | 56 | PmReturn_t method(PmType_t ret_type, PmType_t a1_type) |
va009039 | 2:a2bea117e22e | 57 | { |
va009039 | 2:a2bea117e22e | 58 | PmReturn_t retval = check_argv_type(1, a1_type); |
va009039 | 2:a2bea117e22e | 59 | PM_RETURN_IF_ERROR(retval); |
va009039 | 2:a2bea117e22e | 60 | T* obj; |
va009039 | 2:a2bea117e22e | 61 | retval = _load_obj<T>(&obj); |
va009039 | 2:a2bea117e22e | 62 | PM_RETURN_IF_ERROR(retval); |
va009039 | 2:a2bea117e22e | 63 | (obj->*member)(argv<A1>(1)); |
va009039 | 2:a2bea117e22e | 64 | NATIVE_SET_TOS(PM_NONE); |
va009039 | 2:a2bea117e22e | 65 | return retval; |
va009039 | 2:a2bea117e22e | 66 | } |
va009039 | 2:a2bea117e22e | 67 | |
va009039 | 2:a2bea117e22e | 68 | template<class T, typename A1, typename A2, void(T::*member)(A1,A2)> |
va009039 | 2:a2bea117e22e | 69 | PmReturn_t method(PmType_t ret_type, PmType_t a1_type, PmType_t a2_type) |
va009039 | 2:a2bea117e22e | 70 | { |
va009039 | 2:a2bea117e22e | 71 | PmReturn_t retval = check_argv_type(2, a1_type, a2_type); |
va009039 | 2:a2bea117e22e | 72 | PM_RETURN_IF_ERROR(retval); |
va009039 | 2:a2bea117e22e | 73 | T* obj; |
va009039 | 2:a2bea117e22e | 74 | retval = _load_obj<T>(&obj); |
va009039 | 2:a2bea117e22e | 75 | PM_RETURN_IF_ERROR(retval); |
va009039 | 2:a2bea117e22e | 76 | (obj->*member)(argv<A1>(1), argv<A2>(2)); |
va009039 | 2:a2bea117e22e | 77 | NATIVE_SET_TOS(PM_NONE); |
va009039 | 2:a2bea117e22e | 78 | return retval; |
va009039 | 2:a2bea117e22e | 79 | } |
va009039 | 2:a2bea117e22e | 80 | |
va009039 | 2:a2bea117e22e | 81 | template<typename R, class T, R(T::*member)()> |
va009039 | 2:a2bea117e22e | 82 | PmReturn_t method(PmType_t ret_type) |
va009039 | 2:a2bea117e22e | 83 | { |
va009039 | 2:a2bea117e22e | 84 | PmReturn_t retval = check_argv_type(0); |
va009039 | 2:a2bea117e22e | 85 | PM_RETURN_IF_ERROR(retval); |
va009039 | 2:a2bea117e22e | 86 | T* obj; |
va009039 | 2:a2bea117e22e | 87 | retval = _load_obj<T>(&obj); |
va009039 | 2:a2bea117e22e | 88 | PM_RETURN_IF_ERROR(retval); |
va009039 | 2:a2bea117e22e | 89 | R value = (obj->*member)(); |
va009039 | 2:a2bea117e22e | 90 | return set_return_value<R>(ret_type, value); |
va009039 | 2:a2bea117e22e | 91 | } |
va009039 | 2:a2bea117e22e | 92 | |
va009039 | 2:a2bea117e22e | 93 | template<typename R, class T, typename A1, R(T::*member)(A1)> |
va009039 | 2:a2bea117e22e | 94 | PmReturn_t method(PmType_t ret_type, PmType_t a1_type) |
va009039 | 2:a2bea117e22e | 95 | { |
va009039 | 2:a2bea117e22e | 96 | PmReturn_t retval = check_argv_type(1, a1_type); |
va009039 | 2:a2bea117e22e | 97 | PM_RETURN_IF_ERROR(retval); |
va009039 | 2:a2bea117e22e | 98 | T* obj; |
va009039 | 2:a2bea117e22e | 99 | retval = _load_obj<T>(&obj); |
va009039 | 2:a2bea117e22e | 100 | PM_RETURN_IF_ERROR(retval); |
va009039 | 2:a2bea117e22e | 101 | R value = (obj->*member)(argv<A1>(1)); |
va009039 | 2:a2bea117e22e | 102 | return set_return_value<R>(ret_type, value); |
va009039 | 2:a2bea117e22e | 103 | } |
va009039 | 2:a2bea117e22e | 104 | |
va009039 | 2:a2bea117e22e | 105 | template<typename R, class T, typename A1, typename A2, typename A3, typename A4, R(T::*member)(A1, A2, A3, A4)> |
va009039 | 2:a2bea117e22e | 106 | PmReturn_t method(PmType_t ret_type, PmType_t a1_type, PmType_t a2_type, PmType_t a3_type, PmType_t a4_type) |
va009039 | 2:a2bea117e22e | 107 | { |
va009039 | 2:a2bea117e22e | 108 | PmReturn_t retval = check_argv_type(4, a1_type, a2_type, a3_type, a4_type); |
va009039 | 2:a2bea117e22e | 109 | PM_RETURN_IF_ERROR(retval); |
va009039 | 2:a2bea117e22e | 110 | T* obj; |
va009039 | 2:a2bea117e22e | 111 | retval = _load_obj<T>(&obj); |
va009039 | 2:a2bea117e22e | 112 | PM_RETURN_IF_ERROR(retval); |
va009039 | 2:a2bea117e22e | 113 | R value = (obj->*member)(argv<A1>(1), argv<A2>(2), argv<A3>(3), argv<A4>(4)); |
va009039 | 2:a2bea117e22e | 114 | return set_return_value<R>(ret_type, value); |
va009039 | 2:a2bea117e22e | 115 | } |
va009039 | 2:a2bea117e22e | 116 | |
va009039 | 2:a2bea117e22e | 117 | PmReturn_t check_argv_type(int arg_n, ...); |
va009039 | 2:a2bea117e22e | 118 | |
va009039 | 2:a2bea117e22e | 119 | template<class T> |
va009039 | 2:a2bea117e22e | 120 | PmReturn_t _save_obj(T* obj) |
va009039 | 2:a2bea117e22e | 121 | { |
va009039 | 2:a2bea117e22e | 122 | PmReturn_t retval = PM_RET_OK; |
va009039 | 2:a2bea117e22e | 123 | pPmObj_t pself = NATIVE_GET_LOCAL(0); |
va009039 | 2:a2bea117e22e | 124 | pPmObj_t pattrs = (pPmObj_t)((pPmInstance_t)pself)->cli_attrs; |
va009039 | 2:a2bea117e22e | 125 | pPmObj_t pn; |
va009039 | 2:a2bea117e22e | 126 | retval = int_new((uint32_t)obj, &pn); |
va009039 | 2:a2bea117e22e | 127 | PM_RETURN_IF_ERROR(retval); |
va009039 | 2:a2bea117e22e | 128 | uint8_t objid; |
va009039 | 2:a2bea117e22e | 129 | heap_gcPushTempRoot(pn, &objid); |
va009039 | 2:a2bea117e22e | 130 | retval = dict_setItem(pattrs, PM_NONE, pn); |
va009039 | 2:a2bea117e22e | 131 | heap_gcPopTempRoot(objid); |
va009039 | 2:a2bea117e22e | 132 | PM_RETURN_IF_ERROR(retval); |
va009039 | 2:a2bea117e22e | 133 | NATIVE_SET_TOS(PM_NONE); |
va009039 | 2:a2bea117e22e | 134 | return retval; |
va009039 | 2:a2bea117e22e | 135 | } |
va009039 | 2:a2bea117e22e | 136 | |
va009039 | 2:a2bea117e22e | 137 | template<class T> |
va009039 | 2:a2bea117e22e | 138 | PmReturn_t _load_obj(T** obj) |
va009039 | 2:a2bea117e22e | 139 | { |
va009039 | 2:a2bea117e22e | 140 | PmReturn_t retval = PM_RET_OK; |
va009039 | 2:a2bea117e22e | 141 | pPmObj_t pself = NATIVE_GET_LOCAL(0); |
va009039 | 2:a2bea117e22e | 142 | pPmObj_t pattrs = reinterpret_cast<pPmObj_t>(((pPmInstance_t)pself)->cli_attrs); |
va009039 | 2:a2bea117e22e | 143 | pPmObj_t pn; |
va009039 | 2:a2bea117e22e | 144 | retval = dict_getItem(pattrs, PM_NONE, &pn); |
va009039 | 2:a2bea117e22e | 145 | PM_RETURN_IF_ERROR(retval); |
va009039 | 2:a2bea117e22e | 146 | *obj = reinterpret_cast<T*>(((pPmInt_t)pn)->val); |
va009039 | 2:a2bea117e22e | 147 | return retval; |
va009039 | 2:a2bea117e22e | 148 | } |
va009039 | 2:a2bea117e22e | 149 | |
va009039 | 2:a2bea117e22e | 150 | template<typename R> |
va009039 | 2:a2bea117e22e | 151 | PmReturn_t set_return_value(PmType_t ret_type, R value); |
va009039 | 2:a2bea117e22e | 152 | |
va009039 | 2:a2bea117e22e | 153 | template<typename A> |
va009039 | 2:a2bea117e22e | 154 | A argv(int n); |
va009039 | 2:a2bea117e22e | 155 | }; |