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