Wiki

Changeset 2626

Show
Ignore:
Timestamp:
11/14/11 02:17:21 (6 months ago)
Author:
Charles.Esterbrook
Message:

Fixed: Using a local variable in a method or property in a mix-in causes false compilation errors.
reported-by:callisto

Location:
cobra/trunk
Files:
5 modified

Legend:

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

    r2607 r2626  
    629629 
    630630    get memberDefinition from _definition 
     631 
     632    def _innerClone 
     633        assert _definition is nil 
     634        base._innerClone 
     635        # to-do: _genericArgProxies 
     636        _args = _args.toList 
     637        for i in _args.count, _args[i] = _args[i].clone 
    631638 
    632639    def _bindImp is override 
  • cobra/trunk/Source/Node.cobra

    r2579 r2626  
    944944 
    945945 
    946     ## Misc 
    947      
     946    ## Cloning 
     947     
     948    def clone as dynamic 
     949        require not .didBindImp  # for now, not expecting a clone after binding implementation 
     950        ensure result is not nil 
     951        clone = .memberwiseClone to Stmt 
     952        clone._innerClone 
     953        return clone 
     954     
     955    def _innerClone 
     956        pass 
     957         
    948958    def memberwiseClone as Object is protected 
    949959        node = base.memberwiseClone to Node 
  • cobra/trunk/Source/Statements.cobra

    r2625 r2626  
    2828        pass 
    2929 
    30     def clone as Stmt 
    31         clone = .memberwiseClone to Stmt 
    32         clone._innerClone 
    33         return clone 
    34      
    35     def _innerClone 
    36         pass 
    37          
    3830    def noAssignmentAllowed(expr as Expr) 
    3931        """ 
     
    156148    get info from var 
    157149 
     150    def _innerClone 
     151        base._innerClone 
     152        _expr = _expr.clone 
     153        if _info, _info = _info.clone 
     154 
    158155    def _bindImp 
    159156        base._bindImp 
     
    190187 
    191188    get expr from var 
     189 
     190    def _innerClone 
     191        base._innerClone 
     192        _expr = _expr.clone 
    192193 
    193194    def _bindImp 
     
    232233    get elsePart from var as BlockStmt? 
    233234     
     235    def _innerClone 
     236        base._innerClone 
     237        _expr = _expr.clone 
     238        _onParts = _onParts.toList 
     239        for i in .onParts.count, .onParts[i] = .onParts[i].clone 
     240        _elsePart = _elsePart.clone 
     241 
    234242    def _bindImp 
    235243        base._bindImp 
     
    265273        has Subnodes 
    266274 
     275    def _innerClone 
     276        base._innerClone 
     277        _exprs = _exprs.toList 
     278        for i in _exprs.count, _exprs[i] = _exprs[i].clone 
     279        _block = _block.clone 
     280 
    267281    def _bindImp 
    268282        base._bindImp 
     
    309323        else 
    310324            return base.replaceChild(find, replace) 
     325 
     326    def _innerClone 
     327        base._innerClone 
     328        _stmts = _stmts.toList 
     329        for i in _stmts.count, _stmts[i] = _stmts[i].clone 
     330        # not expecting a clone after binding imp: 
     331        assert _ifInheritsVar is nil 
     332        assert _ifInheritsType is nil 
    311333 
    312334    def _bindImp 
     
    362384        .addField('block', _block) 
    363385 
     386    def _innerClone 
     387        base._innerClone 
     388        _block = _block.clone 
     389 
    364390    def _bindImp 
    365391        base._bindImp 
     
    399425        .addField('var', .var) 
    400426        .addField('block', .block) 
     427 
     428    def _innerClone 
     429        base._innerClone 
     430        _varExpr = _varExpr.clone 
     431        _block = _block.clone 
    401432 
    402433    def _bindImp 
     
    467498        .addField('block', _block) 
    468499 
     500    def _innerClone 
     501        base._innerClone 
     502        _start = _start.clone 
     503        _stop = _stop.clone 
     504        if _step, _step = _step.clone 
     505 
    469506    def _bindImp 
    470507        _start.bindImp 
     
    508545    get dir from var as int 
    509546     
     547    def _innerClone 
     548        base._innerClone 
     549        _start = _start.clone 
     550        _stop = _stop.clone 
     551        if _step, _step = _step.clone 
     552 
    510553    def _bindImp 
    511554        _start.bindImp 
     
    576619    get multiArgs from var as List<of NameExpr>? 
    577620     
     621    def _innerClone 
     622        base._innerClone 
     623        _what = _what.clone 
     624        if .multiArgs 
     625            _multiArgs = _multiArgs.toList 
     626            for i in .multiArgs.count, .multiArgs[i] = .multiArgs[i].clone 
     627 
    578628    def _bindImp 
    579629        _what.bindImp 
     
    689739        .addField('falseStmts', _falseStmts) 
    690740        .addField('ifInheritsVar', _ifInheritsVar) 
     741 
     742    def _innerClone 
     743        assert not _ifInheritsVar  # should not have bound imp yet 
     744        base._innerClone 
     745        _cond = _cond.clone 
     746        _trueStmts = _trueStmts.clone 
     747        if _falseStmts, _falseStmts = _falseStmts.clone 
    691748 
    692749    def _bindImp 
     
    801858    get target from var 
    802859 
     860    def _innerClone 
     861        base._innerClone 
     862        if _event, _event = _event.clone 
     863        if _target, _target = _target.clone 
     864 
    803865    def _bindImp 
    804866        base._bindImp 
     
    864926        .addField('block', .block) 
    865927 
     928    def _innerClone 
     929        base._innerClone 
     930        _expr = _expr.clone 
     931        _block = _block.clone 
     932 
    866933    def _bindImp 
    867934        base._bindImp 
     
    894961    get destination from var as Expr? 
    895962     
     963    def _innerClone 
     964        base._innerClone 
     965        if _destination, _destination = _destination.clone 
     966 
    896967    def _bindImp 
    897968        base._bindImp 
     
    913984 
    914985    get stop from var as bool 
     986 
     987    def _innerClone 
     988        base._innerClone 
     989        _args = _args.toList 
     990        for i in _args.count, _args[i] = _args[i].clone 
    915991 
    916992    def _bindImp 
     
    9441020        return _block.lastToken 
    9451021 
     1022    def _innerClone 
     1023        base._innerClone 
     1024        _block = _block.clone 
     1025 
    9461026    def _bindImp 
    9471027        base._bindImp 
     
    9851065 
    9861066    get exprs from var 
     1067 
     1068    def _innerClone 
     1069        base._innerClone 
     1070        _exprs = _exprs.toList 
     1071        for i in _exprs.count, _exprs[i] = _exprs[i].clone 
    9871072 
    9881073    def _bindImp 
     
    10911176    get expr from var 
    10921177 
     1178    def _innerClone 
     1179        base._innerClone 
     1180        if _expr, _expr = _expr.clone 
     1181 
    10931182    def _bindImp 
    10941183        base._bindImp 
     
    11541243        has Subnodes 
    11551244 
    1156     def _bindImp 
    1157         base._bindImp 
    1158         for expr in _exprs 
    1159             expr.bindImp 
     1245    def _innerClone 
     1246        base._innerClone 
     1247        _exprs = _exprs.toList 
     1248        for i in _exprs.count, _exprs[i] = _exprs[i].clone 
     1249 
     1250    def _bindImp 
     1251        base._bindImp 
     1252        for expr in _exprs, expr.bindImp 
    11601253 
    11611254 
     
    11991292    get finallyBlock from var 
    12001293     
     1294    def _innerClone 
     1295        base._innerClone 
     1296        _tryBlock = _tryBlock.clone 
     1297        _catchBlocks = _catchBlocks.toList 
     1298        for i in _catchBlocks.count, _catchBlocks[i] = _catchBlocks[i].clone 
     1299        if _successBlock, _successBlock = _successBlock.clone 
     1300        if _finallyBlock, _finallyBlock = _finallyBlock.clone 
     1301 
    12011302    def _bindImp 
    12021303        base._bindImp 
     
    12691370        return _block.lastToken 
    12701371 
     1372    def _innerClone 
     1373        base._innerClone 
     1374        assert _var is nil 
     1375        _block = _block.clone 
     1376 
    12711377    def _bindImp 
    12721378        base._bindImp 
     
    13091415 
    13101416    get expr from var 
     1417 
     1418    def _innerClone 
     1419        base._innerClone 
     1420        if _expr, _expr = _expr.clone 
    13111421 
    13121422    def _bindImp 
     
    13651475    get block from var 
    13661476 
     1477    def _innerClone 
     1478        assert _var is nil 
     1479        base._innerClone 
     1480        _varExpr = _varExpr.clone 
     1481        _initExpr = _initExpr.clone 
     1482        _block = _block.clone 
     1483 
    13671484    def _bindImp 
    13681485        base._bindImp 
     
    13941511        .addField('expr', _expr) 
    13951512        .addField('block', _block) 
     1513 
     1514    def _innerClone 
     1515        base._innerClone 
     1516        _expr = _expr.clone 
     1517        _block = _block.clone 
    13961518 
    13971519    def _bindExpr 
     
    14711593        base.addSubFields 
    14721594        .addField('expr', _expr) 
     1595 
     1596    def _innerClone 
     1597        base._innerClone 
     1598        if _expr, _expr = _expr.clone 
    14731599 
    14741600    def _bindImp 
     
    15511677    get block from var 
    15521678 
     1679    def _innerClone 
     1680        base._innerClone 
     1681        _targets = _targets.toList 
     1682        for i in _targets.count, _targets[i] = _targets[i].clone 
     1683        if _rightValues 
     1684            _rightValues = _rightValues.toList 
     1685            for i in _rightValues.count, _rightValues[i] = _rightValues[i].clone 
     1686        if _source, _source = _source.clone 
     1687        if _rvals 
     1688            _rvals = _rvals.toList 
     1689            for i in _rvals.count, _rvals[i] = _rvals[i].clone 
     1690        if _block, _block.clone 
     1691 
    15531692    def _bindImp 
    15541693        assert _source or _rvals 
  • cobra/trunk/Source/Utils.cobra

    r2600 r2626  
    346346    cue init 
    347347        base.init 
     348 
     349 
     350class BasicTests 
     351 
     352    test 
     353        # verify sanity 
     354        assert 2 + 2 == 4 
     355 
     356        # verify that .toList produces a new list when used on lists 
     357        t = [1, 2, 3] 
     358        assert t.toList is not t 
  • cobra/trunk/Tests/150-mixins/100-mixin-basics.cobra

    r2625 r2626  
    1212        return total 
    1313 
     14    def moreLocalVarTesting 
     15        if true 
     16            a = 1  # test local var inside a compound statement 
     17            CobraCore.noOp(a) 
     18        while false 
     19            b = 1 
     20            CobraCore.noOp(b) 
     21        if false 
     22            using tr = File.openText('foo') 
     23                pass 
     24         
    1425 
    1526mixin Named