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.
global.c
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__ 0x05 00018 00019 00020 /** 00021 * \file 00022 * \brief VM Globals 00023 * 00024 * VM globals operations. 00025 * PyMite's global struct def and initial values. 00026 */ 00027 00028 00029 #include "pm.h" 00030 00031 00032 extern unsigned char const *stdlib_img; 00033 00034 static uint8_t const *bistr = (uint8_t const *)"__bi"; 00035 00036 00037 /** Most PyMite globals all in one convenient place */ 00038 volatile PmVmGlobal_t gVmGlobal; 00039 00040 00041 PmReturn_t 00042 global_init(void) 00043 { 00044 PmReturn_t retval; 00045 uint8_t *codestr = (uint8_t *)"code"; 00046 uint8_t *pchunk; 00047 pPmObj_t pobj; 00048 #ifdef HAVE_CLASSES 00049 uint8_t const *initstr = (uint8_t const *)"__init__"; 00050 #endif /* HAVE_CLASSES */ 00051 #ifdef HAVE_GENERATORS 00052 uint8_t const *genstr = (uint8_t const *)"Generator"; 00053 uint8_t const *nextstr = (uint8_t const *)"next"; 00054 #endif /* HAVE_GENERATORS */ 00055 #ifdef HAVE_ASSERT 00056 uint8_t const *exnstr = (uint8_t const *)"Exception"; 00057 #endif /* HAVE_ASSERT */ 00058 00059 /* Clear the global struct */ 00060 sli_memset((uint8_t *)&gVmGlobal, '\0', sizeof(PmVmGlobal_t)); 00061 00062 /* Set the PyMite release num (for debug and post mortem) */ 00063 gVmGlobal.errVmRelease = PM_RELEASE; 00064 00065 /* Init zero */ 00066 retval = heap_getChunk(sizeof(PmInt_t), &pchunk); 00067 PM_RETURN_IF_ERROR(retval); 00068 pobj = (pPmObj_t)pchunk; 00069 OBJ_SET_TYPE(pobj, OBJ_TYPE_INT); 00070 ((pPmInt_t)pobj)->val = (int32_t)0; 00071 gVmGlobal.pzero = (pPmInt_t)pobj; 00072 00073 /* Init one */ 00074 retval = heap_getChunk(sizeof(PmInt_t), &pchunk); 00075 PM_RETURN_IF_ERROR(retval); 00076 pobj = (pPmObj_t)pchunk; 00077 OBJ_SET_TYPE(pobj, OBJ_TYPE_INT); 00078 ((pPmInt_t)pobj)->val = (int32_t)1; 00079 gVmGlobal.pone = (pPmInt_t)pobj; 00080 00081 /* Init negone */ 00082 retval = heap_getChunk(sizeof(PmInt_t), &pchunk); 00083 PM_RETURN_IF_ERROR(retval); 00084 pobj = (pPmObj_t)pchunk; 00085 OBJ_SET_TYPE(pobj, OBJ_TYPE_INT); 00086 ((pPmInt_t)pobj)->val = (int32_t)-1; 00087 gVmGlobal.pnegone = (pPmInt_t)pobj; 00088 00089 /* Init False */ 00090 retval = heap_getChunk(sizeof(PmBoolean_t), &pchunk); 00091 PM_RETURN_IF_ERROR(retval); 00092 pobj = (pPmObj_t)pchunk; 00093 OBJ_SET_TYPE(pobj, OBJ_TYPE_BOOL); 00094 ((pPmBoolean_t) pobj)->val = (int32_t)C_FALSE; 00095 gVmGlobal.pfalse = (pPmInt_t)pobj; 00096 00097 /* Init True */ 00098 retval = heap_getChunk(sizeof(PmBoolean_t), &pchunk); 00099 PM_RETURN_IF_ERROR(retval); 00100 pobj = (pPmObj_t)pchunk; 00101 OBJ_SET_TYPE(pobj, OBJ_TYPE_BOOL); 00102 ((pPmBoolean_t) pobj)->val = (int32_t)C_TRUE; 00103 gVmGlobal.ptrue = (pPmInt_t)pobj; 00104 00105 /* Init None */ 00106 retval = heap_getChunk(sizeof(PmObj_t), &pchunk); 00107 PM_RETURN_IF_ERROR(retval); 00108 pobj = (pPmObj_t)pchunk; 00109 OBJ_SET_TYPE(pobj, OBJ_TYPE_NON); 00110 gVmGlobal.pnone = pobj; 00111 00112 /* Init "code" string obj */ 00113 retval = string_new((uint8_t const **)&codestr, &pobj); 00114 PM_RETURN_IF_ERROR(retval); 00115 gVmGlobal.pcodeStr = (pPmString_t)pobj; 00116 00117 #ifdef HAVE_CLASSES 00118 /* Init "__init__" string obj */ 00119 retval = string_new((uint8_t const **)&initstr, &pobj); 00120 PM_RETURN_IF_ERROR(retval); 00121 gVmGlobal.pinitStr = (pPmString_t)pobj; 00122 #endif /* HAVE_CLASSES */ 00123 00124 #ifdef HAVE_GENERATORS 00125 /* Init "Generator" string obj */ 00126 retval = string_new((uint8_t const **)&genstr, &pobj); 00127 PM_RETURN_IF_ERROR(retval); 00128 gVmGlobal.pgenStr = (pPmString_t)pobj; 00129 00130 /* Init "next" string obj */ 00131 retval = string_new((uint8_t const **)&nextstr, &pobj); 00132 PM_RETURN_IF_ERROR(retval); 00133 gVmGlobal.pnextStr = (pPmString_t)pobj; 00134 #endif /* HAVE_GENERATORS */ 00135 00136 #ifdef HAVE_ASSERT 00137 /* Init "Exception" string obj */ 00138 retval = string_new((uint8_t const **)&exnstr, &pobj); 00139 PM_RETURN_IF_ERROR(retval); 00140 gVmGlobal.pexnStr = (pPmString_t)pobj; 00141 #endif /* HAVE_ASSERT */ 00142 00143 /* Init empty builtins */ 00144 gVmGlobal.builtins = C_NULL; 00145 00146 /* Init native frame */ 00147 OBJ_SET_SIZE(&gVmGlobal.nativeframe, sizeof(PmNativeFrame_t)); 00148 OBJ_SET_TYPE(&gVmGlobal.nativeframe, OBJ_TYPE_NFM); 00149 00150 /* Create empty threadList */ 00151 retval = list_new(&pobj); 00152 gVmGlobal.threadList = (pPmList_t)pobj; 00153 00154 /* Init the PmImgPaths with std image info */ 00155 gVmGlobal.imgPaths.memspace[0] = MEMSPACE_PROG; 00156 gVmGlobal.imgPaths.pimg[0] = (uint8_t *)&stdlib_img; 00157 gVmGlobal.imgPaths.pathcount = 1; 00158 00159 return retval; 00160 } 00161 00162 00163 PmReturn_t 00164 global_setBuiltins(pPmFunc_t pmod) 00165 { 00166 PmReturn_t retval = PM_RET_OK; 00167 pPmObj_t pkey = C_NULL; 00168 uint8_t const *pbistr = bistr; 00169 00170 if (PM_PBUILTINS == C_NULL) 00171 { 00172 /* Need to load builtins first */ 00173 global_loadBuiltins(); 00174 } 00175 00176 /* Put builtins module in the module's attrs dict */ 00177 retval = string_new(&pbistr, &pkey); 00178 PM_RETURN_IF_ERROR(retval); 00179 00180 return dict_setItem((pPmObj_t)pmod->f_attrs, pkey, PM_PBUILTINS); 00181 } 00182 00183 00184 PmReturn_t 00185 global_loadBuiltins(void) 00186 { 00187 PmReturn_t retval = PM_RET_OK; 00188 pPmObj_t pkey = C_NULL; 00189 uint8_t const *nonestr = (uint8_t const *)"None"; 00190 uint8_t const *falsestr = (uint8_t const *)"False"; 00191 uint8_t const *truestr = (uint8_t const *)"True"; 00192 pPmObj_t pstr = C_NULL; 00193 pPmObj_t pbimod; 00194 uint8_t const *pbistr = bistr; 00195 00196 /* Import the builtins */ 00197 retval = string_new(&pbistr, &pstr); 00198 PM_RETURN_IF_ERROR(retval); 00199 retval = mod_import(pstr, &pbimod); 00200 PM_RETURN_IF_ERROR(retval); 00201 00202 /* Must interpret builtins' root code to set the attrs */ 00203 C_ASSERT(gVmGlobal.threadList->length == 0); 00204 interp_addThread((pPmFunc_t)pbimod); 00205 retval = interpret(INTERP_RETURN_ON_NO_THREADS); 00206 PM_RETURN_IF_ERROR(retval); 00207 00208 /* Builtins points to the builtins module's attrs dict */ 00209 gVmGlobal.builtins = ((pPmFunc_t)pbimod)->f_attrs; 00210 00211 /* Set None manually */ 00212 retval = string_new(&nonestr, &pkey); 00213 PM_RETURN_IF_ERROR(retval); 00214 retval = dict_setItem(PM_PBUILTINS, pkey, PM_NONE); 00215 PM_RETURN_IF_ERROR(retval); 00216 00217 /* Set False manually */ 00218 retval = string_new(&falsestr, &pkey); 00219 PM_RETURN_IF_ERROR(retval); 00220 retval = dict_setItem(PM_PBUILTINS, pkey, PM_FALSE); 00221 PM_RETURN_IF_ERROR(retval); 00222 00223 /* Set True manually */ 00224 retval = string_new(&truestr, &pkey); 00225 PM_RETURN_IF_ERROR(retval); 00226 retval = dict_setItem(PM_PBUILTINS, pkey, PM_TRUE); 00227 PM_RETURN_IF_ERROR(retval); 00228 00229 /* Deallocate builtins module */ 00230 retval = heap_freeChunk((pPmObj_t)pbimod); 00231 00232 return retval; 00233 }
Generated on Tue Jul 12 2022 17:07:01 by
