コード例 #1
0
        protected override Boolean handleIf(IfStatementNode ifStatement, HashSet <StatementNode> visited)
        {
            var state = expressionChecker.handleExpression(ifStatement.Condition, visited, true);

            switch (state)
            {
            case Assigned:
                return(Boolean.FALSE);

            case AssignedAfterTrue:
                if (ifStatement.IfFalse != null)
                {
                    return(visitOrigin(ifStatement.IfFalse));
                }
                break;

            case AssignedAfterFalse:
                return(visitOrigin(ifStatement.IfTrue));

            default:
                ExpressionInfo cinfo = ifStatement.getCondition().getUserData(typeof(ExpressionInfo));
                if (cinfo.IsConstant)
                {
                    if ((Boolean)cinfo.Value)
                    {
                        return(visitOrigin(ifStatement.IfTrue));
                    }
                    else
                    {
                        return(visitOrigin(ifStatement.IfTrue));
                    }
                }
                Boolean tr = visitOrigin(ifStatement.IfTrue);
                Boolean rr = Boolean.TRUE;
                if (ifStatement.getIfFalse() != null)
                {
                    rr = visitOrigin(ifStatement.IfFalse);
                }
                if (!tr && !rr)
                {
                    return(Boolean.FALSE);
                }
                break;
            }
            return(Boolean.TRUE);
        }
コード例 #2
0
 private MethodInfo resolveMethodGroup(ExpressionInfo info, MethodInfo method, ArrayList<TypeInfo> paramTypes) {
     MethodInfo result = null;
     foreach (var mi in info.Members) {
         if (mi.MemberKind != MemberKind.Method) {
             return null;
         }
         var meth = mi.Method;
         if (method.IsVarargs != meth.IsVarargs) {
             continue;
         }
         int nparams = meth.Parameters.count();
         if (nparams != paramTypes.size()) {
             continue;
         }
         var match = true;
         int i = 0;
         foreach (var p in meth.Parameters) {
             if (p.Type != paramTypes[i]) {
                 match = false;
                 break;
             }
             i++;
         }
         if (match) {
             if (result != null) {
                 return null;
             }
             result = meth;
         }
     }
     return result;
 }
コード例 #3
0
 static bool isZero(ExpressionInfo info) {
     if (info.IsConstant) {
         Object value = info.Value;
         if (value instanceof Double) {
             return ((Double)value).doubleValue() == 0d;
         } else if (value instanceof Float) {
             return ((Float)value).floatValue() == 0f;
         } else if (value instanceof Long) {
             return ((Long)value).longValue() == 0l;
         } else if (value instanceof Integer) {
             return ((Integer)value).intValue() == 0;
         } else if (value instanceof Character) {
             return ((Character)value).charValue() == 0;
         } else if (value instanceof Byte) {
             return ((Byte)value).byteValue() == 0;
         } else if (value instanceof Short) {
             return ((Short)value).shortValue() == 0;
         }
     }
コード例 #4
0
 bool resolveDelegate(TypeInfo type, ExpressionNode arg, ExpressionInfo targetInfo, SyntaxNode node) {
     var invokeMethod = getInvokeMethod(type);
     int nparams = invokeMethod.Parameters.count();
     var ainfo = arg.getUserData(typeof(ExpressionInfo));
     if (ainfo.Members == null) {
         return true;
     }
     MemberInfo foundMember = null;
     foreach (var member in ainfo.Members) {
         switch (member.MemberKind) {
         case Method:
             var meth = member.Method;
             if (meth.Parameters.count() != nparams || meth.IsVarargs != invokeMethod.IsVarargs) {
                 continue;
             }
             if (nparams == 0) {
                 if (foundMember != null) {
                     if (node != null) {
                         throw context.error(CompileErrorId.AmbiguousMembers, node,
                             BytecodeHelper.getDisplayName(member.DeclaringType) + "." + BytecodeHelper.getDisplayName(member.Method),
                             BytecodeHelper.getDisplayName(foundMember.DeclaringType) + "."
                             + BytecodeHelper.getDisplayName(foundMember.Method));
                     } else {
                         return false;
                     }
                 }
                 foundMember = member;
                 ainfo.Member = member;
                 if (meth.IsExcludedFromCompilation || CompilerHelper.shouldIgnoreCalls(context, meth)) {
                     if (node != null) {
                         throw context.error(CompileErrorId.NotGeneratedMethodUsage, node,
                             BytecodeHelper.getDisplayName(member.DeclaringType) + "." + BytecodeHelper.getDisplayName(member.Method));
                     } else {
                         return false;
                     }
                 }
                 if (targetInfo != null) {
                     targetInfo.Type = type;
                     targetInfo.Method = meth;
                 }
                 continue;
             }
             var it1 = meth.Parameters.iterator();
             var it2 = invokeMethod.Parameters.iterator();
             var sameParams = true;
             while (it1.hasNext()) {
                 if (it1.next().Type != it2.next().Type) {
                     sameParams = false;
                     break;
                 }
             }
             if (sameParams) {
                 if (foundMember != null) {
                     if (node != null) {
                         throw context.error(CompileErrorId.AmbiguousMembers, node,
                             BytecodeHelper.getDisplayName(member.DeclaringType) + "." + BytecodeHelper.getDisplayName(member.Method),
                             BytecodeHelper.getDisplayName(foundMember.DeclaringType) + "." + foundMember.Name);
                     } else {
                         return false;
                     }
                 }
                 foundMember = member;
                 ainfo.Member = member;
                 if (targetInfo != null) {
                     targetInfo.Type = type;
                     targetInfo.Method = meth;
                 }
                 continue;
             }
             break;
         case Local:
             ainfo.Member = member;
             return true;
         case Field:
         case Property:
             foundMember = member;
             ainfo.Member = member;
             break;
         }
     }
     if (foundMember != null) {
         return true;
     }
     if (node != null) {
         throw context.error(CompileErrorId.NoEligibleOverload, node, ainfo.Members.first().Name);
     } else {
         return false;
     }
 }