Changeset 2319
- Timestamp:
- 03/15/10 05:32:06 (2 years ago)
- Location:
- cobra/trunk
- Files:
-
- 1 added
- 4 modified
-
Developer/IntermediateReleaseNotes.text (modified) (1 diff)
-
Source/BinaryOpExpr.cobra (modified) (1 diff)
-
Source/Expr.cobra (modified) (24 diffs)
-
Source/Members.cobra (modified) (3 diffs)
-
Tests/340-contracts/120-ensure-method-error.cobra (added)
Legend:
- Unmodified
- Added
- Removed
-
cobra/trunk/Developer/IntermediateReleaseNotes.text
r2318 r2319 448 448 449 449 * 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 96 96 if _right.hasError, return true 97 97 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 98 103 99 104 get willChangeVar as bool is override -
cobra/trunk/Source/Expr.cobra
r2316 r2319 4 4 """ 5 5 6 interface IExpr 7 inherits ISyntaxNode 6 interface IExpr inherits ISyntaxNode 8 7 """ 9 8 This is mainly used for categorization. … … 43 42 44 43 45 class Expr 46 is abstract, partial 47 inherits Stmt 48 implements IExpr 44 class Expr inherits Stmt implements IExpr is abstract, partial 49 45 """ 50 46 TODO: Add a .subexpressions iterator which can then be used by .hasError, .willChangeVar and possibly others. … … 81 77 .addField('type', _type) 82 78 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 83 83 84 84 pro argumentLabel from var … … 250 250 251 251 252 interface IPotentialTypeExpr 253 inherits IExpr 252 interface IPotentialTypeExpr inherits IExpr 254 253 """ 255 254 An implementor of IPotentialType *could* be a representation of a type. … … 386 385 get hasError as bool 387 386 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 388 391 389 392 def toCobraSource as String is override … … 551 554 552 555 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 553 560 554 561 def _bindImp is override … … 819 826 return false 820 827 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 821 832 def toCobraSource as String is override 822 833 sb = StringBuilder() … … 900 911 901 912 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 902 923 903 924 get willChangeVar as bool is override … … 1113 1134 return false 1114 1135 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 1115 1142 get willChangeVar as bool is override 1116 1143 if base.willChangeVar, return true … … 1191 1218 for arg in _args, if arg.hasError, return true 1192 1219 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 1193 1225 1194 1226 get willChangeVar as bool is override … … 1295 1327 return false 1296 1328 1329 get allExprs as Expr* 1330 for expr in base.allExprs, yield expr 1331 for expr in .expr.allExprs, yield expr 1332 1297 1333 get willChangeVar as bool is override 1298 1334 if _expr.willChangeVar, return true … … 1503 1539 return false 1504 1540 1541 get allExprs as Expr* 1542 for expr in base.allExprs, yield expr 1543 for expr in .expr.allExprs, yield expr 1544 1505 1545 get willChangeVar as bool is override 1506 1546 if _expr.willChangeVar, return true … … 1591 1631 if e inherits IndexExpr, return e.toCobraSource 1592 1632 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 1593 1638 1594 1639 get willChangeVar as bool is override … … 1817 1862 if _expr.hasError, return true 1818 1863 return false 1864 1865 get allExprs as Expr* 1866 for expr in base.allExprs, yield expr 1867 for expr in .expr.allExprs, yield expr 1819 1868 1820 1869 get willChangeVar as bool is override … … 1890 1939 if _expr and _expr.hasError, return true 1891 1940 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 1892 1945 1893 1946 def toCobraSource as String is override … … 2075 2128 2076 2129 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 2077 2134 2078 2135 def _bindImp … … 2220 2277 return false 2221 2278 2279 get allExprs as Expr* 2280 for expr in base.allExprs, yield expr 2281 for expr in .expr.allExprs, yield expr 2282 2222 2283 get willChangeVar as bool is override 2223 2284 if base.willChangeVar, return true … … 2306 2367 2307 2368 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 2308 2373 2309 2374 def _bindImp is override … … 2612 2677 return false 2613 2678 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 2614 2683 def toCobraSource as String is override 2615 2684 sb = StringBuilder() … … 2655 2724 if _expr.hasError, return true 2656 2725 return false 2726 2727 get allExprs as Expr* 2728 for expr in base.allExprs, yield expr 2729 for expr in .expr.allExprs, yield expr 2657 2730 2658 2731 def toCobraSource as String is override … … 2777 2850 for expr in _exprs, if expr.hasError, return true 2778 2851 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 2779 2856 2780 2857 get willChangeVar as bool is override … … 2914 2991 return true 2915 2992 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 2916 2997 2917 2998 get willChangeVar as bool is override … … 3005 3086 return false 3006 3087 3088 get allExprs as Expr* 3089 for expr in base.allExprs, yield expr 3090 for expr in .expr.allExprs, yield expr 3091 3007 3092 get willChangeVar as bool is override 3008 3093 if _expr.willChangeVar, return true … … 3089 3174 base.init(opToken) 3090 3175 _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 3092 3183 def _bindImp is override 3093 3184 base._bindImp -
cobra/trunk/Source/Members.cobra
r2310 r2319 1665 1665 def _bindImp is override 1666 1666 base._bindImp 1667 # note: expressions cannot refer to locals in contracts 1667 1668 newExprs = List<of Expr>() 1668 i = 01669 1669 for expr in _exprs 1670 1670 expr.bindImp # TODO: error recovery 1671 1671 assert expr.type 1672 if not expr.hasError, _checkForLocalReferences(expr) 1672 1673 if expr.type is not .compiler.boolType 1673 1674 expr = TruthExpr(expr).bindAll to Expr # CC: axe cast when Cobra supports "as this" 1674 1675 assert expr.type 1675 1676 newExprs.add(expr) 1676 i += 11677 1677 _exprs.clear 1678 1678 _exprs.addRange(newExprs) 1679 1679 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 1680 1687 def checkConnectToken 1681 1688 """ … … 1722 1729 1723 1730 1724 class EnsurePart 1725 is partial 1726 inherits ContractPart 1731 class EnsurePart inherits ContractPart is partial 1727 1732 1728 1733 cue init(codeMember as AbstractMethod) … … 1747 1752 return have 1748 1753 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 1751 1757 base._bindImp 1752 1758 else 1753 resultLocal = _codeMember.findLocal('result')1759 resultLocal = codeMember.findLocal('result') 1754 1760 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) 1759 1763 try 1760 1764 base._bindImp 1761 1765 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')



