38
38
39
39
class CGenerator :
40
40
"""Translate icode to C."""
41
-
41
+
42
42
func = Undefined (FuncIcode )
43
43
44
44
def __init__ (self ) -> None :
45
45
self .prolog = ['#include "mypy.h"\n ' ]
46
- self .types = [] # type: List[str]
47
- self .out = [] # type: List[str]
46
+ self .types = [] # type: List[str]
47
+ self .out = [] # type: List[str]
48
48
self .indent = 0
49
49
self .frame_size = 0
50
- self .global_vars = {} # type: Dict[str, int]
51
- self .classes = {} # type: Dict[TypeInfo, ClassRepresentation]
50
+ self .global_vars = {} # type: Dict[str, int]
51
+ self .classes = {} # type: Dict[TypeInfo, ClassRepresentation]
52
52
# Count temp labels.
53
53
self .num_labels = 0
54
54
@@ -60,7 +60,7 @@ def output(self) -> List[str]:
60
60
result .extend (self .out )
61
61
result .append (MAIN_FRAGMENT )
62
62
return result
63
-
63
+
64
64
def generate_function (self , name : str , func : FuncIcode ) -> None :
65
65
# Initialize function-specific state information.
66
66
self .func = func
@@ -70,7 +70,7 @@ def generate_function(self, name: str, func: FuncIcode) -> None:
70
70
# Simplistic name mangling.
71
71
name = name .replace ('.' , '_' )
72
72
name = name .replace ('$' , '_' )
73
-
73
+
74
74
# Add function definition and opening brace.
75
75
header = 'MValue %s(MEnv *e)' % name
76
76
self .emit (header )
@@ -84,9 +84,9 @@ def generate_function(self, name: str, func: FuncIcode) -> None:
84
84
self .emit ('MValue *frame = e->frame;' )
85
85
self .emit ('e->frame = frame + %d;' % self .frame_size )
86
86
self .emit ('if (e->frame >= e->stack_top)' )
87
- self .emit (' abort();' ) # Dummy handler; should raise an exception
87
+ self .emit (' abort();' ) # Dummy handler; should raise an exception
88
88
89
- # Geneate code that initializes the stack frame. The gc must not see
89
+ # Generate code that initializes the stack frame. The gc must not see
90
90
# uninitialized values.
91
91
for i in range (func .num_args , self .frame_size ):
92
92
if func .register_types [i ] == icode .INT :
@@ -183,12 +183,12 @@ def opcode(self, opcode: BinOp) -> None:
183
183
# Overflow check needs third argument (operation result).
184
184
label = self .label ()
185
185
self .emit ('if (MIsShort(%s) && MIsShort(%s)) {' % (left , right ))
186
- self .emit ( ' t = %s;' % operation )
187
- self .emit ( ' if (%s(t, %s, %s))' % (overflow , left , right ))
188
- self .emit ( ' goto %s;' % label )
186
+ self .emit (' t = %s;' % operation )
187
+ self .emit (' if (%s(t, %s, %s))' % (overflow , left , right ))
188
+ self .emit (' goto %s;' % label )
189
189
self .emit ('} else {' )
190
190
self .emit ('%s:' % label )
191
- self .emit ( ' t = %s(e, %s, %s);' % (opfn , left , right ))
191
+ self .emit (' t = %s(e, %s, %s);' % (opfn , left , right ))
192
192
self .emit_error_check ('t' )
193
193
self .emit ('}' )
194
194
self .emit ('%s = t;' % target )
@@ -198,15 +198,15 @@ def opcode(self, opcode: BinOp) -> None:
198
198
(left , right , overflow , left , right ))
199
199
self .emit (' %s = %s;' % (target , operation ))
200
200
self .emit ('else {' )
201
- self .emit ( ' %s = %s(e, %s, %s);' % (target , opfn , left , right ))
201
+ self .emit (' %s = %s(e, %s, %s);' % (target , opfn , left , right ))
202
202
self .emit_error_check (target )
203
203
self .emit ('}' )
204
204
else :
205
205
# No overflow check needed.
206
206
self .emit ('if (MIsShort(%s) && MIsShort(%s))' % (left , right ))
207
207
self .emit (' %s = %s;' % (target , operation ))
208
208
self .emit ('else {' )
209
- self .emit ( ' %s = %s(e, %s, %s);' % (target , opfn , left , right ))
209
+ self .emit (' %s = %s(e, %s, %s);' % (target , opfn , left , right ))
210
210
self .emit_error_check (target )
211
211
self .emit ('}' )
212
212
@@ -255,7 +255,7 @@ def opcode(self, opcode: CallMethod) -> None:
255
255
target = reg (opcode .target )
256
256
self .get_class_representation (opcode .type )
257
257
rep = self .classes [opcode .type ]
258
- method = opcode .method .replace ('$' , '_' ) # Simple name mangling.
258
+ method = opcode .method .replace ('$' , '_' ) # Simple name mangling.
259
259
if opcode .static :
260
260
self .direct_call (opcode .target , '%s_%s' % (opcode .type .name (),
261
261
method ))
@@ -325,7 +325,7 @@ def generate_class(self, cls: TypeInfo) -> 'ClassRepresentation':
325
325
self .emit_types (' 0,' )
326
326
self .emit_types (' "%s"' % cls .fullname ())
327
327
self .emit_types ('};\n ' )
328
-
328
+
329
329
return rep
330
330
331
331
def direct_call (self , target : int , funcname : str ) -> None :
@@ -394,14 +394,14 @@ class ClassRepresentation:
394
394
395
395
cname = ''
396
396
fullname = ''
397
-
397
+
398
398
slotmap = Undefined (Dict [str , int ])
399
-
399
+
400
400
# Map method name to/from vtable index
401
401
vtable_index = Undefined (Dict [str , int ])
402
-
402
+
403
403
defining_class = Undefined (Dict [str , str ])
404
-
404
+
405
405
vtable_methods = Undefined (List [str ])
406
406
407
407
def __init__ (self , type : TypeInfo , base : 'ClassRepresentation' ) -> None :
@@ -418,8 +418,8 @@ def __init__(self, type: TypeInfo, base: 'ClassRepresentation') -> None:
418
418
self .add_method (m , type )
419
419
else :
420
420
self .slotmap [m ] = len (self .slotmap )
421
- self .add_method ('_' + m , type ) # Getter TODO refactor
422
- self .add_method ('set_' + m , type ) # Setter # TODO refactor
421
+ self .add_method ('_' + m , type ) # Getter TODO refactor
422
+ self .add_method ('set_' + m , type ) # Setter # TODO refactor
423
423
424
424
def add_method (self , method : str , defining_class : TypeInfo ) -> None :
425
425
self .defining_class [method ] = defining_class .name ()
0 commit comments