Esempio n. 1
0
        internal object ASet(object[] argv)
        {
            if (argv.Length == 3)
            {
                Replace((int)argv[0], (int)argv[1], argv[2]);
                return(argv[2]);
            }
            if (argv.Length != 2)
            {
                throw new ArgumentException("wrong # of argments(" + argv.Length.ToString() + " for 2)");
            }
            // Range object check
            CheckModify();
            int idx = RInteger.ToInt(ruby, argv[0]);

            if (idx < 0)
            {
                idx += ptr.Count;
                if (idx < 0)
                {
                    throw new eIndexError(String.Format("index {0} out of array",
                                                        idx - ptr.Count));
                }
            }
            if (idx >= ptr.Count)
            {
                ptr.Insert(idx, argv[1]);
            }
            else
            {
                ptr[idx] = argv[1];
            }
            return(argv[1]);
        }
Esempio n. 2
0
        static internal object match_end(RBasic r, params object[] args)
        {
            NetRuby ruby = r.ruby;
            int     i    = RInteger.ToInt(r.ruby, args[0]);

            return(((RMatchData)r).End(i));
        }
Esempio n. 3
0
        static internal object match_aref(RBasic r, params object[] args)
        {
            object[] argv = new object[2];
            NetRuby  rb   = r.ruby;

            rb.ScanArgs(args, "11", argv);
            if (argv[1] != null)
            {
                return(((RMatchData)r).ToArray().ARef(args));
            }
            return(((RMatchData)r)[RInteger.ToInt(rb, args[0])]);
        }
Esempio n. 4
0
        internal object ARef(object[] argv)
        {
            int beg, len;

            object[] args = new object[2];
            if (ruby.ScanArgs(argv, "11", args) == 2)
            {
                beg = RInteger.ToInt(ruby, args[0]);
                len = RInteger.ToInt(ruby, args[1]);
                if (beg < 0)
                {
                    beg += ptr.Count;
                }
                return(Subseq(beg, len));
            }
            int offset;

            if (args[0] is int)
            {
                offset = (int)args[0];
            }
            else if (args[0] is RBignum)
            {
                throw new eIndexError("index too big");
            }
            else
            {
                // Range object check
                offset = RInteger.ToInt(ruby, args[0]);
            }
            if (offset < 0)
            {
                offset = ptr.Count + offset;
            }
            if (offset < 0 || ptr.Count <= offset)
            {
                return(null);
            }
            return(ptr[offset]);
        }