Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
src/vm/obj.c@0:14e5e829dffe, 2010-07-21 (annotated)
- Committer:
- dadaista
- Date:
- Wed Jul 21 12:50:41 2010 +0000
- Revision:
- 0:14e5e829dffe
Who changed what in which revision?
| User | Revision | Line number | New contents of line |
|---|---|---|---|
| dadaista | 0:14e5e829dffe | 1 | /* |
| dadaista | 0:14e5e829dffe | 2 | # This file is Copyright 2003, 2006, 2007, 2009 Dean Hall. |
| dadaista | 0:14e5e829dffe | 3 | # |
| dadaista | 0:14e5e829dffe | 4 | # This file is part of the PyMite VM. |
| dadaista | 0:14e5e829dffe | 5 | # The PyMite VM is free software: you can redistribute it and/or modify |
| dadaista | 0:14e5e829dffe | 6 | # it under the terms of the GNU GENERAL PUBLIC LICENSE Version 2. |
| dadaista | 0:14e5e829dffe | 7 | # |
| dadaista | 0:14e5e829dffe | 8 | # The PyMite VM is distributed in the hope that it will be useful, |
| dadaista | 0:14e5e829dffe | 9 | # but WITHOUT ANY WARRANTY; without even the implied warranty of |
| dadaista | 0:14e5e829dffe | 10 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. |
| dadaista | 0:14e5e829dffe | 11 | # A copy of the GNU GENERAL PUBLIC LICENSE Version 2 |
| dadaista | 0:14e5e829dffe | 12 | # is seen in the file COPYING in this directory. |
| dadaista | 0:14e5e829dffe | 13 | */ |
| dadaista | 0:14e5e829dffe | 14 | |
| dadaista | 0:14e5e829dffe | 15 | |
| dadaista | 0:14e5e829dffe | 16 | #undef __FILE_ID__ |
| dadaista | 0:14e5e829dffe | 17 | #define __FILE_ID__ 0x0F |
| dadaista | 0:14e5e829dffe | 18 | |
| dadaista | 0:14e5e829dffe | 19 | |
| dadaista | 0:14e5e829dffe | 20 | /** |
| dadaista | 0:14e5e829dffe | 21 | * \file |
| dadaista | 0:14e5e829dffe | 22 | * \brief Object Type |
| dadaista | 0:14e5e829dffe | 23 | * |
| dadaista | 0:14e5e829dffe | 24 | * Object type operations. |
| dadaista | 0:14e5e829dffe | 25 | */ |
| dadaista | 0:14e5e829dffe | 26 | |
| dadaista | 0:14e5e829dffe | 27 | |
| dadaista | 0:14e5e829dffe | 28 | #include "pm.h" |
| dadaista | 0:14e5e829dffe | 29 | |
| dadaista | 0:14e5e829dffe | 30 | |
| dadaista | 0:14e5e829dffe | 31 | PmReturn_t |
| dadaista | 0:14e5e829dffe | 32 | obj_loadFromImg(PmMemSpace_t memspace, |
| dadaista | 0:14e5e829dffe | 33 | uint8_t const **paddr, pPmObj_t *r_pobj) |
| dadaista | 0:14e5e829dffe | 34 | { |
| dadaista | 0:14e5e829dffe | 35 | PmReturn_t retval = PM_RET_OK; |
| dadaista | 0:14e5e829dffe | 36 | PmObj_t obj; |
| dadaista | 0:14e5e829dffe | 37 | |
| dadaista | 0:14e5e829dffe | 38 | |
| dadaista | 0:14e5e829dffe | 39 | /* Get the object descriptor */ |
| dadaista | 0:14e5e829dffe | 40 | obj.od = (PmObjDesc_t)0x0000; |
| dadaista | 0:14e5e829dffe | 41 | OBJ_SET_TYPE(&obj, mem_getByte(memspace, paddr)); |
| dadaista | 0:14e5e829dffe | 42 | |
| dadaista | 0:14e5e829dffe | 43 | switch (OBJ_GET_TYPE(&obj)) |
| dadaista | 0:14e5e829dffe | 44 | { |
| dadaista | 0:14e5e829dffe | 45 | case OBJ_TYPE_NON: |
| dadaista | 0:14e5e829dffe | 46 | /* If it's the None object, return global None */ |
| dadaista | 0:14e5e829dffe | 47 | *r_pobj = PM_NONE; |
| dadaista | 0:14e5e829dffe | 48 | break; |
| dadaista | 0:14e5e829dffe | 49 | |
| dadaista | 0:14e5e829dffe | 50 | case OBJ_TYPE_INT: |
| dadaista | 0:14e5e829dffe | 51 | /* Read an integer and create an integer object with the value */ |
| dadaista | 0:14e5e829dffe | 52 | retval = int_new(mem_getInt(memspace, paddr), r_pobj); |
| dadaista | 0:14e5e829dffe | 53 | break; |
| dadaista | 0:14e5e829dffe | 54 | |
| dadaista | 0:14e5e829dffe | 55 | #ifdef HAVE_FLOAT |
| dadaista | 0:14e5e829dffe | 56 | case OBJ_TYPE_FLT: |
| dadaista | 0:14e5e829dffe | 57 | /* Read a float and create an float object with the value */ |
| dadaista | 0:14e5e829dffe | 58 | retval = float_new(mem_getFloat(memspace, paddr), r_pobj); |
| dadaista | 0:14e5e829dffe | 59 | break; |
| dadaista | 0:14e5e829dffe | 60 | #endif /* HAVE_FLOAT */ |
| dadaista | 0:14e5e829dffe | 61 | |
| dadaista | 0:14e5e829dffe | 62 | case OBJ_TYPE_STR: |
| dadaista | 0:14e5e829dffe | 63 | retval = string_loadFromImg(memspace, paddr, r_pobj); |
| dadaista | 0:14e5e829dffe | 64 | break; |
| dadaista | 0:14e5e829dffe | 65 | |
| dadaista | 0:14e5e829dffe | 66 | case OBJ_TYPE_TUP: |
| dadaista | 0:14e5e829dffe | 67 | retval = tuple_loadFromImg(memspace, paddr, r_pobj); |
| dadaista | 0:14e5e829dffe | 68 | break; |
| dadaista | 0:14e5e829dffe | 69 | |
| dadaista | 0:14e5e829dffe | 70 | case OBJ_TYPE_NIM: |
| dadaista | 0:14e5e829dffe | 71 | /* If it's a native code img, load into a code obj */ |
| dadaista | 0:14e5e829dffe | 72 | retval = no_loadFromImg(memspace, paddr, r_pobj); |
| dadaista | 0:14e5e829dffe | 73 | break; |
| dadaista | 0:14e5e829dffe | 74 | |
| dadaista | 0:14e5e829dffe | 75 | case OBJ_TYPE_CIM: |
| dadaista | 0:14e5e829dffe | 76 | /* If it's a code img, load into a code obj */ |
| dadaista | 0:14e5e829dffe | 77 | retval = co_loadFromImg(memspace, paddr, r_pobj); |
| dadaista | 0:14e5e829dffe | 78 | break; |
| dadaista | 0:14e5e829dffe | 79 | |
| dadaista | 0:14e5e829dffe | 80 | default: |
| dadaista | 0:14e5e829dffe | 81 | /* All other types should not be in an img obj */ |
| dadaista | 0:14e5e829dffe | 82 | PM_RAISE(retval, PM_RET_EX_SYS); |
| dadaista | 0:14e5e829dffe | 83 | break; |
| dadaista | 0:14e5e829dffe | 84 | } |
| dadaista | 0:14e5e829dffe | 85 | return retval; |
| dadaista | 0:14e5e829dffe | 86 | } |
| dadaista | 0:14e5e829dffe | 87 | |
| dadaista | 0:14e5e829dffe | 88 | |
| dadaista | 0:14e5e829dffe | 89 | PmReturn_t |
| dadaista | 0:14e5e829dffe | 90 | obj_loadFromImgObj(pPmObj_t pimg, pPmObj_t *r_pobj) |
| dadaista | 0:14e5e829dffe | 91 | { |
| dadaista | 0:14e5e829dffe | 92 | uint8_t const *imgaddr; |
| dadaista | 0:14e5e829dffe | 93 | PmReturn_t retval; |
| dadaista | 0:14e5e829dffe | 94 | |
| dadaista | 0:14e5e829dffe | 95 | C_ASSERT(OBJ_GET_TYPE(pimg) == OBJ_TYPE_CIO); |
| dadaista | 0:14e5e829dffe | 96 | imgaddr = (uint8_t const *)&(((pPmCodeImgObj_t)pimg)->val); |
| dadaista | 0:14e5e829dffe | 97 | |
| dadaista | 0:14e5e829dffe | 98 | retval = obj_loadFromImg(MEMSPACE_RAM, &imgaddr, r_pobj); |
| dadaista | 0:14e5e829dffe | 99 | C_ASSERT(OBJ_GET_TYPE(*r_pobj) == OBJ_TYPE_COB); |
| dadaista | 0:14e5e829dffe | 100 | |
| dadaista | 0:14e5e829dffe | 101 | /* The CO must reference the top of the code img obj */ |
| dadaista | 0:14e5e829dffe | 102 | ((pPmCo_t)*r_pobj)->co_codeimgaddr = (uint8_t const *)pimg; |
| dadaista | 0:14e5e829dffe | 103 | |
| dadaista | 0:14e5e829dffe | 104 | return retval; |
| dadaista | 0:14e5e829dffe | 105 | } |
| dadaista | 0:14e5e829dffe | 106 | |
| dadaista | 0:14e5e829dffe | 107 | |
| dadaista | 0:14e5e829dffe | 108 | /* Returns true if the obj is false */ |
| dadaista | 0:14e5e829dffe | 109 | int8_t |
| dadaista | 0:14e5e829dffe | 110 | obj_isFalse(pPmObj_t pobj) |
| dadaista | 0:14e5e829dffe | 111 | { |
| dadaista | 0:14e5e829dffe | 112 | C_ASSERT(pobj != C_NULL); |
| dadaista | 0:14e5e829dffe | 113 | |
| dadaista | 0:14e5e829dffe | 114 | switch (OBJ_GET_TYPE(pobj)) |
| dadaista | 0:14e5e829dffe | 115 | { |
| dadaista | 0:14e5e829dffe | 116 | case OBJ_TYPE_NON: |
| dadaista | 0:14e5e829dffe | 117 | /* None evaluates to false, so return true */ |
| dadaista | 0:14e5e829dffe | 118 | return C_TRUE; |
| dadaista | 0:14e5e829dffe | 119 | |
| dadaista | 0:14e5e829dffe | 120 | case OBJ_TYPE_INT: |
| dadaista | 0:14e5e829dffe | 121 | /* Only the integer zero is false */ |
| dadaista | 0:14e5e829dffe | 122 | return ((pPmInt_t)pobj)->val == 0; |
| dadaista | 0:14e5e829dffe | 123 | |
| dadaista | 0:14e5e829dffe | 124 | #ifdef HAVE_FLOAT |
| dadaista | 0:14e5e829dffe | 125 | case OBJ_TYPE_FLT: |
| dadaista | 0:14e5e829dffe | 126 | /* The floats 0.0 and -0.0 are false */ |
| dadaista | 0:14e5e829dffe | 127 | return (((pPmFloat_t) pobj)->val == 0.0) |
| dadaista | 0:14e5e829dffe | 128 | || (((pPmFloat_t) pobj)->val == -0.0); |
| dadaista | 0:14e5e829dffe | 129 | #endif /* HAVE_FLOAT */ |
| dadaista | 0:14e5e829dffe | 130 | |
| dadaista | 0:14e5e829dffe | 131 | case OBJ_TYPE_STR: |
| dadaista | 0:14e5e829dffe | 132 | /* An empty string is false */ |
| dadaista | 0:14e5e829dffe | 133 | return ((pPmString_t)pobj)->length == 0; |
| dadaista | 0:14e5e829dffe | 134 | |
| dadaista | 0:14e5e829dffe | 135 | case OBJ_TYPE_TUP: |
| dadaista | 0:14e5e829dffe | 136 | /* An empty tuple is false */ |
| dadaista | 0:14e5e829dffe | 137 | return ((pPmTuple_t)pobj)->length == 0; |
| dadaista | 0:14e5e829dffe | 138 | |
| dadaista | 0:14e5e829dffe | 139 | case OBJ_TYPE_LST: |
| dadaista | 0:14e5e829dffe | 140 | /* An empty list is false */ |
| dadaista | 0:14e5e829dffe | 141 | return ((pPmList_t)pobj)->length == 0; |
| dadaista | 0:14e5e829dffe | 142 | |
| dadaista | 0:14e5e829dffe | 143 | case OBJ_TYPE_DIC: |
| dadaista | 0:14e5e829dffe | 144 | /* An empty dict is false */ |
| dadaista | 0:14e5e829dffe | 145 | return ((pPmDict_t)pobj)->length == 0; |
| dadaista | 0:14e5e829dffe | 146 | |
| dadaista | 0:14e5e829dffe | 147 | case OBJ_TYPE_BOOL: |
| dadaista | 0:14e5e829dffe | 148 | /* C int zero means false */ |
| dadaista | 0:14e5e829dffe | 149 | return ((pPmBoolean_t) pobj)->val == 0; |
| dadaista | 0:14e5e829dffe | 150 | |
| dadaista | 0:14e5e829dffe | 151 | default: |
| dadaista | 0:14e5e829dffe | 152 | /* |
| dadaista | 0:14e5e829dffe | 153 | * The following types are always not false: |
| dadaista | 0:14e5e829dffe | 154 | * CodeObj, Function, Module, Class, ClassInstance. |
| dadaista | 0:14e5e829dffe | 155 | */ |
| dadaista | 0:14e5e829dffe | 156 | return C_FALSE; |
| dadaista | 0:14e5e829dffe | 157 | } |
| dadaista | 0:14e5e829dffe | 158 | } |
| dadaista | 0:14e5e829dffe | 159 | |
| dadaista | 0:14e5e829dffe | 160 | |
| dadaista | 0:14e5e829dffe | 161 | /* Returns true if the item is in the container object */ |
| dadaista | 0:14e5e829dffe | 162 | PmReturn_t |
| dadaista | 0:14e5e829dffe | 163 | obj_isIn(pPmObj_t pobj, pPmObj_t pitem) |
| dadaista | 0:14e5e829dffe | 164 | { |
| dadaista | 0:14e5e829dffe | 165 | PmReturn_t retval = PM_RET_NO; |
| dadaista | 0:14e5e829dffe | 166 | pPmObj_t ptestItem; |
| dadaista | 0:14e5e829dffe | 167 | int16_t i; |
| dadaista | 0:14e5e829dffe | 168 | uint8_t c; |
| dadaista | 0:14e5e829dffe | 169 | |
| dadaista | 0:14e5e829dffe | 170 | switch (OBJ_GET_TYPE(pobj)) |
| dadaista | 0:14e5e829dffe | 171 | { |
| dadaista | 0:14e5e829dffe | 172 | case OBJ_TYPE_TUP: |
| dadaista | 0:14e5e829dffe | 173 | /* Iterate over tuple to find item */ |
| dadaista | 0:14e5e829dffe | 174 | for (i = 0; i < ((pPmTuple_t)pobj)->length; i++) |
| dadaista | 0:14e5e829dffe | 175 | { |
| dadaista | 0:14e5e829dffe | 176 | PM_RETURN_IF_ERROR(tuple_getItem(pobj, i, &ptestItem)); |
| dadaista | 0:14e5e829dffe | 177 | |
| dadaista | 0:14e5e829dffe | 178 | if (obj_compare(pitem, ptestItem) == C_SAME) |
| dadaista | 0:14e5e829dffe | 179 | { |
| dadaista | 0:14e5e829dffe | 180 | retval = PM_RET_OK; |
| dadaista | 0:14e5e829dffe | 181 | break; |
| dadaista | 0:14e5e829dffe | 182 | } |
| dadaista | 0:14e5e829dffe | 183 | } |
| dadaista | 0:14e5e829dffe | 184 | break; |
| dadaista | 0:14e5e829dffe | 185 | |
| dadaista | 0:14e5e829dffe | 186 | case OBJ_TYPE_STR: |
| dadaista | 0:14e5e829dffe | 187 | /* Raise a TypeError if item is not a string */ |
| dadaista | 0:14e5e829dffe | 188 | if ((OBJ_GET_TYPE(pitem) != OBJ_TYPE_STR)) |
| dadaista | 0:14e5e829dffe | 189 | { |
| dadaista | 0:14e5e829dffe | 190 | retval = PM_RET_EX_TYPE; |
| dadaista | 0:14e5e829dffe | 191 | break; |
| dadaista | 0:14e5e829dffe | 192 | } |
| dadaista | 0:14e5e829dffe | 193 | |
| dadaista | 0:14e5e829dffe | 194 | /* Empty string is alway present */ |
| dadaista | 0:14e5e829dffe | 195 | if (((pPmString_t)pitem)->length == 0) |
| dadaista | 0:14e5e829dffe | 196 | { |
| dadaista | 0:14e5e829dffe | 197 | retval = PM_RET_OK; |
| dadaista | 0:14e5e829dffe | 198 | break; |
| dadaista | 0:14e5e829dffe | 199 | } |
| dadaista | 0:14e5e829dffe | 200 | |
| dadaista | 0:14e5e829dffe | 201 | /* Raise a ValueError if the string is more than 1 char */ |
| dadaista | 0:14e5e829dffe | 202 | else if (((pPmString_t)pitem)->length != 1) |
| dadaista | 0:14e5e829dffe | 203 | { |
| dadaista | 0:14e5e829dffe | 204 | retval = PM_RET_EX_VAL; |
| dadaista | 0:14e5e829dffe | 205 | break; |
| dadaista | 0:14e5e829dffe | 206 | } |
| dadaista | 0:14e5e829dffe | 207 | |
| dadaista | 0:14e5e829dffe | 208 | /* Iterate over string to find char */ |
| dadaista | 0:14e5e829dffe | 209 | c = ((pPmString_t)pitem)->val[0]; |
| dadaista | 0:14e5e829dffe | 210 | for (i = 0; i < ((pPmString_t)pobj)->length; i++) |
| dadaista | 0:14e5e829dffe | 211 | { |
| dadaista | 0:14e5e829dffe | 212 | if (c == ((pPmString_t)pobj)->val[i]) |
| dadaista | 0:14e5e829dffe | 213 | { |
| dadaista | 0:14e5e829dffe | 214 | retval = PM_RET_OK; |
| dadaista | 0:14e5e829dffe | 215 | break; |
| dadaista | 0:14e5e829dffe | 216 | } |
| dadaista | 0:14e5e829dffe | 217 | } |
| dadaista | 0:14e5e829dffe | 218 | break; |
| dadaista | 0:14e5e829dffe | 219 | |
| dadaista | 0:14e5e829dffe | 220 | case OBJ_TYPE_LST: |
| dadaista | 0:14e5e829dffe | 221 | /* Iterate over list to find item */ |
| dadaista | 0:14e5e829dffe | 222 | for (i = 0; i < ((pPmList_t)pobj)->length; i++) |
| dadaista | 0:14e5e829dffe | 223 | { |
| dadaista | 0:14e5e829dffe | 224 | PM_RETURN_IF_ERROR(list_getItem(pobj, i, &ptestItem)); |
| dadaista | 0:14e5e829dffe | 225 | |
| dadaista | 0:14e5e829dffe | 226 | if (obj_compare(pitem, ptestItem) == C_SAME) |
| dadaista | 0:14e5e829dffe | 227 | { |
| dadaista | 0:14e5e829dffe | 228 | retval = PM_RET_OK; |
| dadaista | 0:14e5e829dffe | 229 | break; |
| dadaista | 0:14e5e829dffe | 230 | } |
| dadaista | 0:14e5e829dffe | 231 | } |
| dadaista | 0:14e5e829dffe | 232 | break; |
| dadaista | 0:14e5e829dffe | 233 | |
| dadaista | 0:14e5e829dffe | 234 | case OBJ_TYPE_DIC: |
| dadaista | 0:14e5e829dffe | 235 | /* Check if the item is one of the keys of the dict */ |
| dadaista | 0:14e5e829dffe | 236 | retval = dict_getItem(pobj, pitem, &ptestItem); |
| dadaista | 0:14e5e829dffe | 237 | if (retval == PM_RET_EX_KEY) |
| dadaista | 0:14e5e829dffe | 238 | { |
| dadaista | 0:14e5e829dffe | 239 | retval = PM_RET_NO; |
| dadaista | 0:14e5e829dffe | 240 | } |
| dadaista | 0:14e5e829dffe | 241 | break; |
| dadaista | 0:14e5e829dffe | 242 | |
| dadaista | 0:14e5e829dffe | 243 | default: |
| dadaista | 0:14e5e829dffe | 244 | retval = PM_RET_EX_TYPE; |
| dadaista | 0:14e5e829dffe | 245 | break; |
| dadaista | 0:14e5e829dffe | 246 | } |
| dadaista | 0:14e5e829dffe | 247 | |
| dadaista | 0:14e5e829dffe | 248 | return retval; |
| dadaista | 0:14e5e829dffe | 249 | } |
| dadaista | 0:14e5e829dffe | 250 | |
| dadaista | 0:14e5e829dffe | 251 | |
| dadaista | 0:14e5e829dffe | 252 | int8_t |
| dadaista | 0:14e5e829dffe | 253 | obj_compare(pPmObj_t pobj1, pPmObj_t pobj2) |
| dadaista | 0:14e5e829dffe | 254 | { |
| dadaista | 0:14e5e829dffe | 255 | #ifdef HAVE_BYTEARRAY |
| dadaista | 0:14e5e829dffe | 256 | PmReturn_t retval; |
| dadaista | 0:14e5e829dffe | 257 | pPmObj_t pobj; |
| dadaista | 0:14e5e829dffe | 258 | #endif /* HAVE_BYTEARRAY */ |
| dadaista | 0:14e5e829dffe | 259 | |
| dadaista | 0:14e5e829dffe | 260 | C_ASSERT(pobj1 != C_NULL); |
| dadaista | 0:14e5e829dffe | 261 | C_ASSERT(pobj2 != C_NULL); |
| dadaista | 0:14e5e829dffe | 262 | |
| dadaista | 0:14e5e829dffe | 263 | /* Check if pointers are same */ |
| dadaista | 0:14e5e829dffe | 264 | if (pobj1 == pobj2) |
| dadaista | 0:14e5e829dffe | 265 | { |
| dadaista | 0:14e5e829dffe | 266 | return C_SAME; |
| dadaista | 0:14e5e829dffe | 267 | } |
| dadaista | 0:14e5e829dffe | 268 | |
| dadaista | 0:14e5e829dffe | 269 | /* If types are different, objs must differ */ |
| dadaista | 0:14e5e829dffe | 270 | if (OBJ_GET_TYPE(pobj1) != OBJ_GET_TYPE(pobj2)) |
| dadaista | 0:14e5e829dffe | 271 | { |
| dadaista | 0:14e5e829dffe | 272 | return C_DIFFER; |
| dadaista | 0:14e5e829dffe | 273 | } |
| dadaista | 0:14e5e829dffe | 274 | |
| dadaista | 0:14e5e829dffe | 275 | #ifdef HAVE_BYTEARRAY |
| dadaista | 0:14e5e829dffe | 276 | /* If object is an instance, get the thing it contains */ |
| dadaista | 0:14e5e829dffe | 277 | if (OBJ_GET_TYPE(pobj1) == OBJ_TYPE_CLI) |
| dadaista | 0:14e5e829dffe | 278 | { |
| dadaista | 0:14e5e829dffe | 279 | retval = dict_getItem((pPmObj_t)((pPmInstance_t)pobj1)->cli_attrs, |
| dadaista | 0:14e5e829dffe | 280 | PM_NONE, |
| dadaista | 0:14e5e829dffe | 281 | &pobj); |
| dadaista | 0:14e5e829dffe | 282 | PM_RETURN_IF_ERROR(retval); |
| dadaista | 0:14e5e829dffe | 283 | pobj1 = pobj; |
| dadaista | 0:14e5e829dffe | 284 | } |
| dadaista | 0:14e5e829dffe | 285 | if (OBJ_GET_TYPE(pobj2) == OBJ_TYPE_CLI) |
| dadaista | 0:14e5e829dffe | 286 | { |
| dadaista | 0:14e5e829dffe | 287 | retval = dict_getItem((pPmObj_t)((pPmInstance_t)pobj2)->cli_attrs, |
| dadaista | 0:14e5e829dffe | 288 | PM_NONE, |
| dadaista | 0:14e5e829dffe | 289 | &pobj); |
| dadaista | 0:14e5e829dffe | 290 | PM_RETURN_IF_ERROR(retval); |
| dadaista | 0:14e5e829dffe | 291 | pobj2 = pobj; |
| dadaista | 0:14e5e829dffe | 292 | } |
| dadaista | 0:14e5e829dffe | 293 | |
| dadaista | 0:14e5e829dffe | 294 | /* If types are different, objs must differ */ |
| dadaista | 0:14e5e829dffe | 295 | if (OBJ_GET_TYPE(pobj1) != OBJ_GET_TYPE(pobj2)) |
| dadaista | 0:14e5e829dffe | 296 | { |
| dadaista | 0:14e5e829dffe | 297 | return C_DIFFER; |
| dadaista | 0:14e5e829dffe | 298 | } |
| dadaista | 0:14e5e829dffe | 299 | #endif /* HAVE_BYTEARRAY */ |
| dadaista | 0:14e5e829dffe | 300 | |
| dadaista | 0:14e5e829dffe | 301 | /* Otherwise handle types individually */ |
| dadaista | 0:14e5e829dffe | 302 | switch (OBJ_GET_TYPE(pobj1)) |
| dadaista | 0:14e5e829dffe | 303 | { |
| dadaista | 0:14e5e829dffe | 304 | case OBJ_TYPE_NON: |
| dadaista | 0:14e5e829dffe | 305 | return C_SAME; |
| dadaista | 0:14e5e829dffe | 306 | |
| dadaista | 0:14e5e829dffe | 307 | case OBJ_TYPE_INT: |
| dadaista | 0:14e5e829dffe | 308 | return ((pPmInt_t)pobj1)->val == |
| dadaista | 0:14e5e829dffe | 309 | ((pPmInt_t)pobj2)->val ? C_SAME : C_DIFFER; |
| dadaista | 0:14e5e829dffe | 310 | |
| dadaista | 0:14e5e829dffe | 311 | #ifdef HAVE_FLOAT |
| dadaista | 0:14e5e829dffe | 312 | case OBJ_TYPE_FLT: |
| dadaista | 0:14e5e829dffe | 313 | { |
| dadaista | 0:14e5e829dffe | 314 | pPmObj_t r_pobj; |
| dadaista | 0:14e5e829dffe | 315 | |
| dadaista | 0:14e5e829dffe | 316 | float_compare(pobj1, pobj2, &r_pobj, COMP_EQ); |
| dadaista | 0:14e5e829dffe | 317 | return (r_pobj == PM_TRUE) ? C_SAME : C_DIFFER; |
| dadaista | 0:14e5e829dffe | 318 | } |
| dadaista | 0:14e5e829dffe | 319 | #endif /* HAVE_FLOAT */ |
| dadaista | 0:14e5e829dffe | 320 | |
| dadaista | 0:14e5e829dffe | 321 | case OBJ_TYPE_STR: |
| dadaista | 0:14e5e829dffe | 322 | return string_compare((pPmString_t)pobj1, (pPmString_t)pobj2); |
| dadaista | 0:14e5e829dffe | 323 | |
| dadaista | 0:14e5e829dffe | 324 | case OBJ_TYPE_TUP: |
| dadaista | 0:14e5e829dffe | 325 | case OBJ_TYPE_LST: |
| dadaista | 0:14e5e829dffe | 326 | #ifdef HAVE_BYTEARRAY |
| dadaista | 0:14e5e829dffe | 327 | case OBJ_TYPE_BYA: |
| dadaista | 0:14e5e829dffe | 328 | #endif /* HAVE_BYTEARRAY */ |
| dadaista | 0:14e5e829dffe | 329 | return seq_compare(pobj1, pobj2); |
| dadaista | 0:14e5e829dffe | 330 | |
| dadaista | 0:14e5e829dffe | 331 | case OBJ_TYPE_DIC: |
| dadaista | 0:14e5e829dffe | 332 | /* #17: PyMite does not support Dict comparisons (yet) */ |
| dadaista | 0:14e5e829dffe | 333 | default: |
| dadaista | 0:14e5e829dffe | 334 | break; |
| dadaista | 0:14e5e829dffe | 335 | } |
| dadaista | 0:14e5e829dffe | 336 | |
| dadaista | 0:14e5e829dffe | 337 | /* All other types would need same pointer to be true */ |
| dadaista | 0:14e5e829dffe | 338 | return C_DIFFER; |
| dadaista | 0:14e5e829dffe | 339 | } |
| dadaista | 0:14e5e829dffe | 340 | |
| dadaista | 0:14e5e829dffe | 341 | |
| dadaista | 0:14e5e829dffe | 342 | #ifdef HAVE_PRINT |
| dadaista | 0:14e5e829dffe | 343 | PmReturn_t |
| dadaista | 0:14e5e829dffe | 344 | obj_print(pPmObj_t pobj, uint8_t marshallString) |
| dadaista | 0:14e5e829dffe | 345 | { |
| dadaista | 0:14e5e829dffe | 346 | PmReturn_t retval = PM_RET_OK; |
| dadaista | 0:14e5e829dffe | 347 | |
| dadaista | 0:14e5e829dffe | 348 | C_ASSERT(pobj != C_NULL); |
| dadaista | 0:14e5e829dffe | 349 | |
| dadaista | 0:14e5e829dffe | 350 | switch (OBJ_GET_TYPE(pobj)) |
| dadaista | 0:14e5e829dffe | 351 | { |
| dadaista | 0:14e5e829dffe | 352 | case OBJ_TYPE_NON: |
| dadaista | 0:14e5e829dffe | 353 | if (marshallString) |
| dadaista | 0:14e5e829dffe | 354 | { |
| dadaista | 0:14e5e829dffe | 355 | plat_putByte('N'); |
| dadaista | 0:14e5e829dffe | 356 | plat_putByte('o'); |
| dadaista | 0:14e5e829dffe | 357 | plat_putByte('n'); |
| dadaista | 0:14e5e829dffe | 358 | retval = plat_putByte('e'); |
| dadaista | 0:14e5e829dffe | 359 | } |
| dadaista | 0:14e5e829dffe | 360 | break; |
| dadaista | 0:14e5e829dffe | 361 | case OBJ_TYPE_INT: |
| dadaista | 0:14e5e829dffe | 362 | retval = int_print(pobj); |
| dadaista | 0:14e5e829dffe | 363 | break; |
| dadaista | 0:14e5e829dffe | 364 | #ifdef HAVE_FLOAT |
| dadaista | 0:14e5e829dffe | 365 | case OBJ_TYPE_FLT: |
| dadaista | 0:14e5e829dffe | 366 | retval = float_print(pobj); |
| dadaista | 0:14e5e829dffe | 367 | break; |
| dadaista | 0:14e5e829dffe | 368 | #endif /* HAVE_FLOAT */ |
| dadaista | 0:14e5e829dffe | 369 | case OBJ_TYPE_STR: |
| dadaista | 0:14e5e829dffe | 370 | retval = string_print(pobj, marshallString); |
| dadaista | 0:14e5e829dffe | 371 | break; |
| dadaista | 0:14e5e829dffe | 372 | case OBJ_TYPE_TUP: |
| dadaista | 0:14e5e829dffe | 373 | retval = tuple_print(pobj); |
| dadaista | 0:14e5e829dffe | 374 | break; |
| dadaista | 0:14e5e829dffe | 375 | case OBJ_TYPE_LST: |
| dadaista | 0:14e5e829dffe | 376 | retval = list_print(pobj); |
| dadaista | 0:14e5e829dffe | 377 | break; |
| dadaista | 0:14e5e829dffe | 378 | case OBJ_TYPE_DIC: |
| dadaista | 0:14e5e829dffe | 379 | retval = dict_print(pobj); |
| dadaista | 0:14e5e829dffe | 380 | break; |
| dadaista | 0:14e5e829dffe | 381 | case OBJ_TYPE_BOOL: |
| dadaista | 0:14e5e829dffe | 382 | if (((pPmBoolean_t) pobj)->val == C_TRUE) |
| dadaista | 0:14e5e829dffe | 383 | { |
| dadaista | 0:14e5e829dffe | 384 | plat_putByte('T'); |
| dadaista | 0:14e5e829dffe | 385 | plat_putByte('r'); |
| dadaista | 0:14e5e829dffe | 386 | plat_putByte('u'); |
| dadaista | 0:14e5e829dffe | 387 | } |
| dadaista | 0:14e5e829dffe | 388 | else |
| dadaista | 0:14e5e829dffe | 389 | { |
| dadaista | 0:14e5e829dffe | 390 | plat_putByte('F'); |
| dadaista | 0:14e5e829dffe | 391 | plat_putByte('a'); |
| dadaista | 0:14e5e829dffe | 392 | plat_putByte('l'); |
| dadaista | 0:14e5e829dffe | 393 | plat_putByte('s'); |
| dadaista | 0:14e5e829dffe | 394 | } |
| dadaista | 0:14e5e829dffe | 395 | retval = plat_putByte('e'); |
| dadaista | 0:14e5e829dffe | 396 | break; |
| dadaista | 0:14e5e829dffe | 397 | |
| dadaista | 0:14e5e829dffe | 398 | case OBJ_TYPE_CLI: |
| dadaista | 0:14e5e829dffe | 399 | #ifdef HAVE_BYTEARRAY |
| dadaista | 0:14e5e829dffe | 400 | { |
| dadaista | 0:14e5e829dffe | 401 | pPmObj_t pobj2; |
| dadaista | 0:14e5e829dffe | 402 | |
| dadaista | 0:14e5e829dffe | 403 | retval = dict_getItem((pPmObj_t)((pPmInstance_t)pobj)->cli_attrs, |
| dadaista | 0:14e5e829dffe | 404 | PM_NONE, |
| dadaista | 0:14e5e829dffe | 405 | (pPmObj_t *)&pobj2); |
| dadaista | 0:14e5e829dffe | 406 | if ((retval == PM_RET_OK) |
| dadaista | 0:14e5e829dffe | 407 | && (OBJ_GET_TYPE(pobj2) == OBJ_TYPE_BYA)) |
| dadaista | 0:14e5e829dffe | 408 | { |
| dadaista | 0:14e5e829dffe | 409 | retval = bytearray_print(pobj2); |
| dadaista | 0:14e5e829dffe | 410 | break; |
| dadaista | 0:14e5e829dffe | 411 | } |
| dadaista | 0:14e5e829dffe | 412 | } |
| dadaista | 0:14e5e829dffe | 413 | #endif /* HAVE_BYTEARRAY */ |
| dadaista | 0:14e5e829dffe | 414 | |
| dadaista | 0:14e5e829dffe | 415 | case OBJ_TYPE_COB: |
| dadaista | 0:14e5e829dffe | 416 | case OBJ_TYPE_MOD: |
| dadaista | 0:14e5e829dffe | 417 | case OBJ_TYPE_CLO: |
| dadaista | 0:14e5e829dffe | 418 | case OBJ_TYPE_FXN: |
| dadaista | 0:14e5e829dffe | 419 | case OBJ_TYPE_CIM: |
| dadaista | 0:14e5e829dffe | 420 | case OBJ_TYPE_NIM: |
| dadaista | 0:14e5e829dffe | 421 | case OBJ_TYPE_NOB: |
| dadaista | 0:14e5e829dffe | 422 | case OBJ_TYPE_THR: |
| dadaista | 0:14e5e829dffe | 423 | case OBJ_TYPE_CIO: |
| dadaista | 0:14e5e829dffe | 424 | case OBJ_TYPE_MTH: |
| dadaista | 0:14e5e829dffe | 425 | case OBJ_TYPE_SQI: |
| dadaista | 0:14e5e829dffe | 426 | if (marshallString) |
| dadaista | 0:14e5e829dffe | 427 | { |
| dadaista | 0:14e5e829dffe | 428 | retval = plat_putByte('\''); |
| dadaista | 0:14e5e829dffe | 429 | PM_RETURN_IF_ERROR(retval); |
| dadaista | 0:14e5e829dffe | 430 | } |
| dadaista | 0:14e5e829dffe | 431 | plat_putByte('<'); |
| dadaista | 0:14e5e829dffe | 432 | plat_putByte('o'); |
| dadaista | 0:14e5e829dffe | 433 | plat_putByte('b'); |
| dadaista | 0:14e5e829dffe | 434 | plat_putByte('j'); |
| dadaista | 0:14e5e829dffe | 435 | plat_putByte(' '); |
| dadaista | 0:14e5e829dffe | 436 | plat_putByte('t'); |
| dadaista | 0:14e5e829dffe | 437 | plat_putByte('y'); |
| dadaista | 0:14e5e829dffe | 438 | plat_putByte('p'); |
| dadaista | 0:14e5e829dffe | 439 | plat_putByte('e'); |
| dadaista | 0:14e5e829dffe | 440 | plat_putByte(' '); |
| dadaista | 0:14e5e829dffe | 441 | plat_putByte('0'); |
| dadaista | 0:14e5e829dffe | 442 | plat_putByte('x'); |
| dadaista | 0:14e5e829dffe | 443 | int_printHexByte(OBJ_GET_TYPE(pobj)); |
| dadaista | 0:14e5e829dffe | 444 | plat_putByte(' '); |
| dadaista | 0:14e5e829dffe | 445 | plat_putByte('@'); |
| dadaista | 0:14e5e829dffe | 446 | plat_putByte(' '); |
| dadaista | 0:14e5e829dffe | 447 | plat_putByte('0'); |
| dadaista | 0:14e5e829dffe | 448 | plat_putByte('x'); |
| dadaista | 0:14e5e829dffe | 449 | _int_printHex((intptr_t)pobj); |
| dadaista | 0:14e5e829dffe | 450 | retval = plat_putByte('>'); |
| dadaista | 0:14e5e829dffe | 451 | if (marshallString) |
| dadaista | 0:14e5e829dffe | 452 | { |
| dadaista | 0:14e5e829dffe | 453 | retval = plat_putByte('\''); |
| dadaista | 0:14e5e829dffe | 454 | } |
| dadaista | 0:14e5e829dffe | 455 | break; |
| dadaista | 0:14e5e829dffe | 456 | |
| dadaista | 0:14e5e829dffe | 457 | default: |
| dadaista | 0:14e5e829dffe | 458 | /* Otherwise raise a TypeError */ |
| dadaista | 0:14e5e829dffe | 459 | PM_RAISE(retval, PM_RET_EX_TYPE); |
| dadaista | 0:14e5e829dffe | 460 | break; |
| dadaista | 0:14e5e829dffe | 461 | } |
| dadaista | 0:14e5e829dffe | 462 | return retval; |
| dadaista | 0:14e5e829dffe | 463 | } |
| dadaista | 0:14e5e829dffe | 464 | #endif /* HAVE_PRINT */ |
| dadaista | 0:14e5e829dffe | 465 | |
| dadaista | 0:14e5e829dffe | 466 | |
| dadaista | 0:14e5e829dffe | 467 | #ifdef HAVE_BACKTICK |
| dadaista | 0:14e5e829dffe | 468 | PmReturn_t |
| dadaista | 0:14e5e829dffe | 469 | obj_repr(pPmObj_t pobj, pPmObj_t *r_pstr) |
| dadaista | 0:14e5e829dffe | 470 | { |
| dadaista | 0:14e5e829dffe | 471 | uint8_t tBuffer[32]; |
| dadaista | 0:14e5e829dffe | 472 | uint8_t bytesWritten = 0; |
| dadaista | 0:14e5e829dffe | 473 | PmReturn_t retval = PM_RET_OK; |
| dadaista | 0:14e5e829dffe | 474 | uint8_t const *pcstr = (uint8_t *)tBuffer;; |
| dadaista | 0:14e5e829dffe | 475 | |
| dadaista | 0:14e5e829dffe | 476 | C_ASSERT(pobj != C_NULL); |
| dadaista | 0:14e5e829dffe | 477 | |
| dadaista | 0:14e5e829dffe | 478 | switch (OBJ_GET_TYPE(pobj)) |
| dadaista | 0:14e5e829dffe | 479 | { |
| dadaista | 0:14e5e829dffe | 480 | case OBJ_TYPE_INT: |
| dadaista | 0:14e5e829dffe | 481 | bytesWritten = snprintf((char *)&tBuffer, sizeof(tBuffer), "%li", |
| dadaista | 0:14e5e829dffe | 482 | (long)((pPmInt_t)pobj)->val); |
| dadaista | 0:14e5e829dffe | 483 | retval = string_new(&pcstr, r_pstr); |
| dadaista | 0:14e5e829dffe | 484 | break; |
| dadaista | 0:14e5e829dffe | 485 | |
| dadaista | 0:14e5e829dffe | 486 | #ifdef HAVE_FLOAT |
| dadaista | 0:14e5e829dffe | 487 | case OBJ_TYPE_FLT: |
| dadaista | 0:14e5e829dffe | 488 | bytesWritten = snprintf((char *)&tBuffer, sizeof(tBuffer), "%f", |
| dadaista | 0:14e5e829dffe | 489 | ((pPmFloat_t)pobj)->val); |
| dadaista | 0:14e5e829dffe | 490 | retval = string_new(&pcstr, r_pstr); |
| dadaista | 0:14e5e829dffe | 491 | break; |
| dadaista | 0:14e5e829dffe | 492 | #endif /* HAVE_FLOAT */ |
| dadaista | 0:14e5e829dffe | 493 | |
| dadaista | 0:14e5e829dffe | 494 | default: |
| dadaista | 0:14e5e829dffe | 495 | /* Otherwise raise a TypeError */ |
| dadaista | 0:14e5e829dffe | 496 | PM_RAISE(retval, PM_RET_EX_TYPE); |
| dadaista | 0:14e5e829dffe | 497 | break; |
| dadaista | 0:14e5e829dffe | 498 | } |
| dadaista | 0:14e5e829dffe | 499 | |
| dadaista | 0:14e5e829dffe | 500 | /* Sanity check */ |
| dadaista | 0:14e5e829dffe | 501 | C_ASSERT(bytesWritten < sizeof(tBuffer)); |
| dadaista | 0:14e5e829dffe | 502 | |
| dadaista | 0:14e5e829dffe | 503 | return retval; |
| dadaista | 0:14e5e829dffe | 504 | } |
| dadaista | 0:14e5e829dffe | 505 | #endif /* HAVE_BACKTICK */ |