1 /* 2 * This file is part of the MicroPython project, http://micropython.org/ 3 * 4 * The MIT License (MIT) 5 * 6 * Copyright (c) 2013, 2014 Damien P. George 7 * 8 * Permission is hereby granted, free of charge, to any person obtaining a copy 9 * of this software and associated documentation files (the "Software"), to deal 10 * in the Software without restriction, including without limitation the rights 11 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 12 * copies of the Software, and to permit persons to whom the Software is 13 * furnished to do so, subject to the following conditions: 14 * 15 * The above copyright notice and this permission notice shall be included in 16 * all copies or substantial portions of the Software. 17 * 18 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 19 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 20 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 21 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 22 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 23 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 24 * THE SOFTWARE. 25 */ 26 #ifndef MICROPY_INCLUDED_PY_SCOPE_H 27 #define MICROPY_INCLUDED_PY_SCOPE_H 28 29 #include "py/parse.h" 30 #include "py/emitglue.h" 31 32 typedef enum { 33 ID_INFO_KIND_UNDECIDED, 34 ID_INFO_KIND_GLOBAL_IMPLICIT, 35 ID_INFO_KIND_GLOBAL_EXPLICIT, 36 ID_INFO_KIND_LOCAL, // in a function f, written and only referenced by f 37 ID_INFO_KIND_CELL, // in a function f, read/written by children of f 38 ID_INFO_KIND_FREE, // in a function f, belongs to the parent of f 39 } id_info_kind_t; 40 41 enum { 42 ID_FLAG_IS_PARAM = 0x01, 43 ID_FLAG_IS_STAR_PARAM = 0x02, 44 ID_FLAG_IS_DBL_STAR_PARAM = 0x04, 45 ID_FLAG_VIPER_TYPE_POS = 4, 46 }; 47 48 typedef struct _id_info_t { 49 uint8_t kind; 50 uint8_t flags; 51 // when it's an ID_INFO_KIND_LOCAL this is the unique number of the local 52 // whet it's an ID_INFO_KIND_CELL/FREE this is the unique number of the closed over variable 53 uint16_t local_num; 54 qstr qst; 55 } id_info_t; 56 57 #define SCOPE_IS_FUNC_LIKE(s) ((s) >= SCOPE_LAMBDA) 58 #define SCOPE_IS_COMP_LIKE(s) (SCOPE_LIST_COMP <= (s) && (s) <= SCOPE_GEN_EXPR) 59 60 // scope is a "block" in Python parlance 61 typedef enum { 62 SCOPE_MODULE, 63 SCOPE_CLASS, 64 SCOPE_LAMBDA, 65 SCOPE_LIST_COMP, 66 SCOPE_DICT_COMP, 67 SCOPE_SET_COMP, 68 SCOPE_GEN_EXPR, 69 SCOPE_FUNCTION, 70 } scope_kind_t; 71 72 typedef struct _scope_t { 73 scope_kind_t kind; 74 struct _scope_t *parent; 75 struct _scope_t *next; 76 mp_parse_node_t pn; 77 mp_raw_code_t *raw_code; 78 uint16_t source_file; // a qstr 79 uint16_t simple_name; // a qstr 80 uint16_t scope_flags; // see runtime0.h 81 uint16_t emit_options; // see emitglue.h 82 uint16_t num_pos_args; 83 uint16_t num_kwonly_args; 84 uint16_t num_def_pos_args; 85 uint16_t num_locals; 86 uint16_t stack_size; // maximum size of the locals stack 87 uint16_t exc_stack_size; // maximum size of the exception stack 88 uint16_t id_info_alloc; 89 uint16_t id_info_len; 90 id_info_t *id_info; 91 } scope_t; 92 93 scope_t *scope_new(scope_kind_t kind, mp_parse_node_t pn, qstr source_file, mp_uint_t emit_options); 94 void scope_free(scope_t *scope); 95 id_info_t *scope_find_or_add_id(scope_t *scope, qstr qstr, id_info_kind_t kind); 96 id_info_t *scope_find(scope_t *scope, qstr qstr); 97 id_info_t *scope_find_global(scope_t *scope, qstr qstr); 98 void scope_check_to_close_over(scope_t *scope, id_info_t *id); 99 100 #endif // MICROPY_INCLUDED_PY_SCOPE_H 101