@@ -1865,8 +1865,10 @@ def _print_Declare(self, expr):
1865
1865
rankstr = ''
1866
1866
1867
1867
# ... print datatype
1868
- if isinstance (expr_type , CustomDataType ):
1869
- name = expr_type .name
1868
+ if isinstance (expr_type , (CustomDataType , IteratorType , HomogeneousListType , HomogeneousSetType , DictType )):
1869
+ name = self ._print (expr_type )
1870
+ if isinstance (expr_type , (HomogeneousContainerType , DictType )):
1871
+ self .add_import (self ._build_gFTL_module (expr_type ))
1870
1872
1871
1873
if var .is_argument :
1872
1874
sig = 'class'
@@ -1894,10 +1896,6 @@ def _print_Declare(self, expr):
1894
1896
raise NotImplementedError ("Fortran rank string undetermined" )
1895
1897
rankstr = f'({ rankstr } )'
1896
1898
1897
- elif isinstance (expr_type , (HomogeneousListType , HomogeneousSetType , DictType )):
1898
- self .add_import (self ._build_gFTL_module (expr_type ))
1899
- typename = self ._print (expr_type )
1900
- dtype_str = f'type({ typename } )'
1901
1899
elif isinstance (dtype , StringType ):
1902
1900
dtype_str = self ._print (dtype )
1903
1901
@@ -2231,6 +2229,9 @@ def _print_IteratorType(self, expr):
2231
2229
iterable_type = self ._print (expr .iterable_type )
2232
2230
return f"{ iterable_type } _Iterator"
2233
2231
2232
+ def _print_CustomDataType (self , expr ):
2233
+ return expr .name
2234
+
2234
2235
def _print_DataType (self , expr ):
2235
2236
return self ._print (expr .name )
2236
2237
@@ -2568,27 +2569,42 @@ def _print_FunctionalFor(self, expr):
2568
2569
def _print_For (self , expr ):
2569
2570
self .set_scope (expr .scope )
2570
2571
2572
+ iterable = expr .iterable
2573
+ iterable_type = iterable .iterable .class_type
2571
2574
indices = expr .iterable .loop_counters
2572
- index = indices [0 ] if indices else expr .target
2573
- if expr .iterable .num_loop_counters_required :
2574
- self .scope .insert_variable (index )
2575
2575
2576
- target = index
2577
- my_range = expr .iterable .get_range ()
2578
-
2579
- if not isinstance (my_range , PythonRange ):
2580
- # Only iterable currently supported is PythonRange
2581
- errors .report (PYCCEL_RESTRICTION_TODO , symbol = expr ,
2582
- severity = 'fatal' )
2583
-
2584
- tar = self ._print (target )
2585
- range_code = self ._print (my_range )
2586
-
2587
- prolog = 'do {0} = {1}\n ' .format (tar , range_code )
2588
- epilog = 'end do\n '
2589
-
2590
- additional_assign = CodeBlock (expr .iterable .get_assigns (expr .target ))
2591
- prolog += self ._print (additional_assign )
2576
+ if isinstance (iterable_type , (DictType , HomogeneousSetType )):
2577
+ if isinstance (iterable .iterable , Variable ):
2578
+ suggested_name = iterable .iterable .name + '_'
2579
+ else :
2580
+ suggested_name = ''
2581
+ errors .report ("Iterating over a temporary object. This may cause compilation issues or cause calculations to be carried out twice" ,
2582
+ severity = 'warning' , symbol = expr )
2583
+ iterable = self ._print (iterable .iterable )
2584
+ iterator = self .scope .get_temporary_variable (IteratorType (iterable_type ),
2585
+ name = suggested_name + 'iter' )
2586
+ last = self .scope .get_temporary_variable (IteratorType (iterable_type ),
2587
+ name = suggested_name + 'last' )
2588
+ target = self ._print (expr .target )
2589
+ prolog = (f'{ iterator } = { iterable } % begin()\n '
2590
+ f'{ last } = { iterable } % end()\n '
2591
+ f'do while ({ iterator } /= { last } )\n '
2592
+ f'{ target } = { iterator } % of()\n ' )
2593
+ epilog = f'call { iterator } % next()\n end do\n '
2594
+ else :
2595
+ index = indices [0 ] if indices else expr .target
2596
+ if iterable .num_loop_counters_required :
2597
+ self .scope .insert_variable (index )
2598
+
2599
+ my_range = iterable .get_range ()
2600
+
2601
+ target = self ._print (index )
2602
+ range_code = self ._print (my_range )
2603
+
2604
+ prolog = f'do { target } = { range_code } \n '
2605
+ epilog = 'end do\n '
2606
+
2607
+ prolog += self ._print (CodeBlock (iterable .get_assigns (expr .target )))
2592
2608
2593
2609
body = self ._print (expr .body )
2594
2610
@@ -2598,9 +2614,7 @@ def _print_For(self, expr):
2598
2614
2599
2615
self .exit_scope ()
2600
2616
2601
- return ('{prolog}'
2602
- '{body}'
2603
- '{epilog}' ).format (prolog = prolog , body = body , epilog = epilog )
2617
+ return prolog + body + epilog
2604
2618
2605
2619
# .....................................................
2606
2620
# Print OpenMP AnnotatedComment
0 commit comments