python

Dependencies:   TSI mbed

Fork of pymite by Norimasa Okamoto

Committer:
kausdev
Date:
Thu Aug 28 19:35:16 2014 +0000
Revision:
12:d27ad05214e3
Parent:
0:65f1469d6bfb
pymte

Who changed what in which revision?

UserRevisionLine numberNew contents of line
va009039 0:65f1469d6bfb 1 /*
va009039 0:65f1469d6bfb 2 # This file is Copyright 2010 Dean Hall.
va009039 0:65f1469d6bfb 3 # This file is part of the PyMite VM.
va009039 0:65f1469d6bfb 4 # This file is licensed under the MIT License.
va009039 0:65f1469d6bfb 5 # See the LICENSE file for details.
va009039 0:65f1469d6bfb 6 */
va009039 0:65f1469d6bfb 7
va009039 0:65f1469d6bfb 8
va009039 0:65f1469d6bfb 9 #undef __FILE_ID__
va009039 0:65f1469d6bfb 10 #define __FILE_ID__ 0x19
va009039 0:65f1469d6bfb 11
va009039 0:65f1469d6bfb 12
va009039 0:65f1469d6bfb 13 /**
va009039 0:65f1469d6bfb 14 * \file
va009039 0:65f1469d6bfb 15 * \brief VM Bytearray Type
va009039 0:65f1469d6bfb 16 *
va009039 0:65f1469d6bfb 17 * VM Bytearray object type operations.
va009039 0:65f1469d6bfb 18 */
va009039 0:65f1469d6bfb 19
va009039 0:65f1469d6bfb 20 #include "pm.h"
va009039 0:65f1469d6bfb 21 #ifdef HAVE_BYTEARRAY
va009039 0:65f1469d6bfb 22
va009039 0:65f1469d6bfb 23
va009039 0:65f1469d6bfb 24 #define ROUND_UP_TO_MUL_OF_FOUR(n) n = (((n) + 3) & ~3)
va009039 0:65f1469d6bfb 25
va009039 0:65f1469d6bfb 26
va009039 0:65f1469d6bfb 27 /* Returns a container that can hold at least n bytes */
va009039 0:65f1469d6bfb 28 static
va009039 0:65f1469d6bfb 29 PmReturn_t
va009039 0:65f1469d6bfb 30 bytes_new(int16_t n, pPmObj_t *r_pobj)
va009039 0:65f1469d6bfb 31 {
va009039 0:65f1469d6bfb 32 PmReturn_t retval = PM_RET_OK;
va009039 0:65f1469d6bfb 33 pPmBytes_t pb = C_NULL;
va009039 0:65f1469d6bfb 34
va009039 0:65f1469d6bfb 35 ROUND_UP_TO_MUL_OF_FOUR(n);
va009039 0:65f1469d6bfb 36
va009039 0:65f1469d6bfb 37 /* Allocate a container */
va009039 0:65f1469d6bfb 38 retval = heap_getChunk(sizeof(PmBytes_t) + n, (uint8_t **)&pb);
va009039 0:65f1469d6bfb 39 PM_RETURN_IF_ERROR(retval);
va009039 0:65f1469d6bfb 40 OBJ_SET_TYPE(pb, OBJ_TYPE_BYS);
va009039 0:65f1469d6bfb 41 pb->length = n;
va009039 0:65f1469d6bfb 42
va009039 0:65f1469d6bfb 43 *r_pobj = (pPmObj_t)pb;
va009039 0:65f1469d6bfb 44 return retval;
va009039 0:65f1469d6bfb 45 }
va009039 0:65f1469d6bfb 46
va009039 0:65f1469d6bfb 47
va009039 0:65f1469d6bfb 48 /* Returns the int or one-char string as a byte */
va009039 0:65f1469d6bfb 49 static
va009039 0:65f1469d6bfb 50 PmReturn_t
va009039 0:65f1469d6bfb 51 bytes_getByteFromObj(pPmObj_t pobj, uint8_t *b)
va009039 0:65f1469d6bfb 52 {
va009039 0:65f1469d6bfb 53 PmReturn_t retval = PM_RET_OK;
va009039 0:65f1469d6bfb 54
kausdev 12:d27ad05214e3 55 if (OBJ_GET_TYPE(pobj) == OBJ_TYPE_INT) {
kausdev 12:d27ad05214e3 56 if ((((pPmInt_t)pobj)->val > 255) || (((pPmInt_t)pobj)->val < 0)) {
va009039 0:65f1469d6bfb 57 PM_RAISE(retval, PM_RET_EX_VAL);
va009039 0:65f1469d6bfb 58 return retval;
va009039 0:65f1469d6bfb 59 }
va009039 0:65f1469d6bfb 60
va009039 0:65f1469d6bfb 61 *b = (uint8_t)((pPmInt_t)pobj)->val;
va009039 0:65f1469d6bfb 62 }
va009039 0:65f1469d6bfb 63
kausdev 12:d27ad05214e3 64 else if (OBJ_GET_TYPE(pobj) == OBJ_TYPE_STR) {
kausdev 12:d27ad05214e3 65 if (((pPmString_t)pobj)->length != 1) {
va009039 0:65f1469d6bfb 66 PM_RAISE(retval, PM_RET_EX_VAL);
va009039 0:65f1469d6bfb 67 return retval;
va009039 0:65f1469d6bfb 68 }
va009039 0:65f1469d6bfb 69 *b = ((pPmString_t)pobj)->val[0];
va009039 0:65f1469d6bfb 70 }
va009039 0:65f1469d6bfb 71
kausdev 12:d27ad05214e3 72 else {
va009039 0:65f1469d6bfb 73 PM_RAISE(retval, PM_RET_EX_TYPE);
va009039 0:65f1469d6bfb 74 }
va009039 0:65f1469d6bfb 75 return retval;
va009039 0:65f1469d6bfb 76 }
va009039 0:65f1469d6bfb 77
va009039 0:65f1469d6bfb 78
va009039 0:65f1469d6bfb 79 PmReturn_t
va009039 0:65f1469d6bfb 80 bytearray_new(pPmObj_t pobj, pPmObj_t *r_pobj)
va009039 0:65f1469d6bfb 81 {
va009039 0:65f1469d6bfb 82 PmReturn_t retval = PM_RET_OK;
va009039 0:65f1469d6bfb 83 pPmBytearray_t pba = C_NULL;
va009039 0:65f1469d6bfb 84 pPmBytes_t pb = C_NULL;
va009039 0:65f1469d6bfb 85 pPmObj_t pitem;
va009039 0:65f1469d6bfb 86 int32_t i;
va009039 0:65f1469d6bfb 87 int16_t n;
va009039 0:65f1469d6bfb 88 uint8_t b;
va009039 0:65f1469d6bfb 89 uint8_t objid;
va009039 0:65f1469d6bfb 90
va009039 0:65f1469d6bfb 91 /* If object is an instance, get the thing it is containing */
kausdev 12:d27ad05214e3 92 if (OBJ_GET_TYPE(pobj) == OBJ_TYPE_CLI) {
va009039 0:65f1469d6bfb 93 retval = dict_getItem((pPmObj_t)((pPmInstance_t)pobj)->cli_attrs,
va009039 0:65f1469d6bfb 94 PM_NONE,
va009039 0:65f1469d6bfb 95 (pPmObj_t *)&pba);
va009039 0:65f1469d6bfb 96 PM_RETURN_IF_ERROR(retval);
va009039 0:65f1469d6bfb 97 pobj = (pPmObj_t)pba;
va009039 0:65f1469d6bfb 98 }
va009039 0:65f1469d6bfb 99
va009039 0:65f1469d6bfb 100 /* Get the requested length of the new bytearray */
kausdev 12:d27ad05214e3 101 switch (OBJ_GET_TYPE(pobj)) {
va009039 0:65f1469d6bfb 102 case OBJ_TYPE_INT:
va009039 0:65f1469d6bfb 103 i = ((pPmInt_t)pobj)->val;
kausdev 12:d27ad05214e3 104 if ((i < 0) || (i > 65535)) {
va009039 0:65f1469d6bfb 105 PM_RAISE(retval, PM_RET_EX_VAL);
va009039 0:65f1469d6bfb 106 return retval;
va009039 0:65f1469d6bfb 107 }
va009039 0:65f1469d6bfb 108 n = i;
va009039 0:65f1469d6bfb 109 break;
va009039 0:65f1469d6bfb 110
va009039 0:65f1469d6bfb 111 case OBJ_TYPE_STR:
va009039 0:65f1469d6bfb 112 n = ((pPmString_t)pobj)->length;
va009039 0:65f1469d6bfb 113 break;
va009039 0:65f1469d6bfb 114
va009039 0:65f1469d6bfb 115 case OBJ_TYPE_LST:
va009039 0:65f1469d6bfb 116 n = ((pPmList_t)pobj)->length;
va009039 0:65f1469d6bfb 117 break;
va009039 0:65f1469d6bfb 118
va009039 0:65f1469d6bfb 119 case OBJ_TYPE_TUP:
va009039 0:65f1469d6bfb 120 n = ((pPmTuple_t)pobj)->length;
va009039 0:65f1469d6bfb 121 break;
va009039 0:65f1469d6bfb 122
va009039 0:65f1469d6bfb 123 case OBJ_TYPE_BYA:
va009039 0:65f1469d6bfb 124 n = ((pPmBytearray_t)pobj)->length;
va009039 0:65f1469d6bfb 125 break;
va009039 0:65f1469d6bfb 126
va009039 0:65f1469d6bfb 127 default:
va009039 0:65f1469d6bfb 128 PM_RAISE(retval, PM_RET_EX_TYPE);
va009039 0:65f1469d6bfb 129 return retval;
va009039 0:65f1469d6bfb 130 }
va009039 0:65f1469d6bfb 131
va009039 0:65f1469d6bfb 132 /* Allocate a bytearray */
va009039 0:65f1469d6bfb 133 retval = heap_getChunk(sizeof(PmBytearray_t), (uint8_t **)&pba);
va009039 0:65f1469d6bfb 134 PM_RETURN_IF_ERROR(retval);
va009039 0:65f1469d6bfb 135 OBJ_SET_TYPE(pba, OBJ_TYPE_BYA);
va009039 0:65f1469d6bfb 136 pba->length = n;
va009039 0:65f1469d6bfb 137 pba->val = C_NULL;
va009039 0:65f1469d6bfb 138
va009039 0:65f1469d6bfb 139 /* Allocate the bytes container */
va009039 0:65f1469d6bfb 140 heap_gcPushTempRoot((pPmObj_t)pba, &objid);
va009039 0:65f1469d6bfb 141 retval = bytes_new(n, (pPmObj_t *)&pb);
va009039 0:65f1469d6bfb 142 heap_gcPopTempRoot(objid);
va009039 0:65f1469d6bfb 143 PM_RETURN_IF_ERROR(retval);
va009039 0:65f1469d6bfb 144 pba->val = pb;
va009039 0:65f1469d6bfb 145
va009039 0:65f1469d6bfb 146 /* Fill the bytes */
kausdev 12:d27ad05214e3 147 switch (OBJ_GET_TYPE(pobj)) {
va009039 0:65f1469d6bfb 148 case OBJ_TYPE_INT:
va009039 0:65f1469d6bfb 149 sli_memset((unsigned char *)&(pb->val), '\0', n);
va009039 0:65f1469d6bfb 150 break;
va009039 0:65f1469d6bfb 151
va009039 0:65f1469d6bfb 152 case OBJ_TYPE_BYA:
va009039 0:65f1469d6bfb 153 pitem = (pPmObj_t)((pPmBytearray_t)pobj)->val;
va009039 0:65f1469d6bfb 154 sli_memcpy(&(pb->val[0]), &(((pPmBytes_t)pitem)->val[0]), n);
va009039 0:65f1469d6bfb 155 break;
va009039 0:65f1469d6bfb 156
va009039 0:65f1469d6bfb 157 case OBJ_TYPE_STR:
va009039 0:65f1469d6bfb 158 sli_memcpy(&(pb->val[0]), &(((pPmString_t)pobj)->val[0]), n);
va009039 0:65f1469d6bfb 159 break;
va009039 0:65f1469d6bfb 160
va009039 0:65f1469d6bfb 161 case OBJ_TYPE_LST:
va009039 0:65f1469d6bfb 162 case OBJ_TYPE_TUP:
kausdev 12:d27ad05214e3 163 for (i = 0; i < n; i++) {
va009039 0:65f1469d6bfb 164 retval = seq_getSubscript(pobj, i, &pitem);
va009039 0:65f1469d6bfb 165 PM_RETURN_IF_ERROR(retval);
va009039 0:65f1469d6bfb 166 retval = bytes_getByteFromObj(pitem, &b);
va009039 0:65f1469d6bfb 167 PM_RETURN_IF_ERROR(retval);
va009039 0:65f1469d6bfb 168 pb->val[i] = b;
va009039 0:65f1469d6bfb 169 }
va009039 0:65f1469d6bfb 170 break;
va009039 0:65f1469d6bfb 171 }
va009039 0:65f1469d6bfb 172
va009039 0:65f1469d6bfb 173 *r_pobj = (pPmObj_t)pba;
va009039 0:65f1469d6bfb 174 return retval;
va009039 0:65f1469d6bfb 175 }
va009039 0:65f1469d6bfb 176
va009039 0:65f1469d6bfb 177
va009039 0:65f1469d6bfb 178 PmReturn_t
va009039 0:65f1469d6bfb 179 bytearray_getItem(pPmObj_t pobj, int16_t index, pPmObj_t *r_pobj)
va009039 0:65f1469d6bfb 180 {
va009039 0:65f1469d6bfb 181 PmReturn_t retval = PM_RET_OK;
va009039 0:65f1469d6bfb 182 pPmBytearray_t pba;
va009039 0:65f1469d6bfb 183 pPmBytes_t pb;
va009039 0:65f1469d6bfb 184 int32_t n;
va009039 0:65f1469d6bfb 185
va009039 0:65f1469d6bfb 186 pba = (pPmBytearray_t)pobj;
va009039 0:65f1469d6bfb 187
va009039 0:65f1469d6bfb 188 /* Adjust a negative index */
kausdev 12:d27ad05214e3 189 if (index < 0) {
va009039 0:65f1469d6bfb 190 index += pba->length;
va009039 0:65f1469d6bfb 191 }
va009039 0:65f1469d6bfb 192
va009039 0:65f1469d6bfb 193 /* Check the bounds of the index */
kausdev 12:d27ad05214e3 194 if ((index < 0) || (index >= pba->length)) {
va009039 0:65f1469d6bfb 195 PM_RAISE(retval, PM_RET_EX_INDX);
va009039 0:65f1469d6bfb 196 return retval;
va009039 0:65f1469d6bfb 197 }
va009039 0:65f1469d6bfb 198
va009039 0:65f1469d6bfb 199 /* Create int from byte at index */
va009039 0:65f1469d6bfb 200 pb = pba->val;
va009039 0:65f1469d6bfb 201 n = (int32_t)pb->val[index];
va009039 0:65f1469d6bfb 202 retval = int_new(n, r_pobj);
va009039 0:65f1469d6bfb 203
va009039 0:65f1469d6bfb 204 return retval;
va009039 0:65f1469d6bfb 205 }
va009039 0:65f1469d6bfb 206
va009039 0:65f1469d6bfb 207
va009039 0:65f1469d6bfb 208 PmReturn_t
va009039 0:65f1469d6bfb 209 bytearray_setItem(pPmObj_t pba, int16_t index, pPmObj_t pobj)
va009039 0:65f1469d6bfb 210 {
va009039 0:65f1469d6bfb 211 PmReturn_t retval;
va009039 0:65f1469d6bfb 212 pPmBytes_t pb;
va009039 0:65f1469d6bfb 213 uint8_t b = 0;
va009039 0:65f1469d6bfb 214
va009039 0:65f1469d6bfb 215 /* Adjust a negative index */
kausdev 12:d27ad05214e3 216 if (index < 0) {
va009039 0:65f1469d6bfb 217 index += ((pPmBytearray_t)pba)->length;
va009039 0:65f1469d6bfb 218 }
va009039 0:65f1469d6bfb 219
va009039 0:65f1469d6bfb 220 /* Check the bounds of the index */
kausdev 12:d27ad05214e3 221 if ((index < 0) || (index >= ((pPmBytearray_t)pba)->length)) {
va009039 0:65f1469d6bfb 222 PM_RAISE(retval, PM_RET_EX_INDX);
va009039 0:65f1469d6bfb 223 return retval;
va009039 0:65f1469d6bfb 224 }
va009039 0:65f1469d6bfb 225
va009039 0:65f1469d6bfb 226 /* Set the item */
va009039 0:65f1469d6bfb 227 retval = bytes_getByteFromObj(pobj, &b);
va009039 0:65f1469d6bfb 228 pb = ((pPmBytearray_t)pba)->val;
va009039 0:65f1469d6bfb 229 pb->val[index] = b;
va009039 0:65f1469d6bfb 230
va009039 0:65f1469d6bfb 231 return retval;
va009039 0:65f1469d6bfb 232 }
va009039 0:65f1469d6bfb 233
va009039 0:65f1469d6bfb 234
va009039 0:65f1469d6bfb 235 #ifdef HAVE_PRINT
va009039 0:65f1469d6bfb 236 PmReturn_t
va009039 0:65f1469d6bfb 237 bytearray_print(pPmObj_t pobj)
va009039 0:65f1469d6bfb 238 {
va009039 0:65f1469d6bfb 239 PmReturn_t retval;
va009039 0:65f1469d6bfb 240 pPmBytes_t pb;
va009039 0:65f1469d6bfb 241
va009039 0:65f1469d6bfb 242 obj_print(PM_BYTEARRAY_STR, C_FALSE, C_FALSE);
va009039 0:65f1469d6bfb 243 plat_putByte('(');
va009039 0:65f1469d6bfb 244 plat_putByte('b');
va009039 0:65f1469d6bfb 245 pb = ((pPmBytearray_t)pobj)->val;
va009039 0:65f1469d6bfb 246 retval = string_printFormattedBytes(&(pb->val[0]),
va009039 0:65f1469d6bfb 247 C_TRUE,
va009039 0:65f1469d6bfb 248 ((pPmBytearray_t)pobj)->length);
va009039 0:65f1469d6bfb 249 plat_putByte(')');
va009039 0:65f1469d6bfb 250 return retval;
va009039 0:65f1469d6bfb 251 }
va009039 0:65f1469d6bfb 252 #endif /* HAVE_PRINT */
va009039 0:65f1469d6bfb 253 #endif /* HAVE_BYTEARRAY */