python-on-a-chip online compiler

Dependencies:   mbed TSI

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

more info: python-on-a-chip

Committer:
va009039
Date:
Sat Mar 02 11:54:20 2013 +0000
Revision:
0:65f1469d6bfb
first commit

Who changed what in which revision?

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