private static PointervarItem ExecuteArrayVar(Type type, object index_o, PointervarItem item)
        {
            var index = (int)util.ToNumber(index_o);

            if (item != null && item.mode == PointervarMode.NEW)
            {
                item.o = Array.CreateInstance(type, index);
                return(item);
            }
            throw new SystemException("unexpected");
        }
        private static PointervarItem GetObj(object o, string cur, PointervarItem item)
        {
            var  name = cur; //.ToUpper();
            Type type = null;

            if (o is Type)
            {
                type = (Type)o;
            }
            object obj = null;

            if (type != null)
            {
                obj = null;
            }
            else
            {
                type = o.GetType();
                obj  = o;
            }
#if !test
            //var mem1 = type.GetDefaultMembers();
            //var mem2 = type.GetMembers();

            //var find_mi = Array.Find(type.GetMembers(),mi=>mi.Name.ToUpper()==name);
            var find_mi = Array.Find(type.GetMembers(), mi => mi.Name == name);
            if (find_mi != null)
            {
                if (find_mi.MemberType == MemberTypes.Property)
                {
                    var pi = type.GetProperty(find_mi.Name);
                    item.getter = () => pi.GetValue(obj, null);
                    item.setter_parametertype = pi.PropertyType;
                    item.setter = (x) => pi.SetValue(obj, x, null);
                    return(item);
                }
                if (find_mi.MemberType == MemberTypes.Field)
                {
                    var fi = type.GetField(find_mi.Name);
                    item.getter = () => fi.GetValue(obj);
                    item.setter_parametertype = fi.FieldType;
                    item.setter = (x) => fi.SetValue(obj, x);
                    return(item);
                }

                throw new System.Exception("unknown");
            }
#endif
            return(_GetObjMissing(type, obj, name, item));
        }
        public static StateBuffer run_name(YVALUE v, StateBuffer sb)
        {
            var            nsb    = sb;
            var            name   = v.GetString();
            PointervarItem item   = nsb.m_pvitem;
            var            preobj = item.o; //先行ロケーションアイテムの値

            if (preobj == null)             //先行値がないのでNAMEとしてバッファを検索し、なければリテラルとして処理を以降に任せる
            {
                if (nsb.exist(name))
                {
                    item.o = nsb.get(name);
                }
                else
                {
                    var literal = new Literal();
                    literal.s = name;
                    item.o    = literal;
                }
                nsb.m_pvitem = item;

                return(nsb);
            }
            var pretype = preobj.GetType();

            if (pretype == typeof(Literal))
            {
                var literal = (Literal)preobj;
                item         = GetObj(literal.s, name, item);
                nsb.m_pvitem = item;
                return(nsb);
            }

            if (pretype == typeof(Hashtable))
            {
                var ht    = (Hashtable)preobj;
                var nameo = name.ToUpper();
                item.o      = ht[nameo];
                item.getter = () => ht[nameo];
                item.setter_parametertype = null;
                item.setter  = (x) => ht[nameo] = x;
                nsb.m_pvitem = item;
                return(nsb);
            }

            item         = GetObj(preobj, name, item);
            nsb.m_pvitem = item;
            return(nsb);
        }
        public static StateBuffer run_new_func(YVALUE v, StateBuffer sb)
        {
            var nsb  = sb;
            var item = new PointervarItem(); //先行アイテム。中身なし

            item.mode = PointervarMode.NEW;

            nsb.m_pvitem = item;

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

            nsb.m_cur = nsb.m_pvitem.o;
            nsb.pvitemnull();

            return(nsb);
        }
        // -- tool for this class
        private static PointervarItem GetObj(string pre, string cur, PointervarItem item)
        {
            //アセンブリ調査 --- set/get不明なので直前の形で返す
            var searchname = (pre + "." + cur).ToUpper();
            var ti         = find_typeinfo(searchname);

            if (ti != null)
            {
                item.o = ti;
                return(item);
            }
            //ない場合は、ピリオドで結合してリテラルとして返す
            var literal = new Literal();

            literal.s = pre + "." + cur;
            item.o    = literal;
            return(item);
        }
        private static PointervarItem ExecuteArrayVar(object o, string cur, object index_o, PointervarItem item)
        {
            if (index_o == null)
            {
                throw new SystemException("index is null");
            }
            var name = cur.ToUpper();

            int index = -1;

            if (util.IsNumeric(index_o.GetType()))
            {
                index = (int)util.ToNumber(index_o);
            }

            Type otype = null;

            if (o is Type)
            {
                otype = (Type)o;
            }
            object obj = null;

            if (otype != null)
            {
                obj = null;
            }
            else
            {
                otype = o.GetType();
                obj   = o;
            }

            if (otype == typeof(Hashtable))
            {
                var ht  = (Hashtable)obj;
                var val = ht[name];
                if (val == null)
                {
                    item.getter = null;
                    item.setter_parametertype = null;
                    item.setter = null;
                    item.o      = null;
                    return(item);
                }

                if (val.GetType() == typeof(LIST))
                {
                    var l = (LIST)val;
                    item.getter = () => l[index];
                    item.setter_parametertype = null;
                    item.setter = (x) => l[index] = x;
                    item.o      = l;
                    return(item);
                }

                if (val.GetType() == typeof(Hashtable))
                {
                    var ht2 = (Hashtable)val;
                    item.getter = () => ht2[index_o];
                    item.setter_parametertype = null;
                    item.setter = (x) => ht2[index_o] = x;
                    item.o      = ht2;
                    return(item);
                }
            }
            //var mem1 = otype.GetDefaultMembers();
            //var mem2 = otype.GetMembers();
            var find_mi = Array.Find(otype.GetMembers(), mi => mi.Name.ToUpper() == name);

            if (find_mi != null)
            {
                if (find_mi.MemberType == MemberTypes.Property)
                {
                    var pi = otype.GetProperty(find_mi.Name);
                    item.getter = () => { return(pi.GetValue(obj, new object[1] {
                            index
                        })); };
                    item.setter_parametertype = pi.PropertyType;
                    item.setter = (x) => { pi.SetValue(obj, x, new object[1] {
                            index
                        }); };
                    return(item);
                }
                if (find_mi.MemberType == MemberTypes.Field)
                {
                    var fi = otype.GetField(find_mi.Name);
                    item.getter = () => {
                        var z = fi.GetValue(obj);
                        if (otype.IsArray)
                        {
                            var a = (Array)z;
                            return(a.GetValue(index));
                        }
                        if (otype.IsGenericType && true)
                        {
                            if (otype is IList)
                            {
                                var a = (IList)z;
                                return(a[index]);
                            }
                        }
                        return(null);
                    };
                    item.setter = (x) => {
                        var z = fi.GetValue(obj);
                        if (otype.IsArray)
                        {
                            var a = (Array)z;
                            a.SetValue(x, index);
                        }
                        if (otype.IsGenericType && true)
                        {
                            if (otype is IList)
                            {
                                var a = (IList)z;
                                a[index] = x;
                            }
                        }
                    };
                    return(item);
                }
                throw new System.Exception("unknown");
            }
            return(item);
        }
        private static PointervarItem ExecuteArrayVar(string pre, string cur, object index_o, PointervarItem item)
        {
            var index = (int)util.ToNumber(index_o);

            if (item != null && item.mode == PointervarMode.NEW)
            {
                var searchname = (pre + "." + cur).ToUpper();
                var ti         = find_typeinfo(searchname);
                if (ti != null)
                {
                    item.o = Array.CreateInstance(ti, index);
                }
                return(item);
            }
            throw new SystemException("unexpected");
        }
 private static PointervarItem ExecuteFunc(object o, string cur, List <object> param, PointervarItem item)
 {
     item.o = sub_reflection.ExecuteFunc(o, cur, param.ToArray());
     return(item);
 }
 private static PointervarItem ExecuteFunc(string pre, string cur, List <object> param, PointervarItem item)
 {
     if (item != null && item.mode == PointervarMode.NEW)
     {
         var searchname = (pre + "." + cur).ToUpper();
         var ti         = find_typeinfo(searchname);
         if (ti != null)
         {
             item.o = runtime.sub_reflection.InstantiateType(ti, param.ToArray());//Activator.CreateInstance(ti,args:param.ToArray());
         }
         return(item);
     }
     throw new SystemException("unexpected");
 }
        private static PointervarItem _GetObjMissing(Type type, object obj, string name, PointervarItem item) //IL2CPP対策
        {
            var subtypename = "F_" + type.FullName.Replace('.', '_');
            var subtype     = find_typeinfo(subtypename);

            if (subtype != null)
            {
                var mts = subtype.GetMethods(BindingFlags.Static | BindingFlags.Public);

                var searchname_set = "__SET__" + name;
                var find_set       = Array.Find(mts, m => m.Name.ToUpper() == searchname_set);
                if (find_set != null)
                {
                    item.setter = (x) => find_set.Invoke(null, new object[2] {
                        obj, x
                    });
                }

                var searchname_get = "__GET__" + name;
                var find_get       = Array.Find(mts, m => m.Name.ToUpper() == searchname_get);
                if (find_get != null)
                {
                    item.getter = () => find_get.Invoke(null, new object[1] {
                        obj
                    });
                }

                return(item);
            }
            util._error("Unknown Name : " + name + "(" + type.Name + ")");
            return(null);
        }
        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);
        }