[Gambas-user] Issue 194 in gambas: "IIf" is buggy

Randall Morgan rmorgan62 at ...626...
Wed Jan 18 23:58:55 CET 2012


I think the result is correct. I would expect a result of 1,0 as 1 is equal
to 1 but 2 is not equal to 1.

On Wed, Jan 18, 2012 at 2:22 PM, <gambas at ...2524...> wrote:

> Status: New
> Owner: ----
> Labels: Version Type-Bug Priority-Medium OpSys-Any Dist-Any Arch-Any
> Desktop-Any GUI-Any
>
> New issue 194 by emil.len... at ...626...: "IIf" is buggy
> http://code.google.com/p/gambas/issues/detail?id=194
>
> 1) Describe the problem.
> IIf does not do the correct job when the true part and false part are of
> different types.
>
> 2) GIVE THE FOLLOWING INFORMATIONS (if they are appropriate):
>
> Version: TRUNK
> Revision: r4404
>
> 3) Provide a little project that reproduces the bug or the crash.
>   Dim i As Integer
>   For i = 1 To 2
>     Print Int(IIf(i = 1, 1.0, 1))
>   Next
>
> 5) Explain clearly how to reproduce the bug or the crash.
> Running the code above prints out
> 1
> 0
> when
> 1
> 1
> is expected. This is due to that first time IIf returns a Float, but second
> time an Integer. IIf should convert the return value to the one that
> SUBR_check_good_type returns or something..., that is almost already
> implemented ;)
>
> This is the current code:
>
> void SUBR_if(ushort code)
> {
>        TYPE type;
>   SUBR_ENTER_PARAM(3);
>
>   VALUE_conv_boolean(PARAM);
>
>        switch (code & 0x1F)
>        {
>                case 0:
>
>                        type = SUBR_check_good_type(&PARAM[1], 2);
>                        if (type != T_VARIANT)
>                        {
>                                *PC |= 1;
>                                goto __TYPE;
>                        }
>                        else
>                        {
>                                *PC |= 2;
>                                goto __VARIANT;
>                        }
>
>                case 1:
>                __TYPE:
>
>                        *RETURN = PARAM->_boolean.value ? PARAM[1] :
> PARAM[2];
>
>                        break;
>
>                case 2:
>                __VARIANT:
>
>                        if (PARAM->_boolean.value)
>                        {
>                                VALUE_conv_variant(&PARAM[1]);
>                                *RETURN = PARAM[1];
>                        }
>                        else
>                        {
>                                VALUE_conv_variant(&PARAM[2]);
>                                *RETURN = PARAM[2];
>                        }
>
>                        break;
>        }
>
>   SUBR_LEAVE();
> }
>
>
>
> ------------------------------------------------------------------------------
> Keep Your Developer Skills Current with LearnDevNow!
> The most comprehensive online learning library for Microsoft developers
> is just $99.99! Visual Studio, SharePoint, SQL - plus HTML5, CSS3, MVC3,
> Metro Style Apps, more. Free future releases when you subscribe now!
> http://p.sf.net/sfu/learndevnow-d2d
> _______________________________________________
> Gambas-user mailing list
> Gambas-user at lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/gambas-user
>



-- 
If you ask me if it can be done. The answer is YES, it can always be done.
The correct questions however are... What will it cost, and how long will
it take?



More information about the User mailing list