Norimasa Okamoto
/
pymite
python-on-a-chip online compiler
Embed:
(wiki syntax)
Show/hide line numbers
NativeClassInterface.cpp
00001 // NativeClassInterface.cpp 2013/3/13 00002 #include "mbed.h" 00003 #define __DEBUG__ 1 00004 #include "pm.h" 00005 #include "NativeClassInterface.h" 00006 #include "PinNameTable.h" 00007 00008 #undef __FILE_ID__ 00009 #define __FILE_ID__ 0x71 00010 00011 template<> 00012 int NativeClassInterface::argv<int>(int n) 00013 { 00014 pPmObj_t pn = NATIVE_GET_LOCAL(n); 00015 if (OBJ_GET_TYPE(pn) == OBJ_TYPE_STR) { 00016 return ((pPmString_t)pn)->val[0]; 00017 } 00018 return ((pPmInt_t)pn)->val; 00019 } 00020 00021 template<> 00022 bool NativeClassInterface::argv<bool>(int n) 00023 { 00024 pPmObj_t pn = NATIVE_GET_LOCAL(n); 00025 return ((pPmInt_t)pn)->val; 00026 } 00027 00028 template<> 00029 float NativeClassInterface::argv<float>(int n) 00030 { 00031 pPmObj_t pn = NATIVE_GET_LOCAL(n); 00032 return ((pPmFloat_t)pn)->val; 00033 } 00034 00035 template<> 00036 char NativeClassInterface::argv<char>(int n) 00037 { 00038 pPmObj_t pn = NATIVE_GET_LOCAL(n); 00039 return ((pPmString_t)pn)->val[0]; 00040 } 00041 00042 template<> 00043 char* NativeClassInterface::argv<char*>(int n) 00044 { 00045 pPmObj_t pn = NATIVE_GET_LOCAL(n); 00046 return reinterpret_cast<char*>(((pPmString_t)pn)->val); 00047 } 00048 00049 template<> 00050 const char* NativeClassInterface::argv<const char*>(int n) 00051 { 00052 pPmObj_t pn = NATIVE_GET_LOCAL(n); 00053 return reinterpret_cast<const char*>(((pPmString_t)pn)->val); 00054 } 00055 00056 template<> 00057 uint16_t NativeClassInterface::argv<uint16_t>(int n) 00058 { 00059 pPmObj_t pn = NATIVE_GET_LOCAL(n); 00060 return ((pPmInt_t)pn)->val; 00061 } 00062 00063 template<> 00064 PinName NativeClassInterface::argv<PinName>(int n) 00065 { 00066 pPmObj_t pn = NATIVE_GET_LOCAL(n); 00067 if (OBJ_GET_TYPE(pn) == OBJ_TYPE_INT) { 00068 return (PinName)(((pPmInt_t)pn)->val); 00069 } 00070 if (OBJ_GET_TYPE(pn) != OBJ_TYPE_STR) { 00071 return NC; 00072 } 00073 int imin = 0; 00074 int imax = sizeof(pinname_table) / sizeof(pinNameStr) - 1; 00075 char *key = reinterpret_cast<char*>(((pPmString_t)pn)->val); 00076 while(imax >= imin) { 00077 int i = (imin + imax) / 2; 00078 int c = strcmp(key, pinname_table[i].name); 00079 if (c == 0) { 00080 return pinname_table[i].pin; 00081 } else if (c > 0) { 00082 imin = i + 1; 00083 } else { 00084 imax = i - 1; 00085 } 00086 } 00087 return NC; 00088 } 00089 00090 template<> 00091 PmReturn_t NativeClassInterface::set_return_value<int>(PmType_t ret_type, int value) 00092 { 00093 pPmObj_t pn; 00094 PmReturn_t retval; 00095 if (ret_type == OBJ_TYPE_STR) { 00096 retval = string_newFromChar((uint8_t)value, &pn); 00097 } else { 00098 retval = int_new(value, &pn); 00099 } 00100 NATIVE_SET_TOS(pn); 00101 return retval; 00102 } 00103 00104 template<> 00105 PmReturn_t NativeClassInterface::set_return_value<uint8_t>(PmType_t ret_type, uint8_t value) 00106 { 00107 pPmObj_t pn; 00108 PmReturn_t retval = int_new(value, &pn); 00109 NATIVE_SET_TOS(pn); 00110 return retval; 00111 } 00112 00113 template<> 00114 PmReturn_t NativeClassInterface::set_return_value<uint16_t>(PmType_t ret_type, uint16_t value) 00115 { 00116 pPmObj_t pn; 00117 PmReturn_t retval = int_new(value, &pn); 00118 NATIVE_SET_TOS(pn); 00119 return retval; 00120 } 00121 00122 template<> 00123 PmReturn_t NativeClassInterface::set_return_value<float>(PmType_t ret_type, float value) 00124 { 00125 pPmObj_t pn; 00126 PmReturn_t retval = float_new(value, &pn); 00127 NATIVE_SET_TOS(pn); 00128 return retval; 00129 } 00130 00131 template<typename R> 00132 PmReturn_t NativeClassInterface::set_return_value(PmType_t ret_type, R value) 00133 { 00134 pPmObj_t pn; 00135 PmReturn_t retval; 00136 switch(ret_type) { 00137 case OBJ_TYPE_INT: 00138 retval = int_new(value, &pn); 00139 break; 00140 case OBJ_TYPE_FLT: 00141 retval = float_new(value, &pn); 00142 break; 00143 } 00144 NATIVE_SET_TOS(pn); 00145 return retval; 00146 } 00147 00148 PmReturn_t NativeClassInterface::check_argv_type(int arg_n, ...) 00149 { 00150 PmReturn_t retval = PM_RET_OK; 00151 if (NATIVE_GET_NUM_ARGS() != (arg_n+1)) { 00152 PM_RAISE(retval, PM_RET_EX_TYPE); 00153 return retval; 00154 } 00155 va_list vl; 00156 va_start(vl, arg_n); 00157 for(int n = 1; n <= arg_n; n++) { 00158 pPmObj_t pn = NATIVE_GET_LOCAL(n); 00159 int ty = va_arg(vl, int); 00160 if (OBJ_GET_TYPE(pn) != ty) { 00161 PM_RAISE(retval, PM_RET_EX_TYPE); 00162 return retval; 00163 } 00164 } 00165 return retval; 00166 }
Generated on Tue Jul 12 2022 23:13:47 by 1.7.2