Changeset 1576

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

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

Location:
cobra/trunk
Files:
3 modified

Legend:

Unmodified
Added
Removed
  • cobra/trunk/Developer/IntermediateReleaseNotes.text

    r1574 r1576  
    9797 
    9898* Fixed: Assignments (and other side effects) can appear in assert conditions even though they might be excluded during compilation or run-time. ticket:4 (hopscc) 
     99 
     100* Fixed: Cannot use the `branch` statement if the expression has a dynamic type. 
  • 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 
  • cobra/trunk/Tests/500-dynamic/126-dynamic-statements.cobra

    r1456 r1576  
    176176                        x += 1 
    177177                assert x == 10 
     178 
     179 
     180                # branch 
     181 
     182                assert .nameOf(1) == 'one' 
     183                assert .nameOf(2) == 'two' 
     184                assert .nameOf(3) == 'a few' 
     185                assert .nameOf(4) == 'a few' 
     186                assert .nameOf(5) == 'many' 
     187 
     188                assert .nameOf(1.0d) == 'one' 
     189                assert .nameOf(2.0d) == 'two' 
     190                assert .nameOf(3.0d) == 'a few' 
     191                assert .nameOf(4.0d) == 'a few' 
     192                assert .nameOf(5.0d) == 'many' 
     193         
     194 
     195        def nameOf(i as dynamic) as String 
     196                branch i 
     197                        on 1, return 'one' 
     198                        on 2, return 'two' 
     199                        on 3 or 4, return 'a few' 
     200                        else, return 'many' 
     201                return ''