Show
Ignore:
Timestamp:
08/13/08 20:17:02 (5 months ago)
Author:
Chuck.Esterbrook
Message:

Fixed: Cannot use the branch statement if the expression has a dynamic type.

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • cobra/trunk/Source/Statements.cobra

    r1575 r1576  
    293293        def writeSharpDef(sw as SharpWriter) 
    294294                base.writeSharpDef(sw) 
    295                 sw.write('switch(') 
    296                 _expr.writeSharpDef(sw) 
    297                 sw.write(') {\n') 
    298                 sw.indent 
    299                 for onPart in _onParts 
    300                         sep = '' 
    301                         for e in onPart.exprs 
    302                                 sw.write(sep) 
    303                                 sw.write('case ') 
    304                                 e.writeSharpDef(sw) 
    305                                 sw.write(': ') 
    306                                 sep = '\n' 
    307                         onPart.block.writeSharpDef(sw) 
    308                         if not onPart.block.stmts.count or not onPart.block.stmts[onPart.block.stmts.count-1] inherits ReturnStmt  # CC: use .last 
     295                if _expr.type.isDynamic 
     296                        # if the expression is dynamic, then use an if-else ladder with CobraImp.Equals( 
     297                        sw.writeLine('// branch [_expr.toCobraSource]') 
     298                         
     299                        varName = '_lh_branch_[.serialNum]' 
     300                        sw.write('[_expr.type.sharpRef] [varName] = ') 
     301                        _expr.writeSharpDef(sw) 
     302                        sw.writeLine(';') 
     303                                                 
     304                        elseWord = '' 
     305                        for onPart in _onParts 
     306                                sw.write('[elseWord]if (') 
     307                                sep = '' 
     308                                for e in onPart.exprs 
     309                                        sw.write(sep) 
     310                                        sw.write('CobraImp.Equals([varName], ') 
     311                                        e.writeSharpDef(sw, false) 
     312                                        sw.write(')') 
     313                                        sep = ' || ' 
     314                                sw.write(')') 
     315                                onPart.block.writeSharpDef(sw) 
     316                                elseWord = 'else ' 
     317                        if _elsePart 
     318                                sw.write('else ') 
     319                                _elsePart.writeSharpDef(sw) 
     320                else 
     321                        # for any other kind of expression, use a C# switch 
     322                        sw.write('switch(') 
     323                        _expr.writeSharpDef(sw) 
     324                        sw.write(') {\n') 
     325                        sw.indent 
     326                        for onPart in _onParts 
     327                                sep = '' 
     328                                for e in onPart.exprs 
     329                                        sw.write(sep) 
     330                                        sw.write('case ') 
     331                                        e.writeSharpDef(sw) 
     332                                        sw.write(': ') 
     333                                        sep = '\n' 
     334                                onPart.block.writeSharpDef(sw) 
     335                                if not onPart.block.stmts.count or not onPart.block.stmts[onPart.block.stmts.count-1] inherits ReturnStmt  # CC: use .last 
     336                                        sw.write('break;\n') 
     337                        if _elsePart 
     338                                sw.write('default: ') 
     339                                _elsePart.writeSharpDef(sw) 
    309340                                sw.write('break;\n') 
    310                 if _elsePart 
    311                         sw.write('default: ') 
    312                         _elsePart.writeSharpDef(sw) 
    313                         sw.write('break;\n') 
    314                 sw.dedent 
    315                 sw.write('}\n') 
     341                        sw.dedent 
     342                        sw.write('}\n') 
    316343 
    317344