obj.h

Go to the documentation of this file.
00001 /*
00002 # This file is Copyright 2003, 2006, 2007, 2009 Dean Hall.
00003 #
00004 # This file is part of the PyMite VM.
00005 # The PyMite VM is free software: you can redistribute it and/or modify
00006 # it under the terms of the GNU GENERAL PUBLIC LICENSE Version 2.
00007 #
00008 # The PyMite VM is distributed in the hope that it will be useful,
00009 # but WITHOUT ANY WARRANTY; without even the implied warranty of
00010 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
00011 # A copy of the GNU GENERAL PUBLIC LICENSE Version 2
00012 # is seen in the file COPYING in this directory.
00013 */
00014 
00015 
00016 #ifndef __OBJ_H__
00017 #define __OBJ_H__
00018 
00019 
00029 #define OD_MARK_SHIFT 14
00030 #define OD_FREE_SHIFT 15
00031 #define OD_MARK_BIT (uint16_t)(1 << OD_MARK_SHIFT)
00032 #define OD_FREE_BIT (uint16_t)(1 << OD_FREE_SHIFT)
00033 #define OD_SIZE_MASK (uint16_t)(0x01FF)
00034 #define OD_TYPE_MASK (uint16_t)(0x3E00)
00035 #define OD_TYPE_SHIFT 9
00036 
00038 #define HD_SIZE_MASK (uint16_t)(0x3FFF)
00039 
00040 
00045 #define OBJ_GET_FREE(pobj) \
00046     ((((pPmObj_t)pobj)->od >> OD_FREE_SHIFT) & (uint8_t)1)
00047 
00053 #define OBJ_SET_FREE(pobj, free) \
00054     do \
00055     { \
00056         ((pPmObj_t)pobj)->od = ((uint8_t)free) \
00057                                ? ((pPmObj_t)pobj)->od | OD_FREE_BIT \
00058                                : ((pPmObj_t)pobj)->od & ~OD_FREE_BIT;\
00059     } \
00060     while (0)
00061 
00062 /*
00063  * #99: od_size bits are shifted because size is a scaled value
00064  * True size is always a multiple of 4, so the lower two bits are ignored
00065  * and two more significant bits are gained.
00066  */
00073 #define OBJ_GET_SIZE(pobj) \
00074     ((((pPmObj_t)pobj)->od & OD_FREE_BIT) \
00075      ? ((((pPmObj_t)pobj)->od & HD_SIZE_MASK) << 2) \
00076      : ((((pPmObj_t)pobj)->od & OD_SIZE_MASK) << 2))
00077 
00084 #define OBJ_SET_SIZE(pobj, size) \
00085     do \
00086     { \
00087         if (((pPmObj_t)pobj)->od & OD_FREE_BIT) \
00088         { \
00089             ((pPmObj_t)pobj)->od &= ~HD_SIZE_MASK; \
00090             ((pPmObj_t)pobj)->od |= (((size) >> 2) & HD_SIZE_MASK); \
00091         } \
00092         else \
00093         { \
00094             ((pPmObj_t)pobj)->od &= ~OD_SIZE_MASK; \
00095             ((pPmObj_t)pobj)->od |= (((size) >> 2) & OD_SIZE_MASK); \
00096         } \
00097     } \
00098     while (0)
00099 
00104 #define OBJ_GET_TYPE(pobj) \
00105     (((((pPmObj_t)pobj)->od) & OD_TYPE_MASK) >> OD_TYPE_SHIFT)
00106 
00111 #define OBJ_SET_TYPE(pobj, type) \
00112     do \
00113     { \
00114         ((pPmObj_t)pobj)->od &= ~OD_TYPE_MASK; \
00115         ((pPmObj_t)pobj)->od |= (((type) << OD_TYPE_SHIFT) & OD_TYPE_MASK); \
00116     } \
00117     while (0)
00118 
00119 
00130 typedef enum PmType_e
00131 {
00132     OBJ_TYPE_HASHABLE_MIN = 0x00,
00133 
00135     OBJ_TYPE_NON = 0x00,
00136 
00138     OBJ_TYPE_INT = 0x01,
00139 
00141     OBJ_TYPE_FLT = 0x02,
00142 
00144     OBJ_TYPE_STR = 0x03,
00145 
00147     OBJ_TYPE_TUP = 0x04,
00148 
00150     OBJ_TYPE_COB = 0x05,
00151 
00153     OBJ_TYPE_MOD = 0x06,
00154 
00156     OBJ_TYPE_CLO = 0x07,
00157 
00159     OBJ_TYPE_FXN = 0x08,
00160 
00162     OBJ_TYPE_CLI = 0x09,
00163 
00165     OBJ_TYPE_CIM = 0x0A,
00166 
00168     OBJ_TYPE_NIM = 0x0B,
00169 
00171     OBJ_TYPE_NOB = 0x0C,
00172 
00174     OBJ_TYPE_THR = 0x0D,
00175 
00177     OBJ_TYPE_BOOL = 0x0F,
00178 
00180     OBJ_TYPE_CIO = 0x10,
00181   
00183     OBJ_TYPE_MTH = 0x11,
00184     
00185     /* All types after this are not hashable */
00186     OBJ_TYPE_HASHABLE_MAX = 0x11,
00187 
00189     OBJ_TYPE_LST = 0x12,
00190 
00192     OBJ_TYPE_DIC = 0x13,
00193 
00194     /* All types after this are not accessible to the user */
00195     OBJ_TYPE_ACCESSIBLE_MAX = 0x19,
00196 
00198     OBJ_TYPE_FRM = 0x19,
00199 
00201     OBJ_TYPE_BLK = 0x1A,
00202 
00204     OBJ_TYPE_SEG = 0x1B,
00205 
00207     OBJ_TYPE_SGL = 0x1C,
00208 
00210     OBJ_TYPE_SQI = 0x1D,
00211 
00213     OBJ_TYPE_NFM = 0x1E,
00214 } PmType_t, *pPmType_t;
00215 
00216 
00241 typedef uint16_t PmObjDesc_t,
00242  *pPmObjDesc_t;
00243 
00249 typedef struct PmObj_s
00250 {
00252     PmObjDesc_t od;
00253 } PmObj_t,
00254  *pPmObj_t;
00255 
00257 typedef struct PmBoolean_s
00258 {
00260     PmObjDesc_t od;
00261 
00263     int32_t val;
00264 }
00265 PmBoolean_t, *pPmBoolean_t;
00266 
00267 
00298 PmReturn_t obj_loadFromImg(PmMemSpace_t memspace,
00299                            uint8_t const **paddr, pPmObj_t *r_pobj);
00300 
00308 PmReturn_t obj_loadFromImgObj(pPmObj_t pimg, pPmObj_t *r_pobj);
00309 
00316 int8_t obj_isFalse(pPmObj_t pobj);
00317 
00324 PmReturn_t obj_isIn(pPmObj_t pobj, pPmObj_t pitem);
00325 
00333 int8_t obj_compare(pPmObj_t pobj1, pPmObj_t pobj2);
00334 
00345 PmReturn_t obj_print(pPmObj_t pobj, uint8_t marshallString);
00346 
00347 #ifdef HAVE_BACKTICK
00348 
00356 PmReturn_t obj_repr(pPmObj_t pobj, pPmObj_t *r_pstr);
00357 #endif /* HAVE_BACKTICK */
00358 
00359 #endif /* __OBJ_H__ */

Generated on Wed Feb 24 13:37:02 2010 for Python-on-a-chip by  doxygen 1.5.9