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); }
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; }
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; } }
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; } }