1313 CO_NESTED , CO_GENERATOR , CO_GENERATOR_ALLOWED , CO_FUTURE_DIVISION
1414from compiler .pyassem import TupleArg
1515
16+ # XXX The version-specific code can go, since this code only works with 2.x.
1617# Do we have Python 1.x or Python 2.x?
1718try :
1819 VERSION = sys .version_info [0 ]
3233TRY_FINALLY = 3
3334END_FINALLY = 4
3435
35- # XXX this doesn't seem to be used
36- class BlockStack (misc .Stack ):
37- __super_init = misc .Stack .__init__
38-
39- def __init__ (self ):
40- self .__super_init (self )
41- self .loop = None
42-
4336def compileFile (filename , display = 0 ):
44- f = open (filename )
37+ f = open (filename , 'U' )
4538 buf = f .read ()
4639 f .close ()
4740 mod = Module (buf , filename )
4841 try :
4942 mod .compile (display )
50- except SyntaxError , err :
43+ except SyntaxError :
5144 raise
5245 else :
5346 f = open (filename + "c" , "wb" )
@@ -134,7 +127,7 @@ def getPycHeader(self):
134127 # to indicate the type of the value. simplest way to get the
135128 # same effect is to call marshal and then skip the code.
136129 mtime = os .path .getmtime (self .filename )
137- mtime = struct .pack ('i' , mtime )
130+ mtime = struct .pack ('< i' , mtime )
138131 return self .MAGIC + mtime
139132
140133class LocalNameFinder :
@@ -310,9 +303,17 @@ def _implicitNameOp(self, prefix, name):
310303 else :
311304 self .emit (prefix + '_NAME' , name )
312305
313- def set_lineno (self , node , force = 0 ):
314- """Emit SET_LINENO if node has lineno attribute and it is
315- different than the last lineno emitted.
306+ # The set_lineno() function and the explicit emit() calls for
307+ # SET_LINENO below are only used to generate the line number table.
308+ # As of Python 2.3, the interpreter does not have a SET_LINENO
309+ # instruction. pyassem treats SET_LINENO opcodes as a special case.
310+
311+ def set_lineno (self , node , force = False ):
312+ """Emit SET_LINENO if necessary.
313+
314+ The instruction is considered necessary if the node has a
315+ lineno attribute and it is different than the last lineno
316+ emitted.
316317
317318 Returns true if SET_LINENO was emitted.
318319
@@ -326,8 +327,8 @@ def set_lineno(self, node, force=0):
326327 or force ):
327328 self .emit ('SET_LINENO' , lineno )
328329 self .last_lineno = lineno
329- return 1
330- return 0
330+ return True
331+ return False
331332
332333 # The first few visitor methods handle nodes that generator new
333334 # code objects. They use class attributes to determine what
@@ -387,9 +388,6 @@ def _visitFuncOrLambda(self, node, isLambda=0):
387388 def visitClass (self , node ):
388389 gen = self .ClassGen (node , self .scopes ,
389390 self .get_module ())
390- if node .doc :
391- self .emit ('LOAD_CONST' , node .doc )
392- self .storeName ('__doc__' )
393391 walk (node .code , gen )
394392 gen .finish ()
395393 self .set_lineno (node )
@@ -447,7 +445,7 @@ def visitWhile(self, node):
447445 self .nextBlock (loop )
448446 self .setups .push ((LOOP , loop ))
449447
450- self .set_lineno (node , force = 1 )
448+ self .set_lineno (node , force = True )
451449 self .visit (node .test )
452450 self .emit ('JUMP_IF_FALSE' , else_ or after )
453451
@@ -617,7 +615,7 @@ def visitListCompFor(self, node):
617615 return start , anchor
618616
619617 def visitListCompIf (self , node , branch ):
620- self .set_lineno (node , force = 1 )
618+ self .set_lineno (node , force = True )
621619 self .visit (node .test )
622620 self .emit ('JUMP_IF_FALSE' , branch )
623621 self .newBlock ()
@@ -975,7 +973,7 @@ def visitReturn(self, node):
975973 def visitYield (self , node ):
976974 self .set_lineno (node )
977975 self .visit (node .value )
978- self .emit ('YIELD_STMT ' )
976+ self .emit ('YIELD_VALUE ' )
979977
980978 # slice and subscript stuff
981979
@@ -1266,9 +1264,8 @@ def __init__(self, func, scopes, isLambda, class_name, mod):
12661264 self .__super_init (func , scopes , isLambda , class_name , mod )
12671265 self .graph .setFreeVars (self .scope .get_free_vars ())
12681266 self .graph .setCellVars (self .scope .get_cell_vars ())
1269- if self .graph .checkFlag (CO_GENERATOR_ALLOWED ):
1270- if self .scope .generator is not None :
1271- self .graph .setFlag (CO_GENERATOR )
1267+ if self .scope .generator is not None :
1268+ self .graph .setFlag (CO_GENERATOR )
12721269
12731270class AbstractClassCode :
12741271
@@ -1304,6 +1301,12 @@ def __init__(self, klass, scopes, module):
13041301 self .__super_init (klass , scopes , module )
13051302 self .graph .setFreeVars (self .scope .get_free_vars ())
13061303 self .graph .setCellVars (self .scope .get_cell_vars ())
1304+ self .set_lineno (klass )
1305+ self .emit ("LOAD_GLOBAL" , "__name__" )
1306+ self .storeName ("__module__" )
1307+ if klass .doc :
1308+ self .emit ("LOAD_CONST" , klass .doc )
1309+ self .storeName ('__doc__' )
13071310
13081311def generateArgList (arglist ):
13091312 """Generate an arg list marking TupleArgs"""
@@ -1379,7 +1382,5 @@ def wrap_aug(node):
13791382 return wrapper [node .__class__ ](node )
13801383
13811384if __name__ == "__main__" :
1382- import sys
1383-
13841385 for file in sys .argv [1 :]:
13851386 compileFile (file )
0 commit comments