davide carboni / Mbed 2 deprecated pymite_http_get

Dependencies:   mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers codeobj.c Source File

codeobj.c

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 #undef __FILE_ID__
00017 #define __FILE_ID__ 0x01
00018 
00019 
00020 /**
00021  * \file
00022  * \brief CodeObj Type
00023  *
00024  * CodeObj type operations.
00025  */
00026 
00027 
00028 #include "pm.h"
00029 
00030 
00031 PmReturn_t
00032 co_loadFromImg(PmMemSpace_t memspace, uint8_t const **paddr, pPmObj_t *r_pco)
00033 {
00034     PmReturn_t retval = PM_RET_OK;
00035     pPmObj_t pobj;
00036     pPmCo_t pco = C_NULL;
00037     uint8_t *pchunk;
00038 
00039     /* Store ptr to top of code img (less type byte) */
00040     uint8_t const *pci = *paddr - 1;
00041 
00042     /* Get size of code img */
00043     uint16_t size = mem_getWord(memspace, paddr);
00044 
00045     /* Allocate a code obj */
00046     retval = heap_getChunk(sizeof(PmCo_t), &pchunk);
00047     PM_RETURN_IF_ERROR(retval);
00048     pco = (pPmCo_t)pchunk;
00049 
00050     /* Fill in the CO struct */
00051     OBJ_SET_TYPE(pco, OBJ_TYPE_COB);
00052     pco->co_memspace = memspace;
00053     pco->co_codeimgaddr = pci;
00054     pco->co_argcount = mem_getByte(memspace, paddr);;
00055     pco->co_flags = mem_getByte(memspace, paddr);;
00056 
00057 #ifdef HAVE_CLOSURES
00058     /* Get number of local and free variables */
00059     *paddr = pci + CI_NLOCALS_FIELD;
00060     pco->co_nlocals = mem_getByte(memspace, paddr);
00061     pco->co_nfreevars = mem_getByte(memspace, paddr);
00062 #else
00063     *paddr = pci + CI_NAMES_FIELD;
00064 #endif /* HAVE_CLOSURES */
00065 
00066     /* Load names (tuple obj) */
00067     retval = obj_loadFromImg(memspace, paddr, &pobj);
00068     PM_RETURN_IF_ERROR(retval);
00069     pco->co_names = (pPmTuple_t)pobj;
00070 
00071     /* Load consts (tuple obj) assume it follows names */
00072     retval = obj_loadFromImg(memspace, paddr, &pobj);
00073     PM_RETURN_IF_ERROR(retval);
00074     pco->co_consts = (pPmTuple_t)pobj;
00075 
00076 #ifdef HAVE_CLOSURES
00077     retval = obj_loadFromImg(memspace, paddr, &pobj);
00078     PM_RETURN_IF_ERROR(retval);
00079 
00080     /* Save RAM, don't keep empty tuple */
00081     if (((pPmTuple_t)pobj)->length == 0)
00082     {
00083         heap_freeChunk(pobj);
00084         pco->co_cellvars = C_NULL;
00085     }
00086     else
00087     {
00088         pco->co_cellvars = (pPmTuple_t)pobj;
00089     }
00090 #endif /* HAVE_CLOSURES */
00091 
00092     /* Start of bcode always follows consts */
00093     pco->co_codeaddr = *paddr;
00094 
00095     /* Set addr to point one past end of img */
00096     *paddr = pci + size;
00097 
00098     *r_pco = (pPmObj_t)pco;
00099     return PM_RET_OK;
00100 }
00101 
00102 
00103 PmReturn_t
00104 no_loadFromImg(PmMemSpace_t memspace, uint8_t const **paddr, pPmObj_t *r_pno)
00105 {
00106     PmReturn_t retval = PM_RET_OK;
00107     pPmNo_t pno = C_NULL;
00108     uint8_t *pchunk;
00109 
00110     /* Allocate a code obj */
00111     retval = heap_getChunk(sizeof(PmNo_t), &pchunk);
00112     PM_RETURN_IF_ERROR(retval);
00113     pno = (pPmNo_t)pchunk;
00114 
00115     /* Fill in the NO struct */
00116     OBJ_SET_TYPE(pno, OBJ_TYPE_NOB);
00117     pno->no_argcount = mem_getByte(memspace, paddr);
00118 
00119     /* Get index into native fxn table */
00120     pno->no_funcindx = (int16_t)mem_getWord(memspace, paddr);
00121 
00122     *r_pno = (pPmObj_t)pno;
00123     return PM_RET_OK;
00124 }