module.c
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016 #undef __FILE_ID__
00017 #define __FILE_ID__ 0x0E
00018
00019
00028 #include "pm.h"
00029
00030
00031 PmReturn_t
00032 mod_new(pPmObj_t pco, pPmObj_t *pmod)
00033 {
00034 PmReturn_t retval;
00035 uint8_t *pchunk;
00036 pPmObj_t pobj;
00037 uint8_t objid;
00038
00039
00040 if (OBJ_GET_TYPE(pco) != OBJ_TYPE_COB)
00041 {
00042 PM_RAISE(retval, PM_RET_EX_TYPE);
00043 return retval;
00044 }
00045
00046
00047 retval = heap_getChunk(sizeof(PmFunc_t), &pchunk);
00048 PM_RETURN_IF_ERROR(retval);
00049 *pmod = (pPmObj_t)pchunk;
00050 OBJ_SET_TYPE(*pmod, OBJ_TYPE_MOD);
00051 ((pPmFunc_t)*pmod)->f_co = (pPmCo_t)pco;
00052
00053 #ifdef HAVE_DEFAULTARGS
00054
00055 ((pPmFunc_t)*pmod)->f_defaultargs = C_NULL;
00056 #endif
00057
00058 #ifdef HAVE_CLOSURES
00059
00060 ((pPmFunc_t)*pmod)->f_closure = C_NULL;
00061 #endif
00062
00063
00064 heap_gcPushTempRoot(*pmod, &objid);
00065 retval = dict_new(&pobj);
00066 heap_gcPopTempRoot(objid);
00067 ((pPmFunc_t)*pmod)->f_attrs = (pPmDict_t)pobj;
00068
00069
00070 ((pPmFunc_t)*pmod)->f_globals = (pPmDict_t)pobj;
00071
00072 return retval;
00073 }
00074
00075
00076 PmReturn_t
00077 mod_import(pPmObj_t pstr, pPmObj_t *pmod)
00078 {
00079 PmMemSpace_t memspace;
00080 uint8_t const *imgaddr = C_NULL;
00081 pPmCo_t pco = C_NULL;
00082 PmReturn_t retval = PM_RET_OK;
00083 pPmObj_t pobj;
00084 uint8_t objid;
00085
00086
00087 if (OBJ_GET_TYPE(pstr) != OBJ_TYPE_STR)
00088 {
00089 PM_RAISE(retval, PM_RET_EX_SYNTAX);
00090 return retval;
00091 }
00092
00093
00094 retval = img_findInPaths(pstr, &memspace, &imgaddr);
00095
00096
00097 if (retval == PM_RET_NO)
00098 {
00099 PM_RAISE(retval, PM_RET_EX_IMPRT);
00100 return retval;
00101 }
00102
00103
00104 retval = obj_loadFromImg(memspace, &imgaddr, &pobj);
00105 PM_RETURN_IF_ERROR(retval);
00106 pco = (pPmCo_t)pobj;
00107
00108 heap_gcPushTempRoot(pobj, &objid);
00109 retval = mod_new((pPmObj_t)pco, pmod);
00110 heap_gcPopTempRoot(objid);
00111
00112 return retval;
00113 }