[Nice-commit] Nice/src/bossa/syntax typecheck.nice,1.125,1.126
Brought to you by:
bonniot
|
From: Artem Gr K. <ar...@us...> - 2005-03-07 08:17:04
|
Update of /cvsroot/nice/Nice/src/bossa/syntax In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv20664/src/bossa/syntax Modified Files: typecheck.nice Log Message: Nullness analisys on assignments is partially implemented (RFE 681385). Index: typecheck.nice =================================================================== RCS file: /cvsroot/nice/Nice/src/bossa/syntax/typecheck.nice,v retrieving revision 1.125 retrieving revision 1.126 diff -C2 -d -r1.125 -r1.126 *** typecheck.nice 22 Feb 2005 10:26:42 -0000 1.125 --- typecheck.nice 7 Mar 2005 08:16:53 -0000 1.126 *************** *** 52,55 **** --- 52,70 ---- e.value = e.value.resolveOverloading(to.getType()); checkAssignment(to.getType(), e.value); + + // RFE 681385 + // To debug in jdb use "stop at bossa.syntax.fun:LINE". + if( variable != null ){ + let valueType = e.value.type, toType = to.type, varType = variable.type; + if( valueType != null && toType != null && varType != null ){ + let toNotNull = isNotNull( toType ); + let valueNotNull = isNotNull( valueType ); + if( ! toNotNull && valueNotNull ){ + //bossa.util.User.warning( e, e.toString() ); + mlsub.typing.Monotype type = varType; + mlsub.typing.Monotype sureType = makeSure( type ); + variable.setVarType( now: sureType, otherBranch: type, out: type ); + } } } + } catch(mlsub.typing.TypingEx t){ *************** *** 417,424 **** void enterElse() { ! while (levels.size() > 0 && levels.peek() == ifLevel * 2) { ! levels.pop(); ! (MonoSymbol variable, mlsub.typing.Monotype baseType) = conditionalTypes.pop(); variable.type = baseType; } --- 432,443 ---- void enterElse() { ! // "out" (ifLevel * 2) and "otherBranch" (ifLevel * 2 + 1) records might be mixed in the stack, ! // therefore we scan the tail of the stack while "level >= ifLevel * 2", ignoring "out" records. ! for (int i = levels.size() - 1; i >= 0; i--) { ! int level = levels.get(i); ! if( level < ifLevel * 2 ) break; ! if( level != ifLevel * 2 + 1 ) continue; ! (MonoSymbol variable, mlsub.typing.Monotype baseType) = conditionalTypes.get(i); variable.type = baseType; } *************** *** 426,435 **** void exitIf() ! { ! while (levels.size() > 0 && levels.peek() == ifLevel * 2 + 1) { ! levels.pop(); (MonoSymbol variable, mlsub.typing.Monotype baseType) = conditionalTypes.pop(); ! variable.type = baseType; } ifLevel--; --- 445,457 ---- void exitIf() ! { ! // since "out" and "otherBranch" records might be mixed, ! // we should pop everything which is "level >= ifLevel * 2", ! // but ignore "otherBranch" (ifLevel * 2 + 1) records. ! while (levels.size() > 0 && levels.peek() >= ifLevel * 2) { ! int level = levels.pop(); (MonoSymbol variable, mlsub.typing.Monotype baseType) = conditionalTypes.pop(); ! if( level == ifLevel * 2 ) variable.type = baseType; } ifLevel--; *************** *** 438,442 **** void pushBranchType(MonoSymbol variable, mlsub.typing.Monotype baseType) { ! levels.push(2 * ifLevel); conditionalTypes.push((variable, baseType)); } --- 460,464 ---- void pushBranchType(MonoSymbol variable, mlsub.typing.Monotype baseType) { ! levels.push(2 * ifLevel + 1); conditionalTypes.push((variable, baseType)); } *************** *** 444,448 **** void pushOuterType(MonoSymbol variable, mlsub.typing.Monotype baseType) { ! levels.push(2 * ifLevel + 1); conditionalTypes.push((variable, baseType)); } --- 466,470 ---- void pushOuterType(MonoSymbol variable, mlsub.typing.Monotype baseType) { ! levels.push(2 * ifLevel); conditionalTypes.push((variable, baseType)); } *************** *** 451,455 **** { for (int i = 0; i < levels.size(); i++) ! if (levels.get(i) % 2 == 1) { (MonoSymbol v, mlsub.typing.Monotype t) = conditionalTypes.get(i); --- 473,477 ---- { for (int i = 0; i < levels.size(); i++) ! if (levels.get(i) % 2 == 0) { (MonoSymbol v, mlsub.typing.Monotype t) = conditionalTypes.get(i); *************** *** 940,946 **** typecheck(TryStmt t) { ! typecheck(t.body); ! t.catches.foreach(ACatch c => typecheck(c.body)); ! typecheck(t.finallyBody); } --- 962,975 ---- typecheck(TryStmt t) { ! enterBlock(); ! try{ ! typecheck( t.body ); ! enterElse(); ! for( ACatch c : t.catches ){ ! typecheck( c.body ); ! enterElse(); ! } ! typecheck( t.finallyBody ); ! }finally{ exitIf(); } } *************** *** 1066,1069 **** --- 1095,1108 ---- } + boolean isNotNull( mlsub.typing.Polytype type ) + { + try{ + checkNotNull( type ); // Will throw a TypingEx if the 'value' is not a sureTC. + return true; + }catch( mlsub.typing.TypingEx skip ){ + return false; + } + } + // Local Variables: // nice-xprogram: "../bin/nicec -d ../classes" |