/*
By Iri for tests only
Don't use it to any product code !
 
Based from kernel/scolobj.c
*/

#include "../include/scol_gtk_reflex.h"
int scol_gtk_OBJfindTM (mmachine m, int typ, int objm)
{
    int p, q;

    p = MMgetglobal(m, 3);
    while(p != NIL)
    {
        p>>=1;
        q = MMfetch (m, p, 0)>>1;
        if (q != NIL)
        {
            if ((MMfetch (m, q, 0) == objm) &&(MMfetch (m, q, 2) == typ * 2))
                return q;
        }
        p = MMfetch (m, p, 1);
    }
    return -1;
}

int scol_gtk_OBJbeginreflex (mmachine m, int typ, int handsys, int cbnum)
{
    int p;

    p = MMgetglobal(m,3);
    p>>=1;
    p = MMfetch(m, p, 0)>>1;
    MMsetglobal (m, OFFSCCUR, MMfetch (m, p, OFFOBJCHN));
    if (MMpush (m, MMgetglobal (m,OFFSCCUR)))
        return MERRMEM;
    if (MMpush (m, MMfetch (m, p, OFFOBJREF0 + cbnum * 2)))
        return MERRMEM;
    if (MMpush (m, MMfetch (m, p, 0)))
        return MERRMEM;
    if (MMpush(m, MMfetch (m, p, OFFOBJREF0 + cbnum * 2 + 1)))
        return MERRMEM;
    return 0;
}



int scol_gtk_OBJaddreflex (mmachine m,int typ, int cbnum)
{
    int p;

    p = scol_gtk_OBJfindTM (m, typ, MMget (m, 2));
    MMstore (m, p, OFFOBJREF0 + 2 * cbnum + 1, MMpull (m));
    MMstore (m, p, OFFOBJREF0 + 2 * cbnum, MMpull (m));

    return 0;
}

int scol_gtk_OBJcallreflex (mmachine m, int nbarg)
{
    int i;

    if (MMpush (m, MMget (m, nbarg+2)))
        return MERRMEM;

    i = Minterpreter (m);
    MMsetglobal (m, OFFSCCUR, MMget (m, 2));
    MMset (m, 1, MMget (m, 0));
    MMechostr (0, "scol_gtk_OBJcallreflex : i = %d\n", i);
    if (i != 1) return i;
    MMpull (m);
    MMpull (m);
    MMpull (m);
    return 0;
}

