public static StateBuffer run(YVALUE v, StateBuffer sb, PointervarMode mode = PointervarMode.GET)
        {
            var nsb  = sb;
            var item = new PointervarItem(); //先行アイテム。中身なし

            item.mode = mode;

            nsb.m_pvitem = item;

            var size = v.list_size();

            for (int i = 0; i < size; i++)
            {
                var vn = v.list_at(i);
                if (vn == null)
                {
                    throw new SystemException("Unexpected");
                }

                if (vn.IsType(YDEF.PERIOD))
                {
                    continue;
                }

                item        = nsb.m_pvitem;
                item.setter = null;
                item.getter = null;

                nsb = run_script.run(vn, nsb.curnull());

                item = nsb.m_pvitem;
                if (i < size - 1 && item.o == null) //最後尾前のnull確認。 最後尾のNULLは容認。
                {
                    if (sys.DEBUGMODE)
                    {
                        sys.logline("Null Pointer, but ignored at line:" + v.get_dbg_line(true) + " file:" + v.get_dbg_file());
                    }

                    break;                               //最近の流行りを取り入れてnullだったら後ろは処理しない
                }

                if (i < size - 1)
                {
                    if (item.getter != null)
                    {
                        item.o       = item.getter();
                        nsb.m_pvitem = item;
                    }
                }
            }

            item = nsb.m_pvitem;

            if (item.mode == PointervarMode.SET)
            {
                nsb.m_cur = item;//.setter;
            }
            else if (item.mode == PointervarMode.GET)
            {
                if (item.getter != null)
                {
                    nsb.m_cur = item.getter();
                }
                else
                {
                    nsb.m_cur = item.o;
                }
            }
            else if (item.mode == PointervarMode.NEW)
            {
                nsb.m_cur = item.o;
            }
            else if (item.mode == PointervarMode.ITEM)
            {
                nsb.m_cur = item;
            }
            nsb.pvitemnull();

            return(nsb);
        }
Ejemplo n.º 2
0
        internal static YVALUE _convert(YVALUE v)
        {
            if (v.type == YDEF.get_type(YDEF.sx_expr_clause) && v.list_size() == 2 && v.list_at(0).IsType(YDEF.QSTR))// "using ..."節か?
            {
                var s = v.FindValueByTravarse(YDEF.QSTR).GetString();
                sys.logline(s);

                if (!string.IsNullOrEmpty(s))
                {
                    s = s.Trim('"');
                    var tokens = s.Split(' ');
                    if (tokens.Length >= 2 && tokens[0] == "using")
                    {
                        var a = tokens[1];
                        if (!m_prefix_list.Contains(a))
                        {
                            m_prefix_list.Add(a);//格納
                        }
                    }
                }
                return(v);
            }

            if (v.type == YDEF.get_type(YDEF.sx_pointervar_clause))//ポインタ値節か?
            {
                //中身確認
                //リスト先頭が1要素でNAMEであれば、そのNAMEを調査する
                var vt = v.list_at(0);
                vt        = Checktype.ChangeIfType(vt, m_prefix_list);
                v.list[0] = vt;

#if obs
                //リスト最後尾がfunc要素であれば、引数を対象に
                var ve = v.list_at(v.list.Count - 1);
                if (ve != null && ve.IsType(YDEF.sx_func))
                {
                    var vf = ve.FindValueByTravarse(YDEF.sx_func);
                    var v2 = vf.list_at(1);
                    if (v2 != null)
                    {
                        v2         = _convert(v2);
                        vf.list[1] = v2;
                    }
                }
#endif
                //リスト中にfunc要素があれば、引数を対象に。
                for (int i = 0; i < v.list_size(); i++)
                {
                    var ve = v.list_at(i);
                    if (ve != null && ve.IsType(YDEF.sx_func))
                    {
                        var vf = ve.FindValueByTravarse(YDEF.sx_func);
                        var v2 = vf.list_at(1);
                        if (v2 != null)
                        {
                            v2         = _convert(v2);
                            vf.list[1] = v2;
                        }
                    }
                }

                return(v);
            }
            if (v.type == YDEF.get_type(YDEF.sx_def_func_clause))//ファンクション宣言節か?
            {
                //ファンクション名を対象とせず、本体を対象へ
                var nv = v.list_at(2);
                if (nv != null)
                {
                    _convert(nv);
                }
                return(v);
            }
            if (v.type == YDEF.get_type(YDEF.sx_def_var_clause))//変数宣言節か?
            {
                //  宣言名は対象とせず、アサイン値があれば対象へ
                //var pv = v.list_at(0);
                //if (pv!=null) _convert(pv);
                var nv = v.list_at(2);
                if (nv != null)
                {
                    _convert(nv);
                }
                return(v);
            }
            if (v.type == YDEF.get_type(YDEF.sx_expr) && (v.list_size() == 2 && v.list_at(0).type == YDEF.NEW))//NEW節か?
            {
                //タイプ名かを確認
                var nv = v.list_at(1);
                if (nv.IsType(YDEF.sx_func))
                {
                    var fv    = nv.FindValueByTravarse(YDEF.sx_func);
                    var namev = fv.list_at(0);
                    namev      = Checktype.ChangeIfType(namev, m_prefix_list);
                    fv.list[0] = namev;
                    fv.list[1] = _convert(fv.list[1]);
                }
                else if (nv.IsType(YDEF.sx_pointervar_clause))
                {
                    var pv = nv.FindValueByTravarse(YDEF.sx_pointervar_clause);
                    pv = _convert(pv);
                }
                else if (nv.IsType(YDEF.sx_array_var))
                {
                    var av    = nv.FindValueByTravarse(YDEF.sx_array_var);
                    var namev = av.list_at(0);
                    namev      = Checktype.ChangeIfType(namev, m_prefix_list);
                    av.list[0] = namev;
                    av.list[1] = _convert(av.list[1]);
                }
                return(v);
            }
            //if (v.type == YDEF.get_type(YDEF.sx_func))  ---- ポインタ値に属さない関数は内部または組込関数のみなので、評価外。
            //{
            //
            //}
            if (v.type == YDEF.NAME)
            {
                //タイプ名かを確認

                v = Checktype.ChangeIfType(v, m_prefix_list);

                return(v);
            }

            // vの内部構成が変わるため、インデックスとサイズを確認しながら走査する。
            int index = 0;
            while (v.list != null)
            {
                if (v.list.Count <= index)
                {
                    break;
                }
                var vn = v.list_at(index);
                if (vn == null)
                {
                    continue;
                }

                vn            = _convert(vn);
                v.list[index] = vn;

                index++;
            }
            return(v);
        }