davide carboni / Mbed 2 deprecated pymite_http_get

Dependencies:   mbed

Committer:
dadaista
Date:
Wed Jul 21 12:50:41 2010 +0000
Revision:
0:14e5e829dffe

        

Who changed what in which revision?

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