python-on-a-chip online compiler

Dependencies:   mbed TSI

/media/uploads/va009039/p14p-f446re.png

more info: python-on-a-chip

Committer:
va009039
Date:
Wed Mar 13 10:05:34 2013 +0000
Revision:
3:559c4bd38111
Parent:
2:a2bea117e22e
add TARGET_KL25Z

Who changed what in which revision?

UserRevisionLine numberNew 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 };