You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

162 lines
4.5 KiB

36 years ago
36 years ago
36 years ago
36 years ago
36 years ago
36 years ago
36 years ago
36 years ago
36 years ago
36 years ago
36 years ago
36 years ago
36 years ago
36 years ago
36 years ago
36 years ago
36 years ago
PEP 227 implementation The majority of the changes are in the compiler. The mainloop changes primarily to implement the new opcodes and to pass a function's closure to eval_code2(). Frames and functions got new slots to hold the closure. Include/compile.h Add co_freevars and co_cellvars slots to code objects. Update PyCode_New() to take freevars and cellvars as arguments Include/funcobject.h Add func_closure slot to function objects. Add GetClosure()/SetClosure() functions (and corresponding macros) for getting at the closure. Include/frameobject.h PyFrame_New() now takes a closure. Include/opcode.h Add four new opcodes: MAKE_CLOSURE, LOAD_CLOSURE, LOAD_DEREF, STORE_DEREF. Remove comment about old requirement for opcodes to fit in 7 bits. compile.c Implement changes to code objects for co_freevars and co_cellvars. Modify symbol table to use st_cur_name (string object for the name of the current scope) and st_cur_children (list of nested blocks). Also define st_nested, which might more properly be called st_cur_nested. Add several DEF_XXX flags to track def-use information for free variables. New or modified functions of note: com_make_closure(struct compiling *, PyCodeObject *) Emit LOAD_CLOSURE opcodes as needed to pass cells for free variables into nested scope. com_addop_varname(struct compiling *, int, char *) Emits opcodes for LOAD_DEREF and STORE_DEREF. get_ref_type(struct compiling *, char *name) Return NAME_CLOSURE if ref type is FREE or CELL symtable_load_symbols(struct compiling *) Decides what variables are cell or free based on def-use info. Can now raise SyntaxError if nested scopes are mixed with exec or from blah import *. make_scope_info(PyObject *, PyObject *, int, int) Helper functions for symtable scope stack. symtable_update_free_vars(struct symtable *) After a code block has been analyzed, it must check each of its children for free variables that are not defined in the block. If a variable is free in a child and not defined in the parent, then it is defined by block the enclosing the current one or it is a global. This does the right logic. symtable_add_use() is now a macro for symtable_add_def() symtable_assign(struct symtable *, node *) Use goto instead of for (;;) Fixed bug in symtable where name of keyword argument in function call was treated as assignment in the scope of the call site. Ex: def f(): g(a=2) # a was considered a local of f ceval.c eval_code2() now take one more argument, a closure. Implement LOAD_CLOSURE, LOAD_DEREF, STORE_DEREF, MAKE_CLOSURE> Also: When name error occurs for global variable, report that the name was global in the error mesage. Objects/frameobject.c Initialize f_closure to be a tuple containing space for cellvars and freevars. f_closure is NULL if neither are present. Objects/funcobject.c Add support for func_closure. Python/import.c Change the magic number. Python/marshal.c Track changes to code objects.
25 years ago
  1. #ifndef Py_OPCODE_H
  2. #define Py_OPCODE_H
  3. #ifdef __cplusplus
  4. extern "C" {
  5. #endif
  6. /* Instruction opcodes for compiled code */
  7. #define STOP_CODE 0
  8. #define POP_TOP 1
  9. #define ROT_TWO 2
  10. #define ROT_THREE 3
  11. #define DUP_TOP 4
  12. #define ROT_FOUR 5
  13. #define NOP 9
  14. #define UNARY_POSITIVE 10
  15. #define UNARY_NEGATIVE 11
  16. #define UNARY_NOT 12
  17. #define UNARY_CONVERT 13
  18. #define UNARY_INVERT 15
  19. #define BINARY_POWER 19
  20. #define BINARY_MULTIPLY 20
  21. #define BINARY_DIVIDE 21
  22. #define BINARY_MODULO 22
  23. #define BINARY_ADD 23
  24. #define BINARY_SUBTRACT 24
  25. #define BINARY_SUBSCR 25
  26. #define BINARY_FLOOR_DIVIDE 26
  27. #define BINARY_TRUE_DIVIDE 27
  28. #define INPLACE_FLOOR_DIVIDE 28
  29. #define INPLACE_TRUE_DIVIDE 29
  30. #define SLICE 30
  31. /* Also uses 31-33 */
  32. #define STORE_SLICE 40
  33. /* Also uses 41-43 */
  34. #define DELETE_SLICE 50
  35. /* Also uses 51-53 */
  36. #define STORE_MAP 54
  37. #define INPLACE_ADD 55
  38. #define INPLACE_SUBTRACT 56
  39. #define INPLACE_MULTIPLY 57
  40. #define INPLACE_DIVIDE 58
  41. #define INPLACE_MODULO 59
  42. #define STORE_SUBSCR 60
  43. #define DELETE_SUBSCR 61
  44. #define BINARY_LSHIFT 62
  45. #define BINARY_RSHIFT 63
  46. #define BINARY_AND 64
  47. #define BINARY_XOR 65
  48. #define BINARY_OR 66
  49. #define INPLACE_POWER 67
  50. #define GET_ITER 68
  51. #define PRINT_EXPR 70
  52. #define PRINT_ITEM 71
  53. #define PRINT_NEWLINE 72
  54. #define PRINT_ITEM_TO 73
  55. #define PRINT_NEWLINE_TO 74
  56. #define INPLACE_LSHIFT 75
  57. #define INPLACE_RSHIFT 76
  58. #define INPLACE_AND 77
  59. #define INPLACE_XOR 78
  60. #define INPLACE_OR 79
  61. #define BREAK_LOOP 80
  62. #define WITH_CLEANUP 81
  63. #define LOAD_LOCALS 82
  64. #define RETURN_VALUE 83
  65. #define IMPORT_STAR 84
  66. #define EXEC_STMT 85
  67. #define YIELD_VALUE 86
  68. #define POP_BLOCK 87
  69. #define END_FINALLY 88
  70. #define BUILD_CLASS 89
  71. #define HAVE_ARGUMENT 90 /* Opcodes from here have an argument: */
  72. #define STORE_NAME 90 /* Index in name list */
  73. #define DELETE_NAME 91 /* "" */
  74. #define UNPACK_SEQUENCE 92 /* Number of sequence items */
  75. #define FOR_ITER 93
  76. #define LIST_APPEND 94
  77. #define STORE_ATTR 95 /* Index in name list */
  78. #define DELETE_ATTR 96 /* "" */
  79. #define STORE_GLOBAL 97 /* "" */
  80. #define DELETE_GLOBAL 98 /* "" */
  81. #define DUP_TOPX 99 /* number of items to duplicate */
  82. #define LOAD_CONST 100 /* Index in const list */
  83. #define LOAD_NAME 101 /* Index in name list */
  84. #define BUILD_TUPLE 102 /* Number of tuple items */
  85. #define BUILD_LIST 103 /* Number of list items */
  86. #define BUILD_SET 104 /* Number of set items */
  87. #define BUILD_MAP 105 /* Always zero for now */
  88. #define LOAD_ATTR 106 /* Index in name list */
  89. #define COMPARE_OP 107 /* Comparison operator */
  90. #define IMPORT_NAME 108 /* Index in name list */
  91. #define IMPORT_FROM 109 /* Index in name list */
  92. #define JUMP_FORWARD 110 /* Number of bytes to skip */
  93. #define JUMP_IF_FALSE_OR_POP 111 /* Target byte offset from beginning
  94. of code */
  95. #define JUMP_IF_TRUE_OR_POP 112 /* "" */
  96. #define JUMP_ABSOLUTE 113 /* "" */
  97. #define POP_JUMP_IF_FALSE 114 /* "" */
  98. #define POP_JUMP_IF_TRUE 115 /* "" */
  99. #define LOAD_GLOBAL 116 /* Index in name list */
  100. #define CONTINUE_LOOP 119 /* Start of loop (absolute) */
  101. #define SETUP_LOOP 120 /* Target address (relative) */
  102. #define SETUP_EXCEPT 121 /* "" */
  103. #define SETUP_FINALLY 122 /* "" */
  104. #define LOAD_FAST 124 /* Local variable number */
  105. #define STORE_FAST 125 /* Local variable number */
  106. #define DELETE_FAST 126 /* Local variable number */
  107. #define RAISE_VARARGS 130 /* Number of raise arguments (1, 2 or 3) */
  108. /* CALL_FUNCTION_XXX opcodes defined below depend on this definition */
  109. #define CALL_FUNCTION 131 /* #args + (#kwargs<<8) */
  110. #define MAKE_FUNCTION 132 /* #defaults */
  111. #define BUILD_SLICE 133 /* Number of items */
  112. #define MAKE_CLOSURE 134 /* #free vars */
  113. #define LOAD_CLOSURE 135 /* Load free variable from closure */
  114. #define LOAD_DEREF 136 /* Load and dereference from closure cell */
  115. #define STORE_DEREF 137 /* Store into cell */
  116. /* The next 3 opcodes must be contiguous and satisfy
  117. (CALL_FUNCTION_VAR - CALL_FUNCTION) & 3 == 1 */
  118. #define CALL_FUNCTION_VAR 140 /* #args + (#kwargs<<8) */
  119. #define CALL_FUNCTION_KW 141 /* #args + (#kwargs<<8) */
  120. #define CALL_FUNCTION_VAR_KW 142 /* #args + (#kwargs<<8) */
  121. #define SETUP_WITH 143
  122. /* Support for opargs more than 16 bits long */
  123. #define EXTENDED_ARG 145
  124. #define SET_ADD 146
  125. #define MAP_ADD 147
  126. enum cmp_op {PyCmp_LT=Py_LT, PyCmp_LE=Py_LE, PyCmp_EQ=Py_EQ, PyCmp_NE=Py_NE, PyCmp_GT=Py_GT, PyCmp_GE=Py_GE,
  127. PyCmp_IN, PyCmp_NOT_IN, PyCmp_IS, PyCmp_IS_NOT, PyCmp_EXC_MATCH, PyCmp_BAD};
  128. #define HAS_ARG(op) ((op) >= HAVE_ARGUMENT)
  129. #ifdef __cplusplus
  130. }
  131. #endif
  132. #endif /* !Py_OPCODE_H */