Wiki

Changeset 2319

Show
Ignore:
Timestamp:
03/15/10 05:32:06 (2 years ago)
Author:
Chuck.Esterbrook
Message:

Fixed: References to local variables in ensure are not flagged as errors.
ticket:198

Location:
cobra/trunk
Files:
1 added
4 modified

Legend:

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

    r2318 r2319  
    448448 
    449449* Fixed: Unable compile C#-only sources. ticket:194 
     450 
     451* Fixed: References to local variables in `ensure` are not flagged as errors.  ticket:198 
  • cobra/trunk/Source/BinaryOpExpr.cobra

    r2312 r2319  
    9696        if _right.hasError, return true 
    9797        return false 
     98 
     99    get allExprs as Expr* 
     100        for expr in base.allExprs, yield expr 
     101        for expr in .left.allExprs, yield expr 
     102        for expr in .right.allExprs, yield expr 
    98103 
    99104    get willChangeVar as bool is override 
  • cobra/trunk/Source/Expr.cobra

    r2316 r2319  
    44""" 
    55 
    6 interface IExpr 
    7     inherits ISyntaxNode 
     6interface IExpr inherits ISyntaxNode 
    87    """ 
    98    This is mainly used for categorization. 
     
    4342 
    4443 
    45 class Expr 
    46     is abstract, partial 
    47     inherits Stmt 
    48     implements IExpr 
     44class Expr inherits Stmt implements IExpr is abstract, partial 
    4945    """ 
    5046    TODO: Add a .subexpressions iterator which can then be used by .hasError, .willChangeVar and possibly others. 
     
    8177        .addField('type', _type) 
    8278        if .definition, .addField('definition', .definition) 
     79 
     80    get allExprs as Expr* 
     81        """ Subclasses should override to yield the .allExprs of their direct sub-expressions. """ 
     82        yield this 
    8383 
    8484    pro argumentLabel from var 
     
    250250 
    251251 
    252 interface IPotentialTypeExpr 
    253     inherits IExpr 
     252interface IPotentialTypeExpr inherits IExpr 
    254253    """ 
    255254    An implementor of IPotentialType *could* be a representation of a type. 
     
    386385    get hasError as bool 
    387386        return base.hasError or _expr.hasError 
     387 
     388    get allExprs as Expr* 
     389        for expr in base.allExprs, yield expr 
     390        for expr in .expr.allExprs, yield expr 
    388391 
    389392    def toCobraSource as String is override 
     
    551554 
    552555    get memberDefinition from _definition 
     556 
     557    get allExprs as Expr* 
     558        for expr in base.allExprs, yield expr 
     559        for arg in .args, for expr in arg.allExprs, yield expr 
    553560 
    554561    def _bindImp is override 
     
    819826        return false 
    820827 
     828    get allExprs as Expr* 
     829        for expr in base.allExprs, yield expr 
     830        for arg in .args, for expr in arg.allExprs, yield expr 
     831 
    821832    def toCobraSource as String is override 
    822833        sb = StringBuilder() 
     
    900911 
    901912    get step from _step 
     913 
     914    get allExprs as Expr* 
     915        for expr in base.allExprs, yield expr 
     916        for expr in .nameExpr.allExprs, yield expr 
     917        for expr in .what.allExprs, yield expr 
     918        if .whereExpr, for expr in .whereExpr.allExprs, yield expr 
     919        for expr in .getExpr.allExprs, yield expr 
     920        if .start, for expr in .start.allExprs, yield expr 
     921        if .stop, for expr in .stop.allExprs, yield expr 
     922        if .step, for expr in .step.allExprs, yield expr 
    902923 
    903924    get willChangeVar as bool is override 
     
    11131134        return false 
    11141135 
     1136    get allExprs as Expr* 
     1137        for expr in base.allExprs, yield expr 
     1138        for expr in .cond.allExprs, yield expr 
     1139        for expr in .tpart.allExprs, yield expr 
     1140        for expr in .fpart.allExprs, yield expr 
     1141 
    11151142    get willChangeVar as bool is override 
    11161143        if base.willChangeVar, return true 
     
    11911218        for arg in _args, if arg.hasError, return true 
    11921219        return false 
     1220 
     1221    get allExprs as Expr* 
     1222        for expr in base.allExprs, yield expr 
     1223        for expr in .target.allExprs, yield expr 
     1224        for arg in .args, for expr in arg.allExprs, yield expr 
    11931225 
    11941226    get willChangeVar as bool is override 
     
    12951327        return false 
    12961328 
     1329    get allExprs as Expr* 
     1330        for expr in base.allExprs, yield expr 
     1331        for expr in .expr.allExprs, yield expr 
     1332 
    12971333    get willChangeVar as bool is override 
    12981334        if _expr.willChangeVar, return true 
     
    15031539        return false 
    15041540 
     1541    get allExprs as Expr* 
     1542        for expr in base.allExprs, yield expr 
     1543        for expr in .expr.allExprs, yield expr 
     1544 
    15051545    get willChangeVar as bool is override 
    15061546        if _expr.willChangeVar, return true 
     
    15911631        if e inherits IndexExpr, return e.toCobraSource 
    15921632        throw FallThroughException(e) 
     1633 
     1634    get allExprs as Expr* 
     1635        for expr in base.allExprs, yield expr 
     1636        for expr in .expr.allExprs, yield expr 
     1637        for arg in .args, for expr in arg.allExprs, yield expr 
    15931638 
    15941639    get willChangeVar as bool is override 
     
    18171862        if _expr.hasError, return true 
    18181863        return false 
     1864 
     1865    get allExprs as Expr* 
     1866        for expr in base.allExprs, yield expr 
     1867        for expr in .expr.allExprs, yield expr 
    18191868 
    18201869    get willChangeVar as bool is override 
     
    18901939        if _expr and _expr.hasError, return true 
    18911940        return false 
     1941 
     1942    get allExprs as Expr* 
     1943        for expr in base.allExprs, yield expr 
     1944        if .expr, for expr in .expr.allExprs, yield expr 
    18921945 
    18931946    def toCobraSource as String is override 
     
    20752128 
    20762129    get notExpr from var 
     2130 
     2131    get allExprs as Expr* 
     2132        for expr in base.allExprs, yield expr 
     2133        for expr in .expr.allExprs, yield expr 
    20772134 
    20782135    def _bindImp 
     
    22202277        return false 
    22212278 
     2279    get allExprs as Expr* 
     2280        for expr in base.allExprs, yield expr 
     2281        for expr in .expr.allExprs, yield expr 
     2282 
    22222283    get willChangeVar as bool is override 
    22232284        if base.willChangeVar, return true 
     
    23062367 
    23072368    get expr from var 
     2369 
     2370    get allExprs as Expr* 
     2371        for expr in base.allExprs, yield expr 
     2372        for expr in .expr.allExprs, yield expr 
    23082373 
    23092374    def _bindImp is override 
     
    26122677        return false 
    26132678 
     2679    get allExprs as Expr* 
     2680        for expr in base.allExprs, yield expr 
     2681        for item in .items, for expr in item.allExprs, yield expr 
     2682 
    26142683    def toCobraSource as String is override 
    26152684        sb = StringBuilder() 
     
    26552724        if _expr.hasError, return true 
    26562725        return false 
     2726 
     2727    get allExprs as Expr* 
     2728        for expr in base.allExprs, yield expr 
     2729        for expr in .expr.allExprs, yield expr 
    26572730 
    26582731    def toCobraSource as String is override 
     
    27772850        for expr in _exprs, if expr.hasError, return true 
    27782851        return false 
     2852 
     2853    get allExprs as Expr* 
     2854        for expr in base.allExprs, yield expr 
     2855        for expr in .exprs, for expr2 in expr.allExprs, yield expr2 
    27792856 
    27802857    get willChangeVar as bool is override 
     
    29142991                    return true 
    29152992        return false 
     2993 
     2994    get allExprs as Expr* 
     2995        for expr in base.allExprs, yield expr 
     2996        for entry in .entries, for element in entry, for expr in element.allExprs, yield expr 
    29162997 
    29172998    get willChangeVar as bool is override 
     
    30053086        return false 
    30063087 
     3088    get allExprs as Expr* 
     3089        for expr in base.allExprs, yield expr 
     3090        for expr in .expr.allExprs, yield expr 
     3091 
    30073092    get willChangeVar as bool is override 
    30083093        if _expr.willChangeVar, return true 
     
    30893174            base.init(opToken) 
    30903175            _items, _operations = items, operations 
    3091      
     3176 
     3177    get items from var 
     3178 
     3179    get allExprs as Expr* 
     3180        for expr in base.allExprs, yield expr 
     3181        for item in .items, for expr in item.allExprs, yield expr 
     3182 
    30923183    def _bindImp is override 
    30933184        base._bindImp 
  • cobra/trunk/Source/Members.cobra

    r2310 r2319  
    16651665    def _bindImp is override 
    16661666        base._bindImp 
     1667        # note: expressions cannot refer to locals in contracts 
    16671668        newExprs = List<of Expr>() 
    1668         i = 0 
    16691669        for expr in _exprs 
    16701670            expr.bindImp  # TODO: error recovery 
    16711671            assert expr.type 
     1672            if not expr.hasError, _checkForLocalReferences(expr) 
    16721673            if expr.type is not .compiler.boolType 
    16731674                expr = TruthExpr(expr).bindAll to Expr # CC: axe cast when Cobra supports "as this" 
    16741675                assert expr.type 
    16751676            newExprs.add(expr) 
    1676             i += 1 
    16771677        _exprs.clear 
    16781678        _exprs.addRange(newExprs) 
    16791679 
     1680    def _checkForLocalReferences(expr as Expr) 
     1681        for expr in expr.allExprs 
     1682            if expr inherits IdentifierExpr 
     1683                if expr.definition inherits LocalVar 
     1684                    if expr.name <> 'result' or not expr.definition.isImplicit 
     1685                        expr.recordError('Cannot refer to local variable "[expr.name]" in a contract. Use an "assert" statement in the implementation to verify conditions on locals.') 
     1686     
    16801687    def checkConnectToken 
    16811688        """ 
     
    17221729 
    17231730     
    1724 class EnsurePart 
    1725     is partial 
    1726     inherits ContractPart 
     1731class EnsurePart inherits ContractPart is partial 
    17271732 
    17281733    cue init(codeMember as AbstractMethod) 
     
    17471752        return have 
    17481753 
    1749     def _bindImp is override 
    1750         if _codeMember.resultType is .compiler.voidType 
     1754    def _bindImp 
     1755        codeMember = _codeMember 
     1756        if codeMember.resultType is .compiler.voidType 
    17511757            base._bindImp 
    17521758        else 
    1753             resultLocal = _codeMember.findLocal('result') 
     1759            resultLocal = codeMember.findLocal('result') 
    17541760            resultBuiltIn = ResultVar(.token, _codeMember) 
    1755             if resultLocal 
    1756                 _codeMember.replaceLocal(resultBuiltIn) 
    1757             else 
    1758                 _codeMember.addLocal(resultBuiltIn) 
     1761            if resultLocal, codeMember.replaceLocal(resultBuiltIn) 
     1762            else, codeMember.addLocal(resultBuiltIn) 
    17591763            try 
    17601764                base._bindImp 
    17611765            finally 
    1762                 if resultLocal 
    1763                     _codeMember.replaceLocal(resultLocal to LocalVar) 
    1764                 else 
    1765                     _codeMember.removeLocal('result') 
     1766                if resultLocal, codeMember.replaceLocal(resultLocal to LocalVar) 
     1767                else, codeMember.removeLocal('result')