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/frame.h@1:979fdbf19fdf, 2010-07-26 (annotated)
- Committer:
- dadaista
- Date:
- Mon Jul 26 15:33:32 2010 +0000
- Revision:
- 1:979fdbf19fdf
- Parent:
- 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 | #ifndef __FRAME_H__ |
dadaista | 0:14e5e829dffe | 17 | #define __FRAME_H__ |
dadaista | 0:14e5e829dffe | 18 | |
dadaista | 0:14e5e829dffe | 19 | |
dadaista | 0:14e5e829dffe | 20 | /** |
dadaista | 0:14e5e829dffe | 21 | * \file |
dadaista | 0:14e5e829dffe | 22 | * \brief VM Frame |
dadaista | 0:14e5e829dffe | 23 | * |
dadaista | 0:14e5e829dffe | 24 | * VM frame header. |
dadaista | 0:14e5e829dffe | 25 | */ |
dadaista | 0:14e5e829dffe | 26 | |
dadaista | 0:14e5e829dffe | 27 | |
dadaista | 0:14e5e829dffe | 28 | /** |
dadaista | 0:14e5e829dffe | 29 | * The maximum number of local variables a native function can have. |
dadaista | 0:14e5e829dffe | 30 | * This defines the length of the locals array in the native frame struct. |
dadaista | 0:14e5e829dffe | 31 | */ |
dadaista | 0:14e5e829dffe | 32 | #define NATIVE_MAX_NUM_LOCALS 8 |
dadaista | 0:14e5e829dffe | 33 | |
dadaista | 0:14e5e829dffe | 34 | |
dadaista | 0:14e5e829dffe | 35 | /** |
dadaista | 0:14e5e829dffe | 36 | * Block Type |
dadaista | 0:14e5e829dffe | 37 | * |
dadaista | 0:14e5e829dffe | 38 | * Numerical values to put in the 'b_type' field of the tPmBlockType struct. |
dadaista | 0:14e5e829dffe | 39 | */ |
dadaista | 0:14e5e829dffe | 40 | typedef enum PmBlockType_e |
dadaista | 0:14e5e829dffe | 41 | { |
dadaista | 0:14e5e829dffe | 42 | /** Invalid block type */ |
dadaista | 0:14e5e829dffe | 43 | B_INVALID = 0, |
dadaista | 0:14e5e829dffe | 44 | |
dadaista | 0:14e5e829dffe | 45 | /** Loop type */ |
dadaista | 0:14e5e829dffe | 46 | B_LOOP, |
dadaista | 0:14e5e829dffe | 47 | |
dadaista | 0:14e5e829dffe | 48 | /** Try type */ |
dadaista | 0:14e5e829dffe | 49 | B_TRY |
dadaista | 0:14e5e829dffe | 50 | } PmBlockType_t, *pPmBlockType_t; |
dadaista | 0:14e5e829dffe | 51 | |
dadaista | 0:14e5e829dffe | 52 | |
dadaista | 0:14e5e829dffe | 53 | /** |
dadaista | 0:14e5e829dffe | 54 | * Block |
dadaista | 0:14e5e829dffe | 55 | * |
dadaista | 0:14e5e829dffe | 56 | * Extra info for loops and trys (others?) |
dadaista | 0:14e5e829dffe | 57 | * Frames use linked list of blocks to handle |
dadaista | 0:14e5e829dffe | 58 | * nested loops and try-catch blocks. |
dadaista | 0:14e5e829dffe | 59 | */ |
dadaista | 0:14e5e829dffe | 60 | typedef struct PmBlock_s |
dadaista | 0:14e5e829dffe | 61 | { |
dadaista | 0:14e5e829dffe | 62 | /** Obligatory obj descriptor */ |
dadaista | 0:14e5e829dffe | 63 | PmObjDesc_t od; |
dadaista | 0:14e5e829dffe | 64 | |
dadaista | 0:14e5e829dffe | 65 | /** Ptr to backup stack ptr */ |
dadaista | 0:14e5e829dffe | 66 | pPmObj_t *b_sp; |
dadaista | 0:14e5e829dffe | 67 | |
dadaista | 0:14e5e829dffe | 68 | /** Handler fxn obj */ |
dadaista | 0:14e5e829dffe | 69 | uint8_t const *b_handler; |
dadaista | 0:14e5e829dffe | 70 | |
dadaista | 0:14e5e829dffe | 71 | /** Block type */ |
dadaista | 0:14e5e829dffe | 72 | PmBlockType_t b_type:8; |
dadaista | 0:14e5e829dffe | 73 | |
dadaista | 0:14e5e829dffe | 74 | /** Next block in stack */ |
dadaista | 0:14e5e829dffe | 75 | struct PmBlock_s *next; |
dadaista | 0:14e5e829dffe | 76 | } PmBlock_t, |
dadaista | 0:14e5e829dffe | 77 | *pPmBlock_t; |
dadaista | 0:14e5e829dffe | 78 | |
dadaista | 0:14e5e829dffe | 79 | |
dadaista | 0:14e5e829dffe | 80 | /** |
dadaista | 0:14e5e829dffe | 81 | * Frame |
dadaista | 0:14e5e829dffe | 82 | * |
dadaista | 0:14e5e829dffe | 83 | * A struct that holds the execution frame of a function, including the stack, |
dadaista | 0:14e5e829dffe | 84 | * local vars and pointer to the code object. |
dadaista | 0:14e5e829dffe | 85 | * |
dadaista | 0:14e5e829dffe | 86 | * This struct doesn't declare the stack. |
dadaista | 0:14e5e829dffe | 87 | * frame_new() is responsible for allocating the extra memory |
dadaista | 0:14e5e829dffe | 88 | * at the tail of fo_locals[] to hold both the locals and stack. |
dadaista | 0:14e5e829dffe | 89 | */ |
dadaista | 0:14e5e829dffe | 90 | typedef struct PmFrame_s |
dadaista | 0:14e5e829dffe | 91 | { |
dadaista | 0:14e5e829dffe | 92 | /** Obligatory obj descriptor */ |
dadaista | 0:14e5e829dffe | 93 | PmObjDesc_t od; |
dadaista | 0:14e5e829dffe | 94 | |
dadaista | 0:14e5e829dffe | 95 | /** Ptr to previous frame obj */ |
dadaista | 0:14e5e829dffe | 96 | struct PmFrame_s *fo_back; |
dadaista | 0:14e5e829dffe | 97 | |
dadaista | 0:14e5e829dffe | 98 | /** Ptr to fxn obj */ |
dadaista | 0:14e5e829dffe | 99 | pPmFunc_t fo_func; |
dadaista | 0:14e5e829dffe | 100 | |
dadaista | 0:14e5e829dffe | 101 | /** Mem space where func's CO comes from */ |
dadaista | 0:14e5e829dffe | 102 | PmMemSpace_t fo_memspace:8; |
dadaista | 0:14e5e829dffe | 103 | |
dadaista | 0:14e5e829dffe | 104 | /** Instrxn ptr (pts into memspace) */ |
dadaista | 0:14e5e829dffe | 105 | uint8_t const *fo_ip; |
dadaista | 0:14e5e829dffe | 106 | |
dadaista | 0:14e5e829dffe | 107 | /** Linked list of blocks */ |
dadaista | 0:14e5e829dffe | 108 | pPmBlock_t fo_blockstack; |
dadaista | 0:14e5e829dffe | 109 | |
dadaista | 0:14e5e829dffe | 110 | /** Local attributes dict (non-fast locals) */ |
dadaista | 0:14e5e829dffe | 111 | pPmDict_t fo_attrs; |
dadaista | 0:14e5e829dffe | 112 | |
dadaista | 0:14e5e829dffe | 113 | /** Global attributes dict (pts to root frame's globals */ |
dadaista | 0:14e5e829dffe | 114 | pPmDict_t fo_globals; |
dadaista | 0:14e5e829dffe | 115 | |
dadaista | 0:14e5e829dffe | 116 | /** Points to next empty slot in fo_locals (1 past TOS) */ |
dadaista | 0:14e5e829dffe | 117 | pPmObj_t *fo_sp; |
dadaista | 0:14e5e829dffe | 118 | |
dadaista | 0:14e5e829dffe | 119 | /** Frame can be an import-frame that handles RETURN differently */ |
dadaista | 0:14e5e829dffe | 120 | uint8_t fo_isImport:1; |
dadaista | 0:14e5e829dffe | 121 | |
dadaista | 0:14e5e829dffe | 122 | #ifdef HAVE_CLASSES |
dadaista | 0:14e5e829dffe | 123 | /** Flag to indicate class initailzer frame; handle RETURN differently */ |
dadaista | 0:14e5e829dffe | 124 | uint8_t fo_isInit:1; |
dadaista | 0:14e5e829dffe | 125 | #endif /* HAVE_CLASSES */ |
dadaista | 0:14e5e829dffe | 126 | |
dadaista | 0:14e5e829dffe | 127 | /** Array of local vars and stack (space appended at alloc) */ |
dadaista | 0:14e5e829dffe | 128 | pPmObj_t fo_locals[1]; |
dadaista | 0:14e5e829dffe | 129 | /* WARNING: Do not put new fields below fo_locals */ |
dadaista | 0:14e5e829dffe | 130 | } PmFrame_t, |
dadaista | 0:14e5e829dffe | 131 | *pPmFrame_t; |
dadaista | 0:14e5e829dffe | 132 | |
dadaista | 0:14e5e829dffe | 133 | |
dadaista | 0:14e5e829dffe | 134 | /** |
dadaista | 0:14e5e829dffe | 135 | * Native Frame |
dadaista | 0:14e5e829dffe | 136 | * |
dadaista | 0:14e5e829dffe | 137 | * A struct that holds the execution frame of a native function, |
dadaista | 0:14e5e829dffe | 138 | * including the args and single stack slot, and pointer to the code object. |
dadaista | 0:14e5e829dffe | 139 | * |
dadaista | 0:14e5e829dffe | 140 | * This struct doesn't need an OD because it is only used statically in the |
dadaista | 0:14e5e829dffe | 141 | * globals struct. There's only one native frame, the global one. |
dadaista | 0:14e5e829dffe | 142 | * This happens because a native function is a leaf node |
dadaista | 0:14e5e829dffe | 143 | * in the call tree (a native func can't call python funcs). |
dadaista | 0:14e5e829dffe | 144 | */ |
dadaista | 0:14e5e829dffe | 145 | typedef struct PmNativeFrame_s |
dadaista | 0:14e5e829dffe | 146 | { |
dadaista | 0:14e5e829dffe | 147 | /** Object descriptor */ |
dadaista | 0:14e5e829dffe | 148 | PmObjDesc_t od; |
dadaista | 0:14e5e829dffe | 149 | |
dadaista | 0:14e5e829dffe | 150 | /** Ptr to previous frame obj */ |
dadaista | 0:14e5e829dffe | 151 | struct PmFrame_s *nf_back; |
dadaista | 0:14e5e829dffe | 152 | |
dadaista | 0:14e5e829dffe | 153 | /** Ptr to fxn obj */ |
dadaista | 0:14e5e829dffe | 154 | pPmFunc_t nf_func; |
dadaista | 0:14e5e829dffe | 155 | |
dadaista | 0:14e5e829dffe | 156 | /** Single stack slot */ |
dadaista | 0:14e5e829dffe | 157 | pPmObj_t nf_stack; |
dadaista | 0:14e5e829dffe | 158 | |
dadaista | 0:14e5e829dffe | 159 | /** Boolean to indicate if the native frame is active */ |
dadaista | 0:14e5e829dffe | 160 | uint8_t nf_active; |
dadaista | 0:14e5e829dffe | 161 | |
dadaista | 0:14e5e829dffe | 162 | /** Number of args passed to the native function */ |
dadaista | 0:14e5e829dffe | 163 | uint8_t nf_numlocals; |
dadaista | 0:14e5e829dffe | 164 | |
dadaista | 0:14e5e829dffe | 165 | /** Local vars */ |
dadaista | 0:14e5e829dffe | 166 | pPmObj_t nf_locals[NATIVE_MAX_NUM_LOCALS]; |
dadaista | 0:14e5e829dffe | 167 | } PmNativeFrame_t, |
dadaista | 0:14e5e829dffe | 168 | *pPmNativeFrame_t; |
dadaista | 0:14e5e829dffe | 169 | |
dadaista | 0:14e5e829dffe | 170 | |
dadaista | 0:14e5e829dffe | 171 | /** |
dadaista | 0:14e5e829dffe | 172 | * Allocate space for a new frame, fill its fields |
dadaista | 0:14e5e829dffe | 173 | * with respect to the given function object. |
dadaista | 0:14e5e829dffe | 174 | * Return pointer to the new frame. |
dadaista | 0:14e5e829dffe | 175 | * |
dadaista | 0:14e5e829dffe | 176 | * @param pfunc ptr to Function object. |
dadaista | 0:14e5e829dffe | 177 | * @param r_pobj Return value; the new frame. |
dadaista | 0:14e5e829dffe | 178 | * @return Return status. |
dadaista | 0:14e5e829dffe | 179 | */ |
dadaista | 0:14e5e829dffe | 180 | PmReturn_t frame_new(pPmObj_t pfunc, pPmObj_t *r_pobj); |
dadaista | 0:14e5e829dffe | 181 | |
dadaista | 0:14e5e829dffe | 182 | #endif /* __FRAME_H__ */ |