@@ -87,6 +87,38 @@ def __init__(self):
8787 self .return_value = None
8888 self .last_exception = None
8989
90+ # Frame manipulation
91+ def make_frame (self , code , callargs = {}, f_globals = None , f_locals = None ):
92+ if f_globals is not None :
93+ f_globals = f_globals
94+ if f_locals is None :
95+ f_locals = f_globals
96+ elif self .frames :
97+ f_globals = self .frame .f_globals
98+ f_locals = {}
99+ else :
100+ f_globals = f_locals = {
101+ '__builtins__' : __builtins__ ,
102+ '__name__' : '__main__' ,
103+ '__doc__' : None ,
104+ '__package__' : None ,
105+ }
106+ f_locals .update (callargs )
107+ frame = Frame (code , f_globals , f_locals , self .frame )
108+ return frame
109+
110+ def push_frame (self , frame ):
111+ self .frames .append (frame )
112+ self .frame = frame
113+
114+ def pop_frame (self ):
115+ self .frames .pop ()
116+ if self .frames :
117+ self .frame = self .frames [- 1 ]
118+ else :
119+ self .frame = None
120+
121+ # Data stack manipulation
90122 def top (self ):
91123 return self .frame .stack [- 1 ]
92124
@@ -107,10 +139,7 @@ def popn(self, n):
107139 else :
108140 return []
109141
110- def jump (self , jump ):
111- """Move the bytecode pointer to `jump`, so it will execute next."""
112- self .frame .f_lasti = jump
113-
142+ # Block stack manipulation
114143 def push_block (self , b_type , handler = None ):
115144 level = len (self .frame .stack )
116145 self .frame .block_stack .append (Block (b_type , handler , level ))
@@ -131,36 +160,12 @@ def unwind_block(self, block):
131160 traceback , value , exctype = self .popn (3 )
132161 self .last_exception = exctype , value , traceback
133162
134- def make_frame (self , code , callargs = {}, f_globals = None , f_locals = None ):
135- if f_globals is not None :
136- f_globals = f_globals
137- if f_locals is None :
138- f_locals = f_globals
139- elif self .frames :
140- f_globals = self .frame .f_globals
141- f_locals = {}
142- else :
143- f_globals = f_locals = {
144- '__builtins__' : __builtins__ ,
145- '__name__' : '__main__' ,
146- '__doc__' : None ,
147- '__package__' : None ,
148- }
149- f_locals .update (callargs )
150- frame = Frame (code , f_globals , f_locals , self .frame )
151- return frame
152-
153- def push_frame (self , frame ):
154- self .frames .append (frame )
155- self .frame = frame
156-
157- def pop_frame (self ):
158- self .frames .pop ()
159- if self .frames :
160- self .frame = self .frames [- 1 ]
161- else :
162- self .frame = None
163+ # Jumping through bytecode
164+ def jump (self , jump ):
165+ """Move the bytecode pointer to `jump`, so it will execute next."""
166+ self .frame .f_lasti = jump
163167
168+ # An entry point
164169 def run_code (self , code , f_globals = None , f_locals = None ):
165170 frame = self .make_frame (code , f_globals = f_globals , f_locals = f_locals )
166171 val = self .run_frame (frame )
0 commit comments