![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
python
Fork of pymite by
platform/mbed/pmstdlib_nat.cpp@0:65f1469d6bfb, 2013-03-02 (annotated)
- Committer:
- va009039
- Date:
- Sat Mar 02 11:54:20 2013 +0000
- Revision:
- 0:65f1469d6bfb
first commit
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
va009039 | 0:65f1469d6bfb | 1 | #undef __FILE_ID__ |
va009039 | 0:65f1469d6bfb | 2 | #define __FILE_ID__ 0x0A |
va009039 | 0:65f1469d6bfb | 3 | /** |
va009039 | 0:65f1469d6bfb | 4 | * PyMite std native function file |
va009039 | 0:65f1469d6bfb | 5 | * |
va009039 | 0:65f1469d6bfb | 6 | * automatically created by pmImgCreator.py |
va009039 | 0:65f1469d6bfb | 7 | * on Sat Mar 02 20:27:03 2013 |
va009039 | 0:65f1469d6bfb | 8 | * |
va009039 | 0:65f1469d6bfb | 9 | * DO NOT EDIT THIS FILE. |
va009039 | 0:65f1469d6bfb | 10 | * ANY CHANGES WILL BE LOST. |
va009039 | 0:65f1469d6bfb | 11 | * |
va009039 | 0:65f1469d6bfb | 12 | * @file pmstdlib_nat.cpp |
va009039 | 0:65f1469d6bfb | 13 | */ |
va009039 | 0:65f1469d6bfb | 14 | |
va009039 | 0:65f1469d6bfb | 15 | #define __IN_LIBNATIVE_C__ |
va009039 | 0:65f1469d6bfb | 16 | #include "pm.h" |
va009039 | 0:65f1469d6bfb | 17 | |
va009039 | 0:65f1469d6bfb | 18 | /* From: ../../lib/string.py */ |
va009039 | 0:65f1469d6bfb | 19 | #include <stdlib.h> |
va009039 | 0:65f1469d6bfb | 20 | #include <string.h> |
va009039 | 0:65f1469d6bfb | 21 | |
va009039 | 0:65f1469d6bfb | 22 | PmReturn_t |
va009039 | 0:65f1469d6bfb | 23 | nat_00___bi_chr(pPmFrame_t *ppframe) |
va009039 | 0:65f1469d6bfb | 24 | { |
va009039 | 0:65f1469d6bfb | 25 | |
va009039 | 0:65f1469d6bfb | 26 | pPmObj_t ps; |
va009039 | 0:65f1469d6bfb | 27 | pPmObj_t pn; |
va009039 | 0:65f1469d6bfb | 28 | int32_t n; |
va009039 | 0:65f1469d6bfb | 29 | PmReturn_t retval; |
va009039 | 0:65f1469d6bfb | 30 | |
va009039 | 0:65f1469d6bfb | 31 | /* If wrong number of args, raise TypeError */ |
va009039 | 0:65f1469d6bfb | 32 | if (NATIVE_GET_NUM_ARGS() != 1) |
va009039 | 0:65f1469d6bfb | 33 | { |
va009039 | 0:65f1469d6bfb | 34 | PM_RAISE(retval, PM_RET_EX_TYPE); |
va009039 | 0:65f1469d6bfb | 35 | return retval; |
va009039 | 0:65f1469d6bfb | 36 | } |
va009039 | 0:65f1469d6bfb | 37 | |
va009039 | 0:65f1469d6bfb | 38 | /* Raise TypeError if arg is not an int */ |
va009039 | 0:65f1469d6bfb | 39 | pn = NATIVE_GET_LOCAL(0); |
va009039 | 0:65f1469d6bfb | 40 | if (OBJ_GET_TYPE(pn) != OBJ_TYPE_INT) |
va009039 | 0:65f1469d6bfb | 41 | { |
va009039 | 0:65f1469d6bfb | 42 | PM_RAISE(retval, PM_RET_EX_TYPE); |
va009039 | 0:65f1469d6bfb | 43 | return retval; |
va009039 | 0:65f1469d6bfb | 44 | } |
va009039 | 0:65f1469d6bfb | 45 | |
va009039 | 0:65f1469d6bfb | 46 | /* Raise ValueError if arg is not int within range(256) */ |
va009039 | 0:65f1469d6bfb | 47 | n = ((pPmInt_t)pn)->val; |
va009039 | 0:65f1469d6bfb | 48 | if ((n < 0) || (n > 255)) |
va009039 | 0:65f1469d6bfb | 49 | { |
va009039 | 0:65f1469d6bfb | 50 | PM_RAISE(retval, PM_RET_EX_VAL); |
va009039 | 0:65f1469d6bfb | 51 | return retval; |
va009039 | 0:65f1469d6bfb | 52 | } |
va009039 | 0:65f1469d6bfb | 53 | |
va009039 | 0:65f1469d6bfb | 54 | /* Create char string from integer value */ |
va009039 | 0:65f1469d6bfb | 55 | retval = string_newFromChar((uint8_t)n, &ps); |
va009039 | 0:65f1469d6bfb | 56 | NATIVE_SET_TOS(ps); |
va009039 | 0:65f1469d6bfb | 57 | return retval; |
va009039 | 0:65f1469d6bfb | 58 | |
va009039 | 0:65f1469d6bfb | 59 | } |
va009039 | 0:65f1469d6bfb | 60 | |
va009039 | 0:65f1469d6bfb | 61 | PmReturn_t |
va009039 | 0:65f1469d6bfb | 62 | nat_01___bi_dir(pPmFrame_t *ppframe) |
va009039 | 0:65f1469d6bfb | 63 | { |
va009039 | 0:65f1469d6bfb | 64 | |
va009039 | 0:65f1469d6bfb | 65 | PmReturn_t retval = PM_RET_OK; |
va009039 | 0:65f1469d6bfb | 66 | pPmObj_t po; |
va009039 | 0:65f1469d6bfb | 67 | pPmObj_t pk; |
va009039 | 0:65f1469d6bfb | 68 | pPmObj_t pl; |
va009039 | 0:65f1469d6bfb | 69 | pSeglist_t psl; |
va009039 | 0:65f1469d6bfb | 70 | int16_t i; |
va009039 | 0:65f1469d6bfb | 71 | uint8_t objid; |
va009039 | 0:65f1469d6bfb | 72 | |
va009039 | 0:65f1469d6bfb | 73 | /* Use globals if no arg given */ |
va009039 | 0:65f1469d6bfb | 74 | if (NATIVE_GET_NUM_ARGS() == 0) |
va009039 | 0:65f1469d6bfb | 75 | { |
va009039 | 0:65f1469d6bfb | 76 | /* Get the globals dict */ |
va009039 | 0:65f1469d6bfb | 77 | po = (pPmObj_t)NATIVE_GET_PFRAME()->fo_globals; |
va009039 | 0:65f1469d6bfb | 78 | } |
va009039 | 0:65f1469d6bfb | 79 | |
va009039 | 0:65f1469d6bfb | 80 | /* Otherwise use the given arg */ |
va009039 | 0:65f1469d6bfb | 81 | else if (NATIVE_GET_NUM_ARGS() == 1) |
va009039 | 0:65f1469d6bfb | 82 | { |
va009039 | 0:65f1469d6bfb | 83 | po = NATIVE_GET_LOCAL(0); |
va009039 | 0:65f1469d6bfb | 84 | |
va009039 | 0:65f1469d6bfb | 85 | /* If object is a function or module, use its attrs dict */ |
va009039 | 0:65f1469d6bfb | 86 | if ((OBJ_GET_TYPE(po) == OBJ_TYPE_FXN) |
va009039 | 0:65f1469d6bfb | 87 | || (OBJ_GET_TYPE(po) == OBJ_TYPE_MOD)) |
va009039 | 0:65f1469d6bfb | 88 | { |
va009039 | 0:65f1469d6bfb | 89 | po = (pPmObj_t)((pPmFunc_t)po)->f_attrs; |
va009039 | 0:65f1469d6bfb | 90 | } |
va009039 | 0:65f1469d6bfb | 91 | |
va009039 | 0:65f1469d6bfb | 92 | #ifdef HAVE_CLASSES |
va009039 | 0:65f1469d6bfb | 93 | else if (OBJ_GET_TYPE(po) == OBJ_TYPE_CLO) |
va009039 | 0:65f1469d6bfb | 94 | { |
va009039 | 0:65f1469d6bfb | 95 | po = (pPmObj_t)((pPmClass_t)po)->cl_attrs; |
va009039 | 0:65f1469d6bfb | 96 | } |
va009039 | 0:65f1469d6bfb | 97 | else if (OBJ_GET_TYPE(po) == OBJ_TYPE_CLI) |
va009039 | 0:65f1469d6bfb | 98 | { |
va009039 | 0:65f1469d6bfb | 99 | po = (pPmObj_t)((pPmInstance_t)po)->cli_attrs; |
va009039 | 0:65f1469d6bfb | 100 | } |
va009039 | 0:65f1469d6bfb | 101 | else if (OBJ_GET_TYPE(po) == OBJ_TYPE_MTH) |
va009039 | 0:65f1469d6bfb | 102 | { |
va009039 | 0:65f1469d6bfb | 103 | po = (pPmObj_t)((pPmMethod_t)po)->m_attrs; |
va009039 | 0:65f1469d6bfb | 104 | } |
va009039 | 0:65f1469d6bfb | 105 | #endif /* HAVE_CLASSES */ |
va009039 | 0:65f1469d6bfb | 106 | |
va009039 | 0:65f1469d6bfb | 107 | else |
va009039 | 0:65f1469d6bfb | 108 | { |
va009039 | 0:65f1469d6bfb | 109 | po = C_NULL; |
va009039 | 0:65f1469d6bfb | 110 | } |
va009039 | 0:65f1469d6bfb | 111 | } |
va009039 | 0:65f1469d6bfb | 112 | |
va009039 | 0:65f1469d6bfb | 113 | /* Raise TypeError if wrong number of args */ |
va009039 | 0:65f1469d6bfb | 114 | else |
va009039 | 0:65f1469d6bfb | 115 | { |
va009039 | 0:65f1469d6bfb | 116 | PM_RAISE(retval, PM_RET_EX_TYPE); |
va009039 | 0:65f1469d6bfb | 117 | return retval; |
va009039 | 0:65f1469d6bfb | 118 | } |
va009039 | 0:65f1469d6bfb | 119 | |
va009039 | 0:65f1469d6bfb | 120 | if (po == C_NULL) |
va009039 | 0:65f1469d6bfb | 121 | { |
va009039 | 0:65f1469d6bfb | 122 | pl = PM_NONE; |
va009039 | 0:65f1469d6bfb | 123 | } |
va009039 | 0:65f1469d6bfb | 124 | else |
va009039 | 0:65f1469d6bfb | 125 | { |
va009039 | 0:65f1469d6bfb | 126 | /* Create new list */ |
va009039 | 0:65f1469d6bfb | 127 | retval = list_new(&pl); |
va009039 | 0:65f1469d6bfb | 128 | PM_RETURN_IF_ERROR(retval); |
va009039 | 0:65f1469d6bfb | 129 | |
va009039 | 0:65f1469d6bfb | 130 | /* Copy dict's keys to the list */ |
va009039 | 0:65f1469d6bfb | 131 | psl = ((pPmDict_t)po)->d_keys; |
va009039 | 0:65f1469d6bfb | 132 | for (i = 0; i < ((pPmDict_t)po)->length; i++) |
va009039 | 0:65f1469d6bfb | 133 | { |
va009039 | 0:65f1469d6bfb | 134 | retval = seglist_getItem(psl, i, &pk); |
va009039 | 0:65f1469d6bfb | 135 | PM_RETURN_IF_ERROR(retval); |
va009039 | 0:65f1469d6bfb | 136 | heap_gcPushTempRoot(pl, &objid); |
va009039 | 0:65f1469d6bfb | 137 | retval = list_append(pl, pk); |
va009039 | 0:65f1469d6bfb | 138 | heap_gcPopTempRoot(objid); |
va009039 | 0:65f1469d6bfb | 139 | PM_RETURN_IF_ERROR(retval); |
va009039 | 0:65f1469d6bfb | 140 | } |
va009039 | 0:65f1469d6bfb | 141 | } |
va009039 | 0:65f1469d6bfb | 142 | |
va009039 | 0:65f1469d6bfb | 143 | NATIVE_SET_TOS(pl); |
va009039 | 0:65f1469d6bfb | 144 | return retval; |
va009039 | 0:65f1469d6bfb | 145 | |
va009039 | 0:65f1469d6bfb | 146 | } |
va009039 | 0:65f1469d6bfb | 147 | |
va009039 | 0:65f1469d6bfb | 148 | PmReturn_t |
va009039 | 0:65f1469d6bfb | 149 | nat_02___bi_eval(pPmFrame_t *ppframe) |
va009039 | 0:65f1469d6bfb | 150 | { |
va009039 | 0:65f1469d6bfb | 151 | |
va009039 | 0:65f1469d6bfb | 152 | PmReturn_t retval; |
va009039 | 0:65f1469d6bfb | 153 | pPmObj_t pco; |
va009039 | 0:65f1469d6bfb | 154 | pPmObj_t pfunc; |
va009039 | 0:65f1469d6bfb | 155 | pPmObj_t pnewframe; |
va009039 | 0:65f1469d6bfb | 156 | pPmObj_t pg = C_NULL; |
va009039 | 0:65f1469d6bfb | 157 | pPmObj_t pl = C_NULL; |
va009039 | 0:65f1469d6bfb | 158 | uint8_t objid; |
va009039 | 0:65f1469d6bfb | 159 | |
va009039 | 0:65f1469d6bfb | 160 | /* If wrong number of args, raise TypeError */ |
va009039 | 0:65f1469d6bfb | 161 | if ((NATIVE_GET_NUM_ARGS() == 0) || (NATIVE_GET_NUM_ARGS() > 3)) |
va009039 | 0:65f1469d6bfb | 162 | { |
va009039 | 0:65f1469d6bfb | 163 | PM_RAISE(retval, PM_RET_EX_TYPE); |
va009039 | 0:65f1469d6bfb | 164 | return retval; |
va009039 | 0:65f1469d6bfb | 165 | } |
va009039 | 0:65f1469d6bfb | 166 | |
va009039 | 0:65f1469d6bfb | 167 | /* Raise ValueError if first arg is not a Code Object */ |
va009039 | 0:65f1469d6bfb | 168 | pco = NATIVE_GET_LOCAL(0); |
va009039 | 0:65f1469d6bfb | 169 | if (OBJ_GET_TYPE(pco) != OBJ_TYPE_COB) |
va009039 | 0:65f1469d6bfb | 170 | { |
va009039 | 0:65f1469d6bfb | 171 | PM_RAISE(retval, PM_RET_EX_VAL); |
va009039 | 0:65f1469d6bfb | 172 | return retval; |
va009039 | 0:65f1469d6bfb | 173 | } |
va009039 | 0:65f1469d6bfb | 174 | |
va009039 | 0:65f1469d6bfb | 175 | /* If 2nd arg exists, raise ValueError if it is not a Dict */ |
va009039 | 0:65f1469d6bfb | 176 | if (NATIVE_GET_NUM_ARGS() >= 2) |
va009039 | 0:65f1469d6bfb | 177 | { |
va009039 | 0:65f1469d6bfb | 178 | pg = NATIVE_GET_LOCAL(1); |
va009039 | 0:65f1469d6bfb | 179 | if (OBJ_GET_TYPE(pg) != OBJ_TYPE_DIC) |
va009039 | 0:65f1469d6bfb | 180 | { |
va009039 | 0:65f1469d6bfb | 181 | PM_RAISE(retval, PM_RET_EX_VAL); |
va009039 | 0:65f1469d6bfb | 182 | return retval; |
va009039 | 0:65f1469d6bfb | 183 | } |
va009039 | 0:65f1469d6bfb | 184 | } |
va009039 | 0:65f1469d6bfb | 185 | |
va009039 | 0:65f1469d6bfb | 186 | /* If no args are given, use the caller's globals for the function's */ |
va009039 | 0:65f1469d6bfb | 187 | else |
va009039 | 0:65f1469d6bfb | 188 | { |
va009039 | 0:65f1469d6bfb | 189 | pg = (pPmObj_t)NATIVE_GET_PFRAME()->fo_globals; |
va009039 | 0:65f1469d6bfb | 190 | } |
va009039 | 0:65f1469d6bfb | 191 | |
va009039 | 0:65f1469d6bfb | 192 | /* If 3rd arg exists, raise ValueError if it is not a Dict */ |
va009039 | 0:65f1469d6bfb | 193 | if (NATIVE_GET_NUM_ARGS() >= 3) |
va009039 | 0:65f1469d6bfb | 194 | { |
va009039 | 0:65f1469d6bfb | 195 | pl = NATIVE_GET_LOCAL(2); |
va009039 | 0:65f1469d6bfb | 196 | if (OBJ_GET_TYPE(pl) != OBJ_TYPE_DIC) |
va009039 | 0:65f1469d6bfb | 197 | { |
va009039 | 0:65f1469d6bfb | 198 | PM_RAISE(retval, PM_RET_EX_VAL); |
va009039 | 0:65f1469d6bfb | 199 | return retval; |
va009039 | 0:65f1469d6bfb | 200 | } |
va009039 | 0:65f1469d6bfb | 201 | } |
va009039 | 0:65f1469d6bfb | 202 | |
va009039 | 0:65f1469d6bfb | 203 | /* Create func from code object */ |
va009039 | 0:65f1469d6bfb | 204 | retval = func_new(pco, pg, &pfunc); |
va009039 | 0:65f1469d6bfb | 205 | PM_RETURN_IF_ERROR(retval); |
va009039 | 0:65f1469d6bfb | 206 | |
va009039 | 0:65f1469d6bfb | 207 | /* Create frame from module object; globals is set to null */ |
va009039 | 0:65f1469d6bfb | 208 | heap_gcPushTempRoot(pfunc, &objid); |
va009039 | 0:65f1469d6bfb | 209 | retval = frame_new(pfunc, &pnewframe); |
va009039 | 0:65f1469d6bfb | 210 | heap_gcPopTempRoot(objid); |
va009039 | 0:65f1469d6bfb | 211 | PM_RETURN_IF_ERROR(retval); |
va009039 | 0:65f1469d6bfb | 212 | |
va009039 | 0:65f1469d6bfb | 213 | /* TODO: Reclaim pnewframe's attrs dict created in frame_new */ |
va009039 | 0:65f1469d6bfb | 214 | /* |
va009039 | 0:65f1469d6bfb | 215 | * By default use calling frame's attrs as local namespace. |
va009039 | 0:65f1469d6bfb | 216 | * This works for ipm because the interactive mode |
va009039 | 0:65f1469d6bfb | 217 | * needs a locals namespace that persists across calls to eval() |
va009039 | 0:65f1469d6bfb | 218 | */ |
va009039 | 0:65f1469d6bfb | 219 | ((pPmFrame_t)pnewframe)->fo_attrs = NATIVE_GET_PFRAME()->fo_attrs; |
va009039 | 0:65f1469d6bfb | 220 | |
va009039 | 0:65f1469d6bfb | 221 | /* If 2nd arg exists, use it as the global namespace for the new func */ |
va009039 | 0:65f1469d6bfb | 222 | if (NATIVE_GET_NUM_ARGS() >= 2) |
va009039 | 0:65f1469d6bfb | 223 | { |
va009039 | 0:65f1469d6bfb | 224 | ((pPmFrame_t)pnewframe)->fo_globals = (pPmDict_t)pg; |
va009039 | 0:65f1469d6bfb | 225 | |
va009039 | 0:65f1469d6bfb | 226 | /* If only globals is given, locals defaults to it */ |
va009039 | 0:65f1469d6bfb | 227 | ((pPmFrame_t)pnewframe)->fo_attrs = (pPmDict_t)pg; |
va009039 | 0:65f1469d6bfb | 228 | } |
va009039 | 0:65f1469d6bfb | 229 | |
va009039 | 0:65f1469d6bfb | 230 | /* If 3rd arg exists, use it as the local namespace for the new func */ |
va009039 | 0:65f1469d6bfb | 231 | if (NATIVE_GET_NUM_ARGS() >= 3) |
va009039 | 0:65f1469d6bfb | 232 | { |
va009039 | 0:65f1469d6bfb | 233 | ((pPmFrame_t)pnewframe)->fo_attrs = (pPmDict_t)pl; |
va009039 | 0:65f1469d6bfb | 234 | } |
va009039 | 0:65f1469d6bfb | 235 | |
va009039 | 0:65f1469d6bfb | 236 | /* |
va009039 | 0:65f1469d6bfb | 237 | * Set the fo_back frame so flow returns to eval()'s caller when completed. |
va009039 | 0:65f1469d6bfb | 238 | * Set the frame pointer so the new frame is interpreted immediately |
va009039 | 0:65f1469d6bfb | 239 | * after this function returns. |
va009039 | 0:65f1469d6bfb | 240 | */ |
va009039 | 0:65f1469d6bfb | 241 | ((pPmFrame_t)pnewframe)->fo_back = NATIVE_GET_PFRAME(); |
va009039 | 0:65f1469d6bfb | 242 | NATIVE_GET_PFRAME() = (pPmFrame_t)pnewframe; |
va009039 | 0:65f1469d6bfb | 243 | retval = PM_RET_FRAME_SWITCH; |
va009039 | 0:65f1469d6bfb | 244 | |
va009039 | 0:65f1469d6bfb | 245 | return retval; |
va009039 | 0:65f1469d6bfb | 246 | |
va009039 | 0:65f1469d6bfb | 247 | } |
va009039 | 0:65f1469d6bfb | 248 | |
va009039 | 0:65f1469d6bfb | 249 | PmReturn_t |
va009039 | 0:65f1469d6bfb | 250 | nat_03___bi_globals(pPmFrame_t *ppframe) |
va009039 | 0:65f1469d6bfb | 251 | { |
va009039 | 0:65f1469d6bfb | 252 | |
va009039 | 0:65f1469d6bfb | 253 | pPmObj_t pr = C_NULL; |
va009039 | 0:65f1469d6bfb | 254 | PmReturn_t retval; |
va009039 | 0:65f1469d6bfb | 255 | |
va009039 | 0:65f1469d6bfb | 256 | /* If wrong number of args, raise TypeError */ |
va009039 | 0:65f1469d6bfb | 257 | if (NATIVE_GET_NUM_ARGS() != 0) |
va009039 | 0:65f1469d6bfb | 258 | { |
va009039 | 0:65f1469d6bfb | 259 | PM_RAISE(retval, PM_RET_EX_TYPE); |
va009039 | 0:65f1469d6bfb | 260 | return retval; |
va009039 | 0:65f1469d6bfb | 261 | } |
va009039 | 0:65f1469d6bfb | 262 | |
va009039 | 0:65f1469d6bfb | 263 | /* Return calling frame's globals dict on stack*/ |
va009039 | 0:65f1469d6bfb | 264 | pr = (pPmObj_t)NATIVE_GET_PFRAME()->fo_globals; |
va009039 | 0:65f1469d6bfb | 265 | NATIVE_SET_TOS(pr); |
va009039 | 0:65f1469d6bfb | 266 | |
va009039 | 0:65f1469d6bfb | 267 | return PM_RET_OK; |
va009039 | 0:65f1469d6bfb | 268 | |
va009039 | 0:65f1469d6bfb | 269 | } |
va009039 | 0:65f1469d6bfb | 270 | |
va009039 | 0:65f1469d6bfb | 271 | PmReturn_t |
va009039 | 0:65f1469d6bfb | 272 | nat_04___bi_id(pPmFrame_t *ppframe) |
va009039 | 0:65f1469d6bfb | 273 | { |
va009039 | 0:65f1469d6bfb | 274 | |
va009039 | 0:65f1469d6bfb | 275 | PmReturn_t retval; |
va009039 | 0:65f1469d6bfb | 276 | pPmObj_t pr = C_NULL; |
va009039 | 0:65f1469d6bfb | 277 | |
va009039 | 0:65f1469d6bfb | 278 | /* If wrong number of args, raise TypeError */ |
va009039 | 0:65f1469d6bfb | 279 | if (NATIVE_GET_NUM_ARGS() != 1) |
va009039 | 0:65f1469d6bfb | 280 | { |
va009039 | 0:65f1469d6bfb | 281 | PM_RAISE(retval, PM_RET_EX_TYPE); |
va009039 | 0:65f1469d6bfb | 282 | return retval; |
va009039 | 0:65f1469d6bfb | 283 | } |
va009039 | 0:65f1469d6bfb | 284 | |
va009039 | 0:65f1469d6bfb | 285 | /* Return object's address as an int on the stack */ |
va009039 | 0:65f1469d6bfb | 286 | retval = int_new((intptr_t)NATIVE_GET_LOCAL(0), &pr); |
va009039 | 0:65f1469d6bfb | 287 | NATIVE_SET_TOS(pr); |
va009039 | 0:65f1469d6bfb | 288 | |
va009039 | 0:65f1469d6bfb | 289 | return retval; |
va009039 | 0:65f1469d6bfb | 290 | |
va009039 | 0:65f1469d6bfb | 291 | } |
va009039 | 0:65f1469d6bfb | 292 | |
va009039 | 0:65f1469d6bfb | 293 | PmReturn_t |
va009039 | 0:65f1469d6bfb | 294 | nat_05___bi_len(pPmFrame_t *ppframe) |
va009039 | 0:65f1469d6bfb | 295 | { |
va009039 | 0:65f1469d6bfb | 296 | |
va009039 | 0:65f1469d6bfb | 297 | PmReturn_t retval; |
va009039 | 0:65f1469d6bfb | 298 | pPmObj_t ps = C_NULL; |
va009039 | 0:65f1469d6bfb | 299 | pPmObj_t pr = C_NULL; |
va009039 | 0:65f1469d6bfb | 300 | |
va009039 | 0:65f1469d6bfb | 301 | /* If wrong number of args, raise TypeError */ |
va009039 | 0:65f1469d6bfb | 302 | if (NATIVE_GET_NUM_ARGS() != 1) |
va009039 | 0:65f1469d6bfb | 303 | { |
va009039 | 0:65f1469d6bfb | 304 | PM_RAISE(retval, PM_RET_EX_TYPE); |
va009039 | 0:65f1469d6bfb | 305 | return retval; |
va009039 | 0:65f1469d6bfb | 306 | } |
va009039 | 0:65f1469d6bfb | 307 | |
va009039 | 0:65f1469d6bfb | 308 | /* Get first arg */ |
va009039 | 0:65f1469d6bfb | 309 | ps = NATIVE_GET_LOCAL(0); |
va009039 | 0:65f1469d6bfb | 310 | |
va009039 | 0:65f1469d6bfb | 311 | #ifdef HAVE_BYTEARRAY |
va009039 | 0:65f1469d6bfb | 312 | /* If object is an instance, get the thing it contains */ |
va009039 | 0:65f1469d6bfb | 313 | if (OBJ_GET_TYPE(ps) == OBJ_TYPE_CLI) |
va009039 | 0:65f1469d6bfb | 314 | { |
va009039 | 0:65f1469d6bfb | 315 | retval = dict_getItem((pPmObj_t)((pPmInstance_t)ps)->cli_attrs, |
va009039 | 0:65f1469d6bfb | 316 | PM_NONE, |
va009039 | 0:65f1469d6bfb | 317 | &pr); |
va009039 | 0:65f1469d6bfb | 318 | |
va009039 | 0:65f1469d6bfb | 319 | /* If None wasn't in attributes, obj is wrong type for len() */ |
va009039 | 0:65f1469d6bfb | 320 | if (retval == PM_RET_EX_KEY) retval = PM_RET_EX_TYPE; |
va009039 | 0:65f1469d6bfb | 321 | PM_RETURN_IF_ERROR(retval); |
va009039 | 0:65f1469d6bfb | 322 | ps = pr; |
va009039 | 0:65f1469d6bfb | 323 | } |
va009039 | 0:65f1469d6bfb | 324 | #endif /* HAVE_BYTEARRAY */ |
va009039 | 0:65f1469d6bfb | 325 | |
va009039 | 0:65f1469d6bfb | 326 | /* Get the length of the arg based on its type */ |
va009039 | 0:65f1469d6bfb | 327 | switch (OBJ_GET_TYPE(ps)) |
va009039 | 0:65f1469d6bfb | 328 | { |
va009039 | 0:65f1469d6bfb | 329 | case OBJ_TYPE_STR: |
va009039 | 0:65f1469d6bfb | 330 | retval = int_new(((pPmString_t)ps)->length, &pr); |
va009039 | 0:65f1469d6bfb | 331 | break; |
va009039 | 0:65f1469d6bfb | 332 | |
va009039 | 0:65f1469d6bfb | 333 | case OBJ_TYPE_TUP: |
va009039 | 0:65f1469d6bfb | 334 | retval = int_new(((pPmTuple_t)ps)->length, &pr); |
va009039 | 0:65f1469d6bfb | 335 | break; |
va009039 | 0:65f1469d6bfb | 336 | |
va009039 | 0:65f1469d6bfb | 337 | case OBJ_TYPE_LST: |
va009039 | 0:65f1469d6bfb | 338 | retval = int_new(((pPmList_t)ps)->length, &pr); |
va009039 | 0:65f1469d6bfb | 339 | break; |
va009039 | 0:65f1469d6bfb | 340 | |
va009039 | 0:65f1469d6bfb | 341 | case OBJ_TYPE_DIC: |
va009039 | 0:65f1469d6bfb | 342 | retval = int_new(((pPmDict_t)ps)->length, &pr); |
va009039 | 0:65f1469d6bfb | 343 | break; |
va009039 | 0:65f1469d6bfb | 344 | |
va009039 | 0:65f1469d6bfb | 345 | #ifdef HAVE_BYTEARRAY |
va009039 | 0:65f1469d6bfb | 346 | case OBJ_TYPE_BYA: |
va009039 | 0:65f1469d6bfb | 347 | retval = int_new(((pPmBytearray_t)ps)->length, &pr); |
va009039 | 0:65f1469d6bfb | 348 | break; |
va009039 | 0:65f1469d6bfb | 349 | #endif /* HAVE_BYTEARRAY */ |
va009039 | 0:65f1469d6bfb | 350 | |
va009039 | 0:65f1469d6bfb | 351 | default: |
va009039 | 0:65f1469d6bfb | 352 | /* If not a string or sequence type, raise TypeError */ |
va009039 | 0:65f1469d6bfb | 353 | PM_RAISE(retval, PM_RET_EX_TYPE); |
va009039 | 0:65f1469d6bfb | 354 | } |
va009039 | 0:65f1469d6bfb | 355 | |
va009039 | 0:65f1469d6bfb | 356 | NATIVE_SET_TOS(pr); |
va009039 | 0:65f1469d6bfb | 357 | return retval; |
va009039 | 0:65f1469d6bfb | 358 | |
va009039 | 0:65f1469d6bfb | 359 | } |
va009039 | 0:65f1469d6bfb | 360 | |
va009039 | 0:65f1469d6bfb | 361 | PmReturn_t |
va009039 | 0:65f1469d6bfb | 362 | nat_06___bi_locals(pPmFrame_t *ppframe) |
va009039 | 0:65f1469d6bfb | 363 | { |
va009039 | 0:65f1469d6bfb | 364 | |
va009039 | 0:65f1469d6bfb | 365 | pPmObj_t pr = C_NULL; |
va009039 | 0:65f1469d6bfb | 366 | PmReturn_t retval; |
va009039 | 0:65f1469d6bfb | 367 | |
va009039 | 0:65f1469d6bfb | 368 | /* If wrong number of args, raise TypeError */ |
va009039 | 0:65f1469d6bfb | 369 | if (NATIVE_GET_NUM_ARGS() != 0) |
va009039 | 0:65f1469d6bfb | 370 | { |
va009039 | 0:65f1469d6bfb | 371 | PM_RAISE(retval, PM_RET_EX_TYPE); |
va009039 | 0:65f1469d6bfb | 372 | return retval; |
va009039 | 0:65f1469d6bfb | 373 | } |
va009039 | 0:65f1469d6bfb | 374 | |
va009039 | 0:65f1469d6bfb | 375 | /* Return calling frame's local attrs dict on the stack */ |
va009039 | 0:65f1469d6bfb | 376 | pr = (pPmObj_t)NATIVE_GET_PFRAME()->fo_attrs; |
va009039 | 0:65f1469d6bfb | 377 | NATIVE_SET_TOS(pr); |
va009039 | 0:65f1469d6bfb | 378 | |
va009039 | 0:65f1469d6bfb | 379 | return PM_RET_OK; |
va009039 | 0:65f1469d6bfb | 380 | |
va009039 | 0:65f1469d6bfb | 381 | } |
va009039 | 0:65f1469d6bfb | 382 | |
va009039 | 0:65f1469d6bfb | 383 | PmReturn_t |
va009039 | 0:65f1469d6bfb | 384 | nat_07___bi_ord(pPmFrame_t *ppframe) |
va009039 | 0:65f1469d6bfb | 385 | { |
va009039 | 0:65f1469d6bfb | 386 | |
va009039 | 0:65f1469d6bfb | 387 | pPmObj_t ps; |
va009039 | 0:65f1469d6bfb | 388 | pPmObj_t pn; |
va009039 | 0:65f1469d6bfb | 389 | int32_t n; |
va009039 | 0:65f1469d6bfb | 390 | PmReturn_t retval; |
va009039 | 0:65f1469d6bfb | 391 | |
va009039 | 0:65f1469d6bfb | 392 | /* If wrong number of args, raise TypeError */ |
va009039 | 0:65f1469d6bfb | 393 | if (NATIVE_GET_NUM_ARGS() != 1) |
va009039 | 0:65f1469d6bfb | 394 | { |
va009039 | 0:65f1469d6bfb | 395 | PM_RAISE(retval, PM_RET_EX_TYPE); |
va009039 | 0:65f1469d6bfb | 396 | return retval; |
va009039 | 0:65f1469d6bfb | 397 | } |
va009039 | 0:65f1469d6bfb | 398 | |
va009039 | 0:65f1469d6bfb | 399 | ps = NATIVE_GET_LOCAL(0); |
va009039 | 0:65f1469d6bfb | 400 | |
va009039 | 0:65f1469d6bfb | 401 | /* Raise TypeError if arg is not string of length 1 */ |
va009039 | 0:65f1469d6bfb | 402 | if ((OBJ_GET_TYPE(ps) != OBJ_TYPE_STR) |
va009039 | 0:65f1469d6bfb | 403 | || (((pPmString_t)ps)->length != 1)) |
va009039 | 0:65f1469d6bfb | 404 | |
va009039 | 0:65f1469d6bfb | 405 | { |
va009039 | 0:65f1469d6bfb | 406 | PM_RAISE(retval, PM_RET_EX_TYPE); |
va009039 | 0:65f1469d6bfb | 407 | return retval; |
va009039 | 0:65f1469d6bfb | 408 | } |
va009039 | 0:65f1469d6bfb | 409 | |
va009039 | 0:65f1469d6bfb | 410 | /* Get integer value of character */ |
va009039 | 0:65f1469d6bfb | 411 | n = ((pPmString_t)ps)->val[0]; |
va009039 | 0:65f1469d6bfb | 412 | retval = int_new(n, &pn); |
va009039 | 0:65f1469d6bfb | 413 | NATIVE_SET_TOS(pn); |
va009039 | 0:65f1469d6bfb | 414 | return retval; |
va009039 | 0:65f1469d6bfb | 415 | |
va009039 | 0:65f1469d6bfb | 416 | } |
va009039 | 0:65f1469d6bfb | 417 | |
va009039 | 0:65f1469d6bfb | 418 | PmReturn_t |
va009039 | 0:65f1469d6bfb | 419 | nat_08___bi_range(pPmFrame_t *ppframe) |
va009039 | 0:65f1469d6bfb | 420 | { |
va009039 | 0:65f1469d6bfb | 421 | |
va009039 | 0:65f1469d6bfb | 422 | PmReturn_t retval; |
va009039 | 0:65f1469d6bfb | 423 | pPmObj_t pa = C_NULL; |
va009039 | 0:65f1469d6bfb | 424 | pPmObj_t pb = C_NULL; |
va009039 | 0:65f1469d6bfb | 425 | pPmObj_t pc = C_NULL; |
va009039 | 0:65f1469d6bfb | 426 | pPmObj_t pi = C_NULL; |
va009039 | 0:65f1469d6bfb | 427 | pPmObj_t pr = C_NULL; |
va009039 | 0:65f1469d6bfb | 428 | int16_t i = 0; |
va009039 | 0:65f1469d6bfb | 429 | uint8_t objid1, objid2; |
va009039 | 0:65f1469d6bfb | 430 | |
va009039 | 0:65f1469d6bfb | 431 | switch (NATIVE_GET_NUM_ARGS()) |
va009039 | 0:65f1469d6bfb | 432 | { |
va009039 | 0:65f1469d6bfb | 433 | case 1: |
va009039 | 0:65f1469d6bfb | 434 | pa = PM_ZERO; |
va009039 | 0:65f1469d6bfb | 435 | pb = NATIVE_GET_LOCAL(0); |
va009039 | 0:65f1469d6bfb | 436 | pc = PM_ONE; |
va009039 | 0:65f1469d6bfb | 437 | break; |
va009039 | 0:65f1469d6bfb | 438 | |
va009039 | 0:65f1469d6bfb | 439 | case 2: |
va009039 | 0:65f1469d6bfb | 440 | pa = NATIVE_GET_LOCAL(0); |
va009039 | 0:65f1469d6bfb | 441 | pb = NATIVE_GET_LOCAL(1); |
va009039 | 0:65f1469d6bfb | 442 | pc = PM_ONE; |
va009039 | 0:65f1469d6bfb | 443 | break; |
va009039 | 0:65f1469d6bfb | 444 | |
va009039 | 0:65f1469d6bfb | 445 | case 3: |
va009039 | 0:65f1469d6bfb | 446 | pa = NATIVE_GET_LOCAL(0); |
va009039 | 0:65f1469d6bfb | 447 | pb = NATIVE_GET_LOCAL(1); |
va009039 | 0:65f1469d6bfb | 448 | pc = NATIVE_GET_LOCAL(2); |
va009039 | 0:65f1469d6bfb | 449 | |
va009039 | 0:65f1469d6bfb | 450 | /* If 3rd arg is 0, ValueError */ |
va009039 | 0:65f1469d6bfb | 451 | if (((pPmInt_t)pc)->val == 0) |
va009039 | 0:65f1469d6bfb | 452 | { |
va009039 | 0:65f1469d6bfb | 453 | PM_RAISE(retval, PM_RET_EX_VAL); |
va009039 | 0:65f1469d6bfb | 454 | return retval; |
va009039 | 0:65f1469d6bfb | 455 | } |
va009039 | 0:65f1469d6bfb | 456 | break; |
va009039 | 0:65f1469d6bfb | 457 | |
va009039 | 0:65f1469d6bfb | 458 | default: |
va009039 | 0:65f1469d6bfb | 459 | /* If wrong number of args, raise TypeError */ |
va009039 | 0:65f1469d6bfb | 460 | PM_RAISE(retval, PM_RET_EX_TYPE); |
va009039 | 0:65f1469d6bfb | 461 | return retval; |
va009039 | 0:65f1469d6bfb | 462 | } |
va009039 | 0:65f1469d6bfb | 463 | |
va009039 | 0:65f1469d6bfb | 464 | /* Allocate list */ |
va009039 | 0:65f1469d6bfb | 465 | retval = list_new(&pr); |
va009039 | 0:65f1469d6bfb | 466 | PM_RETURN_IF_ERROR(retval); |
va009039 | 0:65f1469d6bfb | 467 | |
va009039 | 0:65f1469d6bfb | 468 | /* Iterate depending on counting direction */ |
va009039 | 0:65f1469d6bfb | 469 | if (((pPmInt_t)pc)->val > 0) |
va009039 | 0:65f1469d6bfb | 470 | { |
va009039 | 0:65f1469d6bfb | 471 | for (i = ((pPmInt_t)pa)->val; |
va009039 | 0:65f1469d6bfb | 472 | i < ((pPmInt_t)pb)->val; |
va009039 | 0:65f1469d6bfb | 473 | i += ((pPmInt_t)pc)->val) |
va009039 | 0:65f1469d6bfb | 474 | { |
va009039 | 0:65f1469d6bfb | 475 | heap_gcPushTempRoot(pr, &objid1); |
va009039 | 0:65f1469d6bfb | 476 | retval = int_new(i, &pi); |
va009039 | 0:65f1469d6bfb | 477 | if (retval != PM_RET_OK) |
va009039 | 0:65f1469d6bfb | 478 | { |
va009039 | 0:65f1469d6bfb | 479 | heap_gcPopTempRoot(objid1); |
va009039 | 0:65f1469d6bfb | 480 | return retval; |
va009039 | 0:65f1469d6bfb | 481 | } |
va009039 | 0:65f1469d6bfb | 482 | |
va009039 | 0:65f1469d6bfb | 483 | heap_gcPushTempRoot(pi, &objid2); |
va009039 | 0:65f1469d6bfb | 484 | retval = list_append(pr, pi); |
va009039 | 0:65f1469d6bfb | 485 | heap_gcPopTempRoot(objid1); |
va009039 | 0:65f1469d6bfb | 486 | PM_RETURN_IF_ERROR(retval); |
va009039 | 0:65f1469d6bfb | 487 | } |
va009039 | 0:65f1469d6bfb | 488 | } |
va009039 | 0:65f1469d6bfb | 489 | else |
va009039 | 0:65f1469d6bfb | 490 | { |
va009039 | 0:65f1469d6bfb | 491 | for (i = ((pPmInt_t)pa)->val; |
va009039 | 0:65f1469d6bfb | 492 | i > ((pPmInt_t)pb)->val; |
va009039 | 0:65f1469d6bfb | 493 | i += ((pPmInt_t)pc)->val) |
va009039 | 0:65f1469d6bfb | 494 | { |
va009039 | 0:65f1469d6bfb | 495 | heap_gcPushTempRoot(pr, &objid1); |
va009039 | 0:65f1469d6bfb | 496 | retval = int_new(i, &pi); |
va009039 | 0:65f1469d6bfb | 497 | if (retval != PM_RET_OK) |
va009039 | 0:65f1469d6bfb | 498 | { |
va009039 | 0:65f1469d6bfb | 499 | heap_gcPopTempRoot(objid1); |
va009039 | 0:65f1469d6bfb | 500 | return retval; |
va009039 | 0:65f1469d6bfb | 501 | } |
va009039 | 0:65f1469d6bfb | 502 | |
va009039 | 0:65f1469d6bfb | 503 | heap_gcPushTempRoot(pi, &objid2); |
va009039 | 0:65f1469d6bfb | 504 | retval = list_append(pr, pi); |
va009039 | 0:65f1469d6bfb | 505 | heap_gcPopTempRoot(objid1); |
va009039 | 0:65f1469d6bfb | 506 | PM_RETURN_IF_ERROR(retval); |
va009039 | 0:65f1469d6bfb | 507 | } |
va009039 | 0:65f1469d6bfb | 508 | } |
va009039 | 0:65f1469d6bfb | 509 | |
va009039 | 0:65f1469d6bfb | 510 | /* Return list */ |
va009039 | 0:65f1469d6bfb | 511 | NATIVE_SET_TOS(pr); |
va009039 | 0:65f1469d6bfb | 512 | return retval; |
va009039 | 0:65f1469d6bfb | 513 | |
va009039 | 0:65f1469d6bfb | 514 | } |
va009039 | 0:65f1469d6bfb | 515 | |
va009039 | 0:65f1469d6bfb | 516 | PmReturn_t |
va009039 | 0:65f1469d6bfb | 517 | nat_09___bi_sum(pPmFrame_t *ppframe) |
va009039 | 0:65f1469d6bfb | 518 | { |
va009039 | 0:65f1469d6bfb | 519 | |
va009039 | 0:65f1469d6bfb | 520 | pPmObj_t ps; |
va009039 | 0:65f1469d6bfb | 521 | pPmObj_t pn; |
va009039 | 0:65f1469d6bfb | 522 | pPmObj_t po; |
va009039 | 0:65f1469d6bfb | 523 | int32_t n; |
va009039 | 0:65f1469d6bfb | 524 | uint16_t len; |
va009039 | 0:65f1469d6bfb | 525 | uint16_t i; |
va009039 | 0:65f1469d6bfb | 526 | PmReturn_t retval; |
va009039 | 0:65f1469d6bfb | 527 | #ifdef HAVE_FLOAT |
va009039 | 0:65f1469d6bfb | 528 | float f; |
va009039 | 0:65f1469d6bfb | 529 | uint8_t usefloat = C_FALSE; |
va009039 | 0:65f1469d6bfb | 530 | #endif /* HAVE_FLOAT */ |
va009039 | 0:65f1469d6bfb | 531 | |
va009039 | 0:65f1469d6bfb | 532 | /* If wrong number of args, raise TypeError */ |
va009039 | 0:65f1469d6bfb | 533 | if (NATIVE_GET_NUM_ARGS() != 1) |
va009039 | 0:65f1469d6bfb | 534 | { |
va009039 | 0:65f1469d6bfb | 535 | PM_RAISE(retval, PM_RET_EX_TYPE); |
va009039 | 0:65f1469d6bfb | 536 | return retval; |
va009039 | 0:65f1469d6bfb | 537 | } |
va009039 | 0:65f1469d6bfb | 538 | |
va009039 | 0:65f1469d6bfb | 539 | ps = NATIVE_GET_LOCAL(0); |
va009039 | 0:65f1469d6bfb | 540 | |
va009039 | 0:65f1469d6bfb | 541 | #ifdef HAVE_BYTEARRAY |
va009039 | 0:65f1469d6bfb | 542 | /* Bytearray is a special case to save RAM converting each byte to an Int */ |
va009039 | 0:65f1469d6bfb | 543 | if (OBJ_GET_TYPE(ps) == OBJ_TYPE_BYA) |
va009039 | 0:65f1469d6bfb | 544 | { |
va009039 | 0:65f1469d6bfb | 545 | n = 0; |
va009039 | 0:65f1469d6bfb | 546 | len = ((pPmBytearray_t)ps)->length; |
va009039 | 0:65f1469d6bfb | 547 | po = (pPmObj_t)((pPmBytearray_t)ps)->val; |
va009039 | 0:65f1469d6bfb | 548 | for (i = 0; i < len; i++) |
va009039 | 0:65f1469d6bfb | 549 | { |
va009039 | 0:65f1469d6bfb | 550 | n += (uint8_t)((pPmBytes_t)po)->val[i]; |
va009039 | 0:65f1469d6bfb | 551 | } |
va009039 | 0:65f1469d6bfb | 552 | retval = int_new(n, &pn); |
va009039 | 0:65f1469d6bfb | 553 | NATIVE_SET_TOS(pn); |
va009039 | 0:65f1469d6bfb | 554 | return retval; |
va009039 | 0:65f1469d6bfb | 555 | } |
va009039 | 0:65f1469d6bfb | 556 | #endif /* HAVE_BYTEARRAY */ |
va009039 | 0:65f1469d6bfb | 557 | |
va009039 | 0:65f1469d6bfb | 558 | /* Raise TypeError if arg is not a sequence */ |
va009039 | 0:65f1469d6bfb | 559 | if ((OBJ_GET_TYPE(ps) != OBJ_TYPE_TUP) |
va009039 | 0:65f1469d6bfb | 560 | && (OBJ_GET_TYPE(ps) != OBJ_TYPE_LST) |
va009039 | 0:65f1469d6bfb | 561 | && (OBJ_GET_TYPE(ps) != OBJ_TYPE_DIC)) |
va009039 | 0:65f1469d6bfb | 562 | { |
va009039 | 0:65f1469d6bfb | 563 | PM_RAISE(retval, PM_RET_EX_TYPE); |
va009039 | 0:65f1469d6bfb | 564 | return retval; |
va009039 | 0:65f1469d6bfb | 565 | } |
va009039 | 0:65f1469d6bfb | 566 | |
va009039 | 0:65f1469d6bfb | 567 | /* Get the length of the sequence */ |
va009039 | 0:65f1469d6bfb | 568 | retval = seq_getLength(ps, &len); |
va009039 | 0:65f1469d6bfb | 569 | PM_RETURN_IF_ERROR(retval); |
va009039 | 0:65f1469d6bfb | 570 | |
va009039 | 0:65f1469d6bfb | 571 | /* Calculate the sum of the sequence */ |
va009039 | 0:65f1469d6bfb | 572 | n = 0; |
va009039 | 0:65f1469d6bfb | 573 | #ifdef HAVE_FLOAT |
va009039 | 0:65f1469d6bfb | 574 | f = 0.0; |
va009039 | 0:65f1469d6bfb | 575 | #endif |
va009039 | 0:65f1469d6bfb | 576 | for (i = 0; i < len; i++) |
va009039 | 0:65f1469d6bfb | 577 | { |
va009039 | 0:65f1469d6bfb | 578 | retval = seq_getSubscript(ps, i, &po); |
va009039 | 0:65f1469d6bfb | 579 | |
va009039 | 0:65f1469d6bfb | 580 | if (OBJ_GET_TYPE(po) == OBJ_TYPE_INT) |
va009039 | 0:65f1469d6bfb | 581 | { |
va009039 | 0:65f1469d6bfb | 582 | /* Add value to sum */ |
va009039 | 0:65f1469d6bfb | 583 | n += ((pPmInt_t)po)->val; |
va009039 | 0:65f1469d6bfb | 584 | #ifdef HAVE_FLOAT |
va009039 | 0:65f1469d6bfb | 585 | f += (float)((pPmInt_t)po)->val; |
va009039 | 0:65f1469d6bfb | 586 | #endif /* HAVE_FLOAT */ |
va009039 | 0:65f1469d6bfb | 587 | } |
va009039 | 0:65f1469d6bfb | 588 | |
va009039 | 0:65f1469d6bfb | 589 | #ifdef HAVE_FLOAT |
va009039 | 0:65f1469d6bfb | 590 | else if (OBJ_GET_TYPE(po) == OBJ_TYPE_FLT) |
va009039 | 0:65f1469d6bfb | 591 | { |
va009039 | 0:65f1469d6bfb | 592 | /* Add value to sum */ |
va009039 | 0:65f1469d6bfb | 593 | f += ((pPmFloat_t)po)->val; |
va009039 | 0:65f1469d6bfb | 594 | usefloat = C_TRUE; |
va009039 | 0:65f1469d6bfb | 595 | } |
va009039 | 0:65f1469d6bfb | 596 | #endif /* HAVE_FLOAT */ |
va009039 | 0:65f1469d6bfb | 597 | |
va009039 | 0:65f1469d6bfb | 598 | /* Raise TypeError if item is not an integer */ |
va009039 | 0:65f1469d6bfb | 599 | else |
va009039 | 0:65f1469d6bfb | 600 | { |
va009039 | 0:65f1469d6bfb | 601 | PM_RAISE(retval, PM_RET_EX_TYPE); |
va009039 | 0:65f1469d6bfb | 602 | return retval; |
va009039 | 0:65f1469d6bfb | 603 | } |
va009039 | 0:65f1469d6bfb | 604 | } |
va009039 | 0:65f1469d6bfb | 605 | |
va009039 | 0:65f1469d6bfb | 606 | #ifdef HAVE_FLOAT |
va009039 | 0:65f1469d6bfb | 607 | if (usefloat) |
va009039 | 0:65f1469d6bfb | 608 | { |
va009039 | 0:65f1469d6bfb | 609 | retval = float_new(f, &pn); |
va009039 | 0:65f1469d6bfb | 610 | } |
va009039 | 0:65f1469d6bfb | 611 | else |
va009039 | 0:65f1469d6bfb | 612 | #endif /* HAVE_FLOAT */ |
va009039 | 0:65f1469d6bfb | 613 | { |
va009039 | 0:65f1469d6bfb | 614 | retval = int_new(n, &pn); |
va009039 | 0:65f1469d6bfb | 615 | } |
va009039 | 0:65f1469d6bfb | 616 | NATIVE_SET_TOS(pn); |
va009039 | 0:65f1469d6bfb | 617 | return retval; |
va009039 | 0:65f1469d6bfb | 618 | |
va009039 | 0:65f1469d6bfb | 619 | } |
va009039 | 0:65f1469d6bfb | 620 | |
va009039 | 0:65f1469d6bfb | 621 | PmReturn_t |
va009039 | 0:65f1469d6bfb | 622 | nat_10___bi_type(pPmFrame_t *ppframe) |
va009039 | 0:65f1469d6bfb | 623 | { |
va009039 | 0:65f1469d6bfb | 624 | |
va009039 | 0:65f1469d6bfb | 625 | PmReturn_t retval; |
va009039 | 0:65f1469d6bfb | 626 | pPmObj_t po = C_NULL; |
va009039 | 0:65f1469d6bfb | 627 | pPmObj_t pr = C_NULL; |
va009039 | 0:65f1469d6bfb | 628 | |
va009039 | 0:65f1469d6bfb | 629 | /* If wrong number of args, raise TypeError */ |
va009039 | 0:65f1469d6bfb | 630 | if (NATIVE_GET_NUM_ARGS() != 1) |
va009039 | 0:65f1469d6bfb | 631 | { |
va009039 | 0:65f1469d6bfb | 632 | PM_RAISE(retval, PM_RET_EX_TYPE); |
va009039 | 0:65f1469d6bfb | 633 | return retval; |
va009039 | 0:65f1469d6bfb | 634 | } |
va009039 | 0:65f1469d6bfb | 635 | |
va009039 | 0:65f1469d6bfb | 636 | /* Get arg */ |
va009039 | 0:65f1469d6bfb | 637 | po = NATIVE_GET_LOCAL(0); |
va009039 | 0:65f1469d6bfb | 638 | |
va009039 | 0:65f1469d6bfb | 639 | /* Create int from type enum */ |
va009039 | 0:65f1469d6bfb | 640 | retval = int_new(OBJ_GET_TYPE(po), &pr); |
va009039 | 0:65f1469d6bfb | 641 | NATIVE_SET_TOS(pr); |
va009039 | 0:65f1469d6bfb | 642 | return retval; |
va009039 | 0:65f1469d6bfb | 643 | |
va009039 | 0:65f1469d6bfb | 644 | } |
va009039 | 0:65f1469d6bfb | 645 | |
va009039 | 0:65f1469d6bfb | 646 | PmReturn_t |
va009039 | 0:65f1469d6bfb | 647 | nat_11___bi_Co(pPmFrame_t *ppframe) |
va009039 | 0:65f1469d6bfb | 648 | { |
va009039 | 0:65f1469d6bfb | 649 | |
va009039 | 0:65f1469d6bfb | 650 | PmReturn_t retval; |
va009039 | 0:65f1469d6bfb | 651 | pPmObj_t pimg; |
va009039 | 0:65f1469d6bfb | 652 | pPmObj_t pco; |
va009039 | 0:65f1469d6bfb | 653 | |
va009039 | 0:65f1469d6bfb | 654 | /* If wrong number of args, raise TypeError */ |
va009039 | 0:65f1469d6bfb | 655 | if (NATIVE_GET_NUM_ARGS() != 1) |
va009039 | 0:65f1469d6bfb | 656 | { |
va009039 | 0:65f1469d6bfb | 657 | PM_RAISE(retval, PM_RET_EX_TYPE); |
va009039 | 0:65f1469d6bfb | 658 | return retval; |
va009039 | 0:65f1469d6bfb | 659 | } |
va009039 | 0:65f1469d6bfb | 660 | |
va009039 | 0:65f1469d6bfb | 661 | /* Raise ValueError if arg is not an Image Obj */ |
va009039 | 0:65f1469d6bfb | 662 | pimg = NATIVE_GET_LOCAL(0); |
va009039 | 0:65f1469d6bfb | 663 | if (OBJ_GET_TYPE(pimg) != OBJ_TYPE_CIO) |
va009039 | 0:65f1469d6bfb | 664 | { |
va009039 | 0:65f1469d6bfb | 665 | PM_RAISE(retval, PM_RET_EX_VAL); |
va009039 | 0:65f1469d6bfb | 666 | return retval; |
va009039 | 0:65f1469d6bfb | 667 | } |
va009039 | 0:65f1469d6bfb | 668 | |
va009039 | 0:65f1469d6bfb | 669 | /* Create a code object from the image */ |
va009039 | 0:65f1469d6bfb | 670 | retval = obj_loadFromImgObj(pimg, &pco); |
va009039 | 0:65f1469d6bfb | 671 | PM_RETURN_IF_ERROR(retval); |
va009039 | 0:65f1469d6bfb | 672 | |
va009039 | 0:65f1469d6bfb | 673 | /* Return the code object */ |
va009039 | 0:65f1469d6bfb | 674 | NATIVE_SET_TOS(pco); |
va009039 | 0:65f1469d6bfb | 675 | return retval; |
va009039 | 0:65f1469d6bfb | 676 | |
va009039 | 0:65f1469d6bfb | 677 | } |
va009039 | 0:65f1469d6bfb | 678 | |
va009039 | 0:65f1469d6bfb | 679 | PmReturn_t |
va009039 | 0:65f1469d6bfb | 680 | nat_12___bi___init__(pPmFrame_t *ppframe) |
va009039 | 0:65f1469d6bfb | 681 | { |
va009039 | 0:65f1469d6bfb | 682 | |
va009039 | 0:65f1469d6bfb | 683 | PmReturn_t retval; |
va009039 | 0:65f1469d6bfb | 684 | pPmObj_t pself; |
va009039 | 0:65f1469d6bfb | 685 | pPmObj_t pfa; |
va009039 | 0:65f1469d6bfb | 686 | pPmObj_t pfunc; |
va009039 | 0:65f1469d6bfb | 687 | pPmObj_t pframe; |
va009039 | 0:65f1469d6bfb | 688 | uint8_t i; |
va009039 | 0:65f1469d6bfb | 689 | uint8_t objid; |
va009039 | 0:65f1469d6bfb | 690 | |
va009039 | 0:65f1469d6bfb | 691 | /* Raise TypeError if wrong number of args */ |
va009039 | 0:65f1469d6bfb | 692 | if (NATIVE_GET_NUM_ARGS() != 2) |
va009039 | 0:65f1469d6bfb | 693 | { |
va009039 | 0:65f1469d6bfb | 694 | PM_RAISE(retval, PM_RET_EX_TYPE); |
va009039 | 0:65f1469d6bfb | 695 | return retval; |
va009039 | 0:65f1469d6bfb | 696 | } |
va009039 | 0:65f1469d6bfb | 697 | |
va009039 | 0:65f1469d6bfb | 698 | /* Raise ValueError if first args are not: instance, tuple */ |
va009039 | 0:65f1469d6bfb | 699 | pself = NATIVE_GET_LOCAL(0); |
va009039 | 0:65f1469d6bfb | 700 | pfa = NATIVE_GET_LOCAL(1); |
va009039 | 0:65f1469d6bfb | 701 | if (OBJ_GET_TYPE(pself) != OBJ_TYPE_CLI) |
va009039 | 0:65f1469d6bfb | 702 | { |
va009039 | 0:65f1469d6bfb | 703 | PM_RAISE(retval, PM_RET_EX_VAL); |
va009039 | 0:65f1469d6bfb | 704 | return retval; |
va009039 | 0:65f1469d6bfb | 705 | } |
va009039 | 0:65f1469d6bfb | 706 | if (OBJ_GET_TYPE(pfa) != OBJ_TYPE_TUP) |
va009039 | 0:65f1469d6bfb | 707 | { |
va009039 | 0:65f1469d6bfb | 708 | PM_RAISE(retval, PM_RET_EX_VAL); |
va009039 | 0:65f1469d6bfb | 709 | return retval; |
va009039 | 0:65f1469d6bfb | 710 | } |
va009039 | 0:65f1469d6bfb | 711 | |
va009039 | 0:65f1469d6bfb | 712 | /* Create a new frame for the function */ |
va009039 | 0:65f1469d6bfb | 713 | pfunc = ((pPmTuple_t)pfa)->val[0]; |
va009039 | 0:65f1469d6bfb | 714 | retval = frame_new(pfunc, &pframe); |
va009039 | 0:65f1469d6bfb | 715 | PM_RETURN_IF_ERROR(retval); |
va009039 | 0:65f1469d6bfb | 716 | |
va009039 | 0:65f1469d6bfb | 717 | /* Copy args into frame's locals */ |
va009039 | 0:65f1469d6bfb | 718 | for (i = 0; i < ((pPmTuple_t)pfa)->length - 1; i++) |
va009039 | 0:65f1469d6bfb | 719 | { |
va009039 | 0:65f1469d6bfb | 720 | /* The pfa tuple is (func, [arg0, ... argN]) */ |
va009039 | 0:65f1469d6bfb | 721 | ((pPmFrame_t)pframe)->fo_locals[i] = ((pPmTuple_t)pfa)->val[i + 1]; |
va009039 | 0:65f1469d6bfb | 722 | } |
va009039 | 0:65f1469d6bfb | 723 | |
va009039 | 0:65f1469d6bfb | 724 | /* Store frame in None attr of instance */ |
va009039 | 0:65f1469d6bfb | 725 | heap_gcPushTempRoot(pframe, &objid); |
va009039 | 0:65f1469d6bfb | 726 | retval = dict_setItem((pPmObj_t)((pPmInstance_t)pself)->cli_attrs, |
va009039 | 0:65f1469d6bfb | 727 | PM_NONE, pframe); |
va009039 | 0:65f1469d6bfb | 728 | heap_gcPopTempRoot(objid); |
va009039 | 0:65f1469d6bfb | 729 | |
va009039 | 0:65f1469d6bfb | 730 | NATIVE_SET_TOS(PM_NONE); |
va009039 | 0:65f1469d6bfb | 731 | return retval; |
va009039 | 0:65f1469d6bfb | 732 | |
va009039 | 0:65f1469d6bfb | 733 | } |
va009039 | 0:65f1469d6bfb | 734 | |
va009039 | 0:65f1469d6bfb | 735 | PmReturn_t |
va009039 | 0:65f1469d6bfb | 736 | nat_13___bi_send(pPmFrame_t *ppframe) |
va009039 | 0:65f1469d6bfb | 737 | { |
va009039 | 0:65f1469d6bfb | 738 | |
va009039 | 0:65f1469d6bfb | 739 | PmReturn_t retval; |
va009039 | 0:65f1469d6bfb | 740 | pPmObj_t pself; |
va009039 | 0:65f1469d6bfb | 741 | pPmObj_t parg; |
va009039 | 0:65f1469d6bfb | 742 | pPmObj_t pgenframe; |
va009039 | 0:65f1469d6bfb | 743 | |
va009039 | 0:65f1469d6bfb | 744 | /* Raise TypeError if wrong number of args */ |
va009039 | 0:65f1469d6bfb | 745 | if (NATIVE_GET_NUM_ARGS() != 2) |
va009039 | 0:65f1469d6bfb | 746 | { |
va009039 | 0:65f1469d6bfb | 747 | PM_RAISE(retval, PM_RET_EX_TYPE); |
va009039 | 0:65f1469d6bfb | 748 | return retval; |
va009039 | 0:65f1469d6bfb | 749 | } |
va009039 | 0:65f1469d6bfb | 750 | |
va009039 | 0:65f1469d6bfb | 751 | /* Raise ValueError if first arg is not an instance */ |
va009039 | 0:65f1469d6bfb | 752 | pself = NATIVE_GET_LOCAL(0); |
va009039 | 0:65f1469d6bfb | 753 | parg = NATIVE_GET_LOCAL(1); |
va009039 | 0:65f1469d6bfb | 754 | if (OBJ_GET_TYPE(pself) != OBJ_TYPE_CLI) |
va009039 | 0:65f1469d6bfb | 755 | { |
va009039 | 0:65f1469d6bfb | 756 | PM_RAISE(retval, PM_RET_EX_VAL); |
va009039 | 0:65f1469d6bfb | 757 | return retval; |
va009039 | 0:65f1469d6bfb | 758 | } |
va009039 | 0:65f1469d6bfb | 759 | |
va009039 | 0:65f1469d6bfb | 760 | /* Get the generator's frame */ |
va009039 | 0:65f1469d6bfb | 761 | retval = dict_getItem((pPmObj_t)((pPmInstance_t)pself)->cli_attrs, |
va009039 | 0:65f1469d6bfb | 762 | PM_NONE, &pgenframe); |
va009039 | 0:65f1469d6bfb | 763 | PM_RETURN_IF_ERROR(retval); |
va009039 | 0:65f1469d6bfb | 764 | |
va009039 | 0:65f1469d6bfb | 765 | /* Push argument onto generator's frame's stack */ |
va009039 | 0:65f1469d6bfb | 766 | *(((pPmFrame_t)pgenframe)->fo_sp) = parg; |
va009039 | 0:65f1469d6bfb | 767 | ((pPmFrame_t)pgenframe)->fo_sp++; |
va009039 | 0:65f1469d6bfb | 768 | |
va009039 | 0:65f1469d6bfb | 769 | /* Set generator's frame's fo_back so yielded value goes to caller */ |
va009039 | 0:65f1469d6bfb | 770 | ((pPmFrame_t)pgenframe)->fo_back = NATIVE_GET_PFRAME(); |
va009039 | 0:65f1469d6bfb | 771 | |
va009039 | 0:65f1469d6bfb | 772 | /* Set active frame to run generator */ |
va009039 | 0:65f1469d6bfb | 773 | NATIVE_GET_PFRAME() = (pPmFrame_t)pgenframe; |
va009039 | 0:65f1469d6bfb | 774 | |
va009039 | 0:65f1469d6bfb | 775 | return PM_RET_FRAME_SWITCH; |
va009039 | 0:65f1469d6bfb | 776 | |
va009039 | 0:65f1469d6bfb | 777 | } |
va009039 | 0:65f1469d6bfb | 778 | |
va009039 | 0:65f1469d6bfb | 779 | PmReturn_t |
va009039 | 0:65f1469d6bfb | 780 | nat_14___bi_ismain(pPmFrame_t *ppframe) |
va009039 | 0:65f1469d6bfb | 781 | { |
va009039 | 0:65f1469d6bfb | 782 | |
va009039 | 0:65f1469d6bfb | 783 | |
va009039 | 0:65f1469d6bfb | 784 | NATIVE_SET_TOS((NATIVE_GET_PFRAME()->fo_isImport) ? PM_FALSE : PM_TRUE); |
va009039 | 0:65f1469d6bfb | 785 | |
va009039 | 0:65f1469d6bfb | 786 | return PM_RET_OK; |
va009039 | 0:65f1469d6bfb | 787 | |
va009039 | 0:65f1469d6bfb | 788 | } |
va009039 | 0:65f1469d6bfb | 789 | |
va009039 | 0:65f1469d6bfb | 790 | PmReturn_t |
va009039 | 0:65f1469d6bfb | 791 | nat_15_dict_clear(pPmFrame_t *ppframe) |
va009039 | 0:65f1469d6bfb | 792 | { |
va009039 | 0:65f1469d6bfb | 793 | |
va009039 | 0:65f1469d6bfb | 794 | pPmObj_t pd; |
va009039 | 0:65f1469d6bfb | 795 | PmReturn_t retval = PM_RET_OK; |
va009039 | 0:65f1469d6bfb | 796 | |
va009039 | 0:65f1469d6bfb | 797 | /* Raise TypeError if it's not a dict or wrong number of args, */ |
va009039 | 0:65f1469d6bfb | 798 | pd = NATIVE_GET_LOCAL(0); |
va009039 | 0:65f1469d6bfb | 799 | if ((OBJ_GET_TYPE(pd) != OBJ_TYPE_DIC) || (NATIVE_GET_NUM_ARGS() != 1)) |
va009039 | 0:65f1469d6bfb | 800 | { |
va009039 | 0:65f1469d6bfb | 801 | PM_RAISE(retval, PM_RET_EX_TYPE); |
va009039 | 0:65f1469d6bfb | 802 | return retval; |
va009039 | 0:65f1469d6bfb | 803 | } |
va009039 | 0:65f1469d6bfb | 804 | |
va009039 | 0:65f1469d6bfb | 805 | /* Clear the contents of the dict */ |
va009039 | 0:65f1469d6bfb | 806 | retval = dict_clear(pd); |
va009039 | 0:65f1469d6bfb | 807 | PM_RETURN_IF_ERROR(retval); |
va009039 | 0:65f1469d6bfb | 808 | |
va009039 | 0:65f1469d6bfb | 809 | NATIVE_SET_TOS(PM_NONE); |
va009039 | 0:65f1469d6bfb | 810 | |
va009039 | 0:65f1469d6bfb | 811 | return retval; |
va009039 | 0:65f1469d6bfb | 812 | |
va009039 | 0:65f1469d6bfb | 813 | } |
va009039 | 0:65f1469d6bfb | 814 | |
va009039 | 0:65f1469d6bfb | 815 | PmReturn_t |
va009039 | 0:65f1469d6bfb | 816 | nat_16_dict_keys(pPmFrame_t *ppframe) |
va009039 | 0:65f1469d6bfb | 817 | { |
va009039 | 0:65f1469d6bfb | 818 | |
va009039 | 0:65f1469d6bfb | 819 | pPmObj_t pd; |
va009039 | 0:65f1469d6bfb | 820 | pPmObj_t pl; |
va009039 | 0:65f1469d6bfb | 821 | pPmObj_t pk; |
va009039 | 0:65f1469d6bfb | 822 | pSeglist_t psl; |
va009039 | 0:65f1469d6bfb | 823 | uint16_t i; |
va009039 | 0:65f1469d6bfb | 824 | PmReturn_t retval = PM_RET_OK; |
va009039 | 0:65f1469d6bfb | 825 | uint8_t objid; |
va009039 | 0:65f1469d6bfb | 826 | |
va009039 | 0:65f1469d6bfb | 827 | /* Raise TypeError if it's not a dict or wrong number of args, */ |
va009039 | 0:65f1469d6bfb | 828 | pd = NATIVE_GET_LOCAL(0); |
va009039 | 0:65f1469d6bfb | 829 | if ((OBJ_GET_TYPE(pd) != OBJ_TYPE_DIC) || (NATIVE_GET_NUM_ARGS() != 1)) |
va009039 | 0:65f1469d6bfb | 830 | { |
va009039 | 0:65f1469d6bfb | 831 | PM_RAISE(retval, PM_RET_EX_TYPE); |
va009039 | 0:65f1469d6bfb | 832 | return retval; |
va009039 | 0:65f1469d6bfb | 833 | } |
va009039 | 0:65f1469d6bfb | 834 | |
va009039 | 0:65f1469d6bfb | 835 | /* Create empty list */ |
va009039 | 0:65f1469d6bfb | 836 | retval = list_new(&pl); |
va009039 | 0:65f1469d6bfb | 837 | PM_RETURN_IF_ERROR(retval); |
va009039 | 0:65f1469d6bfb | 838 | |
va009039 | 0:65f1469d6bfb | 839 | /* Iterate through the keys seglist */ |
va009039 | 0:65f1469d6bfb | 840 | psl = ((pPmDict_t)pd)->d_keys; |
va009039 | 0:65f1469d6bfb | 841 | for (i = 0; i < ((pPmDict_t)pd)->length; i++) |
va009039 | 0:65f1469d6bfb | 842 | { |
va009039 | 0:65f1469d6bfb | 843 | /* Get the key and append it to the list */ |
va009039 | 0:65f1469d6bfb | 844 | retval = seglist_getItem(psl, i, &pk); |
va009039 | 0:65f1469d6bfb | 845 | PM_RETURN_IF_ERROR(retval); |
va009039 | 0:65f1469d6bfb | 846 | heap_gcPushTempRoot(pl, &objid); |
va009039 | 0:65f1469d6bfb | 847 | retval = list_append(pl, pk); |
va009039 | 0:65f1469d6bfb | 848 | heap_gcPopTempRoot(objid); |
va009039 | 0:65f1469d6bfb | 849 | PM_RETURN_IF_ERROR(retval); |
va009039 | 0:65f1469d6bfb | 850 | } |
va009039 | 0:65f1469d6bfb | 851 | |
va009039 | 0:65f1469d6bfb | 852 | /* Return the list of keys to the caller */ |
va009039 | 0:65f1469d6bfb | 853 | NATIVE_SET_TOS(pl); |
va009039 | 0:65f1469d6bfb | 854 | |
va009039 | 0:65f1469d6bfb | 855 | return retval; |
va009039 | 0:65f1469d6bfb | 856 | |
va009039 | 0:65f1469d6bfb | 857 | } |
va009039 | 0:65f1469d6bfb | 858 | |
va009039 | 0:65f1469d6bfb | 859 | PmReturn_t |
va009039 | 0:65f1469d6bfb | 860 | nat_17_dict_values(pPmFrame_t *ppframe) |
va009039 | 0:65f1469d6bfb | 861 | { |
va009039 | 0:65f1469d6bfb | 862 | |
va009039 | 0:65f1469d6bfb | 863 | pPmObj_t pd; |
va009039 | 0:65f1469d6bfb | 864 | pPmObj_t pl; |
va009039 | 0:65f1469d6bfb | 865 | pPmObj_t pv; |
va009039 | 0:65f1469d6bfb | 866 | pSeglist_t psl; |
va009039 | 0:65f1469d6bfb | 867 | uint16_t i; |
va009039 | 0:65f1469d6bfb | 868 | PmReturn_t retval = PM_RET_OK; |
va009039 | 0:65f1469d6bfb | 869 | uint8_t objid; |
va009039 | 0:65f1469d6bfb | 870 | |
va009039 | 0:65f1469d6bfb | 871 | /* Raise TypeError if it's not a dict or wrong number of args, */ |
va009039 | 0:65f1469d6bfb | 872 | pd = NATIVE_GET_LOCAL(0); |
va009039 | 0:65f1469d6bfb | 873 | if ((OBJ_GET_TYPE(pd) != OBJ_TYPE_DIC) || (NATIVE_GET_NUM_ARGS() != 1)) |
va009039 | 0:65f1469d6bfb | 874 | { |
va009039 | 0:65f1469d6bfb | 875 | PM_RAISE(retval, PM_RET_EX_TYPE); |
va009039 | 0:65f1469d6bfb | 876 | return retval; |
va009039 | 0:65f1469d6bfb | 877 | } |
va009039 | 0:65f1469d6bfb | 878 | |
va009039 | 0:65f1469d6bfb | 879 | /* Create empty list */ |
va009039 | 0:65f1469d6bfb | 880 | retval = list_new(&pl); |
va009039 | 0:65f1469d6bfb | 881 | PM_RETURN_IF_ERROR(retval); |
va009039 | 0:65f1469d6bfb | 882 | |
va009039 | 0:65f1469d6bfb | 883 | /* Iterate through the values seglist */ |
va009039 | 0:65f1469d6bfb | 884 | psl = ((pPmDict_t)pd)->d_vals; |
va009039 | 0:65f1469d6bfb | 885 | for (i = 0; i < ((pPmDict_t)pd)->length; i++) |
va009039 | 0:65f1469d6bfb | 886 | { |
va009039 | 0:65f1469d6bfb | 887 | /* Get the value and append it to the list */ |
va009039 | 0:65f1469d6bfb | 888 | retval = seglist_getItem(psl, i, &pv); |
va009039 | 0:65f1469d6bfb | 889 | PM_RETURN_IF_ERROR(retval); |
va009039 | 0:65f1469d6bfb | 890 | heap_gcPushTempRoot(pl, &objid); |
va009039 | 0:65f1469d6bfb | 891 | retval = list_append(pl, pv); |
va009039 | 0:65f1469d6bfb | 892 | heap_gcPopTempRoot(objid); |
va009039 | 0:65f1469d6bfb | 893 | PM_RETURN_IF_ERROR(retval); |
va009039 | 0:65f1469d6bfb | 894 | } |
va009039 | 0:65f1469d6bfb | 895 | |
va009039 | 0:65f1469d6bfb | 896 | /* Return the list of values to the caller */ |
va009039 | 0:65f1469d6bfb | 897 | NATIVE_SET_TOS(pl); |
va009039 | 0:65f1469d6bfb | 898 | |
va009039 | 0:65f1469d6bfb | 899 | return retval; |
va009039 | 0:65f1469d6bfb | 900 | |
va009039 | 0:65f1469d6bfb | 901 | } |
va009039 | 0:65f1469d6bfb | 902 | |
va009039 | 0:65f1469d6bfb | 903 | PmReturn_t |
va009039 | 0:65f1469d6bfb | 904 | nat_18_dict_update(pPmFrame_t *ppframe) |
va009039 | 0:65f1469d6bfb | 905 | { |
va009039 | 0:65f1469d6bfb | 906 | |
va009039 | 0:65f1469d6bfb | 907 | pPmObj_t pd1; |
va009039 | 0:65f1469d6bfb | 908 | pPmObj_t pd2; |
va009039 | 0:65f1469d6bfb | 909 | PmReturn_t retval; |
va009039 | 0:65f1469d6bfb | 910 | |
va009039 | 0:65f1469d6bfb | 911 | /* Raise TypeError if wrong number of args, */ |
va009039 | 0:65f1469d6bfb | 912 | if (NATIVE_GET_NUM_ARGS() != 2) |
va009039 | 0:65f1469d6bfb | 913 | { |
va009039 | 0:65f1469d6bfb | 914 | PM_RAISE(retval, PM_RET_EX_TYPE); |
va009039 | 0:65f1469d6bfb | 915 | return retval; |
va009039 | 0:65f1469d6bfb | 916 | } |
va009039 | 0:65f1469d6bfb | 917 | |
va009039 | 0:65f1469d6bfb | 918 | pd1 = NATIVE_GET_LOCAL(0); |
va009039 | 0:65f1469d6bfb | 919 | pd2 = NATIVE_GET_LOCAL(1); |
va009039 | 0:65f1469d6bfb | 920 | retval = dict_update(pd1, pd2, C_FALSE); |
va009039 | 0:65f1469d6bfb | 921 | |
va009039 | 0:65f1469d6bfb | 922 | NATIVE_SET_TOS(PM_NONE); |
va009039 | 0:65f1469d6bfb | 923 | return retval; |
va009039 | 0:65f1469d6bfb | 924 | |
va009039 | 0:65f1469d6bfb | 925 | } |
va009039 | 0:65f1469d6bfb | 926 | |
va009039 | 0:65f1469d6bfb | 927 | PmReturn_t |
va009039 | 0:65f1469d6bfb | 928 | nat_19_list_append(pPmFrame_t *ppframe) |
va009039 | 0:65f1469d6bfb | 929 | { |
va009039 | 0:65f1469d6bfb | 930 | |
va009039 | 0:65f1469d6bfb | 931 | pPmObj_t pl; |
va009039 | 0:65f1469d6bfb | 932 | PmReturn_t retval = PM_RET_OK; |
va009039 | 0:65f1469d6bfb | 933 | |
va009039 | 0:65f1469d6bfb | 934 | /* Raise TypeError if it's not a list or wrong number of args, */ |
va009039 | 0:65f1469d6bfb | 935 | pl = NATIVE_GET_LOCAL(0); |
va009039 | 0:65f1469d6bfb | 936 | if ((OBJ_GET_TYPE(pl) != OBJ_TYPE_LST) || (NATIVE_GET_NUM_ARGS() != 2)) |
va009039 | 0:65f1469d6bfb | 937 | { |
va009039 | 0:65f1469d6bfb | 938 | PM_RAISE(retval, PM_RET_EX_TYPE); |
va009039 | 0:65f1469d6bfb | 939 | return retval; |
va009039 | 0:65f1469d6bfb | 940 | } |
va009039 | 0:65f1469d6bfb | 941 | |
va009039 | 0:65f1469d6bfb | 942 | /* Append the object to the list */ |
va009039 | 0:65f1469d6bfb | 943 | retval = list_append(pl, NATIVE_GET_LOCAL(1)); |
va009039 | 0:65f1469d6bfb | 944 | |
va009039 | 0:65f1469d6bfb | 945 | NATIVE_SET_TOS(PM_NONE); |
va009039 | 0:65f1469d6bfb | 946 | |
va009039 | 0:65f1469d6bfb | 947 | return retval; |
va009039 | 0:65f1469d6bfb | 948 | |
va009039 | 0:65f1469d6bfb | 949 | } |
va009039 | 0:65f1469d6bfb | 950 | |
va009039 | 0:65f1469d6bfb | 951 | PmReturn_t |
va009039 | 0:65f1469d6bfb | 952 | nat_20_list_index(pPmFrame_t *ppframe) |
va009039 | 0:65f1469d6bfb | 953 | { |
va009039 | 0:65f1469d6bfb | 954 | |
va009039 | 0:65f1469d6bfb | 955 | pPmObj_t pl; |
va009039 | 0:65f1469d6bfb | 956 | pPmObj_t po; |
va009039 | 0:65f1469d6bfb | 957 | pPmObj_t pi; |
va009039 | 0:65f1469d6bfb | 958 | PmReturn_t retval = PM_RET_OK; |
va009039 | 0:65f1469d6bfb | 959 | uint16_t i; |
va009039 | 0:65f1469d6bfb | 960 | |
va009039 | 0:65f1469d6bfb | 961 | /* Raise TypeError if it's not a list or wrong number of args, */ |
va009039 | 0:65f1469d6bfb | 962 | pl = NATIVE_GET_LOCAL(0); |
va009039 | 0:65f1469d6bfb | 963 | if ((OBJ_GET_TYPE(pl) != OBJ_TYPE_LST) || (NATIVE_GET_NUM_ARGS() != 2)) |
va009039 | 0:65f1469d6bfb | 964 | { |
va009039 | 0:65f1469d6bfb | 965 | PM_RAISE(retval, PM_RET_EX_TYPE); |
va009039 | 0:65f1469d6bfb | 966 | return retval; |
va009039 | 0:65f1469d6bfb | 967 | } |
va009039 | 0:65f1469d6bfb | 968 | |
va009039 | 0:65f1469d6bfb | 969 | /* Get the index of the object in the list */ |
va009039 | 0:65f1469d6bfb | 970 | po = NATIVE_GET_LOCAL(1); |
va009039 | 0:65f1469d6bfb | 971 | retval = list_index(pl, po, &i); |
va009039 | 0:65f1469d6bfb | 972 | |
va009039 | 0:65f1469d6bfb | 973 | if (retval == PM_RET_EX_VAL) |
va009039 | 0:65f1469d6bfb | 974 | { |
va009039 | 0:65f1469d6bfb | 975 | PM_RAISE(retval, PM_RET_EX_VAL); |
va009039 | 0:65f1469d6bfb | 976 | return retval; |
va009039 | 0:65f1469d6bfb | 977 | } |
va009039 | 0:65f1469d6bfb | 978 | |
va009039 | 0:65f1469d6bfb | 979 | int_new((int32_t)i, &pi); |
va009039 | 0:65f1469d6bfb | 980 | NATIVE_SET_TOS(pi); |
va009039 | 0:65f1469d6bfb | 981 | |
va009039 | 0:65f1469d6bfb | 982 | return retval; |
va009039 | 0:65f1469d6bfb | 983 | |
va009039 | 0:65f1469d6bfb | 984 | } |
va009039 | 0:65f1469d6bfb | 985 | |
va009039 | 0:65f1469d6bfb | 986 | PmReturn_t |
va009039 | 0:65f1469d6bfb | 987 | nat_21_list_insert(pPmFrame_t *ppframe) |
va009039 | 0:65f1469d6bfb | 988 | { |
va009039 | 0:65f1469d6bfb | 989 | |
va009039 | 0:65f1469d6bfb | 990 | pPmObj_t pl; |
va009039 | 0:65f1469d6bfb | 991 | pPmObj_t pi; |
va009039 | 0:65f1469d6bfb | 992 | pPmObj_t po; |
va009039 | 0:65f1469d6bfb | 993 | PmReturn_t retval = PM_RET_OK; |
va009039 | 0:65f1469d6bfb | 994 | uint16_t i; |
va009039 | 0:65f1469d6bfb | 995 | |
va009039 | 0:65f1469d6bfb | 996 | /* |
va009039 | 0:65f1469d6bfb | 997 | * Raise TypeError if wrong number of args, first arg is not a list, or |
va009039 | 0:65f1469d6bfb | 998 | * second arg is not an int |
va009039 | 0:65f1469d6bfb | 999 | */ |
va009039 | 0:65f1469d6bfb | 1000 | pl = NATIVE_GET_LOCAL(0); |
va009039 | 0:65f1469d6bfb | 1001 | pi = NATIVE_GET_LOCAL(1); |
va009039 | 0:65f1469d6bfb | 1002 | po = NATIVE_GET_LOCAL(2); |
va009039 | 0:65f1469d6bfb | 1003 | if ((NATIVE_GET_NUM_ARGS() != 3) |
va009039 | 0:65f1469d6bfb | 1004 | || (OBJ_GET_TYPE(pl) != OBJ_TYPE_LST) |
va009039 | 0:65f1469d6bfb | 1005 | || (OBJ_GET_TYPE(pi) != OBJ_TYPE_INT) ) |
va009039 | 0:65f1469d6bfb | 1006 | { |
va009039 | 0:65f1469d6bfb | 1007 | PM_RAISE(retval, PM_RET_EX_TYPE); |
va009039 | 0:65f1469d6bfb | 1008 | return retval; |
va009039 | 0:65f1469d6bfb | 1009 | } |
va009039 | 0:65f1469d6bfb | 1010 | |
va009039 | 0:65f1469d6bfb | 1011 | /* Insert the object before the given index */ |
va009039 | 0:65f1469d6bfb | 1012 | i = (uint16_t)((pPmInt_t)pi)->val; |
va009039 | 0:65f1469d6bfb | 1013 | retval = list_insert(pl, i, po); |
va009039 | 0:65f1469d6bfb | 1014 | |
va009039 | 0:65f1469d6bfb | 1015 | if (retval != PM_RET_OK) |
va009039 | 0:65f1469d6bfb | 1016 | { |
va009039 | 0:65f1469d6bfb | 1017 | PM_RAISE(retval, PM_RET_EX_SYS); |
va009039 | 0:65f1469d6bfb | 1018 | } |
va009039 | 0:65f1469d6bfb | 1019 | |
va009039 | 0:65f1469d6bfb | 1020 | NATIVE_SET_TOS(PM_NONE); |
va009039 | 0:65f1469d6bfb | 1021 | |
va009039 | 0:65f1469d6bfb | 1022 | return retval; |
va009039 | 0:65f1469d6bfb | 1023 | |
va009039 | 0:65f1469d6bfb | 1024 | } |
va009039 | 0:65f1469d6bfb | 1025 | |
va009039 | 0:65f1469d6bfb | 1026 | PmReturn_t |
va009039 | 0:65f1469d6bfb | 1027 | nat_22_list_pop(pPmFrame_t *ppframe) |
va009039 | 0:65f1469d6bfb | 1028 | { |
va009039 | 0:65f1469d6bfb | 1029 | |
va009039 | 0:65f1469d6bfb | 1030 | pPmObj_t pl; |
va009039 | 0:65f1469d6bfb | 1031 | pPmObj_t pi; |
va009039 | 0:65f1469d6bfb | 1032 | pPmObj_t po; |
va009039 | 0:65f1469d6bfb | 1033 | PmReturn_t retval = PM_RET_OK; |
va009039 | 0:65f1469d6bfb | 1034 | int16_t i; |
va009039 | 0:65f1469d6bfb | 1035 | |
va009039 | 0:65f1469d6bfb | 1036 | /* |
va009039 | 0:65f1469d6bfb | 1037 | * Raise TypeError if first arg is not a list o second arg is not an int |
va009039 | 0:65f1469d6bfb | 1038 | * or there are the wrong number of arguments |
va009039 | 0:65f1469d6bfb | 1039 | */ |
va009039 | 0:65f1469d6bfb | 1040 | pl = NATIVE_GET_LOCAL(0); |
va009039 | 0:65f1469d6bfb | 1041 | if (OBJ_GET_TYPE(pl) != OBJ_TYPE_LST) |
va009039 | 0:65f1469d6bfb | 1042 | { |
va009039 | 0:65f1469d6bfb | 1043 | PM_RAISE(retval, PM_RET_EX_TYPE); |
va009039 | 0:65f1469d6bfb | 1044 | return retval; |
va009039 | 0:65f1469d6bfb | 1045 | } |
va009039 | 0:65f1469d6bfb | 1046 | |
va009039 | 0:65f1469d6bfb | 1047 | pi = NATIVE_GET_LOCAL(1); |
va009039 | 0:65f1469d6bfb | 1048 | if (NATIVE_GET_NUM_ARGS() == 2) |
va009039 | 0:65f1469d6bfb | 1049 | { |
va009039 | 0:65f1469d6bfb | 1050 | if (OBJ_GET_TYPE(pi) != OBJ_TYPE_INT) |
va009039 | 0:65f1469d6bfb | 1051 | { |
va009039 | 0:65f1469d6bfb | 1052 | PM_RAISE(retval, PM_RET_EX_TYPE); |
va009039 | 0:65f1469d6bfb | 1053 | return retval; |
va009039 | 0:65f1469d6bfb | 1054 | } |
va009039 | 0:65f1469d6bfb | 1055 | i = (uint16_t)((pPmInt_t)pi)->val; |
va009039 | 0:65f1469d6bfb | 1056 | } |
va009039 | 0:65f1469d6bfb | 1057 | else |
va009039 | 0:65f1469d6bfb | 1058 | { |
va009039 | 0:65f1469d6bfb | 1059 | i = -1; |
va009039 | 0:65f1469d6bfb | 1060 | } |
va009039 | 0:65f1469d6bfb | 1061 | if ((NATIVE_GET_NUM_ARGS() < 1) || (NATIVE_GET_NUM_ARGS() > 2)) |
va009039 | 0:65f1469d6bfb | 1062 | { |
va009039 | 0:65f1469d6bfb | 1063 | PM_RAISE(retval, PM_RET_EX_TYPE); |
va009039 | 0:65f1469d6bfb | 1064 | return retval; |
va009039 | 0:65f1469d6bfb | 1065 | } |
va009039 | 0:65f1469d6bfb | 1066 | |
va009039 | 0:65f1469d6bfb | 1067 | /* Get the object at the given index */ |
va009039 | 0:65f1469d6bfb | 1068 | retval = list_getItem(pl, i, &po); |
va009039 | 0:65f1469d6bfb | 1069 | PM_RETURN_IF_ERROR(retval); |
va009039 | 0:65f1469d6bfb | 1070 | |
va009039 | 0:65f1469d6bfb | 1071 | /* Return the object to the caller */ |
va009039 | 0:65f1469d6bfb | 1072 | NATIVE_SET_TOS(po); |
va009039 | 0:65f1469d6bfb | 1073 | |
va009039 | 0:65f1469d6bfb | 1074 | /* Remove the object from the given index */ |
va009039 | 0:65f1469d6bfb | 1075 | retval = list_delItem(pl, i); |
va009039 | 0:65f1469d6bfb | 1076 | PM_RETURN_IF_ERROR(retval); |
va009039 | 0:65f1469d6bfb | 1077 | |
va009039 | 0:65f1469d6bfb | 1078 | return retval; |
va009039 | 0:65f1469d6bfb | 1079 | |
va009039 | 0:65f1469d6bfb | 1080 | } |
va009039 | 0:65f1469d6bfb | 1081 | |
va009039 | 0:65f1469d6bfb | 1082 | PmReturn_t |
va009039 | 0:65f1469d6bfb | 1083 | nat_23_list_remove(pPmFrame_t *ppframe) |
va009039 | 0:65f1469d6bfb | 1084 | { |
va009039 | 0:65f1469d6bfb | 1085 | |
va009039 | 0:65f1469d6bfb | 1086 | pPmObj_t pl; |
va009039 | 0:65f1469d6bfb | 1087 | pPmObj_t pv; |
va009039 | 0:65f1469d6bfb | 1088 | PmReturn_t retval = PM_RET_OK; |
va009039 | 0:65f1469d6bfb | 1089 | |
va009039 | 0:65f1469d6bfb | 1090 | /* Raise TypeError if it's not a list or wrong number of args, */ |
va009039 | 0:65f1469d6bfb | 1091 | pl = NATIVE_GET_LOCAL(0); |
va009039 | 0:65f1469d6bfb | 1092 | if ((OBJ_GET_TYPE(pl) != OBJ_TYPE_LST) || (NATIVE_GET_NUM_ARGS() != 2)) |
va009039 | 0:65f1469d6bfb | 1093 | { |
va009039 | 0:65f1469d6bfb | 1094 | PM_RAISE(retval, PM_RET_EX_TYPE); |
va009039 | 0:65f1469d6bfb | 1095 | return retval; |
va009039 | 0:65f1469d6bfb | 1096 | } |
va009039 | 0:65f1469d6bfb | 1097 | |
va009039 | 0:65f1469d6bfb | 1098 | /* Remove the value from the list */ |
va009039 | 0:65f1469d6bfb | 1099 | pv = NATIVE_GET_LOCAL(1); |
va009039 | 0:65f1469d6bfb | 1100 | retval = list_remove(pl, pv); |
va009039 | 0:65f1469d6bfb | 1101 | if (retval != PM_RET_OK) |
va009039 | 0:65f1469d6bfb | 1102 | { |
va009039 | 0:65f1469d6bfb | 1103 | PM_RAISE(retval, retval); |
va009039 | 0:65f1469d6bfb | 1104 | } |
va009039 | 0:65f1469d6bfb | 1105 | |
va009039 | 0:65f1469d6bfb | 1106 | NATIVE_SET_TOS(PM_NONE); |
va009039 | 0:65f1469d6bfb | 1107 | |
va009039 | 0:65f1469d6bfb | 1108 | return retval; |
va009039 | 0:65f1469d6bfb | 1109 | |
va009039 | 0:65f1469d6bfb | 1110 | } |
va009039 | 0:65f1469d6bfb | 1111 | |
va009039 | 0:65f1469d6bfb | 1112 | PmReturn_t |
va009039 | 0:65f1469d6bfb | 1113 | nat_24_string_atoi(pPmFrame_t *ppframe) |
va009039 | 0:65f1469d6bfb | 1114 | { |
va009039 | 0:65f1469d6bfb | 1115 | |
va009039 | 0:65f1469d6bfb | 1116 | pPmObj_t pa; |
va009039 | 0:65f1469d6bfb | 1117 | pPmObj_t pb; |
va009039 | 0:65f1469d6bfb | 1118 | char const *pc; |
va009039 | 0:65f1469d6bfb | 1119 | char *pend; |
va009039 | 0:65f1469d6bfb | 1120 | long i; |
va009039 | 0:65f1469d6bfb | 1121 | int8_t base; |
va009039 | 0:65f1469d6bfb | 1122 | pPmObj_t pi; |
va009039 | 0:65f1469d6bfb | 1123 | PmReturn_t retval = PM_RET_OK; |
va009039 | 0:65f1469d6bfb | 1124 | |
va009039 | 0:65f1469d6bfb | 1125 | /* Raise TypeError if it's not a string or wrong number of args, */ |
va009039 | 0:65f1469d6bfb | 1126 | pa = NATIVE_GET_LOCAL(0); |
va009039 | 0:65f1469d6bfb | 1127 | if ((OBJ_GET_TYPE(pa) != OBJ_TYPE_STR) || (NATIVE_GET_NUM_ARGS() < 1) |
va009039 | 0:65f1469d6bfb | 1128 | || (NATIVE_GET_NUM_ARGS() > 2)) |
va009039 | 0:65f1469d6bfb | 1129 | { |
va009039 | 0:65f1469d6bfb | 1130 | PM_RAISE(retval, PM_RET_EX_TYPE); |
va009039 | 0:65f1469d6bfb | 1131 | return retval; |
va009039 | 0:65f1469d6bfb | 1132 | } |
va009039 | 0:65f1469d6bfb | 1133 | |
va009039 | 0:65f1469d6bfb | 1134 | /* Get the base, if it exists; otherwise assume 10 */ |
va009039 | 0:65f1469d6bfb | 1135 | base = 10; |
va009039 | 0:65f1469d6bfb | 1136 | if (NATIVE_GET_NUM_ARGS() == 2) |
va009039 | 0:65f1469d6bfb | 1137 | { |
va009039 | 0:65f1469d6bfb | 1138 | pb = NATIVE_GET_LOCAL(1); |
va009039 | 0:65f1469d6bfb | 1139 | |
va009039 | 0:65f1469d6bfb | 1140 | /* Raise a TypeError if 2nd arg is not an int */ |
va009039 | 0:65f1469d6bfb | 1141 | if (OBJ_GET_TYPE(pb) != OBJ_TYPE_INT) |
va009039 | 0:65f1469d6bfb | 1142 | { |
va009039 | 0:65f1469d6bfb | 1143 | PM_RAISE(retval, PM_RET_EX_TYPE); |
va009039 | 0:65f1469d6bfb | 1144 | return retval; |
va009039 | 0:65f1469d6bfb | 1145 | } |
va009039 | 0:65f1469d6bfb | 1146 | |
va009039 | 0:65f1469d6bfb | 1147 | base = ((pPmInt_t)pb)->val; |
va009039 | 0:65f1469d6bfb | 1148 | |
va009039 | 0:65f1469d6bfb | 1149 | /* Raise ValueError if base is out of range */ |
va009039 | 0:65f1469d6bfb | 1150 | if ((base < 0) || (base == 1) || (base > 36)) |
va009039 | 0:65f1469d6bfb | 1151 | { |
va009039 | 0:65f1469d6bfb | 1152 | PM_RAISE(retval, PM_RET_EX_VAL); |
va009039 | 0:65f1469d6bfb | 1153 | return retval; |
va009039 | 0:65f1469d6bfb | 1154 | } |
va009039 | 0:65f1469d6bfb | 1155 | } |
va009039 | 0:65f1469d6bfb | 1156 | |
va009039 | 0:65f1469d6bfb | 1157 | /* Perform conversion */ |
va009039 | 0:65f1469d6bfb | 1158 | pend = C_NULL; |
va009039 | 0:65f1469d6bfb | 1159 | pc = (char const *)&(((pPmString_t)pa)->val); |
va009039 | 0:65f1469d6bfb | 1160 | i = strtol(pc, &pend, base); |
va009039 | 0:65f1469d6bfb | 1161 | |
va009039 | 0:65f1469d6bfb | 1162 | /* Raise ValueError if there was a conversion error */ |
va009039 | 0:65f1469d6bfb | 1163 | if (*pend != C_NULL) |
va009039 | 0:65f1469d6bfb | 1164 | { |
va009039 | 0:65f1469d6bfb | 1165 | PM_RAISE(retval, PM_RET_EX_VAL); |
va009039 | 0:65f1469d6bfb | 1166 | return retval; |
va009039 | 0:65f1469d6bfb | 1167 | } |
va009039 | 0:65f1469d6bfb | 1168 | |
va009039 | 0:65f1469d6bfb | 1169 | /* Create an int object to hold the result of the conversion */ |
va009039 | 0:65f1469d6bfb | 1170 | retval = int_new(i, &pi); |
va009039 | 0:65f1469d6bfb | 1171 | |
va009039 | 0:65f1469d6bfb | 1172 | NATIVE_SET_TOS(pi); |
va009039 | 0:65f1469d6bfb | 1173 | |
va009039 | 0:65f1469d6bfb | 1174 | return retval; |
va009039 | 0:65f1469d6bfb | 1175 | |
va009039 | 0:65f1469d6bfb | 1176 | } |
va009039 | 0:65f1469d6bfb | 1177 | |
va009039 | 0:65f1469d6bfb | 1178 | PmReturn_t |
va009039 | 0:65f1469d6bfb | 1179 | nat_25_string_count(pPmFrame_t *ppframe) |
va009039 | 0:65f1469d6bfb | 1180 | { |
va009039 | 0:65f1469d6bfb | 1181 | |
va009039 | 0:65f1469d6bfb | 1182 | pPmObj_t ps1; |
va009039 | 0:65f1469d6bfb | 1183 | pPmObj_t ps2; |
va009039 | 0:65f1469d6bfb | 1184 | uint8_t *pc1; |
va009039 | 0:65f1469d6bfb | 1185 | uint8_t *pc2; |
va009039 | 0:65f1469d6bfb | 1186 | uint8_t *pscan; |
va009039 | 0:65f1469d6bfb | 1187 | uint8_t *pmatch; |
va009039 | 0:65f1469d6bfb | 1188 | uint8_t pc2c0; |
va009039 | 0:65f1469d6bfb | 1189 | uint16_t pc1len; |
va009039 | 0:65f1469d6bfb | 1190 | uint16_t pc2len; |
va009039 | 0:65f1469d6bfb | 1191 | uint16_t n; |
va009039 | 0:65f1469d6bfb | 1192 | uint16_t remaining; |
va009039 | 0:65f1469d6bfb | 1193 | uint16_t cmp; |
va009039 | 0:65f1469d6bfb | 1194 | pPmObj_t pn; |
va009039 | 0:65f1469d6bfb | 1195 | PmReturn_t retval = PM_RET_OK; |
va009039 | 0:65f1469d6bfb | 1196 | |
va009039 | 0:65f1469d6bfb | 1197 | /* Raise TypeError if it's not a string or wrong number of args, */ |
va009039 | 0:65f1469d6bfb | 1198 | ps1 = NATIVE_GET_LOCAL(0); |
va009039 | 0:65f1469d6bfb | 1199 | ps2 = NATIVE_GET_LOCAL(1); |
va009039 | 0:65f1469d6bfb | 1200 | if ((OBJ_GET_TYPE(ps1) != OBJ_TYPE_STR) || (NATIVE_GET_NUM_ARGS() != 2) |
va009039 | 0:65f1469d6bfb | 1201 | || (OBJ_GET_TYPE(ps2) != OBJ_TYPE_STR)) |
va009039 | 0:65f1469d6bfb | 1202 | { |
va009039 | 0:65f1469d6bfb | 1203 | PM_RAISE(retval, PM_RET_EX_TYPE); |
va009039 | 0:65f1469d6bfb | 1204 | return retval; |
va009039 | 0:65f1469d6bfb | 1205 | } |
va009039 | 0:65f1469d6bfb | 1206 | |
va009039 | 0:65f1469d6bfb | 1207 | pc1 = ((pPmString_t)ps1)->val; |
va009039 | 0:65f1469d6bfb | 1208 | pc2 = ((pPmString_t)ps2)->val; |
va009039 | 0:65f1469d6bfb | 1209 | pc1len = ((pPmString_t)ps1)->length; |
va009039 | 0:65f1469d6bfb | 1210 | pc2len = ((pPmString_t)ps2)->length; |
va009039 | 0:65f1469d6bfb | 1211 | n = 0; |
va009039 | 0:65f1469d6bfb | 1212 | |
va009039 | 0:65f1469d6bfb | 1213 | /* Handle some quick special cases (order of if-clauses is important) */ |
va009039 | 0:65f1469d6bfb | 1214 | if (pc2len == 0) |
va009039 | 0:65f1469d6bfb | 1215 | { |
va009039 | 0:65f1469d6bfb | 1216 | n = pc1len + 1; |
va009039 | 0:65f1469d6bfb | 1217 | } |
va009039 | 0:65f1469d6bfb | 1218 | else if (pc1len == 0) |
va009039 | 0:65f1469d6bfb | 1219 | { |
va009039 | 0:65f1469d6bfb | 1220 | n = 0; |
va009039 | 0:65f1469d6bfb | 1221 | } |
va009039 | 0:65f1469d6bfb | 1222 | |
va009039 | 0:65f1469d6bfb | 1223 | /* Count the number of matches */ |
va009039 | 0:65f1469d6bfb | 1224 | else |
va009039 | 0:65f1469d6bfb | 1225 | { |
va009039 | 0:65f1469d6bfb | 1226 | n = 0; |
va009039 | 0:65f1469d6bfb | 1227 | remaining = pc1len; |
va009039 | 0:65f1469d6bfb | 1228 | pscan = pc1; |
va009039 | 0:65f1469d6bfb | 1229 | pc2c0 = pc2[0]; |
va009039 | 0:65f1469d6bfb | 1230 | while (pscan <= (pc1 + (pc1len - pc2len))) |
va009039 | 0:65f1469d6bfb | 1231 | { |
va009039 | 0:65f1469d6bfb | 1232 | /* Find the next possible start */ |
va009039 | 0:65f1469d6bfb | 1233 | pmatch = (uint8_t *)memchr(pscan, pc2c0, remaining); |
va009039 | 0:65f1469d6bfb | 1234 | if (pmatch == C_NULL) break; |
va009039 | 0:65f1469d6bfb | 1235 | remaining -= (pmatch - pscan); |
va009039 | 0:65f1469d6bfb | 1236 | pscan = pmatch; |
va009039 | 0:65f1469d6bfb | 1237 | |
va009039 | 0:65f1469d6bfb | 1238 | /* If it matches, increase the count, else try the next char */ |
va009039 | 0:65f1469d6bfb | 1239 | cmp = memcmp(pscan, pc2, pc2len); |
va009039 | 0:65f1469d6bfb | 1240 | if (cmp == 0) |
va009039 | 0:65f1469d6bfb | 1241 | { |
va009039 | 0:65f1469d6bfb | 1242 | n++; |
va009039 | 0:65f1469d6bfb | 1243 | pscan += pc2len; |
va009039 | 0:65f1469d6bfb | 1244 | remaining -= pc2len; |
va009039 | 0:65f1469d6bfb | 1245 | } |
va009039 | 0:65f1469d6bfb | 1246 | else |
va009039 | 0:65f1469d6bfb | 1247 | { |
va009039 | 0:65f1469d6bfb | 1248 | pscan++; |
va009039 | 0:65f1469d6bfb | 1249 | remaining--; |
va009039 | 0:65f1469d6bfb | 1250 | } |
va009039 | 0:65f1469d6bfb | 1251 | } |
va009039 | 0:65f1469d6bfb | 1252 | } |
va009039 | 0:65f1469d6bfb | 1253 | |
va009039 | 0:65f1469d6bfb | 1254 | retval = int_new(n, &pn); |
va009039 | 0:65f1469d6bfb | 1255 | |
va009039 | 0:65f1469d6bfb | 1256 | NATIVE_SET_TOS(pn); |
va009039 | 0:65f1469d6bfb | 1257 | |
va009039 | 0:65f1469d6bfb | 1258 | return retval; |
va009039 | 0:65f1469d6bfb | 1259 | |
va009039 | 0:65f1469d6bfb | 1260 | } |
va009039 | 0:65f1469d6bfb | 1261 | |
va009039 | 0:65f1469d6bfb | 1262 | PmReturn_t |
va009039 | 0:65f1469d6bfb | 1263 | nat_26_string_find(pPmFrame_t *ppframe) |
va009039 | 0:65f1469d6bfb | 1264 | { |
va009039 | 0:65f1469d6bfb | 1265 | |
va009039 | 0:65f1469d6bfb | 1266 | pPmObj_t ps1; |
va009039 | 0:65f1469d6bfb | 1267 | pPmObj_t ps2; |
va009039 | 0:65f1469d6bfb | 1268 | uint8_t *pc1; |
va009039 | 0:65f1469d6bfb | 1269 | uint8_t *pc2; |
va009039 | 0:65f1469d6bfb | 1270 | uint8_t *pmatch; |
va009039 | 0:65f1469d6bfb | 1271 | uint16_t pc1len; |
va009039 | 0:65f1469d6bfb | 1272 | uint16_t pc2len; |
va009039 | 0:65f1469d6bfb | 1273 | int32_t n; |
va009039 | 0:65f1469d6bfb | 1274 | pPmObj_t pn; |
va009039 | 0:65f1469d6bfb | 1275 | PmReturn_t retval = PM_RET_OK; |
va009039 | 0:65f1469d6bfb | 1276 | |
va009039 | 0:65f1469d6bfb | 1277 | /* Raise TypeError if it's not a string or wrong number of args, */ |
va009039 | 0:65f1469d6bfb | 1278 | ps1 = NATIVE_GET_LOCAL(0); |
va009039 | 0:65f1469d6bfb | 1279 | ps2 = NATIVE_GET_LOCAL(1); |
va009039 | 0:65f1469d6bfb | 1280 | if ((OBJ_GET_TYPE(ps1) != OBJ_TYPE_STR) || (NATIVE_GET_NUM_ARGS() != 2) |
va009039 | 0:65f1469d6bfb | 1281 | || (OBJ_GET_TYPE(ps2) != OBJ_TYPE_STR)) |
va009039 | 0:65f1469d6bfb | 1282 | { |
va009039 | 0:65f1469d6bfb | 1283 | PM_RAISE(retval, PM_RET_EX_TYPE); |
va009039 | 0:65f1469d6bfb | 1284 | return retval; |
va009039 | 0:65f1469d6bfb | 1285 | } |
va009039 | 0:65f1469d6bfb | 1286 | |
va009039 | 0:65f1469d6bfb | 1287 | pc1 = ((pPmString_t)ps1)->val; |
va009039 | 0:65f1469d6bfb | 1288 | pc2 = ((pPmString_t)ps2)->val; |
va009039 | 0:65f1469d6bfb | 1289 | pc1len = ((pPmString_t)ps1)->length; |
va009039 | 0:65f1469d6bfb | 1290 | pc2len = ((pPmString_t)ps2)->length; |
va009039 | 0:65f1469d6bfb | 1291 | n = -1; |
va009039 | 0:65f1469d6bfb | 1292 | |
va009039 | 0:65f1469d6bfb | 1293 | /* Handle a quick special case */ |
va009039 | 0:65f1469d6bfb | 1294 | if (pc2len == 0) |
va009039 | 0:65f1469d6bfb | 1295 | { |
va009039 | 0:65f1469d6bfb | 1296 | n = 0; |
va009039 | 0:65f1469d6bfb | 1297 | } |
va009039 | 0:65f1469d6bfb | 1298 | |
va009039 | 0:65f1469d6bfb | 1299 | /* Try to find the index of the substring */ |
va009039 | 0:65f1469d6bfb | 1300 | else |
va009039 | 0:65f1469d6bfb | 1301 | { |
va009039 | 0:65f1469d6bfb | 1302 | /* Find the next possible start */ |
va009039 | 0:65f1469d6bfb | 1303 | pmatch = (uint8_t *)memchr(pc1, pc2[0], pc1len); |
va009039 | 0:65f1469d6bfb | 1304 | if (pmatch != C_NULL) |
va009039 | 0:65f1469d6bfb | 1305 | { |
va009039 | 0:65f1469d6bfb | 1306 | /* If it matches, calculate the index */ |
va009039 | 0:65f1469d6bfb | 1307 | if (memcmp(pmatch, pc2, pc2len) == 0) |
va009039 | 0:65f1469d6bfb | 1308 | { |
va009039 | 0:65f1469d6bfb | 1309 | n = pmatch - pc1; |
va009039 | 0:65f1469d6bfb | 1310 | } |
va009039 | 0:65f1469d6bfb | 1311 | } |
va009039 | 0:65f1469d6bfb | 1312 | } |
va009039 | 0:65f1469d6bfb | 1313 | |
va009039 | 0:65f1469d6bfb | 1314 | retval = int_new(n, &pn); |
va009039 | 0:65f1469d6bfb | 1315 | |
va009039 | 0:65f1469d6bfb | 1316 | NATIVE_SET_TOS(pn); |
va009039 | 0:65f1469d6bfb | 1317 | |
va009039 | 0:65f1469d6bfb | 1318 | return retval; |
va009039 | 0:65f1469d6bfb | 1319 | |
va009039 | 0:65f1469d6bfb | 1320 | } |
va009039 | 0:65f1469d6bfb | 1321 | |
va009039 | 0:65f1469d6bfb | 1322 | PmReturn_t |
va009039 | 0:65f1469d6bfb | 1323 | nat_27_sys_exit(pPmFrame_t *ppframe) |
va009039 | 0:65f1469d6bfb | 1324 | { |
va009039 | 0:65f1469d6bfb | 1325 | |
va009039 | 0:65f1469d6bfb | 1326 | pPmObj_t pval = C_NULL; |
va009039 | 0:65f1469d6bfb | 1327 | PmReturn_t retval; |
va009039 | 0:65f1469d6bfb | 1328 | |
va009039 | 0:65f1469d6bfb | 1329 | /* If no arg given, assume return 0 */ |
va009039 | 0:65f1469d6bfb | 1330 | if (NATIVE_GET_NUM_ARGS() == 0) |
va009039 | 0:65f1469d6bfb | 1331 | { |
va009039 | 0:65f1469d6bfb | 1332 | NATIVE_SET_TOS(PM_ZERO); |
va009039 | 0:65f1469d6bfb | 1333 | } |
va009039 | 0:65f1469d6bfb | 1334 | |
va009039 | 0:65f1469d6bfb | 1335 | /* If 1 arg given, put it on stack */ |
va009039 | 0:65f1469d6bfb | 1336 | else if (NATIVE_GET_NUM_ARGS() == 1) |
va009039 | 0:65f1469d6bfb | 1337 | { |
va009039 | 0:65f1469d6bfb | 1338 | pval = NATIVE_GET_LOCAL(0); |
va009039 | 0:65f1469d6bfb | 1339 | NATIVE_SET_TOS(pval); |
va009039 | 0:65f1469d6bfb | 1340 | } |
va009039 | 0:65f1469d6bfb | 1341 | |
va009039 | 0:65f1469d6bfb | 1342 | /* If wrong number of args, raise TypeError */ |
va009039 | 0:65f1469d6bfb | 1343 | else |
va009039 | 0:65f1469d6bfb | 1344 | { |
va009039 | 0:65f1469d6bfb | 1345 | PM_RAISE(retval, PM_RET_EX_TYPE); |
va009039 | 0:65f1469d6bfb | 1346 | return retval; |
va009039 | 0:65f1469d6bfb | 1347 | } |
va009039 | 0:65f1469d6bfb | 1348 | |
va009039 | 0:65f1469d6bfb | 1349 | /* Raise the SystemExit exception */ |
va009039 | 0:65f1469d6bfb | 1350 | PM_RAISE(retval, PM_RET_EX_EXIT); |
va009039 | 0:65f1469d6bfb | 1351 | return retval; |
va009039 | 0:65f1469d6bfb | 1352 | |
va009039 | 0:65f1469d6bfb | 1353 | } |
va009039 | 0:65f1469d6bfb | 1354 | |
va009039 | 0:65f1469d6bfb | 1355 | PmReturn_t |
va009039 | 0:65f1469d6bfb | 1356 | nat_28_sys_gc(pPmFrame_t *ppframe) |
va009039 | 0:65f1469d6bfb | 1357 | { |
va009039 | 0:65f1469d6bfb | 1358 | |
va009039 | 0:65f1469d6bfb | 1359 | PmReturn_t retval = PM_RET_OK; |
va009039 | 0:65f1469d6bfb | 1360 | #ifdef HAVE_GC |
va009039 | 0:65f1469d6bfb | 1361 | /* If wrong number of args, raise TypeError */ |
va009039 | 0:65f1469d6bfb | 1362 | if (NATIVE_GET_NUM_ARGS() != 0) |
va009039 | 0:65f1469d6bfb | 1363 | { |
va009039 | 0:65f1469d6bfb | 1364 | PM_RAISE(retval, PM_RET_EX_TYPE); |
va009039 | 0:65f1469d6bfb | 1365 | return retval; |
va009039 | 0:65f1469d6bfb | 1366 | } |
va009039 | 0:65f1469d6bfb | 1367 | |
va009039 | 0:65f1469d6bfb | 1368 | retval = heap_gcRun(); |
va009039 | 0:65f1469d6bfb | 1369 | #endif |
va009039 | 0:65f1469d6bfb | 1370 | NATIVE_SET_TOS(PM_NONE); |
va009039 | 0:65f1469d6bfb | 1371 | |
va009039 | 0:65f1469d6bfb | 1372 | return retval; |
va009039 | 0:65f1469d6bfb | 1373 | |
va009039 | 0:65f1469d6bfb | 1374 | } |
va009039 | 0:65f1469d6bfb | 1375 | |
va009039 | 0:65f1469d6bfb | 1376 | PmReturn_t |
va009039 | 0:65f1469d6bfb | 1377 | nat_29_sys_getb(pPmFrame_t *ppframe) |
va009039 | 0:65f1469d6bfb | 1378 | { |
va009039 | 0:65f1469d6bfb | 1379 | |
va009039 | 0:65f1469d6bfb | 1380 | uint8_t b; |
va009039 | 0:65f1469d6bfb | 1381 | pPmObj_t pb; |
va009039 | 0:65f1469d6bfb | 1382 | PmReturn_t retval; |
va009039 | 0:65f1469d6bfb | 1383 | |
va009039 | 0:65f1469d6bfb | 1384 | /* If wrong number of args, raise TypeError */ |
va009039 | 0:65f1469d6bfb | 1385 | if (NATIVE_GET_NUM_ARGS() != 0) |
va009039 | 0:65f1469d6bfb | 1386 | { |
va009039 | 0:65f1469d6bfb | 1387 | PM_RAISE(retval, PM_RET_EX_TYPE); |
va009039 | 0:65f1469d6bfb | 1388 | return retval; |
va009039 | 0:65f1469d6bfb | 1389 | } |
va009039 | 0:65f1469d6bfb | 1390 | |
va009039 | 0:65f1469d6bfb | 1391 | retval = plat_getByte(&b); |
va009039 | 0:65f1469d6bfb | 1392 | PM_RETURN_IF_ERROR(retval); |
va009039 | 0:65f1469d6bfb | 1393 | |
va009039 | 0:65f1469d6bfb | 1394 | retval = int_new((int32_t)b, &pb); |
va009039 | 0:65f1469d6bfb | 1395 | NATIVE_SET_TOS(pb); |
va009039 | 0:65f1469d6bfb | 1396 | return retval; |
va009039 | 0:65f1469d6bfb | 1397 | |
va009039 | 0:65f1469d6bfb | 1398 | } |
va009039 | 0:65f1469d6bfb | 1399 | |
va009039 | 0:65f1469d6bfb | 1400 | PmReturn_t |
va009039 | 0:65f1469d6bfb | 1401 | nat_30_sys_heap(pPmFrame_t *ppframe) |
va009039 | 0:65f1469d6bfb | 1402 | { |
va009039 | 0:65f1469d6bfb | 1403 | |
va009039 | 0:65f1469d6bfb | 1404 | PmReturn_t retval; |
va009039 | 0:65f1469d6bfb | 1405 | pPmObj_t pavail; |
va009039 | 0:65f1469d6bfb | 1406 | pPmObj_t psize; |
va009039 | 0:65f1469d6bfb | 1407 | pPmObj_t ptup; |
va009039 | 0:65f1469d6bfb | 1408 | uint8_t objid; |
va009039 | 0:65f1469d6bfb | 1409 | |
va009039 | 0:65f1469d6bfb | 1410 | /* If wrong number of args, raise TypeError */ |
va009039 | 0:65f1469d6bfb | 1411 | if (NATIVE_GET_NUM_ARGS() != 0) |
va009039 | 0:65f1469d6bfb | 1412 | { |
va009039 | 0:65f1469d6bfb | 1413 | PM_RAISE(retval, PM_RET_EX_TYPE); |
va009039 | 0:65f1469d6bfb | 1414 | return retval; |
va009039 | 0:65f1469d6bfb | 1415 | } |
va009039 | 0:65f1469d6bfb | 1416 | |
va009039 | 0:65f1469d6bfb | 1417 | /* Allocate a tuple to store the return values */ |
va009039 | 0:65f1469d6bfb | 1418 | retval = tuple_new(2, &ptup); |
va009039 | 0:65f1469d6bfb | 1419 | PM_RETURN_IF_ERROR(retval); |
va009039 | 0:65f1469d6bfb | 1420 | |
va009039 | 0:65f1469d6bfb | 1421 | /* Get the maximum heap size */ |
va009039 | 0:65f1469d6bfb | 1422 | heap_gcPushTempRoot(ptup, &objid); |
va009039 | 0:65f1469d6bfb | 1423 | retval = int_new(heap_getSize(), &psize); |
va009039 | 0:65f1469d6bfb | 1424 | if (retval != PM_RET_OK) |
va009039 | 0:65f1469d6bfb | 1425 | { |
va009039 | 0:65f1469d6bfb | 1426 | heap_gcPopTempRoot(objid); |
va009039 | 0:65f1469d6bfb | 1427 | return retval; |
va009039 | 0:65f1469d6bfb | 1428 | } |
va009039 | 0:65f1469d6bfb | 1429 | |
va009039 | 0:65f1469d6bfb | 1430 | /* Allocate an int to hold the amount of heap available */ |
va009039 | 0:65f1469d6bfb | 1431 | retval = int_new(heap_getAvail() - sizeof(PmInt_t), &pavail); |
va009039 | 0:65f1469d6bfb | 1432 | heap_gcPopTempRoot(objid); |
va009039 | 0:65f1469d6bfb | 1433 | PM_RETURN_IF_ERROR(retval); |
va009039 | 0:65f1469d6bfb | 1434 | |
va009039 | 0:65f1469d6bfb | 1435 | /* Put the two heap values in the tuple */ |
va009039 | 0:65f1469d6bfb | 1436 | ((pPmTuple_t)ptup)->val[0] = pavail; |
va009039 | 0:65f1469d6bfb | 1437 | ((pPmTuple_t)ptup)->val[1] = psize; |
va009039 | 0:65f1469d6bfb | 1438 | |
va009039 | 0:65f1469d6bfb | 1439 | /* Return the tuple on the stack */ |
va009039 | 0:65f1469d6bfb | 1440 | NATIVE_SET_TOS(ptup); |
va009039 | 0:65f1469d6bfb | 1441 | |
va009039 | 0:65f1469d6bfb | 1442 | return retval; |
va009039 | 0:65f1469d6bfb | 1443 | |
va009039 | 0:65f1469d6bfb | 1444 | } |
va009039 | 0:65f1469d6bfb | 1445 | |
va009039 | 0:65f1469d6bfb | 1446 | PmReturn_t |
va009039 | 0:65f1469d6bfb | 1447 | nat_31_sys_putb(pPmFrame_t *ppframe) |
va009039 | 0:65f1469d6bfb | 1448 | { |
va009039 | 0:65f1469d6bfb | 1449 | |
va009039 | 0:65f1469d6bfb | 1450 | uint8_t b; |
va009039 | 0:65f1469d6bfb | 1451 | pPmObj_t pb; |
va009039 | 0:65f1469d6bfb | 1452 | PmReturn_t retval; |
va009039 | 0:65f1469d6bfb | 1453 | |
va009039 | 0:65f1469d6bfb | 1454 | pb = NATIVE_GET_LOCAL(0); |
va009039 | 0:65f1469d6bfb | 1455 | |
va009039 | 0:65f1469d6bfb | 1456 | /* If wrong number of args, raise TypeError */ |
va009039 | 0:65f1469d6bfb | 1457 | if (NATIVE_GET_NUM_ARGS() != 1) |
va009039 | 0:65f1469d6bfb | 1458 | { |
va009039 | 0:65f1469d6bfb | 1459 | PM_RAISE(retval, PM_RET_EX_TYPE); |
va009039 | 0:65f1469d6bfb | 1460 | return retval; |
va009039 | 0:65f1469d6bfb | 1461 | } |
va009039 | 0:65f1469d6bfb | 1462 | |
va009039 | 0:65f1469d6bfb | 1463 | /* If arg is not an int, raise TypeError */ |
va009039 | 0:65f1469d6bfb | 1464 | if (OBJ_GET_TYPE(pb) != OBJ_TYPE_INT) |
va009039 | 0:65f1469d6bfb | 1465 | { |
va009039 | 0:65f1469d6bfb | 1466 | PM_RAISE(retval, PM_RET_EX_TYPE); |
va009039 | 0:65f1469d6bfb | 1467 | return retval; |
va009039 | 0:65f1469d6bfb | 1468 | } |
va009039 | 0:65f1469d6bfb | 1469 | |
va009039 | 0:65f1469d6bfb | 1470 | b = ((pPmInt_t)pb)->val & 0xFF; |
va009039 | 0:65f1469d6bfb | 1471 | retval = plat_putByte(b); |
va009039 | 0:65f1469d6bfb | 1472 | NATIVE_SET_TOS(PM_NONE); |
va009039 | 0:65f1469d6bfb | 1473 | return retval; |
va009039 | 0:65f1469d6bfb | 1474 | |
va009039 | 0:65f1469d6bfb | 1475 | } |
va009039 | 0:65f1469d6bfb | 1476 | |
va009039 | 0:65f1469d6bfb | 1477 | PmReturn_t |
va009039 | 0:65f1469d6bfb | 1478 | nat_32_sys_runInThread(pPmFrame_t *ppframe) |
va009039 | 0:65f1469d6bfb | 1479 | { |
va009039 | 0:65f1469d6bfb | 1480 | |
va009039 | 0:65f1469d6bfb | 1481 | PmReturn_t retval; |
va009039 | 0:65f1469d6bfb | 1482 | pPmObj_t pf; |
va009039 | 0:65f1469d6bfb | 1483 | |
va009039 | 0:65f1469d6bfb | 1484 | /* If wrong number of args, raise TypeError */ |
va009039 | 0:65f1469d6bfb | 1485 | if (NATIVE_GET_NUM_ARGS() != 1) |
va009039 | 0:65f1469d6bfb | 1486 | { |
va009039 | 0:65f1469d6bfb | 1487 | PM_RAISE(retval, PM_RET_EX_TYPE); |
va009039 | 0:65f1469d6bfb | 1488 | return retval; |
va009039 | 0:65f1469d6bfb | 1489 | } |
va009039 | 0:65f1469d6bfb | 1490 | |
va009039 | 0:65f1469d6bfb | 1491 | /* If arg is not a function, raise TypeError */ |
va009039 | 0:65f1469d6bfb | 1492 | pf = NATIVE_GET_LOCAL(0); |
va009039 | 0:65f1469d6bfb | 1493 | if (OBJ_GET_TYPE(pf) != OBJ_TYPE_FXN) |
va009039 | 0:65f1469d6bfb | 1494 | { |
va009039 | 0:65f1469d6bfb | 1495 | PM_RAISE(retval, PM_RET_EX_TYPE); |
va009039 | 0:65f1469d6bfb | 1496 | return retval; |
va009039 | 0:65f1469d6bfb | 1497 | } |
va009039 | 0:65f1469d6bfb | 1498 | |
va009039 | 0:65f1469d6bfb | 1499 | retval = interp_addThread((pPmFunc_t)pf); |
va009039 | 0:65f1469d6bfb | 1500 | NATIVE_SET_TOS(PM_NONE); |
va009039 | 0:65f1469d6bfb | 1501 | return retval; |
va009039 | 0:65f1469d6bfb | 1502 | |
va009039 | 0:65f1469d6bfb | 1503 | } |
va009039 | 0:65f1469d6bfb | 1504 | |
va009039 | 0:65f1469d6bfb | 1505 | PmReturn_t |
va009039 | 0:65f1469d6bfb | 1506 | nat_33_sys_time(pPmFrame_t *ppframe) |
va009039 | 0:65f1469d6bfb | 1507 | { |
va009039 | 0:65f1469d6bfb | 1508 | |
va009039 | 0:65f1469d6bfb | 1509 | uint32_t t; |
va009039 | 0:65f1469d6bfb | 1510 | pPmObj_t pt; |
va009039 | 0:65f1469d6bfb | 1511 | PmReturn_t retval; |
va009039 | 0:65f1469d6bfb | 1512 | |
va009039 | 0:65f1469d6bfb | 1513 | /* If wrong number of args, raise TypeError */ |
va009039 | 0:65f1469d6bfb | 1514 | if (NATIVE_GET_NUM_ARGS() != 0) |
va009039 | 0:65f1469d6bfb | 1515 | { |
va009039 | 0:65f1469d6bfb | 1516 | PM_RAISE(retval, PM_RET_EX_TYPE); |
va009039 | 0:65f1469d6bfb | 1517 | return retval; |
va009039 | 0:65f1469d6bfb | 1518 | } |
va009039 | 0:65f1469d6bfb | 1519 | |
va009039 | 0:65f1469d6bfb | 1520 | /* Get the system time (milliseconds since init) */ |
va009039 | 0:65f1469d6bfb | 1521 | retval = plat_getMsTicks(&t); |
va009039 | 0:65f1469d6bfb | 1522 | PM_RETURN_IF_ERROR(retval); |
va009039 | 0:65f1469d6bfb | 1523 | |
va009039 | 0:65f1469d6bfb | 1524 | /* |
va009039 | 0:65f1469d6bfb | 1525 | * Raise ValueError if there is an overflow |
va009039 | 0:65f1469d6bfb | 1526 | * (plat_getMsTicks is unsigned; int is signed) |
va009039 | 0:65f1469d6bfb | 1527 | */ |
va009039 | 0:65f1469d6bfb | 1528 | if ((int32_t)t < 0) |
va009039 | 0:65f1469d6bfb | 1529 | { |
va009039 | 0:65f1469d6bfb | 1530 | PM_RAISE(retval, PM_RET_EX_VAL); |
va009039 | 0:65f1469d6bfb | 1531 | return retval; |
va009039 | 0:65f1469d6bfb | 1532 | } |
va009039 | 0:65f1469d6bfb | 1533 | |
va009039 | 0:65f1469d6bfb | 1534 | /* Return an int object with the time value */ |
va009039 | 0:65f1469d6bfb | 1535 | retval = int_new((int32_t)t, &pt); |
va009039 | 0:65f1469d6bfb | 1536 | NATIVE_SET_TOS(pt); |
va009039 | 0:65f1469d6bfb | 1537 | return retval; |
va009039 | 0:65f1469d6bfb | 1538 | |
va009039 | 0:65f1469d6bfb | 1539 | } |
va009039 | 0:65f1469d6bfb | 1540 | |
va009039 | 0:65f1469d6bfb | 1541 | PmReturn_t |
va009039 | 0:65f1469d6bfb | 1542 | nat_34_ipm__getImg(pPmFrame_t *ppframe) |
va009039 | 0:65f1469d6bfb | 1543 | { |
va009039 | 0:65f1469d6bfb | 1544 | |
va009039 | 0:65f1469d6bfb | 1545 | PmReturn_t retval; |
va009039 | 0:65f1469d6bfb | 1546 | uint8_t imgType; |
va009039 | 0:65f1469d6bfb | 1547 | uint16_t imgSize; |
va009039 | 0:65f1469d6bfb | 1548 | uint8_t *pchunk; |
va009039 | 0:65f1469d6bfb | 1549 | pPmCodeImgObj_t pimg; |
va009039 | 0:65f1469d6bfb | 1550 | uint16_t i; |
va009039 | 0:65f1469d6bfb | 1551 | uint8_t b; |
va009039 | 0:65f1469d6bfb | 1552 | |
va009039 | 0:65f1469d6bfb | 1553 | /* Get the image type */ |
va009039 | 0:65f1469d6bfb | 1554 | retval = plat_getByte(&imgType); |
va009039 | 0:65f1469d6bfb | 1555 | PM_RETURN_IF_ERROR(retval); |
va009039 | 0:65f1469d6bfb | 1556 | |
va009039 | 0:65f1469d6bfb | 1557 | /* Quit if a code image type was not received */ |
va009039 | 0:65f1469d6bfb | 1558 | if (imgType != OBJ_TYPE_CIM) |
va009039 | 0:65f1469d6bfb | 1559 | { |
va009039 | 0:65f1469d6bfb | 1560 | PM_RAISE(retval, PM_RET_EX_STOP); |
va009039 | 0:65f1469d6bfb | 1561 | return retval; |
va009039 | 0:65f1469d6bfb | 1562 | } |
va009039 | 0:65f1469d6bfb | 1563 | |
va009039 | 0:65f1469d6bfb | 1564 | /* Get the image size (little endien) */ |
va009039 | 0:65f1469d6bfb | 1565 | retval = plat_getByte(&b); |
va009039 | 0:65f1469d6bfb | 1566 | PM_RETURN_IF_ERROR(retval); |
va009039 | 0:65f1469d6bfb | 1567 | imgSize = b; |
va009039 | 0:65f1469d6bfb | 1568 | retval = plat_getByte(&b); |
va009039 | 0:65f1469d6bfb | 1569 | PM_RETURN_IF_ERROR(retval); |
va009039 | 0:65f1469d6bfb | 1570 | imgSize |= (b << 8); |
va009039 | 0:65f1469d6bfb | 1571 | |
va009039 | 0:65f1469d6bfb | 1572 | /* Get space for CodeImgObj */ |
va009039 | 0:65f1469d6bfb | 1573 | retval = heap_getChunk(sizeof(PmCodeImgObj_t) + imgSize, &pchunk); |
va009039 | 0:65f1469d6bfb | 1574 | PM_RETURN_IF_ERROR(retval); |
va009039 | 0:65f1469d6bfb | 1575 | pimg = (pPmCodeImgObj_t)pchunk; |
va009039 | 0:65f1469d6bfb | 1576 | OBJ_SET_TYPE(pimg, OBJ_TYPE_CIO); |
va009039 | 0:65f1469d6bfb | 1577 | |
va009039 | 0:65f1469d6bfb | 1578 | /* Start the image with the bytes that have already been received */ |
va009039 | 0:65f1469d6bfb | 1579 | i = 0; |
va009039 | 0:65f1469d6bfb | 1580 | pimg->val[i++] = imgType; |
va009039 | 0:65f1469d6bfb | 1581 | pimg->val[i++] = imgSize & 0xFF; |
va009039 | 0:65f1469d6bfb | 1582 | pimg->val[i++] = (imgSize >> 8) & 0xFF; |
va009039 | 0:65f1469d6bfb | 1583 | |
va009039 | 0:65f1469d6bfb | 1584 | /* Get the remaining bytes in the image */ |
va009039 | 0:65f1469d6bfb | 1585 | for(; i < imgSize; i++) |
va009039 | 0:65f1469d6bfb | 1586 | { |
va009039 | 0:65f1469d6bfb | 1587 | retval = plat_getByte(&b); |
va009039 | 0:65f1469d6bfb | 1588 | PM_RETURN_IF_ERROR(retval); |
va009039 | 0:65f1469d6bfb | 1589 | |
va009039 | 0:65f1469d6bfb | 1590 | pimg->val[i] = b; |
va009039 | 0:65f1469d6bfb | 1591 | } |
va009039 | 0:65f1469d6bfb | 1592 | |
va009039 | 0:65f1469d6bfb | 1593 | /* Return the image as a code image object on the stack */ |
va009039 | 0:65f1469d6bfb | 1594 | NATIVE_SET_TOS((pPmObj_t)pimg); |
va009039 | 0:65f1469d6bfb | 1595 | return retval; |
va009039 | 0:65f1469d6bfb | 1596 | |
va009039 | 0:65f1469d6bfb | 1597 | } |
va009039 | 0:65f1469d6bfb | 1598 | |
va009039 | 0:65f1469d6bfb | 1599 | PmReturn_t |
va009039 | 0:65f1469d6bfb | 1600 | nat_35_ipm_x04(pPmFrame_t *ppframe) |
va009039 | 0:65f1469d6bfb | 1601 | { |
va009039 | 0:65f1469d6bfb | 1602 | |
va009039 | 0:65f1469d6bfb | 1603 | NATIVE_SET_TOS(PM_NONE); |
va009039 | 0:65f1469d6bfb | 1604 | return plat_putByte(0x04); |
va009039 | 0:65f1469d6bfb | 1605 | |
va009039 | 0:65f1469d6bfb | 1606 | } |
va009039 | 0:65f1469d6bfb | 1607 | |
va009039 | 0:65f1469d6bfb | 1608 | /* Native function lookup table */ |
va009039 | 0:65f1469d6bfb | 1609 | pPmNativeFxn_t const std_nat_fxn_table[] = |
va009039 | 0:65f1469d6bfb | 1610 | { |
va009039 | 0:65f1469d6bfb | 1611 | nat_00___bi_chr, |
va009039 | 0:65f1469d6bfb | 1612 | nat_01___bi_dir, |
va009039 | 0:65f1469d6bfb | 1613 | nat_02___bi_eval, |
va009039 | 0:65f1469d6bfb | 1614 | nat_03___bi_globals, |
va009039 | 0:65f1469d6bfb | 1615 | nat_04___bi_id, |
va009039 | 0:65f1469d6bfb | 1616 | nat_05___bi_len, |
va009039 | 0:65f1469d6bfb | 1617 | nat_06___bi_locals, |
va009039 | 0:65f1469d6bfb | 1618 | nat_07___bi_ord, |
va009039 | 0:65f1469d6bfb | 1619 | nat_08___bi_range, |
va009039 | 0:65f1469d6bfb | 1620 | nat_09___bi_sum, |
va009039 | 0:65f1469d6bfb | 1621 | nat_10___bi_type, |
va009039 | 0:65f1469d6bfb | 1622 | nat_11___bi_Co, |
va009039 | 0:65f1469d6bfb | 1623 | nat_12___bi___init__, |
va009039 | 0:65f1469d6bfb | 1624 | nat_13___bi_send, |
va009039 | 0:65f1469d6bfb | 1625 | nat_14___bi_ismain, |
va009039 | 0:65f1469d6bfb | 1626 | nat_15_dict_clear, |
va009039 | 0:65f1469d6bfb | 1627 | nat_16_dict_keys, |
va009039 | 0:65f1469d6bfb | 1628 | nat_17_dict_values, |
va009039 | 0:65f1469d6bfb | 1629 | nat_18_dict_update, |
va009039 | 0:65f1469d6bfb | 1630 | nat_19_list_append, |
va009039 | 0:65f1469d6bfb | 1631 | nat_20_list_index, |
va009039 | 0:65f1469d6bfb | 1632 | nat_21_list_insert, |
va009039 | 0:65f1469d6bfb | 1633 | nat_22_list_pop, |
va009039 | 0:65f1469d6bfb | 1634 | nat_23_list_remove, |
va009039 | 0:65f1469d6bfb | 1635 | nat_24_string_atoi, |
va009039 | 0:65f1469d6bfb | 1636 | nat_25_string_count, |
va009039 | 0:65f1469d6bfb | 1637 | nat_26_string_find, |
va009039 | 0:65f1469d6bfb | 1638 | nat_27_sys_exit, |
va009039 | 0:65f1469d6bfb | 1639 | nat_28_sys_gc, |
va009039 | 0:65f1469d6bfb | 1640 | nat_29_sys_getb, |
va009039 | 0:65f1469d6bfb | 1641 | nat_30_sys_heap, |
va009039 | 0:65f1469d6bfb | 1642 | nat_31_sys_putb, |
va009039 | 0:65f1469d6bfb | 1643 | nat_32_sys_runInThread, |
va009039 | 0:65f1469d6bfb | 1644 | nat_33_sys_time, |
va009039 | 0:65f1469d6bfb | 1645 | nat_34_ipm__getImg, |
va009039 | 0:65f1469d6bfb | 1646 | nat_35_ipm_x04, |
va009039 | 0:65f1469d6bfb | 1647 | }; |